Submission #1306841

#TimeUsernameProblemLanguageResultExecution timeMemory
1306841KickingKunLibrary (JOI18_library)C++20
100 / 100
112 ms492 KiB
#include <bits/stdc++.h> #include "library.h" using namespace std; int N; vector <int> merge(vector <int> A, vector <int> B) { vector <int> ask(N); ask[A.back()] = ask[B.front()] = 1; if (Query(ask) == 1) { for (int x: B) A.emplace_back(x); return A; } ask[B.front()] = 0; ask[B.back()] = 1; if (Query(ask) == 1) { reverse(B.begin(), B.end()); for (int x: B) A.emplace_back(x); return A; } ask[A.back()] = 0; ask[A.front()] = 1; if (Query(ask) == 1) { for (int x: A) B.emplace_back(x); return B; } reverse(B.begin(), B.end()); for (int x: A) B.emplace_back(x); return B; } void Solve(int n) { N = n; vector <vector <int>> group(N); for (int i = 0; i < N; i++) group[i].emplace_back(i); for (int times = 1; times < N; times++) { int posL = 0, posR = group.size() - 1; int low = 1, high = group.size() - 2; while (low <= high) { int mid = (low + high) >> 1; vector <int> ask(N); for (int i = 0; i <= mid; i++) for (int p: group[i]) ask[p] = 1; if (Query(ask) == mid + 1) low = mid + 1; else high = (posR = mid) - 1; } low = 1, high = posR - 1; while (low <= high) { int mid = (low + high) >> 1; vector <int> ask(N); for (int i = mid; i <= posR; i++) for (int p: group[i]) ask[p] = 1; if (Query(ask) == posR - mid + 1) high = mid - 1; else low = (posL = mid) + 1; } group[posL] = merge(group[posL], group[posR]); swap(group[posR], group.back()); group.pop_back(); } // cerr << "Array: "; for (int &x: group[0]) { ++x; // cerr << x << ' '; } Answer(group[0]); } // Queries: 3(N - 1) + 2NlogN -> trung binh thap hon nhieu
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...