Cod sursa(job #988845)

Utilizator vendettaSalajan Razvan vendetta Data 23 august 2013 23:19:32
Problema Mese Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

ifstream f("mese.in");
ofstream g("mese.out");

#define nmax 100005
#define ll long long
#define pb push_back
#define sz size

int n, S, rad;
vector<int> gf[nmax];
int age[nmax], sum[nmax];
int Rez=1;

void citeste(){
    f >> n >> S;
    for(int i=1; i<=n; ++i){
        int x, y; f >> x >> y;
        if (x != 0) gf[x].pb(i);
        else rad = i;
        age[i] = y;
    }
}

void dfs(int nod){
    for(int i=0; i<(int)gf[nod].sz(); ++i){
        int vc = gf[nod][i];
        dfs(vc);
    }
    vector<int> v;
    for(int i=0; i<(int)gf[nod].sz(); ++i){
        v.pb( sum[ gf[nod][i] ] );
    }
    sort(v.begin(), v.end());
    sum[nod] = age[nod];
    int ii = 0;
    for(ii=0; ii<(int)v.sz(); ++ii){
        if (v[ii] + sum[nod] > S) break;
        sum[nod] += v[ii];
    } Rez += ( (int)v.sz() - ii );// astia au ramas =>le trebuie o masa
    //cout << nod << " " << sum[nod] << " " << ii << " " << v.sz() << "\n";
}

void rezolva(){
    // pornesc din frunze si cand ajung intr-un nod unesc fii cei mai mici
    dfs(rad);
    g << Rez << "\n";

}

int main(){
    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;
}