Submission #550334

#TimeUsernameProblemLanguageResultExecution timeMemory
550334LucaDantasPark (JOI17_park)C++17
20 / 100
725 ms712 KiB
// I haven't checked it in a tree because the sample doesn't have a tree example so I'll test if later if I get wa (which I'll probably get) #include "park.h" #include <bits/stdc++.h> using namespace std; mt19937 rng(random_device{}()); int rnd(int x) { return (rng() % x + x) % x; } constexpr int maxn = 1410; int ask[maxn]; int Ask2(int a, int b, int c[]) { if(a > b) swap(a, b); return Ask(a, b, c); } void Answer2(int a, int b) { if(a > b) swap(a, b); Answer(a, b); } int edge(int a, int b) { // ask if there is a direct edge between a and b memset(ask, 0, sizeof ask); ask[a] = ask[b] = 1; return Ask2(a, b, ask); } array<vector<int>, 2> group(int a, int b, vector<int> tot) { // we know there is an edge between a and b array<vector<int>, 2> ans = {vector<int>(1, b), vector<int>(1, a)}; int n = (int)(tot.size()); for(int i = 0; i < n; i++) { if(tot[i] == a || tot[i] == b) continue; memset(ask, 0, sizeof ask); for(int j = 0; j < n; j++) if(tot[j] != b) ask[tot[j]] = 1; ask[a] = 1, ask[b] = 0; // just to make sure ans[Ask2(a, tot[i], ask)].push_back(tot[i]); } return ans; // we return the elements that belong to A's subtree and those that belong to B's subtree } int find_edge(int a, vector<int> possible) { shuffle(possible.begin(), possible.end(), rng); for(int b : possible) if(b != a && edge(a, b)) return b; Answer(-1, -1); // assert(0); return -1; } void go(vector<int> possible) { if(possible.size() <= 1) return; if(possible.size() == 2) { Answer2(possible[0], possible[1]); return; } int a = possible[rnd(possible.size())]; int b = find_edge(a, possible); Answer2(a, b); array<vector<int>, 2> grp = group(a, b, possible); go(grp[0]); go(grp[1]); } void Detect(int T, int N) { if(T == 1) { for(int i = 0; i < N; i++) for(int j = i+1; j < N; j++) if(edge(i, j)) Answer2(i, j); return; } vector<int> all(N); iota(all.begin(), all.end(), 0); shuffle(all.begin(), all.end(), rng); go(all); }
#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...