【笔记】2023.12.14 树上问题

发布时间 2023-12-14 12:14:46作者: caijianhong

笔记 2023.12.14:树上问题

[Ynoi2004] rpmtdq

支配对:\(i_1\leq i_2\leq j_2\leq j_1, dist(i_1, j_1)\geq dist(i_2, j_2)\) 时,称 \((i_1, j_1)\)\((i_2, j_2)\) 支配,前者就无用了,选到区间只要包含 \((i_1, j_1)\) 就一定包含 \((i_2, j_2)\)

点分治到 \(rt\) 时,记 \(d_x=dist(x, rt)\),则支配对 \((i, j)\) 必须满足:

  • \(i<j\land d_i\leq d_j\),取 \(i\) 最大的。
  • \(i>j\land d_i\leq d_j\),取 \(i\) 最小的。

如果存在一个 \(k<i<j,d_k\leq d_j, d_i\leq d_j\),你冷静一下发现 \((k, j)\)\((k, i)\) 支配了,\(j\) 不用管它。

单调栈随便做做,搞出 \(O(n\log n)\) 个点对,最后 cdq 二位数点总是能做的。\(O(n\log ^2 n + q \log n)\)

CF1019E Raining season

边分治完了以后把 \((\sum a_i, \sum b_i)\) 看作点,两边建凸包,合并凸包(疑似是 Minkowski 和),更新答案,疑似 \(O(n\log ^2n)\),不知道外面有没有一棵大凸包要合并。

[NEERC2015] Distance on Triangulation

\(n-3\) 条对角线拿出来分治(使得分成的两个多边形点数尽量相等),对于分治的边,从分治的边开始 bfs,获取所有跨过这条边的询问的答案。向下递归时,将多边形劈成两个多边形。类似于一个神秘的猫树分治。

二分答案完了以后点分树一眼 \(O(n\log ^ 3n)\)

CF757G Can Bash Save the Day?

因为你已经会了如何用点分树查询全局答案,所以用主席树维护前缀的答案。swap 操作只改一棵主席树。\(O(n\log^2 n)\)

或者将 \(1\to p_i\) +1,查询 \(1\to x\) 的和也可以求那玩意。\(O(n\log^2 n)\)

据说有 1log 高论。

[CTSC2018] 暴力写挂

边分治分成两个点集 \(A, B\),不妨 \(A\) 靠近根,那么 \(A\) 中点 \(x\) 和任意 \(y\in B\) 的 LCA 确定。于是 \(dep_x-dep_{lca(x, y)}\) 确定。

考虑 \(dep'_y-dep'_{lca'(x, y)}\)。对涉及的点在 \(T'\) 上建虚树。将 \(dep_y\) 看作黑盒,在 \(T'\) 的虚树上,第一次 dp 将答案放在 LCA 上,第二次 dp 将 LCA 的信息放回 \(x\),都是轻易的。

于是 \(O(n\log n)\)。注意建虚树可以需要归并一下。

[WC2018] 通道

边分治第一棵树,在第二棵树上建虚树,枚举第二棵树上的 LCA \(k\),现在的答案形如:

\[d_1[x]+d_1[y]+w_{edge}+dep_2[x]+dep_2[y]-2dep_2[k]+dist_3(x, y) \]

要求 \(x, y\) 在边分治上不同集合,\(LCA(x, y)=k\)

\(x, y, 1\) 分别独立一下,变成什么 \(dist_3(x, y)+val_x+val_y+C\),观察到这其实是一个直径的形式,你总可以将 \(val_x, val_y\) 挂在第三棵树的这些点上,所以这就是直径。

在第二棵树的子树上合并第三棵树的直径端点。

*[JOISC2020] 首都城市

对颜色 \(i\) 建虚树,虚树边上的其他颜色 \(j\),连边 \(i\to j\)

欲将选到 \(i\),首先需要改所有 \(j\)\(i\),改完以后原来 \(j\) 的点也需要形成连通块,除非是被 \(i\) 隔开就不用管。

所以是最小的强连通分量。后面怎么做都行。怎么做啊?

sub

这个 ddp 太平凡了。

*LOJ6289 花朵

分治 ntt,其实不会很会具体做法。

ICPC2017 西安 D Islands

别学分治 ntt 了

[POI2014] HOT-Hotel

skipped

Another Boring Problem

树上莫队,求出树的 dfs 时的括号序列,在到达点、退出点时将其加入到序列。设每个点有两个出现位置 \(s_x ,t_x\),则查询区间相当于 \([t_x ,s_y ]\) 加上可能存在的 LCA 的贡献(不是祖先就要加)。注意这里不是严格的括号序,反正就是遇到就把状态取反。最后的 kth 怎么分块都行。

*2021 集训队互测 Lovely Dogs

待补一下,反正后面是 dsu on tree 套路,前面数学很好玩。

CF888G 最小异或生成树

他是在 Trie 树上考虑的,考虑 boruvka 的时候你是从 \(1, 2, 4, 8, 16, \cdots\) 的 highbit 一位一位考虑的,所以你直接在 Trie 树上,你声称 Trie 树上一棵子树是 boruvka 过程中的一个连通块,在点 \(p\) 合并它的左右子树的连通块。启发式查询一下就能保证复杂度为 \(O(n\log ^ 2n)\)

Rectangle

扫描线直接扫 \(O(\log n)\) 次就行。

*CF632F Magic Matrix

\(b_{ij}=\min_k\max(a_{ik}, a_{jk})\leq a_{ij}\)(取 \(k=i\)),那么有 \(a_{ij}\leq b_{ij}\leq a_{ij}\implies b_{ij}=a_{ij}\)

然后不知道为什么它就是 \(i, j\) 的所有路径的边权最大值的最小值。

然后跑 Kruskal 暴力判定一下。

*LOJ574 黄金矿工

将这个诈骗的边权和去掉。考虑无修改,是模拟费用流,

*JOISC 2020 Day3 收获

这个人收完苹果之后,下一个是谁收苹果是固定的,建内向基环树,以后的事情就是一坨了。