Cod sursa(job #45776)

Utilizator vlad_popaVlad Popa vlad_popa Data 1 aprilie 2007 21:16:05
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
using namespace std;

#include <stdio.h>
#include <algorithm>

#define FIN "mese.in"
#define FOUT "mese.out"
#define NMAX 100001
#define INF 0x3f3f3f3f

int s[NMAX], sum[NMAX], age[NMAX], *f[NMAX];
int N, nr[NMAX], root, verif, S, ind[NMAX];

void read ()
{
  int x, y;
  
  scanf ("%d %d\n", &N, &S);

  for (int i = 1; i <= N; ++ i)
   {
     scanf ("%d %d\n", &x, &y);
     if (x != 0)
       ++ nr[x];
   }

  for (int i = 1; i <= N; ++ i)
   {
     f[i] = new int [nr[i] + 1];
     nr[i] = 0;
   }

  fseek (stdin, 0, SEEK_SET);

  scanf ("%d %d\n", &N, &S);

  for (int i = 1; i <= N; ++ i)
   {
     scanf ("%d %d\n", &x, &y);
     if (x != 0)
       f[x][++nr[x]] = i;
     else
       root = i;
     age[i] = y;
   }
}

int cmp (const int a, const int b)
{
  return sum[a] < sum[b];
}

void df (int i)
{
  int jj;
  
  for (int j = 1; j <= nr[i]; ++ j)
    df (f[i][j]);

  if (nr[i] == 0)
   {
     s[i] = 1;
     sum[i] = age[i];
   }
  else
   {
     sum[i] = age[i];
     verif = 0;

     for (int j = 1; j <= nr[i]; ++ j)
       ind[j] = j;

     sort (f[i]+1, f[i]+nr[i]+1, cmp);

     /*for (int j = 1; j <= nr[i]; ++ j)
       fprintf (stderr, "%d ", sum[f[i][ind[j]]]);
     fprintf (stderr, "\n");*/

     for (int j = 1; j <= nr[i]; ++ j)
      {
        jj = ind[j];
        if (sum[i] + sum[f[i][jj]] <= S)
          {
            s[i] += s[f[i][jj]];
            sum[i] += sum[f[i][jj]];
            verif++;
          }
        else
          s[i] += s[f[i][jj]];
      }
      
     s[i] = s[i] - verif + 1;
   }
}

void solve ()
{
  df (root);

  printf ("%d\n", s[root]);
}

int
 main ()
{
  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);
  
  read ();
  solve ();
  return 0;
}