제출 #525931

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

#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;

int N, D, M;	// days, max delay, reqs
ii numbers[1000050];
vector<int> answers[100050];
int final = -1;

bool check(int n) {	// checks if n machines is enough
	int needed[2 * N] = {0};
	int latest = 0;
	for (int i = 0; i < M; i++) {	// finds earliest possible time for each
		latest = max(latest, numbers[i].fi);
		while (needed[latest] == n)
			latest++;
		if (latest - numbers[i].fi > D)
			return false;
		needed[latest]++;
		if (n == final)
			answers[latest].pb(numbers[i].se);
	}
	return true;
}

int main() {
	cin>>N>>D>>M;
	for (int i = 0; i < M; i++) {
		cin>>numbers[i].fi;
		numbers[i].se = i + 1;
	}
	sort(numbers, numbers + M);
	int low = 0;
	int high = 1e9;
	int ans = -1;
	while (low <= high) {	// false, false, false, true, true, true
		int mid = (low + high) / 2;
		if (check(mid)) {
			ans = mid;
			high = mid - 1;
		}
		else {
			low = mid + 1;
		}
	}
	cout<<ans<<endl;
	final = ans;
	check(ans);
	for (int i = 1; i <= N; i++) {
		for (int j : answers[i])
			cout<<j<<" ";
		cout<<0<<endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...