树状数组0分求调
查看原帖
树状数组0分求调
822746
baiyh楼主2024/10/23 20:06
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10;
template<typename T>void read(T &x){
	int f=1;x=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
	for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
	x*=f;
}
int n,q,ans;
ll W;
int a[maxn],c1[maxn],c2[maxn];
int lowbit(int x){
	return x&(-x);
}
void Add(int x,int d){
	for(int i=x;i<=n;i+=lowbit(i)){
		c1[i]+=d;
		c2[i]+=x*d;
	}
}
ll Sum(int x){
	ll ret=0;
	for(int i=x;i;i-=lowbit(i)){
		ret+=(x+1)*c1[i]-c2[i];
	}
	return ret;
}
ll query(int l,int r){
	return Sum(r)-Sum(l-1);	
}
void update(int l,int r,int d){
	Add(l,d);Add(r+1,-d);
}
int solve(int x){
	int l=0,r=n,ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		if(Sum(mid)*x<W) l=mid+1,ans=mid;
		else r=mid-1;
	}
	return ans;
}
int main(){
	scanf("%d%d%lld",&n,&q,&W);
	ll d=W;
	for(int i=1;i<=n;i++) read(a[i]);
	for(int i=1;i<=n;i++) update(i,i,a[i]);
	while(q--){
		ans=0;
		W=d; 
		int l,r,d;
		read(l);read(r);read(d);
		update(l,r,d);
		ll f=query(1,n);
		ll k=W;
		int cnt=0;
		while(k>0){
			k-=f;
			if(k>0){
				cnt++;
				W-=f;
			}
			f*=2;
		}
		ans+=cnt*n;
		int lg=pow(2,cnt);
		ans+=solve(lg);
		printf("%d\n",ans);
	}
	return 0;
}
2024/10/23 20:06
加载中...