Pagini recente » Cod sursa (job #2827378) | Cod sursa (job #51751) | Cod sursa (job #350557) | Cod sursa (job #2441919) | Cod sursa (job #1643323)
#include <bits/stdc++.h>
using namespace std;
#define FILE_IO
#define fs first
#define sc second
typedef pair <int, int> pii;
typedef pair <pii, int> piii;
const int buffer = 1 << 13;
int cnt = buffer - 1;
char buff[buffer + 5];
char gchar()
{
if(++cnt == buffer)
{
cnt = 0;
fread(buff, buffer, 1, stdin);
}
return buff[cnt];
}
int gint()
{
int sgn = 1;
char ch = gchar();
while(ch < '0' || '9' < ch)
{
ch = gchar();
if(ch == '-') sgn = -1;
}
int x = 0;
while('0' <= ch && ch <= '9')
{
x = x * 10 + ch - '0';
ch = gchar();
}
return x * sgn;
}
int n, I, ans;
int val[200005], ord[200005], need[200005];
int intrv[200005][2];
int dp[200005];
int indp[400005];
pii pr[400005];
vector <int> edg[200005];
vector <int> nxtdp[200005];
map <int, int> mp;
int aib[200005];
void U(int pos, int val)
{
for(int i = pos; i <= n; i += (i & (-i)))
aib[i] += val;
}
int Q(int pos)
{
int ans = 0;
for(int i = pos; i >= 1; i -= (i & (-i)))
ans += aib[i];
return ans;
}
int aibsearch(int val)
{
int pos = 0, sum = 0;
for(int bit = 18; bit >= 0; bit--)
if( pos + (1 << bit) <= n && sum + aib[pos + (1 << bit)] < val )
sum += aib[pos + (1 << bit)], pos += 1 << bit;
return pos + 1;
}
bool cmp(int a, int b)
{
return val[a] < val[b];
}
void DFS(int nod, int fth)
{
int needval = Q(val[nod]);
int needpos = aibsearch(needval + 1);
need[nod] = ord[ needpos ];
nxtdp[ need[nod] ].push_back(nod);
U(val[nod], 1);
intrv[nod][0] = ++I;
for(vector <int> :: iterator it = edg[nod].begin(); it != edg[nod].end(); it++)
{
int nxt = *it;
if(nxt == fth) continue;
DFS(nxt, nod);
}
U(val[nod], -1);
intrv[nod][1] = ++I;
}
void dpDFS(int nod, int fth)
{
for(vector <int> :: iterator it = edg[nod].begin(); it != edg[nod].end(); it++)
{
int nxt = *it;
if(nxt == fth) continue;
dpDFS(nxt, nod);
}
int k = 0;
int m = 0;
for(vector <int> :: iterator it = nxtdp[nod].begin(); it != nxtdp[nod].end(); it++)
{
int nxt = *it;
ord[++m] = intrv[nxt][0];
ord[++m] = intrv[nxt][1];
}
sort(ord + 1, ord + m + 1);
mp.clear();
for(int i = 1; i <= m; i++)
mp[ ord[i] ] = i;
memset(pr, 0, sizeof(pr));
for(vector <int> :: iterator it = nxtdp[nod].begin(); it != nxtdp[nod].end(); it++)
{
int nxt = *it;
int st = mp[ intrv[nxt][0] ];
int dr = mp[ intrv[nxt][1] ];
int val = dp[nxt];
pr[dr] = {st, val};
}
for(int i = 1; i <= m; i++)
indp[i] = max(indp[i - 1], indp[ pr[i].fs - 1 ] + pr[i].sc);
dp[nod] = 1 + indp[m];
}
int main()
{
#ifdef FILE_IO
freopen("guvern.in", "r", stdin);
freopen("guvern.out", "w", stdout);
#endif
n = gint();
for(int i = 1; i < n; i++)
{
int x = gint();
int y = gint();
edg[x].push_back(y);
edg[y].push_back(x);
}
for(int i = 1; i <= n; i++)
{
val[i] = gint();
ord[i] = i;
}
sort(ord + 1, ord + n + 1, cmp);
for(int i = 1; i <= n; i++)
val[ ord[i] ] = i;
DFS(1, 0);
edg[0].push_back(1);
dpDFS(0, 0);
printf("%d", dp[0] - 1);
return 0;
}