zoukankan      html  css  js  c++  java
  • [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;
        }
    }
    
  • 相关阅读:
    Servlet编程寄语
    filter常用功能
    Javascript的自动、定时执行和取消
    CentOS 5安装GIT的基本命令
    EF调用执行Oracle中序列
    WCF使用IIS发布服务的配置
    linux 自学系列:debian更新软件列表、更改源
    shell编程笔记五:select
    linux 自学系列: 改IP地址,主机名及DNS
    shell编程笔记四:case in
  • 原文地址:https://www.cnblogs.com/mollnn/p/14458449.html
Copyright © 2011-2022 走看看