Submission #895367

#TimeUsernameProblemLanguageResultExecution timeMemory
895367boxChameleon's Love (JOI20_chameleon)C++17
40 / 100
24 ms600 KiB
#include <bits/stdc++.h> #include "chameleon.h" using namespace std; #define ar array #define sz(v) int(std::size(v)) using i64 = long long; using vi = vector<int>; const int MAXN = 505 * 2; vi adj[MAXN]; int who[MAXN], nex[MAXN], pre[MAXN]; vi operator+(vi one, const vi two) { one.insert(end(one), begin(two), end(two)); return one; } bool interesting(vi one) { return Query(one) != sz(one); } void Solve(int N) { if (N <= 50) { for (int i = 1; i <= N * 2; i++) for (int j = i + 1; j <= N * 2; j++) if (Query({i, j}) == 1) { adj[i].push_back(j); adj[j].push_back(i); } } else { vi base(N); iota(begin(base), end(base), 1); for (int i = N + 1; i <= N * 2; i++) { vi v = base; while (interesting(v + vi{{i}})) { int low = 0, hi = sz(v) - 1; while (low < hi) { int m = (low + hi) / 2; interesting(vi(begin(v), begin(v) + m + 1)) ? hi = m : low = m + 1; } adj[v[low]].push_back(i); adj[i].push_back(v[low]); v.erase(begin(v), begin(v) + low + 1); } } } for (int i = 1; i <= N * 2; i++) { assert(sz(adj[i]) == 1 || sz(adj[i]) == 3); if (sz(adj[i]) == 1) { who[i] = adj[i][0]; } else { nex[i] = [&]() { if (Query({i, adj[i][0], adj[i][1]}) == 1) return adj[i][2]; if (Query({i, adj[i][0], adj[i][2]}) == 1) return adj[i][1]; return adj[i][0]; }(); pre[nex[i]] = i; } } for (int i = 1; i <= N * 2; i++) { if (!who[i]) { assert(sz(adj[i]) == 3); assert(pre[i] && nex[i]); who[i] = adj[i][0] ^ adj[i][1] ^ adj[i][2] ^ pre[i] ^ nex[i]; } if (who[i] < i) Answer(who[i], i); } }
#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...