結果
問題 | No.953 席 |
ユーザー | risujiroh |
提出日時 | 2019-12-16 02:22:28 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,121 bytes |
コンパイル時間 | 2,245 ms |
コンパイル使用メモリ | 191,276 KB |
実行使用メモリ | 10,568 KB |
最終ジャッジ日時 | 2024-07-02 18:57:18 |
合計ジャッジ時間 | 11,950 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 325 ms
9,632 KB |
testcase_03 | AC | 327 ms
9,992 KB |
testcase_04 | AC | 328 ms
9,752 KB |
testcase_05 | AC | 323 ms
10,356 KB |
testcase_06 | WA | - |
testcase_07 | AC | 315 ms
9,012 KB |
testcase_08 | AC | 299 ms
8,152 KB |
testcase_09 | AC | 264 ms
9,440 KB |
testcase_10 | AC | 70 ms
5,376 KB |
testcase_11 | AC | 210 ms
7,196 KB |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | AC | 337 ms
10,444 KB |
testcase_18 | AC | 343 ms
10,416 KB |
testcase_19 | AC | 381 ms
10,568 KB |
testcase_20 | AC | 336 ms
10,536 KB |
testcase_21 | AC | 332 ms
10,412 KB |
testcase_22 | WA | - |
testcase_23 | AC | 385 ms
8,660 KB |
testcase_24 | AC | 334 ms
8,656 KB |
testcase_25 | AC | 298 ms
8,288 KB |
testcase_26 | AC | 319 ms
10,224 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; string to_string(string s) { return '"' + s + '"'; } string to_string(bool b) { return b ? "true" : "false"; } template <size_t N> string to_string(bitset<N> bs) { string res; for (size_t i = 0; i < N; ++i) res += '0' + bs[i]; return res; } string to_string(vector<bool> v) { string res = "{"; for (bool e : v) res += to_string(e) + ", "; return res += "}"; } template <class T, class U> string to_string(pair<T, U> p); template <class C> string to_string(C c) { string res = "{"; for (auto e : c) res += to_string(e) + ", "; return res += "}"; } template <class T, class U> string to_string(pair<T, U> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } void debug() { cerr << '\n'; } template <class Head, class... Tail> void debug(Head head, Tail... tail) { cerr << ' ' << to_string(head), debug(tail...); } #ifdef LOCAL #define DEBUG(...) cerr << "[" << #__VA_ARGS__ << "]:", debug(__VA_ARGS__) #else #define DEBUG(...) #endif struct Stopwatch { clock_t t = clock(); void restart() { t = clock(); } int elapsed() const { return (clock() - t) * 1000 / CLOCKS_PER_SEC; } friend string to_string(Stopwatch sw) { return "Time: " + to_string(sw.elapsed()) + " ms"; } } sw; template <class Z> Z rng(Z l, Z r) { static mt19937 mt(chrono::steady_clock::now().time_since_epoch().count()); return uniform_int_distribution<Z>(l, r - 1)(mt); } struct Event { int type, id; long long t; bool operator<(Event r) const { return make_pair(t, -type) < make_pair(r.t, -r.type); }; bool operator>(Event r) const { return r < *this; } friend string to_string(Event e) { return "(" + to_string(e.type) + ", " + to_string(e.id + 1) + ", " + to_string(e.t) + ")"; } }; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n, k0, k1; cin >> n >> k0 >> k1; --k0, --k1; vector<int> i2p(n); if (k0 < k1) { int t = 1; for (int i = 1; i < n; ++i) { if (k0 + i < n) { i2p[k0 + i] = t++; } if (k0 - i >= 0) { i2p[k0 - i] = t++; } } } else { int t = 1; for (int i = 1; i < n; ++i) { if (k0 - i >= 0) { i2p[k0 - i] = t++; } if (k0 + i < n) { i2p[k0 + i] = t++; } } } vector<int> p2i(n); for (int i = 0; i < n; ++i) { p2i[i2p[i]] = i; } int q; cin >> q; priority_queue< Event, vector<Event>, greater<Event> > pq; vector<int> b(q); for (int i = 0; i < q; ++i) { int a; cin >> a >> b[i]; pq.emplace(Event{0, i, a}); } DEBUG(i2p); set<int> se0, se1; for (int i = 0; i < n; ++i) { se0.insert(i2p[i]); } vector<int> res(q, -1); set<int> que; long long t = 0; auto add = [&](int id) { if (sw.elapsed() < 1500 and rng(0, 1000) == 0) { vector<bool> used(n, true); for (int p : se0) { int i = p2i[p]; assert(used[i]); used[i] = false; } for (int p : se1) { int i = p2i[p]; assert(used[i]); used[i] = false; } for (int p : se0) { int i = p2i[p]; assert(i == 0 or not used[i - 1]); assert(i == n - 1 or not used[i + 1]); } for (int p : se1) { int i = p2i[p]; assert( (i and used[i - 1]) or (i + 1 < n and used[i + 1]) ); } } int p = -1; if (not se0.empty()) { p = *begin(se0); } else if (not se1.empty()) { p = *begin(se1); } else { que.insert(id); } if (p == -1) { return; } int i = p2i[p]; res[id] = i; if (i and se0.count(i2p[i - 1])) { se0.erase(i2p[i - 1]); se1.insert(i2p[i - 1]); } se0.erase(i2p[i]); if (i + 1 < n and se0.count(i2p[i + 1])) { se0.erase(i2p[i + 1]); se1.insert(i2p[i + 1]); } se1.erase(i2p[i]); pq.emplace(Event{1, id, t + b[id]}); }; while (not pq.empty()) { auto e = pq.top(); DEBUG(e); DEBUG(se0); DEBUG(se1); pq.pop(); t = e.t; if (e.type == 0) { add(e.id); } else { auto chk = [&](int i) { if (i - 1 >= 0 and not se0.count(i2p[i - 1]) and not se1.count(i2p[i - 1])) { return false; } if (i + 1 < n and not se0.count(i2p[i + 1]) and not se1.count(i2p[i + 1])) { return false; } return true; }; int i = res[e.id]; if (chk(i)) { se0.insert(i2p[i]); } else { se1.insert(i2p[i]); } for (int j : {i - 1, i + 1}) { if (j < 0 or j >= n) { continue; } if (se1.count(i2p[j]) and chk(j)) { se1.erase(i2p[j]); se0.insert(i2p[j]); } } DEBUG(se0); DEBUG(se1); if (pq.empty() or e.t < pq.top().t) { while (not que.empty()) { int id = *begin(que); assert(res[id] == -1); add(id); if (res[id] == -1) { break; } que.erase(id); } } } } for (int e : res) { cout << e + 1 << '\n'; } }