제출 #1266051

#제출 시각아이디문제언어결과실행 시간메모리
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...