1 条题解
-
0
题解
思路
关键结构
将所有区间按左端点递增排列。左端点不能相同;否则右端点较小的区间会被另一个包含。同理,右端点也两两不同,且必须与左端点保持相同的递增次序。
因此,只要选出两个大小为 的坐标集合 ,并将第 小的左端点与第 小的右端点配对,就只需保证每个前缀中左端点数不少于右端点数。坐标 必须选入 。这样数出的是无标号区间集合,最后乘上 得到有序序列数。
做法
子任务 1:枚举区间序列
列出 上的全部 个区间,枚举其中 个不重复区间的排列。逐对判定包含关系,并检查是否有左端点 。
设 ,时间复杂度为 ,空间复杂度为 。
子任务 2:位集合枚举端点
用两个 位二进制集合分别表示 。只枚举各有 个位的集合,要求 ,然后检查排序后每个 。每对合法端点集合贡献 。
时间复杂度上界为 ,空间复杂度为 。
子任务 3:端点扫描 DP
设 表示已处理若干个坐标,已放置 个左端点、 个右端点的方案数。始终只保留 。对于当前坐标 ,有四种选择:
- 不放端点;
- 只放一个左端点;
- 只放一个右端点;
- 同时放一个左端点和一个右端点。
在 时必须放左端点,所以只保留第 2、4 种转移。其他坐标保留全部四种转移。答案为 。
当 时左端点无法两两不同,直接输出 。否则由 和 可知 ,因此 复杂度可以通过。使用滚动数组后,空间复杂度为 。
独立组合数校验
设
$$B(p,a,b)=\binom pa\binom pb-\binom p{a+1}\binom p{b-1}.$$根据反射原理, 是在 个坐标上选 个左端点、 个右端点,且任意前缀中左端点不少于右端点的方案数。在 之前枚举已放置的 ,再分别讨论 处“只放左端点”和“左右都放”,可得到一个 的独立公式实现。本包用该实现与端点 DP 交叉验证。
复杂度
三层做法的时间复杂度依次为 、 与 ;对应空间复杂度依次为 、 与 。独立组合数校验为 时间、 空间。
正确性证明
合法区间集合与满足前缀条件的端点选择一一对应:正向映射由排序后的端点得到;反向映射将第 小的左、右端点配对,前缀条件保证 。递增次序保证任意两区间不互相包含。DP 精确枚举每个坐标对左、右端点的四种选择,并在 禁止不含左端点的转移,因此 正好数出全部无标号合法集合。区间两两不同,乘 后正好得到所有有序序列。
- 1
信息
- ID
- 1460
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者