Pagini recente » Cod sursa (job #3172259) | Cod sursa (job #1839295) | Cod sursa (job #208331) | Cod sursa (job #2940948) | Cod sursa (job #132628)
Cod sursa(job #132628)
#include<stdio.h>
#include<stdlib.h>
FILE*f=fopen("partitie.in","r");
FILE*g=fopen("partitie.out","w");
int n,D,max;
int x[301000],y[301000];
int h[300001],col[300001];
void read()
{
fscanf(f,"%d %d",&n,&D);
for(int i=0;i<n;++i) fscanf(f,"%d",&x[i]);
}
int cmp(const void*a, const void*b)
{
return x[*(int*)a]-x[*(int*)b];
}
void sorteaza()
{
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-1, si p = maxim
{
int p;
for(p=j;p<n-1;++p)
if(y[p]-y[i]<D && y[p+1]-y[i]>=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;
}
}
void construieste()
{
int i,j;
j=1;
for(i=0;i<n;++i)
{
col[h[i]]=j;
j=j%max+1;
}
}
void afiseaza()
{
fprintf(g,"%d\n",max);
for(int i=0;i<n;++i) fprintf(g,"%d\n",col[i]);
}
int main()
{
read();
sorteaza();
determina();
construieste();
afiseaza();
return 0;
}