Cod sursa(job #325249)

Utilizator FlorianFlorian Marcu Florian Data 19 iunie 2009 18:14:00
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
using namespace std;
#include<cstdio>
#include<vector>
#include<algorithm>
#define MAX_N 100002
vector<int>G[MAX_N];
int S;
int Sum[MAX_N]; // suma din subarborele lui i
short int A[MAX_N]; // varsta lui i
int table[MAX_N]; // in cate mese am partitionat subarborele lui i
int R,N;
inline bool cmp(int a, int b)
{
	return Sum[a] > Sum[b];
}
void DFS(int x)
{
	if(Sum[x]) return;
	unsigned i; int y;
	Sum[x] = A[x];
	for(i=0;i<G[x].size();++i)
	{
		y = G[x][i];
		DFS(y);
		Sum[x] += Sum[y];		
		table[x] += table[y];
	}
	if(G[x].empty()) return;
	sort(G[x].begin(),G[x].end(),cmp);
	i = 0;
	while(Sum[x] > S && i<G[x].size() )
	{
		++table[x];
		Sum[x] -= Sum[G[x][i]];
		++i;
	}
}
int main()
{
	freopen("mese.in","r",stdin);
	freopen("mese.out","w",stdout);
	scanf("%d%d",&N,&S);
	int x,i;
	for(i=1;i<=N;++i)
	{
		scanf("%d%hd",&x,&A[i]);
		if(x) G[x].push_back(i);
		else R = i;
	}
	DFS(R);
	printf("%d\n",table[R] + 1);
	return 0;
}