QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#882794 | #9734. Identify Chord | jiamengtong | TL | 1ms | 3328kb | C++14 | 1.2kb | 2025-02-05 11:28:40 | 2025-02-05 11:28:41 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
int n;
int query(int x, int y)
{
cout << "? " << x % n + 1 << ' ' << y % n + 1 << endl;
int d;
cin >> d;
return d;
}
void solve()
{
cin >> n;
int x = 0, y = n / 2, d;
for(int t = 0; ; t ^= 1)
{
d = query(x, y);
if(d < n / 2) break;
if(n & 1) x += (t == 1), y += (t == 0);
else x++, y++;
}
int dis = query((x + n - 1) % n, y), X, disy;
if(dis < d)
{
int l = 1, r = n / 2, ans = 1, mid;
while(l <= r)
{
mid = (l + r) >> 1;
if(query((x + n - mid) % n, y) == d - mid) ans = mid, l = mid + 1;
else r = mid - 1;
}
X = (x + n - ans) % n;
disy = d - ans - 1;
}
else
{
dis = query((x + 1) % n, y);
if(dis < d)
{
int l = 1, r = n / 2, ans = 1, mid;
while(l <= r)
{
mid = (l + r) >> 1;
if(query((x + ans) % n, y) == d - mid) ans = mid, l = mid + 1;
else r = mid - 1;
}
X = (x + ans) % n;
disy = d - ans - 1;
}
else X = x, disy = d - 1;
}
int Y = (y + disy) % n;
if(query(X, Y) != 1) Y = (y + n - disy) % n;
cout << "! " << X + 1 << ' ' << Y + 1 << endl;
cin >> X;
}
signed main()
{
int T;
cin >> T;
while(T--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3328kb
input:
2 6 2 2 1 1 1 1 1 4 1 1 1 1 1
output:
? 1 4 ? 6 4 ? 2 4 ? 2 4 ? 2 4 ? 2 4 ! 2 4 ? 1 3 ? 4 3 ? 2 3 ? 1 3 ! 1 3
result:
ok ok (2 test cases)
Test #2:
score: -100
Time Limit Exceeded
input:
1000 15 5 6 4 4 4 4 6 -1
output:
? 1 8 ? 15 8 ? 2 8 ? 2 8 ? 2 8 ? 2 8 ? 2 11 ! 2 5