AcWing 789. 数的范围 二分+模板
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;
}
//整数二分
AcWing 789. 数的范围 二分+模板的更多相关文章
- AcWing 789.数的范围
AcWing 789.数的范围 题目描述 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询. 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数). 如果数组中不存在该元素, ...
- 51nod 1001 数组中和等于K的数对【二分查找/排序】
1001 数组中和等于K的数对 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组 ...
- 51nod 1105 第K大的数 【双重二分/二分套二分/两数组任意乘积后第K大数】
1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...
- bzoj 1594: [Usaco2008 Jan]猜数游戏【二分+线段树】
写错一个符号多调一小时系列-- 二分答案,然后判断这个二分区间是否合法: 先按值从大到小排序,然后对于值相同的一些区间,如果没有交集则不合法:否则把并集在线段树上打上标记,然后值小于这个值的区间们,如 ...
- POJ 1741.Tree and 洛谷 P4178 Tree-树分治(点分治,容斥版) +二分 模板题-区间点对最短距离<=K的点对数量
POJ 1741. Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 34141 Accepted: 11420 ...
- FJUT3703 这还是一道数论题(二分 + hash + manacher 或者 STL + hash 或者 后缀数组 + hash)题解
Problem Description 最后来个字符串签个到吧,这题其实并不难,所需的算法比较基础,甚至你们最近还上过课. 为了降低难度,免得所有人爆零.这里给几个提示的关键字 :字符串,回文,二分, ...
- C++_函数4-函数重载与函数模板
函数重载 多个函数,函数名相同,但是调用的时候,参数不同. 函数多态是C++在C语言的基础上新增的功能.多态指的是有多种形式,因此函数多态允许函数可以有多种形式.术语“函数重载”指的是可以有多个同名的 ...
- 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...
- [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)
传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...
随机推荐
- Pyecharts-数据可视化模块
Pyecharts 介绍 数据可视化模块 Echarts是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可.而Python是一门富有表达力的语言,很适合用于数据处 ...
- babel环境安装与编译
babel:将浏览器不支持的ES6语法转为javascript 查看node是否安装: npm -v node -v 实例演示:在桌面新建part5目录在cmd命令行中 cd desktop cd p ...
- Linux 用户命令
用户管理的命令 添加删除用户,注意的是,涉及到权限的修改,只能用root去操作,其他人基本上没权限 useradd caixukun #创建用户caixukunpasswd caixukun #给 ...
- GNU Radio无线通信嗅探基础
文章内容简介 1.使用哪些grc模块完成我们的嗅探工作 2.如何选择参数以获取最完美的波形 3.如何从波形还原回数据 我接下来会使用电视棒(RTL-SDR)嗅探一个固定码遥控锁开发组件. 我使用如下的 ...
- 你这是virus吧?
谁在我的vps上跑了这个?我的备份终于起一定作用了. GO declare @sql varchar(8000) while (select count(*) from sysobjects wher ...
- react admin
react admin 管理后台的快速创建方式
- BZOJ的思维题
5085:最大 给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形 的价值. 关键点是要想到把这些值排序 值从小到大考虑,比如说现在最小的值是(x1 ...
- Microsoft Visual Studio 显示行号
工具下面有一个选项
- WSO2 ESB XML定义语法(2)
5.Proxy Service 配置 <proxy>元素用于定义Synapse代理服务. 通过基础Axis2引擎在指定的传输上创建和公开代理服务,根据标准的Axis2约定(即基于服务名称) ...
- jQuery---jQuery对象与DOM对象的区别
jQuery对象与DOM对象的区别 1. DOM对象:使用JavaScript中的方法获取页面中的元素返回的对象就是dom对象.2. jQuery对象:jquery对象就是使用jquery的方法获取页 ...