Cod sursa(job #128155)

Utilizator cos_minBondane Cosmin cos_min Data 26 ianuarie 2008 15:47:18
Problema Partitie Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

#define in "partitie.in"
#define out "partitie.out"
#define dim 300002

int N, D;
int A[dim], P[dim], H[dim];

void Qsort(int,int);

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d", &N, &D);
    for ( int i = 1; i <= N; i++ )
        scanf("%d", &A[i]), P[i] = i;
    
    Qsort(1,N);
    
    int Smax = 0;
    
    for ( int i = 1, j = 2; i <= N; i++ )
    {
        if ( j == N )
        {
             if ( j - i > Smax ) Smax = j - i;
             
             continue;
        }
        
        while ( A[j] - A[i] < D && j <= N ) j++;
        
        if ( j - i > Smax ) Smax = j - i;
    }
    
    for ( int i = 1; i <= N; i++ )
    {
        H[P[i]] = i%Smax+1;
    }
    
    printf("%d\n", Smax);
    
    for ( int i = 1; i <= N; i++ )
        printf("%d\n", H[i]);
    
}

void Qsort(int st, int dr)
{
     int i = st-1, j = dr+1, pivot = A[st];
     
     while ( i <= j )
     {
           do { ++i; } while ( A[i] < pivot );
           do { --j; } while ( A[j] > pivot );
           
           if (  i < j )
           {
                 int aux;
                 aux = A[i], A[i] = A[j], A[j] = aux;
                 aux = P[i], P[i] = P[j], P[j] = aux;
           } 
     }
     
     if ( i < dr ) Qsort(i,dr);
     if ( j > st ) Qsort(st,j);
}