Submission #411490

#TimeUsernameProblemLanguageResultExecution timeMemory
411490MlxaCave (IOI13_cave)C++14
51 / 100
2086 ms452 KiB
#include "cave.h"
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define mp make_pair
#define mt make_tuple
#define x first
#define y second

const int N = 5050;

int n;
int s[N];
int d[N];
mt19937 rnd;
bitset<N> can, an;

int query() {
	int t = tryCombination(s);
	return t == -1 ? n : t;
}

void exploreCave(int nn) {
	n = nn;
	fill_n(d, N, -1);
	for (int i = 0; i < n; ++i) {
		vector<int> f;
		can.reset();
		for (int j = 0; j < n; ++j) {
			if (d[j] == -1) {
				f.push_back(j);
				can.set(j);
			}
		}
		int q = query();
		while (can.count() > 1) {
			// cout << can.size() << endl;
			vector<int> vec;
			an.reset();
			for (int e : f) {
				if (rnd() % 2) {
					vec.push_back(e);
					an.set(e);
					s[e] ^= 1;
				}
			}
			int t = query();
			for (int e : vec) {
				s[e] ^= 1;
			}
			assert(q >= i && t >= i);
			if ((q == i) == (t == i)) {
				continue;
			}
			can &= an;
		}
		int c0 = (int)can._Find_first();
		d[c0] = i;
		assert(q >= i);
		if (q == i) {
			s[c0] ^= 1;
		}
		assert(query() > i);
	}
	answer(s, d);
}




#ifdef LC
#include "graderlib.c"

int main() {
	N = init();
	exploreCave(N);
	printf("INCORRECT\nYour solution did not call answer().\n");
	return 0;
}
#endif
#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...