1 条题解
-
0
题解
思路
令 表示以位置 结尾、长度恰好为 的严格递增子序列个数。显然 ,且
直接枚举前驱需要 。由于序列元素互不相同且都在 到 之间,可以对每个长度 建立一棵树状数组:下标是末尾元素值,存储已经扫描过的位置产生的计数。
做法
从左到右扫描每个值 。长度为 的状态贡献为 。对于 ,查询第 棵树状数组在值域 的前缀和,得到 ,再把它加入第 棵树状数组的坐标 。最后查询第 棵树状数组的全局和。
虽然最终答案保证不超过 ,某些不会继续延伸的较短状态总数可能更大。所有计数均为非负数,因此可以把每次加法饱和到 :若一个被后续转移使用的和超过该值,最终答案也会超过保证;对合法输入的最终答案不会失真。
子任务 1 中目标长度为 ,每个位置各贡献一个答案。子任务 2 可直接按转移式枚举所有 。
证明
任意一条以 结尾、长度为 的递增子序列,删去最后的 后,会唯一得到一条以某个 结尾、长度为 且满足 的递增子序列。反之,任意这样的较短子序列都能唯一接上 。因此转移式没有遗漏也没有重复计数。
扫描到 时,每棵树状数组只含位置小于 的状态;查询值域 又恰好筛出末尾值小于 的状态。因此树状数组查询与转移式完全一致。由长度和扫描位置的归纳,所有状态计数正确,最后对所有结尾求和即得到所求答案。
复杂度
- 时间复杂度:。
- 空间复杂度:。
- 1
信息
- ID
- 1001
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者