Cod sursa(job #956483)

Utilizator t0nyukukyusuf hakan kalayci t0nyukuk Data 3 iunie 2013 11:23:40
Problema Guvern Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
//TC

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>

#define forn(a,b,c) for(int (a)=(b);(a)<=(c);(a)++)
#define forr(a,b,c) for(int (a)=(b);(a)>=(c);(a)--)
#define foreach(a,b) for( typeof( (b).begin() ) a=(b).begin(); (a)!=(b).end() ; (a)++ )
#define foreachr(a,b) for( typeof( (b).rbegin() ) a=(b).rbegin(); (a)!=(b).rend() ; (a)++ )
#define dg(x)  cerr <<#x<<':'<<x<<" "
#define dbg(x)  cerr <<#x<<':'<<x<<endl
#define SET(A,b) memset(A,b,sizeof (A) )
#define SIZE(A) ((int)(A).size())
#define ALL(A) (A).begin(),(A).end()
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define num(a) (1LL<<(a))
using namespace std;

typedef double dbl;
typedef long long Lint;
typedef pair<int,int> ii;
typedef pair<Lint,Lint> Lii;

set< ii > S;

typedef set< ii >::iterator sit;

const int MAXN = 1010;

vector<int> G[MAXN],T[MAXN];

int go[MAXN];
int V[MAXN];
int R[MAXN];

void rec(int k,int pr){
	
	sit it=S.upper_bound( ii(V[k],0) );
	
	if(it!=S.end())
		go[k]=it->se;
	
	S.insert(ii(V[k],k));
	
	forn(i,0,SIZE(G[k])-1)
		if(G[k][i]!=pr)
			rec(G[k][i],k);
	
	S.erase(S.find(ii(V[k],k)));
	
}

map<int,int> L[MAXN];

typedef map<int,int> :: iterator mit;

void f(int k,int pr){
	
	forn(i,0,SIZE(G[k])-1)
		if(pr!=G[k][i])
		{
#define X G[k][i]
			f(X,k);
			if( SIZE(L[X])>SIZE(L[k]) )
				swap(L[X],L[k]);
			for(mit it=L[X].begin();it!=L[X].end();it++)
				L[k][it->fi]+=it->se;
#undef X
		}
	mit it=L[k].find( k );
	int c=1;
	if(it!=L[k].end())
	{
		c+=it->se;
		L[k].erase(it);
	}
	
	L[k][go[k]]=max(c,L[k][go[k]]);
	
}

int main(){
	
	freopen("guvern.in","r",stdin);
	freopen("guvern.out","w",stdout);
	
	int n,a,b;
	
	scanf("%d",&n);
	
	forn(i,2,n)
	{
		scanf("%d %d",&a,&b);
		G[a].pb(b);
		G[b].pb(a);
	}
	
	forn(i,1,n)
		scanf(" %d",V+i);
	
	rec(1,0);
	
	f(1,0);
	
	int res=0;
	
	for(mit it=L[1].begin();it!=L[1].end();it++)
		res=max(res,it->se);
	
	cout << res << endl;

	return 0;
	
}