社区讨论
线段树神秘复杂度WA85pts求调
P11217【MX-S4-T1】「yyOI R2」youyou 的垃圾桶参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m2hlpm84
- 此快照首次捕获于
- 2024/10/20 21:06 去年
- 此快照最后确认于
- 2025/11/04 16:40 4 个月前
CPP
#include<bits/stdc++.h>
typedef long long int64;
typedef __int128 int128;
namespace mainCode
{
using namespace std;
const int N=2e5+1;
int n,q,ans;
int64 w,now,a[N],ad[N<<2];
int128 s,p,sum[N<<2];
void pushup(int k)
{
sum[k]=sum[k<<1]+sum[k<<1|1];
}
void build(int k,int l,int r)
{
if (l==r)
{
sum[k]=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void add(int k,int l,int r,int x)
{
ad[k]+=x,sum[k]+=x*(r-l+1);
}
void pushdown(int k,int l,int r,int mid)
{
if (!ad[k]) return;
add(k<<1,l,mid,ad[k]);
add(k<<1|1,mid+1,r,ad[k]);
ad[k]=0;
}
void update(int k,int l,int r,int x,int y,int z)
{
if (r<x||l>y) return;
if (l>=x&&r<=y)
{
add(k,l,r,z);
return;
}
int mid=(l+r)>>1;
pushdown(k,l,r,mid);
if (mid>=x) update(k<<1,l,mid,x,y,z);
if (mid<y) update(k<<1|1,mid+1,r,x,y,z);
pushup(k);
}
void search()
{
int k=1,l=1,r=n,mid;
while (l<=r)
{
if (sum[k]*p<now)
{
ans+=r-l+1;
break;
}
if (sum[k]*p==now)
{
ans+=r-l;
break;
}
if (l==r) break;
mid=(l+r)>>1;
pushdown(k,l,r,mid);
if (sum[k<<1]*p<now) ans+=mid-l+1,now-=sum[k<<1]*p,k=k<<1|1,l=mid+1;
else if (sum[k<<1]*p==now)
{
ans+=mid-l;
break;
}
else k<<=1,r=mid;
}
}
void main()
{
cin>>n>>q>>w;
for (int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
int l,r,d;
while (q--)
{
cin>>l>>r>>d;
update(1,1,n,l,r,d);
s=sum[1],now=w,ans=0,p=1ll;
while (now>s*p) ans+=n,now-=s*p,p<<=1ll;
if (now==s*p) ans+=n-1ll;
else search();
cout<<ans<<"\n";
}
}
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
mainCode::main();
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...