Cod sursa(job #344444)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 30 august 2009 10:16:03
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>
#include<algorithm>
#include<utility>
using namespace std;
pair <int,int> v[300010];
int n,d,nm,i,j,k,left[300010],up[300010],ff[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=1;i<=n;i++){scanf("%d",&v[i].first);v[i].second=i;}
		
}
void solve()
{
	int L,R,C;
	sort(v+1,v+n+1);v[0].first=-d-1;
	for(i=1;i<=n;i++)
	{
		L=left[i-1];R=i;
		while(R-L-1)
		{
			C=(L+R)>>1;
			if(v[i].first-v[C].first>=d)L=C;
			else R=C;
		}
		left[i]=L;
	}
	for(i=1;i<=n;i++)ff[i]=i;
	for(i=1;i<=n;i++)
	{
		j=left[i];
		if(!j)continue;
		if(!up[j]){up[j]=i;for(k=j;up[k];k++)ff[k]=ff[j-1];continue;}
		j=ff[j];if(!j)continue;
		up[j]=i;
		for(k=j;up[k];k++)ff[k]=ff[j-1];
	}
	for(i=1;i<=n;i++)v[i].first=0;
	for(i=1;i<=n;i++)
	{
		if(v[i].first)continue;
		nm++;
		j=i;
		for(;;)
		{
			v[j].first=nm;
			if(!up[j])break;
			j=up[j];
		}
	}
	for(i=1;i<=n;i++)up[v[i].second]=v[i].first;
	printf("%d\n",nm);
	for(i=1;i<=n;i++)
		printf("%d\n",up[i]);
}