让我感到位运算常数巨大(雾
查看原帖
让我感到位运算常数巨大(雾
822439
lhz2022楼主2024/10/20 22:30
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define debug() puts("I WILL AK")
#define N 200007
inline int rd(){
	int ans=0,w=0;
	char ch=getchar();
	while (ch<'0'||ch>'9'){
		w|=ch=='-',ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	}
	return w?-ans:ans;
}
inline void wr(int x){
	if(x<0)
		putchar('-'),x=-x;
	if(x<=9){
		putchar(x+'0');
		return;
	}
	wr(x/10);
	putchar(x%10+'0');
}
struct tree{
	int val,lazy;
}tr[N<<2];
int a[N],n,q,w,b[N];
inline void push_up(int rt){
	tr[rt].val=tr[rt<<1].val+tr[rt<<1|1].val;
}
inline void push_down(int rt,int l,int r){
	if(tr[rt].lazy!=0){
		tr[rt<<1].lazy+=tr[rt].lazy;
		tr[rt<<1|1].lazy+=tr[rt].lazy;
		int mid=(l+r)>>1;
		tr[rt<<1].val+=tr[rt].lazy*(mid-l+1);
		tr[rt<<1|1].val+=tr[rt].lazy*(r-mid);
		tr[rt].lazy=0;
	}
}
int query(int rt,int l,int r,int pw,int hel){
	//write(l,0),write(r);
	if(l==r) return l;
	int mid=(l+r)>>1;
	push_down(rt,l,r);
	//write(hel,0),write(tr[rt<<1].val*(1<<pw));
	if(hel>tr[rt<<1].val*pw) return query(rt<<1|1,mid+1,r,pw,hel-tr[rt<<1].val*pw);
	else return query(rt<<1,l,mid,pw,hel);
}

void update(int rt,int l,int r,int ul,int ur,int add){
	if(ul<=l&&ur>=r){
		tr[rt].val+=add*(r-l+1);
		tr[rt].lazy+=add;
		return;
	}
	push_down(rt,l,r);
	int mid=(l+r)>>1;
	if(ul<=mid) update(rt<<1,l,mid,ul,ur,add);
	if(ur>mid) update((rt<<1)|1,mid+1,r,ul,ur,add);
	push_up(rt);
}


void build(int rt,int l,int r){
	if(l==r) tr[rt].val=a[l];
	else{
		int mid=(l+r)>>1;
		build(rt<<1,l,mid);
		build(rt<<1|1,mid+1,r);
		push_up(rt);
	}
}
signed main(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	n=rd(),q=rd(),w=rd();
	int kk=0;
	for(int i=1;i<=n;++i){
		kk+=(a[i]=rd());
	}
	build(1,1,n);
	for(int i=1;i<=q;++i){
		int l,r,k;
		l=rd(),r=rd(),k=rd();
		kk+=(r-l+1)*k;
		update(1,1,n,l,r,k);
		int sm=kk;
		int res=0;
		int pw=1;
		int hel=w;
		while(sm*pw<hel){
			res+=n;
			hel-=sm*pw;
			pw<<=1;
		}
		wr(res+query(1,1,n,pw,hel)-1);
		putchar('\n');
	}
	return 0;
}

这份代码:当我吧pw设成一个数字表示翻的倍数,并且后面乘以pw是都改成乘以 (1<<pw) 然后我就TLE了3个点

改成这样直接AC,运行时间300ms

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