之前一直是用二分

但是因为比较难理解,写的时候也容易忘记怎么写。

今天比赛讲评的时候讲了一种用树状数组求LIS的方法

(1)好理解,自然也好写(但代码量比二分的大)

(2)扩展性强。这个解法顺带求出以i为结尾的LIS,而很多题要用到这个数组来做

而二分的做法求得是当前长度下的最小值,不容易拓展。

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e3 + ;
int a[MAXN], b[MAXN], n, m, ans;
int dp[MAXN], f[MAXN]; inline int lowbit(int x) { return x & (-x); } void motify(int x, int p)
{
for(; x <= m; x += lowbit(x))
f[x] = max(f[x], p);
} int get_max(int x)
{
int res = ;
for(; x; x -= lowbit(x))
res = max(res, f[x]);
return res;
} int main()
{
scanf("%d", &n);
_for(i, , n) scanf("%d", &a[i]), b[i] = a[i]; sort(b + , b + n + );
m = unique(b + , b + n + ) - b - ;
_for(i, , n) a[i] = lower_bound(b + , b + m + , a[i]) - b; int ans = ;
_for(i, , n)
{
dp[i] = get_max(a[i] - ) + ;
ans = max(ans, dp[i]);
motify(a[i], dp[i]);
}
printf("%d\n", ans);
return ;
}

具体怎么做呢

n方的算法有一步去枚举之前所有的元素比较耗时间

可以用树状数组优化这一步,树状数组维护区间最大值

把元素的值当作下标,dp值作为值

a[i]表示当前值,dp[i]表示以i为结尾最长不下降子序列的长度

则 dp[i] = get_max(a[i]) + 1

也就是说,在小于等于当前值a[i]中,最大的dp值+1就是当前的答案

不过这里有个细节,怎么区分最长不下降还是最长上升?

如果你对原理理解透彻的话,这个问题其实很容易解决,你可以停下来自己推一下,检验一下自己理解了没有

如果是最长不下降的话,dp[i] = get_max(a[i]) + 1

如果最长上升的话, dp[i] = get_max(a[i]-1) + 1

最后注意要离散化一下

以下是最长上升子序列的模板

nlogn求LIS(树状数组)的更多相关文章

  1. 【Codeforces】Gym 101156E Longest Increasing Subsequences LIS+树状数组

    题意 给定$n$个数,求最长上升子序列的方案数 根据数据范围要求是$O(n\log n)$ 朴素的dp方程式$f_i=max(f_j+1),a_i>a_j$,所以记方案数为$v_i$,则$v_i ...

  2. Codeforces 960F Pathwalks ( LIS && 树状数组 )

    题意 : 给出若干个边,每条边按照给出的顺序编号,问你找到一条最长的边权以及边的编号同时严格升序的一条路径,要使得这条路径包含的边尽可能多,最后输出边的条数 分析 :  这题和 LIS 很相似,不同的 ...

  3. HDU - 5542 The Battle of Chibi(LIS+树状数组优化)

    The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...

  4. BZOJ-3881:Divljak (AC自动机+DFS序+树链求并+树状数组)

    Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x” ...

  5. 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】

    先学习下LIS最长上升子序列 ​ 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...

  6. 题解 P3374 【【模板】树状数组 1】

    恩,这是AC的第一道树状数组呢. 本蒟蒻以前遇到RMQ问题一般都用线段树或ST表,可惜ST表不支持在线修改,而线段树代码量又太大. 如今终于找到了折中方案:树状数组!!!!代码量小,还支持修改! 树状 ...

  7. (新人的第一篇博客)树状数组中lowbit(i)=i&(-i) 的简单文字证明

    第一次写博好激动o(≧v≦)o~~初一狗语无伦次还请多多指教   先了解树状数组http://blog.csdn.net/int64ago/article/details/7429868感觉这个前辈写 ...

  8. HDU2852【树状数组+二分】

    额..有点遗忘了树状数组特性了..印象中一直是前缀和,然后一定要记住树状数组是把给出的值(值太大可能可以离散化)也就是点到了区间,然后这个点存的值就是由自己来定了. 题意: 百度. 思路: 树状数组是 ...

  9. [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)

    传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...

随机推荐

  1. IT痴汉的工作现状22-由Dalvik虚拟机引发的口水战

    Dalvik是啥呢? 从未知道冰岛有Dalvik这么一个重要的村庄.直到Dan Bornstein将自己为Android系统编写的进程虚拟机命名为Dalvik后才被我所知. 它是Android系统独有 ...

  2. audio_device模块分析

    1. 对外接口      AudioDeviceModule, 採音放音接口,音量控制,静音控制等       2. 主要类      AudioDeviceModuleImpl, 对外提供的主要实现 ...

  3. hdu 4123(树形dp+倍增)

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. [bzoj3274]Circle

    https://www.zybuluo.com/ysner/note/1243396 题面 有\(n\)个排成一圈的格子,并且已知正整数\(k\)和\(m\),你需要往每个格子中填入一个大于等于\(k ...

  5. 64. Extjs中grid 的ColumnModel 属性配置

    转自:https://blog.csdn.net/u011530389/article/details/45821945 本文导读:Ext.grid.ColumnModel 该类用于定义表格的列模型, ...

  6. Istio 1.1部署实践

    前提条件 正确安装配置Kubernetes集群 CentOS Linux release 7.5.1804 安装 下载istio 1.1版本 [root@vm157 ~]# wget https:// ...

  7. Speed Limit

    http://poj.org/problem?id=2017 #include<stdio.h> int main() { int n,mile,hour; ) { ,h = ; whil ...

  8. [App Store Connect帮助]二、 添加、编辑和删除用户(3)添加和编辑用户

    您可以在“用户和访问”中添加和编辑用户. 如果您以个人名义在“Apple 开发者计划”注册,您可以授权用户访问您 App Store Connect 中的内容.所有用户只拥有 App Store Co ...

  9. HTML--使用下拉列表框,节省空间

    下拉列表在网页中也常会用到,它可以有效的节省网页空间.既可以单选.又可以多选.如下代码: 讲解: 1.value: 2.selected="selected": 设置selecte ...

  10. 多重背包(MultPack = ZeroOnePack + CompletePack)

    HiHoCoder_offer6_04 题目4 : 奖券兑换 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi在游乐园中获得了M张奖券,这些奖券可以用来兑换奖品. ...