mx 12
A.
显然图是一个内向基环树森林。考虑在同一连通块内的两个不同的点 \(x,y\),它们需要都走到环上才可能会走到同一个点。所以任取环上的一个点 \(u\),可以求出 \(x\) 和 \(y\) 到 \(u\) 的步数 \(d_x,d_y\),设环长为 \(c\),只需要 \(d_x\not\equiv d_y\pmod c\),\(x\) 和 \(y\) 就永远不会走到同一个点上。
对于每个连通块,设这个连通块内有 \(cnt_i\) 个 \(d_x\equiv i\pmod c\) 的点 \(x\),对于每个 \(i\),将答案减去 \(\binom{cnt_i}{2}\) 即可。
时间复杂度 \(O(n)\)。
B.
将盒子重标号为 \(0,1,\dots,n-1\),当 Bob 拿编号为 \((jk-1)\bmod n\) 的盒子时,Alice 已经拿了编号在 \([0,j-1]\) 内的所有盒子。所以 Bob 在第 \(j\) 次拿的盒子非空,当且仅当 Bob 以前没拿过这个盒子,且 \((jk-1)\bmod n\ge j\)。
并且,Bob 拿盒子的方式有长度为 \(d=\frac{n}{\gcd(n,k)}\) 的循环节,所以只需要对前 \(d\) 次进行计算。所以固定 \(k\) 的时候,Bob 能拿到的球的个数是:
因为 \(\left\lfloor\frac{jk-1}{n}\right\rfloor\le k\),可以暴力枚举 \(\left\lfloor\frac{jk-1}{n}\right\rfloor\) 的取值,然后算这个区间内的 \(j\) 有多少个满足条件。
对于每个 \(1\le k\le m\) 都算一遍,时间复杂度 \(O(m^2)\)。
C.
每个数的最优策略都是先除后乘,或者只除/乘。设 \(f_{i,j,k}\) 表示 \(a_i\gets \lfloor\frac{a_i}{2^j}\rfloor\times 2^k\),并且使 \(a_{1\dots i}\) 单调不降的最小花费。但注意到 \(k\) 这一维可能很大,设 \(m=\max_{i} \{a_i\}\),对于 \(\lfloor\frac{a_i}{2^j}\rfloor\times 2^k\le m\) 和 \(>m\) 有不同的转移方法。
当 \(\lfloor\frac{a_i}{2^j}\rfloor\times 2^k>m\) 时,\(a_{(i+1)\dots n}\) 也会变成 \(>m\) 的数。设 \(g_{i,j}\) 表示 \(a_{i\dots n}\) 都变成 \(>m\) 的数,且 \(a_i\) 被除了 \(2^j\),并且单调不降的最小花费。我们找到最小的 \(k\) 使得 \(\lfloor\frac{a_i}{2^j}\rfloor\times 2^k>m\),那么最优策略一定是:如果当前这个数小于等于 \(i+1\) 位置的数,就直接转移;否则把 \(a_{(i+1)\dots n}\) 整体乘二。
这样 \(f\) 的 \(j,k\) 两维都 \(\le \log_2 m\) 了。\(f\) 用双指针 \(O(1)\) 转移,\(g\) 直接枚举下一个状态,时间复杂度 \(O(n\log^2 n)\)。
D.
记 \(z_{u,v}\) 表示 \((u,v)\) 这条边的边权。
设 \(f_{i,x}\) 表示以 \(i\) 为根的子树内,\(a_i=x\) 时的 \(\sum_u w_ua_u\) 最大值。转移是:
可以看出 \(f_u\) 是由连续的斜率单调递减的一次函数组成的。考虑 slope trick,维护 \(f_u\) 的斜率最小值 \(l_u\) 和最大值 \(r_u\),以及它的所有斜率转折点。对于那个 \(\max\),相当于将 \(f_v\) 沿 \(x=\frac{z_{u,v}}{2}\) 对称后去掉所有斜率 \(>0\) 的部分。这些操作都可以用可并堆维护。
最后一个问题是计算答案。用归纳法可以证明 \(\forall u,l_u\le 0\le r_u\)。所以 \(f_u\) 一定存在一段斜率 \(=0\) 的部分。考虑递归计算答案,设当前要计算 \(a_u\) 最优是什么,且它的父节点给它一个限制 \(a_u\le z\)。设 \(f_u\) 斜率 \(=0\) 的一段的开始位置在 \(L_u\),那么最优一定取 \(a_u=\min(z,L_u)\),然后递归下去即可。
时间复杂度 \(O(n\log n)\)。

浙公网安备 33010602011771号