先打题解(思路)再打代码,因为这题实在挺难打。
Decription
- 给定一个无向图,并且有q次操作,每一次加上或删去一条边。
- 在操作前以及每一个操作后询问无向图中桥的个数。
- n<=2e5,q<=4e5
Solution
- 由于删除操作不好做,所以我们考虑只有加入操作的时候。
- 如果一条边在时间[l,r]中存在,那么就将它加到线段树的对应区间中。
- 考虑每条边在线段树上完全覆盖的最大区间中再加入。
- 那么就有nlogn个区间有加入的操作。
- 但是我们注意到点数可能会很大,也就是说我们不能暴力对于每一个节点都从上到下计算覆盖它的边的影响。
- 考虑将加了边后的图缩成一个个的边双。再根据当前当前线段树上节点以及它的子树节点上挂的边中关系到的点建一颗虚树。
- 其他的边双中的边如果在虚树上的两个点间就会对其的边权产生贡献。
- 如果完全不会影响虚树中的点就直接统计贡献。
- 这样的话从根往下维护边双的图就好了。
- 虚树构建可以暴力建O(区间长度)
- 复杂度O(nlogn)