Cod sursa(job #97006)

Utilizator filipbFilip Cristian Buruiana filipb Data 4 noiembrie 2007 16:58:49
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define NMax 100005

int N, S, q[NMax], SUM[NMax], bst;
vector<int> G[NMax];

int cmp(const int& a, const int& b)
{ return SUM[a] < SUM[b]; }

int main(void)
{
    int i, fiu, ql, qr, sz, rad = -1, nod;
    
    freopen("mese.in", "r", stdin);
    freopen("mese.out", "w", stdout);

    scanf("%d %d", &N, &S);
    for (i = 1; i <= N; i++)
    {
        scanf("%d %d", &qr, &SUM[i]);
        if (qr)
            G[qr].push_back(i);
        else
            rad = i;
    }

    for (q[ql=qr=1]=rad; qr <= ql; qr++)
        for (sz = G[q[qr]].size(), i = 0; i < sz; i++)
            q[++ql] = G[q[qr]][i];

    for (i = N; i; i--)
    {
        nod = q[i];
        sz = G[nod].size();
        if (!sz) continue;

        sort(G[nod].begin(), G[nod].end(), cmp);
        for (qr = 0; qr < sz; qr++)
        {
            fiu = G[nod][qr];
            if (SUM[nod] + SUM[fiu] <= S)
                SUM[nod] += SUM[fiu];
            else
            {
                bst += sz-qr;
                break;
            }
        }

    }

    printf("%d\n", bst+1);

    return 0;
}