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(算法效率--使用数据结构+部分枚举+类贪心)的更多相关文章

  1. UVA - 1471 Defense Lines 树状数组/二分

                                  Defense Lines After the last war devastated your country, you - as the ...

  2. UVa 1471 Defense Lines - 线段树 - 离散化

    题意是说给一个序列,删掉其中一段连续的子序列(貌似可以为空),使得新的序列中最长的连续递增子序列最长. 网上似乎最多的做法是二分查找优化,然而不会,只会值域线段树和离散化... 先预处理出所有的点所能 ...

  3. UVA - 1471 Defense Lines (set/bit/lis)

    紫薯例题+1. 题意:给你一个长度为n(n<=200000)的序列a[n],求删除一个连续子序列后的可能的最长连续上升子序列的长度. 首先对序列进行分段,每一段连续的子序列的元素递增,设L[i] ...

  4. Uva 1471 Defense Lines(LIS变形)

    题意: 给你一个数组,让你删除一个连续的子序列,使得剩下的序列中有最长上升子序列, 求出这个长度. 题解: 预处理:先求一个last[i],以a[i]为开始的合法最长上升子序列的长度.再求一个pre[ ...

  5. uva 1471 Defense Lines

    题意: 给一个长度为n(n <= 200000) 的序列,你删除一段连续的子序列,使得剩下的序列拼接起来,有一个最长的连续递增子序列 分析: 就是最长上升子序列的变形.需要加一个类似二分搜索就好 ...

  6. UVA 1471 Defense Lines 防线 (LIS变形)

    给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i).可以先 ...

  7. UVa 1471 Defense Lines (二分+set优化)

    题意:给定一个序列,然后让你删除一段连续的序列,使得剩下的序列中连续递增子序列最长. 析:如果暴力枚举那么时间复杂度肯定受不了,我们可以先进行预处理,f[i] 表示以 i 结尾的连续最长序列,g[i] ...

  8. uva 1471 defence lines——yhx

    After the last war devastated your country, you - as the king of the land of Ardenia - decided it wa ...

  9. 1471 - Defense Lines

    After the last war devastated your country, you - as the king of the land of Ardenia - decided it wa ...

随机推荐

  1. [C#.NET 拾遗补漏]14:使用结构体实现共用体

    在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的相关数据.在 C 语言中还有一种和结构体非常类似的语法,叫共用体(Union),有时也被直译为 ...

  2. 【JavaWeb】书城项目

    书城网站 项目说明 项目地址 阶段一 登录.注册的验证 使用 jQuery 技术对登录中的用户名.密码进行非空验证: 使用 jQuery 技术和正则表达式对注册中的用户名.密码.确认密码.邮箱进行格式 ...

  3. 【Flutter】容器类组件之剪裁

    前言 Flutter中提供了一些剪裁函数,用于对组件进行剪裁. 剪裁Widget 作用 ClipOval 子组件为正方形时剪裁为内贴圆形,为矩形时,剪裁为内贴椭圆 ClipRRect 将子组件剪裁为圆 ...

  4. shell 脚本安装Tomcat和java

    脚本安装Tomcat和java#!/bin/bash##SCRIPT:install_jdk-8u181-linux-x64_apache-tomcat-8.0.53#AUTHOR:Shinyinfo ...

  5. 剑指Offer58-左转字符串

    题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=" ...

  6. Java向指定Excel写入读取数据

    今天在开发中遇到用户列表导入导出的功能实现,这里了解到使用POI函数库可以完成此任务!特此记录一下 POI Apache POI是Apache软件基金会开放的源码函数库,POI提供API给Java程序 ...

  7. maven 的安装与配置详细步骤

    1. 直接搜索maven 2. 进入后点击download界面,这时出现的是当前最新版本, 当然还有以前的版本可供下载 3. 下载解压到你指定的目录后,需要配置一下环境变量. a. 右键此电脑点击属性 ...

  8. 用js实现打印九九乘法表

    用js在打印九九乘法表 思考 在学习了流程控制和条件判断后,我们可以利用js打印各式各样的九九乘法表 不管是打印什么样三角形九九乘法表,我们都应该找到有规律的地方,比如第一列的数字是什么规律,第一行的 ...

  9. WEB开发框架性能排行与趋势分析2-三大惊喜变化

    WEB开发框架性能排行与趋势分析2-三大惊喜变化 Web框架性能排名 上一次基于TechEmpower的<Web Framework Benchmarks>性能基准测试的解读之后,时隔两年 ...

  10. 【Oracle】从删除的recyclebin中查看并恢复数据

    如果数据库中用了drop删除表,后面没有加上purge的话,会出现在oracle的回收机制中 dba_recyclebin可以查看当前删除的都是哪些 这个只是部分截图,可以看到删除的对象是什么,删除的 ...