제출 #1159332

#제출 시각아이디문제언어결과실행 시간메모리
1159332OI_AccountPark (JOI17_park)C++20
20 / 100
186 ms728 KiB
#include "park.h" #include <bits/stdc++.h> using namespace std; const int N = 1400; static int Place[1400]; int n; bitset<N + 1> mark; bool query(int u, int v) { if (u > v) swap(u, v); for (int i = 0; i < n; i++) Place[i] = mark[i]; return Ask(u, v, Place); } void write(int u, int v) { //cout << u << ' ' << v << endl; if (u > v) swap(u, v); Answer(u, v); } bool isAdj(int u, int v) { mark.reset(); mark[u] = mark[v] = 1; return query(u, v); } void solveSub1() { for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) if (isAdj(i, j)) write(i, j); } int cmpU, cmpV; bool cmp(int u, int v) { mark.set(); mark[v] = 0; return query(cmpU, u); } void solveSub2() { vector<int> vec; for (int i = 1; i < n - 1; i++) vec.push_back(i); cmpU = 0; cmpV = n - 1; sort(vec.begin(), vec.end(), cmp); if (vec.size()) { write(0, vec[0]); write(vec.back(), n - 1); } for (int i = 0; i + 1 < vec.size(); i++) write(vec[i], vec[i + 1]); } mt19937 rng(123); bool isMiddle(int u, int w, int v) { mark.set(); mark[w] = 0; return query(u, v) == false; } bool col[N + 10]; void solveTree(vector<int> vec) { /*cout << "hi " << ": "; for (auto x: vec) cout << x << ' '; cout << endl;*/ if (vec.size() <= 2) { if (vec.size() == 2) write(vec[0], vec[1]); return; } int u = vec[rng() % (int) vec.size()]; shuffle(vec.begin(), vec.end(), rng); vector<int> type[10]; int cnt = 0; for (auto x: vec) if (x != u && isAdj(x, u)) { type[++cnt].push_back(x); col[x] = true; write(x, u); } shuffle(type + 1, type + cnt + 1, rng); for (auto x: vec) if (x != u && !col[x]) { for (int t = 1; t <= cnt; t++) if (t == cnt || isMiddle(x, type[t][0], u)) { type[t].push_back(x); break; } } for (int t = 1; t <= cnt; t++) { col[type[t][0]] = 0; solveTree(type[t]); } } void solveSubTree() { vector<int> vec; for (int i = 0; i < n; i++) vec.push_back(i); solveTree(vec); } void Detect(int T, int N) { n = N; if (T == 1) solveSub1(); else if (T != 5) solveSubTree(); }
#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...