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

posted @ 2025-07-25 11:29  mikefeng  阅读(124)  评论(1)    收藏  举报