Pagini recente » Cod sursa (job #1566436) | Cod sursa (job #690237) | Cod sursa (job #2059505) | Cod sursa (job #2168620) | Cod sursa (job #132623)
Cod sursa(job #132623)
#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
int i; //indice
int col; //culoarea
}Element;
Element x[301000],y[301000];
void read()
{
fscanf(f,"%d %d",&n,&D);
for(int i=0;i<n;++i) fscanf(f,"%d",&x[i].p),x[i].i=i;
}
int cmp(const void*a, const void*b)
{
return x[*(int*)a].p-x[*(int*)b].p;
}
void sorteaza()
{
int h[301000];
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)
{
y[i].col=j;
j=j%max+1;
}
}
int cmp2(const void*a, const void*b)
{
long int i=*(int*)a,j=*(int*)b;
return y[i].i-y[j].i;
}
void sort2()
{
int i,h[301000];
for(i=0;i<n;++i) h[i]=i;
qsort(h,n,sizeof(int),cmp2);
for(i=0;i<n;++i) x[i]=y[h[i]];
}
void afiseaza()
{
fprintf(g,"%d\n",max);
for(int i=0;i<n;++i) fprintf(g,"%d\n",x[i].col);
}
int main()
{
read();
sorteaza();
determina();
construieste();
sort2();
afiseaza();
return 0;
}