【BJOI2014/bzoj4530】大融合

题意

有 $n$ 个点,初始没有连边,要求支持两个动态操作:

1. 加一条边(保证之前两点不连通)

2. 查询过一条边的简单路径数量(就是两边连通块的大小的乘积)

$n,Q\le 100000$

题解

由第一个操作保证之前两点不连通的性质可知,$n$ 个点最多被连成一棵 $n-1$ 条边的生成树。

离线做法:树剖+树状数组/线段树

我们可以离线确定出最终森林的形态(我们给森林中的每棵树随便定义个根)。

然后重新模拟操作时,只需要在最终的森林上做一些链操作(统计答案用)。

由于只有加边操作,所以模拟操作时,用并查集维护连通块。

同时我们还要维护当前以每个点为根的子树的大小。

这样,插入一条边时,假设在最终的树形态中 $u$ 是 $v$ 的父亲(这个是已知的,因为我们随便定了一个根),那从点 $u$ 到当前点

猜你喜欢

转载自www.cnblogs.com/scx2015noip-as-php/p/bzoj4530.html