Cod sursa(job #200062)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 22 iulie 2008 01:10:44
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <algorithm>
#define IN "partitie.in"
#define OUT "partitie.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 430011

using namespace std;
int sol[N_MAX];
struct nr{int n,p;};
nr v[N_MAX];
int N,D;

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d", &N,&D);
	FOR(i,1,N)
	{
		scanf("%d", &v[i].n);
		v[i].p = i;
	}	
}

inline int comp(const nr &x,const nr &y)
{
	return x.n < y.n;
}	

void solve()
{
	int max = 0;
	sort(v+1, v+N+1, comp );
	
	int k1=0,k2=1;
	while(k2 < N)
	{
		++k2;
		++k1;
		while(v[k2].n - v[k1].n < D && k2 < N)
			++k2;
		if(v[k2].n - v[k1].n >= D)
			--k2;
		if(k2 - k1 + 1 > max)
			max = k2 - k1 + 1;
	}	
	if(!max)
		++max;
	printf("%d\n", max);
	FOR(i,1,N)
	{
		FOR(j,1,max)
		{
			sol[ v[i].p ] = j;
			++i;
		}
		--i;
	}	
	FOR(i,1,N)
		printf("%d\n",sol[i]);
		
}

int main()
{
	scan();
	solve();
	return 0;
}