社区讨论
为什么树状数组炸了?
P11217【MX-S4-T1】「yyOI R2」youyou 的垃圾桶参与者 4已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @m2hhzov5
- 此快照首次捕获于
- 2024/10/20 19:21 去年
- 此快照最后确认于
- 2025/11/04 23:50 4 个月前
代码:
CPP#include<bits/stdc++.h>
using namespace std;
int n,q,l,r;
long long w,d;
long long a[101000],sum[101000],b[101000];
int lowbit(int x)
{
return x&(~x+1);
}
void add(long long x,int wz)
{
while(wz<=n)
{
b[wz]+=x;
wz+=lowbit(wz);
}
}
long long count(int x)
{
long long ans=0;
while(x)
{
ans+=b[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>q>>w;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]),sum[i]=a[i]+sum[i-1];
add(sum[i]-sum[i-1],i);
}
while(q--)
{
scanf("%d%d%lld",&l,&r,&d);
add(d,l);
add(-d,r+1);
add(d*(r-l+1),r+1);
add(-d*(r-l+1),n+1);
int t=1,kk=0;
long long ww=w;
long long maxx=count(n);
// cout<<maxx<<endl;
while(ww>0)
{
ww-=maxx*t;
t*=2;
kk++;
}
kk--;
t/=2;
ww+=maxx*t;
// cout<<kk<<" "<<ww<<endl;
int ll=1,rr=n,mid,anss=0;
while(ll<=rr)
{
mid=(ll+rr)>>1;
if(count(mid)*t>=ww)
{
rr=mid-1;
}
else
{
anss=mid;
ll=mid+1;
}
}
printf("%d\n",anss+kk*n);
}
return 0;
}
MnZn感觉s组要炸了
哪个学校周日还要上课,就打了30min
回复
共 13 条回复,欢迎继续交流。
正在加载回复...