1. 题目描述
2. 思路
非常明显的上升子序列问题。但是我在做的时候遇到了一个之前做 \(LCS\) 从来没考虑过的点。
之前都是直接排序,而无论是左端点优先还是右端点优先,假设左端点优先吧并且一般都是升序,我们一般是让右端点也升序的。
也就是说,左右端点都是升序的。做了很多 \(LCS\),都没有问题,直到这里,由于一些机缘巧合,\(bug\) 来了!
看看下面的例子:\([1,10], [2,4], [3,5]\)
我在做的时候,因为数据规模在 \(10^{5}\), 所以使用了贪心的做法,按照左端点升序,然后右端点升序。
然后二分查找合适的长度并更新答案。
然后对于每个长度,保存一个 \([left,right]\),即 q[len] = {left, right}
,表示长度为 \(k\) 时,左右端点的最小值。(注意⚠️,这句话问题很大!)
对于该例子,我们希望输出长度 \(2\),即,\([2,4], [3,5]\) 显然是符合条件的。
但是我的程序输出了 \(1\),为什么呢?
原来是,长度为 \(1\) 时,我们选择了 \([1, 10]\),而遍历到 \([2,4]\) 时,\(4 < 10\),因此跳过去了,\([3,5]\) 也是。
注意到问题所在了没有?对于 \([1,10]\) 和 \([2,4]\),谁“更小”?
答案是不知道或者说是不确定