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 能拿到的球的个数是:

\[\begin{aligned} &\sum_{j=1}^d [(jk-1)\bmod n\ge j]\cdot j\\\ &=\sum_{j=1}^d \left[jk-1-n\left\lfloor\frac{jk-1}{n}\right\rfloor\ge j\right]\cdot j \end{aligned} \]

因为 \(\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,x}=w_ux+\sum_{v\in \operatorname{son}(u)} \max_{0\le k\le z_{u,v}-x} f_{v,k}. \]

可以看出 \(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)\)

posted @ 2024-10-14 07:40  point_fish  阅读(10)  评论(0)    收藏  举报