Cod sursa(job #733720)

Utilizator danalex97Dan H Alexandru danalex97 Data 12 aprilie 2012 20:22:09
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
/*
#include <fstream>

using namespace std;
ifstream F("partitie.in");
ofstream G("partitie.out");

#define Beg first
#define End second

#define Dmax 300011

pair<int,int> A[Dmax];
int Ord[Dmax],Rez[Dmax];
int N,Co,D;

int main(void)
{
	F>>N>>D;
	for (int i=1;i<=N;++i)
	{
		F>>A[i].Beg;
		A[i].End=i;
	}
	
	sort(A+1,A+N+1);
	
	Co=1;
	for (int i=1;i<=N;++i)
	{
		int j=i;
		Ord[j]=Co;
		while ( A[j+1].Beg - A[i].Beg < D && j<N )
			Ord[++j]=Co;
		i=j;
	}
	
	G<<Co<<'\n';
	for (int i=1;i<=N;++i)
		Rez[ A[i].End ]=Ord[ i ];
	for (int i=1;i<=N;++i)
		G<<Rez[i]<<'\n';
	
}
*/
#include <cstdio>
#include <algorithm>

using namespace std;

#define PII pair<int, int>
#define maxim(a, b) ((a > b) ? a : b)
#define f first
#define s second
#define NMax 300005

int N, D, bst, ord[NMax];
PII v[NMax];

int main(void)
{
    int i, j;
    
    freopen("partitie.in", "r", stdin);
    freopen("partitie.out", "w", stdout);

    scanf("%d %d", &N, &D);
    for (i = 1; i <= N; i++)
    {
        scanf("%d", &v[i].f);
        v[i].s = i;
    }
    
    sort(v+1, v+N+1);
    for (i = 1, j = 1; i <= N; i++)
    {
        for (; j <= N && v[j].f-v[i].f < D; j++);
        bst = maxim(bst, j-i);
    }

    for (i = 1, j = 0; i <= N; i++)
    {
        (j == bst) ? (j = 1) : (++j);
        ord[v[i].s] = j;
    }
    
    printf("%d\n", bst);
    for (i = 1; i <= N; i++)
        printf("%d\n", ord[i]);

    return 0;
}