P10639求助
  • 板块灌水区
  • 楼主lfxxx_
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/14 16:55
  • 上次更新2025/1/14 20:31:55
查看原帖
P10639求助
795344
lfxxx_楼主2025/1/14 16:55

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5,inf=0x3f3f3f3f3f3f3f3f;
int a[N],sum[N<<2],mx[N<<2],smx[N<<2],mi[N<<2],smi[N<<2],add[N<<2],tmx[N<<2],tmi[N<<2],cntmx[N<<2],cntmi[N<<2];
void pushup(int p)
{
	int ls=p<<1,rs=p<<1|1;
	sum[p]=sum[ls]+sum[rs];
	mx[p]=max(mx[ls],mx[rs]);
	mi[p]=min(mi[ls],mi[rs]);
	if(mx[ls]==mx[rs])
	{
		smx[p]=max(smx[ls],smx[rs]);
		cntmx[p]=cntmx[ls]+cntmx[rs];
	}
	else
	{
		smx[p]=max({smx[ls],smx[rs],min(mx[ls],mx[rs])});
		cntmx[p]=(mx[ls]>mx[rs])?cntmx[ls]:cntmx[rs];
	}
	if(mi[ls]==mi[rs])
	{
		smi[p]=min(smi[ls],smi[rs]);
		cntmi[p]=cntmi[ls]+cntmi[rs];
	}
	else
	{
		smi[p]=min({smi[ls],smi[rs],max(mi[ls],mi[rs])});
		cntmi[p]=(mi[ls]<mi[rs])?cntmi[ls]:cntmi[rs];
	}
}
void addtag1(int p,int pl,int pr,int d)
{
	sum[p]+=(pr-pl+1)*d;
	mx[p]+=d;
	mi[p]+=d;
	if(smx[p]!=-inf)smx[p]+=d;
	if(smi[p]!=inf)smi[p]+=d;
	if(tmx[p]!=-inf)tmx[p]+=d;
	if(tmi[p]!=inf)tmi[p]+=d;
	add[p]+=d;
}
void addtag2(int p,int d)
{
	if(mi[p]>=d)
		return ;
	sum[p]+=cntmi[p]*(d-mi[p]);
	tmi[p]=d;
	tmx[p]=max(tmx[p],tmi[p]);
	if(smx[p]==mi[p])
		smx[p]=d;
	if(mx[p]==mi[p])
		mx[p]=d;
	mi[p]=d;
}
void addtag3(int p,int d)
{
	if(mx[p]<=d)
		return ;
	sum[p]+=cntmx[p]*(d-mx[p]);
	tmx[p]=d;
	tmi[p]=min(tmi[p],tmx[p]);
	if(smi[p]==mx[p])
		smi[p]=d;
	if(mi[p]==mx[p])
		mi[p]=d;
	mx[p]=d;
}
void pushdown(int p,int pl,int pr)
{
	int mid=(pl+pr)>>1;
	if(add[p])
	{
		addtag1(p<<1,pl,mid,add[p]);
		addtag1(p<<1|1,mid+1,pr,add[p]);
		add[p]=0;
	}
	if(tmi[p]!=inf)
	{
		addtag2(p<<1,tmi[p]);
		addtag2(p<<1|1,tmi[p]);
		tmi[p]=inf;
	}
	if(tmx[p]!=-inf)
	{
		addtag3(p<<1,tmx[p]);
		addtag3(p<<1|1,tmx[p]);
		tmx[p]=-inf;
	}
}
void build(int p,int pl,int pr)
{
	if(pl==pr)
	{
		add[p]=0;
		sum[p]=mx[p]=mi[p]=a[pl];
		smx[p]=tmx[p]=-inf;
		smi[p]=tmi[p]=inf;
		cntmx[p]=cntmi[p]=1;
		return ;
	}
	int mid=(pl+pr)>>1;
	build(p<<1,pl,mid);
	build(p<<1|1,mid+1,pr);
	pushup(p);	
}
void update1(int p,int pl,int pr,int L,int R,int d)
{
	if(R<pl||pr<L)
		return ;
	if(L<=pl&&pr<=R)
	{
		addtag1(p,pl,pr,d);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update1(p<<1,pl,mid,L,R,d);
	update1(p<<1|1,mid+1,pr,L,R,d);
	pushup(p);
}
void update2(int p,int pl,int pr,int L,int R,int d)
{
	if(R<pl||pr<L)
		return ;
	if(mi[p]>=d)
		return ;
	if(L<=pl&&pr<=R&&d<smi[p])
	{
		if(pl!=pr)
			pushdown(p,pl,pr);
		addtag2(p,d);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update2(p<<1,pl,mid,L,R,d);
	update2(p<<1|1,mid+1,pr,L,R,d);
	pushup(p);
}
void update3(int p,int pl,int pr,int L,int R,int d)
{
	if(R<pl||pr<L)
		return ;
	if(mx[p]<=d)
		return ;
	if(L<=pl&&pr<=R&&d>smx[p])
	{
		if(pl!=pr)
			pushdown(p,pl,pr);
		addtag3(p,d);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update3(p<<1,pl,mid,L,R,d);
	update3(p<<1|1,mid+1,pr,L,R,d);
	pushup(p);
}
int query1(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return 0;
	if(L<=pl&&pr<=R)
		return sum[p];
	pushdown(p,pl,pr);
	int mid=(pl+pr)>>1;
	return query1(p<<1,pl,mid,L,R)+query1(p<<1|1,mid+1,pr,L,R); 
}
int query2(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return -inf;
	if(L<=pl&&pr<=R)
		return mx[p];
	pushdown(p,pl,pr);
	int mid=(pl+pr)>>1;
	return max(query2(p<<1,pl,mid,L,R),query2(p<<1|1,mid+1,pr,L,R)); 
}
int query3(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return inf;
	if(L<=pl&&pr<=R)
		return mi[p];
	pushdown(p,pl,pr);
	int mid=(pl+pr)>>1;
	return min(query3(p<<1,pl,mid,L,R),query3(p<<1|1,mid+1,pr,L,R)); 
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m;
	cin>>n;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	build(1,1,n);
	cin>>m;
	while(m--)
	{
		int op,l,r,k;
		cin>>op>>l>>r;
		if(op==1)
		{
			cin>>k;
			update1(1,1,n,l,r,k);
		}
		if(op==2)
		{
			cin>>k;
			update2(1,1,n,l,r,k);
		}
		if(op==3)
		{
			cin>>k;
			update3(1,1,n,l,r,k);
		}
		if(op==4)
			cout<<query1(1,1,n,l,r)<<'\n';
		if(op==5)
			cout<<query2(1,1,n,l,r)<<'\n';
		if(op==5)
			cout<<query3(1,1,n,l,r)<<'\n';
	}
}
2025/1/14 16:55
加载中...