Submission #414213

#TimeUsernameProblemLanguageResultExecution timeMemory
414213errorgornMouse (info1cup19_mouse)C++17
100 / 100
108 ms256 KiB
#include "grader.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define ii pair<ll,ll> #define puf push_front #define pof pop_front #define pub push_back #define pob pop_back #define lb lower_bound #define ub upper_bound #define rep(x,s,e) for (auto x=s-(s>e);x!=e-(s>e);(s<e?x++:x--)) #define all(x) (x).begin(),(x).end() #define sz(x) (int) (x).size() mt19937 rng(342759); int n; vector<int> ans; vector<int> pos; //which pos idk void shuf(){ rep(x,0,sz(pos)){ swap(ans[pos[x]],ans[pos[rng()%(x+1)]]); } } const int LIM=2; void solve(int N) { n=N; rep(x,1,n+1) ans.pub(x); rep(x,0,n) pos.pub(x); int correct=0; int num=0; int curr; do{ shuf(); curr=query(ans); num++; if (curr==n) return; } while (curr); while (true){ vector<int> idx; int avail; do{ rep(x,0,sz(pos)) swap(pos[x],pos[rng()%(x+1)]); idx.clear(); for (int x=0;x<sz(pos)-1;x+=2) idx.pub(x); for (auto &it:idx) swap(ans[pos[it]],ans[pos[it+1]]); curr=query(ans); if (curr==n) return; avail=curr-correct; for (auto &it:idx) swap(ans[pos[it]],ans[pos[it+1]]); } while ((avail<LIM && n-correct>5) || avail==0); vector<int> npos; while (avail){ idx.clear(); for (int x=0;x<sz(pos)-1;x+=2) idx.pub(x); int nc=correct+avail; while (sz(idx)!=1){ int temp=sz(idx)/2; rep(x,0,temp) swap(ans[pos[idx[x]]],ans[pos[idx[x]+1]]); curr=query(ans); if (curr==n) return; bool left=true; if (curr==correct) left=false; rep(x,0,temp) swap(ans[pos[idx[x]]],ans[pos[idx[x]+1]]); vector<int> idx2; if (left){ rep(x,0,temp) idx2.pub(idx[x]); nc=curr; } else{ rep(x,temp,sz(idx)) idx2.pub(idx[x]); nc=nc-(curr-correct); } swap(idx,idx2); } swap(ans[pos[idx[0]]],ans[pos[idx[0]+1]]); curr=nc; if (curr==correct+2){ correct+=2; avail-=2; } else{ int temp; if (!npos.empty()) temp=npos.front(); else if (idx[0]==0) temp=pos.back(); else temp=pos.front(); swap(ans[pos[idx[0]]],ans[temp]); curr=query(ans); if (curr==n) return; swap(ans[pos[idx[0]]],ans[temp]); if (curr==correct){ npos.pub(pos[idx[0]+1]); } else{ npos.pub(pos[idx[0]]); } correct++; avail--; } pos.erase(pos.begin()+idx[0]); pos.erase(pos.begin()+idx[0]); } for (auto &it:npos) pos.pub(it); //cout<<"num left: "<<sz(pos)<<endl; //for (auto &it:ans) cout<<it<<" "; cout<<endl; //for (auto &it:pos) cout<<it<<" "; cout<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...