제출 #296440

#제출 시각아이디문제언어결과실행 시간메모리
296440BTheroPark (JOI17_park)C++17
10 / 100
673 ms888 KiB
// chrono::system_clock::now().time_since_epoch().count() #include "park.h" #include<bits/stdc++.h> #define pb push_back #define eb emplace_back #define mp make_pair #define fi first #define se second #define all(x) (x).begin(), (x).end() #define debug(x) cerr << #x << " = " << x << endl; using namespace std; typedef long long ll; typedef pair<int, int> pii; mt19937 rnd(chrono::system_clock::now().time_since_epoch().count()); static int tmp_arr[2005]; static int n; bool ask(int a, int b, vector<int> &vec) { if (a > b) { swap(a, b); } fill(tmp_arr, tmp_arr + n, 0); for (int x : vec) { tmp_arr[x] = 1; } return Ask(a, b, tmp_arr); } void report(int a, int b) { if (a > b) { swap(a, b); } Answer(a, b); } namespace subtask1 { void solve() { for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { vector<int> S; S.pb(i); S.pb(j); if (ask(i, j, S)) { report(i, j); } } } } }; namespace subtask2 { vector<int> calc(int L, int R, vector<int> S) { vector<int> ret; if (S.size() == 2) { ret.pb(L); ret.pb(R); return ret; } int m = rnd() % S.size(); while (S[m] == L || S[m] == R) { m = rnd() % S.size(); } int M = S[m]; vector<int> A, B; A.pb(L); A.pb(M); B.pb(M); B.pb(R); for (int x : S) { if (x != L && x != M && x != R) { vector<int> S2 = S; S2.erase(find(all(S2), x)); if (ask(L, M, S2)) { B.pb(x); } else { A.pb(x); } } } A = calc(L, M, A); B = calc(M, R, B); for (int x : A) { ret.pb(x); } ret.pop_back(); for (int x : B) { ret.pb(x); } return ret; } void solve() { vector<int> S; for (int i = 0; i < n; ++i) { S.pb(i); } S = calc(0, n - 1, S); for (int i = 0; i + 1 < n; ++i) { report(S[i], S[i + 1]); } } }; namespace subtask3 { void go(vector<int> sub) { if ((int)sub.size() == 1) { return; } int v = sub[rnd() % (int)sub.size()]; vector<int> S = sub; S.erase(find(all(S), v)); vector<vector<int>> comp; for (int x : sub) { if (x != v) { int p = 0; vector<int> perm(comp.size()); iota(all(perm), 0); random_shuffle(all(perm)); while (p < (int)comp.size() && !ask(comp[perm[p]][0], x, S)) { ++p; if (p == 6) { break; } } if (p == (int)comp.size()) { comp.pb(vector<int>(1, x)); } else { comp[perm[p]].pb(x); } } } for (vector<int> nsub : comp) { int to = -1; for (int x : nsub) { S.clear(); S.pb(v); S.pb(x); if (ask(v, x, S)) { to = x; } } assert(to != -1); report(v, to); go(nsub); } } void solve() { vector<int> S; for (int i = 0; i < n; ++i) { S.pb(i); } go(S); } }; void Detect(int T, int N) { n = N; if (T == 1) { subtask1::solve(); } else { subtask3::solve(); } }
#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...