Cod sursa(job #257580)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 13 februarie 2009 17:04:55
Problema Partitie Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<stdio.h>
#define max(a,b) (a>b?a:b)

FILE *fin=fopen("partitie.in","r"),
    *fout=fopen("partitie.out","w");

int N,K,A[300005],B[300005],C[300005];


void swap(int i,int j){
    A[i]^=A[j];A[j]^=A[i];A[i]^=A[j];
    B[i]^=B[j];B[j]^=B[i];B[i]^=B[j];
}

int main(){
    fscanf(fin,"%d %d",&N,&K);
    for(int i=1;i<=N;i++){
        fscanf(fin,"%d",&A[i]);
        B[i]=i;

        int j=i;
        while(j/2 && A[j/2]<A[j]){
            swap(j,j/2);
            j/=2;
        }
    }

    int Nh=N;
    while(Nh>1){
        swap(1,Nh);
        --Nh;

        int i=1,j;
        while(1){
            j=2*i;
            if(j>Nh) break;
            if(j+1<=Nh && A[j]<A[j+1])  ++j;
            if(A[j]<=A[i]) break;
            swap(i,j);
            i=j;

        }
    }

    int MAX=-1,j;
    for(int i=1;i<=N;i=j){

        for(j=i;j<=N && A[j]-A[i]<=K-1;j++);
        MAX=max(MAX,j-i);
    }

    fprintf(fout,"%d\n",MAX);
    int c=1;
    for(int i=1;i<=N;i++){
        if(c>MAX)
            c=1;
        C[B[i]]=c++;
    }
    for(int i=1;i<=N;i++)
        fprintf(fout,"%d\n",C[i]);

    fclose(fin);
    fclose(fout);
    return 0;


}