Pagini recente » Cod sursa (job #89982) | Cod sursa (job #1072001) | Cod sursa (job #570596) | Cod sursa (job #996325) | Cod sursa (job #3334720)
#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
{
if(dr==x.dr)
return st<x.st;
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(vector <elem> &c)
{
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)
{
vector <elem> c;
for(int i : v[nod]) if(i!=p)
dfs(i,nod);
c.push_back({0,0,0});
for(int i : u[nod])
c.push_back({st[i],dr[i],dp[i]});
dp[nod]=solve(c)+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);
vector <elem> c;
for(int i : u[0])
c.push_back({st[i],dr[i],dp[i]});
fout<<max(rez,solve(c));
return 0;
}