RE求调
查看原帖
RE求调
597119
HouSibo楼主2024/10/21 19:58

奇怪的全RE,自己2天未调好

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=100010;
ll n,m,q,w;
ll val[N*4],sum[N*4],add[N*4],mul[N*4];
ll read(){
    char ch=getchar();
    ll x=0;bool f=0;
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    if(f)x=-x;
    return x;
}
void build(ll k,ll l,ll r){
    mul[k]=1;
    if(l==r){
        sum[k]=val[r];    
        return ;
    }
    ll mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    sum[k]=(sum[k<<1]+sum[k<<1|1]);
    return;
}
void change(ll k,ll l,ll r,ll u){
    add[k]=(mul[u]*add[k]+add[u]);
    mul[k]=(mul[k]*mul[u]);
    sum[k]=(sum[k]*mul[u]+add[u]*(r-l+1));
}
void pushdown(ll k,ll l,ll r){
    ll mid=(l+r)>>1;
    change(k<<1,l,mid,k);
    change(k<<1|1,mid+1,r,k);
    add[k]=0;
    mul[k]=1;
    return;
}
void Mul(ll k,ll l,ll r,ll x,ll y,ll v){
    if(l>=x&&r<=y){
        mul[k]=(mul[k]*v);
        add[k]=(add[k]*v);
        sum[k]=(sum[k]*v);
        return ;
    }
    pushdown(k,l,r);
    ll mid=(l+r)>>1;
    if(x<=mid)
    	Mul(k<<1,l,mid,x,y,v);
    if(mid<y)  
      Mul(k<<1|1,mid+1,r,x,y,v);
    sum[k]=(sum[k<<1]+sum[k<<1|1]);
    return;  
}
void Add(ll k,ll l,ll r,ll x,ll y,ll v){
    if(l>=x&&r<=y){
        add[k]=add[k]+v;
        sum[k]=(sum[k]+v*(r-l+1));    
        return ;
    }
    pushdown(k,l,r);
    ll mid=(l+r)>>1;
    if(x<=mid)
    	Add(k<<1,l,mid,x,y,v);
    if(mid<y)
    	Add(k<<1|1,mid+1,r,x,y,v);
    sum[k]=(sum[k<<1]+sum[k<<1|1]);
    return ;        
}
ll query(ll k,ll l,ll r,ll x,ll y){
    if(l>=x&&r<=y)
        return sum[k];
    pushdown(k,l,r);
    ll mid=(l+r)>>1;
    ll ans=0;
    if(x<=mid)
    	ans+=query(k<<1,l,mid,x,y);
    if(mid<y)
    	ans+=query(k<<1|1,mid+1,r,x,y);
    return ans;
}
ll solve(ll l,ll r,ll w1){
	if(l==r&&query(1,1,n,l,l)<w1){
		return l;
	}
	ll mid=(l+r)/2;
	ll cnt=query(1,1,n,1,mid);
	if(cnt>=w1){
		solve(l,mid,w1);
	}else{
		solve(mid+1,r,w1);
	}
}
int main(){
	freopen("wxty.in","r",stdin);
	freopen("wxty.out","w",stdout);
	n=read();q=read();w=read();
    for(int i=1;i<=n;i++){
    	val[i]=read();
	}
    build(1,1,n);
    for(int i=1;i<=N*4;i++){
    	mul[i]=1;
	}
    while(q--){
    	ll ans=0,times=1;
    	ll l,r,d,w1=w;
        l=read();r=read();d=read();
        Add(1,1,n,l,r,d);
        //cout<<query(1,1,n,1,n)<<endl;
        while(w1>query(1,1,n,1,n)*times){
        	w1-=query(1,1,n,1,n)*times;
        	//cout<<w1<<" ";
        	ans+=n;
        	times*=2;
		}
		w1/=times;
		ans+=solve(1,n,w1);
		cout<<ans-1<<endl;
	}
	return 0;
}
2024/10/21 19:58
加载中...