Cod sursa(job #139808)

Utilizator MariusGeantaMarius Geanta MariusGeanta Data 20 februarie 2008 18:27:07
Problema Partitie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<fstream>
typedef struct { int x,v; } ELEMENT;
ELEMENT a[300000];
int n,part[300000],d;
int pivot(int p,int 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(int p,int r)
{	int q;
	if (p<r)
	{	q=pivot(p,r);
		qsort(p,q-1);
		qsort(q+1,r);
	}
}
int main()
{
	int i,max,j,poz,c,r;
	ifstream f("partitie.in");
	f>>n>>d;
	for (i=1;i<=n;i++)
		      {	f>>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
	ofstream g("partitie.out");
	g<<max<<endl;
	for (i=1;i<=n;i++)
		g<<part[i]<<endl;
	g.close();
	return 0;
}