题目链接
【Codeforces 1109F】 Sasha and Algorithm of Silence’s Sounds
做法
当区间 $ [l, r] $ 中不存在环且点数与边数之差为 $ 1 $ 时是一棵树。当 $ r $ 增加时, $ l $ 也会增加,所以只要维护两个端点。
对于环的部分,可以用 $ LCT $ 快速维护( $ findroot $ 后要 $ splay $ 一下,否则会 $ T $)。
对于维护点数与边数之差,可以用线段树维护针对当前询问左端点为某个位置时点数与边数之差, $ r $ 增加时直接继承上一个 $ r $ 。若新加的点 $ r $ ,则线段树区间 $ [l, r] $ 的权值加一;若新加的点 $ r $ 对 $ k \in [l, r] $ 有边,则线段树区间 $ [l, k] $ 的权值减一。然后数线段树中权值为 $ 1 $ 的位置的个数即可。
复杂度 $ O(n \log n) $ 。
1 |
|