Cod sursa(job #2369837)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 6 martie 2019 09:26:58
Problema Guvern Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>

using namespace std;

int n,x,y;
int c[200005];
vector <int> g[200005];
vector <int> sir, aux;
bitset<200005> viz;
int rez = 0;

int cautBin(int val){
    int st=1, dr=aux.size()-1;
    while(st<=dr){
        if(st==dr)
            return st;
        int mij = (st+dr)/2;
        if(val<aux[mij])
            st = mij+1;
        else
            dr = mij;
    }
    return -1;
}

void scmax(){
    aux.clear();
    aux.push_back(1e9+5);
    for(int i : sir){
        if(c[i]<aux.back())
            aux.push_back(c[i]);
        else{
            int poz = cautBin(c[i]);
            aux[poz] = c[i];
        }
    }
    //int s = aux.size()-1;
    rez = max(rez, (int)aux.size()-1);
}

void dfs(int nod){
    viz[nod]=1;
    sir.push_back(nod);
    for(int i:g[nod])
        if(!viz[i])
            dfs(i);
    if(nod!=1 && g[nod].size()==1)
        scmax(), sir.pop_back();
}

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

    scanf("%d",&n);
    for(int i=1;i<n;++i){
        scanf("%d%d", &x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1;i<=n;++i)
        scanf("%d", &c[i]);

    dfs(1);
    cout<<rez;

    return 0;
}