明天再来补最后一题的思路。
CF208E Blood Cousins
题目大意
给一棵 \(n\) 个点的树,点编号为 \(1\) 到 \(n\)。共 \(m\) 次询问,每次询问给出一对整数 \(v\) 和 \(p\),求有多少点与点 \(v\) 有共同的 \(p\) 级祖先。
思路
使用倍增求出每个点的祖先数组。离线所有询问,把询问都挂到祖先的点上。
在每个点上以深度为点建立权值线段树,那么 \(v\) 的答案就可以转换为 \(v\) 的 \(k\) 级祖先 \(u\) 的线段树中深度为 \(dep_u+p\) 的点的数量 - 1(\(v\) 点本身需要减掉)。
CF600E Lomsat gelral
题目大意
给一棵 \(n\) 个点的以 \(1\) 为根的有根树,每个点有权值 \(c\)(\(c\in[1,n]\)),对于每个 \(i\in[1,n]\),求出以 \(i\) 为根的子树中出现次数最多的权值之和。
思路
以权值为点建立权值线段树,dfs时把子节点的线段树合并到父节点上,查一下次数最多的权值统计下答案。
P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
题目大意
给一棵 \(n\) 个点的树,有 \(m\) 次操作,每次操作会在 \(x\) 到 \(y\) 这条链上发放 \(z\) 类型的物品。问 \(m\) 次操作后每个点存放最多的物品是哪种。
思路
用差分把每次操作变成树上差分,权值线段树以物品类型为点建立,答案就是每个点的最大值(记得记数量最多的物品的类型)。
P3224 [HNOI2012]永无乡
题目大意
有 \(n\) 个点,编号 \(1\) 到 \(n\),并有互不相同的排名。有两种操作:
B x y
表示连接点 \(x\) 和点 \(y\)。Q x k
表示询问与 \(x\) 连通的点中第 \(k\) 重要的是哪个点。
思路
用并查集维护连通性,以排名为点建立权值线段树,直接操作就行。
射手座之日
题目大意
给一棵 \(n\) 个点的树和一个长度为 \(n\) 的排列。一个子区间的权值等于子区间中所有元素 LCA 的点权,求所有子区间的权值之和。