QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#668082 | #8939. Permutation | zhenghanyun# | WA | 58ms | 3676kb | C++14 | 2.3kb | 2024-10-23 11:10:34 | 2024-10-23 11:10:39 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
int T, n;
inline int ask(int l, int r) {
if (l == r) {
return 0;
}
cout << "? " << l << " " << r << endl;
int res;
cin >> res;
return res;
}
inline void print(int pos) {
cout << "! " << pos << endl;
}
inline int solve(int l, int r, int pos) {
if (l == r) {
return l;
}
if (!pos) {
pos = ask(l, r);
}
if (l + 1 == r) {
return (pos == l) ? r : l;
}
if (l + 2 == r) {
if (pos == l) {
return solve(l + 1, r, 0);
}
if (pos == r) {
return solve(l, r - 1, 0);
}
return (ask(l, l + 1) == l + 1) ? l : r;
}
if (l + 3 == r) {
if (pos == l) {
if (ask(l, l + 2) == l) {
return solve(l + 1, l + 2, 0);
}
return l + 3;
}
if (pos == l + 1) {
if (ask(l, l + 1) == l + 1) {
return l;
}
return solve(l + 2, r, 0);
}
if (pos == l + 2) {
if (ask(l + 2, r) == l + 2) {
return r;
}
return solve(l, l + 1, 0);
}
if (ask(l + 1, r) == r) {
return solve(l + 1, l + 2, 0);
}
return l;
}
int len = r - l + 1;
int mid1 = l + len / 4, mid2 = l + len / 2, mid3 = r - len / 4;
if (pos <= mid1) {
if (ask(l, mid2) == pos) {
if (ask(l, mid1) == pos) {
return solve(l, mid1, pos);
}
return solve(mid1 + 1, mid2, 0);
}
if (ask(l, mid3) == pos) {
return solve(mid2 + 1, mid3, 0);
}
return solve(mid3 + 1, r, 0);
}
if (pos <= mid2) {
if (ask(l, mid2) == pos) {
if (ask(mid1 + 1, mid2) == pos) {
return solve(mid1 + 1, mid2, pos);
}
return solve(l, mid1, 0);
}
if (ask(l, mid3) == pos) {
return solve(mid2 + 1, mid3, 0);
}
return solve(mid3 + 1, r, 0);
}
if (pos <= mid3) {
if (ask(mid2 + 1, r) == pos) {
if (ask(mid2 + 1, mid3) == pos) {
return solve(mid2 + 1, mid3, pos);
}
return solve(mid3 + 1, r, 0);
}
if (ask(mid1 + 1, r) == pos) {
return solve(mid1 + 1, mid2, 0);
}
return solve(l, mid1, 0);
}
if (ask(mid2 + 1, r) == pos) {
if (ask(mid3 + 1, r) == pos) {
return solve(mid3 + 1, r, pos);
}
return solve(mid2 + 1, mid3, 0);
}
if (ask(mid1 + 1, r) == pos) {
return solve(mid1 + 1, mid2, 0);
}
return solve(l, mid1, 0);
}
int main() {
cin >> T;
while (T--) {
cin >> n;
print(solve(1, n, 0));
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3584kb
input:
3 5 3 2 3 6 6 5 3 1 4 3 3
output:
? 1 5 ? 1 3 ? 1 4 ! 4 ? 1 6 ? 5 6 ? 3 6 ? 1 2 ! 2 ? 1 4 ? 3 4 ! 4
result:
ok Correct (3 test cases)
Test #2:
score: 0
Accepted
time: 58ms
memory: 3604kb
input:
10000 10 2 2 3 5 5 10 10 7 10 5 4 10 5 1 5 8 10 4 4 6 2 1 10 10 9 6 3 2 10 3 3 3 2 10 1 5 1 7 10 1 3 1 8 10 2 4 4 9 10 3 3 1 5 5 10 4 1 7 9 10 8 7 7 1 2 10 4 1 1 9 10 7 8 7 4 6 10 5 1 1 10 10 8 8 7 9 10 2 2 1 5 4 10 6 4 4 10 10 1 3 1 8 10 7 9 9 1 2 10 7 8 4 1 2 10 3 4 4 10 10 4 4 4 6 10 8 7 7 2 2 10...
output:
? 1 10 ? 1 6 ? 1 3 ? 4 6 ? 4 5 ! 4 ? 1 10 ? 7 10 ? 4 10 ? 4 6 ? 4 5 ! 6 ? 1 10 ? 1 6 ? 1 8 ? 7 8 ! 7 ? 1 10 ? 1 6 ? 4 6 ? 1 3 ? 1 2 ! 3 ? 1 10 ? 7 10 ? 4 10 ? 1 3 ? 1 2 ! 1 ? 1 10 ? 1 6 ? 1 3 ? 1 2 ! 1 ? 1 10 ? 1 6 ? 1 8 ? 7 8 ! 8 ? 1 10 ? 1 6 ? 1 8 ? 7 8 ! 7 ? 1 10 ? 1 6 ? 1 8 ? 9 10 ! 10 ? 1 10 ? ...
result:
ok Correct (10000 test cases)
Test #3:
score: -100
Wrong Answer
time: 3ms
memory: 3676kb
input:
10000 3 1 2 11 5 5 5 4 2 2 19 3 3 4 6 8 8 7 5 7 5 4 3 3 1 19 6 6 10 1 1 2 2 2 15 11 11 11 12 10 14 1 1 1 3 16 4 4 1 8 9 7 3 3 2 19 13 17 6 5 4 5 2 2 4 1 3 7 2 2 2 3 2 2 17 1 1 1 2 2 14 9 9 9 11 20 9 3 9 13 13 6 4 2 2 18 7 7 7 7 6 8 8 6 8 5 8 6 7 6 5 16 10 16 10 6 8 6 1 1 2 3 10 3 3 1 4 6 2 1 10 1 3 ...
output:
? 1 3 ? 2 3 ! 3 ? 1 11 ? 1 6 ? 4 6 ? 4 5 ! 6 ? 1 2 ! 1 ? 1 19 ? 1 10 ? 1 5 ? 6 10 ? 6 8 ? 6 9 ! 10 ? 1 7 ? 5 7 ? 3 7 ? 3 4 ! 3 ? 1 3 ? 1 2 ! 2 ? 1 19 ? 1 10 ? 6 10 ? 1 5 ? 1 3 ? 1 2 ! 3 ? 1 2 ! 1 ? 1 15 ? 9 15 ? 9 12 ? 11 12 ? 9 10 ! 9 ? 1 14 ? 1 8 ? 1 4 ? 1 3 ! 4 ? 1 16 ? 1 9 ? 1 5 ? 6 9 ? 8 9 ? 6 ...
result:
wrong answer Too many queries , n = 16 , now_q 7 (test case 48)