Submission #1326116

#TimeUsernameProblemLanguageResultExecution timeMemory
1326116ppmn_6Library (JOI18_library)C++20
100 / 100
119 ms412 KiB
#include "bits/stdc++.h"
#include "library.h"
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
 
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
 
// https://codeforces.com/blog/entry/79148
class Timer: chrono::high_resolution_clock {
    const time_point start_time;
public:
    Timer(): start_time(now()) {}
    rep elapsed_time() const {
		return chrono::duration_cast<chrono::milliseconds>(now() - start_time).count();
	}
} timer;

void Solve(int n) {
	vector<bool> vis(n + 1, 0);
	deque<int> ans(1, 1);
	auto ask = [&] (int l, int r, int x) {
		int cnt = 0;
		vector<int> m(n, 0);
		for (int i = l; i <= r; i++) {
			if (!vis[i]) {
				m[i - 1] = 1;
				cnt++;
			}
		}
		if (!cnt) {
			return false;
		}
		int res = Query(m);
		m[x - 1] = 1;
		return Query(m) <= res;
	};
	vis[1] = 1;
	int lb = 1, rb = 1, rem = n - 1;
	auto find_m = [&] (int l, int r, int cur) {
		int cnt = 0;
		for (int i = l; i <= r; i++) {
			if (!vis[i]) {
				cnt++;
				if (cnt == cur) {
					return i;
				}
			}
		}
	};
	while (true) {
		int l = 1, r = n, cur = rem;
		while (cur > 3) {
			int m = find_m(l, r, cur / 2);
			if (ask(m, r, rb)) {
				l = m;
				cur = cur - cur / 2 + 1;
			}
			else {
				r = m;
				cur = cur / 2;
			}
		}
		int res = -1;
		for (int i = l; i <= r; i++) {
			if (!vis[i] && ask(i, i, rb)) {
				res = i;
				break;
			}
		}
		if (res == -1) {
			break;
		}
		vis[res] = 1;
		ans.push_back(res);
		rb = res;
		rem--;
	}
	while (true) {
		if (ans.size() == n) {
			break;
		}
		int l = 1, r = n, cur = rem;
		while (cur > 3) {
			int m = find_m(l, r, cur / 2);
			if (ask(m, r, lb)) {
				l = m;
				cur = cur - cur / 2 + 1;
			}
			else {
				r = m;
				cur = cur / 2;
			}
		}
		int res;
		for (int i = l; i <= r; i++) {
			if (!vis[i] && ask(i, i, lb)) {
				res = i;
				break;
			}
		}
		vis[res] = 1;
		ans.push_front(res);
		lb = res;
		rem--;
	}
	vector<int> ret;
	for (auto &x : ans) {
		ret.push_back(x);
	}
	Answer(ret);
}

Compilation message (stderr)

library.cpp: In lambda function:
library.cpp:51:9: warning: control reaches end of non-void function [-Wreturn-type]
   51 |         };
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...