Cod sursa(job #130154)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 31 ianuarie 2008 13:54:08
Problema Partitie Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <algorithm>
#include <set>

using namespace std;

const int N_MAX = 300010;

set <pair <int, int> > H;
int v[N_MAX], ind[N_MAX], submult[N_MAX];

int cmp(int a, int b)
{
	return (v[a] < v[b]);
}

int main()
{
	freopen("partitie.in", "r", stdin);
//#ifndef _SCREEN_
	freopen("partitie.out", "w", stdout);
//#endif

	int N, D, i;
	scanf("%d %d\n", &N, &D);
	for (i = 1; i <= N; i ++) {
		scanf("%d\n", &v[i]);
		ind[i] = i;
	}

	sort(ind + 1, ind + N + 1, cmp);

	H.insert(make_pair(v[ind[1]], ind[1]));
	submult[ind[1]] = 1;
	int nr = 1, care;
	set <pair <int, int> >::iterator it;

	for (i = 2; i <= N; i ++) {
		it = H.begin();
		care = (*it).first;

//		printf("%d %d %d %d\n", care, v[ind[i]], v[ind[i]] - D, ind[i]);

		if (care > v[ind[i]] - D) {
			submult[ind[i]] = nr + 1;
			nr ++;
			H.insert(make_pair(v[ind[i]], ind[i]));
		}
		else {
			submult[ind[i]] = submult[(*it).second];
			H.erase(it);
			H.insert(make_pair(v[ind[i]], ind[i]));
		}
	}

	printf("%d\n", nr);
	for (i = 1; i <= N; i ++) printf("%d\n", submult[i]);
	
	return 0;
}