QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#878815 | #9734. Identify Chord | ucup-team5008# | RE | 0ms | 1664kb | C++20 | 2.0kb | 2025-02-01 17:57:12 | 2025-02-01 17:57:14 |
Judging History
answer
#include <cstdio>
#include <random>
#include <cassert>
int a, b;
int t, n, Q = 0;
int dist(int a, int b) {
int d = a - b;
if (d < 0) d *= -1;
return std::min(d, n - d);
}
int query(int u, int v) {
printf("? %d %d\n", u + 1, v + 1);
++Q;
/*
int ans = dist(u, v);
ans = std::min(ans, dist(u, a) + 1 + dist(b, v));
ans = std::min(ans, dist(u, b) + 1 + dist(a, v));
printf("res %d\n", ans);
return ans;
*/
fflush(stdout);
int re;
scanf("%d", &re);
return re;
}
void answer(int u, int v) {
printf("! %d %d\n", u + 1, v + 1);
fflush(stdout);
//return;
int re;
scanf("%d", &re);
assert(re == 1);
}
int z(int x) {
if (x >= n) x -= n;
if (x < 0) x += n;
return x;
}
std::mt19937 rng(324132);
bool iter() {
int v = rng() % n, vopp = z(v + n / 2);
int q1 = query(v, vopp);
if (q1 == dist(v, vopp)) return false;
int q2 = query(z(v + 1), vopp), k;
if (q2 == q1 - 1) k = 1;
else {
q2 = query(z(v - 1), vopp);
if (q2 == q1 - 1) k = -1;
else return false;
}
int l = 2, r = n / 2, len = q1 - 1;
while (l < r) {
int m = l + r >> 1;
if (query(z(v + m * k), vopp) == q1 - m) {
l = m + 1;
len = q1 - m;
} else r = m;
}
r = z(v + k * (r - 1)); // supposedly a chord node
//printf("supposedly r %d\n", r + 1);
//printf("distance %d %d : %d\n", r + 1, vopp + 1, len);
if (query(z(vopp + 1), r) == len - 1) l = z(vopp + len - 1);
else l = z(vopp - len + 1);
if (dist(l, r) != 1 && query(l, r) == 1) {
answer(l, r);
assert(l == a && r == b || l == b && r == a);
assert(Q <= 40);
return true;
}
return false;
}
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
/*
while (true) {
a = rng() % n;
b = rng() % n;
if (dist(a, b) > 1) break;
}
printf("generated %d %d\n", a + 1, b + 1);
Q = 0;
*/
if (n <= 8) {
bool done = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 2; j < n && !done; ++j) if (dist(i, j) > 1) {
if (query(i, j) == 1) {
answer(i, j);
done = 1;
}
}
}
assert(done);
} else {
while (!iter());
}
//printf("used %d queries\n", Q);
}
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 1664kb
input:
2 6 2 2 2 1 1 4 1 1
output:
? 1 3 ? 1 4 ? 1 5 ? 2 4 ! 2 4 ? 1 3 ! 1 3
result:
ok ok (2 test cases)
Test #2:
score: -100
Runtime Error
input:
1000 15 7 7 5 4 3 4 5 5 1 1 19
output:
? 7 14 ? 14 6 ? 4 11 ? 5 11 ? 8 11 ? 7 11 ? 6 11 ? 12 5 ? 8 5 ! 8 5