Submission #1301902

#TimeUsernameProblemLanguageResultExecution timeMemory
1301902PakinDioxideCave (IOI13_cave)C++17
100 / 100
801 ms1104 KiB
#include "cave.h" #include <bits/stdc++.h> using namespace std; int n; int ask(int a[]) { int k = tryCombination(a); return (k == -1 ? n : k); } void exploreCave(int N) { n = N; set <int> s; for (int i = 0; i < n; i++) s.emplace(i); vector <pair <int, int>> v; function <int(int, int, int, int)> sol = [&] (int k, int l, int r, int val) { if (l == r) { auto it = s.begin(); for (int i = 0; i < l; i++) it = next(it); return *it; } int q[n]; for (auto &e : q) e = !val; for (auto &[x, y] : v) q[x] = y; auto it = s.begin(); int m = l + (r-l)/2; for (int i = 0; i < l; i++) it = next(it); for (int i = l; i <= m; i++) q[*it] = val, it = next(it); // cout << l << ' ' << r << '\n'; // for (auto &e : q) cout << e << ' '; cout << '\n'; if (ask(q) >= k) return sol(k, l, m, val); else return sol(k, m+1, r, val); }; for (int i = 0; i < n; i++) { int A[n], B[n]; for (auto &e : A) e = 0; for (auto &e : B) e = 0; for (auto &[x, y] : v) A[x] = y, B[x] = y; int p = ask(A); int idx = -1; if (p >= i+1) v.emplace_back(idx = sol(i+1, 0, (int) s.size()-1, 0), 0); else v.emplace_back(idx = sol(i+1, 0, (int) s.size()-1, 1), 1); s.erase(s.find(idx)); // cout << i << ' ' << idx << ' ' << !(p == -1 || p == i+1) << '\n'; } int a1[n], a2[n]; for (int i = 0; i < n; i++) a1[v[i].first] = v[i].second, a2[v[i].first] = i; answer(a1, a2); } /* must do O(NlogN) */
#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...