Submission #1266051

#TimeUsernameProblemLanguageResultExecution timeMemory
1266051kaiboyJob Scheduling (CEOI12_jobs)C++20
100 / 100
131 ms22596 KiB
#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 timeMemoryGrader output
Fetching results...