upper_bound只会替换让留在数组里的最长递增子序列尽可能小
由于upper查出来的结果下标是那个可以插入这个值得最后一个元素
所以他会把大的数变成小的数

upper将可以替换成新元素的元素替换成更小的
将不能替换的元素 大的元素直接放在最后面
很神奇

你会发现 这个问题
通过一个二分就能解决
如何解决的呢
我们要在vector中维护一个递增序列
如何维护
那就是每当我们遍历过程中拿到一个元素
考虑如果这个元素比我们维护的最大递增数列的最大值还要大
就插在最后
如果比那个序列的最大值小
就需要在序列中
找到一个地方 放下这个值 使得我们整个序列的长度还是没变
但是能够替换某个元素使得这个序列中的某些元素变小
从而达到当我新来一个元素时能够尽可能插入进去
扩增LIS的长度的效果
因为在一个数组X中
X中的递增序列可能有多个
其中一定是最小的那个序列(对应元素尽可能的小)是LIS
比如在1 2 100 2 2中
LIS 1 2 2 2
那么 如果我们维护的是 1 2 100
此时就得不到最终的LIS 由于不是严格递增
所以我们要选择upperbound 要在维护的数列中选择
插入上界 跳过相等的元素 用2替换100使得序列尽可能长
而如果题目要求的是 严格递增
我们拿到一个新元素小于维护数列的最大元素时
就需要lowerbound插进去因为 我们要替换的是相等的元素
不过如果原来的序列中并没有与插入元素相等的元素
我们用lower_bound仍然会替换得到的序列会更小

**所以LIS问题
非严格递增 用upperbound维护 以为每次遇到一个相等的元素我们可以延长他相等的长度
从而增大LIS的长度 (注意虽然这里可以增大LSI的长度 但我们得到的并非是真正的LIS
我们只是得到了长度 比如对于1 2 3 4 5 2 2 这个序列 如果我们用uper维护
那么到我我们得到的序列是 1 2 3 4 5 继续处理我们得到了 1 2 2 2 5 虽然在原始中并不存在这个序列
但是他符合我们最长的要求 如果后面有更多的2 也就是可以把前面的大数全部覆盖
例如 我们得到了1 2 3 4 5 2 2 2 -〉我们得到最长的序列就是 1 2 2 2 2 假如原序列后面有个3
我们正好把他插入进去 得到名副其实的LIS 但如果我们不用upper维护 我们就得不到这个长度
所以虽然辅助数组中存的不是真正的LIS 但我们维护的策略是尽可能得到LIS的长度而非LIS
假如数列中最大值后面的元素数量不足以覆盖最大值 那么我们就算是LIS 依旧是在真正的LIS上进行操作
不会对真正的LIS长度造成影响
如果数列最大值后面的元素足够多了覆盖了最大值而且后面还能继续增加长度
那么我们这里的覆盖就是合理的 为了得到LIS的最大长度 这是我们的唯一选择

严格递增 用lowerbound插入比维护数组小的元素(
如上面的例子 我们用upper维护得到的是非严格递增的
那么用lower维护 遇到序列里已经存在的值 我们lower一下并没有任何实质性改变
所以用lower维护出来的一定是严格递增的最大值

时间复杂度O(nlogn)**

所以用二分去构造LIS的原因在于 二分插入的过程就是我们自己手工找出LIS的过程
遇到更大的值就插入LIS 否则就不断替换我们找到的数串以找到更长的LIS

LIS 的 n*log 算法 ———二分维护相关推荐

  1. LIS的O(nlogn)算法(二分)

    [hdu1950]Bridging signals 传送门:点我 =================================== O(n^2)解法:(n为4w,TLE) memset(dp,1 ...

  2. 求最长上升子序列——LIS的O(nlogn)算法(二分)

    LIS的O(nlogn)算法(二分) 传送门:点我 O(n^2)解法:(n为4w,TLE) memset(dp,1,sizeof(dp)); int ans=-1; for(i=2; i<=n; ...

  3. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

  4. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  5. LIS的O(nLogN)算法

    今天回顾WOJ1398,发现了这个当时没有理解透彻的算法. 看了好久好久,现在终于想明白了. 试着把它写下来,让自己更明白. 最长递增子序列,Longest Increasing Subsequenc ...

  6. k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类

    k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...

  7. (算法-二分)浮点数二分-求一个数的三次方根

    (算法-二分)浮点数二分-求一个数的三次方根 题目描述 题目分析 误差分析 二分(当n>=1时) (当0<=n<1时) (当n<0时) 解决方案 题目描述 给定一个浮点数 n, ...

  8. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  9. 0x04.基本算法 — 二分和三分

    目录 一.二分 0.二分法 1.整数域上的二分 2.实数域上的二分 二.三分 0.三分求单峰函数极值 1.P3382 [模板]三分法(秦九韶求多项式+三分) 三.二分答案转化为判定 0.经典例子 1. ...

最新文章

  1. fiddler4 使用教程
  2. shell脚本--02循环与条件
  3. DevExtreme 学习应用[1]
  4. Sharepoint 2010 页面设计确实方便
  5. OpenCV:详解掩膜mask
  6. mysql数据导出不完正_【MySQL】mysqldump 导出数据 常见问题
  7. java反射 动态调用_java反射拼接方法名动态执行方法
  8. tensorflow图像数据处理
  9. jedate选中日期后关闭弹层_jeDate日期控件的使用以及选中后点确定按钮关闭功能...
  10. mindspore| lenet模型 推理过程记录
  11. 国内哪家公司做网站最好?
  12. 查看cbr vbr_如何在口径中查看CBR和CBZ漫画书
  13. 利用python查询电脑配置_干货|利用Python将地址转换为经纬度坐标
  14. 什么是百度SEO?百度SEO优化怎么做?
  15. 关于五险一金,你想要的都在这里了
  16. Word 2016 撰写论文(3): 文献中常见的表格(三线表)制作
  17. MySQL5.7自带分词搜索使用
  18. 【托业】【怪兽】TEST04
  19. 高强度文件夹加密大师怎么破解
  20. 扒一扒GES如何赋能互联网电商风控

热门文章

  1. templates(0.1)
  2. 借口很多呀嘛接口也很多呀嘛态也很多
  3. linux:vi 替换命令
  4. RedisTemplate value序列化导致的问题
  5. 记录请求的耗时(拦截器、过滤器、aspect)
  6. java集合数组,数组小到大排序,数组大到小排序
  7. js 判断 浏览器 是否为 微信 浏览器
  8. JAVA开发需求分析套路_JAVA并发工具常用设计套路示例代码
  9. Android方法的概括,android中的Filter接口简介
  10. php strpos与strrpos,PHP开发之 strpos stripos strrpos strripos的区别