| 编号 | 题目 | 进展 | 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 维护;其它暴力。
考虑分析其复杂度:设 表示每种 的数量,那么 ,那么 。