QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#883273#9734. Identify ChordKXGTL 0ms0kbC++142.7kb2025-02-05 15:35:032025-02-05 15:35:03

Judging History

This is the latest submission verdict.

  • [2025-02-05 15:35:03]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 0kb
  • [2025-02-05 15:35:03]
  • Submitted

answer

#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
int t, n;
map<pair<int, int>, int> mp;
int dis(int a, int b) {
    if (a < b) {
        return b - a;
    } else {
        return n + b - a;
    }
}
int dist(int a, int b) {
    return min(dis(a, b), dis(b, a));
}
int query(int a, int b) {
    if (mp.count({a, b})) {
        return mp[{a, b}];
    }
    printf("? %d %d\n", a, b);
    fflush(stdout);
    int x;
    scanf("%d", &x);
    return mp[{a, b}] = x;
}
void output(int a, int b) {
    printf("! %d %d\n", a, b);
    fflush(stdout);
    return;
}
int normal(int a) {
    a = (a % n + n) % n;
    if (a == 0) {
        a = n;
    }
    return a;
}
int main() {
    scanf("%d", &t);
    while (t--) {
        mp.clear();
        scanf("%d", &n);
        int u, v, x;
        if (n % 2 == 0) {
            u = 1;
            while (true) {
                v = normal(u + n / 2);
                x = query(u, v);
                if (x < dist(u, v)) {
                    break;
                }
                u = normal(u + 1);
            }
        } else {
            u = 1;
            while (true) {
                v = normal(u + n / 2);
                x = query(u, v);
                if (x < dist(u, v)) {
                    break;
                }
                v = normal(u + n / 2 + 1);
                x = query(u, v);
                if (x < dist(u, v)) {
                    break;
                }
                u = normal(u + 1);
            }
        }
        int d = dist(u, v) - x;
        int xnext = query(normal(u + 1), v);
        int l, r, ans = 0;
        if (xnext == x - 1) {
            l = u, r = v - 1;
            if (v < u) {
                r += n;
            }
            while (l <= r) {
                int mid = (l + r) >> 1;
                if (dist(normal(mid), v) - query(normal(mid), v) == d) {
                    l = mid + 1;
                    ans = normal(mid);
                } else {
                    r = mid - 1;
                }
            }
        } else  {
            l = v + 1, r = u;
            if (v > u) {
                r += n;
            }
            while (l <= r) {
                int mid = (l + r) >> 1;
                if (dist(normal(mid), v) - query(normal(mid), v) == d) {
                    r = mid - 1;
                    ans = normal(mid);
                } else {
                    l = mid + 1;
                }
            }
        }
        x = query(ans, v) - 1;
        if (query(ans, normal(v - x)) == 1) {
            output(ans, normal(v - x));
        } else {
            output(ans, normal(v + x));
        }
    }
    return 0;
}

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

2
6
2
1
1
1
4
0

output:

? 1 4
? 2 4
? 3 4
! 2 4
? 1 1

result: