Cod sursa(job #45875)

Utilizator dominoMircea Pasoi domino Data 1 aprilie 2007 23:56:21
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX_N 100005
#define FIN "mese.in"
#define FOUT "mese.out"
#define f first
#define s second
#define pb push_back
#define mp make_pair

int N, S; 
pair<short, int> bst[MAX_N];
vector<int> G[MAX_N];

void DFS(int n)
{
    vector<int>::iterator it;

    for (it = G[n].begin(); it != G[n].end(); it++)
    {
        DFS(*it);
        bst[n].s += bst[*it].s;
        *it = bst[*it].f;
    }
    sort(G[n].begin(), G[n].end());
    for (it = G[n].begin(); it != G[n].end(); it++)
    {
        if ((int)bst[n].f+*it > S) break;
        bst[n].f += *it; bst[n].s--;
    }
}

int main(void)
{
    int i, c, up, root = 0;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d", &N, &S);
    for (i = 1; i <= N; i++)
    {
        scanf("%d %d", &up, &c);
        G[up].pb(i);
        bst[i] = mp(c, 1);
        if (!up) root = i;
    }

    DFS(root);
    printf("%d\n", bst[root].s);

    return 0;
}