能过样例,但是全wa,跪求调
查看原帖
能过样例,但是全wa,跪求调
324226
X2H_tato楼主2024/10/23 09:34
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=2e5+5;
int a[N];
struct stree{
	ull tree[N<<2],tag[N<<2];
	void push_up (int p)
	{
		tree[p]=tree[p<<1]+tree[p<<1|1];	
	}
	void build (int p,int l,int r)
	{
		tag[p]=0;
		if(l==r)
		{
			tree[p]=a[l];
			return ;	
		}	
		int mid=(l+r)>>1;
		build(p<<1,l,mid);
		build(p<<1|1,mid+1,r);
		push_up(p);
	}	
	void sdown (int p,ull k,int l,int r)
	{
		tag[p]+=k;
		tree[p]+=(r-l+1)*k;	
	} 
	void push_down (int p,int l,int r)
	{
		int mid=(l+r)>>1;
		sdown(p<<1,tag[p],l,mid);
		sdown(p<<1|1,tag[p],mid+1,r);
		tag[p]=0;
	}
	void update (int nl,int nr,int l,int r,int p,ull k)
	{
		if(nl<=l&&r<=nr)
		{
			sdown(p,k,l,r);
			return ;
		}
		int mid=(l+r)>>1;
		push_down(p,l,r);
		if(nl<=mid) update (nl,nr,l,mid,p<<1,k);
		if(nr>mid) update(nl,nr,mid+1,r,p<<1|1,k);
		push_up(p);
	}
	ull query (int nl,int nr,int l,int r,int p)
	{
		if(nl<=l&&r<=nr) return tree[p];
		ull res=0;
		int mid=(l+r)>>1;
		push_down(p,l,r);
		if(nl<=mid) res+=query(nl,nr,l,mid,p<<1);
		if(nr>mid) res+=query(nl,nr,mid+1,r,p<<1|1);
		return res;
	}
}T;//线段树 
long long ans=0;

void sol (ull nw,int l,int r,int p,int id)
{
	if(l==r) 
	{
		ans+=l-1;
		return ;
	}
	int mid=(l+r)>>1;
	if(nw<=T.tree[p<<1]*id) sol(nw,l,mid,p<<1,id);
	else sol(nw-T.tree[p<<1]*id,mid+1,r,p<<1|1,id);
}//线段树上二分找致命一击 

int main()
{
//	freopen("wxyt2.in","r",stdin);
//	freopen("wxyt.out","w",stdout);
	int n,q;
	ull w;
	cin>>n>>q>>w;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	T.build(1,1,n);
	while(q--)
	{
		int l,r,d;
		scanf("%d%d%d",&l,&r,&d);
		T.update(l,r,1,n,1,d);
		ull sum=T.tree[1],id=1;
		ull nw=w;
		ans=0;
		while(1)
		{
			if(nw<=sum*id) break;
			nw-=sum*id;
			id*=2;
			ans+=n;
		}//能经历几场战斗 
		sol(nw,1,n,1,id);//计算还剩下的 
		printf("%lld\n",ans);
	}
	return 0;
}
2024/10/23 09:34
加载中...