题解 HYOI#10:cp round 5

HYOI#10 题解

universe 是经典原题。

原定题目顺序如标题顺序。

kson

首先根据 \(k\) 子段的定义可得,\(a\) 中的一段子段 \([l,r]\)\(k\) 子段当且仅当 \(\sum_{i=l}^{r} a_i < k^{k - 1}\),由于 \(\sum a_i\) 最多只有 \(10^{16}\),所以 \(k\) 会影响询问的值不会超过 \(16\),这时我们就可以通过尺取法预处理 $k \in (1,16] $ 的所有答案,对于每个 A 操作,由于只有 \(100\),暴力重构即可,时间复杂度是 \(\mathcal{O}(\max k qn)\)\(\max k = 16\)\(q\) 代表 A 操作的次数)。实现不好直接 TLE。

greedy

定义 \(dp_{l,r}\)\(l\)\(r\) 中 A 按照策略取的最小值。

由题意得:

  • 当我选左边时:

    • \(a_{l+1} \ge a_r\)\(dp_{l+2,r} = \min(dp_{l+2,r},dp_{l,r} + a_{l + 1})\)
    • \(a_{l+1} < a_r\)\(dp_{l+1,r-1} = \min(dp_{l+1,r-1},dp_{l,r} + a_{r})\)
  • 当我选右边时:

    • \(a_{l} < a_{r-1}\)\(dp_{l,r-2} = \min(dp_{l,r-2},dp_{l,r} + a_{r-1})\)
    • \(a_{l} \ge a_{r-1}\)\(dp_{l+1,r-1} = \min(dp_{l+1,r-1},dp_{l,r} + a_{l})\)
  • 初始化:对于 \(\forall i\in[1,n),j\in(1,n],dp_{i,j} =dp_{j,i} = +\infty\),且 \(dp_{1,n} = 0\)

  • 统计答案:

    • \(l + 2 \ge r\) 时,\(ans = \min(ans,\min(dp_{l+2,r},dp_{l,r-2}))\)
    • \(l + 1 \ge r - 1\) 时,\(ans = \min(ans,dp_{l+1,r-1})\)

最后输出 \(ans\) 即可。

universe

考虑在值域上从下往上扫描线,扫到权值 \(v\),取出最左边的 \(\geq v\) 的和最右边的 \(\geq v\) 的两个位置更新答案。用两个指针维护两个数,发现它们在扫描线过程中恰好经过整个序列。除去排序,\(O(n)\)

hubingshan

考虑随便跑一棵生成树,按照 \(dep_u\bmod 2\) 给点 \(u\) 染色。然后随便选一条非树边,将其中一端染成第三种颜色。

excellent

试图一次求出所有 \(g(u)\)

定义在原树上点 \(i\) 的权值之和为 \(s_i\)。关于 \(s_i\),我们找一些性质:

  • 对于 \(i\) 的一个祖先 \(f\)\(i\) 能跳上 \(f\),当且仅当 \(\frac{1}{2}s_f\leq s_i\)
  • 对于 \(i\) 的兄弟节点的祖先 \(g\)(不在 \(i\) 到根的路径上的),当且仅当 \(\frac{1}{2}(s_g+s_i)\leq s_i\)\(s_g\leq s_i\),计算时算的是接上后的 \(s_g\)

于是我们可以转化问题:在深度为 \(d\) 的节点中,是否有一个 \(\frac{1}{2}s_f\leq s_i\) 或者 \(s_g\leq s_i\)?考虑把这些东西的 \(\min\)\(s_f\) 计算时带上 \(\frac{1}{2}\))算出来,每一层都算,到了节点 \(i\) 就可以找 \(\min\leq s_i\) 的深度,直接数数即可。

考虑这个东西怎么实现?首先预处理一下 \(dep,s\),同时算出 \(mn_d\) 表示深度 \(d\) 的节点的 \(s\) 的最小值(不算 \(\frac{1}{2}\))。再一遍 dfs,递归下去时,因为 \(\frac{1}{2}s_f\leq s_f\) 恒成立,所以直接往下传一个 \(\min(mn_d,\frac{1}{2}s_f)\),就是这一层的 \(\min\)。询问时要数 \(\min\leq s_i\),用一个树状数组 + 离散化就能实现。

注意实现细节,例如离散化、树状数组开两倍,\(i\) 的父亲不能算入答案这样的细节。

posted @ 2023-09-03 14:36  caijianhong  阅读(24)  评论(0编辑  收藏  举报