题目链接:点击进入

题目

题意

询问区间 [ l , r ] ,给你区间内的第二大的值的位置,让你求最大值的位置( 难的版本,最多询问20次 )

思路

先询问第二大的值所在位置 pos ,然后判断最大值是在第二大的值的左边还是右边,然后再进行二分;

如果最大值在 pos 的左边,每次询问都是 [ mid , pos ]
如果第二大值位置 = pos ,则说明最大值位于 [ mid , r ] 区间内;
否则最大值位置位于 [ l , mid ] 区间内。

如果最大值在 pos 的右边,每次询问都是 [ pos , mid ]
如果第二大值位置 = pos ,则说明最大值位于 [ l , mid ] 区间内;
否则最大值位置位于 [ mid , r ] 区间内。
( 注意询问区间不能为 1 ,如果区间为 1 即为答案 )

代码

#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
//#define int long long
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps=1e-7;
const double pai=acos(-1.0);
const int N=2e4+10;
const int maxn=1e6+10;
const int mod=1e9+7;
int t,n,m,k;
int check(int l,int r)
{int x;cout<<"? "<<l<<' '<<r<<endl;cout.flush();cin>>x;return x;
}
int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);cout.tie(0);cin>>n;int l=1,r=n,pos=check(l,r);if(pos!=1&&pos==check(1,pos)){r=pos;while(r-l>1){int mid=l+r>>1;if(check(mid,pos)==pos) l=mid;else r=mid; }}else{l=pos;while(r-l>1){int mid=l+r>>1;if(check(pos,mid)==pos) r=mid;else l=mid;  }}pos=check(l,r);if(pos==l) pos=r;else pos=l;cout<<"! "<<pos<<endl;cout.flush();return 0;
}

Guessing the Greatest (hard version)-(交互+二分+思维)相关推荐

  1. CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)

    题目链接:点击查看 题目分析:给出一个长度为 nnn 的序列,现在可以进行最多 202020 次查询,每次查询可以询问区间 [l,r][l,r][l,r] 中次大值的位置,现在要求在查询后输出最大值的 ...

  2. Codeforces1486 C1.Guessing the Greatest (easy version)(交互题+二分)

    原题链接 题意: 交互题,首先电脑给出序列的长度n.你可以询问区间[l,r]的次大值位置,求序列最大值的位置. 思路: 首先考虑最简单的情况,当区间长度为2时,那么假设区间为[l,r].当询问的次大值 ...

  3. Codeforces Round #703 (Div. 2) C. Guessing the Greatest

    C1. Guessing the Greatest (easy version) C2. Guessing the Greatest (hard version) Codeforces C题Guess ...

  4. Codeforces Round #703 (Div. 2) Guessing the Greatest C1 C2 二分

    link 题意:交互题,每次可以询问一个区间的次大值,保证所有值都不相同,求最大值位置.easy是询问最多40次,hard最多20次. 交互题大部分都是二分,可以向二分考虑. easy比较好想,假设当 ...

  5. Codeforces Round #703 (Div. 2)C1C2 Guessing the Greatest(二分)

    题意: 交互题. query l,r区间内第二大的数,要求得到整个数组最大的数. 思路:首先我们对整体数组进行query 找到第二大的数所在的位置,设这个位置为p. 然后分别对[1,p]和[p,n]进 ...

  6. CodeForces - 1370F2 The Hidden Pair (Hard Version)(交互题+二分)

    题目链接:点击查看 题目大意:给出一棵无向无根树,事先确定好了两个点 s 和 t ,现在需要通过询问找到这两个点 每次询问可以给出一个点集,系统会返回点集中距离点 s 和点 t 距离之和最小的那个点以 ...

  7. CodeForces - 1543D2 RPD and Rap Sheet (Hard Version)(交互+模拟)

    题目链接:点击查看 题目大意:交互题猜密码,设原密码为 xxx,猜的密码为 yyy,如果没猜到,密码会自适应变成 zzz,满足 x⊕z=yx \oplus z=yx⊕z=y ,最多猜 nnn 次,对于 ...

  8. Codeforces.1129E.Legendary Tree(交互 二分)

    题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...

  9. Showstopper [POJ3484] [二分] [思维]

    Description 给你n个数列,问哪一个数字在所有的数列中出现了奇数次(最多一个). Sample Input 1 10 1 2 10 11 10 1 1 10 11 10 1 4 4 1 1 ...

最新文章

  1. 刘启成_使用if及变量编写LAMP管理脚本
  2. SET NOCOUNT ON 作用
  3. swift不用声明类型那些事
  4. 目前最常用的计算机机箱类型为_绍兴承接离心风机箱高品质
  5. 封装js千分位加逗号和删除逗号
  6. 【转】C# HttpWebRequest提交数据方式
  7. php不能header跳转页面,PHP问题:php header方法跳转页面问题
  8. AFNetworking下 http 改 https后遇到出现Error Domain=NSURLErrorDomain Code=-999 已取消 错误...
  9. 程序员面试金典——5.6奇偶位交换
  10. Hive练习求给出2017年1月的新客数
  11. Spring 学习笔记---Bean的生命周期
  12. nunito字体_外贸网站设计中字体有多重要?
  13. android 快速开发,GitHub - limedroid/XDroid: 轻量级Android快速开发框架
  14. 系统集成(IBMS)软件的功能
  15. 使用Layui搭建后台管理界面
  16. 网络安全知识竞赛选择题(31-60题)
  17. 服务器信号满格但网速很慢,信号满格网速太慢是什么原因,网速慢是什么原因-...
  18. 20201123TSW第一站
  19. linux下electron任务栏图标处理
  20. 如何把极坐标化为直角坐标_如何把极坐标化为直角坐标

热门文章

  1. Selenium自动化测试面试题
  2. 企业如何CRM管理软件中受益
  3. 木子-后端-随机验证码的各种实现方法
  4. java赵云主角兵器谱游戏_赵云赵子龙的外号有哪些?赵云的武器是什么 赵
  5. .bat文件闪退,原因及解决
  6. 1.关于tomcat的startup.bat文件闪退,而日志文件没有任何信息
  7. Reducing Fractions
  8. Android Studio 光标莫名其妙加粗后,与 insert 键相反的问题
  9. NVIDIA嵌入式开发板Jetson TX1教程
  10. 基于“机器学习”的智能聊天机器人---python实现(1)