Cod sursa(job #120941)

Utilizator astronomyAirinei Adrian astronomy Data 7 ianuarie 2008 13:01:41
Problema Partitie Scor Ascuns
Compilator cpp Status done
Runda Marime 1.27 kb
#include <cstdio>
#include <cassert>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

#define MAXN 300100
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define PII pair<int, int>

int N, D, K;
vector< PII > A;
int B[MAXN];

void solve(void)
{
    int i, j, k, t, ind, last, len = -1;

    sort(A.begin(), A.end());
    
    for(i = j = 0; i < N; i++)
    {
        for(; j < N && A[j].x-A[i].x < D; j++) ; j--;
        if(j-i+1 > len) len = j-i+1, ind = i, last = j;
    }
    for(K = len, k = 0, i = ind; i < N; i++, k++) B[A[i].y] = k%len;
    for(k = 0, i = ind-1; i >= 0; i--, k++) B[A[i].y]=len-k%len-1;
}

void read_data(void)
{
    int i, j;

    scanf("%d %d\n", &N, &D);

    assert(N >= 1 && N <= 300000);
    assert(D >= 1 && D <= 1000000000);
    
    for(i = 1; i <= N; i++)
        scanf("%d ", &j), assert(j >= 1 && j <= 1000000000),
        A.pb( mp(j,i) );
}

void write_data(void)
{
    int i;
    printf("%d\n", K);
    for(i = 1; i <= N; i++)
        printf("%d\n", B[i]+1);
}

int main(void)
{
    freopen("partitie.in", "rt", stdin);
    freopen("partitie.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}