# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1216802 | mariamp1 | Cave (IOI13_cave) | C++20 | 0 ms | 0 KiB |
int tryCombination(int S[]);
void answer(int S[], int D[]);
void exploreCave(int N) {
int S[N];
int D[N];
bool used[N] = {false};
for (int door = 0; door < N; ++door) {
int fixedS[N];
for (int i = 0; i < N; ++i)
fixedS[i] = used[i] ? S[i] : 0;
int result = tryCombination(fixedS);
int targetValue = (result == -1 || result > door) ? 0 : 1;
int lo = 0, hi = N - 1, sw = -1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
for (int i = 0; i < N; ++i)
fixedS[i] = used[i] ? S[i] : targetValue;
for (int i = lo; i <= mid; ++i)
if (!used[i]) fixedS[i] = 1 - targetValue;
int res = tryCombination(fixedS);
if (res == -1 || res > door)
hi = mid;
else
lo = mid + 1;
if (lo == hi) {
sw = lo;
break;
}
}
D[door] = sw;
S[sw] = targetValue;
used[sw] = true;
}
answer(S, D);
}