推导部分和(蓝桥杯)


我要是早点复习一下带权并查集 当时这个题就能A掉了 啊啊啊啊啊啊心态爆炸

这就是一个带权并查集的模板题啊

给出[l,r]的区间和,相当于s[r]-s[l]

一旦已经知道了 s[a]-s[b],s[b]-s[c],显然再给出一条[a,c]就可以判断"真假"了

将每条这样的信息(l,r,w),l,r放入一个集合中,

用并查集来维护,并维护cha[l]=s[root]-s[l],cha[r]=s[root]-s[r]

若 l,r已经在同一个集合中,就直接查询cha[l]-cha[r],判读与w是否相等

合并操作是灵魂

#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e5+5;
ll val[maxn];
int fa[maxn];
int n,m,Q;
int find(int x){
	if(x==fa[x])return x;
	int oldfa=fa[x];
	fa[x]=find(fa[x]);
	val[x]+=val[oldfa];
	return fa[x];
}
int main(){
	cin>>n>>m>>Q;
	for(int i=0;i<=n;i++)fa[i]=i; 
    for(int i=1;i<=m;i++){
    	ll L,R,S;
    	cin>>L>>R>>S;
    	L--;
    	int fx=find(L),fy=find(R);
    		fa[fy]=fx;
    		val[fy]=val[L]-val[R]-S;
	}
	while(Q--){
		int L,R;
		cin>>L>>R;
		L--;
		int fx=find(L),fy=find(R);
		if(fx!=fy)
		cout<<"UNKNOWN"<