제출 #917028

#제출 시각아이디문제언어결과실행 시간메모리
917028mpb_Cave (IOI13_cave)C++17
100 / 100
242 ms848 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] ^= 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] = 1;
			ans[loc] ^= 1;
			where[loc] = i;
		} 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] = 1;
			where[loc] = i;
		}
		score = guess(ans);
	}
	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...