[CF1486C2] Guessing the Greatest (hard version)

[CF1486C2] Guessing the Greatest (hard version) - 交互,二分

Description

给定一个序列 (n le 10^5),元素各不相同,支持区间次大值位置询问,在不超过 20 次查询中,找到最大元素的位置。

Solution

第一步,我们找到次大元素,设他的位置为 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;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/14458449.html