P6626 题解
有一个很暴力的解法,就是以询问点为根 DFS。
考虑优化,我们考虑优化换根。
当根节点从父亲移动到它的某个孩子时,孩子的子树内所有点深度减 \(1\) 其余点深度加 \(1\)。
同理,当根节点从某个节点移动到它的父亲时,它的子树内所有点深度加 \(1\) 其余点深度减 \(1\)。
那么考虑把询问挂在点上,然后处理出以 \(1\) 为根的深度,然后从 \(1\) 开始 DFS 并按照上面的方法修改所有节点的深度。
不难发现我们需要一个数据结构支持区间加和区间查询某一个数出现次数。
考虑分块,块内维护一个桶和加法标记即可维护所有信息与修改查询,将分块离线逐块处理即可做到 \(O(n)\) 空间,\(O(Tn \sqrt n)\) 时间。
由于常数很逆天,所以目前只在 LOJ 上通过,这里放一个评测链接。