QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#884469#9734. Identify ChordEstelle_NWA 5ms1664kbC++142.0kb2025-02-06 08:39:082025-02-06 08:39:08

Judging History

This is the latest submission verdict.

  • [2025-02-06 08:39:08]
  • Judged
  • Verdict: WA
  • Time: 5ms
  • Memory: 1664kb
  • [2025-02-06 08:39:08]
  • Submitted

answer

#include <cstdio>
#include <algorithm>

using namespace std;

int T, n;

int ask(int x, int y, int z = 0)
{
    printf("? %d %d\n", x, y);
    fflush(stdout);
    scanf("%d", &z);
    return z;
}

void ans(int x, int y, int z = 0)
{
    printf("! %d %d\n", x, y);
    fflush(stdout);
    scanf("%d", &z);
}

int dis(int x, int y)
{
    if(x > y)
        swap(x, y);
    return min(y - x, x + n - y);
}

int move(int u, int k)
{
    u = ((u + k) % n + n) % n;
    return u == 0 ? n : u;
}

void work()
{
    scanf("%d", &n);

    if(n <= 8)
    {
        for(int i = 1; i <= n; ++ i)
            for(int j = i + 2; j <= n; ++ j)
                if(!(i == 1 && j == n) && ask(i, j) == 1)
                    return ans(i, j);
    }

    int u = 1, v = n / 2 + 1, w = n / 2, d = ask(u, v);
    while(d == w)
    {
        if(n & 1)
        {
            if(v - u == n / 2)
                ++ v;
            else
                ++ u;
        }
        else
            ++ u, ++ v;
        d = ask(u, v);
    }

    if(d == 1)
        return ans(u, v);
    int delta = w - d, flag = 0;
    if(ask(u, move(u, delta + 1)) == 1)
        return ans(u, move(u, delta + 1));
    if(ask(u, move(u, - delta - 1)) == 1)
        return ans(u, move(u, - delta - 1));

    int x = u + 1, y = v, z = dis(x, y), k = ask(x, y);
    if(k == 1)
        return ans(x, y);
    if(z - k >= delta)
        flag = 1, w = v - u, delta = w - d;
    else
        flag = -1, w = n - v + u, delta = w - d;

    int l = 0, r = w;
    while(l <= r)
    {
        int mid = l + r >> 1, p = move(u, flag * mid);
        if(dis(p, v) - ask(p, v) >= delta)
            l = mid + 1, x = p;
        else
            r = mid - 1;
    }

    y = move(x, flag * (delta + 1));
    if(ask(x, y) != 1)
        y = move(v, flag * (ask(x, v) - 1));
    ans(x, y);
}

int main()
{
    scanf("%d", &T);
    while(T --)
        work();

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

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
Wrong Answer
time: 5ms
memory: 1664kb

input:

1000
15
5
3
3
4
2
2
1
1
1
19
5
5
5
4
5
4
3
4
5
3
1
17
5
4
4
4
4
4
3
4
4
3
1
15
6
1
1
14
5
3
3
4
4
4
5
1
1
15
3
5
4
2
4
2
3
3
2
1
17
8
8
8
7
2
2
6
5
6
5
4
3
4
1
20
6
1
1
13
5
2
2
5
2
2
3
3
2
1
18
3
5
3
4
5
2
3
1
1
13
4
3
3
5
4
3
4
1
1
14
2
3
3
3
3
1
2
1
1
17
8
7
2
2
6
3
2
2
3
3
2
1
12
5
2
2
4
3
4
3
2...

output:

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

result:

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