More Wrong
考虑数 的另一个性质。
由于是一个排列,所以 是排列中的最大值!
我们考虑最大值的性质。
区间 的最大值所在位置 一定有这样的性质, 的逆序对个数和 逆序对数相同。
考虑分治。设 为 中最大值所在位置。分治合并时,最大值一定在两边最大值中的一个。用上述判断方式即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;
const int N = 2005;
int t, n;
int query(int l, int r)
{
printf("? %d %d\n", l, r);
fflush(stdout);
int x;
scanf("%d", &x);
return x;
}
int solve(int l, int r)
{
if (l == r) return l;
if (l == r - 1)
{
return (query(l, r) == 1 ? l : r);
}
int mid = l + r >> 1;
int place1 = solve(l, mid), solve2 = solve(mid + 1, r);
return (query(l, solve2 - 1) == query(l, solve2) ? solve2 : place1);
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
printf("! %d\n", solve(1, n));
fflush(stdout);
}
return 0;
}

浙公网安备 33010602011771号