Pagini recente » Cod sursa (job #2076753) | Cod sursa (job #3157482) | Cod sursa (job #2087071) | Cod sursa (job #151891) | Cod sursa (job #956938)
Cod sursa(job #956938)
#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=100010;
int N,cnt,res;
int ar[MAXN];
int id[MAXN];
int go[MAXN];
int pl[MAXN];
int en[MAXN];
int pre[MAXN];
int lazy[MAXN*4];
ii as[MAXN];
set<ii> s;
map<int,int> dn[MAXN];
vector<int> way[MAXN];
void dfs( int nd ){
s.insert(ii(ar[nd],nd));
set<ii>::iterator it=s.lower_bound(ii(ar[nd]+1,0));
id[nd]=++cnt;
if( it!=s.end() )
go[nd]=it->se;
for( vector<int>::iterator it2=way[nd].begin() ; it2!=way[nd].end() ; it2++ )
if( *it2!=pre[nd] ){
pre[*it2]=nd;
dfs(*it2);
}
it=s.find(ii(ar[nd],nd));
s.erase(it);
en[nd]=cnt;
}
void dfs2( int nd ){
for( vector<int>::iterator it=way[nd].begin() ; it!=way[nd].end() ; it++ )
if( *it!=pre[nd] ){
dfs2(*it);
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);
as[i]=ii(ar[i],i);
}
dfs(1);
dfs2(1);
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;
}