题目链接

给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)

例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。
Input
第1行:1个数N,N为序列的长度(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
Output
输出最长递增子序列的长度。
--------------------------------------------------------------------------------------------------------------
很容易想到N^2的做法,F[i] = max{F[j],0<=j<i且Aj<Ai} + 1。
但是N有5w,N^2肯定过不了。
于是写了个线段树,维护区间最大值。求F[i]时只需一次查询和一次更新。
具体做法为:
1,离散化
2,建树
3,  查询和更新
for i = 0...N
     int tmp = query(1,A[i]-1) + 1;  //查询1~A[i]-1之间的最大值。
     ans = max{ans,tmp};
     update(A[i],tmp);    //更新A[i]经过的区间。
end for
#define  _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int N = ;
int A[N], B[N];
int Cnt; map<int, int> mapper; struct Node{
int l,r;
int maxv;
Node(){ maxv = ; }
int mid(){ return (l + r) >> ; }
};
Node segtree[N*];
void build(int id, int l, int r){
segtree[id].l = l;
segtree[id].r = r;
if(l==r) return;
int mid = segtree[id].mid();
build(id*+,l,mid);
build(id*+,mid+,r);
}
void update(int id, int pos, int val){
segtree[id].maxv = std::max(segtree[id].maxv, val);
if(segtree[id].l==segtree[id].r) return;
int mid=segtree[id].mid();
if(pos<=mid)
update(id*+,pos,val);
else update(id*+,pos,val);
}
int query(int id,int l,int r){
if(segtree[id].l==l&&segtree[id].r==r)
return segtree[id].maxv;
int mid = segtree[id].mid();
if(l>mid) return query(id*+,l,r);
if(r<=mid) return query(id*+,l,r);
return std::max(query(id*,l,mid),query(id*+,mid+,r));
}
int main(){
int n; cin>>n;
for(int i=;i<n;i++) scanf("%d",A+i);
memcpy(B,A,sizeof(int)*n);
std::sort(B,B+n);
Cnt = std::unique(B,B+n)-B;
for(int i=;i<Cnt;i++) mapper[B[i]]=i+;
for(int i=;i<n;i++) A[i]=mapper[A[i]]; build(,,Cnt+); int ans = ;
for(int i=;i<n;i++){
int tmp = query(,,A[i]-)+;
ans = std::max(ans, tmp);
update(,A[i],tmp);
}
printf("%d\n",ans);
return ;
}
 

最新文章

  1. No.004:Median of Two Sorted Arrays
  2. Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()
  3. STC12C5A60S2笔记1(管脚定义)
  4. Base64 Converter
  5. MST:Agri-Net(POJ 1258)
  6. js分辨浏览器类别和版本
  7. 从0到1搭建移动App功能自动化测试平台(0):背景介绍和平台规划
  8. MallBuilder 多用户商城管理系统 v5.8.1.1
  9. python 从SocketServer到 WSGIServer 源码分析、
  10. 使用C++的开源序列化(Serialization)库cereal
  11. qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用
  12. L2-004. 这是二叉搜索树吗?
  13. html、css和js注释的规范用法
  14. TestLink和RedMine的集成
  15. 关于 JavaScript 中的继承
  16. 浅谈 Angular 项目实战
  17. css加载会造成阻塞吗
  18. ios之好用的Reachability
  19. js中const,var,let区别(转载)
  20. Vue2+VueRouter2+webpack 构建项目实战(一):准备工作

热门文章

  1. WEB前端开发常用的优化技巧汇总
  2. &lt;Android Framework 之路&gt;Android5.1 Camera Framework(三)
  3. web.xml中的url-pattern写法规则及匹配过程
  4. C++面向对象的设计思想——小结
  5. 【AnjularJS系列5 】— scopes、module、controller
  6. 字符串时间转Date格式
  7. node——进阶版服务器根据不同请求作出不同响应+响应html文件等文件
  8. github删除项目or仓库
  9. jQuery 文档操作
  10. java缓冲区BufferedReader