QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#615582#8939. Permutationm107239WA 1ms3576kbC++234.7kb2024-10-05 19:22:382024-10-05 19:22:38

Judging History

This is the latest submission verdict.

  • [2024-10-05 19:22:38]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 3576kb
  • [2024-10-05 19:22:38]
  • Submitted

answer

#include <iostream>
#include <map>

using ll = long long;
using namespace std;

static map<pair<int, int>, int> cache;

static int query(int l, int r) { // use 0-based, right exclusive index internally, but 1-based, right inclusive index externally
    if (r - l < 2) {
        return -1;
    }
    auto it = cache.find({l, r});
    if (it != cache.end()) {
        return it->second;
    }
    cout << "? " << l + 1 << " " << r << endl;
    int x;
    cin >> x;
    return cache[{l, r}] = x - 1;
}

int solve(int n) {
    int l = 0, r = n;
    while (true) {
        if (l + 1 == r) {
            return l;
        }
        if (l + 2 == r) {
            return l + (l == query(l, r));
        }
        int m = (l + r) / 2, ml = (l + m) / 2, mr = (m + r) / 2;
        int s0 = query(l, r);
        if (s0 < ml) {
            int s1 = query(l, m);
            if (s1 == s0) {
                if (l + 1 == m) {
                    return l;
                }
                if (l + 2 == m) {
                    return l + (l == query(l, m));
                }
                int s2 = query(l, ml);
                if (s2 == s0) {
                    r = ml;
                } else {
                    l = ml;
                    r = m;
                }
            } else {
                if (m + 1 == r) {
                    return m;
                }
                if (m + 2 == r) {
                    return m + (m == query(m, r));
                }
                int s2 = query(l, mr);
                if (s2 == s0) {
                    l = m;
                    r = mr;
                } else {
                    l = mr;
                }
            }
        } else if (s0 < m) {
            int s1 = query(l, m);
            if (s1 == s0) {
                if (l + 1 == m) {
                    return l;
                }
                if (l + 2 == m) {
                    return l + (l == query(l, m));
                }
                int s2 = query(ml, mr);
                if (s2 == s0) {
                    l = ml;
                    r = m;
                } else {
                    r = ml;
                }
            } else {
                if (m + 1 == r) {
                    return m;
                }
                if (m + 2 == r) {
                    return m + (m == query(m, r));
                }
                int s2 = query(ml, mr);
                if (s2 == s0) {
                    l = m;
                    r = mr;
                } else {
                    l = ml;
                }
            }
        } else if (s0 < mr) {
            int s1 = query(m, r);
            if (s1 == s0) {
                if (m + 1 == r) {
                    return m;
                }
                if (m + 2 == r) {
                    return m + (m == query(m, r));
                }
                int s2 = query(ml, mr);
                if (s2 == s0) {
                    l = m;
                    r = mr;
                } else {
                    l = mr;
                }
            } else {
                if (l + 1 == m) {
                    return l;
                }
                if (l + 2 == m) {
                    return l + (l == query(l, r));
                }
                int s2 = query(ml, mr);
                if (s2 == s0) {
                    l = ml;
                    r = m;
                } else {
                    r = ml;
                }
            }
        } else {
            int s1 = query(m, r);
            if (s1 == s0) {
                if (m + 1 == r) {
                    return m;
                }
                if (m + 2 == r) {
                    return m + (m == query(m, r));
                }
                int s2 = query(mr, r);
                if (s2 == s0) {
                    l = mr;
                } else {
                    l = m;
                    r = mr;
                }
            } else {
                if (l + 1 == m) {
                    return l;
                }
                if (l + 2 == m) {
                    return l + (l == query(l, m));
                }
                int s2 = query(ml, r);
                if (s2 == s0) {
                    l = ml;
                    r = m;
                } else {
                    r = ml;
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        int ans = solve(n) + 1;
        cout << "! " << ans << endl;
    }

    return 0;
}

// [9, 2, 7, 6, 3, 1, 8, 10, 5, 11, 4]

详细

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3576kb

input:

3
5
3
3
2
5
6
6
5
6

output:

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

result:

wrong answer Wrong prediction (test case 2)