이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "library.h"
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> vec, res, res1, res2;
int query() {
bool flag = 0;
for (int i = 0; i < n; ++i) flag |= vec[i];
if (!flag) return 0;
return Query(vec);
}
int calc(int x, int y) {
int ret = 0;
vec.assign(n, 0);
for (int i = 0; i <= x; ++i) vec[i] = 1;
vec[y] = 1, ret += query();
vec[y] = 0, ret -= query();
return ret;
}
void Solve(int _n) {
n = _n;
if (n == 1) {
res.push_back(1), Answer(res); return;
}
int cur = 0, nxt = 0;
int l = 0, r = n - 1;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (calc(mid, cur) == 1) l = mid;
else r = mid - 1;
}
nxt = l + 1;
int tmp = nxt;
while (1) {
int prv = cur;
cur = nxt, nxt = 0;
res1.push_back(cur + 1);
for (int j = 0; j < 10; ++j) {
int ret = 0;
vec.assign(n, 0);
for (int k = 0; k < n; ++k) {
if (!(k >> j & 1)) vec[k] = 1;
}
vec[prv] = 1;
vec[cur] = 1, ret += query();
vec[cur] = 0, ret -= query();
nxt += (ret == 0) << j;
}
if (nxt == 1023) break;
}
cur = tmp, nxt = 0;
while (1) {
int prv = cur;
cur = nxt, nxt = 0;
res2.push_back(cur + 1);
if (res1.size() + res2.size() == n) break;
for (int j = 0; j < 10; ++j) {
int ret = 0;
vec.assign(n, 0);
int x = prv >> j & 1;
for (int k = 0; k < n; ++k) {
if ((k >> j & 1) == x) vec[k] = 1;
}
vec[cur] = 1, ret += query();
vec[cur] = 0, ret -= query();
nxt += (x ^ (ret == 0)) << j;
}
}
reverse(res1.begin(), res1.end());
res = res1;
for (auto i : res2) res.push_back(i);
Answer(res);
}
컴파일 시 표준 에러 (stderr) 메시지
library.cpp: In function 'void Solve(int)':
library.cpp:61:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (res1.size() + res2.size() == n) break;
~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |