lower_bound它有三个参数, 第一个和第二个是给定区间起点和终点的指针,第三个参数是要查找的数,它的作用原理是在给定的区间中进行二分查找,这个二分区间是前开后闭的,他返回第一个大于等于它的函数指针,例如数组 a[100] = {3, 4, 5, 6, 7, 10, 12, 34, 55}; 想找2的话,返回就返回第一个a[0]的位置,找8,就返回a[5]的位置,如果找99,比任何数都大,那么就返回数组中最后一个的下一个位置,就返回9,所以,这是可以越界的,有个测试程序,可以看下他的结果

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int a[] = {, , , , , , , , };
int b = lower_bound(a, a + , ) - a;
//查看数组是否改变
for (int i = ; i < ; i++)
printf("%d ", a[i]);
puts(""); int c = lower_bound(a, a + , ) - a;
int d = lower_bound(a, a + , ) - a;
int e = lower_bound(a, a + , ) - a;
printf("b = %d, c = %d, d = %d, e = %d\n", b, c, d, e); return ;
}

下面这道题,正好可以用下这个练练手,这个题就是将x拍完序之后,找 最长递增子序列,最长递减子序列 中的最大值,在找子序列位置时(用的O(nlog(n))的算法)用到这个,代码如下,也是这个题的最优代码:

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include<functional>
#define CLEAR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int MAX = + ;
int y[MAX], dp1[MAX], dp2[MAX];
int main()
{
int N;
scanf("%d", &N);
while (N--)
{
CLEAR(y, );
CLEAR(dp1, );
CLEAR(dp2, );
int n;
scanf("%d", &n);
int x;
for (int i = ; i < n; i++)
{
scanf("%d", &x);
scanf("%d", &y[x-]);
}
int num1 = , num2 = ;
int num = remove(y, y + MAX, ) - y;
for (int i = ; i < num; i++)
{
int *p = lower_bound(dp1, dp1 + num1, y[i]);
int *q = lower_bound(dp2, dp2 + num2, y[i], greater<int>());
if (p - dp1 == num1)
num1++;
if (q - dp2 == num2)
num2++;
*p = y[i];
*q = y[i];
}
printf("%d\n", max(num1, num2));
} return ;
}

关于lower_bound()的用法--NYOJ 201作业题的更多相关文章

  1. NYOJ 201 作业题

    作业题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过 ...

  2. upper_bound和lower_bound的用法

    首先介绍这两种函数是什么意思 upper_bound是找到大于t的最小地址,如果没有就指向末尾 lower_bound是找到大于等于t的最小地址 题目链接:https://vjudge.net/con ...

  3. C++ lower_bound/upper_bound用法解析

    1. 作用           lower_bound和upper_bound都是C++的STL库中的函数,作用差不多,lower_bound所返回的是第一个大于或等于目标元素的元素地址,而upper ...

  4. STL lower_bound upper_bound 用法

    1.lower_bound(begin,end,x) 返回第一个>=x的位置,找不到return .end() 2.upper_bound (begin,end,x) 返回第一个>x的位置 ...

  5. c++ list, vector, map, set 区别与用法比较

    http://blog.csdn.net/alex_xhl/article/details/37692297 List封装了链表,Vector封装了数组, list和vector得最主要的区别在于ve ...

  6. STL map 用法

    首先make_pair Pairs C++标准程序库中凡是"必须返回两个值"的函数, 也都会利用pair对象  class pair可以将两个值视为一个单元.容器类别map和mul ...

  7. map的详细用法

     map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  8. map用法详解

    转自:http://www.kuqin.com/cpluspluslib/20071231/3265.html Map是 STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在 ...

  9. Map基本用法

    Map的基本用法 map内部使用的是红黑树,在map内部所有的数据都是有序的 map插入有三种方法: insert(pair<int,string>(i,str)); myMap.inse ...

随机推荐

  1. K-means聚类

    聚类算法,无监督学习的范畴,没有明确的类别信息. 给定n个训练样本{x1,x2,x3,...,xn} kmeans算法过程描述如下所示: 1.创建k个点作为起始质心点,c1,c2,...,ck 2.重 ...

  2. Android 多线程:使用Thread和Handler

    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分 ...

  3. HTML5 QQ登录背景动态图片

    预览效果如图所示: 代码如下: <!DOCTYPE html> <head> <meta http-equiv="Content-Type" cont ...

  4. POJ3274 hash

    POJ3274 问题重述: 已知有n头牛,用一个K位二进制数Ak,Ak-1,...,A1表示一头牛具有的特征,Ai=1表示具有特征i.现给定按顺序排列的N头牛的k位特征值,称某个连续范围内“特征平衡” ...

  5. span宽度高度设置

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. PHP 运算符 详解

    PHP 算数运算符 运算符 名称 例子 结果 + 加法 $x + $y $x 与 $y 求和 - 减法 $x - $y $x 与 $y 的差数 * 乘法 $x * $y $x 与 $y 的乘积 / 除 ...

  7. 12100 Printer Queue(优先队列)

    12100 Printer Queue12 The only printer in the computer science students’ union is experiencing an ex ...

  8. Tomcat中配置多个端口

    在tomcat的conf/server.xml中,配置多个端口,如下: <?xml version="1.0"?> <!--应用1,端口port="80 ...

  9. PHP简单获取数据库查询结果并返回JSON

    <?php header("Content-type:text/html;charset=utf-8"); //连接数据库 $con = mysql_connect(&quo ...

  10. struts2整合spring的思路

    struts2整合spring有有两种策略: >sping容器负责管理控制器Action,并利用依赖注入为控制器注入业务逻辑组件. >利用spring的自动装配,Action将自动会从Sp ...