AcWing 789. 数的范围 二分+模板
2024-09-06 13:51:42
https://www.acwing.com/problem/content/791/
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m;
int q[N];
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<n; i++) scanf("%d",&q[i]);
while(m--) {
int x;
scanf("%d",&x);
int l=,r=n-;
while(l<r) {
int mid=l+r>>;
if(q[mid]>=x) r=mid;
else l=mid+;
}
if(q[l]!=x) cout<<"-1 -1"<<endl;
else {
cout<<l<<" ";
int l=,r=n-;
while(l<r) {
int mid=l+r+>>;
if(q[mid]<=x) l=mid;
else r=mid-; //当更新方式为l=mid r=mid-1
}
cout<<l<<endl;
}
}
return ;
}
模板 这两个模板的区别在于去mid的时候是否+1 平时写的时候可以先不写+1, 然后当更新方式为l=mid, r=min-1时,再写上加1
解释+1:
举例子,因为时向下取整,当l=r-1,如果不补上+1,那么min=l+r+1>>1=l 此时 如果说check时成功的 区间更新为l=mid=l 区间没有发生变化 ,那么下次循环也不会变,所以会形成死循环
当补上+1 mid会变成r 区间更新为l=mid=r 区间会从[l,r] 变成[r,r] 就不会发生死循环
bool check(int x) {/* ... */} // 检查x是否满足某种性质 // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> ;
if (check(mid)) r = mid; // check()判断mid是否满足性质
else l = mid + ;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + >> ;
if (check(mid)) l = mid;
else r = mid - ;
}
return l;
}
//整数二分
最新文章
- MyBatis中collection (一对一,一对多)
- JavaScript confirm 自定义风格及功能实现
- Bete冲刺第六阶段
- Mysql Index、B Tree、B+ Tree、SQL Optimization
- mysql中如何把字符串转换成日期类型
- IOS开发中(null)与<;null>;的处理
- VS2010常用插件介绍
- Android的十六进制颜色值
- Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结
- uva 10020 Minimal coverage
- Unity uGUI 登录界面
- HDU 3127 WHUgirls
- wordpress安装插件--su
- STL中队列(queue)的使用方法
- Codeforces Round #554 (Div. 2) C. Neko does Maths(数学+GCD)
- redis-sentinel高可用配置(2)
- mysql的root的权限被控制无法授权
- IIS中添加ftp站点
- python-pycharm中使用anaconda部署python环境
- 如何获得 Microsoft Push Notification Service(MPNS)的最佳体验
热门文章
- Arduino上搭建ESP8266环境
- UVA1401 (字典树加简单dp)
- PAT (Basic Level) Practice (中文)1046 划拳 (15 分)
- 51Nod 1284 2 3 5 7的倍数 (容斥定理)
- 问题 I: 排名
- 主机名由localhost变成bogon是怎么回事,怎样变回localhost这个名字?
- 2_abstractions
- clone()与clone(true)的用法
- Python发带附件的邮件
- vue学习指南:第十五篇(详细) - Vuex