Pagini recente » Cod sursa (job #1421987) | Cod sursa (job #3361870) | Monitorul de evaluare | Cod sursa (job #3363270) | Cod sursa (job #3364562)
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=200'005;
constexpr ll MOD=1'000'000'007;
int N;
int v[NMAX];
std::vector<int> G[NMAX];
int nxt[NMAX];
int dp[NMAX];
void dfs0(int node, std::set<std::pair<int, int> >& S, int tt=-1)
{
nxt[node]=-1;
auto it=S.lower_bound({v[node], -1});
if(it!=S.end())
nxt[node]=it->second;
S.insert({v[node], node});
for(int i=0;i<sz(G[node]);++i)
{
if(G[node][i]==tt)
{
G[node][i]=G[node].back();
G[node].pop_back();
--i;
}
else
dfs0(G[node][i], S, node);
}
S.erase({v[node], node});
}
void dfs1(int node, std::map<int, int>& M)
{
int t=0;
for(int x : G[node])
{
std::map<int, int> m;
dfs1(x, m);
t+=dp[x];
if(sz(m)>sz(M))
std::swap(m, M);
for(std::pair<int, int> p : m)
M[p.first]+=p.second;
}
int x=1;
if(M.count(node))
{
x+=M[node];
M.erase(node);
}
if(nxt[node]==-1)
dp[node]=x;
else
M[nxt[node]]=std::max(M[nxt[node]], x);
if(dp[node]<t)
dp[node]=t;
}
int main()
{
FILE* f=fopen("guvern.in", "r"), *g=fopen("guvern.out", "w");
int i, a, b;
fscanf(f, "%d", &N);
for(i=1;i<N;++i)
{
fscanf(f, "%d%d", &a, &b);
--a;
--b;
G[a].push_back(b);
G[b].push_back(a);
}
for(i=0;i<N;++i)
fscanf(f, "%d", v+i);
std::set<std::pair<int, int> > S;
dfs0(0, S);
std::map<int, int> M;
dfs1(0, M);
fprintf(g, "%d\n", dp[0]);
fclose(f);
fclose(g);
return 0;
}