题目链接

给出长度为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. 前端学习笔记-CSS

  2. luogu p1003

    P1003 题意 经过多个矩形(1e3)覆盖后后某个坐标属于那个矩形(仅仅是一次询问) 大水题,直接的做法,从后向前处理矩形是否覆盖查询的点,若覆盖,则是该矩形编号 题解 int get_num(){ ...

  3. web自动化-selenium2入门讲解(mac版本)

    最近要做一个selenium2的分享,于是总结了下我用selenium2的感受,希望分享出来,可以对入门的小伙伴有一点帮助,也希望得到大佬的指教   一,环境搭建maven+selenium2+tes ...

  4. 实现js保留小数点后N位的代码

    在JS中,一般实现保留小数点后N位的话,都是利用toFixed函数 <script language="javascript"> document.write(&quo ...

  5. 修改Myeclies作者用户名

    首先点击 windos 点击 preferences 依次点击左侧 Java -> Code Style -> Code Templates 击右侧Comments,将其中的Types项, ...

  6. qt quick中qml编程语言

    Qt QML 入门 — 使用C++定义QML类型 发表于 2013 年 3 月 11 日   注册C++类 注册可实例化的类型 注册不实例化的QML类型 附带属性 注册C++类 注册可实例化的类型 如 ...

  7. vue自定义一个过滤器

    vue如何自定义一个过滤器 html代码: <div id="app"> <input type="text" v-model="m ...

  8. 【Codeforces Round #483 (Div. 2) C】Finite or not?

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 有个性质. 如果p/q是分数的最简形式. 那么p/q能化成有限小数. 当且仅当q的质因数分解形式中只有质因子2和5 (且不能出现其他 ...

  9. TCP的可靠传输(依赖流量控制、拥塞控制、连续ARQ)

    TCP可靠性表现在它向应用层提供的数据是无差错,有序,无丢失,即递交的和发送的数据是一样的. 可靠性依赖于流量控制.拥塞控制.连续ARQ等技术 <TCP/IP详解>中的“分组”是不是就是报 ...

  10. java有参无参构造器的的执行顺序

    这里拿了用数组构造栈的一段代码说明一下 public class StackArray<E> { private Object[] data = null; private int max ...