Pagini recente » Cod sursa (job #1868142) | Cod sursa (job #2263517) | Cod sursa (job #1137172) | Cod sursa (job #1977208) | Cod sursa (job #2157642)
#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];
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(vector <int> & v)
{
map <int, int> norm;
for (auto i : v)
norm[firstap[i]] = norm[lastap[i]] = 0;
int cnt(1);
for (auto & i : norm)
i.second = cnt++;
vector <vector <int>> interv(cnt + 1);
for (auto i : v)
interv[norm[lastap[i]]].push_back(i);
vector <int> spec(cnt + 1);
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]);
}
return 1 + spec[cnt];
}
int main()
{
freopen("guvern.in", "r", stdin);
freopen("guvern.out", "w", stdout);
int n, a, b;
cin >> n;
for (int i(1); i < n; i++) {
cin >> a >> b;
adia[a].push_back(b);
adia[b].push_back(a);
}
for (int i(1); i <= n; i++)
cin >> v[i];
dfs(1, 0);
int best(0);
for (auto i : sortop) {
dp[i] = solve(fii[i]);
best = max(dp[i], best);
}
cout << best << '\n';
return 0;
}