题目链接

给出长度为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. LinrFont UWP 字体预览工具下载

    Windows 10 用户 购买 https://www.microsoft.com/zh-cn/p/linrfont/9nkh5mlvt819

  2. 使用http-server开启一个本地服务器

    前言 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时,HTML页面就无法正常打开,为了解决这种情况,需要在在本地 ...

  3. vue中slot组件的使用

    插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. Slot 是在组件模板中设置的用于在父组件中 ...

  4. VMware虚拟机共享文件夹

    安装好虚拟文件夹后,第二次开机时发现/mnt/hgfs目录下找不到共享的文件夹,原因是vmfg-fuse服务没有开启. 在root的配置文件中添加如下代码,设置开机自启: /usr/bin/vmhgf ...

  5. 区间dp+四边形不等式优化

    区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...

  6. Docker-镜像的操作命令

    2.镜像在Ubuntu中的一些命令 (1)docker image ls 列出镜像 能够罗列出docker中所以的镜像所在的仓库.镜像标签.镜像ID.镜像的创建日期.镜像的大小等等信息. (2)doc ...

  7. CSS布局总结(一)

    前言:今天是学校为期六周的实训第一天,实训课感觉很水,第一天讲的竟然是HTML...实训老师丢了一个静态页面给我们做.感觉很久没写过这种东西,突然觉得自己的基本功很渣.布局这方面感觉需要总结一下,然后 ...

  8. [学习笔记] CS131 Computer Vision: Foundations and Applications:Lecture 2 颜色和数学基础

    大纲 what is color? The result of interaction between physical light in the environment and our visual ...

  9. python的装饰器,迭代器用法

    装饰器. 装饰器实际就是一个函数 定义:在不改变内部代码和调用方式的基础上增加新的功能 了解装饰器需要了解3个内容: 1.函数即变量 2.高阶函数 1).把一个函数名当作实参传给另一个函数 2).返回 ...

  10. koa,express,node 通用方法连接MySQL

    这个教程不管node,express,koa都可以用下面方法连接,这里用koa做个参考 这个教程的源码地址: https://github.com/xiaqijian/... 新建文件目录,我是这样子 ...