#include <algorithm>
#include <iostream>
using namespace std;
const int N = 100000;
const int M = 1000000;
int ii[M], *hh[N], cc[N], qu[M], *hh_[N], cc_[N];
void append(int **hh, int *cc, int i, int h) {
int z = cc[i]++;
if (!z)
hh[i] = (int *) malloc(sizeof *hh[i]);
else if (!(z & z - 1))
hh[i] = (int *) realloc(hh[i], (z << 1) * sizeof *hh[i]);
hh[i][z] = h;
}
bool solve(int n, int d, int k) {
int l = 0, r = 0;
for (int i = 0; i < n; i++) {
for (int z = 0; z < cc[i]; z++)
qu[r++] = hh[i][z];
if (l < r && ii[qu[l]] + d < i)
return false;
if (cc_[i])
free(hh_[i]), cc_[i] = 0;
for (int z = 0; z < k && l < r; z++)
append(hh_, cc_, i, qu[l++]);
}
return true;
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(NULL);
int n, d, m; cin >> n >> d >> m;
for (int h = 0; h < m; h++)
cin >> ii[h], append(hh, cc, --ii[h], h);
int lower = 0, upper = m;
while (upper - lower > 1) {
int k = lower + upper >> 1;
if (solve(n, d, k))
upper = k;
else
lower = k;
}
int k = upper;
solve(n, d, k);
cout << k << '\n';
for (int i = 0; i < n; i++) {
for (int z = 0; z < cc_[i]; z++)
cout << hh_[i][z] + 1 << ' ';
cout << "0\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |