Cod sursa(job #44615)

Utilizator pocaituDavid si Goliat pocaitu Data 31 martie 2007 16:26:07
Problema Mese Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<stdio.h>
#include<stdlib.h>
#define nmax 100002

long *niv[nmax],ls1[nmax],ld1[nmax],nvm,poz[nmax],p[nmax],max,ld[nmax],ls[nmax],*fiu[nmax],n,S;
int s[nmax],v[nmax];
char viz[nmax];
void readdata()
{long i;
 freopen("mese.in","r",stdin);
 scanf("%ld%ld",&n,&S);
 max=n;

 for(i=0;i<=n;i++)
   {fiu[i]=(long*)realloc(fiu[i],sizeof(long));
	fiu[i][0]=0;
	niv[i]=(long*)realloc(niv[i],sizeof(long));
	niv[i][0]=0;
	}

 for(i=1;i<=n;i++)
  {scanf("%ld%ld",&p[i],&v[i]);
   fiu[p[i]]=(long *) realloc(fiu[p[i]],(++fiu[p[i]][0]+1)*sizeof(long));
   fiu[p[i]][fiu[p[i]][0]]=i;
   }
 return;
 }


void DFS(long vf,long ni)
{long i;
 viz[vf]=1;
 niv[ni]=(long*)realloc(niv[ni],(++niv[ni][0]+1)*sizeof(long));
 niv[ni][niv[ni][0]]=vf;
 if(ni>nvm)
  nvm=ni;
 for(i=1;i<=fiu[vf][0];i++)
  if(!viz[fiu[vf][i]])
	DFS(fiu[vf][i],ni+1);
 }


void form_lsld(long ni,long s)
{long x,i;
 if(!ni) return;
 for(i=1;i<=niv[ni][0];i++)
  {x=niv[ni][i];
   poz[x]=++s;
   if(!ls1[p[x]])
	 ls1[p[x]]=s;
   ld1[p[x]]=s;
   }

 form_lsld(ni-1,s);
 }
void renum()
{long i,j;
 for(i=1;i<=n;i++)
   {s[poz[i]]=v[i];
	ls[poz[i]]=ls1[i];
	ld[poz[i]]=ld1[i];
	}
 for(i=1;i<=nvm;i++)
  for(j=1;j<=niv[i][0];j++)
   niv[i][j]=poz[niv[i][j]];

 //memcpy(p,par,sizeof(par));
 //memcpy(niv,nivv,sizeof(nivv));

 }
void sort(long ls,long ld)
{
 long mij=(ls+ld)>>1,i,j,k;
 if(ls==ld) return;
 sort(ls,mij);
 sort(mij+1,ld);
 for(k=i=ls,j=mij+1;i<=mij||j<=ld;)
  if(j>ld||(s[i]<s[j]&&i<=mij))
	v[k++]=s[i++];
  else
	v[k++]=s[j++];
  for(k=ls;k<=ld;k++)
   s[k]=v[k];
 }





void solve(long ni)
{long x,i,j;
 if(!ni) return;
 for(i=1;i<=niv[ni][0];i++)
   {x=niv[ni][i];
	sort(ls[x],ld[x]);
	for(j=ls[x];j<=ld[x];j++)
	 if(s[x]+s[j]<=S&&ls[x])
	   {s[x]+=s[j];
		max--;
		}
	}
 solve(ni-1);
 }


void printdata()
{freopen("mese.out","w",stdout);
 printf("%ld",max);
 fclose(stdout);
 }


int main()
{
 readdata();

 //aflu cate niv si cate elem au fiecare
 DFS(0,0);
 for(i=0;i<=n;i++)
   fiu[i]=(long*)realloc(fiu[i],0);

 //renumerotez si formez ls,ld;
 form_lsld(nvm,0);
 renum();
 solve(nvm-1);
 printdata();

 return 0;
 }