Cod sursa(job #125065)

Utilizator za_wolfpalianos cristian za_wolf Data 20 ianuarie 2008 11:12:29
Problema Partitie Scor 60
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.15 kb
#include<stdio.h>
#include<string.h>
#define NMAX 300005
#include<algorithm>
using namespace std;
long poz,x[NMAX],p[NMAX],i,j,n,m,k,l,a,s,jj,y[NMAX],rez[NMAX];
struct kkt
{
	long X,Y;
};
kkt Q[NMAX];
int cmpf(const kkt a,const kkt b)
{
	return a.X<b.X;
}
int main()
{
	freopen("partitie.in","r",stdin);
	freopen("partitie.out","w",stdout);
	scanf("%ld%ld",&n,&k);
	for (i=1;i<=n;i++)
	{
		scanf("%ld",&x[i]);
		Q[i].X=x[i];
		y[i]=i;
		Q[i].Y=y[i];
	}
/*	a=1;
	m=n;
	while (a)
	{
		a=0;
		for (i=1;i<m;i++)
			if (x[i]>x[i+1]) {a=x[i]; x[i]=x[i+1]; x[i+1]=a; a=y[i]; y[i]=y[i+1];y[i+1]=a; a=1;}
		m--;
	}
*/
	sort(Q+1,Q+n+1,cmpf);
/*	memcpy(x,Q.X,sizeof(Q.X));
	memcpy(y,Q.Y,sizeof(Q.Y));
*/
	for (i=1;i<=n;i++)
	{
		x[i]=Q[i].X;
		y[i]=Q[i].Y;

	}
	p[1]=x[1];
	m=1;
	poz=1;
	rez[y[1]]=1;
	for (i=2;i<=n;i++)
	{
		a=0;
		s=-2000000000;
		jj=-1;
		for (j=1;j<=m;j++)
			if (p[j]+k<=x[i]&&s<p[j]) {jj=j;s=p[j];}
		if (jj!=-1)
		{
			rez[y[i]]=jj;
			p[jj]=x[i];
		}
		else
		{
			m++;
			p[m]=x[i];
			rez[y[i]]=m;
		}
	}
	printf("%ld\n",m);
	for (i=1;i<=n;i++)
	printf("%ld\n",rez[i]);

	return 0;
}