Cod sursa(job #200047)

Utilizator 0000go gcc 0000 Data 21 iulie 2008 20:20:38
Problema Partitie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <algorithm>
#define IN "partie.in"
#define OUT "partie.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<17

using namespace std;
int last[1<<14],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()
{
	sort(v+1, v+N+1, comp );
	//FOR(i,1,N)
	//	printf("%d %d\n",v[i].n,v[i].p);
	
	FOR(i,1,N)
		last[i] = -1<<30;
	
	last[0] = 1;
	
	FOR(i,1,N)
	{
		int ok=0;
		FOR(j,1,last[0])
			if(v[i].n - last[j] >= D)
			{
				ok = 1;
				last[j] = v[i].n;
				sol[ v[i].p ] = j;
				break;
			}
		if(!ok)
		{
			last[ ++last[0] ] = v[i].n;
			sol[ v[i].p ] = last[0];
		}
	}

	printf("%d\n", last[0]); 	
	FOR(i,1,N-1)
		printf("%d\n", sol[i]);
	FOR(i,1,1<<13)
		FOR(j,1,1<<13);
	printf("%d\n", sol[N]);	
}

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

/*
#include <cstdio>
#include <algorithm>
#define IN "partie.in"
#define OUT "partie.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<19

using namespace std;
int last[N_MAX],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()
{
	sort(v+1, v+N+1, comp );
	//FOR(i,1,N)
	//	printf("%d %d\n",v[i].n,v[i].p);
	
	FOR(i,1,N)
		last[i] = -1<<30;
	
	last[0] = 1;
	
	FOR(i,1,N)
	{
		int ok=0;
		FOR(j,1,last[0])
			if(v[i].n - last[j] >= D)
			{
				ok = 1;
				last[j] = v[i].n;
				sol[ v[i].p ] = j;
				break;
			}
		if(!ok)
		{
			last[ ++last[0] ] = v[i].n;
			sol[ v[i].p ] = last[0];
		}
	}

	printf("%d\n", last[0]); 	
	FOR(i,1,N)
		printf("%d\n", sol[i]);
}

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

*/