Cod sursa(job #987368)

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

typedef vector<int>::iterator it;
typedef vector<pair<int,int> >::iterator itv;

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

#define MaxN 100100

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(it i=A[nod].begin();i<A[nod].end();i++)
        DF(*i);

    vector<pair<int,int> > Noduri;

    for(it i=A[nod].begin();i<A[nod].end();i++)
        Noduri.push_back(make_pair(Sum[*i],D[*i]));
    sort(Noduri.begin(),Noduri.end());

    for(itv i=Noduri.begin();i<Noduri.end();i++)
        D[nod] += i->second;

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

            return ;
        }
        else
            Sum[nod] += i->first;
}

int main()
{
    citire();
    DF(A[0][0]);
    
    g << D[A[0][0]] + (Sum[A[0][0]] > 0) << "\n";
}