Cod sursa(job #125743)

Utilizator ZeusCatalin Tiseanu Zeus Data 20 ianuarie 2008 17:18:25
Problema Partitie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb

#include <cstdio>
#include <algorithm>

using namespace std;

int N, D, A[1<<19], o[1<<19], col[1<<19];

bool cmp( int a, int b )
{ return A[a] < A[b]; }

int main()
{
    freopen("partitie.in", "r", stdin);
    freopen("partitie.out", "w", stdout);
    
    scanf("%d %d", &N, &D );
    
    for( int i = 1; i <= N; i++ )
         scanf("%d", A + i ),
         o[i] = i;
         
    sort( o + 1, o + N + 1, cmp );
    
//    for( int i = 1; i <= N; i++ )
//         printf("%d ", o[i] ); printf("\n");
    
    int ls = 1, mv = 0, cur = 1;
    
    for( int i = 2; i <= N; i++ )
         if( A[ o[i] ] - A[ o[1] ] < D )
             cur++,
             ls = i;
             
    mv = max( mv, cur );
    
    for( int i = 2; i <= N; i++ )
    {
         cur--;
         ls++;
         
         while( ls < N && A[ o[ls] ] < A[ o[i] ] + D )
                ls++, cur++;
                
         mv = max( cur, mv );     
    } 
    
    printf("%d\n", mv );
    
    ls = 1;
    for( int i = 1; i <= N; i++ )
    {    
         col[ o[i] ] = ls;
         
         ls++;
         if( ls > mv )
             ls = 1;          
    }
    
    for( int i = 1; i <= N; i++ )
         printf("%d\n", col[i] );
    
    return 0;
}