Guessing the Greatest (hard version)-(交互+二分+思维)
题目链接:点击进入
题目
题意
询问区间 [ 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)-(交互+二分+思维)相关推荐
- CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)
题目链接:点击查看 题目分析:给出一个长度为 nnn 的序列,现在可以进行最多 202020 次查询,每次查询可以询问区间 [l,r][l,r][l,r] 中次大值的位置,现在要求在查询后输出最大值的 ...
- Codeforces1486 C1.Guessing the Greatest (easy version)(交互题+二分)
原题链接 题意: 交互题,首先电脑给出序列的长度n.你可以询问区间[l,r]的次大值位置,求序列最大值的位置. 思路: 首先考虑最简单的情况,当区间长度为2时,那么假设区间为[l,r].当询问的次大值 ...
- Codeforces Round #703 (Div. 2) C. Guessing the Greatest
C1. Guessing the Greatest (easy version) C2. Guessing the Greatest (hard version) Codeforces C题Guess ...
- Codeforces Round #703 (Div. 2) Guessing the Greatest C1 C2 二分
link 题意:交互题,每次可以询问一个区间的次大值,保证所有值都不相同,求最大值位置.easy是询问最多40次,hard最多20次. 交互题大部分都是二分,可以向二分考虑. easy比较好想,假设当 ...
- Codeforces Round #703 (Div. 2)C1C2 Guessing the Greatest(二分)
题意: 交互题. query l,r区间内第二大的数,要求得到整个数组最大的数. 思路:首先我们对整体数组进行query 找到第二大的数所在的位置,设这个位置为p. 然后分别对[1,p]和[p,n]进 ...
- CodeForces - 1370F2 The Hidden Pair (Hard Version)(交互题+二分)
题目链接:点击查看 题目大意:给出一棵无向无根树,事先确定好了两个点 s 和 t ,现在需要通过询问找到这两个点 每次询问可以给出一个点集,系统会返回点集中距离点 s 和点 t 距离之和最小的那个点以 ...
- CodeForces - 1543D2 RPD and Rap Sheet (Hard Version)(交互+模拟)
题目链接:点击查看 题目大意:交互题猜密码,设原密码为 xxx,猜的密码为 yyy,如果没猜到,密码会自适应变成 zzz,满足 x⊕z=yx \oplus z=yx⊕z=y ,最多猜 nnn 次,对于 ...
- Codeforces.1129E.Legendary Tree(交互 二分)
题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...
- Showstopper [POJ3484] [二分] [思维]
Description 给你n个数列,问哪一个数字在所有的数列中出现了奇数次(最多一个). Sample Input 1 10 1 2 10 11 10 1 1 10 11 10 1 4 4 1 1 ...
最新文章
- 刘启成_使用if及变量编写LAMP管理脚本
- SET NOCOUNT ON 作用
- swift不用声明类型那些事
- 目前最常用的计算机机箱类型为_绍兴承接离心风机箱高品质
- 封装js千分位加逗号和删除逗号
- 【转】C# HttpWebRequest提交数据方式
- php不能header跳转页面,PHP问题:php header方法跳转页面问题
- AFNetworking下 http 改 https后遇到出现Error Domain=NSURLErrorDomain Code=-999 已取消 错误...
- 程序员面试金典——5.6奇偶位交换
- Hive练习求给出2017年1月的新客数
- Spring 学习笔记---Bean的生命周期
- nunito字体_外贸网站设计中字体有多重要?
- android 快速开发,GitHub - limedroid/XDroid: 轻量级Android快速开发框架
- 系统集成(IBMS)软件的功能
- 使用Layui搭建后台管理界面
- 网络安全知识竞赛选择题(31-60题)
- 服务器信号满格但网速很慢,信号满格网速太慢是什么原因,网速慢是什么原因-...
- 20201123TSW第一站
- linux下electron任务栏图标处理
- 如何把极坐标化为直角坐标_如何把极坐标化为直角坐标
热门文章
- Selenium自动化测试面试题
- 企业如何CRM管理软件中受益
- 木子-后端-随机验证码的各种实现方法
- java赵云主角兵器谱游戏_赵云赵子龙的外号有哪些?赵云的武器是什么 赵
- .bat文件闪退,原因及解决
- 1.关于tomcat的startup.bat文件闪退,而日志文件没有任何信息
- Reducing Fractions
- Android Studio 光标莫名其妙加粗后,与 insert 键相反的问题
- NVIDIA嵌入式开发板Jetson TX1教程
- 基于“机器学习”的智能聊天机器人---python实现(1)