70pts求调
查看原帖
70pts求调
1121221
Czming__楼主2024/10/20 18:40
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read(){
	int x=0,y=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') y=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*y;
}
void output(int x){
	if(x<0) putchar('-'),x=abs(x);
	if(x>9) output(x/10);
	putchar((x%10)|48);
}
int a[200001],tree[800003],n,x,y,k,lazy[800003],answer,q,l,r,d,z,sum,w,game,ls,rs,ansnumber,anss;
void add(int x){
	tree[x]=tree[x*2]+tree[x*2+1];
}
void push_down(int x,int l,int r){
	if(lazy[x]!=0){
		lazy[x*2]+=lazy[x];
		lazy[x*2+1]+=lazy[x];
		int mid=(l+r)>>1;
		tree[x*2]+=lazy[x]*(mid-l+1);
		tree[x*2+1]+=lazy[x]*(r-mid);
		lazy[x]=0;
	}
}
void build(int x,int l,int r){
	if(l==r){
		tree[x]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	add(x);
}
void add(int s,int l,int r){
	if(x<=l&&r<=y){
		tree[s]+=(r-l+1)*k;
		lazy[s]+=k;
		return ;
	}
	push_down(s,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) add(s*2,l,mid);
	if(y>mid) add(s*2+1,mid+1,r);
	add(s);
}
void ans(int id,int l,int r){
	if(x<=l&&r<=y){
		ansnumber+=tree[id];
		return ;
	}
	push_down(id,l,r);
	int mid=(l+r)>>1;
	if(mid>=x) ans(id*2,l,mid);
	if(mid<y) ans(id*2+1,mid+1,r);
}
signed main(){
	n=read();
	q=read();
	w=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		sum+=a[i];
	}
	build(1,1,n);
	while(q--){
		answer=0;
		x=read();
		y=read();
		k=read();
		add(1,1,n);
		sum+=(y-x+1)*k; 
		z=w/sum;
		z++;
		z=floor(log2(z));
		answer+=z*n;
		z=pow(2,z)-1;
		game=w-(sum*z);
		if(game==0){
			answer--;
		}
		anss=0,ls=1,rs=n-1;
		z++;
		x=1;
		while(ls<=rs){
			y=(ls+rs)>>1;
			ansnumber=0;
			ans(1,1,n);
			if((long long)z*ansnumber<game){
				anss=y;
				ls=y+1;
			}
			else{
				rs=y-1;
			}
		}
		output(answer+anss);
		puts("");
	}
	return 0;
}

为什么线段树 O(q log n)O(q \ log \ n) 被卡 TLETLE 了。
调了 3.5h3.5h 的代码 7070 ......

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