Cod sursa(job #125268)

Utilizator hadesgamesTache Alexandru hadesgames Data 20 ianuarie 2008 12:21:28
Problema Partitie Scor 40
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.26 kb
#include <stdio.h>
#include <stdlib.h>
struct ceva
{
	int v,p;
};
int compare( const void* a, const void* b ) {
   ceva* arg1 = (ceva*) a;
   ceva* arg2 = (ceva*) b;
   if( arg1->v < arg2->v ) return -1;
   else if( arg1->v == arg2->v ) return 0;
   else return 1;
 }  
int compare2( const void* a, const void* b ) {
   int* arg1 = (int*) a;
   int* arg2 = (int*) b;
   if( *arg1 < *arg2 ) return -1;
   else if( *arg1 == *arg2 ) return 0;
   else return 1;
 }  
int c[300001],b[300001];
ceva a[300001];

int main()
{
	FILE *in,*out;
	int n,i,max=0,x,d;
	in=fopen("partitie.in","r");
	out=fopen("partitie.out","w");
	fscanf(in,"%d%d",&n,&d);
	for (i=1;i<=n;i++)
	{
		fscanf(in,"%d",&a[i].v);
		a[i].p=i;
	}
	qsort(a+1,n,sizeof(a[1]),compare);
	for (i=1;i<=n;i++)
	{
		x=i-1;
		c[0]=0;
		while (a[i].v-a[x].v<d&&x>=1)
		{
			c[0]++;
			c[c[0]]=b[x];
			x--;
			
		}
		qsort(c+1,c[0],sizeof(c[1]),compare2);
		if (c[0]==0||c[1]!=1)
			b[i]=1;
		else
		{
			x=1;
			while(c[x+1]-c[x]<=1&&x<c[0])
				x++;
			b[i]=c[x]+1;
		}
		if (b[i]>max)
			max=b[i];
	}
	c[0]=0;
	for (i=1;i<=n;i++)
		c[a[i].p]=b[i];
	fprintf(out,"%d\n",max);
	for (i=1;i<=n;i++)
		fprintf(out,"%d\n",c[i]);
	fclose(in);
	fclose(out);
	return 0;
			
}