题目链接

给出长度为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 ;
}
 

51nod-1134 最长递增子序列,用线段树将N^2的dp降到NlogN的更多相关文章

  1. 51nod 1134 最长递增子序列

    题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...

  2. 51nod 1134最长递增子序列

    1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素 ...

  3. LCS 51Nod 1134 最长递增子序列

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  4. 51Nod - 1134 最长递增子序列【动态规划】

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个数N ...

  5. LIS 51Nod 1134 最长递增子序列

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  6. 51Nod 1134 最长递增子序列(动态规划O(nlogn))

    #include <iostream> #include <algorithm> #include <stdio.h> #define MAXN 50010 usi ...

  7. 51nod 1376 最长递增子序列的数量(线段树)

    51nod 1376 最长递增子序列的数量 数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递 ...

  8. 51Nod:1134 最长递增子序列

    动态规划 修改隐藏话题 1134 最长递增子序列  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递 ...

  9. 51nod 1218 最长递增子序列 | 思维题

    51nod 1218 最长递增子序列 题面 给出一个序列,求哪些元素可能在某条最长上升子序列中,哪些元素一定在所有最长上升子序列中. 题解 YJY大嫂教导我们,如果以一个元素结尾的LIS长度 + 以它 ...

随机推荐

  1. C#将内容导出到Word到指定模板

    昨天做了下导入导出Excel文件,今天研究了下导出Word文件. 从网上找了半天才找到了一个能导出到指定模板的,在这里总结下. 导出模板原理就是利用的替换占位符. 我这里先建立好了一个模板, 接下来写 ...

  2. SQL Server死锁排查

    1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...

  3. 响应式网页设计:互联网web产品RWD概念

    RWD(Responsive Web Design)可称为自适应网页设计.响应式网页设计.响应式网页设计等等,是一种可以让网页的内容可以随着不同的装置的宽度来调整画面呈现的技术,让使用者可以不需要透过 ...

  4. 基于cxf的webService服务发布及客户端开发

    学习地址: http://www.cnblogs.com/leihenqianshang/category/795140.html

  5. CF #487 (Div. 2) D. A Shade of Moonlight 构造_数形结合

    题意: 给 nnn个长度为 lll 且互不相交的开区间 (xi,xi+l)(x_{i}, x_{i}+l)(xi​,xi​+l) ,每个区间有一个移动速度 vvv,v∈1,−1v∈1,-1v∈1,−1 ...

  6. Pyhton学习——Day23

    #re模块方法:findall search#findall:返回所有满足匹配条件的数值,放在列表里#search : #函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象 ...

  7. c 最简单的链表

    #include <stdio.h> struct node { int data; struct node *next; //指向本身的指针 }; // main() { struct ...

  8. Android S5PV210 fimc驱动分析 - fimc_capture.c

    fimc_capture.c在FIMC系统中的位置,网上偷来的一幅图片 http://blog.csdn.net/kickxxx/article/details/7733482 43 static c ...

  9. NOIP2018提高组金牌训练营——字符串专题

    NOIP2018提高组金牌训练营——字符串专题 1154 回文串划分 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式.   a|bb|aabaa - 3 个 ...

  10. Vue 做项目经验

    Vue 做项目经验 首先需要知道最基本的东西是: Vue 项目打包:npm run build Vue生成在网页上看的端口:npm run dev 修改端口号的地方在: config文件夹下index ...