Pagini recente » Cod sursa (job #3232343) | Cod sursa (job #513535) | Cod sursa (job #1868139) | Cod sursa (job #2830088) | Cod sursa (job #159560)
Cod sursa(job #159560)
#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-1;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;
}