题解 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\) 的父亲不能算入答案这样的细节。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/solution-hyoir10.html