| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1316195 | pablo7948 | 동굴 (IOI13_cave) | C++20 | 0 ms | 0 KiB |
#include <vector>
#include "cave.h"
#include <unordered_set>
using namespace std;
void negatev(vector<int>& comb, const unordered_set<int>& known, int L, int R) {
for(int i = L; i < R; i++) {
if(known.count(i) == 0) {
comb[i] = 1 - comb[i];
}
}
}
void exploreCave(int N) {
vector<int> comb(N, 0);
int current = 0;
vector<int> inter(N, -1);
vector<int> pos(N, -1);
unordered_set<int> known;
known.reserve(N);
int res = tryCombination(comb.data());
bool prev = res != 0;
while(current < N) {
int L = 0, R = N - 1;
while(L != R) {
int mid = (L+R)/2 + 1;
negatev(comb, known);
res = tryCombination(comb.data());
bool open = res >= N || res == -1;
if(open != prev) {
R = mid - 1;
} else {
L = mid;
}
prev = open;
}
inter[current] = L;
if(!prev) comb[current] = 1 - comb[current];
pos[current] = comb[current];
prev = res >= N + 1 || res == -1;
known.insert(L);
}
answer(inter.data(), pos.data());
}
