做题记录 25.2.5

\(\textcolor{purple}\odot\) [ABC386G] Many MST

\(\nu(x)=\frac{x(x-1)}2\)

先把边权变为 \([0,m)\),最后将答案加上 \((n-1)\cdot m^{\nu(n)}\) 即可

\(U\) 为所有合法的完全图的集合,显然 \(|U|=m^{\nu(n)}\),令 \(G_k\) 为完全图中边权 小于 \(k\) 的边组成的子图,令 \(C(G)\) 为图 \(G\) 中联通块数量

则对于一个图 \(G\),其最小生成树边权和可以表示为 \(\sum_{k=1}^m (C(G_k)-1)=-m+\sum_{k=1}^m C(G_k)\)

答案为

\[(n-1)\cdot m^{\nu(n)} + \sum_{G\in U} \left(-m+\sum_{k=1}^m C(G_k)\right) \]

其显然等于

\[(n-1-m)\cdot m^{\nu(n)} +\sum_{k=1}^m \sum_{G\in U} C(G_k) \]

考虑如何对于每个 \(1\le k\le m\) 求出 \(\sum_{G\in U} C(G_k)\)

每种联通块(边数和点数相同的为一类)分别计算贡献(即数量)

对于 \(E\)\(V\) 边的联通块:对于在联通块内(两个端点都在联通块内)的边,边权 \(<k\) 的有 \(V\) 条,一共 \(k^V\) 种;其余 \(\nu(E)-V\) 条边边权 \([k,m)\),共 \((m-k)^{\nu(E)-V}\) 种选择;对于联通块外的边,边权任意,共 \(m^{\nu(n-E)}\) 种;对于联通块边缘(一端在联通块内,一端在外),共 \(E(n-E)\) 条,边权为 \([k,m)\),共 \((m-k)^{E(n-E)}\)

总贡献为

\[k^V (m-k)^{\nu(E)-V} m^{\nu(n-E)} (m-k)^{E(n-E)} \]

\(f(E)\)(对于每个 \(k\) 分别计算一遍)为所有 \(E\) 点的 联通块\(k^V (m-k)^{\nu(E)-V}\) 之和

则所有 \(E\) 点联通块的总贡献为

\[\binom nE f(E)m^{\nu(n-E)} (m-k)^{E(n-E)} \]

即总答案为

\[(n-1-m)\cdot m^{\nu(n)} + \sum_{k=1}^{m} \sum_{E=1}^n \binom nE f(E)m^{\nu(n-E)} (m-k)^{E(n-E)} \]

预处理次幂(\(0\sim 500\)\(0\sim 250000\) 次,空间足够存储)和组合数,若能对于所有 \(k\) 求出 \(f(1\sim n)\),容易 \(O(n^2)\) 计算答案,问题转化为计算 \(f\)

对于一个 \(f(E)\),所有边的总方案数为 \(k^{\nu(E)}\),然后减去不联通的方案数,枚举第 \(E\) 个点所在子联通块的点数 \(i\),可得

\[f(E)= k^{\nu(E)} - \sum_{i=1}^{E-1} \binom{E-1}{i-1} f(i) (m-k)^{(s-i)} m^{\nu(s-i)} \]

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

代码

参考

\(\textcolor{purple}\odot\) [AGC003F] Fraction of Fractal

当给定图形上下联通且左右联通时,\(k\) 阶图形整体联通,只有 \(1\) 个联通块

当给定图形上下左右都不联通时,\(k\) 阶图形联通块数量为 \(cnt^{k-1}\),其中 \(cnt\)\(1\) 阶图形中 \(\#\) 的数量

然后考虑左右联通但上下不联通的情况(另一种情况翻转即可)

\(x_i\) 表示第 \(i\) 阶中 \(\#\) 的数量,令 \(t_i\) 表示第 \(i\) 阶中左右相邻且都为 \(\#\) 的数量,令 \(f_i\) 表示第 \(i\) 阶中最左侧和最右侧都是 \(\#\) 的行的数量

则答案为 \(x_{k-1}-t_{k-1}\)(因为从第 \(2\) 阶开始,每行之间就互相独立了,一行中若有两个相邻,对应在 \(k\) 阶中就是两个 \(1\) 阶的左右相连,因此联通块数量会减 \(1\)

\(x_1,t_1,f_1\) 容易 \(O(n^2)\) 计算

显然 \(x_i=x_{i-1}\times x_1\)\(f_i=f_{i-1}\times f_1\)

从第 \(i-1\) 阶到第 \(i\) 阶,相当于将第 \(i-1\) 中每个 \(\#\) 都换成第 \(1\) 阶,这样第 \(i-1\) 中每对左右相邻的在第 \(i\) 阶中对应 \(f_1\) 对,第 \(i-1\) 阶中每个 \(\#\) 又新产生 \(t_1\) 对,因此 \(t_i=t_{i-1}\times f_1+x_{i-1} \times t_1\)

将递推过程写为矩阵相乘的形式为

\[\begin{bmatrix}x_{i-1}& t_{i-1} \\0 & f_{i-1}\end{bmatrix}\begin{bmatrix}x& t \\0 & f\end{bmatrix}=\begin{bmatrix}x_i& t_i \\0 & f_i\end{bmatrix} \]

矩阵快速幂即可

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

代码

\(\textcolor{purple}\odot\) [AGC006D] Median Pyramid Hard

考虑二分答案,$\ge $ 二分值的设为 \(1\)\(<\) 二分值的设为 \(0\),该数组记为 \(b\)

记数组 \(b_{1\sim 2n-1}\) 经过 \(k\) 次变换后结果为 \(b^k_{1+k\sim 2n-1-k}\)

\(b\) 中存在相邻的相同元素,则经过若干次变换后对应两个位置依然相同(除非超出边界)

找到最靠近 \(n\) 的一对相同元素,则最终剩下的值等于这对元素的值

显然满足条件的元素对可能有两对,但值一定唯一

最靠近中间的一对相同元素 到 中间位置,该区间中一定 \(0/1\) 交错,经过若干次变换后依然 \(0/1\) 交错,且这个结构会令那对相同元素向中间延伸,最后成为唯一留下来的值

若不存在相邻的相同元素,则说明整个 \(b\) 都是 \(0/1\) 交错,此时剩下来的值等于 \(b_1\)

单次判断时间复杂度 \(O(n)\)

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

代码

\(\textcolor{purple}\odot\) [AGC005D] ~K Perm Counting

考虑容斥

\(t_x\) 为有至少 \(x\) 个位置满足 \(|p_i-i|=k\) 的方案数,则最终答案为 \(\sum_{i=0}^n (-1)^i t_i\)

\(g_x\) 表示选出 \(x\)\(p_i\)\(i\) 一一配对,满足每对都有 \(|p_i-i|=k\) 的方案数,则 \(t_x=(n-x)! g_x\)

建立 \(2n\) 个点,分别表示 \(p_{1\sim n}\)\(1\sim n\),满足 \(|p_i-i|=k\) 的之间连无向边,则 \(g_x\) 相当于在这张图上选择大小恰好为 \(x\) 的匹配的方案数

显然这张图为链的集合,且其中 \(2(n\bmod k)\) 条有 \(\lfloor\frac nk\rfloor+1\) 个点,剩余 \(2k-2(n\bmod k)\) 条有 \(\lfloor\frac nk\rfloor\) 个点

\(2(n\bmod k)\)\(\lfloor\frac nk\rfloor\) 条边的链,\(2k-2(n\bmod k)\)\(\lfloor\frac nk\rfloor-1\) 条边链,选择其中 \(x\) 条,满足任意两条选择的不相邻,求方案数

容易 \(dp\) 解决,时间复杂度 \(O(n^2)\)

可以使用生成函数和多项式做到 \(O(n\log n)\)

代码

\(\textcolor{purple}\odot\) [AGC004E] Salvage Robots

先转化为出口在平面上移动,并把超出边界的部分删去,最大化经过的数字之和

令出口坐标为 \((sx,sy)\)

\(dp_{u,d,l,r}\) 表示出口覆盖区域为 \((sx-u\sim sx+d,sy-l\sim sy+r)\) 的情况下最优解,则答案为 \(dp_{sx-1,n-sx,sy-s,m-sy}\),边界为 \(dp_{0,0,0,0}=1\)

转移时考虑向四个方向分别扩展一格,以向上为例

\(L=\max(sy-l,r+1)\)\(R=\min(sy+r,m-l)\)\(U=\max(sx-u,d+1)\)\(D=\min(sx+d,n-u)\),表示当前为止还没有清空且能取到的区域的边界

\(sx-u\le d+1\),则上方已经被清空过了,转移为

\[dp_{u+1,d,l,r} \gets dp_{u,d,l,r} \]

否则转移为

\[dp_{u+1,d,l,r} \gets dp_{u,d,l,r} + a_{sx-u-1,L\sim R} \]

此处 \(L\sim R\) 表示每个取值求和

预处理 \(a\) 的二维前缀和,时间复杂度 \(O(n^4)\),需要将 \(dp\) 设为 short 卡空间

代码

\(\textcolor{purple}\odot\) [AGC007D] Shik and Game

\(f_i\) 表示 \(1\sim i\) 号都已经收集了金币,\(i+1\sim n\) 号还没有送过糖的最小时间,转移为

\[f_i\gets f_j+a_i-a_j+\min(T,2(a_i-a_j)) \]

表示先从 \(j\) 走到 \(i\),给 \((j,i]\) 的都发糖果,然后走回 \(j\),等待 \(\max(0,T-2(a_i-a_j))\) 时间后回到 \(i\),并收集 \((j,i]\) 的金币

暴力转移为 \(O(n^2)\)

先把所有 \(a_i-a_j\) 提出,最后 答案加上 \(E\) 即可,转移为

\[f_i\gets f_j+\min(T,2(a_i-a_j)) \]

双指针求出 \(T>2(a_i,a_j)\)\(j\) 的区间,记录区间以内的 \(f_j-2a_j\) 的最小值,记录区间以外的 \(f_j+T\) 的最小值

时间复杂度 \(O(n)\)

代码

posted @ 2025-02-06 08:23  Hstry  阅读(10)  评论(0)    收藏  举报