Cod sursa(job #3366197)

Utilizator Emre12Isleam Emre Emre12 Data 29 septembrie 2026 20:47:44
Problema Partitie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <algorithm>
#include <cstdio>
#include <utility>

#define MAXN 300000

typedef struct {
  int val;
  int *ptr;
} pair;
pair v[MAXN];
int rasp[MAXN];
void swap(int &a, int &b) {
  int aux = a;
  a = b;
  b = aux;
}

void qsort(int st, int dr) {
  int b = st, e = dr, mij = v[(st + dr) / 2].val;
  while (v[b].val < mij)
    b++;
  while (v[e].val > mij)
    e--;
  while (b < e) {
    std::swap(v[b], v[e]);
    do
      b++;
    while (v[b].val < mij);
    do
      e--;
    while (v[e].val > mij);
  }
  if (st < e)
    qsort(st, e);
  if (e + 1 < dr)
    qsort(e + 1, dr);
}

int cautBin(int st, int dr, int e) {
  int mij = (st + dr) / 2;
  if (dr == st) {
    if (v[dr].val == e)
      return dr;
    return -1;
  }
  if (v[mij].val >= e)
    return cautBin(st, mij, e);
  return cautBin(mij + 1, dr, e);
}
int main() {
  FILE *fin, *fout;
  fin = fopen("partitie.in", "r");
  fout = fopen("partitie.out", "w");
  int n, d, i, sum = 0, nrs;

  fscanf(fin, "%d%d", &n, &d);
  for (i = 0; i < n; i++) {
    fscanf(fin, "%d", &v[i].val);
    v[i].ptr = &rasp[i];
  }
  qsort(0, n - 1);

  int j = 0, max = 0;
  for (i = 0; i < n; i++) {
    while (v[i].val - v[j++].val >= d)
      ;
    j--;
    max = std::max(i - j + 1, max);
  }
  fprintf(fout, "%d\n", max);

  for (i = 0; i < n; i++)
    *v[i].ptr = i % max + 1;
  for (i = 0; i < n; i++)
    fprintf(fout, "%d\n", rasp[i]);

  return 0;
}