Cod sursa(job #2247068)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 27 septembrie 2018 21:00:10
Problema Guvern Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = (int) 2e5;

vector <int> g[MAXN + 1];
int vals[MAXN + 1];

vector <int> nodes[MAXN + 1];

struct Data {
    int nod;
    bool operator <(const Data &other) const {
        return vals[nod] < vals[other.nod];
    }
};

set <Data> mst;

pair <int, int> id[MAXN + 1];
int cnt;

void dfs(int nod, int par) {
    id[nod].first = ++cnt;
    auto it = mst.upper_bound({nod});
    if(it != mst.end()) {
        nodes[it -> nod].push_back(nod);
    }
    mst.insert({nod});
    for(auto it : g[nod]) {
        if(it != par) {
            dfs(it, nod);
        }
    }
    mst.erase(mst.find({nod}));
    id[nod].second = cnt;
}

bool cmp(int a, int b) {
    if(id[a].first == id[b].first)
        return id[a].second > id[b].second;
    return id[a].first < id[b].first;
}

int dp[MAXN + 1];

void dfs1(int nod, int par) {
    for(auto it : g[nod]) {
        if(it != par) {
            dfs1(it, nod);
        }
    }
    sort(nodes[nod].begin(), nodes[nod].end(), cmp);
    int r = 0;
    dp[nod] = 1;
    for(auto it : nodes[nod]) {
        if(r < id[it].second) {
            dp[nod] += dp[it];
        }
        r = max(r, id[it].second);
    }
}

int main() {
    FILE *fi, *fout;
    int i, n;
    fi = fopen("guvern.in" ,"r");
    fout = fopen("guvern.out" ,"w");
    fscanf(fi,"%d " ,&n);
    for(i = 1; i < n; i++) {
        int x, y;
        fscanf(fi,"%d %d " ,&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(i = 1; i <= n; i++) {
        fscanf(fi,"%d " ,&vals[i]);
    }
    dfs(1, 0);
    dfs1(1, 0);
    int ans = 0;
    for(i = 1; i <= n; i++) {
        ans = max(ans, dp[i]);
    }
    fprintf(fout,"%d" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}