Educational Codeforces Round 2 E. Lomsat gelral

鏈接

https://codeforces.com/contest/600/problem/E

題解

dsu on treedsu\ on\ tree題,dsu on treedsu\ on\ tree就是利用輕重鏈剖分的性質對暴力進行優化
對不同的題處理好信息的維護方式就好了

代碼

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章