社区讨论

50PTS求条,WAon#6789 TLEon#10

P1253扶苏的问题参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mi1a4wl8
此快照首次捕获于
2025/11/16 13:33
3 个月前
此快照最后确认于
2025/11/17 09:10
3 个月前
查看原帖
代码如下
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
	int l;
	int r;
	int v;
	int lzy;
	int op;
};
node tr[N*4];
int a[N];
void pushup(int u)
{
	tr[u].v=max(tr[u*2].v,tr[u*2+1].v);
}
void pushdown(int u)
{
	int v=tr[u].v;
	int lzy=tr[u].lzy;
	int op=tr[u].op;
	if(op!=-1)
	{
		if(op==1)
		{
			if(tr[u*2].op!=-1)
			{
				tr[u*2].v+=lzy;
				tr[u*2].lzy+=lzy;				
			}
			else
			{
				tr[u*2].v+=lzy;
				tr[u*2].lzy+=lzy;				
				tr[u*2].op=op;				
			}					
			if(tr[u*2+1].op!=-1)
			{
				tr[u*2+1].v+=lzy;
				tr[u*2+1].lzy+=lzy;				
			}
			else
			{
				tr[u*2+1].v+=lzy;
				tr[u*2+1].lzy+=lzy;				
				tr[u*2+1].op=op;				
			}	
			tr[u].lzy=0;
			tr[u].op=-1;
		}
		if(op==2)
		{
			tr[u*2].v=lzy;
			tr[u*2].lzy=lzy;
			tr[u*2].op=op;
			tr[u*2+1].v=lzy;
			tr[u*2+1].lzy=lzy;
			tr[u*2+1].op=op;
			tr[u].lzy=0;
			tr[u].op=-1;
		}
	}
}
void bui(int u,int l,int r)
{
	tr[u].l=l;tr[u].r=r;tr[u].v=0;tr[u].lzy=0;tr[u].op=-1;
	if(l==r)
	{
		tr[u].v=a[l];
		return ;
	}
	int mid=(l+r)/2;
	bui(u*2,l,mid);
	bui(u*2+1,mid+1,r);
	pushup(u);
}
int query(int u,int l,int r)
{		
	if(tr[u].l>=l&&tr[u].r<=r)
	{		
		return tr[u].v;		
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)/2;
	int tmp1=-INT_MAX,tmp2=-INT_MAX;
	if(l<=mid)
		tmp1=query(u*2,l,r);
	if(r>mid)
		tmp2=query(u*2+1,l,r);
	int k=max(tmp1,tmp2);
	return k;
}
void mdf1(int u,int l,int r,int x)
{
	if(tr[u].l>=l&&tr[u].r<=r)
	{
		if(tr[u].op!=-1)
		{
			tr[u].v+=x;
			tr[u].lzy+=x;
		}
		else
		{
			tr[u].v+=x;
			tr[u].lzy+=x;				
			tr[u].op=1;	
		}
	}
	else
	{
		pushdown(u);
		int mid=(tr[u].l+tr[u].r)/2;
		if(l<=mid)
			mdf1(u*2,l,r,x);
		if(r>mid)
			mdf1(u*2+1,l,r,x);
		pushup(u);
	}
}
void mdf2(int u,int l,int r,int x)
{	
	if(tr[u].l>=l&&tr[u].r<=r)
	{
		tr[u].v=x;
		tr[u].lzy=x;
		tr[u].op=2;
	}
	else
	{
		pushdown(u);
		int mid=(tr[u].l+tr[u].r)/2;
		if(l<=mid)
			mdf2(u*2,l,r,x);
		if(r>mid)
			mdf2(u*2+1,l,r,x);
		pushup(u);
	}
}
int main()
{
	cin.tie(0);
	cout.tie(0);
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	bui(1,1,n);
	int op;
	while(q--)
	{
		cin>>op;
		if(op==1)
		{
			int l,r,x;
			cin>>l>>r>>x;
			mdf2(1,l,r,x);
		}
		if(op==2)
		{
			int l,r,x;
			cin>>l>>r>>x;
			mdf1(1,l,r,x);
		}
		if(op==3)
		{
			int l,r;
			cin>>l>>r;
			cout<<query(1,l,r)<<endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...