刷(shui)题记录 2022.2

[CF-1067E] Random Forest Rank

\(\Rightarrow \rm luogu\) 链接

对于这题,有一个结论:

\[\text{一棵树的邻接矩阵的秩} = 2 \times \text{这棵树的最大匹配组数} \]

注意,这里的匹配是指将有边相邻的两个点选为一组,每个点至多在一组中。

稍微证明一下这个结论。

考虑令 \(\mathrm{rank}~A = k\)

\(B\)\(A\) 的一个 \(k\) 阶子式,我们只需要找到一个 \(B\) ,满足 \(\det B \ne 0\) 即可。因为邻接矩阵是一个对称矩阵,因此这里令 \(B\) 是从 \(A\) 对称取出的(这里指选择的行编号集合和列编号集合相等),这样对应着原图取出 \(k\) 个点,以及它们之间的边。

考虑行列式的定义:

\[\det B = \sum_{\pi} (-1)^{τ(\pi)}\prod_{i=1}^k B_{i, \pi(i)} \]

令后面的 \(\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

\(\Rightarrow \rm luogu\) 链接

\(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)

\(\Rightarrow\rm luogu\) 链接

有个结论:对于 \(R\) 个黑点,\(B\) 个白点,存在匹配方案当且仅当 \(R=B\) 。首先,当 \(R=B=2\) 时,这个结论显然成立,接着,对于,将 \(R,B\) 都新增一个,并匹配,如果新的一对和之前的相交了,那么一定可以通过调整使其不相交。

鉴于 \(N\) 较小,可以选择分治,以一个黑点和一个白点为确定点,画一条直线,直线两侧的黑点白点数量分别相等。

[JOISC2017 Day 4] Dragon 2

\(\Rightarrow \rm LOJ\) 链接

本题可以枚举 \(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]划艇

\(\Rightarrow \rm luogu\) 链接

可以想到最简单的 \(\rm dp\) :设 \(f(i,j)\) 表示选择第 \(i\) 个学校选择 \(j\) 个划艇( \(j>0\) ),考虑了前 \(i\) 个学校的方案数,转移方程为:

\[f(i,j)=\sum_{a=0}^{i-1}\sum_{j=0}^{j-1} f(a,b) \]

特别的,令 \(f(0,0)=1\)

为了优化,首先将游艇数量离散化,设 \(f(i,j)\) 表示选择第 择第 \(i\) 个学校选择 \([l_j, r_j)\) 个划艇( \(j>0\) ),对于 \((a,i]\) 中学校选择的方案数,可以用方案数 \(\binom{L+m-1}{m}\) 求出,其中 \(L\) 为值域,\(m\) 为可选的学校个数,可以预处理。同时,可以用前缀和优化 \(b\) 的枚举。因此可以得到最终的转移方程:

\[f(i,j)=\sum_{a=0}^{i-1} f(a,0\dots j-1)\times \binom{r_j-l_j + c(a+1, i, j) - 1}{c(a+1,i, j)} \]

其中 \(c(i,j,k)=\sum_{p=i}^j \left[\left[a_i, b_j\right]\subset \left[l_k,r_k\right)\right]\)

[JLOI2012]时间流逝

\(\Rightarrow \rm luogu\) 链接

可以写出 \(\rm dp\) 方程:

\[f(i,j)=1+P\times[i>0]\cdot f(i-j,j) +\frac{1-P\times[i>0]}{j} \sum_{k=1}^j f(i+a_k,k) \]

特别的,令 \(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)\) 表示。

将状态转移方程变形,得到:

\[\begin{aligned} f(i,j)-P\times[i>0]\cdot f(i-j,j)-\frac{1-P\times[i>0]}{j} \sum_{k=1}^j f(i+a_k,k)&=1\\ f(i,j)-P\times[i>0]\cdot f(i-j,j)-\frac{1-P\times[i>0]}{j}\sum_{k=1}^j \left[K(i+a_k,k)f(i,j)+B(i+a_k,k)\right]&=1 \end{aligned} \]

为了让式子短一点,这里令 \(V_1=P\times[i>0], V_2=\frac{1-P\times[i>0]}{j}\) ,那么可以继续移项:

\[\begin{aligned} \left[1-V_2\sum_{k=1}^j K(i+a_k,k)\right]f(i,j)-V_1\cdot f(i-j,j)-V_2\sum_{j=1}^iB(i+a_k,k)=1 \end{aligned} \]

那么,显然可以得到:

\[\begin{aligned} K(i,j)&=\frac{V_1}{1-V_2\sum_{k=1}^j K(i+a_k,k)}\\ B(i,j)&=\frac{1+V_2\sum_{j=1}^iB(i+a_k,k)}{1-V_2\sum_{k=1}^j K(i+a_k,k)} \end{aligned} \]

[CF-464E] The Classic Problem

\(\Rightarrow \rm luogu\) 链接

因为边权均为 \(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}\) 求一次最短路。

\(\Rightarrow \texttt{Code}\)

[CF-585E] Present for Vitalik the Philatelist

\(\Rightarrow \rm luogu\) 链接

解法多样,本菜鸡只能想到比较暴力的一种:

考虑将原式子写出:

\[\mathrm{ANS}= \sum_{S\subset U}\sum_{x\in U, x\not\in S} \left[\gcd_{i\in S} a_i>1\wedge \gcd\left(\gcd_{i\in S} a_i>1, a_x\right)=1\right] \]

为了简写,这里用 \(\gcd(S)\) 表示 \(\gcd_{i\in S} a_i\)

实际上可以将问题转为:

\[\begin{aligned} \mathrm{ANS}&=\sum_{S\subset U}[\gcd(S)=1] (n-|S|) - \sum_{S\subset U}[\gcd(S)=1\wedge |S|>1](|S|)\\ \end{aligned} \]

对于条件判定,对其用 \(\mu\) 函数进行替换,可以得到:

\[\mathrm{ANS}=\sum_{d=1}^{\mathrm{mxa}} \mu(d) \left\{\sum_{S\subset U}[\forall i\in S, d \mid a_i] (n-|S|) - \sum_{S\subset U}[\forall i\in S, d \mid a_i \wedge |S|>1](|S|)\right\} \]

\(c(d) = \sum_{i=1}^n [d\mid a_i], f(n)=\sum_{i=1}^n \binom{n}{i}i\) ,那么上述式子可以变成这个样子:

\[\mathrm{ANS}=\sum_{d=1}^{\mathrm{mxa}} \mu(d)\left\{ \left[n\times 2^{c(d)} - f(c(d))\right] - [f(c(d)) - c(d)] \right\} \]

现在需要求出 \(f(n)\) ,使用递推,考虑第 \(n\) 个点对答案的贡献,可以得到:

\[f(n)=2f(n-1)+2^{n-1} \]

posted @ 2022-02-14 09:08  juruohjr  阅读(39)  评论(0编辑  收藏  举报