Cod sursa(job #956945)

Utilizator sbasrikSemih Basrik sbasrik Data 4 iunie 2013 10:02:24
Problema Guvern Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<list>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<climits>
#include<ctime>
#include<sstream>
#define mp       	make_pair
#define pb       	push_back
#define st       	first
#define nd       	second
#define wait     	getchar();getchar();
#define lint     	long long
#define KARE(a)	 	( (a)*(a) )
#define MAX(a,b) 	( (a)>(b) ? (a) : (b) )
#define MIN(a,b) 	( (a)<(b) ? (a) : (b) )
#define MAX3(a,b,c)	( MAX( a,MAX(b,c) ) )
#define MIN3(a,b,c)	( MIN( a,MIN(b,c) ) )
#define FILL(ar,a)	memset( ar,a,sizeof ar )
#define oo	 		1e9
#define pii       	pair<int,int>
#define pll			pair<lint,lint>
#define pdd			pair<double,double>
#define y1			yy1
#define eps      	(1e-9)
#define esit(a,b)  	( abs( (a)-(b) ) < eps )
#define sol(a)		( (a)<<1 )
#define sag(a)		( sol(a)|1 )
#define orta(a,b)	( ( (a)+(b) )>>1 )
#define mxn       	200005
using namespace std;

vector<int>adj[mxn],ch[mxn];
set< pii >s;
set< pii >::iterator it;

int n,d[mxn];
int sta[mxn],fin[mxn],no;
int dp[mxn];
int snod[mxn],ssol[mxn],top;
int ans;

void read(){
	freopen( "guvern.in" , "r" , stdin );
	freopen( "guvern.out" , "w" , stdout );

	int a,b,i;

	scanf( "%d", &n );

	for( i=1 ; i<n ; i++ ){
		scanf( "%d %d" , &a , &b );
		adj[a].pb( b );
		adj[b].pb( a );
	}

	for( i=1 ; i<=n ; i++ )		scanf( "%d" , d+i );

	return;
}

void find( int nod ){

	int i,b,c;

	for( i=0 ; i<ch[nod].size() ; i++ ){

		b = ch[nod][i];
		c = 0;

		while( top>0 && sta[b]<=sta[ snod[top] ] && fin[b]>=fin[ snod[top] ] )		c += ssol[top--];

		top++;
		snod[top] = b;
		ssol[top] = MAX( c,dp[b] );

	}

	dp[nod] = 1;
	while( top>0 )	dp[nod] += ssol[top--];

	return;

}

void tree( int nod,int par ){

	int i,p;

	sta[nod] = ++no;
	s.insert( mp( d[nod],nod ) );

	for( i=0 ; i<adj[nod].size() ; i++ )
	if( adj[nod][i]!=par )	tree( adj[nod][i],nod );

	s.erase( mp( d[nod],nod ) );
	fin[nod] = no;

	it = s.upper_bound( mp( d[nod],0 ) );
	if( it != s.end() )		ch[it->nd].pb( nod );

	find( nod );

	return;

}

void solve(){

	read();

	d[0] = 2e9;
	adj[0].pb( 1 );
	tree( 0,0 );

	dp[0]--;

	for( int i=0 ; i<=n ; i++ )		ans = MAX( ans,dp[i] );

	printf( "%d\n" , ans );

	return;
}

int main(){
	solve();
	return 0;
}