萌新求助树剖
查看原帖
萌新求助树剖
126871
yzh_Error404Error楼主2022/10/12 08:38

RT,一直WA

#include<bits/stdc++.h>
using namespace std;
const int MAXN=6e6+5;
struct node
{
	int to,nxt;
}e[MAXN];
int head[MAXN],cnt;
inline void add(int x,int y)
{
	e[++cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
}
int n,q;
int a[MAXN];
int siz[MAXN],dep[MAXN],hson[MAXN],fa[MAXN];
inline void dfs1(int x,int f)
{
	fa[x]=f;
	dep[x]=dep[f]+1;
	siz[x]=1;
	int maxson=-1;
	for(register int i=head[x];i;i=e[i].nxt)
	{
		int y=e[i].to;
		if(y==f)continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(siz[y]>maxson)
		{
			maxson=siz[y];
			hson[x]=y;
		}
	}
}
int nval[MAXN],top[MAXN],id[MAXN],now;
inline void dfs2(int x,int ltop)
{
	id[x]=++now;
	nval[now]=a[x];
	top[x]=ltop;
	if(!hson[x])return;
	dfs2(hson[x],ltop);
	for(register int i=head[x];i;i=e[i].nxt)
	{
		int y=e[i].to;
		if(y==fa[x]||y==hson[x])continue;
		dfs2(y,y);
	}
}
struct tree
{
	int val,sum,ls,rs,ms;
	int dat,cov;
}t[MAXN];
inline tree merge(tree a,tree b)
{
	tree ans;
	ans.sum=(a.sum+b.sum);
	ans.ls=max(a.ls,a.sum+b.ls);
	ans.rs=max(b.rs,b.sum+a.rs);
	ans.ms=max(a.rs+b.ls,max(a.ms,b.ms));
	ans.dat=ans.cov=0;
	return ans;
}
inline void pushup(int p)
{
	t[p]=merge(t[p<<1],t[p<<1|1]);
}
inline void build(int p,int l,int r)
{
	if(l==r)
	{
		t[p].sum=nval[l];
		t[p].ls=t[p].rs=t[p].ms=max(t[p].sum,0);
		t[p].cov=0;
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
inline void addtag(int p,int l,int r,int k)
{
	t[p].sum=(r-l+1)*k;
	t[p].ls=t[p].rs=t[p].ms=max(t[p].sum,0);
	t[p].cov=1,t[p].dat=k;
}
inline void pushdown(int p,int l,int r)
{
	if(t[p].cov)
	{
		int mid=(l+r)>>1;
		addtag(p<<1,l,mid,t[p].dat);
		addtag(p<<1|1,mid+1,r,t[p].dat);
		t[p].cov=t[p].dat=0;
	}
}
inline void change(int p,int l,int r,int a,int b,int k)
{
	if(r<a||l>b)return;
	if(l>=a&&r<=b)
	{
		addtag(p,l,r,k);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(p,l,r);
	change(p<<1,l,mid,a,b,k);
	change(p<<1|1,mid+1,r,a,b,k);
	pushup(p);
}
inline tree ask(int p,int l,int r,int a,int b)
{
    if(l>=a&&r<=b)return t[p];
    int mid=(l+r)>>1;
    pushdown(p,l,r);
    if(b<=mid)return ask(p<<1,l,mid,a,b);
    if(mid<a)return ask(p<<1|1,mid+1,r,a,b);
    return merge(ask(p<<1,l,mid,a,b),ask(p<<1|1,mid+1,r,a,b));
}
inline void change_ran(int x,int y,int k)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		change(1,1,n,id[top[x]],id[x],k);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	change(1,1,n,id[x],id[y],k);
}
inline tree ask_ran(int x,int y)
{
	tree l,r;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]>dep[top[y]])
		{
			l=merge(ask(1,1,n,id[top[x]],id[x]),l);
			x=fa[top[x]];
		}
		else
		{
			r=merge(ask(1,1,n,id[top[y]],id[y]),r);
			y=fa[top[y]];
		}
	}
	if(dep[x]>dep[y])l=merge(ask(1,1,n,id[y],id[x]),l);
	else r=merge(ask(1,1,n,id[x],id[y]),r);
	swap(l.ls,l.rs);
	return merge(l,r);
}
int main()
{
	scanf("%d",&n);
	for(register int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(register int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	scanf("%d",&q);
	for(register int i=1;i<=q;i++)
	{
		int op,a,b,c;
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d",&a,&b);
			printf("%d\n",ask_ran(a,b).ms);
		}
		if(op==2)
		{
			scanf("%d%d%d",&a,&b,&c);
			change_ran(a,b,c);
		}
	}
	return 0;
}
2022/10/12 08:38
加载中...