刷(shui)题记录 2022.2
[CF-1067E] Random Forest Rank
对于这题,有一个结论:
注意,这里的匹配是指将有边相邻的两个点选为一组,每个点至多在一组中。
稍微证明一下这个结论。
考虑令 \(\mathrm{rank}~A = k\) 。
设 \(B\) 是 \(A\) 的一个 \(k\) 阶子式,我们只需要找到一个 \(B\) ,满足 \(\det B \ne 0\) 即可。因为邻接矩阵是一个对称矩阵,因此这里令 \(B\) 是从 \(A\) 对称取出的(这里指选择的行编号集合和列编号集合相等),这样对应着原图取出 \(k\) 个点,以及它们之间的边。
考虑行列式的定义:
令后面的 \(\prod\) 有值,当且仅当 \(\forall i\in [1,k]\cap \mathbb{N}^+, B_{i, \pi(i)} = 1\) ,同时,一个排列可以看成若干个环,因为原图是一棵树,因此排列的环的大小必须为 \(2\) ,因此,\(B\) 是由若干组有边相连的点组成的,同时,选定了若干组点之后,有值的排列实际上是唯一的。
这时候需要让组数最大,可以想到最大的组数是树的最大匹配数。
因此 \(\mathrm{rank}~A = 2\times \text{最大匹配数}\) 。
有了上述结论,需要用树形 \(\rm dp\) 计算出最大匹配数的期望值,可以设 \(f(u,0/1)\) 表示以点 \(u\) 为根节点的子树的最大匹配数的期望值,然后做子树合并即可,也可以设 \(f(u)\) 为节点 \(u\) 和其儿子匹配的概率,这样的话可以将每个节点的 \(f(u)\) 乘上 \(2^{n-|T_u|}\) 贡献到答案中。
[CF-1598G] The Sum of Good Numbers
设 \(A,B\) 为组成答案的字符串,可以想到 \(\max\{|A|,|B|\} = |T|~\mathrm{or}~|T|-1\) 。分类讨论:
- \(\max\{|A|,|B|\} = |T|-1\) :因为 \(|T|\) 和 \(|S|\) 中均不含 \('\verb|0|'\) ,因此一个数位相加导致的进位至多一次,因此可以得到 \(|A|=|B|=|T|-1\) ,这时候可以直接枚举位置,然后用 \(\mathrm{Hash}\) 判断一下。
- \(\max\{|A|,|B|\} = |T|\) : 假设 \(A\) 的长度较大,计算出 \(\mathrm{lcp}(A,T)\) ,这个部分可以用 \(\mathrm{EXKMP}\) 或者 \(\mathrm{Hash}+ \text{二分}\) ,对于剩余的部分,可以想到 \(|B| = |T| - \mathrm{lcp}(A,T)~\mathrm{or}~ |T| - \mathrm{lcp}(A,B)-1\),一样用 \(mathrm{Hash}\) 判断一下就行了。
\(\mathrm{Hash}\) 要用双模数和随机模数。
[CF-958E3] Guard Duty (hard)
有个结论:对于 \(R\) 个黑点,\(B\) 个白点,存在匹配方案当且仅当 \(R=B\) 。首先,当 \(R=B=2\) 时,这个结论显然成立,接着,对于,将 \(R,B\) 都新增一个,并匹配,如果新的一对和之前的相交了,那么一定可以通过调整使其不相交。
鉴于 \(N\) 较小,可以选择分治,以一个黑点和一个白点为确定点,画一条直线,直线两侧的黑点白点数量分别相等。
[JOISC2017 Day 4] Dragon 2
本题可以枚举 \(F_i\) 中的点,也可以枚举 \(G_i\) 中的点,这里选择个数较少的进行枚举,时间复杂度显然是 \(O\left((n+q)\sqrt{n}\right)\) 的。
接着考虑统计答案,首先将所有点绕 \(S\) 旋转相同的角度,使得直线 \(ST\) 平行于坐标轴,接着将每个点集的节点分为在 \(ST\) 上侧(纵坐标大于 \(0\) ),\(ST\) 下侧(纵坐标小于 \(0\) )。对于每个点 \(P\),记录下 \(\theta_1=\left<\overrightarrow{ST}, \overrightarrow{SP}\right>\) 以及 \(\theta_2=\left<\overrightarrow{ST}, \overrightarrow{TP}\right>\) ,这两个值可以用 \(\verb|cmath|\) 中的 \(\verb|atan2|\) 求出,同时,这两个值可以用于表示所有点的位置,可以发现统计的时候需要查询:
- 底边在直线 \(ST\) 上的三角形
- 底边不在直线 \(ST\) 上的三角形
- 较短底边在 \(ST\) 上,高度无限大的梯形
这三种图形中点的数量,因为有 \(\theta_1,\theta_2\) ,可以将问题转化为二维偏序,同时可以离线,可以用出席树求出。
[APIO2016]划艇
可以想到最简单的 \(\rm dp\) :设 \(f(i,j)\) 表示选择第 \(i\) 个学校选择 \(j\) 个划艇( \(j>0\) ),考虑了前 \(i\) 个学校的方案数,转移方程为:
特别的,令 \(f(0,0)=1\) 。
为了优化,首先将游艇数量离散化,设 \(f(i,j)\) 表示选择第 择第 \(i\) 个学校选择 \([l_j, r_j)\) 个划艇( \(j>0\) ),对于 \((a,i]\) 中学校选择的方案数,可以用方案数 \(\binom{L+m-1}{m}\) 求出,其中 \(L\) 为值域,\(m\) 为可选的学校个数,可以预处理。同时,可以用前缀和优化 \(b\) 的枚举。因此可以得到最终的转移方程:
其中 \(c(i,j,k)=\sum_{p=i}^j \left[\left[a_i, b_j\right]\subset \left[l_k,r_k\right)\right]\)
[JLOI2012]时间流逝
可以写出 \(\rm dp\) 方程:
特别的,令 \(i>T\) 的 \(f(i,j)=0\) 。
可以发现这些方程构成 \(O(NT)\) 个状态,需要用高斯消元进行转移。可以发现这些状态和转移组成树形结构。
考虑将 \(f(i,j)\) 考虑为一个关于 \(f(i-j,j)\) 的一次函数,具体而言,我们需要求出 \(f(i,j)=K\cdot f(i-j,j)+B\) 中的 \(K\) 和 \(B\) 。用 \(K(i,j), B(i,j)\) 表示。
将状态转移方程变形,得到:
为了让式子短一点,这里令 \(V_1=P\times[i>0], V_2=\frac{1-P\times[i>0]}{j}\) ,那么可以继续移项:
那么,显然可以得到:
[CF-464E] The Classic Problem
因为边权均为 \(2^x\) 的形式,可以认为每次加法产生的进位均不超过 \(\log_2 w\) 次。同时每次进位都是将从 \(x\) 位开始的最长连续 \(1\) 设为 \(0\) ,然后将这串 \(1\) 之后的一位设为 \(0\) ,这个操作可以使用动态开点线段树完成,其中设成 \(0\) 的操作可以认为是将子树换成一颗预处理出的全为 \(0\) ,结构相同的树,同时为了检验是否全为 \(1\) ,需要记录从某一位到某一位的哈希值(这里建议用双 \(\texttt{Hash}\) )。可以认为加法操作是 \(O(\log_2 n)\) 或者 \(O(\log_2^2 n)\) 的。
接下来就是 \(\texttt{dij}\) 求一次最短路。
[CF-585E] Present for Vitalik the Philatelist
解法多样,本菜鸡只能想到比较暴力的一种:
考虑将原式子写出:
为了简写,这里用 \(\gcd(S)\) 表示 \(\gcd_{i\in S} a_i\) 。
实际上可以将问题转为:
对于条件判定,对其用 \(\mu\) 函数进行替换,可以得到:
设 \(c(d) = \sum_{i=1}^n [d\mid a_i], f(n)=\sum_{i=1}^n \binom{n}{i}i\) ,那么上述式子可以变成这个样子:
现在需要求出 \(f(n)\) ,使用递推,考虑第 \(n\) 个点对答案的贡献,可以得到: