Cod sursa(job #3173595)

Utilizator puica2018Puica Andrei puica2018 Data 23 noiembrie 2023 11:50:06
Problema Guvern Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("guvern.in");
ofstream fout("guvern.out");

int n;

vector <int> g[200005];

int a[200005];

set <pair <int,int>> s;

int b[200005];

stack <int> stk[200005];

vector <int> h[200005];

vector <int> hh[200005];

int dp1[200005];
int dp2[200005];

void dfs2(int u)
{
    dp2[u]=0;
    for(int v:h[u])
    {
        dfs2(v);
        dp2[u]+=max(dp2[v],dp1[v]);
    }
}

void dfs1(int u,int pp)
{
    auto it=s.lower_bound(make_pair(a[u],u));
    if(it!=s.end())
        b[u]=it->second;

    if(u>=1)
    {
        if(!stk[b[u]].empty())
            h[stk[b[u]].top()].push_back(u);
        else
            hh[b[u]].push_back(u);
    }

    if(u>=1)
    {
        stk[b[u]].push(u);
        s.insert(make_pair(a[u],u));
    }

    for(int v:g[u])
        if(v!=pp)
            dfs1(v,u);

    if(u>=1)
    {
        stk[b[u]].pop();
        s.erase(make_pair(a[u],u));
    }

    dfs2(u);

    dp1[u]=1;
    for(auto it:hh[u])
        dp1[u]+=max(dp2[it],dp1[it]);
}

int main()
{
    fin>>n;
    g[0].push_back(1);
    for(int i=1; i<n; i++)
    {
        int x,y;
        fin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1; i<=n; i++)
        fin>>a[i];

    dfs1(0,0);

    fout<<dp1[0]-1<<"\n";
    return 0;
}