Cod sursa(job #918347)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 20:19:03
Problema Guvern Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <set>
 
using namespace std;
 
#define MAXN 200010
 
vector<int> G[MAXN];
vector<int> V[MAXN];
int A[MAXN], St[MAXN], Dr[MAXN], Stiva[MAXN];
int Din[MAXN], Din2[MAXN];
set<pair<int, int> > S;
set<pair<int, int> >::iterator it2;
int i, X, Y, N, T;
 
void df(int nod, int tata)
{
    vector<int>::iterator it;
     
    St[nod] = ++T;
    S.insert(make_pair(A[nod], nod));
    for (it = G[nod].begin(); it != G[nod].end(); ++it){
        if (*it == tata) continue;
        df(*it, nod);
    }
    Dr[nod] = ++T;
    S.erase(make_pair(A[nod], nod));
 
    int X = S.size();
    it2 = S.lower_bound(make_pair(A[nod], 0));
    if (it2 != S.end()){
        V[(*it2).second].push_back(nod);
        //printf("%d %d\n", nod, (*it2).second);
    }
     
    int Nr, Aux, nod2;
    Nr = 0;
    for (it = V[nod].begin(); it != V[nod].end(); ++it){
        nod2 = *it;
        Din2[nod2] = 0;
        while (Nr > 0 && St[nod2] <= St[Stiva[Nr]] && Dr[Stiva[Nr]] <= Dr[nod2]){
            Din2[nod2] += Din2[Stiva[Nr]];
            --Nr;
        }
        if (Din[nod2] > Din2[nod2])
            Din2[nod2] = Din[nod2];
        Stiva[++Nr] = nod2;
    }
 
    Aux = 0;
    for (int i = 1; i <= Nr; ++i)
        Aux += Din2[Stiva[i]];
    Din[nod] = Aux + 1;
}
 
int main()
{
    freopen("guvern.in","r",stdin);
    freopen("guvern.out","w",stdout);
     
    scanf("%d",&N);
    for (i = 1; i < N; ++i){
        scanf("%d %d", &X, &Y);
        G[X].push_back(Y);
        G[Y].push_back(X);
    }
    G[0].push_back(1);
    A[0] = +2000000000;
     
    for (i = 1; i <= N; ++i)
        scanf("%d", &A[i]);
     
    df(0, -1);
     
    printf("%d\n", Din[0] - 1);
     
    return 0;
}