Cod sursa(job #344226)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 29 august 2009 10:53:56
Problema Partitie Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#include<algorithm>
#include<utility>
using namespace std;
pair <int,int> v[300010],x,M[300010];
int n,d,nm,i,j,L,R,C,ia,va,sol[300010];
void read(),solve();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("partitie.in","r",stdin);
	freopen("partitie.out","w",stdout);
	scanf("%d%d",&n,&d);
	for(i=0;i<n;i++){scanf("%d",&v[i].first);v[i].second=i;}
		
}
void solve()
{
	
	sort(v,v+n);
	nm=1;
	M[1].first=v[0].first;M[1].second=1;sol[v[0].second]=1;
	for(i=1;i<n;i++)
	{
		va=v[i].first;ia=v[i].second;
		if(va-M[1].first<d){nm++;sol[ia]=nm;M[nm].first=va;M[nm].second=nm;continue;}
		if(va-M[nm].first>=d){sol[ia]=M[nm].second;M[nm].first=va;continue;}
		L=1;R=nm;
		while(R-L-1)
		{
			C=(R+L)>>1;
			if(va-M[C].first>=d)L=C;
			else R=C;
		}
		sol[v[i].second]=M[L].second;
		x.first=va;x.second=M[L].second;
		for(j=L;j<nm;j++)M[j]=M[j+1];
		M[nm]=x;
	}
	printf("%d\n",nm);
	for(i=0;i<n;i++)printf("%d\n",sol[i]);
}