Cod sursa(job #50420)

Utilizator varuvasiTofan Vasile varuvasi Data 7 aprilie 2007 17:58:01
Problema Mese Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <stdio.h>
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define MaxN 100001

int N, S, root, brk;
int Sn[MaxN], Sf[MaxN], varsta[MaxN], sel[MaxN];
int q[MaxN];

struct NOD {
    int vf;
    NOD* next;
};

typedef NOD* PNOD;
PNOD L[MaxN];

void quick(int lf, int rt)
{
    int i = lf - 1, j = rt + 1;
    if (lf >= rt) return;
    do
    {
		do { i++; } while (Sn[lf] < Sn[i]);
        do { j--; } while (Sn[lf] > Sn[j]);
        if (i < j)
        {
            int aux = Sn[i]; Sn[i] = Sn[j]; Sn[j] = aux;
        }
    } while (i < j);
    quick(lf, j);
    quick(j + 1, rt);
}

/*void df(int varf)
{
    sel[varf] = 1;
    
	int sum = varsta[varf], nrf = 0;
	int* Sn = new int[MaxN];
	
	Sn[++nrf] = sum;
	
    for (PNOD p = L[varf]; p; p=p->next)
        if (!sel[p->vf])
        {
            df(p->vf);
            sum += Sf[p->vf];
            Sn[++nrf] = Sf[p->vf];
        }
    
    quick(Sn, 1, nrf);
    
    int f = 1;
    while (sum > S) sum -= Sn[f], f++, brk++;
    
    Sf[varf] = sum;
    
    delete Sn;
}*/

void Add(int i, int j)
{
    PNOD p = new NOD;
    p->vf = j;
    p->next  =L[i];
    L[i] = p;
}

void process(int varf)
{
    int sum = varsta[varf], nrf = 0, f = 0;
    PNOD p = L[varf];
    
    Sn[++nrf] = sum;
    
    while (p) 
	{
		if (sel[p->vf]) continue;
        sel[p->vf] = 1;
		sum += Sf[p->vf];
		Sn[++nrf] = Sf[p->vf];
		p=p->next;
	}

	quick(1, nrf);
	f = 1;
	while (sum > S) sum -= Sn[f], f++, brk++;

	Sf[varf] = sum;
}

int main()
{
	int i, t, v;
    
    FILE *fin = fopen("mese.in", "rt");
    fscanf(fin, "%d %d", &N, &S);
	FOR(i, 1, N)
	{
		fscanf(fin, "%d %d", &t, &varsta[i]);
		if (t == 0) root = i;
		else
			Add(t, i);
	}
	fclose(fin);


	//bf
	int iq = 0, sq = 0;
	q[sq] = root;
	sel[root] = 1;
	while (iq <= sq)
	{
		PNOD p = L[q[iq]];
		while (p)
		{
			if (sel[p->vf]) continue;
			sel[p->vf] = 1;
			q[++sq] = p->vf;
			p=p->next;
		}
        iq++;
	}

	FOR(i, 1, N) sel[i] = 0;
    for (i = N-1; i >= 0; i--) process(q[i]); 
        
    //df(root);
    
    FILE *fout = fopen("mese.out", "wt");
    fprintf(fout, "%d", brk+1);
    fclose(fout);
    
    return 0;
}