线段树上二分 70pts tle 求调
查看原帖
线段树上二分 70pts tle 求调
613526
LDY_楼主2024/10/21 18:04
#include<bits/stdc++.h>
#define int unsigned long long 
using namespace std;
int n,q;
long long w; 
long long a[200005];
struct Tree{
	int l,r,siz;
	long long tag,val;
}t[8000005];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void build(int x,int l,int r){
	t[x].l=l,t[x].r=r,t[x].siz=r-l+1;
	t[x].tag=0;
	if(l==r){
		t[x].val=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	t[x].val=t[ls(x)].val+t[rs(x)].val;
	return;
} 
void pushdown(int x){
	 t[ls(x)].val+=t[x].tag*t[ls(x)].siz;
	 t[rs(x)].val+=t[x].tag*t[rs(x)].siz;
	 t[ls(x)].tag+=t[x].tag;
	 t[rs(x)].tag+=t[x].tag;
	 t[x].tag=0;
	 t[x].val=t[ls(x)].val+t[rs(x)].val;
	 return;
}
void add(int x,int ll,int rr,long long val){
	if(t[x].l>rr||t[x].r<ll){
		return;
	}
	if(t[x].l>=ll&&t[x].r<=rr){
		t[x].val+=val*t[x].siz;
		t[x].tag+=val;
		return;
	}
	pushdown(x);
	add(ls(x),ll,rr,val);
	add(rs(x),ll,rr,val);
	t[x].val=t[ls(x)].val+t[rs(x)].val;
	return;
}
long long query(int x,int b,int w){
	if(t[x].l==t[x].r) return (int)(b*t[x].val<w);
	pushdown(x);
	if(b*t[ls(x)].val<w) return t[ls(x)].siz+query(rs(x),b,w-b*t[ls(x)].val);
	return query(ls(x),b,w);
}
int l,r;
long long d;
long long cnt,sum,res,ans,b;
long long fp[64];
long long Pow(long long a,long long b){
	return fp[b];
}
signed main(){
	fp[0]=1;
	for(int i=1;i<=63;i++){
		fp[i]=fp[i-1]*2;
	}
	scanf("%lld%lld%lld",&n,&q,&w);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	while(q--){
	     cnt=0;
		scanf("%lld%lld%lld",&l,&r,&d);
		add(1,l,r,d);
		  sum=t[1].val;
		  res=w;
		  ans=1;
		if(sum<w){
			long long ll=1,rr=63;
			while(ll<=rr){
				long long mid=1ll*(ll+rr)/2;
				long long x=1ll*(Pow(2,mid)-1);
				long long y=w/sum;
				if(x<=y){
					ans=mid;
					ll=mid+1;
				} 
				else rr=mid-1;
			}
			//cout<<ans<<endl;
			res=w-((Pow(2,ans)-1)*sum);
			cnt=ans*n;
			
			if(res==0){
				printf("%lld\n",cnt-1);
				continue;
			}
			//cout<<res<<endl;
		}
		b=Pow(2,ans);
		int num=query(1,b,res);
		printf("%lld\n",cnt+num);
	}
	return 0;
}
2024/10/21 18:04
加载中...