QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#882719#9734. Identify ChordforgotmyhandleRE 0ms0kbC++142.5kb2025-02-05 10:55:372025-02-05 10:55:41

Judging History

This is the latest submission verdict.

  • [2025-02-05 10:55:41]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2025-02-05 10:55:37]
  • Submitted

answer

#include <iostream>
#include <cassert>
#define int long long
using namespace std;
int n;
int dist(int x, int y) {
    if (x > y) 
        swap(x, y);
    return min(y - x, n - y + x);
}
int query(int x, int y) {
    cout << "? " << x + 1 << " " << y + 1 << endl;
    int ret = 0;
    cin >> ret;
    return ret;
}
void answer(int x, int y) {
    cout << "! " << x + 1 << " " << y + 1 << endl;
    int ret = 0;
    cin >> ret;
    if (ret == -1) 
        exit(0);
}
int f(int x) { return (x + n * 10) % n; }
signed main() {
    int tc;
    cin >> tc;
    while (tc--) {
        cin >> n;
        // if (n <= 10) {
        //     bool ok = 0;
        //     for (int i = 0; i < n && !ok; i++) {
        //         for (int j = 0; j < n && !ok; j++) {
        //             if (dist(i, j) > 1 && query(i, j) == 1) {
        //                 answer(i, j);
        //                 ok = 1;
        //             }
        //         }
        //     }
        //     continue;
        // }
        int x = 0, y = n / 2;
        if ((n & 1) && query(x, y) == dist(x, y)) 
            ++y;
        if (query(x, y) == dist(x, y)) 
            ++x, ++y;
        int d;
        while ((d = query(x, y)) != dist(x, y)) ++x, ++y;
        assert(d != dist(x, y));
        if (d == 1) {
            answer(x, y);
            continue;
        }
        int ql = query(f(x - 1), y), qr = query(x + 1, y), p = -1, q = -1;
        if (ql >= d && qr >= d) 
            p = x;
        else {
            if (ql < d) {
                // assert(ql < d);
                int l = 1, r = n / 2, mid, ans = -1;
                while (l <= r) {
                    mid = (l + r) >> 1;
                    if (d - query(f(x - mid), y) == mid) 
                        ans = mid, l = mid + 1;
                    else 
                        r = mid - 1;
                }
                p = f(x - ans);
            } else {
                // assert(qr < d);
                int l = 1, r = n / 2, mid, ans = -1;
                while (l <= r) {
                    mid = (l + r) >> 1;
                    if (d - query(f(x + mid), y) == mid) 
                        ans = mid, l = mid + 1;
                    else 
                        r = mid - 1;
                }
                p = f(x + ans);
            }
        }
        int t = query(p, y) - 1;
        if (query(p, f(y - t)) == 1) 
            answer(p, f(y - t));
        else 
            answer(p, f(y + t));
    }
    return 0;
}

详细

Test #1:

score: 0
Runtime Error

input:

2
6
2
2
2
3

output:

? 1 4
? 1 4
? 2 5
? 3 6

result: