Pagini recente » Cod sursa (job #1367882) | Cod sursa (job #159165) | Cod sursa (job #2013981) | Cod sursa (job #22785) | Cod sursa (job #159555)
Cod sursa(job #159555)
#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;
}