AC on #5#6 20pts 似乎是求和错了 求调
查看原帖
AC on #5#6 20pts 似乎是求和错了 求调
779970
lunjiahao楼主2024/2/29 11:25
#include<bits/stdc++.h>
#define ls u<<1
#define rs u<<1|1
using namespace std;
const int N=3e4+5,INF=2e9;
int n,m,rt[N],a[N],t[N<<2],maxl[N<<2];
int cnt,fa[N],top[N],w[N],dep[N],siz[N],hs[N];
vector<int> g[N];
void dfs1(int u,int fath)
{
	fa[u]=fath;
	siz[u]=1;
	hs[u]=-1;
	dep[u]=dep[fath]+1;
	for(auto v:g[u])
	{
		if(v==fath) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(hs[u]==-1||siz[v]>siz[hs[u]]) hs[u]=v;
	}
}
void dfs2(int u,int t)
{
	top[u]=t;
	a[++cnt]=rt[u];
	w[u]=cnt;
	if(hs[u]==-1) return;
	dfs2(hs[u],t);
	for(auto v:g[u])
		if(v!=fa[u]&&hs[u]!=v)
			dfs2(v,v);
}
void push_up(int u)
{
	t[u]=t[ls]+t[rs];
	maxl[u]=max(maxl[ls],maxl[rs]);
}
void build(int u,int l,int r)
{
	if(l==r)
	{
		t[u]=maxl[u]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(u);
}
void update(int u,int l,int r,int x,int k)
{
	if(x<l||r<x) return;
	if(x==l&&r==x)
	{
		t[u]=maxl[u]=k;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid) update(ls,l,mid,x,k);
		else update(rs,mid+1,r,x,k);
	push_up(u);
}
int MAX(int u,int l,int r,int x,int y)
{
	if(y<l||r<x) return -INF;
	if(x<=l&&r<=y) return maxl[u];
	int mid=(l+r)>>1,res=-INF;
	if(x<=mid) res=max(res,MAX(ls,l,mid,x,y));
	if(y>mid) res=max(res,MAX(rs,mid+1,r,x,y));
	return res;
}
int query(int u,int l,int r,int x,int y)
{
	if(y<l||r<x) return 0;
	if(x<=l&&r<=y) return t[u];
	int mid=(l+r)>>1,res=0;
	if(x<=mid) res+=query(ls,l,mid,x,y);
	if(y>mid) res+=query(rs,mid+1,r,x,y);
	return res;
}
int modify_max(int u,int v)
{
	int ans=-INF;
	while(top[u]^top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans=max(ans,MAX(1,1,n,hs[w[u]],w[u]));
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	ans=max(ans,MAX(1,1,n,w[v],w[u]));
	return ans;
}
int modify_sum(int u,int v)
{
	int ans=0;
	while(top[u]^top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans+=query(1,1,n,hs[w[u]],w[u]);
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	ans+=query(1,1,n,w[v],w[u]);
	return ans;
}
signed main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].emplace_back(v);
		g[v].emplace_back(u);
	}
	for(int i=1;i<=n;i++) scanf("%d",&rt[i]);
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	scanf("%d",&m);
	while(m--)
	{
		char opt[8];
		int x,y;
		scanf("%s%d%d",opt,&x,&y);
		if(opt[1]=='H') update(1,1,n,w[x],y);
		if(opt[1]=='M') printf("%d\n",modify_max(x,y));
		if(opt[1]=='S') printf("%d\n",modify_sum(x,y));
	}
	return 0;
}
2024/2/29 11:25
加载中...