Pagini recente » Cod sursa (job #228128) | Cod sursa (job #769711) | Cod sursa (job #1418676) | Cod sursa (job #1411379) | Cod sursa (job #994926)
Cod sursa(job #994926)
#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;
}