제출 #1190771

#제출 시각아이디문제언어결과실행 시간메모리
1190771DanielPr8The Collection Game (BOI21_swaps)C++20
5 / 100
7 ms484 KiB
#include <bits/stdc++.h> using namespace std; using ll = int; using vll = vector<ll>; using vvl = vector<vll>; using pll = pair<ll,ll>; using vpl = vector<pll>; using vvp = vector<vpl>; #define f first #define s second #define pb push_back #define all(v) v.begin(),v.end() #include "swaps.h" /*void __attribute__((noreturn)) __attribute__((format(printf, 1, 2))) result(const char *msg, ...) { va_list args; va_start(args, msg); vfprintf(stderr, msg, args); fprintf(stderr, "\n"); va_end(args); exit(0); } namespace { int N, V, visits; set<int> queryIndices; vector<int> A, queryResult; } void schedule(int i, int j) { printf("schedule(%d, %d)\n", i, j); fflush(stdout); if (i < 1 || i > N || j < 1 || j > N || i == j) result("Invalid schedule"); if (queryIndices.find(i) != queryIndices.end() || queryIndices.find(j) != queryIndices.end()) result("Invalid schedule"); queryIndices.insert(i); queryIndices.insert(j); int s; if (scanf("%d", &s) != 1 || (s != 0 && s != 1)) result("Invalid input"); if (s) swap(A[i], A[j]); queryResult.push_back(A[i] < A[j]); } vector<int> visit() { printf("visit(): {"); for (int i = 0; i < (int)queryResult.size(); i++) { printf("%d", queryResult[i]); if (i + 1 != (int)queryResult.size()) printf(", "); } printf("}\n"); fflush(stdout); visits++; if (visits > V) result("Out of visits"); vector<int> res = queryResult; queryIndices.clear(); queryResult.clear(); return res; } void answer(vector<int> r) { printf("answer({"); for (int i = 0; i < (int)r.size(); i++) { printf("%d", r[i]); if (i + 1 != (int)r.size()) printf(", "); } printf("})\n"); if ((int)r.size() != N) result("Invalid answer"); for (int i = 0; i < N; i++) { if (r[i] < 1 || r[i] > N) result("Invalid answer"); if (A[r[i]] != i + 1) result("Wrong answer"); } result("Correct: %d visit(s) used", visits); }*/ vvl calc(vpl ran){ if(ran.empty())return {}; ll n = ran.size(); vpl ran2; for(ll i = 0; i < n; ++i){ auto [a,b]=ran[i]; if(a+1<b){ ran2.pb({a, (a+b)/2}); ran2.pb({(a+b)/2, b}); } } vvl ret = calc(ran2); vvl ans(n); vector<pair<vll,vll>> sd(n, {{},{}}); ll j=0; for(ll i = n-1; i >= 0; --i){ auto [a,b]=ran[i]; if(a+1<b){ sd[i].f=ret.back(); ret.pop_back(); sd[i].s=ret.back(); ret.pop_back(); } else{ ans[i]={a}; j++; } } ll cnt; for(;j < n;){ cnt=0; for(ll i = 0; i < n; ++i){ if(sd[i].f.size()>0 && sd[i].s.size()>0){ cnt++; schedule(sd[i].f.back(), sd[i].s.back()); } else if(sd[i].f.size()+sd[i].s.size()>0){ ++j; while(sd[i].f.size()>0){ ans[i].pb(sd[i].f.back()); sd[i].f.pop_back(); } while(sd[i].s.size()>0){ ans[i].pb(sd[i].s.back()); sd[i].s.pop_back(); } } } if(cnt==0)continue; vll pr = visit(); for(ll i = n-1; i >= 0; --i){ if(sd[i].f.size()>0 && sd[i].s.size()>0){ if(pr.back()==0){ ans[i].pb(sd[i].f.back()); sd[i].f.pop_back(); } else{ ans[i].pb(sd[i].s.back()); sd[i].s.pop_back(); } pr.pop_back(); } } cnt=0; for(ll i = 0; i < n; ++i){ if(sd[i].f.size()>1){schedule(sd[i].f[sd[i].f.size()-1], sd[i].f[sd[i].f.size()-2]);cnt++;} if(sd[i].s.size()>1){schedule(sd[i].s[sd[i].s.size()-1], sd[i].s[sd[i].s.size()-2]);cnt++;} } if(cnt==0)continue; vll qr = visit(); for(ll i = n-1; i >= 0; --i){ if(sd[i].s.size()>1){ if(qr.back()==1)swap(sd[i].s[sd[i].s.size()-1], sd[i].s[sd[i].s.size()-2]); qr.pop_back(); } if(sd[i].f.size()>1){ if(qr.back()==1)swap(sd[i].f[sd[i].f.size()-1], sd[i].f[sd[i].f.size()-2]); qr.pop_back(); } } } for(ll i = 0; i < n; ++i)reverse(all(ans[i])); return ans; } void solve(int n, int v){ answer(calc({{1,n+1}})[0]); } /*int main() { if(scanf("%d %d", &N, &V) != 2 || N < 1 || V < 0) result("Invalid input"); A.resize(N + 1); for (int i = 1; i <= N; i++) { int x; if (scanf("%d", &x) != 1 || x < 1 || x > N || A[x]) result("Invalid input"); A[x] = i; } solve(N, V); result("No answer"); }*/
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...