博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长严格上子序列(二分优化)
阅读量:4662 次
发布时间:2019-06-09

本文共 933 字,大约阅读时间需要 3 分钟。

http://codevs.cn/problem/3955/  原题网站
题目描述 
Description

给一个数组a1, a2 ... an,找到最长的上升降子序列ab1<ab2< .. <abk,其中b1<b2<..bk。

输出长度即可。

 

输入描述 
Input Description

第一行,一个整数N。

第二行 ,N个整数(N < = 1000000)

 

输出描述 
Output Description

输出K的极大值,即最长不下降子序列的长度

样例输入 
Sample Input

5

9 3 6 2 7

 

 

样例输出 
Sample Output

3

数据范围及提示 
Data Size & Hint

n<=1000000

为了方便大家调试,数据名称已被修改——THREE

 

#include<iostream>

#include<cstdio>
using namespace std;
int a[1000001],f[1000001];//用于记录数列中单调不下降的值,是有序的。
int find(int *a,int len,int n)//二分查找当前元素应在f中的下标
{
int l=0,r=len,mid=(l+r)/2;
while (l<=r)
{
if (a[mid]>n) r=mid-1;
else if (a[mid]<n) l=mid+1;
else return mid;
mid=(l+r)/2;
}
return l;
}
int main()
{
int n,len,j;//len用于记录f中以求出元素的最大下标
cin>>n;
for (int i=0;i<=n-1;i++)
cin>>a[i];

f[1]=a[0];

len=1;//此时数组f中只有一个元素,最大下标为1

for (int i=1;i<=n;i++)
{
j=find(f,len,a[i]);
f[j]=a[i];
if (j>len)//更新len(由于二分查找,j只能比len大1)
len=j;
}
cout<<len;
return 0;
}

转载于:https://www.cnblogs.com/sjymj/p/5180446.html

你可能感兴趣的文章
【HDU】1542 Atlantis
查看>>
解决Android SDK Manager更新时出现问题
查看>>
Android Studio下“Error:Could not find com.android.tools.build:gradle:2.2.1”的解决方法
查看>>
第二章 第四节 添加SWT库
查看>>
docker file
查看>>
总结一些常见的国际标准化组织
查看>>
使用mybatis进行多条件的模糊查询的方式
查看>>
SqlServer 垂直分表
查看>>
BZOJ 1677: [Usaco2005 Jan]Sumsets 求和
查看>>
缓冲流
查看>>
DIV不用图片做可变可到处用的圆角
查看>>
luogu3899谈笑风生
查看>>
博客推荐
查看>>
MyBatis-Spring配置简单了解
查看>>
汇编语言 Part 1——简介、基本语法、内存分段与内存地址
查看>>
java创建线程的三种方式及其对照
查看>>
unity常见问题之20题
查看>>
AI类第四周进度
查看>>
SQLServer学习笔记系列7
查看>>
【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法
查看>>