Pagini recente » Cod sursa (job #1566558) | Cod sursa (job #1251489) | iconcurs11 | Cod sursa (job #2191666) | Cod sursa (job #132625)
Cod sursa(job #132625)
#include<stdio.h>
#include<stdlib.h>
FILE*f=fopen("partitie.in","r");
FILE*g=fopen("partitie.out","w");
int n,D,max;
typedef struct
{
int p; //punct
}Element;
Element 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].p);
}
int cmp(const void*a, const void*b)
{
return x[*(int*)a].p-x[*(int*)b].p;
}
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
{
int p;
for(p=j;p<n-1;++p)
if(y[p].p-y[i].p<D && y[p+1].p-y[i].p>=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+1;
}
}
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;
}