# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
905049 | akliu | Job Scheduling (CEOI12_jobs) | C++11 | 291 ms | 20164 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
void fastio() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
}
void open(string filename) {
fastio();
freopen((filename + ".in").c_str(), "r", stdin);
freopen((filename + ".out").c_str(), "w", stdout);
}
typedef long long ll;
#define vll vector<ll>
#define vint vector<int>
#define vbool vector<bool>
#define vpii vector<pii>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pb push_back
#define mp make_pair
#define ins(x) insert(x)
#define sz() size()
#define lb() lower_bound()
#define ub() upper_bound()
#define rsz resize
#define se second
#define fi first
#define cont continue
// scary demonic thing
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
struct g {
int day, n;
bool operator<(const g &y) {
if (day != y.day) return day < y.day;
return n < y.n; // Not necessary, compiler gives annoying error otherwise though
}
};
int N, D, M;
vector<g> v;
bool check(int m) {
// Iterate to check if the minimum is valid
int machines; // Using a multiset for machines is inevitable since we want to preserve the order of the size of each machine
deque<int> q; // However, note that q does NOT need to be sorted because we're pushing elements into q in chronological order. Therefore, the elements at the front of q will always be the ones that we need to check for the date limit violation.
int d = 0;
auto it = v.begin();
g val = *it;
while (d != N + 1) {
if (q.sz()) {
if (d - *(q.begin()) > D) {
return false;
}
}
machines = 0;
val = *it;
while (machines != m) {
if (!q.sz()) break;
++machines;
q.pop_front();
}
while (val.day == d) {
if (machines != m) ++machines;
else q.push_back(val.day);
++it;
if (it == v.end()) break;
val = *it;
}
++d;
}
return true;
}
void solve() {
// Input
cin >> N >> D >> M;
for (int i = 0; i < M; ++i) {
int a; cin >> a;
v.pb({a, i + 1});
}
sort(v.begin(), v.end());
// Binary search
int l = 1, r = 1e6, m;
while (l < r) {
m = (l + r) / 2;
if (check(m)) r = m;
else l = m + 1;
}
cout << l << "\n";
// Iterate once more with the correct minimum, very minor changes to the binary search algorithm to allow for storing the index of the value
vector<vint> ans(N + 1);
multiset<pii> machines;
deque<pii> q;
int d = 0;
auto it = v.begin();
g val = *it;
while (d != N + 1) {
machines.clear();
val = *it;
while (machines.sz() != l) {
if (!q.sz()) break;
pii valQ = *(q.begin());
machines.ins(mp(valQ.fi, valQ.se));
q.pop_front();
}
while (val.day == d) {
val = *it;
if (machines.sz() != l) {
machines.ins(mp(val.day, val.n));
}
else q.push_back(mp(val.day, val.n));
++it;
if (it == v.end()) break;
}
for (auto &x : machines) {
ans[d].pb(x.se);
}
++d;
}
// Output
for (int i = 1; i <= N; ++i) {
for (int j = 0; j < ans[i].sz(); ++j) {
cout << ans[i][j] << " ";
}
cout << "0\n";
}
}
int main() {
fastio();
int tc = 1;
// cin >> tc;
while (tc--) {
solve();
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |