Cod sursa(job #53162)

Utilizator wefgefAndrei Grigorean wefgef Data 21 aprilie 2007 12:40:26
Problema Mese Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define sz size()
#define pb push_back
#define all(v) v.begin(), v.end()
#define x first
#define y second

#define Nmax 100005

int n, s, rad, rez;
int sum[Nmax];
pair< int, int > v[Nmax];
vector<int> vec[Nmax];
vector<int> aux;

void readdata()
{
	freopen("mese.in", "r", stdin);
	freopen("mese.out", "w", stdout);
	
	int i, v1, v2;
	
	scanf("%d %d", &n, &s);
	for (i = 1; i <= n; ++i)
	{
		scanf("%d %d", &v1, &sum[i]);;
		if (v1 == 0) rad = i;
		else vec[v1].pb(i);
	}
}

void df(int k)
{
	int i, cur;
	
	for (i = 0; i < vec[k].sz; ++i)
		df(vec[k][i]);
	aux.clear();
	for (i = 0; i < vec[k].sz; ++i)
	{
		v[k].y += v[ vec[k][i] ].y;
		aux.pb(v[ vec[k][i] ].x);
	}
	sort(all(aux));
	cur = sum[k];
	for (i = 0; i < aux.sz; ++i)
	{
		cur += aux[i];
		if (cur > s)
		{
			cur -= s;
			v[k].y += aux.sz-i;
			v[k].x = cur;
			return;
		}
	}
	v[k].x = cur;
}

int main()
{
	readdata();
	df(rad);
	printf("%d\n", v[rad].y+1);
	return 0;
}