Cod sursa(job #940457)

Utilizator rudarelLup Ionut rudarel Data 16 aprilie 2013 11:37:30
Problema Mese Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <vector>
#include <algorithm>
 
using namespace std;
 
#define sz size()
#define pb push_back
#define all(v) v.begin(), v.end()
#define x first
#define y second
 
#define Nmax 100005
 
int n, s, rad, rez;
int sum[Nmax];
pair< int, int > v[Nmax];
vector<int> vec[Nmax];
vector<int> aux;
 
void readdata()
{
    freopen("mese.in", "r", stdin);
    freopen("mese.out", "w", stdout);
     
    int i, v1, v2;
     
    scanf("%d %d", &n, &s);
    for (i = 1; i <= n; ++i)
    {
        scanf("%d %d", &v1, &sum[i]);;
        if (v1 == 0) rad = i;
        else vec[v1].pb(i);
    }
}
 
void df(int k)
{
    int i, cur;
     
    for (i = 0; i < vec[k].sz; ++i)
        df(vec[k][i]);
    aux.clear();
    for (i = 0; i < vec[k].sz; ++i)
    {
        v[k].y += v[ vec[k][i] ].y;
        aux.pb(v[ vec[k][i] ].x);
    }
    sort(all(aux));
    cur = sum[k];
    for (i = 0; i < aux.sz; ++i)
    {
        cur += aux[i];
        if (cur > s)
        {
            cur -= aux[i];
            v[k].y += aux.sz-i;
            v[k].x = cur;
            return;
        }
    }
    v[k].x = cur;
}
 
int main()
{
    readdata();
    df(rad);
    printf("%d\n", v[rad].y+1);
    return 0;
}