7.25 solution
T1
dsu on tree 板子,记录子树内状态即可。
T2
猫树板子。
记 \(val_{i,j}\) 为 \(i,j\) 之间的最长边,可以找到前后缀的 \(val_{i,j}\),把两端拼起来后跑 kruskal,复杂度 \(O(nh\log n+nh^2+100n)\)。
T3
floyed。
容易发现当颜色改变时会直接回收所有标记。
先用 \(min,+\) floyed 跑出不同色之间的最小距离,然后用 \(min,max\) floyed 跑从 \(1\) 到 \(n\) 的最短路。
T4
- 简单楼房重建套路题。
- 假设手上是一个无限长的序列 \(a\),那么一个询问 \(s,t\) 就是要二分出最大的 \(r\) 使得:
\( \sum_{i=s}^{r} a_i \max_{s \leq j \leq i} \{a_j\} \leq t \) - 因此如果能用数据结构维护出:
\( \sum_{i=1}^{r} a_i \max_{t \leq j \leq i} \{a_j\} \)
就很容易解决。 - 为了用线段树维护上述信息,并支持区间加和区间赋值操作,需要维护以下三个量:
\( \begin{align*} S_1(l,r) &= \sum_{i=1}^{r} A_i \cdot \max_{j=1}^{i} \{A_j\} \\ S_2(l,r) &= \sum_{i=1}^{r} \max_{j=1}^{i} \{A_j\} \\ S_3(l,r) &= \sum_{i=1}^{r} A_i \end{align*} \) - $ S_3 $ 的维护较简单。$ S_2 $ 的合并逻辑如下:
- 设 $ mx_{\text{lson}}, mx_{\text{rson}} $ 分别为左右子树的最大值。
- 若 $ mx_{\text{lson}} \geq mx_{\text{rson}} $,则 $ S_2(l,r) = S_2(l,m) + (r-m) \cdot mx_{\text{rson}} $。
- 否则需递归处理(详见下文)。
- 递归维护最大值 $ M $:
- 若 $ M \geq mx_{\text{lson}} $,则左子树贡献确定,递归处理右子树。
- 否则右子树贡献独立于 $ M $(可预计算),递归处理左子树。
- Pushup 操作复杂度为 $ O(\log n) $,单次线段树操作总复杂度为 $ O(\log^2 n) $。
- $ S_1 $ 的维护方式与 $ S_2 $ 类似。
- 对 $ r $ 的二分可在线段树上完成,单次询问复杂度 $ O(\log^2 n) $。
-
注:上述楼房重建的介绍可能不够清晰,可参考 洛谷 P4198。
本文来自博客园,作者:mikefeng,转载请注明原文链接:https://www.cnblogs.com/mikefeng/p/19004114

浙公网安备 33010602011771号