Cod sursa(job #125399)

Utilizator mihai0110Bivol Mihai mihai0110 Data 20 ianuarie 2008 12:47:02
Problema Partitie Scor 50
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 0.95 kb
#include<stdio.h>
long n,i,j,max,d,gas;
long a[30000],ult[30000],sol[30000],nr[30000];
long poz(long li,long ls)
{
long t=0,i,j,aux;
i=li;
j=ls;
while(i<j)
{
if(a[nr[i]]>a[nr[j]])
{
aux=nr[i];
nr[i]=nr[j];
nr[j]=aux;
t=1-t;
}
if(t)
j--;
else
i++;
}
return i;
}
void quick(long li,long ls)
	{
	long k;
	if(li<ls)
	{
		k=poz(li,ls);
		quick(li,k-1);
		quick(k+1,ls);
	}
	}
int main(void)
	{
	freopen("partitie.in","r",stdin);
	freopen("partitie.out","w",stdout);
	scanf("%ld%ld",&n,&d);
	for(i=1;i<=n;i++)
		{
		scanf("%ld",&a[i]);
		nr[i]=i;
		}
	quick(1,n);
	ult[1]=a[nr[1]];
	sol[nr[1]]=1;
	max=1;
	for(i=2;i<=n;i++)
		{
		gas=0;
		for(j=1;j<=max;j++)
			if(a[nr[i]]-ult[j]>=d)
				{
				gas=1;
				ult[j]=a[nr[i]];
				sol[nr[i]]=j;
				break;
				}
		if(!gas)
			{
			max++;
			ult[max]=a[nr[i]];
			sol[nr[i]]=max;
			}
		}
printf("%ld\n",max);
for(i=1;i<=n;i++)
printf("%ld\n",sol[i]);
return 0;
}