Cod sursa(job #956954)

Utilizator burakbugrulBurak Bugrul burakbugrul Data 4 iunie 2013 10:18:01
Problema Guvern Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <set>
#include <vector>

#define fi first
#define se second
#define pb push_back

using namespace std;

typedef pair<int,int> ii;

const int MAXN=200010;

int N,cnt,res;
int ar[MAXN];
int go[MAXN];

set<ii> s;
map<int,int> dn[MAXN];
vector<int> way[MAXN];

void dfs( int nd , int pre ){
	
	set<ii>::iterator it=s.upper_bound(ii(ar[nd],0));
	
	if( it!=s.end() )
		go[nd]=it->se;
	
	s.insert(ii(ar[nd],nd));
	
	for( vector<int>::iterator it2=way[nd].begin() ; it2!=way[nd].end() ; it2++ )
		if( *it2!=pre )
			dfs(*it2,nd);
	
	s.erase(s.find(ii(ar[nd],nd)));
}

void dfs2( int nd , int pre ){
	
	for( vector<int>::iterator it=way[nd].begin() ; it!=way[nd].end() ; it++ )
		if( *it!=pre ){
			
			dfs2(*it,nd);
			
			if( (int)dn[nd].size()<(int)dn[*it].size() )
				swap(dn[nd],dn[*it]);
			
			for( map<int,int>::iterator it2=dn[*it].begin() ; it2!=dn[*it].end() ; it2++ )
				dn[nd][it2->fi]+=it2->se;
		}
	
	int c=1;
	map<int,int>::iterator it=dn[nd].find(nd);
	
	if( it!=dn[nd].end() ){
		c+=it->se;
		dn[nd].erase(it);
	}
	
	dn[nd][go[nd]]=max(dn[nd][go[nd]],c);
}

int main(){
	
	freopen("guvern.in","r",stdin);
	freopen("guvern.out","w",stdout);
	
	scanf(" %d",&N);
	
	for( int a,b,i=1 ; i<N ; i++ ){
		scanf(" %d %d",&a,&b);
		way[a].pb(b);
		way[b].pb(a);
	}
	
	for( int i=1 ; i<=N ; i++ )
		scanf(" %d",ar+i);
	
	dfs(1,0);
	dfs2(1,0);
	
	int res=0;
	
	for( map<int,int>::iterator it=dn[1].begin() ; it!=dn[1].end() ; it++ )
		res=max(res,it->se);
	
	printf("%d\n",res);
	return 0;
}