全wa求助!!!
查看原帖
全wa求助!!!
547787
__Refine__楼主2024/11/10 10:34
#include<bits/stdc++.h>
#define int long long
using namespace std;

struct bian
{
	int nxt,to;
}b[60001];
int dian[30001],tot;
int sum[30001],maxv[30001],rnk[30001],fa[30001],hson[30001],sze[30001],dep[30001],dfn[30001],top[30001];
int n,p,cnt,zhi[30001];

inline void add(int x,int y)
{
	b[++tot].nxt=dian[x];
	b[tot].to=y;
	dian[x]=tot;
}
void dfs1(int x)
{
	hson[x]=-1;
	dep[x]=dep[fa[x]]+1;
	sze[x]=1;
	for(int i=dian[x];i;i=b[i].nxt)
	{
		int c=b[i].to;
		if(c==fa[x]||dep[c]!=0)continue;
		fa[c]=x;
		dfs1(c);
		sze[x]+=sze[c];
		if(hson[x]==-1||sze[hson[x]]<sze[c])hson[x]=c;
	}
}
void dfs2(int x,int t)
{
	top[x]=t;
	dfn[x]=++cnt;
	rnk[cnt]=x;
	if(hson[x]==-1)return ;
	dfs2(hson[x],t);
	for(int i=dian[x];i;i=b[i].nxt)
	{
		int c=b[i].to;
		if(c==hson[x]||c==fa[x])continue;
		dfs2(c,c);
	}
}
void build(int k,int l,int r)
{
	if(l==r)
	{
		maxv[k]=sum[k]=zhi[rnk[l]];
		return ;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build((k<<1)|1,mid+1,r);
	sum[k]=sum[k<<1]+sum[(k<<1)|1];
	maxv[k]=max(maxv[k<<1],maxv[(k<<1)|1]);
}
void add(int k,int l,int r,int x,int y)
{
	if(l>x||r<x)return ;
	if(l==r&&l==x)
	{
		maxv[k]=sum[k]=y;
		return ;
	}
	int mid=(l+r)>>1;
	add(k<<1,l,mid,x,y);
	add((k<<1)|1,mid+1,r,x,y);
	sum[k]=sum[k<<1]+sum[(k<<1)|1];
	maxv[k]=max(maxv[k<<1],maxv[(k<<1)|1]);
}
int query1(int k,int l,int r,int x,int y)
{
	if(l>y||r<x)return 0;
	if(l>=x&&r<=y)return sum[k];
	int mid=(l+r)>>1;
	int all=0;
	all+=query1(k<<1,l,mid,x,y);
	all+=query1((k<<1)|1,mid+1,r,x,y);
	return all;
}
int query2(int k,int l,int r,int x,int y)
{
	if(l>y||r<x)return 0;
	if(l>=x&&r<=y)return maxv[k];
	int mid=(l+r)>>1;
	int all=-50001;
	all=query2(k<<1,l,mid,x,y);
	all=max(all,query2((k<<1)|1,mid+1,r,x,y));
	return all;
}
int query_max(int x,int y)
{
	int fx=top[x],fy=top[y];
	int all=-50000;
	while(fx!=fy)
	{
		if(dep[x]>dep[y])
		{
			all=max(all,query2(1,1,cnt,dfn[fx],dfn[x]));
			x=fa[fx];
		}
		else
		{
			all=max(all,query2(1,1,cnt,dfn[fy],dfn[y]));
			y=fa[fy]; 
		}
		fx=top[x];
		fy=top[y];
	}
	if(dfn[x]>dfn[y]){
		all=max(all,query2(1,1,cnt,dfn[y],dfn[x]));
	}
	else all=max(all,query2(1,1,cnt,dfn[x],dfn[y]));
	return all;
}
int query_sum(int x,int y)
{
	int fx=top[x],fy=top[y];
	int all=0;
	while(fx!=fy)
	{
		if(dep[fx]>dep[fy])
		{
			all+=query1(1,1,cnt,dfn[fx],dfn[x]);
			x=fa[fx];
		}
		else
		{
			all+=query1(1,1,cnt,dfn[fy],dfn[y]);
			y=fa[fy]; 
		}
		fx=top[x];
		fy=top[y];
	}
	if(dfn[x]>dfn[y]){
		all+=query1(1,1,cnt,dfn[y],dfn[x]);
	}
	else all+=query1(1,1,cnt,dfn[x],dfn[y]);
	return all;
}
signed main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	dep[0]=-1;
	dfs1(2);
	dfs2(2,2);
	for(int i=1;i<=n;i++)scanf("%lld",&zhi[i]);
	build(1,1,cnt);
	cin>>p;
	for(int i=1;i<=p;i++)
	{
		string s;
		int x,y;
		cin>>s;
		scanf("%lld%lld",&x,&y);
		if(s=="QMAX")printf("%d\n",query_max(x,y));
		else if(s=="CHANGE") add(1,1,cnt,dfn[x],y);
		else printf("%d\n",query_sum(x,y));
	}
	return 0;
 } 
2024/11/10 10:34
加载中...