Cod sursa(job #64545)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 3 iunie 2007 22:24:47
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define NMAX 100010
#define node A[i][j]

using namespace std;

vector<int> A[NMAX], T;
int N, S, Sum[NMAX], rad, F[NMAX], NrCut, V[NMAX];

int read()
{
        int i, j, t;

        freopen("mese.in", "r", stdin);
        scanf("%d %d", &N, &S);

        for (i = 1; i <= N; i++)
        {
            scanf("%d %d", &t, &Sum[i]);
            V[i] = Sum[i];
            if (t>0) A[t].push_back(i);
            else rad = i;
        }
        F[rad] = 1;
}

void getsum(int i)
{
        int j, n = A[i].size();

        for (j = 0; j < n; j++)
            if (!F[ A[i][j] ])
            {
                F[ A[i][j] ] = 1;
                getsum(A[i][j]);
                Sum[i] += Sum[ A[i][j] ];
            }
}

void cut(int i)
{
        int j, n = A[i].size(), total;

        if (n == 0) return;

        for (j = 0; j < n; j++)
            if (!F[ A[i][j] ])
            {
                F[ A[i][j] ] = 1;
                cut(A[i][j]);
            }

        T.clear();
        for (j = total = 0; j < n; j++)
            total += Sum[ A[i][j] ], T.push_back(Sum[ A[i][j] ]);
        total += V[i];
        sort(T.begin(), T.end());

        while (total > S)
        {
                NrCut++;
                total -= T[--n];
        }

        Sum[i]= total;
}

void write()
{
        freopen("mese.out", "w", stdout);
        printf("%d\n", 1+NrCut);
}

int main()
{
        read();
        getsum(rad);
        memset(F,0,sizeof(F)); F[rad] = 1;
        cut(rad);
        write();
        return 0;
}