Cod sursa(job #159555)

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

int a[MAX],b[MAX];
int sir[MAX],max[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()   
{
  int poz=0;
  nr=1;
  sir[b[0]]=1;
  while (a[poz++]<a[0]+d);

  for (int lol=1;lol<poz-1;lol++)
  {
     max[lol+1]=a[lol];
     sir[b[lol]]=lol+1;
     nr++;
  }
  sir[b[poz-1]]=1;
  max[1]=a[poz-1];
  int j;
  for (int i=poz-1;i<n;i++)
      for (j=i+1;j<n;j++)
      if (a[j]-a[i]>=d)
      {
	 max[sir[b[i]]]=a[j];
	 sir[b[j]]=sir[b[i]];
	 i=j-1;
	 break;
      }
      else
      {
	 int ok=1;
	 for (int lg=i+1;lg<=j;lg++)
	 {
	   ok=1;
	    for (int k=nr;k>=2;k--)

	      if (a[lg]-d>=max[k])
	      {
		max[k]=a[lg];
		sir[b[lg]]=k;
		ok=0;
		break;
	      }

		if (ok)
		{
		  nr++;
		  max[nr-1]=a[lg];
		  sir[b[lg]]=nr;
		}
	 }
      }
}

int main()
{
   citire();
   qsort(0,n-1);
   numarare();   
   fout<<nr<<"\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;   
}