Submission #1256325

#TimeUsernameProblemLanguageResultExecution timeMemory
1256325gelastropodLibrary (JOI18_library)C++20
100 / 100
111 ms440 KiB
#include <bits/stdc++.h>
#include "library.h"
using namespace std;

int sum(vector<int> V) {
	int ans = 0;
	for (int i : V) ans += i;
	return ans;
}

int qry(vector<int> V) {
	if (sum(V) == 0) return 0;
	return Query(V);
}

void Solve(int N) {
	vector<int> ans(N, 0), diffind, unknown;
	for (int i = 0; i < N; i++) unknown.push_back(i);
	for (int _ = 0; _ < (N + 1) / 2; _++) {
		diffind.clear();
		for (int i = 0; i < 10; i++) {
			vector<int> ask1(N, 0), ask2(N, 0);
			for (int j = 0; j < unknown.size(); j++) {
				ask1[unknown[j]] = (bool)(j & (1LL << i));
				ask2[unknown[j]] = !(bool)(j & (1LL << i));
			}
			int res1 = qry(ask1), res2 = qry(ask2);
			if (res1 == res2 + 1) {
				ans[_] += (1LL << i);
				ans[N - 1 - _] += (1LL << i);
			}
			else if (res1 == res2)
				diffind.push_back(i);
		}
		if (diffind.empty()) {
			ans[_] = unknown[ans[_]];
			break;
		}
		if (_) {
			vector<int> ask1(N, 0), ask2(N, 0);
			for (int i = 0; i < unknown.size(); i++) {
				ask1[unknown[i]] = (bool)(i & (1LL << diffind.back()));
				ask2[unknown[i]] = (bool)(i & (1LL << diffind.back()));
			}
			for (int i = 0; i < _; i++) ask1[ans[i]] = 1, ask2[ans[N - 1 - i]] = 1;
			int res1 = qry(ask1), res2 = qry(ask2);
			if (res2 == res1 + 1) ans[_] += (1LL << diffind.back());
			else ans[N - 1 - _] += (1LL << diffind.back());
		}
		else ans[N - 1 - _] += (1LL << diffind.back());
		for (int i = 0; i < diffind.size() - 1; i++) {
			vector<int> ask1(N, 0), ask2(N, 0);
			for (int j = 0; j < unknown.size(); j++) {
				if ((bool)(j & (1LL << diffind[i])) ^ (bool)(j & (1LL << diffind.back()))) ask1[unknown[j]] = 1;
				else ask2[unknown[j]] = 1;
			}
			int res1 = qry(ask1), res2 = qry(ask2);
			if (res1 == res2 - 1) {
				ans[_] += ((bool)(ans[_] & (1LL << diffind.back())) << diffind[i]);
				ans[N - 1 - _] += ((bool)(ans[N - 1 - _] & (1LL << diffind.back())) << diffind[i]);
			}
			else {
				ans[_] += (!(bool)(ans[_] & (1LL << diffind.back())) << diffind[i]);
				ans[N - 1 - _] += (!(bool)(ans[N - 1 - _] & (1LL << diffind.back())) << diffind[i]);
			}
		}
		ans[_] = unknown[ans[_]];
		ans[N - 1 - _] = unknown[ans[N - 1 - _]];
		for (int i = 0; i < unknown.size(); i++) {
			if (unknown[i] == ans[_] || unknown[i] == ans[N - 1 - _]) {
				unknown.erase(unknown.begin() + i);
				i--;
			}
		}
	}
	for (int i = 0; i < N; i++) ans[i]++;
	Answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...