AGC060 题解

Wow, Christmas Round. --Tom66

A. No Majority (1300)

结论:若一个序列有严格众数,则序列中必有两个相同数字位置之差为 \(1\)\(2\)

证明 设序列长为 $k$,则严格众数 $x$ 出现了至少 $\lfloor \dfrac{k}{2} \rfloor+1$ 次。要使没有两个 $x$ 相邻,序列长度至少为 $2 \lfloor \dfrac{k}{2} \rfloor+1 \geq k$,当 $2 \nmid k$ 时取等。这种情况下必然有两个相同数字位置之差为 $2$,证毕。

\(dp_{i,x,y}\) 表示考虑前 \(i\) 位,第 \(i-1\) 位填 \(x\),第 \(i\) 位填 \(y\) 的方案数。枚举第 \(i-1,i,i+1\) 位转移即可。时间复杂度 \(O(n |\sum|^3)\)

Code

B. Unique XOR Path (2000)

\(k\) 为用到的位数,考虑对每个 \((n,m,S)\) 计算最小能取的 \(k\)

\(\texttt{R,D}\) 形成的极长连续段个数为 \(t\),显然有一个 \(k=t-1\) 的构造:在路径的每个拐角处放置一条“射线”,那么只要实际走的路径与给定路径不同就会跨过“射线”,便不合法了。例如下图:

###2..
.1##.4
1.3#4.
.3.###
3...5#

(# 表示给定路径,数字表示使用不同的位,或者认为写着 \(x\) 的格子填 \(2^{x-1}\)

然而这并不优。例如上图中的 \(1\)\(2\) 实际上可以用同一种,\(2\)\(3\) 也可以用同一种,因为它们不可能同时遇到。

即,对于每一段极长的形如 \(...RDRDRD...\) 连续段,设其长度为 \(l\),则可以减少 \(\lfloor \dfrac{l}{2} \rfloor\) 位的使用。

于是得到上界 \(k \leq t-1-\sum_{i} \lfloor \dfrac{l_i}{2} \rfloor\)

事实上这也是下界。

证明 设将序列划分为若干 $[R],[D],[RD],[DR]$ 之一,$[RD],[DR]$ 段的个数最多为 $s$,那么显然 $s=t-1-\sum_{i} \lfloor \dfrac{l_i}{2} \rfloor$。

假设 \(k < s\),那么在实际的路径中可以将每个 \([DR]\) 替换为 \([RD]\) 或将 \([RD]\) 替换为 \([DR]\),使最后结果多异或一个特定值。这相当于有 \(s\) 个数可以任意异或,将它们插入线性基,由于只有 \(k\) 位,故必然有某个数无法插入线性基,即 \(0\) 可被线性基表出,对应另一条合法路径。故假设错误,证毕。

依据上述结论直接求出 \(k\) 即可。时间复杂度 \(O(T(n+m))\)

Code

C. Large Heap (2700)

Sol1

根节点的两棵子树可看作相对独立,考虑同时记录两边状态。

\(f_{i,j}\) 表示只考虑 以 \(U\) 的某个深度为 \(i\) 的节点 \(x\) 为根的子树 及 以 \(V\) 的某个深度为 \(j\) 的节点 \(y\) 为根的子树,\(U\) 的拓扑序小于 \(V\) 的概率。

考虑枚举 \(x,y\) 中哪一个拓扑序为 \(1\),不妨设为 \(x\)。那么 \(x\) 的两棵子树间相对独立,概率即 \(f_{i+1,j}\)

现在计算 \(x\) 拓扑序为 \(1\) 的概率。设 \(x,y\) 子树大小为 \(X=2^{n-i}-1,Y=2^{n-j}-1\),对于两棵子树的每一对拓扑序,将它们合并在一起,概率均为:

\[\dfrac{\dbinom{X-1+Y}{X-1}}{\dbinom{X+Y}{X}}=\dfrac{X}{X+Y} \]

于是转移式为:

\[f_{i,j}=\dfrac{2^{n-i}-1}{2^{n-i}+2^{n-j}-2} f_{i+1,j}+\dfrac{2^{n-j}-1}{2^{n-i}+2^{n-j}-2} f_{i,j+1} \]

边界条件为 \(f_{A+1,j}=1\)

线性处理逆元,时间复杂度 \(O(n+AB)\)(即 \(O(n^2)\))。

Code

Sol2(官方题解)

为了方便,将满足树的父子间大小关系限制的事件的集合记为 \(R\)

答案即 \(P(U<V \mid R)=\dfrac{P(U<V \wedge R)}{P(R)}\)

先计算 \(P(R)\)。记事件 \(A_u\) 表示 \(u\) 为其子树中值最小的,显然所有 \(A_u\) 间两两独立。于是:

\[P(R)=\prod\limits_u A_u=\prod\limits_u \dfrac{1}{siz_u}=\prod\limits_{i=0}^{n-1} \dfrac{1}{(2^{n-i}-1)^{2^i}} \]

考虑计算 \(P(U<V \wedge R)\)。设 \(V\) 的父亲为 \(W\),记 \(R'=R \setminus (W<V)\),类似容斥:

\[P(U<V \wedge R)=P(U<V \wedge W<V \wedge R')=P(U<V \wedge R')-P(U<V \wedge V<W \wedge R') \]

同理,设 \(W\) 的父亲为 \(X\)\(R''=R \setminus (W<V) \setminus (X<W)\),则:

\[P(U<V<W \wedge X<W \wedge R')=P(U<V<W \wedge R'')-P(U<V<W \wedge W<X \wedge R'') \]

以此类推的,有:

\[P(U<V \wedge R)=P(U<V \wedge R')-P(U<V<W \wedge R'')+P(U<V<W<X \wedge R''')-\cdots \]

而这里面的每一项的事件表示的限制都构成一棵外向树。枚举断开的点的深度 \(t\),概率容易计算:

\[\begin{aligned} Ans &=P(R)^{-1} \cdot P(R)\sum\limits_{t=1}^B \prod\limits_{i=1}^A \dfrac{2^{n-i}-1}{2^{n-i}-1+2^{n-t}-1} \prod\limits_{i=1}^{t-1} \dfrac{2^{n-i}-1}{2^{n-i}-1-(2^{n-t}-1)} \prod\limits_{i=1}^{B} \dfrac{2^{n-i}-1}{2^{n-t}-1-(2^{n-i-1}-1)}\\ &=\sum\limits_{t=1}^B \prod\limits_{i=1}^A \dfrac{2^{n-i}-1}{2^{n-i}+2^{n-t}-2} \prod\limits_{i=1}^{t-1} \dfrac{2^{n-i}-1}{2^{n-i}-2^{n-t}} \prod\limits_{i=1}^{B} \dfrac{2^{n-i}-1}{2^{n-t}-2^{n-i-1}} \end{aligned} \]

同样线性处理逆元,时间复杂度 \(O(n+AB)\)(即 \(O(n^2)\))。

Code

Sol2+

上式的计算还可以继续优化。

分子都是 \(2^{n-i}-1\),容易处理。

第二项的分母:

\[\prod\limits_{i=1}^{t-1} (2^{n-i}-2^{n-t})=2^{n-t} \prod\limits_{i=1}^{t-1} (2^{t-i}-1) =2^{n-t} \prod\limits_{i=1}^{t-1} (2^i-1) \]

和第三项的分母:

\[\prod\limits_{i=1}^{B} (2^{n-t}-2^{n-i-1})=2^{n-t} \prod\limits_{i=1}^{B} (1-2^{t-i-1}) =2^{n-t} (-1)^B \prod\limits_{i=t-B-1}^{t-2} (2^i-1) \]

也容易处理。

第一项的分母 \(\prod\limits_{i=1}^A (2^{n-i}+2^{n-t}-2)\) 可视作关于 \(x=2^{n-t}\)\(A\) 次多项式 \(\prod\limits_{i=1}^A (2^{n-i}-2+x)\),多项式快速插值再求值即可。

总时间复杂度 \(O(n \log^2 n)\)

Sol2++

瓶颈在于如何对每个 \(t\)\(\prod\limits_{i=1}^A (2^{n-i}+2^{n-t}-2)\)

考虑求出 \(\prod\limits_{i=1}^A (2^{n-i}+x)=\prod\limits_{i=n-A}^{n-1} (2^{i}+x)=2^{n-A} \prod\limits_{i=0}^{A-1} (2^i+2^{A-n} x)\)

利用 q-analog 可以线性求出 \(\prod\limits_{i=0}^{A-1} (2^i+x)\),从而求出上述式子。

\(\prod\limits_{i=1}^A (2^{n-i}+x)\) 复合 \(x-2\) 获得 \(\prod\limits_{i=1}^A (2^{n-i}+x-2)\),这一步可以 \(O(n \log n)\) 完成。

最后用 Chirp-Z 求出所有 \(2^t\) 处的点值即可。

总时间复杂度 \(O(n \log n)\),而且只需要多项式乘法,常数比上一个做法小得多。

D. Same Descent Set (3400)

为什么我会做 D 不会 C 啊

容斥好题

本文中 \(\text{SEQ(F(x))}=\dfrac{1}{1-F(x)}\)

显然 \(P,Q\) 应该一起计数。考虑枚举每两个相邻位置间的大小关系,计算满足限制的排列数量,答案即所有等价类大小的平方和。

假设枚举了每两个相邻位置间的大小关系,如何计算满足限制的排列数量?

这是一个经典问题,将所有 \(\texttt{<}\) 容斥成 \(\texttt{>}\) 或无限制,记所有 \(\texttt{>}\) 形成的极长连续段长度分别为 \(l_1,l_2,\cdots,l_t\),则方案数为 \(\dbinom{n}{l_1+1,l_2+1,\cdots,l_t+1}\)

\(f(S)\) 表示集合 \(S\) 中的符号都是“无限制”,其它位置都钦定为 \(\texttt{>}\) 时的上述方案数。于是答案为:

\[\begin{aligned} Ans &=\sum\limits_{S \subseteq [n-1]} (\sum\limits_{T \subseteq S} (-1)^{|S|-|T|} f(T))^2\\ &=\sum\limits_{T_1 \subseteq [n-1]} \sum\limits_{T_2 \subseteq [n-1]} (-1)^{|T_1|+|T_2|} 2^{n-1-|T_1 \bigcup T_2|} f(T_1) f(T_2)\\ &=2^{n-1} \sum\limits_{T_1 \subseteq [n-1]} \sum\limits_{T_2 \subseteq [n-1]} (-1)^{|T_1|+|T_2|} 2^{-|T_1|-|T_2|+|T_1 \bigcap T_2|} f(T_1) f(T_2)\\ &=2^{n-1} \sum\limits_{T_1 \subseteq [n-1]} \sum\limits_{T_2 \subseteq [n-1]} 2^{|T_1 \bigcap T_2|} (-\dfrac{1}{2})^{|T_1|+|T_2|} f(T_1) f(T_2)\\ &=2^{n+1} \sum\limits_{T_1 \subseteq [n-1]} \sum\limits_{T_2 \subseteq [n-1]} 2^{|T_1 \bigcap T_2|} (-\dfrac{1}{2})^{|T_1|+1} f(T_1) (-\dfrac{1}{2})^{|T_2|+1} f(T_2)\\ \end{aligned} \]

注意到要统计 \(|T_1 \bigcap T_2|\),那么再次容斥,钦定一些位置在 \(T_1\)\(T_2\) 中均为“无限制”,这样就将序列划分为若干段。

容斥系数是什么呢?设钦定无限制,钦定均为“无限制”,钦定不均为“无限制”的容斥系数分别为 \(A,B,C\),则要求 \(A+B=2,A+C=1\)。取 \(A=B=1,C=0\) 即可。

考虑计算答案。先处理每一段的方案数,设其生成函数为 \(G(x)\)(注意 \(x\) 次数代表点的个数而不是边),容易得到:

\[F(x)=\text{SEQ}(-\dfrac{1}{2} \sum\limits_{i \geq 0} \dfrac{x^i}{i!}) \]

\[G(x)=\sum\limits_{i \geq 0} f_i^2 x^i \]

再处理最后答案的生成函数 \(H(x)\)。由于无限制,钦定均为 \(\texttt{<}\) 的容斥系数均为 \(1\),可以认为就是若干 \(\mathcal{G}\) 中的元素拼在一起。

\[H(x)=\text{SEQ}(G(x)) \]

最后答案即为 \(2^{n+1} n! h_n\)

多项式求逆实现,总时间复杂度 \(O(n \log n)\)

E. Number of Cycles (3500)

\(k=f(x)+f(y)\)

关键性质:交换 \(x_i,x_j\),也会交换 \(y_{P_i},y_{P_j}\),故 \(k\) 的变化量必为 \(-2,0,2\) 中的某个。

那么若 \(K\)\(k\) 的奇偶性不同就已经无解。考虑求出 \(k\) 的最大值 \(mx\) 与最小值 \(mn\),只要 \(mn \leq K \leq mx\) 就一定有解。

结论:\(mx=f(P)+n\),当 \(x_i=i\) 时取到。

证明 假设存在 $f(x) < n$ 时 $f(x)+f(y)>f(P)+n$。一定存在 $i,j$ 使得交换 $x_i,x_j$ 后 $f(x)$ 增加 $1$,那么 $f(x)+f(y)$ 单调不降。有限次调整后 $f(x)=n$,而此时 $f(x)+f(y)>f(P)+n$,矛盾。证毕。

结论:\(mn=2\)\(mn=3\)

\(f(x)+f(y) \geq 2\),故显然不能更小了。下面给出一组构造算法:

  • 构造两个 \(n\) 个点的图,初始无边。

  • 枚举每个点 \(1,2,\cdots,n-2\),找一个点 \(v\) 使得 \(i\)\(v\)\(G\) 中不连通且 \(i\)\(P_v\)\(H\) 中不连通。

    • 这样的 \(v\) 一定存在。由于每个点度数不超过 \(1\),故 \(G\)\(H\) 中不能选的点都至多只有一个,那么不能选的点至多只有两个,而剩下的点至少有三个。
  • 找一个点 \(v\) 使得 \(n-1\)\(v\)\(G\) 中不连通。能找到的原因同上。

  • \(x_n\) 被唯一确定。

注意到上述算法中只有 \(3\) 处会增加环数,故 \(f(x)+f(y) \leq 3\)

接下来考虑构造方案。

将取到 \(mn\)\(x\) 记作 \(A\),取到 \(mx\)\(x\) 记作 \(B\)

\(A\) 通过不超过 \(n-1\) 次交换变为 \(B\),记这个过程中的 \(x\) 分别为 \(A=C_0,C_1,C_2,\cdots,C_{t-1},C_t=B\)

显然序列中任意两个相邻的 \(x\) 对应的 \(k\) 差不超过 \(1\),于是可以类似二分求函数零点的方式找到满足条件的 \(C_p\)

总时间复杂度 \(O(\sum n \log n)\)

Code

F. Spanning Trees of Interval Graph (???)

记总点数 \(S=\sum_{i,j} C_{i,j}\)

\(S \times S\) 的对角矩阵 \(A\) 和 矩阵 \(B\)。其中 \(A_{i,i}\) 表示与第 \(i\) 个点连边的数量(认为每个点会向自己连自环);\(B_{i,j}\) 表示第 \(i\) 个点与第 \(j\) 个点是否连边。

那么由 Matrix-Tree 定理,答案即 \((A-B)\)\(n-1\) 阶主子式。

然而 \(B\) 矩阵难以刻画。

引理:对于 \(n \times n\) 的矩阵 \(A\)\(f_1,\cdots,f_n,g_1,\cdots,g_n\)

\[\begin{vmatrix} x & g_1 & g_2 & \cdots & g_n \\ f_1 & A_{1,1} & A_{1,2} & \cdots & A_{1,n} \\ f_2 & A_{2,1} & A_{2,2} & \cdots & A_{2,n} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ f_n & A_{n,1} & A_{n,2} & \cdots & A_{n,n} \\ \end{vmatrix} = x \cdot \begin{vmatrix} A_{1,1}-f_1 g_1/x & A_{1,2}-f_1 g_2/x & \cdots & A_{1,n}-f_1 g_n/x \\ A_{2,1}-f_2 g_1/x & A_{2,2}-f_2 g_2/x & \cdots & A_{2,n}-f_2 g_n/x \\ \vdots & \vdots & \ddots & \vdots \\ A_{n,1}-f_n g_1/x & A_{n,2}-f_n g_2/x & \cdots & A_{n,n}-f_n g_n/x \\ \end{vmatrix} \]

证明 用第一行向下消元即可。

推论:对于 \(n \times n\) 的矩阵 \(A\)\(1 \times n\) 行向量 \(F_1,\cdots,F_n\)\(n \times 1\) 列向量 \(G_1,\cdots,G_n\)

\[\begin{vmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots & G_1 & G_2 & \cdots & G_n \\ 0 & 0 & \cdots & 1 \\ & & F_1 & & A_{1,1} & A_{1,2} & \cdots & A_{1,n} \\ & & F_2 & & A_{2,1} & A_{2,2} & \cdots & A_{2,n} \\ & & \vdots & & \vdots & \vdots & \ddots & \vdots \\ & & F_n & & A_{n,1} & A_{n,2} & \cdots & A_{n,n} \\ \end{vmatrix} = \begin{vmatrix} A_{1,1}-F_1 G_1 & A_{1,2}-F_1 G_2 & \cdots & A_{1,n}-F_1 G_n \\ A_{2,1}-F_2 G_1 & A_{2,2}-F_2 G_2 & \cdots & A_{2,n}-F_2 G_n \\ \vdots & \vdots & \ddots & \vdots \\ A_{n,1}-F_n G_1 & A_{n,2}-F_n G_2 & \cdots & A_{n,n}-F_n G_n \\ \end{vmatrix} \]

考虑用点乘刻画两个点 \(x,y\) 代表的区间 \([a,b]\)\([c,d]\) 是否相交,其等于 相交的点数 \(-\) 相交的边数。

于是设 \(1 \times n\) 行向量 \(F_x\)\(n \times 1\) 列向量 \(G_x\),满足:

  • \(F_{x,2i-1}=G_{x,2i-1}=[a \leq i \leq b],i \in [1,n]\)

  • \(F_{x,2i}=[a \leq i < i+1 \leq b],i \in [1,n)\)

  • \(G_{x,2i}=-[a \leq i < i+1 \leq b],i \in [1,n)\)

即向量每一位代表一个点或一条边。于是 \(B_{i,j}=F_i G_j\)

那么代入引理,所求即:

\[\begin{vmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots & G_1 & G_2 & \cdots & G_{S-1} \\ 0 & 0 & \cdots & 1 \\ & & F_1 & & A_{1,1} & 0 & \cdots & 0 \\ & & F_2 & & 0 & A_{2,2} & \cdots & 0 \\ & & \vdots & & \vdots & \vdots & \ddots & \vdots \\ & & F_{S-1} & & 0 & 0 & \cdots & A_{S-1,S-1} \\ \end{vmatrix} \]

倒过来从右下角应用引理,最后消成左上角的 \((2n-1) \times (2n-1)\) 的矩阵。那么相当于每个 \(F_{x,i}\)\(G_{x,j}\) 会对左上角第 \(i\)\(j\) 行有 \(-F_{x,i}G_{x,j}/A_{x,x}\) 的贡献,最后答案再乘上 \(\prod_x A_{x,x}\)

最后的矩阵每一项都容易用二维前后缀和算出,高斯消元求行列式即可。

总时间复杂度 \(O(n^3)\)

Code

posted @ 2023-01-14 08:07  苹果蓝17  阅读(133)  评论(0编辑  收藏  举报