UVa 1471 Defense Lines 算法分析

Posted alrond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 1471 Defense Lines 算法分析相关的知识,希望对你有一定的参考价值。

难度:β+

用时:0 min

题目:??

代码:??

 

这是一道贪心题。

然而不是一道简单的贪心题。

 

 

题目要求在一个大区间里删掉一个区间使得与该区间左右相邻的连续递增序列之和最长。

注意左右两侧的连续递增序列是合并后当作一整个看的。

(解释不清还是看书吧)

 

这题可以用暴力,然而会 TLE。

暴力做法就是统计以 i 点结尾的最长序列长度 g(i) 和以 i 点开头的最长序列长度 f(i)(递增的)。

然后枚举 i,j,答案是 max { g(i) + f(j) }。这样会超时。

 

正解算法是在这基础上改进了一下,使时间复杂度从 n ^ 2 降到 n x lg n。

 

因此根据时间复杂度也可以推出大致算法了。

枚举右端点 j,找到左端点 i,并且 g(i) 是 j 左边所有 g 里最大的,还要保证 i 点数值比 j 点的小。

 

后一个条件很好处理,以数值为关键字在集合里排序后寻找就行了(lg n)。关键要使得找到的点的 g 值最大。

 

不难发现,如果在数值一样大的情况下,我们可以直接抛弃那些 g 值小的点。

因为我们是从左到右枚举,这些点以后是没用的。(但不代表在整个枚举过程中都没用到)

 

更进一步,如果数值大而 g 值小的,也可以丢掉。

 

那么这样一来,从左到右枚举右端点的同时,从集合里找到相应的左端点,并且在处理完后,选择性的把右端点加入到集合里。

具体实现贴在上面的链接里了。copy from lrj。

 

2018-02-05

以上是关于UVa 1471 Defense Lines 算法分析的主要内容,如果未能解决你的问题,请参考以下文章

UVA1471-Defense Lines(思维+STL)

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

UVa1471 Defense Lines (滑动窗口)

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

二分Defense Lines

UVALive 4976 Defense Lines ——(LIS变形)