编号 | 题目 | 进展 | done |
---|---|---|---|
1 | UR #25 装配序列 | Link | √ |
2 | |||
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | |||
19 | |||
20 |
叹服,叹服,实在是叹服。
首先它求的东西相当于严格最长上升子序列长度。
考虑一般的 LIS 求法是, 从小到大逐渐考虑每一个 ,动态维护一个 表示长度为 的上升子序列最后一个元素最小是多少,然后逐渐维护。而这题中,值域远小于下标,所以应该反转下标和值域。
具体来说,我们逐渐考虑每个 ,那么势必所有 ,我们按照 从大到小考虑 ,逐渐插入 中:找到最小的 ,令 。
进一步考察这个 的变化的形式,设 ,它以 为第一关键字,我们首先按照 从大到小考虑每个 ,它一定是替换 最小的一个。
归纳地:对于相同的 ,保留的 一定是一个前缀,不妨设 表示 对应的 为 ,也就是说,,以及, 也就相当于所有 数组的归并。
我们如果用柱状图来画:
实际上,相当于是逐渐把 与它右侧大于它的数交换,其中 后,需要先减一后加一(一些细节)。
考虑怎么快速维护,设 ,对于 ,每种 开一个 set 维护;其它暴力。
考虑分析其复杂度:设 表示每种 的数量,那么 ,那么 。