求助,玄关!!
查看原帖
求助,玄关!!
656765
STARSczy楼主2023/9/26 16:02
#include<bits/stdc++.h>
#define int long long
#define lb long double
using namespace std;
const int maxn=2e5+10,mod=1e9+7;
inline int read(){
	int c,w=0,n=0;
	while((c=getchar())<'0'||'9'<c) w=c=='-';
	do n=n*10+c-'0';while('0'<=(c=getchar())&&c<='9');
	return w?-n:n;
}
inline int write(int n){
	if(n<0) putchar('-'),n=-n;
	if(n>9) write(n/10);
	putchar(n%10+'0');
	return n;
}

struct node{
	int size,sum,data,vis;
	node *l,*r,*fa;
}*t[maxn];
node *newnode(int x){
	node *p=new node;
	p->size=1,p->data=p->sum=x,p->vis=rand(),p->l=p->r=p->fa=0;
	return p;
}
void pushup(node *p){
	p->size=1,p->sum=p->data;
	if(p->l) p->l->fa=p,p->sum+=p->l->sum,p->size+=p->l->size;
	if(p->r) p->r->fa=p,p->sum+=p->r->sum,p->size+=p->r->size;
}
node *merge(node *l,node *r){
	if(!l||!r) return l?l:r;
	if(l->vis<r->vis){
		l->r=merge(l->r,r);
		pushup(l);
		return l;
	}
	r->l=merge(l,r->l);
	pushup(r);
	return r;
}
node *getfa(node *p){
	pushup(p);
	if(p->fa) return getfa(p->fa);
	return p;
}
node *get(node *p){
	if(p->fa) return getfa(p->fa);
	return p;
}
int n,m;

signed main(){
	srand(time(0));
	while(scanf("%lld%lld",&n,&m)!=EOF){
		memset(t,0,sizeof(t));
		for(int i=1;i<=n;++i) t[i]=newnode(i);
		while(m--){
			switch(read()){
				case(1):{
					node *p=getfa(t[read()]),*q=getfa(t[read()]);
					if(p!=q) merge(p,q)->fa=0;
					break;
				}
				case(2):{
					node *p=t[read()],*q=t[read()];
					if(getfa(p)==getfa(q)) break;
					node *tmp=merge(p->l,p->r);
					if(tmp) tmp->fa=0;
					if(p->fa){
						if(p->fa->l==p) p->fa->l=0;
						else p->fa->r=0;
						merge(getfa(p->fa),tmp);
					}
					p->l=p->r=p->fa=0,merge(p,getfa(q))->fa=0;
					break;
				}
				case(3):{
					node *p=getfa(t[read()]);
					write(p->size),putchar(' '),write(p->sum),puts("");
					break;
				}
			}
		}
	}
	return 0;
}
2023/9/26 16:02
加载中...