제출 #527739

#제출 시각아이디문제언어결과실행 시간메모리
527739_karan_gandhiJob Scheduling (CEOI12_jobs)C++17
100 / 100
338 ms20160 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define all(v) v.begin(), v.end()
#define endl '\n'
#define pl(var) " [" << #var << ": " << (var) << "] "

void solve() {
	int n, d, m; cin >> n >> d >> m;
	vector<pair<int, int>> arr(m); for (int i = 0; i < m; i++) cin >> arr[i].first;
	for (int i = 0; i < m; i++) arr[i].second = i + 1;
	sort(all(arr));

	auto possible = [&](int x) {
		// check if it is possible to complete the jobs with x machines
		int cnt = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 0; j < x; j++) {
				if (arr[cnt].first > i) {
					break;
				}

				if (arr[cnt].first + d >= i) {
					cnt++;
				} else {
					return false;
				}

				if (cnt == m) return true;
			}
		}

		return false;
	};

	// cout << pl(possible(2)) << endl;

	int hi = m, lo = 1;
	int ans = 0;
	while (hi >= lo) {
		int mid = (hi + lo) / 2;

		if (possible(mid)) {
			ans = mid;
			hi = mid - 1;
		} else {
			lo = mid + 1;
		}
	}


	cout << ans << endl;
	// find a way to get answer
	vector<vector<int>> days(n + 1);
	multiset<int> s;
	for (int i = 0; i < ans; i++) {
		// cout << pl(arr[i].second) << endl;
		s.insert(arr[i].first);
			days[arr[i].first - 1].push_back(arr[i].second);
	}

	for (int i = ans; i < m; i++) {
		int last = *s.begin();
		s.erase(s.find(last));
		s.insert(max(last + 1, arr[i].first));
		days[max(last + 1, arr[i].first) - 1].push_back(arr[i].second);
	}

	for (int i = 0; i < n; i++) {
		for (int a : days[i]) cout << a << ' ';
		cout << 0 << endl;
	}
}

int main() {
	// freopen("socdist.in", "r", stdin);
	// freopen("socdist.out", "w", stdout);

	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	// int t; cin >> t;
	// while (t--)
		solve();

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...