首页 > 其他分享 >lower_bound 和 upper_bound函数

lower_bound 和 upper_bound函数

时间:2023-07-09 13:12:45浏览次数:42  
标签:upper lower 容器 int bound dx prev

lower_bound 和 upper_bound函数

一、用法

1.对于递增序列

当容器中的元素按照递增的顺序存储时,lower_bound函数返回容器中第一个大于等于目标值的位置,upper_bound函数返回容器中第一个大于目标值的位置。若容器中的元素都比目标值小则返回最后一个元素的下一个位置。

对于vector和数组,若想用lower_bound获取下标:

对于vector: int pos = lower_bound(v.begin(),v.end(),x)-v.begin();

对于数组: int pos = lower_bound(a,a+n,x)-a;

2.对于递减序列

那么接下来考虑,如果容器中元素是递减的如何查找呢?

可以利用仿函数greater<date_type>()去重新定义比较规则。这样的话对于lowerbound()查找的是容器中第一个小于等于目标值的元素的位置,而upper_bound()查找的是容器中第一个小于目标值的元素的位置就。如果容器中的元素都比目标值大则返回最后一个元素的下一个位置。

set<int,greater<int>>s;
auto it = s.lower_bound(x);//返回第一个小于x的元素的迭代器

二、相关常用操作

1.prev 和 next

1.1 prev反向

先建立一个容器,插入1~10

set<int>s;
for(int i = 1;i<=10;i++)
    s.insert(i);

对于prev:

若用lower_bound,可以或与大于等于目标的第一个数,比如:

cout<<*s.lower_bound(5)<<endl;

输出应该是大于等于5的第一个数,那么就是5

如果用prev的话:

cout<<*prev(s.lower_bound(5))<<endl;

prev起到反向作用,一开始的大于等于变成了小于,那么会找到4

1.2 nxet位移

还是以上述set容器为例

auto it = s.begin();
cout<<*next(it,2)<<endl;

这里会输出3,因为相当于begin后面两个位置的数。

如果参数是负数,就会往前找:

it = --s.end();
cout<<*next(it,-3)<<endl;

会去找末尾往前三个位置,那就是7了。

三、例题

[abc273_d](D - LRUD Instructions (atcoder.jp))

题意:

你有一个\(n\times m\) 的矩阵,矩阵上有 \(N\) 个障碍物,现在给你 \(Q\)次询问,问向 \(R_i\) 的方向走 \(C_i\)步到哪里了。 前一步能影响后一步,障碍物不能越过,不能走出边界。

思路:

首先很明显直接模拟肯定T,那么我们对于一个点需要快速知道离每个方向它最近的的一个障碍物的位置,可以用\(map<ll,set<ll>>\)来快速查找。因为数据范围\(1e9\),需要离散化一下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,x,y;
map<ll,set<ll>>dx,dy;
int main()
{
	cin>>n>>m>>x>>y;
	int N;
	cin>>N;
	for(int i = 1;i<=N;i++)
	{
		ll xx,yy;
		cin>>xx>>yy;
		dx[xx].insert(yy);
		dy[yy].insert(xx);
	}

	for(auto &i:dx)
	{
		i.second.insert(0);
		i.second.insert(m+1);
	}
	for(auto &i:dy)
	{
		i.second.insert(0);
		i.second.insert(n+1);
	}
	
	int q;
	cin>>q;
	for(int i = 1;i<=q;i++)
	{
		char op;
		ll k;
		cin>>op>>k;
		if(op=='L')
		{
			ll nxt_y = y-k;
			if(dx.find(x)==dx.end())//如果在x这一行都没有障碍物那么就直接走,只要不越界
				y = max(nxt_y,1ll);
			else
			{
				auto it = dx[x].lower_bound(y);//找到>=y的第一个
				it = prev(it);
                //prev反向,那么找到<y的第一个(因为我们要向左走)那么*it是第一个不能到达的地方,最多能走到*it+1
				y = max(*it+1,nxt_y);
			}
		}
		else if(op=='R')
		{
			ll nxt_y = y+k;
			if(dx.find(x)==dx.end())
				y = min(nxt_y,(ll)m);
			else
			{

				auto it = dx[x].lower_bound(y);
				y = min(*it-1,nxt_y);
			}
		}
		else if(op=='U')
		{
			ll nxt_x = x-k;
			if(dy.find(y)==dy.end())
				x = max(nxt_x,1ll);
			else
			{
				auto it = dy[y].lower_bound(x);
				it = prev(it);
				x = max(*it+1,nxt_x);
			}
		}
		else
		{
			ll nxt_x = x+k;
			if(dy.find(y)==dy.end())
				x = min(nxt_x,(ll)n);
			else
			{
				auto it = dy[y].lower_bound(x);
				x = min(*it-1,nxt_x);
			}
		}
		cout<<x<<" "<<y<<endl;
	}
	return 0;
}

标签:upper,lower,容器,int,bound,dx,prev
From: https://www.cnblogs.com/nannandbk/p/17538609.html

相关文章

  • IfcRelSpaceBoundary
    IfcRelSpaceBoundary实体定义空间边界通过IfcRelSpaceBoundary与周围元素的关系来定义空间的物理或虚拟分隔符。 在物理空间边界的情况下,可以给出边界的位置和形状,并且参考提供边界的建筑元素,在虚拟空间边界的情况下,可以给出边界的位置和形状,并且参考虚拟元素。IfcRelSpace......
  • bounding box和anchor box的区别
    Boundingbox(边界框)和Anchorbox(锚框)是目标检测中两个不同的概念。Boundingbox(边界框)是用来描述目标在图像中位置和范围的矩形框。它由矩形框的左上角和右下角坐标定义,可以用来标记和定位目标物体。在目标检测任务中,模型通过预测目标物体的边界框来实现目标检测和定位。Anchor......
  • 「模版」二分查找(lower_bound )
    七彩评测题目描述给出有n个元素的由小到大的序列,请你编程找出某元素第一次出现的位置。(n<=1000000)Input第一行:一个整数,表示由小到大序列元素个数:下边n行,每行一个整数:最后一行一个整数x,表示待查找的元素。Output如果x在序列中,则输出x第一次出现的位置,否则输出-1.......
  • 4am,name-of-the-rose-and-dayflower
    4a.m.,玫瑰之名和兰花草Created:2023-06-05T18:59+08:00Published:2023-06-26T19:35+08:00Categories:Fragment目录跳一段忠字舞唯有凌晨四点才能诉说最美丽的语言想读和在读玫瑰的玻璃罩秦海碗:杜绝不快乐自我鉴定星光染发泰戈尔:你微笑着,不对我说什么小王子和玫瑰的名字离......
  • 二分查找法lowerCeil版(找某个重复值的最小下标)利用二分upper法实现
    也是利用二分的upper法实现的,不知道什么是upper?看这里->二分查找法upper版(找大于某个值的最小下标)递归+非递归版-翰林猿-博客园(cnblogs.com)思路:先利用upper找到上界的index拿着index-1的下标(也就是重复值的最大下标)向前遍历,一直到遍历到发现不相等的元素即可。......
  • 二分查找法ceil版(找某个重复值的最大下标)利用二分upper法实现
    如果有等于target的元素就返回最大的下标元素。如果没有等于target的元素,那么就返回大于target的最小元素,即这一篇文章实现的upper函数。二分查找法upper版(找大于某个值的最小下标)递归+非递归版-翰林猿-博客园(cnblogs.com),当然你们也可以更改返回值-1什么的作为查找......
  • 二分查找法upper版(找大于某个值的最小下标)递归+非递归版
    需求:比如说查询一个班级大于60分的最低分等等。思路与二分法基本相同,只不过是对比的逻辑发生了一些小变化,这里所说的上界就是指大于某个值的最小下标。当mid<target:说明target的上界还在mid的右边,所以要去找比mid大的当mid>target:说明mid有可能是target的上界,所以......
  • 2023-06-19 API `getMenuButtonBoundingClientRect` is not yet implemented
    前言:想使用该Api来获取设备导航栏高度,结果报错了:API`getMenuButtonBoundingClientRect`isnotyetimplemented尚未实现API`getMenuButtonBoundingClientRect`原因:该Api不支持在app端或者h5端使用。平台兼容如下: AppH5微信小程序支付宝小程序百度小程序抖音小程序飞书小......
  • ChannelInboundHandlerAdapter 类
    在ChannelInboundHandlerAdapter类中,除了channelActive和channelRead方法之外,还有其他方法用于处理不同类型的入站事件。以下是这些方法的解释说明:channelRegistered(ChannelHandlerContextctx):当Channel已经注册到EventLoop上时调用。可以在这个方法中执行与注......
  • 随笔(十九)『org.apache.ibatis.binding.BindingException: Invalid bound statement (n
    1、错误信息:org.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound)出现此错误时: 1、除了查看代码上的各种名称,映射之类能否找到外。 2、查看下target中是否有对应的xml文件,因为maven默认是不会把非resource中的xml打包进target的 解决方案:pom.xm......