ABC 450 FG
F - Strongly Connected 2
题目本质其实就是:给定若干区间 \([l, r]\),\(1\le l \le r \le n\);求 选取这些区间的某一子集,使得子集内区间并集覆盖 \([1, n]\) 的方案数。
可以说是一道典题了。
先将所有区间按照右端点升序排序,然后考虑依次枚举这些区间并作 \(dp\) 转移。
定义 \(dp_{i}\):考虑当前所有区间,第一个未被覆盖到的位置为 \(i\),方案数。
显然 \(ans = dp_{n}\)
初始化 \(dp_{1} = 1\)
状态转移:决策当前区间 \([l, r]\) 是否选取,对每个 \(dp_{i}\) 的影响:
- 若 \(i \in [1, l - 1]\),显然是否选取该区间对 \(dp_{i}\) 是没有影响的,因此:
\[\forall i\in [1,l-1],dp_{i} \leftarrow dp_{i} * 2
\]
- 否则,第一个未被覆盖到的位置范围应是 \([l, r + 1]\)(!!注意不要落下 \(r + 1\),因为前面也可能考虑过了一些右端点也为 \(r\) 的区间,此时 \(dp_{r + 1}\) 是有值的),此时:
- 如果选择 \([l, r]\),新的第一个未被覆盖到的位置一定是 \(r + 1\),因此:
\[dp_{r+1} \leftarrow \sum_{i=l}^{r+1} dp_{i}
\]
- 如果不选 \([l, r]\),那么新的第一个未被覆盖到的位置仍与原来相同,不需要任何转移。
优化转移需要使用同时维护区间加与区间乘的线段树。具体实现见代码。
G - Random Subtraction
一道关于期望计算的好题。
写一下关键地方的处理:
对于 \(E(XY)\),当 \(X\) 与 \(Y\) 相互独立时,有 \(E(XY) = E(X)E(Y)\)。在本题里显然 \(c_{i}\) 与 \(a_{i}\) 是互不影响的(每个数取什么符号与该数的取值无关),因此有:
\[E(\sum_{i \neq j}c_{i}c_{j}a_{i}a_{j}) = \sum_{i \neq j} E(c_{i}c_{j}a_{i}a_{j}) = \sum_{i \neq j} E(c_{i}c_{j}) * \sum_{i \neq j} E(a_{i}a_{j})
\]
后者的期望为定值,这样我们就不需要考虑每个数的取值,只需以每个数取得的正负性计算 \(\sum_{i \neq j} E(c_{i}c_{j})\)。


浙公网安备 33010602011771号