Pagini recente » Cod sursa (job #109115) | Cod sursa (job #3212511) | Cod sursa (job #1897215) | Cod sursa (job #1126801) | Cod sursa (job #344226)
Cod sursa(job #344226)
#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]);
}