dsu 板子求条 TLE #26
  • 板块CF600E Lomsat gelral
  • 楼主AKPC
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/25 17:08
  • 上次更新2024/7/25 18:33:42
查看原帖
dsu 板子求条 TLE #26
540363
AKPC楼主2024/7/25 17:08
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
using namespace std;
#define int long long
#define fr first
#define sc second
inline int read(){
	int res=0,f=1;char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
	return res*f;
}
const int N=1e5+5;
int n,a[N],siz[N],bson[N],cnt[N],mx,ans[N];
vector<int>e[N],id;
void init_siz(int u,int fa){
	for (auto v:e[u]){
		if (v==fa) continue;
		init_siz(v,u),siz[u]+=siz[v];
		if (siz[v]>siz[bson[u]]) bson[u]=v;
	}
	siz[u]++;
}
void add(int u){
	if (++cnt[a[u]]>mx){
		mx=cnt[a[u]];
		id.clear(),id.push_back(a[u]);
	}
	else if (cnt[a[u]]==mx) id.push_back(a[u]);
}
void color(int u,int fa){
	add(u);
	for (auto v:e[u]){
		if (v==fa) continue;
		color(v,u);
	}
}
void clears(int u,int fa){
	cnt[a[u]]--;
	for (auto v:e[u]){
		if (v==fa) continue;
		clears(v,u);
	}
}
void dfs(int u,int fa,int op){
	for (auto v:e[u]){
		if (v==fa||v==bson[u]) continue;
		dfs(v,u,0);
	}
	if (bson[u]!=0) dfs(bson[u],u,1);
	for (auto v:e[u]){
		if (v==fa||v==bson[u]) continue;
		color(v,u);
	}
	add(u);
	for (auto i:id) ans[u]+=i;
	if (op) return;
	clears(u,fa);
	id.clear(),mx=0;
}
signed main(){
	n=read();
	for (int i=1;i<=n;i++) a[i]=read();
	for (int i=1;i<n;i++){
		int u=read(),v=read();
		e[u].push_back(v),e[v].push_back(u);
	}
	init_siz(1,0);
//	for (int i=1;i<=n;i++) cout<<bson[i]<<' ';
	dfs(1,0,1);
	for (int i=1;i<=n;i++) printf("%lld ",ans[i]);
	return 0;
}
2024/7/25 17:08
加载中...