难度:β+
用时: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
原文地址:https://www.cnblogs.com/Alrond/p/8419062.html
时间: 2024-10-15 05:03:56