Cod sursa(job #1742174)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 15 august 2016 21:10:19
Problema Guvern Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<cstdio>
#include<set>
#include<algorithm>
#include<vector>
using namespace std;
const int nmax=200000;
set<pair<int,int> > par;
set<pair<int,int> > :: iterator it;
vector<int> lista[nmax+5],ve[nmax+5];
int obl[nmax+5],lv[nmax+5],val[nmax+5],eu[nmax*2+5],fir[nmax+5],las[nmax+5],pos[nmax+5],di[nmax+5],leu;
struct punct
{
    int x,p,di;
    bool tip;
}axa[nmax+5];
void dfs(int x)
{
    leu++;
    fir[x]=leu;
    int i;
    pair<int,int> cur=make_pair(val[x],x);
    it=par.lower_bound(cur);
    if(it==par.end())
        obl[x]=0;
    else
        obl[x]=(*it).second;
    lista[obl[x]].push_back(x);
    par.insert(cur);
    for(i=ve[x].size()-1;i>=0;i--)
        if(lv[ve[x][i]]==0)
    {
        lv[ve[x][i]]=lv[x]+1;
        dfs(ve[x][i]);
    }
    par.erase(cur);
    leu++;
    las[x]=leu;
}
bool cmp(punct a1,punct a2)
{
    return a1.x<a2.x;
}
void calc(int x)
{
    int i,lu=0;
     for(i=lista[x].size()-1;i>=0;i--)
    {
        lu++;
        axa[lu].p=lista[x][i];
        axa[lu].x=fir[lista[x][i]];
        axa[lu].tip=0;
        lu++;
        axa[lu].p=lista[x][i];
        axa[lu].x=las[lista[x][i]];
        axa[lu].tip=1;
    }
    sort(axa+1,axa+lu+1,cmp);
    for(i=1;i<=lu;i++)
    {
        if(pos[axa[i].p]==0)
        pos[axa[i].p]=i;
        if(axa[i].tip==1)
        axa[i].di=max(axa[i-1].di,axa[pos[axa[i].p]].di+di[axa[i].p]);
        else
            axa[i].di=axa[i-1].di;
    }
    di[x]=axa[lu].di+1;
}
void solv(int x)
{//printf("%d ",x);
    int i;
     for(i=ve[x].size()-1;i>=0;i--)
        if(lv[ve[x][i]]==lv[x]+1)
    {
        lv[ve[x][i]]=lv[x]+1;
        solv(ve[x][i]);
    }
calc(x);
}
int main()
{
    freopen("guvern.in","r",stdin);
    freopen("guvern.out","w",stdout);
    int n,ans=0,i,j,x,y;
    scanf("%d",&n);
    for(i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        ve[x].push_back(y);
        ve[y].push_back(x);
    }
    for(i=1;i<=n;i++)
        scanf("%d",&val[i]);
    lv[1]=1;
    dfs(1);
    solv(1);
    calc(0);
    di[0]--;
    for(i=0;i<=n;i++)
       ans=max(ans,di[i]);
printf("%d\n",ans);
    return 0;
}