QWQ,60求条
查看原帖
QWQ,60求条
970078
disetxyz楼主2025/1/17 18:04

代码在下,谢谢佬,一定关

#include<bits/stdc++.h>
using namespace std;
//main就是修改和相加会冲突,那就在下推相加前下推修改即可 
long long maxx[1000006*4],add[1000006*4],cover[1000006*4];
int qes[100006];
int a[1000006];
#define ls rt*2
#define rs rt*2+1
#define inf -9187201950435737472
void pushup(int rt)
{
	maxx[rt]=max(maxx[ls],maxx[rs]);
}
void build(int rt,int l,int r)
{
	if(l==r)
	{
		maxx[rt]=a[l];
		return ;
	}
	
	int mid=(l+r)/2;
	
	build(ls,l,mid);
	build(rs,mid+1,r);
	
	pushup(rt);
}
void coverdown(int rt)
{
	if(cover[rt]!=inf)
	{
		cover[ls]=cover[rt];
		maxx[ls]=cover[rt];
		add[ls]=0;
		
		cover[rs]=cover[rt];
		maxx[rs]=cover[rt];
		add[rs]=0;
		cover[rt]=inf;//还原 
	}
}
void adddown(int rt)
{
	if(add[rt]!=0)
	{
		coverdown(rt);
		add[ls]+=add[rt];
		maxx[ls]+=add[rt];
	
		add[rs]+=add[rt];
		maxx[rs]+=add[rt];
		add[rt]=0;
	}
}
void pushdown(int rt)
{
	coverdown(rt);//先改后加 
	adddown(rt);
}
void change(int rt,int l,int r,int ql,int qr,int k)
{
	if(ql<=l&&r<=qr)
	{
		cover[rt]=k;
		maxx[rt]=k;
		add[rt]=0;//直接不操作
		return ; 
	}
	
	int mid=(l+r)/2;
	pushdown(rt);
	
	if(ql<=mid)
	change(ls,l,mid,ql,qr,k);
	if(qr>mid)
	change(rs,mid+1,r,ql,qr,k);
	
	pushup(rt);
}
void addc(int rt,int l,int r,int ql,int qr,int k)
{
	if(ql<=l&&r<=qr)
	{
		coverdown(rt);
		maxx[rt]+=k;
		add[rt]+=k;//直接不操作 
		return ;
	}
	
	int mid=(l+r)/2;
	pushdown(rt);
	
	if(ql<=mid)
	addc(ls,l,mid,ql,qr,k);
	if(qr>mid)
	addc(rs,mid+1,r,ql,qr,k);
	
	pushup(rt);
}
long long query(int rt,int l,int r,int ql,int qr) 
{
	if(ql<=l&&r<=qr)
	return maxx[rt];
	
	int mid=(l+r)/2;
	pushdown(rt);
	
	long long res=inf;
	if(ql<=mid)
	res=max(res,query(ls,l,mid,ql,qr));
	if(qr>mid)
	res=max(res,query(rs,mid+1,r,ql,qr));
	
	return res;
}
int main()
{
	memset(maxx,128,sizeof(maxx));
	//cout<<maxx[1]<<endl;
	
	int n,q,op,a1,b1,x;
	cin>>n>>q;
	
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		for(int j=1;j<=4;j++)
		{
			cover[i*j]=inf;//特殊的标记 
		} 
	}
	
	build(1,1,n);
	int cnt=0;
	//cout<<' '<<maxx[1]<<endl;
	for(int i=1;i<=q;i++)
	{
		cin>>op>>a1>>b1;
		if(op==1)//修改为! 
		{
			cin>>x;
			change(1,1,n,a1,b1,x);
		}
		else if(op==2)//加 
		{
			cin>>x;
			addc(1,1,n,a1,b1,x);
		}
		else if(op==3)//求最大
		{
			qes[++cnt]=query(1,1,n,a1,b1);
			//cout<<query(1,1,n,a1,b1)<<endl;
		} 
	}
	for(int i=1;i<=cnt;i++)
	{
		cout<<qes[i]<<endl;
	}
	return 0;
}
2025/1/17 18:04
加载中...