LIS (nlogn)

dpdp+树状数组O(n lg n)O(n lg n)

注意到我们在状态转移的时候要枚举f[j]f[j]的最大值来转移,我们可以考虑使用数据结构来维护从而优化一下,只要是支持单点修改和区间最值查询的数据结构都可以这么做,分块(O(nn−−√))(O(nn))和树状数组(O(n lg n))(O(n lg n)),线段树(O(n lg n))(O(n lg n))之类的都行,但是因为树状数组比较好写,所以我们只讲解树状数组的写法

  1. 先按权值排序,排序之后再查询序号前最大的f[j]f[j]来转移,但是有一点要注意,我们求的是LIS,是严格上升的,所以我们遇到重复的权值的时候应该要放在最后一次性处理,不然后面的重复了的f[]f[]就能够用前面相同的元素来转移,导致最后的答案是错误的
原文地址:https://www.cnblogs.com/wifimonster/p/14073348.html