Pagini recente » Cod sursa (job #70174) | Cod sursa (job #1850208) | Cod sursa (job #1936086) | Cod sursa (job #1141920) | Cod sursa (job #1742174)
#include<cstdio>
#include<set>
#include<algorithm>
#include<vector>
using namespace std;
const int nmax=200000;
set<pair<int,int> > par;
set<pair<int,int> > :: iterator it;
vector<int> lista[nmax+5],ve[nmax+5];
int obl[nmax+5],lv[nmax+5],val[nmax+5],eu[nmax*2+5],fir[nmax+5],las[nmax+5],pos[nmax+5],di[nmax+5],leu;
struct punct
{
int x,p,di;
bool tip;
}axa[nmax+5];
void dfs(int x)
{
leu++;
fir[x]=leu;
int i;
pair<int,int> cur=make_pair(val[x],x);
it=par.lower_bound(cur);
if(it==par.end())
obl[x]=0;
else
obl[x]=(*it).second;
lista[obl[x]].push_back(x);
par.insert(cur);
for(i=ve[x].size()-1;i>=0;i--)
if(lv[ve[x][i]]==0)
{
lv[ve[x][i]]=lv[x]+1;
dfs(ve[x][i]);
}
par.erase(cur);
leu++;
las[x]=leu;
}
bool cmp(punct a1,punct a2)
{
return a1.x<a2.x;
}
void calc(int x)
{
int i,lu=0;
for(i=lista[x].size()-1;i>=0;i--)
{
lu++;
axa[lu].p=lista[x][i];
axa[lu].x=fir[lista[x][i]];
axa[lu].tip=0;
lu++;
axa[lu].p=lista[x][i];
axa[lu].x=las[lista[x][i]];
axa[lu].tip=1;
}
sort(axa+1,axa+lu+1,cmp);
for(i=1;i<=lu;i++)
{
if(pos[axa[i].p]==0)
pos[axa[i].p]=i;
if(axa[i].tip==1)
axa[i].di=max(axa[i-1].di,axa[pos[axa[i].p]].di+di[axa[i].p]);
else
axa[i].di=axa[i-1].di;
}
di[x]=axa[lu].di+1;
}
void solv(int x)
{//printf("%d ",x);
int i;
for(i=ve[x].size()-1;i>=0;i--)
if(lv[ve[x][i]]==lv[x]+1)
{
lv[ve[x][i]]=lv[x]+1;
solv(ve[x][i]);
}
calc(x);
}
int main()
{
freopen("guvern.in","r",stdin);
freopen("guvern.out","w",stdout);
int n,ans=0,i,j,x,y;
scanf("%d",&n);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
ve[x].push_back(y);
ve[y].push_back(x);
}
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
lv[1]=1;
dfs(1);
solv(1);
calc(0);
di[0]--;
for(i=0;i<=n;i++)
ans=max(ans,di[i]);
printf("%d\n",ans);
return 0;
}