Cod sursa(job #987366)

Utilizator maritimCristian Lambru maritim Data 20 august 2013 15:27:55
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

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

#define MaxN 100100
#define nextNod (A[nod][i])

int N,S;
vector<int> A[MaxN];
int D[MaxN];
int Sum[MaxN];

void citire(void)
{
    int t,a;

    f >> N >> S;
    for(int i=1;i<=N;i++)
    {
        f >> t >> a;
        A[t].push_back(i);
        Sum[i] = a;
    }
}

inline void DF(int nod)
{
    for(int i=0;i<A[nod].size();i++)
        DF(nextNod);

    vector<pair<int,int> > Noduri;

    for(int i=0;i<A[nod].size();i++)
        Noduri.push_back(make_pair(Sum[nextNod],D[nextNod]));
    sort(Noduri.begin(),Noduri.end());

    //cout << nod << "\n";
    //for(int i=0;i<Noduri.size();i++)
    //    cout << Noduri[i].first << " " << Noduri[i].second << " : ";
    //cout << "\n";

    for(int i=0;i<Noduri.size();i++)
        D[nod] += Noduri[i].second;

    for(int i=0;i<Noduri.size();i++)
        if(Sum[nod] + Noduri[i].first > S)
        {
            D[nod] += Noduri.size() - i;

            return ;
        }
        else
            Sum[nod] += Noduri[i].first;
}

int main()
{
    citire();
    DF(A[0][0]);
    
    //for(int i=1;i<=N;i++)
    //    cout << D[i] << " " << Sum[i] << "\n";

    g << D[A[0][0]] + (Sum[A[0][0]] > 0) << "\n";
}