QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#883285#9734. Identify ChordKXGWA 0ms3840kbC++142.8kb2025-02-05 15:38:182025-02-05 15:38:18

Judging History

This is the latest submission verdict.

  • [2025-02-05 15:38:18]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3840kb
  • [2025-02-05 15:38:18]
  • Submitted

answer

#include <cstdio>
#include <algorithm>
#include <map>
#include <cstdlib>
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);
    int x;
    scanf("%d", &x);
    if (x == -1) {
        exit(0);
    }
    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;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3840kb

input:

2
6
2
1
1
1
4
1
1
1
1

output:

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

result:

ok ok (2 test cases)

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3840kb

input:

1000
15
5
4
2
2
1
1
19
5
4
5
3
4
5
1
17
5
4
4
3
4
1
15
6
6
4
6
7
1
1
14
5
4
4
5
1
1
15
3
2
4
3
3
1
17
8
8
8
7
6
5
3
-1

output:

? 1 8
? 2 8
? 4 8
? 6 8
? 5 8
! 5 8
? 1 10
? 2 10
? 5 10
? 3 10
? 4 10
? 3 8
! 3 12
? 1 9
? 2 9
? 4 9
? 3 9
? 3 7
! 3 11
? 1 8
? 2 8
? 12 8
? 14 8
? 15 8
? 1 3
! 1 3
? 1 8
? 2 8
? 4 8
? 3 8
? 2 5
! 2 5
? 1 8
? 2 8
? 4 8
? 3 8
? 2 7
! 2 9
? 1 9
? 1 10
? 2 10
? 2 11
? 3 11
? 6 11
? 2 5
! 2 17

result:

wrong answer Wrong answer n=17, actual=5-14, guessed=2-17 (test case 7)