Pagini recente » Cod sursa (job #159733) | Cod sursa (job #420890) | Cod sursa (job #2015892) | Cod sursa (job #1129056) | Cod sursa (job #987366)
Cod sursa(job #987366)
#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";
}