之前讲到过求最长非降子序列的O(N^2)解法。 链接

这次在原来的基础上介绍一下N*logN解法。

该解法主要是维护一个数组minValue,minValue[i]表示最长上身子序列长度为i的数的最小值。

代码如下:

#include <iostream>
using namespace std;
#define inf (1<<29)
const int maxn = 100100;
int n, a[maxn], minValue[maxn];
int getIndex(int R, int x)
{
int L = 0;
while (L <= R)
{
int mid = (L + R) / 2;
if (minValue[mid] < x)
L = mid + 1;
else
R = mid - 1;
}
return L - 1;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++)
cin >> a[i];
minValue[0] = 0;
for (int i = 1; i <= n; i ++)
minValue[i] = inf;
int R = 0;
for (int i = 0; i < n; i ++)
{
int idx = getIndex(R, a[i]);
if (idx+1 > R)
R = idx + 1;
minValue[idx+1] = min(minValue[idx+1], a[i]);
}
cout << R << endl;
return 0;
}

最新文章

  1. 【WPF】 通过FarPoint显示Excel
  2. tomcat管理员配置
  3. iOS开发UITableView基本使用方法总结1
  4. 微软发布WP SDK8.0 新增语音、应用内支付等原生API
  5. doj常用包
  6. jni java和C之间的值传递(int String int[])
  7. 【Python】Coding the Matrix:Week 5 Perspective Lab
  8. css3瀑布流
  9. Chrome中xpath表达式巧妙获取
  10. POJ 3261 可重叠k次最长重复子串
  11. DP的优化总结
  12. WebApi 运行原理
  13. ----关于css中常见单位----
  14. 网页布局设计css中单位px和em,rem的区别
  15. java中网络设置代理
  16. ORM版学员管理系统1
  17. java 把被检查的异常转换为不检查的异常
  18. VNC的安装和常用命令
  19. bat中的“多线程”处理代码
  20. C#程序集系列06,程序集清单,EXE和DLL的区别

热门文章

  1. 微信小程序表单验证(WxValidate使用)
  2. Python 让我舅舅的书法作品和 PIL 库发生点美的误会
  3. Net中委托之二多播委托
  4. Python可变参数*args和**kwargs
  5. Mybatis结果集ResultMap映射
  6. mysql(mariadb)安装
  7. ES6-ES12部分简单知识点总结,希望对大家有用~
  8. Sting -- byte[]互转
  9. (转)Linux的文件权限与目录配置
  10. vue异步组件?