# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1179025 | woohyun_jng | Library (JOI18_library) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
void Solve(int N);
namespace {
struct Judge {
int N;
int A[1002];
int pos[1002];
bool f[1002];
int query_c;
bool answered;
void init() {
query_c = 0;
int ret = scanf("%d", &N);
ret++;
answered = false;
for (int i = 0; i < N; i++)
ret = scanf("%d", &A[i]), pos[A[i]] = i;
}
int query(const vector<int> &M) {
if (query_c == 20000) {
puts("Wrong Answer [3]");
exit(0);
}
if (int(M.size()) != N) {
puts("Wrong Answer [1]");
exit(0);
}
bool all_zero = true;
for (int i = 0; i < N; i++) {
if (M[i] != 0 && M[i] != 1) {
puts("Wrong Answer [2]");
exit(0);
}
if (M[i] == 1)
all_zero = false;
}
if (all_zero) {
puts("Wrong Answer [2]");
exit(0);
}
memset(f, 0, sizeof(f));
for (int i = 0; i < N; i++)
if (M[i])
f[pos[i + 1]] = true;
bool las = false;
int r = 0;
for (int i = 0; i < N; i++) {
if (las == false && f[i] == true)
r++;
las = f[i];
}
query_c++;
return r;
}
void answer(const vector<int> &res) {
bool f1 = true, f2 = true;
if (int(res.size()) != N) {
puts("Wrong Answer [4]");
exit(0);
}
if (answered) {
puts("Wrong Answer [7]");
exit(0);
}
answered = true;
memset(f, 0, sizeof(f));
for (int i = 0; i < N; i++) {
if (res[i] <= 0 || res[i] > N) {
puts("Wrong Answer [5]");
exit(0);
}
if (f[res[i]]) {
puts("Wrong Answer [6]");
exit(0);
}
f[res[i]] = true;
}
for (int i = 0; i < N; i++) {
f1 &= A[i] == res[i];
f2 &= A[i] == res[N - i - 1];
}
if (!f1 && !f2) {
puts("Wrong Answer [8]");
exit(0);
}
}
void end() {
if (!answered)
puts("Wrong Answer [7]");
else
printf("Accepted : %d\n", query_c);
}
} judge;
} // namespace
int Query(const vector<int> &M) {
return judge.query(M);
}
void Answer(const vector<int> &res) {
judge.answer(res);
}
vector<int> ans;
bool chk[1001];
int N;
int query(vector<int> &Q) {
int cnt = accumulate(Q.begin(), Q.end(), 0);
return cnt - Query(Q);
}
int get(int X, vector<int> arr) {
int S = arr.size(), A, B;
if (S == 1)
return arr[0];
if (X == 0) {
for (int i : arr)
cout << i << " ";
cout << "sex\n";
}
vector<int> L, R, T(N, 0);
for (int i = 0; i < S / 2; i++)
L.push_back(arr[i]), T[arr[i]] = 1;
for (int i = S / 2; i < S; i++)
R.push_back(arr[i]);
A = query(T);
T[X] = 1, B = query(T);
if (B - A >= 1)
return get(X, L);
else
return get(X, R);
}
void Solve(int n) {
N = n;
vector<int> Q(N, 1);
if (N == 1) {
ans.push_back(1);
Answer(ans);
return;
}
for (int i = 0; i < N; i++) {
Q[i] = 0;
if (query(Q) == N - 2) {
ans.push_back(i), chk[i] = true;
break;
}
Q[i] = 1;
}
for (int i = 1; i < N; i++) {
Q.clear();
for (int j = 0; j < N; j++) {
if (chk[j])
continue;
Q.push_back(j);
}
ans.push_back(get(ans[i - 1], Q)), chk[ans[i]] = true;
}
for (int i = 0; i < N; i++) {
cout << ans[i] << " ";
ans[i]++;
}
Answer(ans);
}
int main() {
judge.init();
Solve(judge.N);
judge.end();
}