Submission #917021

#TimeUsernameProblemLanguageResultExecution timeMemory
917021mpb_동굴 (IOI13_cave)C++17
0 / 100
247 ms852 KiB
#include "cave.h"
#include <vector>
#include <iostream>
#include <string.h>

void exploreCave(int N) {
	using namespace std;
	auto guess = [&](vector<int>& g) {
		int s[N];
		for (int i = 0; i < N; i++) {
			s[i] = g[i];
		}
		int res = tryCombination(s);
		return (res == -1 ? 1e9 : res);
	};
	vector<int> ans(N), where(N), fix(N);
	auto build = [&](int l, int r) {
		vector<int> g = ans;
		for (int i = l; i <= r; i++) {
			if (fix[i]) g[i] = ans[i] ^ 1;
		}
		return g;
	};
	int score = guess(ans);
	for (int i = 0; i < N; i++) {
		if (score <= i) {
			int l = 0, r = N - 1, loc = -1;
			while (l <= r) {
				int m = l + (r - l) / 2;
				vector<int> g = build(l, m);
				int score = guess(g);
				if (score >= i) {
					loc = m;
					r = m - 1;
				} else {
					l = m + 1;
				}
			}
			fix[loc] ^= ans[loc];
			ans[loc] ^= ans[loc];
			where[i] = loc;
		} else {
			int l = 0, r = N - 1, loc = -1;
			while (l <= r) {
				int m = l + (r - l) / 2;
				vector<int> g = build(l, m);
				int score = guess(g);
				if (score < i) {
					loc = m;
					r = m - 1;
				} else {
					l = m + 1;
				}
			}
			fix[loc] ^= ans[loc];
			ans[loc] ^= ans[loc];
			where[i] = loc;
		}
	}
	int a[N], b[N];
	for (int i = 0; i < N; i++) {
		a[i] = ans[i];
		b[i] = where[i];
	}
	answer(a, b);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...