Cod sursa(job #2379011)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 12 martie 2019 20:03:52
Problema Guvern Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fi("guvern.in");
ofstream fo("guvern.out");
int n,rez,i,x,y,Coop[200005],Fiu[200005],Dp[200005];
vector<int> A[200005],First[200005];
set<pair<int,int> > S;

void dfs(int nod, int p)
{
    vector<int>::iterator it;
    int coresp=(*S.lower_bound({Coop[nod],0})).second;
    if(!Fiu[coresp])
    {
        First[coresp].push_back(nod);
        Fiu[coresp]=nod;
    }
    S.insert({Coop[nod],nod});
    for(it=A[nod].begin(); it!=A[nod].end(); it++)
        if((*it)!=p)
            dfs(*it,nod);
    for(it=First[nod].begin(); it!=First[nod].end(); it++)
        Dp[nod]=Dp[nod]+Dp[*it];
    Dp[nod]++;
    rez=max(rez,Dp[nod]);
    S.erase({Coop[nod],nod});
    if(Fiu[coresp]==nod)
        Fiu[coresp]=0;
}

int main()
{
    fi>>n;
	for(i=1; i<n; i++)
	{
        fi>>x>>y;
        A[x].push_back(y);
        A[y].push_back(x);
	}
	for(i=1; i<=n; i++)
        fi>>Coop[i];
    dfs(1,0);
    fo<<rez<<"\n";
    fi.close();
    fo.close();
    return 0;
}