给定一个序列 \(n \le 10^5\),元素各不相同,支持区间次大值位置询问,在不超过 20 次查询中,找到最大元素的位置。
第一步,我们找到次大元素,设他的位置为 y
第二步,判断最大元素在次大的左边还是右边。我们可以对 \([1,y]\) 做一次查询,如果结果 =y,就是在左边,否则在右边
第三步,二分找到最大值位置
对于在左边的情况,我们二分一个 mid,每次查询 \([mid,y]\),如果结果 =y,那么 l=mid+1,否则 r=mid
对于在右边的情况,我们二分一个 mid,每次查询 \([y,mid]\),如果结果 =y,那么 r=mid,否则 l=mid+1
#include <bits/stdc++.h>
using namespace std;
signed main()
{
int n, l, r;
cin >> n;
cout << "? " << 1 << ‘ ‘ << n << endl;
int y;
cin >> y;
int z;
if (y > 1)
{
cout << "? " << 1 << ‘ ‘ << y << endl;
cin >> z;
}
else
{
z = 0;
}
if (z == y)
{
l = 1, r = y;
while (l < r)
{
int mid = (l + r) / 2;
int x;
if (mid != y)
{
cout << "? " << mid << ‘ ‘ << y << endl;
cin >> x;
}
else
x = 0;
if (x == y)
l = mid + 1;
else
r = mid;
}
cout << "! " << l - 1 << endl;
}
else
{
l = y, r = n;
while (l < r)
{
int mid = (l + r) / 2;
int x;
if (y != mid)
{
cout << "? " << y << ‘ ‘ << mid << endl;
cin >> x;
}
else
x = 0;
if (x != y)
l = mid + 1;
else
r = mid;
}
cout << "! " << r << endl;
}
}
[CF1486C2] Guessing the Greatest (hard version) - 交互,二分
原文:https://www.cnblogs.com/mollnn/p/14458449.html