Pagini recente » Cod sursa (job #946797) | Cod sursa (job #866567) | Cod sursa (job #3272796) | Cod sursa (job #789649) | Cod sursa (job #2157662)
#include <bits/stdc++.h>
using namespace std;
int firstap[200010], lastap[200010];
int cnt;
vector <int> fii[200010];
set <pair <int, int>> s;
vector <int> sortop;
int dp[200010];
int v[200010];
vector <int> adia[200010];
int spec[400010];
vector <int> interv[400010];
void dfs(int nod, int tata)
{
firstap[nod] = ++cnt;
auto x = s.lower_bound({ v[nod], 0 });
if (x != s.end())
fii[x->second].push_back(nod);
s.insert({ v[nod], nod });
for (auto i : adia[nod])
if (i != tata)
dfs(i, nod);
s.erase({ v[nod], nod });
lastap[nod] = cnt;
sortop.push_back(nod);
}
int solve(int nod)
{
map <int, int> norm;
for (auto i : fii[nod])
norm[firstap[i]] = norm[lastap[i]] = 0;
int cnt(1);
for (auto & i : norm)
i.second = cnt++;
for (auto i : fii[nod])
interv[norm[lastap[i]]].push_back(i);
for (int i(1); i <= cnt; i++) {
spec[i] = spec[i - 1];
for (auto j : interv[i])
spec[i] = max(spec[i], dp[j] + spec[norm[firstap[j]] - 1]);
interv[i].clear();
}
return 1 + spec[cnt];
}
int main()
{
freopen("guvern.in", "r", stdin);
freopen("guvern.out", "w", stdout);
int n, a, b;
scanf("%d", &n);
for (int i(1); i < n; i++) {
scanf("%d%d", &a, &b);
adia[a].push_back(b);
adia[b].push_back(a);
}
for (int i(1); i <= n; i++)
scanf("%d", v + i);
dfs(1, 0);
int best(0);
for (auto i : sortop) {
dp[i] = solve(i);
best = max(dp[i], best);
}
cout << best << '\n';
return 0;
}