Submission #502668

#TimeUsernameProblemLanguageResultExecution timeMemory
502668sidonMinerals (JOI19_minerals)C++17
85 / 100
48 ms2804 KiB
#include "minerals.h" #include <bits/stdc++.h> using namespace std; const int LIM = 43e3; int A[LIM], L, R = -1, last; bool in[LIM*2+1]; #define ask(Z) (last = Query(Z)) void extend(int lv, int rv) { for(int _ : {1, 0}){ for(int i = L; i <= R; ++i) if(!(lv <= i && i <= rv)) ask(A[i]); if(_) swap(L, lv), swap(R, rv); } } void dfs(int l, int r, vector<int> b) { if(r - l < 1) return; if(r - l < 2) return Answer(A[l], b[0]); int m = (l + r) / 2; if(r - m > m - l) ++m; extend(l, m-1); vector<int> bL, bR; for(int &i : b) { if((int)size(bL) == m - l) { bR.push_back(i); continue; } if((int)size(bR) == r - m) { bL.push_back(i); continue; } int prev = last; (prev == ask(i) ? bL : bR).push_back(i); in[i] ^= 1; } dfs(l, m, bL); dfs(m, r, bR); } void Solve(int N) { vector<int> b; for(int i = 1; i <= N * 2; ++i) { if(R == N - 1 || ask(i) < R + 2) { b.push_back(i); in[i] = 1; } else A[++R] = i; } dfs(0, N, b); }
#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...