Link
Solution
神了。 暴力并查集,最后看有多少个集合。设个数为,那么答案就是,然而明显很多次操作是重复的。 那就考虑区间一下?似乎并不好直接把并查集套到线段树上。 然后就开始高能: 维护倍增的并查集!表示之后长度的区间所属的集合,那么合并就可以拆成段。 对于两个集合的合并,不停地向下递归合并长度更小的对应集合,直到某两个小区间已经被合并到了一个集合里面。 这种思想需要好好领会。
Code
1 |
|
神了。 暴力并查集,最后看有多少个集合。设个数为x,那么答案就是9∗10x−1,然而明显很多次操作是重复的。 那就考虑区间一下?似乎并不好直接把并查集套到线段树上。 然后就开始高能: 维护倍增的并查集!fa[lg][pos]表示pos之后2lg长度的区间所属的集合,那么合并就可以拆成O(logn)段。 对于两个集合的合并,不停地向下递归合并长度更小的对应集合,直到某两个小区间已经被合并到了一个集合里面。 这种思想需要好好领会。
1 | #include "lucida" |