7.21 做题记录
P8321 『JROI-4』沈阳大街 2
直接考虑排列是困难的,我们把它视作一个匹配的形式。
\(A,B\) 顺序不影响答案,将它们排序后在值域上 dp。
设 \(f_{i,j}\) 为考虑 \(A,B\) 前 \(i\) 大的值(设为 \(v\)),配对了 \(j\) 个的方案数,转移:\(f_{i,j} = f_{i-1,j-1} \times v \times (tmp - j - 1 ) + f_{i-1,j}\),其中 \(tmp\) 表示前 \(i\) 大的数中与 \(v\) 来自不同数组的数个数,时间复杂度 \(O(n^2)\)。
总结:
- 用匹配的形式描述一一对应
- 带 \(\min/\max\) 的贡献在值域上做
[ARC087F] Squirrel Migration
考虑答案的上界,设删去一条边后两边的大小为 \(S_1,S_2\),则这条边的贡献 \(\leq 2 \times \min S\),根据经典结论,我们取重心为根,则每个匹配的两个点都在不同子树中。
现在要求方案数,考虑容斥,设 \(f_i\) 为有 \(i\) 个匹配在同一子树的方案数,则:
求解 \(f\) 是容易的,设子树的大小为 \(x\),其中有 \(k\) 个点满足 \(i\) 与 \(p_i\) 在同一子树中,那么其方案数为 \(\binom{x}{k}^2k!\),使用树上背包,时间复杂度 \(O(n^2)\)。
总结:
- 树上匹配问题考虑重心
P8253 [NOI Online 2022 提高组] 如何正确地排序
假设所有数对 \(\max\) 和 \(\min\) 都有贡献,则答案为 \(2n\times sum\) 减去没有贡献的,转化成如下形式:
假设现在有数组 \(x,y,z\),对每个 \(y_i\) 计算有多少 \(j\) 满足:
选择任意二位偏序求解方法计算,时间复杂度 \(O(n \log n)\),注意我们要枚举三个有序数组,所以带上 \(24\) 倍常数。
总结:
- 补集转化的使用:?
P7962 [NOIP2021] 方差
每次操作等价于交换差分,我们要最小化 \(n \times \sum a_i^2- (\sum a_i)^2\),有如下结论:差分是先减小后递增的。
把差分重排,从小到大考虑,那么每个差分要么插在首要么插在尾,差的形式不好维护,考虑将一维放到状态里去,设 \(f_{i,j}\) 表示处理到前 \(i\) 个差分,这 \(i\) 个差分还原出来的 \(a_i\) 的序列的和是 \(j\),在这个情况下的 \(\sum a_i^2\) 的最小值,不为 \(0\) 的差分只有 \(O(V)\) 个,时间复杂度 \(O(nV^2)\)。
总结:
- 把尽量简单且能覆盖其他信息的结构加入状态
[ARC161E] Not Dyed by Majority (Cubic Graph)
考虑无解的占比很大,随机一个颜色序列,使用 2-SAT 判断即可。
总结:
- 答案在总方案数的占比较大,可以考虑随机化之后 check
CF1819E Roads in E City
考虑删边,删去 \((u_i,v_i)\) 后随机询问 \(k\) 次 \(u_i\) 或 \(v_i\),若 \(u_i,v_i\) 不连通,则有极大概率得到至少一个 $0,否则所有询问均返回 \(1\) ,由此求出任意一棵被修复的边的生成树。
接下来考虑每条非树边 \((u_i,v_i)\),删去 \(u_i,v_i\) 树上简单路径上任意一条边 \((u_j,v_j)\),然后加入 \((u_i,v_i)\),随机询问 \(k\) 次 \(u_i\) 或 \(v_i\)。
正确率为 \(1 - \frac{1}{2^k}\)。