Cod sursa(job #271637)

Utilizator CezarMocanCezar Mocan CezarMocan Data 5 martie 2009 18:33:11
Problema Mese Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define maxn 100100

using namespace std;

int n, i, j, sol, s, a, b, rad;
vector <int> v[maxn];
int c[maxn], sum[maxn];

bool cmp(int a, int b) {
	if (a > b)
		return true;
	return false;
}

void df(int nod) {
	int i, fiu;
	vector <int> p;
	p.clear();
	
	sum[nod] = c[nod];
	for (i = 0; i < v[nod].size(); i++) {
		fiu = v[nod][i];
		df(fiu);
		sum[nod] += sum[fiu];
		p.push_back(sum[fiu]);
	}
	sort(p.begin(), p.end(), cmp);
	for (i = 0; i < p.size() && sum[nod] > s; i++) {
		sum[nod] -= p[i];
		sol++;
	}
}

int main() {
	freopen("mese.in", "r", stdin);
	freopen("mese.out", "w", stdout);
	
	scanf("%d%d", &n, &s); 
	for (i = 1; i <= n; i++) {
		scanf("%d%d", &a, &c[i]);
		if (a) 
			v[a].push_back(i);
		else
			rad = i;
	}
	
	df(rad); //am calculat sumele pentru subarbori, si tot acolo fac si partea cu impartitu pe sub-arbori
	
	printf("%d\n", sol + 1);
	
	return 0;
}