Cod sursa(job #125263)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 20 ianuarie 2008 12:20:24
Problema Partitie Scor 70
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 9-a Marime 1.17 kb
#include <stdio.h>
#include <set>
#include <algorithm>
using namespace std;
const int n_max = 300010;
set <int > s;
set <int > v;
set <int >::iterator it;
int a[n_max],
	b[n_max],
	ind[n_max];
int i, n, d, p, maxim, test;
bool cmp(const int x, const int y)
{
	return a[x]<a[y];
}
int main()
{
	freopen("partitie.in","r",stdin);
	freopen("partitie.out","w",stdout);
	scanf("%d %d", &n, &d);
	for (i = 1; i <= n; ++ i)
	{
		scanf("%d", &a[i]);
		ind[i] = i;
	}
	sort(ind +1, ind + n + 1, cmp);
	p = 1;
	b[ind[1]] = 1;
	s.insert(1);
	maxim = 1;
	for (i = 2; i <= n; ++ i)
	{

		while(a[ind[p]]+d <=a[ind[i]])
		{
			s.erase(b[ind[p]]);
			v.insert(b[ind[p]]);
			++p;
		}
		if (p == i)
		{
			b[ind[i]] = 1;
			s.insert(1);
		}
		else
		{

			if (v.size() == 0)
			{
				it = s.end();
				--it;
				b[ind[i]] = *it +1;
				s.insert(*it +1);
				if (b[ind[i]]>maxim)
				{
					maxim = b[ind[i]];
					test = i;
				}

			}
			else
			{
				it = v.begin();
				b[ind[i]] = *it;
				s.insert(*it);
				v.erase(*it);
			}
		}
	}
	printf("%d\n", maxim);
	for (i = 1; i <=n; ++ i)
	{
		printf("%d\n",b[i]);
	}
	return 0;
}