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)\)。
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))\)。
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\),对于两棵子树的每一对拓扑序,将它们合并在一起,概率均为:
于是转移式为:
边界条件为 \(f_{A+1,j}=1\)。
线性处理逆元,时间复杂度 \(O(n+AB)\)(即 \(O(n^2)\))。
Sol2(官方题解)
为了方便,将满足树的父子间大小关系限制的事件的集合记为 \(R\)。
答案即 \(P(U<V \mid R)=\dfrac{P(U<V \wedge R)}{P(R)}\)。
先计算 \(P(R)\)。记事件 \(A_u\) 表示 \(u\) 为其子树中值最小的,显然所有 \(A_u\) 间两两独立。于是:
考虑计算 \(P(U<V \wedge R)\)。设 \(V\) 的父亲为 \(W\),记 \(R'=R \setminus (W<V)\),类似容斥:
同理,设 \(W\) 的父亲为 \(X\),\(R''=R \setminus (W<V) \setminus (X<W)\),则:
以此类推的,有:
而这里面的每一项的事件表示的限制都构成一棵外向树。枚举断开的点的深度 \(t\),概率容易计算:
同样线性处理逆元,时间复杂度 \(O(n+AB)\)(即 \(O(n^2)\))。
Sol2+
上式的计算还可以继续优化。
分子都是 \(2^{n-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{>}\) 时的上述方案数。于是答案为:
注意到要统计 \(|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\) 次数代表点的个数而不是边),容易得到:
再处理最后答案的生成函数 \(H(x)\)。由于无限制,钦定均为 \(\texttt{<}\) 的容斥系数均为 \(1\),可以认为就是若干 \(\mathcal{G}\) 中的元素拼在一起。
最后答案即为 \(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)\)。
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\)。
证明
用第一行向下消元即可。推论:对于 \(n \times n\) 的矩阵 \(A\) 及 \(1 \times n\) 行向量 \(F_1,\cdots,F_n\) 和 \(n \times 1\) 列向量 \(G_1,\cdots,G_n\)。
考虑用点乘刻画两个点 \(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\)。
那么代入引理,所求即:
倒过来从右下角应用引理,最后消成左上角的 \((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)\)。