Pagini recente » Cod sursa (job #1689084) | Cod sursa (job #229769) | Cod sursa (job #65586) | Cod sursa (job #1673136) | Cod sursa (job #3334722)
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#include <set>
#define int long long
using namespace std;
ifstream fcin("guvern.in");
ofstream fout("guvern.out");
int n,x,y,val[200005],dp[200005],rez;
vector <int> v[200005],u[200005];
set < pair <int,int> > s;
int st[200005],dr[200005],nr;
inline void tour(int nod, int p)
{
st[nod]=++nr;
auto it=s.lower_bound({val[nod],0});
u[(it!=s.end() ? it->second : 0)].emplace_back(nod);
s.insert({val[nod],nod});
for(int i : v[nod]) if(i!=p)
tour(i,nod);
s.erase({val[nod],nod});
dr[nod]=nr;
}
struct elem
{
int st,dr,x;
bool operator<(const elem &x) const
{
return dr<x.dr;
}
};
inline int cb(int x, int sz, vector <elem> &c)
{
int sol=0;
for(int i=(1<<20); i>0; i>>=1)
if((sol|i)<sz && c[sol|i].dr<x) sol|=i;
return sol;
}
inline int solve(int nod)
{
vector <elem> c;
c.push_back({0,0,0});
for(int i : u[nod])
c.push_back({st[i],dr[i],dp[i]});
if(c.empty()) return 0;
sort(c.begin(), c.end());
vector <int> dp(c.size()+3, 0);
for(int i=1; i<c.size(); i++)
dp[i]=max(dp[i-1],dp[cb(c[i].st,i,c)]+c[i].x);
return dp[c.size()-1];
}
inline void dfs(int nod, int p)
{
for(int i : v[nod]) if(i!=p)
dfs(i,nod);
dp[nod]=solve(nod)+1;
rez=max(rez,dp[nod]);
}
signed main()
{
fcin>>n;
for(int i=1; i<n; i++)
{
fcin>>x>>y;
v[x].emplace_back(y);
v[y].emplace_back(x);
}
for(int i=1; i<=n; i++)
fcin>>val[i];
tour(1,0);
dfs(1,0);
fout<<max(rez,solve(0));
return 0;
}