제출 #44597

#제출 시각아이디문제언어결과실행 시간메모리
44597aome도서관 (JOI18_library)C++17
100 / 100
705 ms720 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...