Cod sursa(job #644817)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 7 decembrie 2011 18:21:43
Problema Mese Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;

#define NMAX 100005
#define pb push_back

int sol[NMAX],age[NMAX];
int vc[NMAX],tata[NMAX];
int q[NMAX],viz[NMAX],n;
int s;
vector<int> v[NMAX];

void dfs(int nod)
{
    int i,vec,lim=v[nod].size();
    viz[nod]=1;
    if(!lim)
    {
        sol[nod]=1;
        vc[nod]=age[nod];
        return ;
    }
    for(i=0;i<lim;i++)
        if(!viz[vec=v[nod][i]])
            dfs(vec);
    for(i=0;i<lim;i++)
    {
        vec=v[nod][i];
        q[i+1]=vc[vec];
        sol[nod]+=sol[vec];
    }
    sort(q+1,q+lim+1);
    int sum=age[nod];
    for(i=1;i<=lim;i++)
        if(sum+q[i]<=s)
            sum+=q[i];
        else
            break;
    sol[nod]-=(i-2);
    vc[nod]=sum;
}

int main ()
{
    int i,start;
    freopen("mese.in","r",stdin);
    freopen("mese.out","w",stdout);
    scanf("%d%d",&n,&s);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&tata[i],&age[i]);
        v[tata[i]].pb(i);
        if(!tata[i])
            start=i;
    }
    dfs(start);
    printf("%d\n",sol[start]);
    return 0;
}