又是一个奇怪的问题
查看原帖
又是一个奇怪的问题
374769
Epi4any楼主2022/11/22 22:28
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const int maxn=5e5+5;
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
	}
	return x * f;
}
int n;
struct UFD_set{
	int siz[maxn],fa[maxn],dis[maxn];
	void init() {
		for(int i=1;i<=n;i++) fa[i]=i, siz[i]=1;
	}
	inline int Qfind_set(int x){
		int ret=x;
		while(fa[ret]!=ret) ret=fa[ret];
		int i = x, j;
		while(i!=ret) {
			j=fa[i];
			fa[i]=ret;
			i=j;
		}
		return ret;
	}
	inline int find_set(int x) {
		if(fa[x]==x) return x;
		return find_set(fa[x]);
	}
	void Qmerge(int x, int y) {
		int fx=Qfind_set(x), fy=Qfind_set(y);
		if(siz[fx]<siz[fy]) fa[fx]=fy, siz[fy]+=siz[fx];
		else fa[fy]=fx, siz[fx]+=siz[fy];
	}
	void merge(int x, int y) {
		int fx=find_set(x), fy=find_set(y);
		fa[fx]=fy, dis[fx]=siz[fy], siz[fy]+=siz[fx];
	}
	int query(int x, int y) {
		int fx=find_set(x), fy=find_set(y);
		if(fx!=fy) return -1;
		int dis1=0,dis2=0;
		while(fa[x]!=x) dis1+=dis[x],x=fa[x];
		while(fa[y]!=y) dis2+=dis[y],y=fa[y];
		return abs(dis2-dis1)-1;
	}
} s;
int main() {
	n=read();
	s.init();
	for(int i=1,x,y;i<=n;i++){
		char op;scanf("%c",&op);
		x=read(),y=read();
		if(op=='M') s.merge(x,y);
		else cout<<s.query(x,y)<<endl;
	}
	return 0;
}

本地AC交上去全WA

各种方法无解求教qwq

2022/11/22 22:28
加载中...