点分治常用于树上路径统计等问题。
每次分治过程大致如下:
我们先求出当前连通块树的重心;
处理与重心有关的答案;
删除重心
递归处理与重心相连的子连通块。
伪代码如下:
void solve(int x) { Find1(x,0),Find2(x,0); // 找到重心 rt // 处理和 rt 有关的答案 used[rt]=true; for(/*与 rt 直接相连并且没有被删除的节点*/) solve(ver); }
P3806 【模板】点分治
P4178 Tree
树上 \(0/1\) 背包:给定一棵树,每个点上有一个物品有一个价值 \(w_i\),\(m\) 次询问,每次询问 \(u\) 到 \(v\) 的路径上选择 \(k\) 个物品的最大价值。
P6326 Shopping
咕咕咕