社区讨论

求调

P11217【MX-S4-T1】「yyOI R2」youyou 的垃圾桶参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m2o6gezb
此快照首次捕获于
2024/10/25 11:33
去年
此快照最后确认于
2025/11/04 16:15
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

struct node
{
	int l,r,x,lazy,lazy1;
};
node tr[410000];

int  n,q,w,cnt=1,op,ans,num[210000],cop[210000];

void built(int l,int r,int sum)
{
	tr[sum].l=l;
	tr[sum].r=r;
	tr[sum].lazy1=1;
	if(l==r)
	{
		tr[sum].x=cop[cnt];
		num[cnt++]=sum;
		return ;
	}
	int  mid=(l+r)/2;	
	built(l,mid,sum*2);
	built(mid+1,r,sum*2+1);
	tr[sum].x=tr[sum*2].x+tr[sum*2+1].x;
	return ;
}

void powdown(int sum)
{
	int lc=sum*2,rc=lc+1; 
	tr[lc].lazy=tr[rc].lazy=tr[sum].lazy;
	tr[lc].lazy1=tr[rc].lazy1=tr[sum].lazy1;
	tr[lc].x+=tr[lc].lazy*tr[lc].lazy1;
	tr[rc].x+=tr[rc].lazy*tr[rc].lazy1;
	tr[sum].lazy=0;tr[sum].lazy1=1;
}

void add(int l,int r,int d,int sum)
{
//	cout << tr[sum].l << " " << tr[sum].r << " " << tr[sum].x << endl;
	int mid=(tr[sum].l+tr[sum].r)/2;
//	cout<<tr[sum].l<< ' '<<tr[sum].r<<" "<<mid<<endl;
	if(tr[sum].l>=l && tr[sum].r<=r)
	{
//		if(tr[sum].l==tr[sum].r) cout << tr[sum].x << " " << d << endl;
		tr[sum].x+=d*(tr[sum].r-tr[sum].l+1);
//		cout<<tr[sum].l<< ' '<<tr[sum].r<<" "<<tr[sum].x<<endl;
		tr[sum].lazy+=d;
		return ;
	}
	if(tr[sum].lazy1!=0 || tr[sum].lazy!=0)
	{
		powdown(sum);
	}
	if(tr[sum].l==tr[sum].r) 
	{
		tr[sum].x+=d;
		return ;
	}
	if(l<=mid and r>mid)
	{
		add(l,r,d,sum*2);
		add(l,r,d,sum*2+1);
		tr[sum].x=tr[sum*2+1].x+tr[sum*2].x;
	}
	else if(l>mid)
	{	
		
		add(l,r,d,sum*2+1);
		tr[sum].x=tr[sum*2+1].x+tr[sum*2].x;
	}
	else if(r<=mid)
	{	
//		cout<<mid<<endl;
//		cout << tr[sum].l << " " << tr[sum].r << " " << tr[sum].x << endl;
		add(l,r,d,sum*2);
		tr[sum].x=tr[sum*2+1].x+tr[sum*2].x;
	}
	return ;
}

void check(int l,int r,int sum)
{
//	cout << tr[sum].l << " " << tr[sum].r << " " << tr[sum].x << endl;
	if(w-tr[sum].x>=0)
	{
		w-=tr[sum].x;
		tr[sum].lazy1*=2;
		tr[sum].x*=2;
		ans+=tr[sum].r-tr[sum].l+1;
		if(w==0)
		{
			ans--;
		    return ;
		}
//		cout<<w<<endl;
		check(l,r,sum);
		tr[sum].lazy1=1;
		tr[sum*2+1].lazy1=1;
		tr[sum*2].lazy1=1;
	}
	if(tr[sum].lazy1!=1 || tr[sum].lazy!=0)
	{
		powdown(sum);
	}
	if(l==r)
	{
		w-=tr[sum].x;
		if(w<=0)
		{
			ans--;
		}
		tr[sum].lazy1=1;
		return ;
	}
	int mid=(l+r)/2;
	if(w-tr[sum*2].x>0)
	{
		w-=tr[sum*2].x;
		check(mid+1,r,sum*2+1);
		tr[sum*2+1].lazy1=1;
	}
	else
	{
		check(l,mid,sum*2);
		tr[sum*2].lazy1=1;
	}
}

int main()
{
	cin>>n>>q>>w;
	op=w;
	for(int i=1;i<=n;i++)
	{
		cin>>cop[i];
	}
	built(1,n,1);
//	for(int i=1;i<=4*n;i++)
//	{
//		cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].x<<"\n";
//	}
//	cout<<"\n";
//	for(int i=1;i<=4*n;i++)
//	{
//		cout<<tr[i].x<<" ";
//	}
	for(int i=1;i<=n;i++)
	{
		tr[num[i]].x=cop[i];
	}
	int l,r,d;
	for(int i=1;i<=q;i++)
	{
		cin>>l>>r>>d;
		ans=0;
		add(l,r,d,1);
//		for(int j=1;j<=4*n;j++)
//		{
//			cout<<tr[j].l<<" "<<tr[j].r<<" "<<tr[j].x<<"\n";
//		}0
//		cout<<"\n";
//		for(int j=1;j<=n;j++)
//		{
//			cout<<tr[num[i]].x<<" # ";
//		}
//		cout<<endl;
		check(1,n,1);//问题 
		cout<<ans+1<<endl;
		w=op;
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...