이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define X first
#define Y second
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define pii pair<int, int>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define test(args...) abc("[" + string(#args) + "]", args)
void abc() {cerr << endl;}
template <typename T, typename ...U> void abc(T a, U ...b) {
cerr << a << ' ', abc(b...);
}
template <typename T> void printv(T l, T r) {
while (l != r) cerr << *l << " \n"[++l == r];
}
const int mod = 1e9 + 7, N = 200000;
map <array<int, 3>, int> m1;
int n, m, k, q, dx[6] = {1, -1, 0, 0, 0, 0}, dy[6] = {0, 0, 1, -1, 0, 0}, dz[6] = {0, 0, 0, 0, 1, -1};
int ask(int i, int j, int kk) {
if (i < 0 || i >= n || j < 0 || j >= m || kk < 0 || kk >= k) return 0;
if (!m1.count({i, j, kk})) {
assert(q);
cout << "? " << i + 1 << ' ' << j + 1 << ' ' << kk + 1 << endl;
cin >> m1[{i, j, kk}];
q--;
}
return m1[{i, j, kk}];
}
void chk(int i, int j, int k) {
bool is = true;
for (int ii = 0; ii < 6; ++ii) {
is &= ask(i, j, k) >= ask(i + dx[ii], j + dy[ii], k + dz[ii]);
}
if (is) {
cout << "! " << i + 1 << ' ' << j + 1 << ' ' << k + 1 << endl;
exit(0);
}
}
int main () {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k >> q;
if (m == 1 && k == 1) {
// task 1 & 2
int l = 0, r = n;
while (r - l > 2) {
int mid = l + r >> 1;
if (ask(mid, 0, 0) > ask(mid + 1, 0, 0)) r = mid + 1;
else l = mid + 1;
}
for (int i = l; i < r; ++i) chk(i, 0, 0);
} else if (k == 1) {
// task 3 & 4
int l = 0, r = n;
while (r - l > 5) {
int mid = l + r >> 1;
int mx1 = 0, mx2 = 0;
for (int j = 0; j < m; ++j) {
mx1 = max(mx1, ask(mid, j, 0));
mx2 = max(mx2, ask(mid + 1, j, 0));
}
if (mx1 > mx2) r = mid + 1;
else l = mid + 1;
}
for (int i = l; i < r; ++i) {
for (int j = 0; j < m; ++j) {
chk(i, j, 0);
}
}
assert(false);
} else {
// task 5 & 6
int l1 = 0, r1 = n, l2 = 0, r2 = m, l3 = 0, r3 = k;
for (int _ = 0; _ < 6; ++_) {
{
int mid = l1 + r1 >> 1;
int mx1 = 0, mx2 = 0;
for (int i = l2; i < r2; ++i) for (int j = l3; j < r3; ++j) {
mx1 = max(mx1, ask(mid - 1, i, j));
mx2 = max(mx2, ask(mid, i, j));
}
if (mx1 > mx2) r1 = mid;
else l1 = mid;
}
{
int mid = l2 + r2 >> 1;
int mx1 = 0, mx2 = 0;
for (int i = l1; i < r1; ++i) for (int j = l3; j < r3; ++j) {
mx1 = max(mx1, ask(i, mid - 1, j));
mx2 = max(mx2, ask(i, mid, j));
}
if (mx1 > mx2) r2 = mid;
else l2 = mid;
}
{
int mid = l3 + r3 >> 1;
int mx1 = 0, mx2 = 0;
for (int i = l1; i < r1; ++i) for (int j = l2; j < r2; ++j) {
mx1 = max(mx1, ask(i, j, mid -1));
mx2 = max(mx2, ask(i, j, mid));
}
if (mx1 > mx2) r3 = mid;
else l3 = mid;
}
}
for (int i = l1; i < r1; ++i) for (int j = l2; j < r2; ++j) for (int k = l3; k < r3; ++k) {
chk(i, j, k);
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
worm.cpp: In function 'int main()':
worm.cpp:55:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
55 | int mid = l + r >> 1;
| ~~^~~
worm.cpp:64:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
64 | int mid = l + r >> 1;
| ~~^~~
worm.cpp:84:30: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
84 | int mid = l1 + r1 >> 1;
| ~~~^~~~
worm.cpp:94:30: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
94 | int mid = l2 + r2 >> 1;
| ~~~^~~~
worm.cpp:104:30: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
104 | int mid = l3 + r3 >> 1;
| ~~~^~~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |