Submission #1171926

#TimeUsernameProblemLanguageResultExecution timeMemory
1171926browntoadMouse (info1cup19_mouse)C++20
100 / 100
45 ms3040 KiB
#include <bits/stdc++.h> #include "grader.h" using namespace std; #define ll long long // #define int ll #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define REP(i, n) FOR(i, 0, n) #define REP1(i, n) FOR(i, 1, n+1) #define RREP(i, n) for (int i = (n)-1; i >= 0; i--) #define pii pair<int, int> #define f first #define s second #define pb push_back #define ALL(x) (x).begin(), (x).end() #define SZ(x) (int)((x).size()) // #define TOAD #ifdef TOAD #define IOS() #else #define IOS() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0) #endif const ll maxn = 1e5+5; const ll mod = 1e9+7; const ll inf = 1ll<<60; #ifdef TOAD int query(vector<int> pus){ for (auto x:pus) cout<<x<<' '; cout<<endl<<flush; int in; cin>>in; return in; } #endif vector<vector<pii>> round_robin(int N){ // 0-base vector<int> tmp(N); if (N&1) tmp.pb(0); iota(ALL(tmp), 0); if (N&1){ tmp[N] = -1; // bye } int dnda = SZ(tmp); vector<vector<pii>> ret; REP(i, dnda-1){ vector<pii> pp; REP(j, dnda/2){ if (tmp[dnda-j-1] != -1){ pp.pb({tmp[j], tmp[dnda-j-1]}); } } ret.pb(pp); // shift int tval = tmp[0]; REP(j, dnda-2){ tmp[j] = tmp[j+1]; } tmp[dnda-2] = tval; } return ret; } static vector<int> g[maxn]; void solve(int N){ mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); vector<int> derang(N); REP(i, N) derang[i] = i+1; if (N <= 2){ if (N == 1){ query(derang); return; } int ret = query(derang); if (ret == 0){ swap(derang[0], derang[1]); query(derang); } return; } int ret; while(1){ shuffle(ALL(derang), rng); ret = query(derang); if (ret == N) return; if (ret == 0) break; } vector<vector<pii>> robin = round_robin(N); vector<pii> e; // edges of the cycles, at most N for(auto vc:robin){ int m = SZ(vc), ptr = 0; while(ptr < m){ FOR(i, ptr, m) swap(derang[vc[i].f], derang[vc[i].s]); ret = query(derang); if (ret == N) return; FOR(i, ptr, m) swap(derang[vc[i].f], derang[vc[i].s]); if (ret == 0) break; // exists a pair that changes p int l = ptr, r = m-1; while(l < r){ int mid = l+r>>1; FOR(i, ptr, mid+1) swap(derang[vc[i].f], derang[vc[i].s]); ret = query(derang); if (ret == N) return; FOR(i, ptr, mid+1) swap(derang[vc[i].f], derang[vc[i].s]); if (ret == 0){ l = mid+1; } else r = mid; } e.pb(vc[l]); ptr = l+1; } } for (auto pp:e){ // still 0-base g[pp.f].pb(pp.s); g[pp.s].pb(pp.f); } vector<bool> occ(N); int moo = 0; REP(i, N){ if (occ[i]) continue; vector<int> cyc; int cur = i; do{ occ[cur] = 1; cyc.pb(cur); bool fnd = 0; for (auto v:g[cur]){ if (!occ[v]){ cur = v; fnd = 1; break; } } if (!fnd) break; } while(cur != i); if (SZ(cyc) == 2){ swap(derang[cyc[0]], derang[cyc[1]]); moo += 2; } else{ vector<int> tmpderang = derang; REP(j, SZ(cyc)){ tmpderang[cyc[j]] = derang[cyc[(j+1)%SZ(cyc)]]; } ret = query(tmpderang); if (ret == N) return; if (ret > moo){ derang = tmpderang; } else{ REP(j, SZ(cyc)){ tmpderang[cyc[j]] = derang[cyc[(j+SZ(cyc)-1)%SZ(cyc)]]; } derang = tmpderang; } moo += SZ(cyc); } } assert(moo == N); query(derang); } #ifdef TOAD signed main(){ IOS(); int n; cin>>n; round_robin(n); //cout<<n/0.63 * n/2<<endl; solve(n); } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...