Cod sursa(job #128635)

Utilizator Data 27 ianuarie 2008 15:52:07
Problema Partitie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define FIN "partitie.in"
#define FOUT "partitie.out"
#define MAX_N 300005

int A[MAX_N];
int pz[MAX_N];
int B[MAX_N];

int N, D, i, j;


    int part (int st, int dr)
    {
        int i, j, s = 1;
        i = st; j = dr;
        while (i < j)
        {
              if (A[i] > A[j])
              {
                       int d = A[i]; A[i] = A[j]; A[j] = d;
                       d = pz[i]; pz[i] = pz[j]; pz[j] = d;
                       s = 1 - s;
              }
              if (s) ++i; else --j;
        }
        return i;
    }              

    void sort (int st, int dr)
    {
         if (st < dr)
         {
                int p = part (st, dr);
                sort (st, p - 1);
                sort (p + 1, dr);
         }
    }

    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        scanf ("%d %d", &N, &D);
        
        for (i = 1; i <= N; ++i)
        {
            pz[i] = i;
            scanf ("%d", A + i);
        }
        sort (1, N);
        
        int jant = 1;
        int max = 10000000;
        for (i = 1; i < N; ++i)
            for (j = jant; j <= N; ++j)
                if (A[j] - A[i] >= D)
                {
                         jant = j;
                         if (j - i + 1 < max) max = j - i + 1;
                         break;
                }
        printf ("%d\n", max);
        int cl = 1;
        for (i = 1; i <= N; ++i)
        {
            A[i] = cl;
            ++cl;
            if (cl > max) cl = 1;
        }
        
        for (i = 1; i <= N; ++i)
            B[pz[i]] = A[i];
        for (i = 1; i <= N; ++i)
            printf ("%d\n", B[i]);
        
        return 0;
    }