P1020 [NOIP1999 普及组] 导弹拦截

这篇博客介绍了如何利用STL中的lower_bound和upper_bound函数,结合二分查找,解决O(nlogn)求最长不上升子序列长度的问题。通过举例说明了这两个函数的作用、用法和返回值,并提供了AC代码,适合初学者理解算法思路。
摘要由CSDN通过智能技术生成

做这道题的时候看了很多题解,也没看懂,各种查终于弄明白了O(nlogn)的方法,自己来写一篇,试试能不能让更多人知道QwQ

注:树状数组做法请去别的大佬那里看,树状数组还是挺重要的。

这道题的做法很多,别的dalao题解里都有

dalao们也说了,根据"xxxx定理",这题只需要求一个不上升序列长度和一个上升序列长度

我只说说如何找出它们的长度

写给萌新看,求dalao们轻喷(>﹏<)

(如果有锅请dalao们指出)

一、lower_bound与upper_bound

zhx曾经曰过,STL很慢

hja曾经曰过,觉得STL慢是以zhx为首的一批oi选手的偏见

我们不管他们曰过什么,只来看看这两个函数

1.作用

这两个是STL中的函数,作用很相似:

假设我们查找x,那么:

lower_bound会找出序列中第一个大于等于x的数

upper_bound会找出序列中第一个大于x的数

没错这俩就差个等于号╮(╯▽╰)╭

2.用法

以下都以lower_bound做栗子 (因为upper_bound做出的栗子不好吃)

(其实就是我懒得打两遍)

它们俩使用的前提是一样的:序列是有序

对于一个数组a,在[1,n]的区间内查找大于等于x的数(假设那个数是y),函数就写成:

lower_bound(a + 1, a + 1 + n, x);

函数返回一个指向y的指针

看着是不是很熟悉?回想sort使用的时候:

sort(a, a + 1 + n, cmp);

这里a+1,a+1+n的写法是不是很像?

STL里面的函数写区间一般都这个尿性

同样的,lower_boundupper_bound也是可以加比较函数cmp的:

lower_bound(a + 1, a + 1 + n, x, cmp);

到这里不得不说说前面的"有序序列",这里的"有序"是对什么有序?

你可能已经猜到了,它是对于比较器有序,并且必须是升序

(为什么不是降序?这个你可能要去问问写STL的人)

一旦对降序序列使用lower_bound,就会出现神奇的错误,具体原因可以看这篇:

https://blog.csdn.net/qq1337715208/article/details/81072709

当然比较器默认也是""

如果要在一个下降序列里寻找一个小于x的数呢?

根据我们之前说的,lower_bound只能对上升序列使用,那我假装下降序列是个上升序列就行了嘛~

(lower_bound:你当我傻吗)(w1049:没错我就当你傻)

只需要把比较器改成">":

lower_bound(a &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值