线段树0ptsTLE求条
查看原帖
线段树0ptsTLE求条
1329138
luogu_hezhenmin1楼主2024/11/30 21:48
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+2;
int n,m,w;
struct node{
	int l,r,sum,lazy;
}tree[N<<2];
int a[N];
void build(int i,int l,int r){
	tree[i].lazy=0;
	tree[i].l=l,tree[i].r=r;
	if(l==r){
		tree[i].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
	return;
}
void push_down(int i){
	if(tree[i].lazy!=0){
		tree[i<<1].lazy+=tree[i].lazy;
		tree[i<<1|1].lazy+=tree[i].lazy;
		int mid=(tree[i].l+tree[i].r)>>1;
		tree[i<<1].sum+=tree[i].lazy*(mid-tree[i<<1].l+1);
		tree[i<<1|1].sum+=tree[i].lazy*(tree[i<<1|1].r-mid);
		tree[i].lazy=0;
	}
	return;
}
void add(int i,int l,int r,int k){
	if(tree[i].l>=l and tree[i].r<=r){
		tree[i].sum+=k*(tree[i].r-tree[i].l+1);
		tree[i].lazy+=k;
		return;
	}
	push_down(i);
	if(tree[i<<1].r>=l) add(i<<1,l,r,k);
	if(tree[i<<1|1].l<=r) add(i<<1|1,l,r,k);
	tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
	return;
}
int ask(int i,int l,int r){
	if(tree[i].l>=l and tree[i].r<=r) return tree[i].sum;
	push_down(i);
	int ans=0;
	if(tree[i<<1].r>=l) ans+=ask(i<<1,l,r);
	if(tree[i<<1|1].l<=r) ans+=ask(i<<1|1,l,r);
	return ans;
}
signed main(){
	ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>w;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    while(m--){
    	int l,r,d;
    	cin>>l>>r>>d;
    	add(1,l,r,d);
    	int num=ask(1,1,n);
    	int k=1,nw=w,sum=0;
    	while(nw>=k*num){
    		nw-=k*num;
    		k<<=1;
    		sum+=n;
		}
		int nl=1,nr=n;
		while(nl<nr){
			int mid=(nl+nr)>>1;
			if(ask(1,1,mid)*k<=nw) nl=mid;
			else nr=mid-1;
		}
		sum+=nl;
		cout<<sum<<'\n';
    	add(1,l,r,-d);
	}
	return 0;
}
2024/11/30 21:48
加载中...