求调萌新蛋疼的带修改并查集
查看原帖
求调萌新蛋疼的带修改并查集
482730
aSunnyDay楼主2022/6/17 09:02

萌新瞎写的,求调,thx!

#include<bits/stdc++.h>
#define N 200009 
using namespace std;
typedef long long ll;
ll n,m,id[N],d[N],pos[N];
ll find(ll x){return id[x]==x?x:find(id[x]);}//^??
struct edge{
	ll x,y;
	bool operator<(const edge&a) const{
		return a.x<x||(a.x==x&&a.y<y);
	}
};
map<edge,ll> mp;
void unite(ll x,ll y,ll o){
	ll a=find(x),b=find(y);
	if(a==b) return;
	mp[(edge){x,y}]=mp[(edge){y,x}]=a;
	if(rand()&1) id[a]=b;
	else id[b]=a,mp[(edge){x,y}]=mp[(edge){y,x}]=b;
}
void del(ll x,ll y){
	ll w=mp[(edge){x,y}];
	id[w]=w;
	mp[(edge){x,y}]=mp[(edge){y,x}]=0;
}
ll read(){
	ll x=0;
	char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x;
}
char gc(){
	char c=getchar();
	while(c<'A'||c>'Z') c=getchar();
	return c;
}
int main(){
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
	srand(time(0));
	n=read(),m=read();
	for(ll i=1;i<=n;++i) id[i]=i;
	for(ll i=1;i<=m;++i){
//		printf("%lld\n",i);
		char c;
		ll x,y;
		c=gc(),x=read(),y=read();
		if(c=='C') unite(x,y,i);
////		cout<<"C:"<<x<<" "<<y<<"\n";
		if(c=='Q'){
			if(find(x)==find(y))puts("Yes");
			else puts("No");
			cout<<x<<":"<<find(x)<<" "<<y<<":"<<find(y)<<"\n";
		}
		if(c=='D') del(x,y);
	}
	return 0;
}
2022/6/17 09:02
加载中...