Cod sursa(job #18536)

Utilizator robbyRobertino robert robby Data 18 februarie 2007 12:33:37
Problema Culori Scor 4
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.44 kb
#include <stdio.h>
#include <stdlib.h>
#define nmax 260
int a[nmax],min[nmax],max[nmax],n,i,j,nr,k,v,b[nmax];
long r;

int compare(const void *x,const void *y)
{
  return *(int*)y-*(int*)x;
}

FILE *f,*g;
int main()
{
  f=fopen("culori.in","rt");
  g=fopen("culori.out","wt");
  fscanf(f,"%d",&n);
  nr=n;
  for (i=1;i<2*n;i++)
	fscanf(f,"%d",&a[i]);
  if (a[1]!=a[2*n-1])
	{
	  fprintf(g,"0\n");
	  fclose(f);
	  fclose(g);
	  return 0;
	}
  for (i=1;i<2*n-1;i++)
	{
	  j=i;
	  while (a[j]==a[j+1])
		j++;
	  if (j==i)
		{
		  min[a[i]]=1;
		  max[a[i]]+=1;
		}
	   else
		 {
		   min[a[i]]=2;
		   max[a[i]]+=j-i+1;
		   i=j;
		 }

	}
  min[a[1]]--;
  max[a[1]]--;
  nr=n-1;
  j=1;
  for (i=1;i<=n&&nr>=0;i++)
	{
	  nr-=min[i];
	  j+=max[i];
	  max[i]-=min[i];
	}

  if (nr<0||j<n-1)
	{
	  fprintf(g,"0\n");
	  fclose(f);
	  fclose(g);
	  return 0;
	}
   else
	 {
	   qsort(max+1,n,sizeof(int),compare);
	   i=1;
	   while (max[i+1])
		 i++;
	   n=i;
	   for (i=1;i<=n;i++)
		 if (max[i]>nr)
		   max[i]=nr;
	  k=1;
	  b[1]=-1;
	  j=-1;
	  while (k>0)
		{
		v=0;
		while (v==0&&b[k]<max[k])
		 {
		   b[k]++;
		   j++;
		   v=1;
		 }
		if (!v)
		 {
		   j-=b[k];
		   k--;
		 }
		else
		 {
		  if (j==nr)
			r++;
		   else
			if (k<n)
			 {
			   k++;
			   j--;
			   b[k]=-1;
			 }
		 }
		}

	 }
  fprintf(g,"%ld\n",r%9901);
  fclose(f);
  fclose(g);
  return 0;
}