Cod sursa(job #603668)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 18 iulie 2011 12:20:52
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

#define maxN 100005

using namespace std;

FILE*f=fopen("mese.in","r");
FILE*g=fopen("mese.out","w");

int n,S,i,bst[maxN],nodstart,t;
vector<int>G[maxN]; unsigned char v[maxN]; unsigned short int d[maxN];

inline void citire () {
	
	fscanf(f,"%d %d",&n,&S);
	
	for ( i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d %d",&t,&v[i]);
		if ( !t ){
			nodstart = i;
		}
		else{
			G[t].push_back(i);
		}
	}
}

struct cmp{
	inline bool operator () ( const int &a, const int &b ){
		return d[a] < d[b];
	}
};

void DFS ( int nod ){
	
	for ( int i = 0 ; i < G[nod].size() ; ++i ){
		int nodvcn = G[nod][i];
		DFS( nodvcn );
		bst[nod] += bst[nodvcn];
	}
	
	sort( G[nod].begin(), G[nod].end() , cmp() );
	
	int i = -1,s = v[nod];
	while ( i + 1 < G[nod].size() ){
		if ( s + d[ G[nod][i+1] ] > S )	break ;
		s += d[ G[nod][i+1] ]; ++i;
	}
	
	bst[nod] -= i;
	d[nod] = s;
}

inline void solve () {
	
	DFS(nodstart);
	
	fprintf(g,"%d\n",bst[nodstart]);
}

int main () {
	
	citire();
	solve();
	
	fclose(f);
	fclose(g);
	
	return 0;
}