Pagini recente » Cod sursa (job #649651) | Cod sursa (job #796035) | Cod sursa (job #589551) | Cod sursa (job #767813) | Cod sursa (job #2607156)
#include <cstdio>
#include <set>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 1000000005;
struct Nod
{
int cost,lvl;
};
struct Cmp
{
bool operator()(const Nod &a, const Nod &b)
{
if(a.cost==b.cost)
return a.lvl>b.lvl;
return a.cost<b.cost;
}
};
set<Nod, Cmp> s;
vector<int> g[200005];
int costuri[200005];
int salt[200005];
bool viz[200005];
int level[200005];
int ans[200005];
int maxx[200005];
set<Nod,Cmp>::iterator it;
void dfs(int nod, int lvl)
{
viz[nod]=1;
level[lvl]=nod;
it=s.lower_bound({costuri[nod], INF});
if(it!=s.end())
salt[nod]=level[it->lvl];
else
salt[nod]=0;
s.insert({costuri[nod], lvl});
int maxxx=0;
for(int i=0; i<g[nod].size(); i++)
if(viz[g[nod][i]]==0){
dfs(g[nod][i], lvl+1);
maxxx+=maxx[salt[nod]];
if(g[nod].size()>2)
memset(maxx, 0, sizeof(maxx));
}
ans[nod]++;
ans[salt[nod]]=max(ans[salt[nod]], ans[salt[nod]]-maxxx+ans[nod]);
if(ans[nod]>maxxx)
maxx[salt[nod]]=max(maxx[salt[nod]], ans[nod]);
s.erase({costuri[nod], lvl});
}
int main()
{ freopen("guvern.in", "r", stdin);
freopen("guvern.out", "w", stdout);
int n,i,x,y,sol=0;
scanf("%d", &n);
for(i=1; i<n; i++){
scanf("%d%d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
}
for(i=1; i<=n; i++)
scanf("%d", &costuri[i]);
dfs(1, 0);
for(i=1; i<=n; i++)
sol=max(sol, ans[i]);
printf("%d\n", sol);
return 0;
}