Submission #838875

#TimeUsernameProblemLanguageResultExecution timeMemory
838875pavementMinerals (JOI19_minerals)C++17
40 / 100
28 ms2768 KiB
#include "minerals.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair void Solve(int N) { vector<int> uniq, others; for (int i = 0, prv = 0; i < 2 * N; i++) { if (Query(i + 1) > prv) { uniq.pb(i); prv++; } else { others.pb(i); } } int cur_l = 0, cur_r = N - 1, prv = -1; for (int i : others) { prv = Query(i + 1); } vector<int> lo(2 * N, 0), hi(2 * N, N - 1), mid(2 * N), ans(2 * N, -1); auto shift = [&](int new_l, int new_r) { if (cur_l == -1 || cur_r - cur_l + 1 + new_r - new_l + 1 < abs(cur_l - new_l) + abs(cur_r - new_r)) { if (cur_l != -1) { for (int i = cur_l; i <= cur_r; i++) { prv = Query(uniq[i] + 1); } } for (int i = new_l; i <= new_r; i++) { prv = Query(uniq[i] + 1); } } else { if (new_l <= cur_l) { for (int i = cur_l - 1; i >= new_l; i--) { prv = Query(uniq[i] + 1); } if (new_r <= cur_r) { for (int i = cur_r; i > new_r; i--) { prv = Query(uniq[i] + 1); } } else { for (int i = cur_r + 1; i <= new_r; i++) { prv = Query(uniq[i] + 1); } } } else { if (new_r <= cur_r) { for (int i = cur_r; i > new_r; i--) { prv = Query(uniq[i] + 1); } } else { for (int i = cur_r + 1; i <= new_r; i++) { prv = Query(uniq[i] + 1); } } for (int i = cur_l; i < new_l; i++) { prv = Query(uniq[i] + 1); } } } cur_l = new_l; cur_r = new_r; }; for (int rep = 0; (1 << rep) <= N; rep++) { vector<bool> can(2 * N, 0); for (int i : others) { mid[i] = (lo[i] + hi[i]) / 2; // insert [lo[i], mid[i]] from uniq } sort(others.begin(), others.end(), [&](const auto &lhs, const auto &rhs) { return mp(lo[lhs], mid[rhs]) < mp(lo[rhs], mid[rhs]); }); for (int i : others) { shift(lo[i], mid[i]); int ret_1 = Query(i + 1); if (ret_1 == prv) { can[i] = 1; } prv = ret_1; } for (int i : others) { if (can[i]) { ans[i] = mid[i]; hi[i] = mid[i] - 1; } else { lo[i] = mid[i] + 1; } } } for (int i : others) { Answer(i + 1, uniq[ans[i]] + 1); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...