Cod sursa(job #2157662)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 9 martie 2018 19:49:22
Problema Guvern Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;

int firstap[200010], lastap[200010];
int cnt;
vector <int> fii[200010];
set <pair <int, int>> s;
vector <int> sortop;
int dp[200010];
int v[200010];
vector <int> adia[200010];
int spec[400010];
vector <int> interv[400010];

void dfs(int nod, int tata)
{
    firstap[nod] = ++cnt;
    auto x = s.lower_bound({ v[nod], 0 });
    if (x != s.end())
        fii[x->second].push_back(nod);
    s.insert({ v[nod], nod });
    for (auto i : adia[nod])
        if (i != tata)
            dfs(i, nod);
    s.erase({ v[nod], nod });
    lastap[nod] = cnt;
    sortop.push_back(nod);
}

int solve(int nod)
{
    map <int, int> norm;
    for (auto i : fii[nod])
        norm[firstap[i]] = norm[lastap[i]] = 0;

    int cnt(1);
    for (auto & i : norm)
            i.second = cnt++;

    for (auto i : fii[nod])
        interv[norm[lastap[i]]].push_back(i);

    for (int i(1); i <= cnt; i++) {
        spec[i] = spec[i - 1];
        for (auto j : interv[i])
            spec[i] = max(spec[i], dp[j] + spec[norm[firstap[j]] - 1]);
        interv[i].clear();
    }
    return 1 + spec[cnt];
}

int main()
{
    freopen("guvern.in", "r", stdin);
    freopen("guvern.out", "w", stdout);

    int n, a, b;

    scanf("%d", &n);

    for (int i(1); i < n; i++) {
        scanf("%d%d", &a, &b);
        adia[a].push_back(b);
        adia[b].push_back(a);
    }

    for (int i(1); i <= n; i++)
        scanf("%d", v + i);

    dfs(1, 0);

    int best(0);

    for (auto i : sortop) {
        dp[i] = solve(i);
        best = max(dp[i], best);
    }

    cout << best << '\n';
    return 0;
}