O2
查看原帖
O2
476325
Jusc楼主2022/11/20 19:39

写了半天线段树TLE(2),为什么看了下提交似乎都是开O2过的,当然也有可能是我没看到

所以有不用O2的,如果方便,帮我看看怎么改过

#include<bits/stdc++.h>
	
using namespace std;
	
const int N=5*1e5+10;
const int INF=2e9;
struct Yan
{	
	int l,r;
	int maxt;
	int atg,ntg,xtg;
}tr[N*4];
int w[N];
int n,m;

void moveadd(Yan &u,int s)
{
	u.maxt+=s;
	u.atg+=s;
	u.xtg+=s;
	u.ntg+=s;
}
void movenul(Yan &u,int s)
{
	u.maxt=min(u.maxt,s);
	u.xtg=min(u.xtg,s);
	u.ntg=min(u.ntg,s);
}
void movex(Yan &u,int s)
{
	u.maxt=max(u.maxt,s);
	u.xtg=max(u.xtg,s);
}
void pushup(Yan &u,Yan &l,Yan &r)
{	
	u.maxt=max(l.maxt,r.maxt);
}	
void pushdown(Yan &u,Yan &l,Yan &r)
{
	moveadd(l,u.atg);moveadd(r,u.atg); u.atg=0;
	movenul(l,u.ntg);movenul(r,u.ntg); u.ntg=INF;
	movex(l,u.xtg);movex(r,u.xtg); u.xtg=-INF;
} 
void pushdown(int u)
{	
	pushdown(tr[u],tr[u<<1],tr[u<<1|1]);
}	
void pushup(int u)
{	
	pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}	
void build(int u,int l,int r)
{	
	tr[u].l=l,tr[u].r=r;
	tr[u].ntg=INF,tr[u].xtg=-INF;
	if(l==r)
	{
		tr[u].maxt=w[r];
	}
	else 
	{
		int mid=(l+r)>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		pushup(u);
	}
}	
void modify_add(int u,int l,int r,int v)
{
	if(tr[u].l>=l&&tr[u].r<=r) moveadd(tr[u],v);
	else 
	{
		pushdown(u);
		int mid=(tr[u].l+tr[u].r)>>1;
		if(mid>=l) modify_add(u<<1,l,r,v);
		if(mid<r) modify_add(u<<1|1,l,r,v);
		pushup(u);
	}
}
void modify_ntg(int u,int l,int r,int v)
{
	if(tr[u].l>=l&&tr[u].r<=r) movenul(tr[u],v);
	else 
	{
		pushdown(u);
		int mid=(tr[u].l+tr[u].r)>>1;
		if(mid>=l) modify_ntg(u<<1,l,r,v);
		if(mid<r) modify_ntg(u<<1|1,l,r,v);
		pushup(u);
	}
}
void modify_xtg(int u,int l,int r,int v)
{
	if(tr[u].l>=l&&tr[u].r<=r) movex(tr[u],v);
	else 
	{
		pushdown(u);
		int mid=(tr[u].l+tr[u].r)>>1;
		if(mid>=l) modify_xtg(u<<1,l,r,v);
		if(mid<r) modify_xtg(u<<1|1,l,r,v);
		pushup(u);
	}
}
Yan query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u];
	else
	{
		pushdown(u);
		int mid=(tr[u].l+tr[u].r)>>1;
		if(mid>=r) return query(u<<1,l,r);
		else if(mid<l) return query(u<<1|1,l,r);
		else 
		{
			Yan res,res1,res2;
			res1=query(u<<1,l,r);
			res2=query(u<<1|1,l,r);
			pushup(res,res1,res2);
			return res;
		}
	}
}

int main()
{	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	build(1,1,n);
	while(m--)
	{
		int op,l,r,v;
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d%d",&l,&r,&v);
			modify_add(1,l,r,v); 
		}
		else if(op==2)
		{
			scanf("%d%d%d",&l,&r,&v);
			modify_ntg(1,l,r,v);
		}
		else if(op==3)
		{
			scanf("%d%d%d",&l,&r,&v);
			modify_xtg(1,l,r,v);
		}
		else
		{
			scanf("%d%d",&l,&r);
			printf("%d\n",query(1,l,r).maxt);
		}
	}
	return 0;
}	
2022/11/20 19:39
加载中...