Cod sursa(job #139812)

Utilizator MariusGeantaMarius Geanta MariusGeanta Data 20 februarie 2008 18:32:25
Problema Partitie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
typedef struct { long x,v; } ELEMENT;
ELEMENT a[300000];
long n,part[300000],d;
long pivot(long p,long r)
{	ELEMENT aux=a[p];
	while (p<r)
	{     	while (aux.x<=a[r].x&&p<r) r--;
		a[p]=a[r];
		while (aux.x>=a[p].x&&p<r) p++;
		a[r]=a[p];
	}
	a[p]=aux;
	return p;
}

void qsort(long p,long r)
{	long q;
	if (p<r)
	{	q=pivot(p,r);
		qsort(p,q-1);
		qsort(q+1,r);
	}
}
int main()
{
	long i,max,j,poz,c,r;
	FILE  *f=fopen("partitie.in","r");
	fscanf(f,"%ld%ld",&n,&d);
	for (i=1;i<=n;i++)
		      {	fscanf(f,"%ld",&a[i].x); a[i].v=i; }
	f.close();
	//sortare
	qsort(1,n);
	//determin max
	max=0;
	for (i=1,j=2;j<=n&&i<=n-max;i++)
	{	if (j<i) j=i+1;
		while (a[j].x-a[i].x<d&&j<=n) j++;
		j--;
		if (j-i+1>max)  max=j-i+1;
	}
	//repartizez
	c=n/max;r=n%max;poz=1;
	for (i=1;i<=c;i++)
		for (j=1;j<=max;j++)
			part[a[poz++].v]=j;
	for (j=1;j<=r;j++)
		part[a[poz++].v]=j;
	//afisare
	FILE *g=fopen("partitie.out","w");
	fprintf(g,"%ld\n",max);
	for (i=1;i<=n;i++)
		fprintf(g,"%ld\n",part[i]);
	return 0;
}