CF757G Can Bash Save the Day?
时间复杂度分析好题(大雾)。
将询问拆成几部分,也就是 d i s ( u , v ) = d e p ( u ) + d e p ( v ) − 2 ∗ d e p ( L c a ( u , v ) ) dis(u, v) = dep(u) + dep(v) - 2 * dep(Lca(u, v)) dis(u,v)=dep(u)+dep(v)−2∗dep(Lca(u,v))。
显然对于 L c a Lca Lca 我们直接进行树链剖分即可。
我们对于每一个 v v v 维护 ≤ l \le l ≤l 的 d e p ( L c a ) dep(Lca) dep(Lca) 的贡献,为了节省空间我们直接使用可持久化线段树,进行插入的时候使用标记永久化。
具体来说就是将 [ l , r ] [l, r] [l,r] 这个 d f s dfs dfs 序的区间进行 + 1 + 1 +1 意味着,整个区间加上了 s u m d e p r − s u m d e p l − 1 sumdep_r - sumdep_{l - 1} sumdepr−sumdepl−1 的贡献,之后为了保证线段树的复杂度是 log n \log n logn 我们直接在这里记录标记了几次。然后在进行查询的时候直接下传还有多少次标记没有传完即可。直接像普通线段树下传标记会出现下传了不是属于当前线段树节点的情况。
对于修改的话,发现前缀和只有一个位置变了,也就是只需要修改一个位置。
然后因为本题是卡空间的,我们考虑一次加入点是 log n \log n