python 树状数组_nlogn求LIS(树状数组)

之前一直是用二分

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

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

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

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

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

#include

#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

最后注意要离散化一下

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

【Codeforces】Gym 101156E Longest Increasing Subsequences LIS&plus;树状数组

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

Codeforces 960F Pathwalks &lpar; LIS &amp&semi;&amp&semi; 树状数组 &rpar;

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

HDU - 5542 The Battle of Chibi(LIS&plus;树状数组优化)

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

BZOJ-3881:Divljak &lpar;AC自动机&plus;DFS序&plus;树链求并&plus;树状数组&rpar;

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

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

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

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

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

(新人的第一篇博客)树状数组中lowbit&lpar;i&rpar;&equals;i&amp&semi;&lpar;-i&rpar; 的简单文字证明

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

HDU2852【树状数组&plus;二分】

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

&lbrack;BZOJ3932&rsqb; &lbrack;CQOI2015&rsqb;任务查询系统(主席树 &vert;&vert; 树状数组 套 主席树 &plus; 差分 &plus; 离散化)

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

随机推荐

IIS 7 Web服务器上部署ASP&period;NET网站&lpar;转&rpar;

IIS 7 Web服务器上部署ASP.NET网站小记 摘自:http://swanmsg.blog.sohu.com/162111073.html 网上查找了很久关于iis7配置asp.net配置问题 ...

Android获取系统时间方法的总结

Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar ...

Smart210学习记录-----SD&sol;MMC&sol;SDIO驱动

转自:http://jingpin.jikexueyuan.com/article/23369.html http://blog.csdn.net/evilcode/article/details/7 ...

&ast;&lbrack;topcoder&rsqb;LittleElephantAndIntervalsDiv1

http://community.topcoder.com/stat?c=problem_statement&pm=12822&rd=15707 第一次用C++提交,艰辛.首先想到可以 ...

&lbrack;置顶&rsqb; 【Git入门之十三】Ubuntu和git

原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374291 之前我们都是在Windows平台下操作git.现在我们改用Ub ...

css元素居中

水平居中 若为行内元素,对其父元素用text-align:center即可: 若为块元素(无浮动),则一般有两种方法可实现对其的水平居中,一为margin:0 auto;二为通过css计算函数calc ...

实现一次请求加载多个js或者css

http://tengine.taobao.org/   相当牛x

前端笔记之服务器&amp&semi;Ajax(下)数据请求&amp&semi;解决跨域&amp&semi;三级联动&amp&semi;session&amp&semi;堆栈

一.请求后端的JSON数据 JSON是前后端通信的交互格式,JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. JSON是互联网各个后台与 ...

&lbrack;简记&rsqb; fetch API 的初步使用

var myHeaders = new Headers(); myHeaders.append('Content-Type', 'application/x-www-form-urlencoded; ...

什么是url?

什么是URL? URL是统一资源定位器(Uniform Resource Locator)的缩写,也被称为网页地址,是因特网上标准的资源的地址. URL举例 http://www.sohu.com/s ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值