鏈接
https://codeforces.com/contest/600/problem/E
題解
題,就是利用輕重鏈剖分的性質對暴力進行優化
對不同的題處理好信息的維護方式就好了
代碼
#include <bits/stdc++.h>
#define maxn 100010
#define maxe 200010
using namespace std;
typedef long long ll;
struct Graph
{
ll etot, head[maxn], to[maxe], next[maxe], w[maxe];
void clear(ll N)
{
for(ll i=1;i<=N;i++)head[i]=0;
etot=0;
}
void adde(ll a, ll b, ll c){to[++etot]=b;w[etot]=c;next[etot]=head[a];head[a]=etot;}
}G;
ll size[maxn], forb[maxn], sz[maxn], son[maxn], cnt[maxn], c[maxn], mx, ans[maxn], A;
void dfs1(ll pos, ll pre)
{
sz[pos]=1;
for(auto p=G.head[pos];p;p=G.next[p])
if(G.to[p]!=pre)
{
dfs1(G.to[p],pos);
sz[pos]+=sz[G.to[p]];
if(sz[G.to[p]]>sz[son[pos]])son[pos]=G.to[p];
}
}
void force(ll pos, ll pre, ll v)
{
cnt[c[pos]]+=v;
if(v>0)
{
if(cnt[c[pos]]>mx)mx=cnt[c[pos]], A=c[pos];
else if(cnt[c[pos]]==mx)A+=c[pos];
}
for(auto p=G.head[pos];p;p=G.next[p])
if(G.to[p]!=pre and !forb[G.to[p]])
force(G.to[p],pos,v);
}
void dfs2(ll pos, ll pre, ll h)
{
for(auto p=G.head[pos];p;p=G.next[p])
if(G.to[p]!=pre and G.to[p]!=son[pos])
dfs2(G.to[p],pos,0);
if(son[pos])
{
dfs2(son[pos],pos,1);
forb[son[pos]]=1;
}
force(pos,pre,+1);
ans[pos]=A;
forb[son[pos]]=0;
if(!h)force(pos,pre,-1), mx=0;
}
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
int main()
{
ll u, v, n, m;
n=read();
for(ll i=1;i<=n;i++)c[i]=read();
for(ll i=1;i<n;i++)u=read(), v=read(), G.adde(u,v,0), G.adde(v,u,0);
dfs1(1,0);
dfs2(1,0,0);
for(ll i=1;i<=n;i++)printf("%lld ",ans[i]);
return 0;
}