WA80pts玄关求条(马蜂良好
查看原帖
WA80pts玄关求条(马蜂良好
1070708
Caged_Bird楼主2024/10/22 20:40
#include<bits/stdc++.h>
#define ls now*2
#define rs now*2+1
#define int long long
using namespace std;
struct node{
	int s,t,val,tag;
}tree[800005];
int a[200005],n,q,w,ans,t;
void build(int l,int r,int now){
	tree[now].s=l;
	tree[now].t=r;
	tree[now].tag=0;
	if(l==r){
		tree[now].val=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,ls);
	build(mid+1,r,rs);
	tree[now].val=tree[ls].val+tree[rs].val;
}
void push_down(int now){
	tree[ls].tag+=tree[now].tag;
	tree[rs].tag+=tree[now].tag;
	tree[ls].val+=tree[now].tag*(tree[ls].t-tree[ls].s+1);
	tree[rs].val+=tree[now].tag*(tree[rs].t-tree[rs].s+1);
	tree[now].tag=0;
}
void modify(int l,int r,int now,int k){
	if(tree[now].s>=l&&tree[now].t<=r){
		tree[now].tag+=k;
		tree[now].val+=k*(tree[now].t-tree[now].s+1);
		return;
	}
	if(tree[now].s>r||tree[now].t<l)return;
	if(tree[now].tag!=0)push_down(now);
	modify(l,r,ls,k);modify(l,r,rs,k);
	tree[now].val=tree[ls].val+tree[rs].val;
}
void query(int now,int tgt){
	if(tree[now].s==tree[now].t)return;
	if(tree[now].tag)push_down(now);
	if(tree[ls].val*(1<<t)<tgt){
		ans=max(ans,tree[ls].t);
		query(rs,tgt-tree[ls].val*(1<<t));
	}
	if(tree[ls].val*(1<<t)>=tgt){
		query(ls,tgt);
	}
}
inline int read(){
    int f=1,x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while('0'<=ch&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void print(int x){
    if(x<0){
        putchar('-');
        print(-x);
        return;
    }
    if(x>9){
        print(x/10);
    }
    putchar(x%10+'0');
}
signed main(){
//	freopen("wxyt3.in","r",stdin);
//	freopen("wxyt3.out","w",stdout);
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	n=read();
	q=read();
	w=read();
	int sum=0;
	for(int i=1;i<=n;i++){
		a[i]=read();
		sum+=a[i]; 
	}
	build(1,n,1);
	while(q--){
		int l,r,k;
		l=read();
		r=read();
		k=read(); 
		modify(l,r,1,k);
		sum+=k*(r-l+1);
		int p=2,tgt;
		for(int i=1;i<=10000000000;i++){
			if((p-1)*sum>=w){
				t=i-1;
				tgt=w-(p/2-1)*sum;
				break;
			}
			p*=2;
		}
		ans=0;query(1,tgt);
		print(ans+n*t);
		putchar('\n'); 
	}
	return 0;
}

大样例3过不了,具体输出就前几行不对

2024/10/22 20:40
加载中...