Submission #838892

#TimeUsernameProblemLanguageResultExecution timeMemory
838892pavementMinerals (JOI19_minerals)C++17
75 / 100
29 ms3740 KiB
#include "minerals.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair vector<int> perm; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int my_Query(int x) { return Query(perm[x - 1] + 1); } void my_Answer(int x, int y) { Answer(perm[x - 1] + 1, perm[y - 1] + 1); } void Solve(int N) { vector<int> uniq, others; int cur_l = 0, cur_r = N - 1, prv = 0; vector<int> lo(2 * N, 0), hi(2 * N, N - 1), mid(2 * N), ans(2 * N, -1); perm = vector<int>(2 * N); iota(perm.begin(), perm.end(), 0); shuffle(perm.begin(), perm.end(), rng); for (int i = 0; i < 2 * N; i++) { if ((int)uniq.size() < N && my_Query(i + 1) > prv) { uniq.pb(i); prv++; } else { others.pb(i); } } auto shift = [&](int new_l, int new_r) { int tmp_new_l = new_l, tmp_new_r = new_r; assert(cur_l <= cur_r); assert(new_l <= new_r); if (new_l < cur_l) { swap(cur_l, new_l); swap(cur_r, new_r); } // case 1: one range compeletely covers the other if (new_r <= cur_r) { for (int i = cur_l; i < new_l; i++) { prv = my_Query(uniq[i] + 1); } for (int i = new_r + 1; i <= cur_r; i++) { prv = my_Query(uniq[i] + 1); } } else if (cur_r < new_l) { // case 2: completely disjoint for (int i = cur_l; i <= cur_r; i++) { prv = my_Query(uniq[i] + 1); } for (int i = new_l; i <= new_r; i++) { prv = my_Query(uniq[i] + 1); } } else { // intersection for (int i = cur_l; i < new_l; i++) { prv = my_Query(uniq[i] + 1); } for (int i = cur_r + 1; i <= new_r; i++) { prv = my_Query(uniq[i] + 1); } } cur_l = tmp_new_l; cur_r = tmp_new_r; }; function<void(int, int, vector<int>&)> go = [&](int l, int r, vector<int> &idxs) { if (l > r || idxs.empty()) { return; } int m = (l + r) / 2; vector<int> left_half, right_half; shift(0, m); for (auto i : idxs) { int ret = my_Query(i + 1); if (ret == prv) { ans[i] = m; left_half.pb(i); } else { right_half.pb(i); } prv = ret; } go(l, m - 1, left_half); go(m + 1, r, right_half); }; go(0, N - 1, others); for (int i : others) { my_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...