Cod sursa(job #1165266)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 2 aprilie 2014 16:30:01
Problema Guvern Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;

#define NMAX 200005
#define pi pair<int,int>
#define x first
#define y second
#define mp make_pair
#define pb push_back

int grad[NMAX],viz[NMAX],sfarsit[NMAX],trecut[NMAX];
int nrp,nr,d[NMAX][2],sol,n,smax;

class cmp
{
public:
    bool operator()(const int& a, const int& b)
    {
        return grad[a] < grad[b];
    }
};

set<int,cmp> myset;
set<int,cmp> ::iterator it;
pi perechi[2 * NMAX];
vector<int> v[NMAX],go[NMAX];

inline int cmp2(const pi& a,const pi& b)
{
    if(a.x == b.x)
        viz[a.y] > viz[b.y];
    return a.x < b.x;
}

inline void dfs(int nod)
{
    it = myset.lower_bound(nod);
    if(it != myset.end())
    {
        int val = *it;
      //  printf("%d devine tatic la %d\n",val,nod);
        go[val].pb(nod);
    }
    viz[nod] = 1;

    myset.insert(nod);
    int i,vec,lim = v[nod].size();
    for(i = 0; i < lim; i++)
        if(!viz[vec = v[nod][i]])
            dfs(vec);
    myset.erase(nod);
}

inline void dfs2(int nod)
{
    //printf("Nodul %d\n",nod);
    int i,vec,lim = v[nod].size();
    pi p;

    viz[nod] = ++nr;
    for(i = 0; i < lim; i++)
        if(!viz[vec = v[nod][i]])
        {
            dfs2(vec);
            d[nod][0] += max(d[vec][0],d[vec][1]);
        }
    sfarsit[nod] = nr;

    lim = go[nod].size();
    nrp = 0;
    for(i = 0; i < lim; i++)
    {
        vec = go[nod][i];
        perechi[++nrp] = mp(viz[vec],vec);
        perechi[++nrp] = mp(sfarsit[vec],vec);
    }
    sort(perechi + 1,perechi + nrp + 1,cmp2);
    smax = 1;
    for(i = 1; i <= nrp; i++)
    {
        p = perechi[i];
        if(!trecut[p.y])
            trecut[p.y] = smax;
        else
            smax = max(smax,trecut[p.y] + 1);
    }
    d[nod][1] = smax;
}

int main ()
{
    int i,a,b;

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

    scanf("%d",&n);
    for(i = 1; i < n; i++)
    {
        scanf("%d%d",&a,&b);
        v[a].pb(b);
        v[b].pb(a);
    }
    for(i = 1; i <= n; i++)
        scanf("%d",&grad[i]);

    dfs(1);
    memset(viz,0,sizeof(viz));
    dfs2(1);

    sol = max(d[1][0],d[1][1]);
    printf("%d\n",sol);

    return 0;
}