写了个奇怪的二分,求调
查看原帖
写了个奇怪的二分,求调
1056696
Xieaotong楼主2024/10/21 21:24
#include<iostream>
using namespace std;
const int N=2e5+10;
int n,q,w;
long long l,r,d;
long long rubbish[N];
long long sum[4*N];
long long tag[4*N];
void pushup(int o){
	sum[o]=sum[o<<1]+sum[(o<<1)+1];
}
void build(int o,int l,int r){
	if(l==r){
		sum[o]=rubbish[l];
		return;
	}
	long long mid=(l+r)>>1;
	build(o<<1,l,mid);
	build((o<<1)+1,mid+1,r);
	pushup(o);
}
void pushdown(int o,int l,int r){
	long long mid=(l+r)>>1;
	sum[o<<1]+=(mid-l+1)*tag[o];
	sum[(o<<1)+1]+=(r-mid)*tag[o];
	tag[o<<1]=tag[o];
	tag[(o<<1)+1]=tag[o];
	tag[o]=0;
}
void modify(int o,int l,int r,int ql,int qr,int g){
	if(qr<l||ql>r){
		return;
	}
	if(l>=ql&&r<=qr){
		sum[o]+=g*(r-l+1);
		tag[o]+=g;
		return;
	}
	long long mid=(l+r)>>1;
	pushdown(o,l,r);
	if(mid>=ql){
		modify(o<<1,l,mid,ql,qr,g);
	}
	if(mid<qr){
		modify((o<<1)+1,mid+1,r,ql,qr,g);
	}
	pushup(o);
}
long long ans;
long long k=1;
long long g=w;
void qry(int o,int l,int r){
	if(l==r){
		return;
	}
	long long mid=(l+r)>>1;
	pushdown(o,l,r);
	if(g>sum[o<<1]*k){
		g-=sum[o<<1]*k;
		ans+=mid-l+1;
		qry((o<<1)+1,mid+1,r);
	}else{
		qry(o<<1,l,mid);
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q>>w;
	for(int i=1;i<=n;i++){
		cin>>rubbish[i];
	}
	build(1,1,n);
	while(q--){
		ans=0;
		cin>>l>>r>>d;
		modify(1,1,n,l,r,d);	
		k=1;
		g=w;
		while(g>sum[1]*k){
			g-=sum[1]*k;
			k*=2;
			ans+=n;
		}
		qry(1,1,n);
		cout<<ans<<endl;
	} 
	return 0;
} 
2024/10/21 21:24
加载中...