Submission #1171870

#TimeUsernameProblemLanguageResultExecution timeMemory
1171870browntoadMouse (info1cup19_mouse)C++20
45 / 100
81 ms420 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

void solve(int N){
	mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

	vector<int> otot(N); // out
	REP(i, N) otot[i] = i+1; // ONE_BASE!!

	if (N <= 2){
		if (N == 1){
			query(otot);
			return;
		}
		int ret = query(otot);
		if (ret == 0){
			swap(otot[0], otot[1]);
			query(otot);
		}
		return;
	}

	vector<int> rem = otot; 
	fill(ALL(otot), -1);
	
	vector<int> ids = vector<int> (N);
	REP(i, N) ids[i] = i; // ZERO BASE!

	int okid = -1, plea = 0, pleatmp = 0;
	vector<int> trem, tid;
	vector<int> blacklist(N);
	while(1){
		shuffle(ALL(rem), rng);
		REP(j, SZ(rem)){
			otot[ids[j]] = rem[j];
		}
		fill(ALL(blacklist), 0);
		int ret = query(otot), tret;
		if (ret == N) return;
		if (ret == plea) continue; // no new
		pleatmp = ret-plea;

		if (SZ(rem) < N){ // just match with the okid
			REP(j, SZ(rem)){
				swap(otot[ids[j]], otot[okid]);
				tret = query(otot); if (tret == N) return;
				swap(otot[ids[j]], otot[okid]);

				if (tret - ret == -2){
					blacklist[j] = 1;
					pleatmp--; if (pleatmp == 0) break;
				}
			}
		}
		else{
			swap(otot[0], otot[1]);
			tret = query(otot); if (tret == N) return;
			swap(otot[0], otot[1]);

			if (tret - ret == -2){ // both are 1s
				blacklist[0] = blacklist[1] = 1;
				pleatmp-=2; if (pleatmp == 0) break;

				okid = 0;
				FOR(j, 2, N){
					swap(otot[ids[j]], otot[okid]);
					tret = query(otot); if (tret == N) return;
					swap(otot[ids[j]], otot[okid]);

					if (tret - ret == -2){
						blacklist[j] = 1;
						pleatmp--; if (pleatmp == 0) break;
					}
				}				
			}
			else if (tret - ret >= 0){ // both are fails
				FOR(j, 2, N){
					swap(otot[0], otot[j]);
					tret = query(otot); if (tret == N) return;
					swap(otot[0], otot[j]);
					if (tret - ret == -1){
						okid = j;
						blacklist[j] = 1;
						pleatmp--; if (pleatmp == 0) break;
					}
				}
			}
			else{
				swap(otot[1], otot[2]);
				tret = query(otot); if (tret == N) return;
				swap(otot[1], otot[2]);
				if (tret - ret == -1){ // either 101 or 010
					swap(otot[0], otot[2]);
					tret = query(otot); if (tret == N) return;
					swap(otot[0], otot[2]);

					if (tret - ret == -2){
						okid = 0;
						blacklist[0] = blacklist[2] = 1;
						pleatmp -= 2;
					}
					else{
						okid = 1;
						blacklist[1] = 1;
						pleatmp--;
					}
				}
				else if (tret - ret  == -2){
					okid = 1;
					blacklist[1] = blacklist[2] = 1;
					pleatmp -= 2;
				}
				else{
					okid = 0;
					blacklist[0] = 1;
					pleatmp--;
				}

				FOR(j, 3, N){
					if (pleatmp == 0) break;
					swap(otot[ids[j]], otot[okid]);
					tret = query(otot); if (tret == N) return;
					swap(otot[ids[j]], otot[okid]);

					if (tret - ret == -2){
						blacklist[j] = 1;
						pleatmp--;
					}
				}
			}
		}


		trem.clear(); tid.clear();
		REP(j, SZ(rem)){
			if (!blacklist[j]) {
				trem.pb(rem[j]);
				tid.pb(ids[j]);
			}
			else{
				plea++;
				otot[ids[j]] = rem[j];
			}
		}
		rem = trem;
		ids = tid;
	}
}

#ifdef TOAD
signed main(){
	IOS();
	int n; cin>>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...