Cod sursa(job #132614)

Utilizator FlorianFlorian Marcu Florian Data 6 februarie 2008 11:22:32
Problema Partitie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#include<stdlib.h>
FILE*f=fopen("partitie.in","r");
FILE*g=fopen("partitie.out","w");
int n,D,max;
typedef struct
  {
  int p; //punct
  int i; //indice
  int col; //culoarea
  }Element;
Element x[301000],y[301000];
void read()
  {
  fscanf(f,"%d %d",&n,&D);
  for(int i=0;i<n;++i) fscanf(f,"%d",&x[i].p),x[i].i=i;
  }
int cmp(const void*a, const void*b)
   {
   return x[*(int*)a].p-x[*(int*)b].p;
   }
void sorteaza()
  {
  int h[301000];
  int i;
  for(i=0;i<n;++i) h[i]=i;
  qsort(h,n,sizeof(int),cmp);
  for(i=0;i<n;++i)
    y[i]=x[h[i]];
  }
int poz(int i, int j) //returneaza p, cu proprietatea ca c[p]-c[i]<=D
   {
   int p;
   for(p=j;p<n-1;++p)
      if(y[p].p-y[i].p<D && y[p+1].p-y[i].p>=D) return p;
   return -1;
   }
void determina()
  {
  int i,j=1,p;
  for(i=0;i<n;++i)
    {
    p=poz(i,j);
    if(p-i+1>max) max=p-i+1;
    if(p>=0) j=p+1;
    }
  }
void construieste()
  {
  int i,j;
  j=1;
  for(i=0;i<n;++i)
      {
      y[i].col=j;
      j=j%max+1;
      }
  }
int cmp2(const void*a, const void*b)
  {
  long int i=*(int*)a,j=*(int*)b;
  return y[i].i-y[j].i;
  }
void sort2()
  {
  int i,h[301000];
  for(i=0;i<n;++i) h[i]=i;
  qsort(h,n,sizeof(int),cmp2);
  for(i=0;i<n;++i) x[i]=y[h[i]];
  }
void afiseaza()
  {
  fprintf(g,"%d\n",max);
  for(int i=0;i<n;++i) fprintf(g,"%d\n",x[i].col);
  }
int main()
  {
  read();
  sorteaza();
  determina();
  construieste();
  sort2();
  afiseaza();
  return 0;
  }