题目描述
【并查集|[CF938G] Shortest Path Queries】给你一幅n个点,m条边的无向图,每条边有权值d,现在有q次操作,有三种操作。
1,给出x,y,d,加入连接x,y的权值为d的边
2,给出x,y,删除这条边
3,给出x,y,问从x到y的路径的最小异或和。
保证操作合法且一直为简单连通图
n,m,q<=1e5
部分分:q=1,且为操作3
解题思路
考虑部分分。
随便搞一个dfs树出来,你一条返祖边代表一个环。x到y的树路径的xor和为x到根的xor和y到根xor的异或和。考虑让环也有贡献,直接搞个环的线性基即可。
操作这么多?
考虑把每条边的存在时间找出来,然后插到以时间为下标线段树的对应节点,发现一条边最多拆成log条。询问就打在线段树叶子上。
dfs一边线段树区间。我们现在想要维护部分分的两个东西,连通性和简单路径xor和用可撤销并查集做,进来区间的时候按秩合并并记录原来的形态,出去的时候撤销即可。线性基由于很小,直接暴力下传。
一条边按秩合并时间复杂度O(logn),一条原来的边拆成了O(logn)条,时间复杂度O(nlog^2 n)
代码
#include
#include
#include
#include
#include
推荐阅读