Cod sursa(job #2157642)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 9 martie 2018 19:32:36
Problema Guvern Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 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];

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(vector <int> & v)
{
    map <int, int> norm;
    for (auto i : v)
        norm[firstap[i]] = norm[lastap[i]] = 0;

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

    vector <vector <int>> interv(cnt + 1);
    for (auto i : v)
        interv[norm[lastap[i]]].push_back(i);

    vector <int> spec(cnt + 1);

    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]);
    }
    return 1 + spec[cnt];
}

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

    int n, a, b;

    cin >> n;

    for (int i(1); i < n; i++) {
        cin >> a >> b;
        adia[a].push_back(b);
        adia[b].push_back(a);
    }

    for (int i(1); i <= n; i++)
        cin >> v[i];

    dfs(1, 0);

    int best(0);

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

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