Cod sursa(job #2476056)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 17 octombrie 2019 22:40:22
Problema Guvern Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <vector>
#include <set>
#define DIM 200010
using namespace std;

ifstream fin ("guvern.in");
ofstream fout ("guvern.out");
vector <int> L[DIM];
set <int> s;
int t[DIM],v[DIM],maxi[DIM],is_ok[DIM];
int n,i,x,y;
int get_rad (int x){
    while (t[x] > 0)
        x = t[x];
    return x;
}
void _union (int x, int y){
    int radx = get_rad(x), rady = get_rad(y);
    if (radx != rady){
        if (t[radx] < t[rady]){
            t[radx] += t[rady];
            t[rady] = radx;
        } else {
            t[rady] += t[radx];
            t[radx] = rady;
        }}}

void dfs (int nod, int tata){
    s.insert (v[nod]);
    set <int> :: iterator it = s.lower_bound(v[nod]);
    if (it != s.end()){
        /// inseamna ca pe nod pot sa il leg de x
        _union (nod,*it);
    }

    for (int i=0;i<L[nod].size();i++){
        int vecin = L[nod][i];
        if (vecin != tata)
            dfs (vecin,nod);
    }
    s.erase(s.find(v[nod]));
}
int main (){

    fin>>n;
    for (i=1;i<n;i++){
        fin>>x>>y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
    for (i=1;i<=n;i++){
        fin>>v[i];
        t[i] = -1;
    }

    dfs (1,0);

    int sol = 0;
    for (i=1;i<=n;i++)
        if (t[i] < 0)
            sol = max (sol,-t[i]);
    fout<<sol;



    return 0;
}