Cod sursa(job #103793)

Utilizator ScrazyRobert Szasz Scrazy Data 15 noiembrie 2007 17:14:21
Problema Mese Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMAX 100002
using namespace std;

typedef struct _nod{long n; long v; long t;} nod;
long *A[NMAX]; 
nod V[NMAX]; 
long q[NMAX];
long n, rad;
int s;
int ss[NMAX];
long sol;

inline int cmp(int a, int b)
{
    return a>b;
}


void solve(long r)
{
    long i;

    if (V[r].v>s)
    {
	memset(ss,0,sizeof(ss));

	for (i=1; i<=A[r][0]; ++i) 
	    ss[i]=V[A[r][i]].v;
	    
	
	sort(ss+1,ss+A[r][0],cmp); 
	for (i=1; i<=A[r][0] && V[r].v>s; ++i)
	{
	    V[r].v-=ss[i];
	    ++sol;
	}

    } 

    V[V[r].t].v+=V[r].v;
} 

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

    long i, j;
    long x, y;

    scanf("%ld %d", &n, &s);
    for (i=1; i<=n; ++i)
    {
	A[i]=(long *)realloc(A[i], sizeof(long));
	A[i][0]=0;
    }

    for (i=1; i<=n; ++i)
    {
	scanf("%ld %ld", &x, &y);
	if (x==0) {rad=i;V[i].v=y;}
	else
	{ 
	    V[i].n=i;
	    V[i].v=y; 
	    V[i].t=x; 
	    ++A[x][0]; 
	    A[x]=(long *)realloc(A[x], (A[x][0]+1)*sizeof(long));
	    A[x][A[x][0]]=i;
	}
    }	

    long lo, hi;
    lo=hi=1;
    q[lo]=rad; 

    while (lo<=hi)
    {

	for (i=1; i<=A[q[lo]][0]; ++i)
	    q[++hi]=A[q[lo]][i];
	
	++lo;
    }

    for (i=n; i>=1; --i) solve(q[i]);

    printf("%ld", sol+1);

    fclose(stdin);
    fclose(stdout);

    return 0;
}