Cod sursa(job #159469)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 14 martie 2008 10:19:31
Problema Partitie Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream.h>
#define MAX 300010
ifstream fin("partitie.in");
ofstream fout("partitie.out");

int a[MAX],b[MAX];
int sir[MAX];
int n,d,nr,k;

void citire()
{
   fin>>n>>d;
  for (int i=0;i<n;i++)
  {
      fin>>a[i];
      b[i]=i+1;
  }
  fin.close();
}

void poz (int li,int ls,int &k,int a[MAX])
{
   int i=li,j=ls,i1=0,j1=-1,aux;
   while (i<j)
   {
       if (a[i]>a[j])
       {
	  aux=a[i];
	  a[i]=a[j];
	  a[j]=aux;
	  aux=b[i];
	  b[i]=b[j];
	  b[j]=aux;
	  aux=i1;
	  i1=-j1;
	  j1=-aux;
       }
       i+=i1;
       j+=j1;
  }
  k=i;
}

void qsort (int li,int ls)
{
  if (li<ls)
  {
    poz (li,ls,k,a);
    qsort (li,k-1);
    qsort (k+1,ls);
  }
}
  
void numarare()   
{   
  nr=1;   
   for (int i=0;i<n;i++)   
     if (a[i]!=-11111)   
     {   
      sir[b[i]]=nr;   
      int aux=a[i];   
      for (int j=i+1;j<n;j++)   
      if (a[j]-aux>=d)   
      {   
         aux=a[j];   
         a[j]=-11111;   
         sir[b[j]]=nr;   
      }
      nr++;
}
}

int main()
{
   citire();
   qsort(0,n-1);
   numarare();   
   fout<<nr-1<<"\n";   
   int numar=-1;   
   for (int i=1;i<=n;i++)   
      if (sir[i]>0)   
      {   
      for (int j=i+1;j<=n;j++)   
      if (sir[j]==sir[i])   
          sir[j]=numar;   
     sir[i]=numar--;   
   }   
      for (int k=1;k<=n;k++)   
     fout<<sir[k]*(-1)<<"\n";   
   fout.close();   
   return 0;   
}