信息
- ID
- 1527
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
在序列首尾加入值只出现一次的哨兵 A0=0,AN+1=N+1,并要求选择两个哨兵。
设相邻选中的位置为 i<j,唯一性等价于开区间 (i,j) 内既没有 Ai,也没有 Aj;否则可以把相应端点换到区间内部得到另一种取法,反之从左右两端贪心匹配会得到同一组下标。记 nexti 为 Ai 下一次出现的位置,prevj 为 Aj 上一次出现的位置,则合法转移恰为 j≤nexti 且 prevj≤i。
令 dpj 为以 j 作为当前最后位置的合法路径数,则 dpj 是所有 i∈[prevj,j−1] 且 nexti≥j 的 dpi 之和。按 j 从左到右扫描,在树状数组的下标 i 处维护尚未过期的 dpi,到 nexti+1 时删除,再查询区间 [prevj,j−1] 即可。dpN+1 包含空子序列,最后减一。
时间复杂度 O(NlogN),空间复杂度 O(N)。