Cod sursa(job #917808)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 18 martie 2013 13:10:57
Problema Guvern Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 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;
}