Cod sursa(job #127925)

Utilizator razvi9Jurca Razvan razvi9 Data 25 ianuarie 2008 14:53:19
Problema Partitie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
#include<string.h>
int n,k,a[300010],b[300010],m,i,j,nr,x;
int r1[2000],r2[2000],aux[300010];

int poz(int i,int j)
{int x=0,y=-1,aux;
 while(i<j){
 if(a[b[i]]>a[b[j]]) {aux=b[i];b[i]=b[j];b[j]=aux;aux=x;x=-y;y=-aux;}
 i=i+x;j=j+y;}
 return i;}

void sort(int i,int j)
{if(i>=j) return;
 int k=poz(i,j);
 sort(i,k-1);
 sort(k+1,j);}

void radix(int n1,int n2)
{for(i=0;i<1000;i++) r1[i]=0;
 for(i=1;i<=n;i++)
  r1[a[b[i]]/n2%n1]++;
 r2[0]=1;
 for(i=1;i<1000;i++) r2[i]=r1[i-1]+r2[i-1];
 for(i=1;i<=n;i++)
  aux[r2[a[b[i]]/n2%n1]++]=b[i];
 memcpy(b,aux,sizeof(b));}

void radixsort()
{radix(1000,1);
 radix(1000000,1000);
 radix(1000000000,1000000);}

int main()
{freopen("partitie.in","r",stdin);
 freopen("partitie.out","w",stdout);
 scanf("%d %d",&n,&k);
 for(i=1;i<=n;i++) {scanf("%d",&a[i]);b[i]=i;}
 //sort(1,n);
 radixsort();
 nr=1;j=1;
 for(i=2;i<=n;i++)
  if(a[b[i]]-a[b[j]]<k) nr++;
  else{if(nr>m)m=nr;j++;}
 for(i=1;i<=n;i++) a[b[i]]=(i-1)%m+1;
 printf("%d\n",m);
 for(i=1;i<=n;i++) printf("%d\n",a[i]);
 fclose(stdout);
 return 0;}