Codechef November Challenge 2020 Division 1 题解
T3
sb 卡常屑题爬(
考虑记忆化搜索,先一遍 DFS 预处理出 \(sum_x\) 表示 \(x\) 到根路径上所有 \(w\) 的平方的和,然后记 \(f(x,y)\) 表示 \(x,y\) 处的答案,那么如果 \(x=y\) 显然有 \(f(x,y)=sum_x\),否则有 \(f(x,y)=f(fa_x,fa_y)+w_xw_y\),直接记忆化搜索会 TLE,在 \(\sqrt{n}\mid dep_x\) 的 \((x,y)\) 存入一个 map
再记忆化搜索即可通过。
时间复杂度 \(q\sqrt{n}\)。
T4
首先很显然的一点是在每组询问中我们选择的区间的区间的右端点都是 \(r\),因为显然有 \(f(a[l…r])\le f(a[l…r+1])\)。于是问题转化为我们怎样动态维护 \(f(l,r),f(l+1,r),f(l+2,r),\cdots,f(r,r)\) 的最大值。我们考虑以 \(r\) 的增大为时间线并建一棵线段树,当 \(r=i\) 时,线段树上下标为 \(l\) 的位置存储 \(f(l,i)\) 的值。可以注意到对于一个 \(a_r\),满足 \(\max\limits_{i=l}^{r-1}a_i\ne\max\limits_{i=l}^ra_i\) 的 \(l\) 是一段区间,且这段区间的右端点是 \(r\),左端点可以通过从右往左一遍单调栈预处理出来。故当右端点从 \(r\) 变为 \(r+1\),我们需对线段树进行的唯一操作就是一段区间加。注意到这个过程是离线的,容易用带标记永久化的主席树将其做到强制在线。
时间复杂度 \((n+q)\log n\)。
T5
记 \(A=\min\limits_{i=1}^n\lfloor\dfrac{a_i}{2}\rfloor\),那么不难发现所有方案的答案之和等于 \(\sum\limits_{i=1}^A\prod\limits_{j=1}^n(a_j+1-2i)\),再除以 \(\prod\limits_{i=1}^n\dfrac{1}{a_i+1}\) 就是期望,于是问题转化为如何计算前面的式子的值。不难发现如果我们把 \(i\) 当作形式变量,那么 \(\prod\) 里面的东西就是关于 \(i\) 的 \(n\) 次多项式,其系数可以分治 + NTT 求出。而我们要计算的就是该多项式的前缀和,这等价于对于 \(k=0,1,2,\cdots,n\),求出 \(\sum\limits_{i=1}^Ai^k\),然后再乘上对应的系数求和。而对于多个 \(k\) 求自然数幂和是一个经典问题,即 \(f_k=\sum\limits_{i=0}^Ai^k\),\(F(x)\) 为 \(f\) 的 EGF,那么
多项式求逆即可。时间复杂度 \(n\log^2n\)。
T6
是个 challenge,不想看(大雾
T7
碰到这种最小代价的 2-SAT 问题,我们通常可以考虑集合划分模型。而题目中与颜色有关的条件明显暗示了一个二分图染色的模型,因此我们先考虑在同一个语句中的两个变量间连边,并对所有变量 \(i\),在 \(i\) 与 \(-i\) 之间连边,然后跑二分图染色得到每个点的颜色,然后考虑建立网络流模型,对于黑点,我们定义其与源点相连当且仅当该变量的值为 \(0\),而对于白点,我们定义其与源点相连当且仅当该变量的值为 \(1\)。那么我们考虑这样建模:
- 对于同一语句中的两个变量 \(x,y\),我们不妨假设 \(x\) 为黑点,那么显然 \(x,y\) 不同时为 \(0\) 当且仅当 \(x\) 与源点相连、\(y\) 与汇点相连这两个条件不同时成立,我们就连一条 \(x\to y\) 容量为 \(\infty\) 的边即可。
- 对于某一变量 \(i\) 及其取反 \(-i\),它们的值应当不同,又因为它们颜色不同,因此它们要么都与源点相连,要么都与汇点相连,这个可以通过在这两个变量之间双向连 \(\infty\) 的边实现。
- 对于同一变量 \(i\) 及其取反 \(-i\),不妨假设 \(i\) 为黑点,那么如果 \(x_i=0\),则如果 \(i\) 与汇点相连则需要花费 \(c_i\) 的代价,这个就连一条源点到 \(i\),容量为 \(c_i\) 的边即可实现;否则如果 \(i\) 与源点相连则需要花费 \(c_i\) 的代价,我们连一条 \(-i\) 到汇点,容量为 \(c_i\) 的边。
然后跑最小割即最大流即可。
T8
首先考虑斐波那契数列的通项公式:\(F_n=\dfrac{1}{\sqrt{5}}((\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n)\)。据此开始推式子:
可以发现左右两部分是对称的,因此我们只需知道如何求左式的值即可求出矩阵 \(B\),前面的 \(\dfrac{1}{\sqrt{5}}\) 是常数,我们先把它拿走。我们记 \(X=\dfrac{1+\sqrt{5}}{2}\),那么原式等价于求 \(X^a·\sum\limits_{i=0}^mA^iX^{di}=X^a\sum\limits_{i=0}^m(AX^d)^i\),前面的 \(X^a\) 直接快速幂求即可,瓶颈在于 \(\sum\) 中的部分,即如何对一个矩阵 \(A\) 求 \(\sum\limits_{i=0}^mA^i\),直接用类似于矩阵快速幂的方法求复杂度是 \(n^3\log m\) 的,对于此题而言无法通过。
思考如何优化。考虑矩阵的特征多项式,根据 Cayley-Hamilton 定理,假设 \(c_0,c_1,\cdots,c_n\) 为矩阵特征多项式的系数,那么有 \(\sum\limits_{i=0}^nc_iA^i=0\),移个项得 \(A^n=\sum\limits_{i=0}^{n-1}-\dfrac{c_i}{c_n}A^i\)。也就是说我们可以将 \(A^n\) 表示为 \(A^{n-1},A_{n-2},\cdots,A^0\) 的线性组合,而倘若我们知道了 \(A^x=\sum\limits_{i=0}^{n-1}a_iA^i,A^y=\sum\limits_{i=0}^{n-1}b_iA^i\),我们可以在 \(\mathcal O(n^2)\) 的时间内求出 \(A^{x+y}\) 的系数多项式,具体方法就是先对 \(a,b\) 做卷积,然后将 \(A^{2n-2}\) 拆成 \(A^{2n-3},A^{2n-4},\cdots,A^{n-2}\) 的线性组合,然后再拆 \(A^{2n-3},A^{2n-4}\),以此类推,也就是说我们可以通过快速幂的方式在 \(n^2\log m\) 的时间内将 \(A^m\) 表示成 \(A^0,A^1,\cdots,A^{n-1}\) 的线性组合,也进而可以用类似的分治做法将 \(\sum\limits_{i=0}^mA^i\) 表示成 \(A^0,A^{1},\cdots,A^{n-1}\) 的线性组合,这样我们预处理出 \(A^0,A^1,\cdots,A^{n-1}\) 后就可以 \(n^4\) 地算出 \(\sum\limits_{i=0}^mA^i\)。现在问题就转化为如何求 \(c_i\)。考虑牛顿恒等式:设 \(C_0,C_1,\cdots,C_n\) 为 \(A\) 地特征多项式从高位到低位的系数组成的序列,\(S_i\) 为 \(A^i\) 对角线上元素之和,那么有 \(\sum\limits_{i=0}^{k-1}C_i·S_{k-i}+kC_k=0\),据此可以算出 \(C_i\),再翻转一下可以得到真正的系数。
时间复杂度 \(n^4+n^2\log m\)。