Dsu On Tree 求助
查看原帖
Dsu On Tree 求助
1061320
Isharmla楼主2023/9/30 14:51

rt。不知道为什么错了。

#include<bits/stdc++.h>
using namespace std;

#define int long long 

#define F(i,a,b) for(int i=a;i<=b;i++)

const int N=8e5+5;

int head[N],nxt[N],to[N],cnt;

inline void AddEdge(int u,int v){
	to[++cnt]=v;
	nxt[cnt]=head[u];
	head[u]=cnt;
}

inline int read();

int n,a[N],Ans,cs[N],Q[N],ans[N],tmp,tot;
int f[N],siz[N],son[N];

inline void dfs(int u,int v){
	siz[u]=1;
	f[u]=v;
	for(int i=head[u];i;i=nxt[i]){
		if(to[i]==v) continue;
		dfs(to[i],u);
		siz[u]+=siz[to[i]];
		if(!son[u]||siz[son[u]]<siz[to[i]] ) son[u]=to[i];
	}
	return;
}

inline void CL(){
	while(tot) cs[Q[tot]]=0,tot--;
	tmp=Ans=0;
	return;
}

inline void Insert(int x){
	cs[x]++;
	Q[++tot]=x;
	if(cs[x]>tmp) tmp=cs[x],Ans=x;
	else if(cs[x]==tmp) Ans+=x;
}

inline void Add(int x,int fa){
	Insert(a[x]);
	for(int i=head[x];i;i=nxt[i]){
		if(to[i]==fa) continue;
		Add(to[i],x);
	}
}
//Dsu On Tree

inline void Solve(int u,int v){
	for(int i=head[u];i;i=nxt[i]){
		if(to[i]==v||to[i]==son[u]) continue;
		Solve(to[i],u);CL();
	}
	if(son[u]) Solve(son[u],u);
	for(int i=head[u];i;i=nxt[i]){
		if(to[i]==v||to[i]==son[u])continue;
		Add(to[i],u);
	}
	Insert(u),ans[u]=Ans;
}

signed main(){
	n=read();
	F(i,1,n) a[i]=read();
	F(i,1,n-1) {
		int u,v;
		u=read(),v=read();
		AddEdge(u,v);
		AddEdge(v,u);
	}
	dfs(1,1);
	Solve(1,1);
	F(i,1,n) cout<<ans[i]<<" ";
	return 0;
}

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f*=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return x*f;
}

2023/9/30 14:51
加载中...