Cod sursa(job #484954)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 16 septembrie 2010 17:07:45
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define Nmax 100002
#define pb push_back

using namespace std;

vector< int > v[Nmax];
int Dad[Nmax],Age[Nmax],Niv[Nmax],ind[Nmax];
int N,S;

void dfs(int x){
	vector< int >:: iterator it;
	Niv[x]=Niv[Dad[x]]+1;
	for(it=v[x].begin(); it!=v[x].end(); ++it)
		dfs(*it);
}

inline int cmp(int i,int j){
	return Niv[i]>Niv[j];
}
inline int cmp2(int i,int j){
	return Age[i] < Age[j];
}

int main(){
	vector< int >:: iterator it;
	int i,sol=0,cati,wh,sp,rad;
	freopen("mese.in","r",stdin);
	freopen("mese.out","w",stdout);
	scanf("%d%d",&N,&S);
	for(i=1;i<=N;++i){
		scanf("%d%d",&Dad[i],&Age[i]);
		
		if( ! Dad[i] ) rad=i;
		else v[Dad[i]].pb(i);
		ind[i]=i;
	}
	
	dfs(rad);
	sort(ind+1,ind+N+1,cmp);
	
	for(i=1; Niv[ind[i]]==Niv[ind[i+1]]; ) ++i; // trec peste frunze
	
	for(++i; i<=N; ++i){
		wh=ind[i];
		sp=Age[wh]; cati=0;
		
		sort(v[wh].begin(),v[wh].end(),cmp2);
		for(it=v[wh].begin(); it!=v[wh].end(); ++it)
			if( Age[*it] + sp <= S ) sp += Age[*it], cati++;
		else break;
			
		Age[wh]=sp;
		sol += v[wh].size()-cati;
	}
	
	printf("%d\n",sol+1);
	fclose(stdin); fclose(stdout);
	return 0;
}