Pagini recente » Diferente pentru numerele-sprague-grundy intre reviziile 17 si 16 | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #125587)
Cod sursa(job #125587)
#include <stdio.h>
#include <stdlib.h>
long n,d,i,j,ind[300002],a[300002];
long low,mid,high;
long sub[300002],elem[300002],nrsub,value;
int comp(const void * n1, const void * n2){
return (a[*((long*)n1)]-a[*((long*)n2)]);
}
int main(){
freopen("partitie.in","r",stdin);
freopen("partitie.out","w",stdout);
scanf("%ld %ld",&n,&d);
for (i=1;i<=n;i++){
scanf("%ld",&a[i]);
ind[i]=i;
}
qsort (ind,n+1,sizeof(long),comp);
for (i=1;i<=n;i++){
if (sub[ind[i]]==0){
nrsub++;
sub[ind[i]]=nrsub;
elem[nrsub]=1;
low = i+1;
high = n+1;
value=a[ind[i]]+d;
while (low < high){
mid = (low + high)/2;
if (a[ind[mid]] < value)
low = mid + 1;
else
high = mid;
}
while(sub[ind[low]]&&low<n)low++;
if (low<=n&&!sub[ind[low]]);
{sub[ind[low]]=nrsub;elem[nrsub]++;}
}
else{
low = i+1;
high = n+1;
value=a[ind[i]]+d;
while (low<high){
mid = (low + high)/2;
if (a[ind[mid]] < value)
low = mid + 1;
else
high = mid;
}
while(sub[ind[low]]&&low<n)low++;
if (low<=n&&!sub[ind[low]]);
{sub[ind[low]]=sub[ind[i]];elem[sub[ind[i]]]++;}
}
}
/*for (i=1;i<=nrsub;i++)
if (elem[i]==1){
for (j=1;j<=n;i++)
if (sub[ind[j]]==i){low=j;break;}
for (j=low;j<=n;j++)
if (elem[sub[ind[j]]]>2)
if (a[ind[low]]+d<=a[ind[j]]){
sub[ind[j]]=sub[ind[low]];
break;
}
}
*/
printf("%ld\n",nrsub);
for (i=1;i<=n;i++)
printf("%ld\n",sub[i]);
return 0;
}