Submission #1100776

#TimeUsernameProblemLanguageResultExecution timeMemory
1100776Kirill22Mouse (info1cup19_mouse)C++17
48 / 100
140 ms960 KiB
#include "bits/stdc++.h" using namespace std; //#include "debug.h" int query(vector<int> q); int get(vector<int> q) { for (auto& x : q) { x++; } int res = query(q); if (res == (int) q.size()) { exit(0); } return res; } mt19937 gen(22); void solve(int n) { if (n == 1) { get({1}); return; } vector<int> p(n); std::iota(p.begin(), p.end(), 0); while (get(p) > 0) { std::shuffle(p.begin(), p.end(), gen); } vector<int> used(n); int cur = 0; // int iter = 0; while (cur < n) { // if (iter ++ > 10) break; vector<int> need; for (int i = 0; i < n; i++) { if (!used[i]) { need.push_back(i); } } const int m = (int) need.size(); vector<vector<pair<int, int>>> qu; if (m % 2 == 0) { // 0 1 2 3 4 5 for (int i = 0; i + 1 < m; i++) { qu.push_back({{i, m - 1}}); for (int j = 0; j + 1 < m; j++) { if (j == i) { continue; } int j2 = 2 * i - j; j2 %= (m - 1); j2 += m - 1; j2 %= m - 1; if (j < j2) { qu.back().push_back({j, j2}); } } } } else { // 0 1 2 3 4 5 6 for (int i = 0; i < m; i++) { qu.push_back({}); for (int j = 0; j < m; j++) { if (j == i) { continue; } int j2 = 2 * i - j; j2 %= m; j2 += m; j2 %= m; if (j < j2) { qu.back().push_back({j, j2}); } } } } for (auto& arr : qu) { for (auto& [x, y] : arr) { x = need[x]; y = need[y]; } } // debug(need, p, cur, qu); for (auto& arr : qu) { auto q = p; for (auto [x, y] : arr) { swap(q[x], q[y]); } int res = get(q); if (res > cur) { int l = -1, r = (int) arr.size() - 1, value = res; while (l + 1 < r) { int m = (l + r) / 2; q = p; for (int i = 0; i <= m; i++) { swap(q[arr[i].first], q[arr[i].second]); } int res2 = get(q); if (res2 > cur) { r = m; value = res2; } else { l = m; } } auto [x, y] = arr[r]; if (value - cur == 2) { swap(p[x], p[y]); used[x] = used[y] = 1; } else { swap(p[x], p[y]); cur = value; int j = 0; while (j < n && (!used[j] || j == x || j == y)) { j++; } if (j < n) { q = p; swap(q[x], q[j]); value = get(q); if (cur - value == 2) { used[x] = 1; } else { used[y] = 1; } } else { j = 0; while (j == x || j == y) j++; q = p; swap(q[x], q[j]); value = get(q); if (cur - value == 1) { used[x] = 1; } else { used[y] = 1; } } } break; } } cur = std::accumulate(used.begin(), used.end(), 0); } get(p); } //vector<int> want = {1, 5, 3, 4, 2}; // //int query(vector<int> q) { // for (auto& x : q) { // cout << x << " "; // } // cout << endl; // int cnt = 0; // for (int i = 0; i < (int) q.size(); i++) { // cnt += q[i] == want[i]; // } // return cnt; //} // //int main() { // solve(want.size()); //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...