Pagini recente » Cod sursa (job #1691786) | Cod sursa (job #1790078) | Cod sursa (job #2494305) | Cod sursa (job #2544133) | Cod sursa (job #125268)
Cod sursa(job #125268)
#include <stdio.h>
#include <stdlib.h>
struct ceva
{
int v,p;
};
int compare( const void* a, const void* b ) {
ceva* arg1 = (ceva*) a;
ceva* arg2 = (ceva*) b;
if( arg1->v < arg2->v ) return -1;
else if( arg1->v == arg2->v ) return 0;
else return 1;
}
int compare2( const void* a, const void* b ) {
int* arg1 = (int*) a;
int* arg2 = (int*) b;
if( *arg1 < *arg2 ) return -1;
else if( *arg1 == *arg2 ) return 0;
else return 1;
}
int c[300001],b[300001];
ceva a[300001];
int main()
{
FILE *in,*out;
int n,i,max=0,x,d;
in=fopen("partitie.in","r");
out=fopen("partitie.out","w");
fscanf(in,"%d%d",&n,&d);
for (i=1;i<=n;i++)
{
fscanf(in,"%d",&a[i].v);
a[i].p=i;
}
qsort(a+1,n,sizeof(a[1]),compare);
for (i=1;i<=n;i++)
{
x=i-1;
c[0]=0;
while (a[i].v-a[x].v<d&&x>=1)
{
c[0]++;
c[c[0]]=b[x];
x--;
}
qsort(c+1,c[0],sizeof(c[1]),compare2);
if (c[0]==0||c[1]!=1)
b[i]=1;
else
{
x=1;
while(c[x+1]-c[x]<=1&&x<c[0])
x++;
b[i]=c[x]+1;
}
if (b[i]>max)
max=b[i];
}
c[0]=0;
for (i=1;i<=n;i++)
c[a[i].p]=b[i];
fprintf(out,"%d\n",max);
for (i=1;i<=n;i++)
fprintf(out,"%d\n",c[i]);
fclose(in);
fclose(out);
return 0;
}