Submission #521787

#TimeUsernameProblemLanguageResultExecution timeMemory
521787qwerasdfzxclPark (JOI17_park)C++14
67 / 100
325 ms860 KiB
#include "park.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; static int Place[1400]; int a[2020]; int ask(int x, int y){return Ask(min(x, y), max(x, y), Place);} set<int> st[2020]; void answer(int x, int y){ if (x>y) swap(x, y); if (st[x].find(y)!=st[x].end()) return; st[x].insert(y); Answer(x, y); } void _sort(int n){ vector<int> ans = {0}; for (int i=1;i<n;i++){ fill(Place, Place+1400, 1); int l = 1, r = (int)ans.size()-1, idx = 0; while(l<=r){ int m = (l+r)>>1; for (int j=m;j<(int)ans.size();j++) Place[ans[j]] = 0; if (ask(0, i)) r = m-1; else l = m+1, idx = m; for (int j=m;j<(int)ans.size();j++) Place[ans[j]] = 1; } ans.insert(ans.begin()+idx+1, i); } for (int i=0;i<n;i++) a[i] = ans[i]; } vector<pair<int, int>> D; vector<int> N0; int cnt = 1; void Find(int x){ //for (auto &p:D) printf("(%d, %d) ", p.first, p.second); //printf("\n"); fill(Place, Place+1400, 0); for (auto &p:D) Place[p.first] = 1; Place[x] = 1; int l = 1, r = cnt-1, idx = 0; while(l<=r){ int m = (l+r)>>1; for (int i=m;i<cnt;i++) Place[D[i].first] = 0; if (!ask(0, x)) idx = m, l = m+1; else r = m-1; for (int i=m;i<cnt;i++) Place[D[i].first] = 1; } answer(D[idx].first, x); if (idx==0){ N0.push_back(x); } else{ Place[D[idx].first] = 0; int prv = idx, ans = -1; while(ask(0, x)){ l = prv+1, r = cnt-1, ans = -1; while(l<=r){ int m = (l+r)>>1; for (int i=m;i<cnt;i++) Place[D[i].first] = 0; if (!ask(0, x)) ans = m, l = m+1; else r = m-1; for (int i=m;i<cnt;i++) Place[D[i].first] = 1; } assert(ans!=-1); answer(D[ans].first, x); Place[D[ans].first] = 0; prv = ans; } } int pt = 0; for (;pt<cnt;pt++) if (D[pt].second > D[idx].second+1) break; D.insert(D.begin()+pt, make_pair(x, D[idx].second+1)); cnt++; } void solveN0(int n){ fill(Place, Place+1400, 0); Place[0] = 1; for (auto &x:N0) Place[x] = 1; for (int i=1;i<n;i++) if (!Place[i]){ Place[i] = 1; if (ask(0, i)){ for (auto &x:N0) Place[x] = 0; for (auto &x:N0){ Place[x] = 1; if (ask(0, i)) answer(x, i); Place[x] = 0; } for (auto &x:N0) Place[x] = 1; } Place[i] = 0; } fill(Place, Place+1400, 0); for (int i=0;i<(int)N0.size();i++){ for (int j=i+1;j<(int)N0.size();j++){ Place[N0[i]] = Place[N0[j]] = 1; if (ask(N0[i], N0[j])) answer(N0[i], N0[j]); Place[N0[i]] = Place[N0[j]] = 0; } } } void Detect(int T, int N) { for (int i=1;i<N;i++) a[i] = i; _sort(N); //printf("A = "); //for (int i=0;i<N;i++) printf("%d ", a[i]); //printf("\n"); D.emplace_back(0, 0); for (int i=1;i<N;i++){ Find(a[i]); } solveN0(N); }
#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...