Cod sursa(job #125587)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 20 ianuarie 2008 15:01:28
Problema Partitie Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#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;
}