编号题目进展done
1UR #25 装配序列Link
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
17   
18   
19   
20   

1. 装配序列

叹服,叹服,实在是叹服。

首先它求的东西相当于严格最长上升子序列长度。

考虑一般的 LIS 求法是, 从小到大逐渐考虑每一个 ,动态维护一个 表示长度为 的上升子序列最后一个元素最小是多少,然后逐渐维护。而这题中,值域远小于下标,所以应该反转下标和值域

具体来说,我们逐渐考虑每个 ,那么势必所有 ,我们按照 从大到小考虑 ,逐渐插入 中:找到最小的 ,令

进一步考察这个 的变化的形式,设 ,它以 为第一关键字,我们首先按照 从大到小考虑每个 ,它一定是替换 最小的一个。

归纳地:对于相同的 ,保留的 一定是一个前缀,不妨设 表示 对应的 ,也就是说,,以及, 也就相当于所有 数组的归并。

我们如果用柱状图来画:

实际上,相当于是逐渐把 与它右侧大于它的数交换,其中 后,需要先减一后加一(一些细节)。

考虑怎么快速维护,设 ,对于 ,每种 开一个 set 维护;其它暴力。

考虑分析其复杂度:设 表示每种 的数量,那么 ,那么