俩log解法 求卡常(本地1.13s)
查看原帖
俩log解法 求卡常(本地1.13s)
822439
lhz2022楼主2024/10/20 21:41
#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 ql,int qr){
	if(ql>qr) return 0;
	if(ql<=l&&qr>=r) return tr[rt].val;
	push_down(rt,l,r);
	int mid=(l+r)>>1;
	if(qr<=mid)	return query(rt<<1,l,mid,ql,qr);
	if(ql>mid) return query((rt<<1)|1,mid+1,r,ql,qr);
	return query(rt<<1,l,mid,ql,qr)+query((rt<<1)|1,mid+1,r,ql,qr);
}

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();
	for(int i=1;i<=n;++i){
		a[i]=rd();
		b[i]=b[i-1]+a[i];
	}
	build(1,1,n);
	for(int i=1;i<=q;++i){
		int l=rd(),r=rd(),k=rd();
		update(1,1,n,l,r,k);
		int sm=query(1,1,n,1,n);
		int res=0;
		int pw=0;//乘上2的pw次方
		int hel=w;
		while(sm*(1<<pw)<hel){
			res+=n;
			hel-=sm*(1<<pw);
			++pw;
		}
		//cout<<pw<<'\n';
		int ll=1,rr=n,ans=0;
		while(ll<=rr){
			int mid=(ll+rr)>>1;
			if(query(1,1,n,1,mid)*(1<<pw)<hel){
				ll=mid+1;
				ans=mid;
			}
			else{
				rr=mid-1;
			}
		}
		wr(res+ans),putchar('\n');
	}
	return 0;
}

本地跑了1.13s(机子是洛谷评测机速度的1.2-1.4倍)

2024/10/20 21:41
加载中...