Cod sursa(job #922607)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 22 martie 2013 15:48:56
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <algorithm>
using namespace std;

const int dim = 300005;
int N, D, H[dim];
struct val { int val, i, p; } A[dim];

bool cmp1 (val a, val b) { return a.val < b.val; }
bool cmp2 (val a, val b) { return a.i < b.i; }
bool cmp_heap (int a, int b) { return A[H[a]].val < A[H[b]].val; }

void upheap (int n)
{
	int t = n >> 1;
	while (t != 0 && cmp_heap (n, t))
	{
		swap (H[n], H[t]);
		n = t;
		t = n >> 1;
	}	
}

void downheap (int n)
{
	int f = n << 1;
	if (f+1 <= H[0] && cmp_heap (f+1, f)) f++;
	while (f <= H[0] && cmp_heap (f, n))
	{
		swap (H[n], H[f]);
		n = f;
		f = n << 1;
		if (f+1 <= H[0] && cmp_heap (f+1, f)) f++;
	}
}

int main ()
{
	freopen ("partitie.in", "r", stdin);
	freopen ("partitie.out", "w", stdout);
	
	scanf ("%d%d", &N, &D);
	for (int i = 1; i <= N; i++)
	{
		scanf ("%d", &A[i].val);
		A[i].i = i;
	}
	sort (A + 1, A + N + 1, cmp1);
	
	H[++H[0]] = 1;
	A[1].p = 1;
	for (int i = 2; i <= N; i++)
	{
		if (A[i].val - A[H[1]].val < D)
		{
			H[++H[0]] = i;
			A[i].p = H[0];
			upheap (H[0]);
		}
		else
		{
			A[i].p = A[H[1]].p;
			H[1] = i;
			downheap (1);
		}
	}
	
	sort (A + 1, A + N + 1, cmp2);
	printf ("%d\n", H[0]);
	for (int i = 1; i <= N; i++)
		printf ("%d\n", A[i].p);
	
	return 0;
}