QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#884010#9734. Identify ChordEstelle_NWA 2ms1664kbC++141.9kb2025-02-05 20:49:172025-02-05 20:49:18

Judging History

This is the latest submission verdict.

  • [2025-02-05 20:49:18]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 1664kb
  • [2025-02-05 20:49:17]
  • 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);
}

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(w == n / 2)
                ++ v, ++ w;
            else
                ++ u, -- w;
        }
        else
            ++ u, ++ v;
        d = ask(u, v);
    }

    if(d == 1)
        return ans(u, v);

    int delta = w - d;
    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)
        u = x, v = y, w = z, d = k;
    else
    {
        (-- u == 0) && (u = n);
        if(u > v)
            swap(u, v);
        w = dis(u, v), d = w - delta;
        if(d == 1)
            return ans(u, v);
    }

    int l = u, r = v - delta - 1;
    while(l <= r)
    {
        int mid = l + r >> 1;
        if(dis(mid, v) - ask(mid, v) == delta)
            l = mid + 1, x = mid;
        else
            r = mid - 1;
    }
    y = (x + delta + 1) % n;
    if(!y)
        y = n;
    if(ask(x, y) != 1)
    {
        y = ((x - delta - 1) % n + n) % n;
        if(!y)
            y = n;
    }

    ans(x, y);
}

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

    return 0;
}

详细

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: 2ms
memory: 1664kb

input:

1000
15
5
4
3
2
1
1
1
19
5
4
3
4
5
-1

output:

? 1 8
? 2 8
? 3 8
? 4 8
? 5 8
? 5 8
! 5 8
? 1 10
? 2 10
? 3 10
? 4 10
? 3 8
! 3 17

result:

wrong answer Wrong answer n=19, actual=3-12, guessed=3-17 (test case 2)