QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#883263 | #9734. Identify Chord | guosoun | RE | 0ms | 0kb | C++17 | 3.6kb | 2025-02-05 15:33:59 | 2025-02-05 15:33:59 |
Judging History
answer
#include <bits/stdc++.h>
// #include "../cpp-dump/cpp-dump.hpp"
template <class T>
using V = std::vector<T>;
template <class T>
void chkmin(T &x, const T &y) {
if (x > y) x = y;
}
using ll = long long;
int n = 11, rx = 9, ry = 1, cnt;
int dis(int u, int v) { return std::min(std::abs(u - v), n - std::abs(u - v)); }
int query(int x, int y) {
// ++cnt;
// return std::min({dis(x, y), std::min(dis(x, rx), dis(x, ry)) +
// std::min(dis(y, rx), dis(y, ry)) + 1});
std::cout << "? " << x + 1 << ' ' << y + 1 << std::endl;
int r;
std::cin >> r;
return r;
}
void answer(int x, int y) {
// cpp_dump(x, y, cnt);
// assert(((x == rx && y == ry) || (x == ry && y == rx)) && cnt <= 40);
// cnt = 0;
// return;
std::cout << "! " << x + 1 << ' ' << y + 1 << std::endl;
int r;
std::cin >> r;
assert(r == 1);
}
std::mt19937 rnd(10);
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int t;
std::cin >> t;
while (t--) {
int n;
// std::cin >> n;
// ::n = rnd() % 100000000 + 4;
// n = ::n;
// rx = rnd() % n;
// ry = rnd() % n;
// while (dis(rx, ry) <= 1) ry = rnd() % n;
// cpp_dump(rx, ry);
int m = n * 2;
auto qo = [&](ll u) {
int r = 1e9, v = (u + m / 2) % m;
chkmin(r, query(u / 2, v / 2));
if (u & 1) chkmin(r, query(u / 2 + 1, v / 2));
if (v & 1) chkmin(r, query(u / 2, v / 2 + 1));
if ((u & 1) && (v & 1)) chkmin(r, query(u / 2 + 1, v / 2 + 1));
return r * 2 + (u & 1) + (v & 1);
};
auto solve1 = [&](ll u, ll l) {
ll s = (n - l + 1) / 2;
if (query(u, (u + s) % n) == s && query(u, (u + s + 1) % n) != s + 1) {
if (query((u + s + l / 2) % n, ((u + s + l / 2 - l) % n + n) % n) == 1)
return answer((u + s + l / 2) % n, ((u + s + l / 2 - l) % n + n) % n);
u = (u + s) % n;
}
if (query((u + ((n - l) / 2) + n) % n, (u + ((n - l) / 2) - (n - l) + n) % n) == 1)
return answer((u + ((n - l) / 2) + n) % n, (u + ((n - l) / 2) - (n - l) + n) % n);
// std::cerr << cnt << '\n';
// cpp_dump(u);
// for (int i = 0; i < n; i++)
// std::cerr << query(u, (u + i) % n) << " \n"[i == n - 1];
ll d = 0;
for (int i = 29; i >= 0; i--)
if (query(u, (u + d + (1 << i)) % n) == d + (1 << i)) d += (1 << i);
// std::cerr << u + d << ' ' << l << ' ' << ((u + d + l / 2 - l) % n + n) % n << '\n';
answer((u + d + l / 2) % n, ((u + d + l / 2 - l) % n + n) % n);
};
auto solve2 = [&](int u) {
int l = std::min(qo((u + m / 4) % m), qo((u + m / 4 + 1) % m));
l = m / 2 - l + 2;
if (query((u - l / 2 + m) % m / 2, (u + l / 2) % m / 2) != 1)
u = (u + m / 2) % m;
answer((u - l / 2 + m) % m / 2, (u + l / 2) % m / 2);
};
ll d0 = qo(0), d1 = qo(1);
if (d0 == d1) {
if ((n & 1) && d0 == 3) {
if (query(0, n / 2) == 1) {
answer(0, n / 2);
continue;
}
if (query(0, n / 2 + 1) == 1) {
answer(0, n / 2 + 1);
continue;
}
}
if (d0 == m / 2) {
ll p = 0;
if (qo((p + 1) % m) != m / 2) p = (p - 1 + m) % m;
if (qo((p - 1 + m) % m) != m / 2) p = (p + 1) % m;
solve2(p);
} else
solve1(0, (m / 2 - d0 + 2) / 2);
} else {
ll c = (m / 2 - d0) / 2;
ll p = (d0 < d1 ? c : (-c + m) + m) % m;
assert(qo(p) == m / 2);
if (qo((p + 1) % m) != m / 2) p = (p - 1 + m) % m;
if (qo((p - 1 + m) % m) != m / 2) p = (p + 1) % m;
solve2(p);
}
}
}
详细
Test #1:
score: 0
Runtime Error
input:
2 6