Cod sursa(job #1910354)

Utilizator LucianTLucian Trepteanu LucianT Data 7 martie 2017 16:33:29
Problema Pavare2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define maxN 100005
using namespace std;
const int INF=0x3f3f3f3f;
vector<int> v[maxN];
int val[maxN],bst[maxN],ap[maxN],nxt[maxN],_size[maxN];
unordered_map<int,int> Map[maxN];
int n,m,i,j,x,y;
void dfs(int nod,int tata)
{
    _size[nod]=1; /* size of the subtree */
    vector<int> sons;
    int bestson=0,maxx=-INF;
    for(auto &it:v[nod])
        if(it!=tata)
        {
            dfs(it,nod);
            sons.push_back(it);
            _size[nod]+=_size[it];
            if(_size[it]>_size[bestson]) /* largest subtree */
                bestson=it,maxx=_size[it];
        }
    if(maxx==-INF){ /* current node is leaf */
        bst[nod]=val[nod];
        ap[nod]=1;
        Map[nod][val[nod]]=1;
        nxt[nod]=nod;
    }
    else
    {
        nxt[nod]=nxt[bestson];
        bst[nod]=bst[bestson];
        ap[nod]=ap[bestson];
        int act=nxt[bestson];
        for(auto itr:sons)
            if(itr!=bestson)
                for(auto col:Map[nxt[itr]])
                {
                    int color=col.first;
                    Map[act][color]+=col.second;
                    if(Map[act][color]>ap[nod] || (Map[act][color]==ap[nod] && color<bst[nod])) /* updating node solution */
                        bst[nod]=color,ap[nod]=Map[act][color];
                }
        int color=val[nod]; /* adding current node's color */
        Map[act][color]++;
        if(Map[act][color]>ap[nod] || (Map[act][color]==ap[nod] && color<bst[nod]))
            bst[nod]=color,ap[nod]=Map[act][color];
    }
}
int main()
{
    freopen("egal.in","r",stdin);
    freopen("egal.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<n;i++)
        scanf("%d %d",&x,&y),
        v[x].push_back(y),
        v[y].push_back(x);
    for(i=1;i<=n;i++)
        scanf("%d ",&val[i]);
    dfs(1,0);
    for(i=1;i<=n;i++)
        printf("%d %d\n",bst[i],ap[i]);
    return 0;
}