C1. Guessing the Greatest (easy version)
C2. Guessing the Greatest (hard version)

Codeforces C题Guessing the Greatest分为easy和hard两个版本,唯一区别在于对询问次数的限制,以下给出easy版本的题面



Example

input

5

3

4

output

? 1 5

? 4 5

! 1


题目大意

给定一个长度为n的数组,数组中的元素都不相同,每次可以询问[l,r] (l<r)区间内第二大数的位置,在限定询问次数内,找出最大数的下标位置。

分析

两个版本的基本思路都是二分,hard版本限定的询问次数更少
设答案所在的区间是[l,r],中点为mid,第二大数所在位置是smax

easy version

先询问[l,r],如果smax<=mid,再询问[l,mid],如果再次询问第二大数的位置还是smax,说明最大数所在区间为[l,mid],反之最大数所在区间为[mid+1,r],smax>mid的情况同理。这样通过两次询问就可以将答案的区间缩小一半,通过计算,最大询问次数为2*⌈log2105⌉=34

hard version

首先询问[1,n],确定第二大数的位置smax,如果smax>1,再询问[1,smax],如果第二大数的位置不变,说明最大数所在区间为[1,smax-1],否则最大数所在区间为[smax+1,n],通过不超过两次的询问确定smax和最大值所在位置的大小关系,便于下一步判断。以最大值所在区间为[1,smax-1]为例,此时l=1,r=smax-1,中点为mid,每次询问[mid,smax],如果第二大数的位置仍为smax,说明最大数在[mid,smax-1],只需让l=mid,否则r=mid-1,最大值在区间[smax+1,n]的情况是类似的。通过计算,这种方法的最大询问次数为2+⌈log2105⌉=19

AC代码

easy version

#include <bits/stdc++.h>
using namespace std;typedef long long ll;int ask(int l,int r)
{if(l>=r) return 0;int x;cout<<"? "<<l<<" "<<r<<endl;cin>>x;return x;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;int l=1,r=n;int x,y;while(l<r){if(r-l==1){x=ask(l,r);if(x==l) l=r;break;}int mid=(l+r)>>1;x=ask(l,r);if(x<=mid){y=ask(l,mid);if(y==x) r=mid;else l=mid+1;}else{y=ask(mid+1,r);if(y==x) l=mid+1;else r=mid;}}cout<<"! "<<l<<endl;return 0;
}

hard version

#include <bits/stdc++.h>
using namespace std;typedef long long ll;int ask(int l,int r)
{int num;cout<<"? "<<l<<" "<<r<<endl;cin>>num;return num;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;int x,y;int l,r;x=ask(1,n);if(x!=1) y=ask(1,x);if(y!=x||x==1){l=x+1,r=n;while(l<r){int mid=(l+r)>>1;if(ask(x,mid)!=x) l=mid+1;else r=mid;}}else{l=1,r=x-1;while(l<r){int mid=(l+r+1)>>1;if(ask(mid,x)!=x) r=mid-1;else l=mid;}}cout<<"! "<<l<<endl;return 0;
}

注意

1.在easy version中如果r-l==1,此时[l,r]已经是可以询问的最小区间,只需一次询问便可确定最大值的位置,这种情况单独判断
2.在hard version中,两种情况下mid的取值有所差别,mid=(l+r)>>1还是mid=(l+r+1)>>1与区间二分时l,r的取值有关

Codeforces Round #703 (Div. 2) C. Guessing the Greatest相关推荐

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

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

  2. Codeforces Round #703 (Div. 2)

    Codeforces Round #703 (Div. 2) 题号 题目 知识点 A Shifting Stacks 思维 B Eastern Exhibition 思维 C1 Guessing th ...

  3. Codeforces Round #703 (Div. 2) 题解

    文章目录 A. Shifting Stacks B. Eastern Exhibition C. Guessing the Greatest D. Max Median E. Paired Payme ...

  4. Codeforces Round #703 (Div. 2)(A ~ F)超高质量题解【每日亿题2 / 19】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A. Shifting Stacks B - Eastern Exhibition C1 - G ...

  5. Codeforces Round #703 (Div. 2) A-E 题解

    Shifting Stacks 给你 n 长度的数组,每个下标包含 000-nnn 个木块 其中可以将某一位置的木块向右边平移 请问是否能凑出高度严格上升的数组 一开始想简单了 直接判断木块的和是否大 ...

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

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

  7. Codeforces Round #703 (Div. 2) E. Paired Payment 最短路 + 思维

    link 题意: 给一张图,每次只能一下走两个点,比如当前在aaa,往下走到bbb再到ccc,权值为(wa,b+wb,c)2(w_{a,b}+w_{b,c})^2(wa,b​+wb,c​)2.求1到其 ...

  8. Codeforces Round #703 (Div. 2) B.Eastern Exhibition 中位数结论

    link 题意: 给n个点,求有多少个点到所有点距离之和最小. 中位数结论题了,可以考虑一维的情况,让后二维的话乘起来就好啦. //#pragma GCC optimize(2) #include&l ...

  9. Codeforces Round #703 (Div. 2) D . Max Median 二分 +思维

    传送门 题意: 给定一个数组和k,求一段连续区间中位数最大值,连续区间长度>=k. 如果=k的话可以直接秒了,这里是>=k,我们可以通过二分让后利用>=k这个条件来检查答案. 二分中 ...

最新文章

  1. 想 new 个对象过七夕,她却抛了异常
  2. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
  3. 【手记】解决启动SQL Server Management Studio 17时报Cannot find one or more components...的问题
  4. 【Linux】35. python脚本重命名各子目录下的图片
  5. 使用ALV中输出ICON
  6. GPRS底层API(转)
  7. java 不支持fork,grails不能运行fork模式解决方法
  8. R语言学习 - 非参数法生存分析
  9. oracle出现12505错误的解决步骤
  10. SpringBoot2.0.3 + SpringSecurity5.0.6 + vue 前后端分离认证授权
  11. 解决IE浏览器URL乱码的问题
  12. 解决centos7 ssh连接慢的问题
  13. flashfxp修改服务器密码,flashfxp服务器端设置
  14. 解决 mac系统下sublime imput 函数交互问题
  15. 重读微积分(八):全微分和法线
  16. 深度走心字节跳动内推
  17. 拼多多又起一事:因为看到同事被抬上救护车我被拼多多开除了
  18. 计算机桌面壁纸小,电脑的桌面壁纸大小怎么设置
  19. HTML 设置背景图片自适应
  20. 简单理解XHR、Ajax、Axios、Promise

热门文章

  1. Python有趣|数据分析三板斧
  2. 一般空间曲线的旋转曲面、椭球面、单叶双曲面,双叶曲面
  3. window10 20H2安卓模拟器VT检测不到问题解决方法
  4. 循环(环形)缓冲区之Boost::circular_buffer
  5. Angular8简单方式实现表格固定表头和冻结列
  6. FX5u控制4个伺服,一个完整的项目 程序用 标签分层,说明了定位控制中的公共参数设定、回原点、
  7. 邮箱服务RBL黑名单申诉
  8. 三极管与mos管通俗讲解
  9. The Google File System 中文版论文(下)(转载)
  10. 关于ASCII码和ANSI码,以下说法不正确的是()?