【uva 1471】Defense Lines(算法效率--使用数据结构+部分枚举+类贪心)
P.S.我完全一个字一个字敲出来的血泪史啊~~所以,没有附代码,也是可以理解的啦。OvO
题意:给一个长度为N(N≤200000)的序列,要删除一个连续子序列,使得剩下的序列中有一个长度最大的连续递增子序列,输出其长度。
解法:(参考自紫书)1.X 暴力枚举删除的区间 [l,r],O(n^2),再数需要O(n)。总共O(n^3)。
2.X 前者+O(n)预处理 f[i] 和 g[i] 表示前缀和后缀的长度最大的连续递增子序列长度。总共O(n^2)。
3.√ 前者O(n)预处理+ 只枚举 r(部分枚举),快速找最优的 l。而最优的就是 Ai 尽量小而f[i]尽量大,就可以排除掉 Ai≤Aj, f[i]>f[j]的所有这些 j 。
那么按照 Ai 从小到大排序,形成一个有序表,选的 Ai 就是从小到大的,相应的 f[i] 也是从小到达的。(就想着留下来的比 Ai 大的数 Aj 的 f[j] 也一定要比 f[i] 大便变成 ←)
于是我们可以二分查找找到最大比 Ar 小的 Ai,它的 f[i] 也是最大的。
难道这样就完了? \( ̄▽ ̄)/ No,no,no! 要小心上述的方法的前提条件是“枚举 r”,也就是 r 固定时才有效,不同的 r 排除后留下来的 Ai 是不同的,也就是说这个有序表是要动态变化的,所以上述的“排序+二分查找”方法是行不通的!<(—︿—)> 但是...又不是完全错误的。 ̑̑(•́⌄•́๑)૭✧
而是——那样的“排序+二分”对于需要不断插入和删除的情况不对,仍然要“排序+排除+查找”,通过利用一些特殊的数据结构的方式来维护这个有序表:比如说STL库里的set(自带排序+lower_bound和upper_bound函数)就可以解决“排序”和“查找”的问题了。
那么对于“排除”,也就是动态的维护有序表,我们要仔细思考一下。分2种情况:(1)它被排除掉,Ai 较大且 f[i] 较小;(2)它留下,排除掉一些 Aj 较大且 f[j] 较小的数。统一起来就是先把 (Ai,f[i]) 插入到有序表中,看一下它的前一个数 Aj,若 Aj<Ai 且 f[j]>f[i],那么就是 (1) 的情况,把 Ai 删掉;若不是这样,就保留下来,并删掉后面不需再保留的数了。
综上所述:插入、查找、删除均为O(n log n),预处理O(n)。总共O(n log n)。
4.√ 前者的STL库的运用换为数组。具体见【noi 2.6_1759】LIS 最长上升子序列(DP,3种解法)的解法3。
P.S.LA 2678用到的思想与这题很像很像。
【uva 1471】Defense Lines(算法效率--使用数据结构+部分枚举+类贪心)的更多相关文章
- UVA - 1471 Defense Lines 树状数组/二分
Defense Lines After the last war devastated your country, you - as the ...
- UVa 1471 Defense Lines - 线段树 - 离散化
题意是说给一个序列,删掉其中一段连续的子序列(貌似可以为空),使得新的序列中最长的连续递增子序列最长. 网上似乎最多的做法是二分查找优化,然而不会,只会值域线段树和离散化... 先预处理出所有的点所能 ...
- UVA - 1471 Defense Lines (set/bit/lis)
紫薯例题+1. 题意:给你一个长度为n(n<=200000)的序列a[n],求删除一个连续子序列后的可能的最长连续上升子序列的长度. 首先对序列进行分段,每一段连续的子序列的元素递增,设L[i] ...
- Uva 1471 Defense Lines(LIS变形)
题意: 给你一个数组,让你删除一个连续的子序列,使得剩下的序列中有最长上升子序列, 求出这个长度. 题解: 预处理:先求一个last[i],以a[i]为开始的合法最长上升子序列的长度.再求一个pre[ ...
- uva 1471 Defense Lines
题意: 给一个长度为n(n <= 200000) 的序列,你删除一段连续的子序列,使得剩下的序列拼接起来,有一个最长的连续递增子序列 分析: 就是最长上升子序列的变形.需要加一个类似二分搜索就好 ...
- UVA 1471 Defense Lines 防线 (LIS变形)
给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i).可以先 ...
- UVa 1471 Defense Lines (二分+set优化)
题意:给定一个序列,然后让你删除一段连续的序列,使得剩下的序列中连续递增子序列最长. 析:如果暴力枚举那么时间复杂度肯定受不了,我们可以先进行预处理,f[i] 表示以 i 结尾的连续最长序列,g[i] ...
- uva 1471 defence lines——yhx
After the last war devastated your country, you - as the king of the land of Ardenia - decided it wa ...
- 1471 - Defense Lines
After the last war devastated your country, you - as the king of the land of Ardenia - decided it wa ...
随机推荐
- Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...
- LeetCode589. N叉树的前序遍历
题目 法一.递归 1 class Solution { 2 public: 3 vector<int>ans; 4 void dfs(Node* root){ 5 if(root!=NUL ...
- ctfhub技能树—RCE—过滤空格
打开靶机 查看页面信息 开始尝试注入 127.0.0.1 || ls 尝试绕过 127.0.0.1||ls 使用cat命令查看flag 127.0.0.11||cat<flag_10872536 ...
- Oracle备份审计表SYS.AUD$和SYS.FGA_LOG$
ORACLE的审计表不可以使用expdp和impdp导出和导入,如果使用,会报如下错误: 需要使用exp和imp进行导出和导出 导出语句: exp " '/ as sysdba' " ...
- Java 迭代器的使用 Iterator
Java的集合类可以使用for ... each循环 List Set Queue Deque 我们以List为例 其实一个java编译器并不知道如何遍历一个List 编译器只是把一个for ... ...
- ElasticSearch-IK分词器和集成使用
1.查询存在问题分析 在进行字符串查询时,我们发现去搜索"搜索服务器"和"钢索"都可以搜索到数据: 而在进行词条查询时,我们搜索"搜索"却没 ...
- 转 Fiddler3 使用技巧
Fiddler3 使用技巧 文章转自:https://www.cnblogs.com/zhengna/category/1466001.html 1.Fiddler抓不到包怎么解决 (1)先确定是H ...
- js input相关事件(转载)
1.onfocus 当input 获取到焦点时触发. 2.onblur 当input失去焦点时触发,注意:这个事件触发的前提是已经获取了焦点再失去焦点的时候才会触发该事件,用于判断标签为空.3.o ...
- Failed to start ssh.service: Unit not found.
Failed to start ssh.service: Unit not found. 报错内容: [Centos7@localhost ~]$ service ssh start Redirect ...
- JavaFx ObservableList的使用详解
原文地址:JavaFx ObservableList的使用详解 | Stars-One的杂货小窝 最近在研究MVVM模式,发现可以将之前写的FxRecyclerView控件改造一下,便是开始尝试,尝试 ...