이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "cave.h"
using namespace std;
// int tryCombination(int S[]);
// void answer(int S[], int D[]);
#define ask(x) tryCombination(x)
#define submit(x, y) answer(x, y)
const int MAXN = 5010;
int done[MAXN];
bool pos[MAXN];
int n;
void solve(int x, vector<int> &vec){
int a[n] = {};
for(int i = 0; i < n; i++){
if(done[i] == -1) continue;
a[i] = pos[done[i]];
}
int l = 0, r = vec.size() - 1;
pos[x] = (ask(a) == x); // 1 = colse, 0 = open
while(l < r){
int mid = (l + r) / 2;
// [l, mid], [mid + 1, r]
for(int i = l; i <= mid; i++){
a[vec[i]] = 1;
}
int res = (ask(a) == x);
if(res == pos[x]){
l = mid + 1;
}
else{
r = mid;
}
for(int i = l; i <= mid; i++){
a[vec[i]] = 0;
}
}
done[vec[l]] = x;
// cout << vec[l] << ' ' << (ask(a) != pos[x] ? "yes" : "no") << endl;
}
void exploreCave(int N){
memset(done, -1, sizeof done);
n = N;
for(int i = 0; i < n; i++){
vector<int> vec;
for(int j = 0; j < n; j++){
if(done[j] != -1) continue;
vec.push_back(j);
}
solve(i, vec);
}
int ans1[n], ans2[n];
for(int i = 0; i < n; i++){
ans1[i] = pos[done[i]];
ans2[i] = done[i];
}
submit(ans1, ans2);
}
// by me
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |