分块+并查集WA on#8求调
查看原帖
分块+并查集WA on#8求调
477821
toolong114514楼主2024/6/16 18:42
#include<iostream>
#include<cmath>
using namespace std;
const int N=2e5+10;
struct node{
	int l,r,fa[600];
}bl[500];
int find(int x,int num){
	if(bl[num].fa[x]==x) return x;
	else return bl[num].fa[x]=find(bl[num].fa[x],num); 
}
void connect(int x,int y,int num){
	bl[num].fa[find(x,num)]=find(y,num);
}
int len,cnt;
int n,q;
int a[N],blo[N];
void build(){
	len=sqrt(n);
	for(int i=1;i<=n;i+=len){
		cnt++;
		bl[cnt].l=i;
		bl[cnt].r=min(i+len-1,n);
		for(int j=bl[cnt].l;j<=bl[cnt].r;j++){
			blo[j]=cnt;
		}
		for(int j=1;j<=bl[cnt].r-bl[cnt].l+101;j++){
			bl[cnt].fa[j]=j;
		}
		for(int j=1;j<=bl[cnt].r-bl[cnt].l+1;j++){
			connect(j,a[j+bl[cnt].l-1]+bl[cnt].r-bl[cnt].l+1,cnt);
		}
	}
}
int tmp[505];
void upd(int x,int y,int v1,int v2){
	int ql=blo[x],qr=blo[y];
	if(x==y){
		for(int i=1;i<=bl[ql].r-bl[ql].l+1;i++){
			tmp[i]=find(i,ql);
		}
		for(int i=x-bl[ql].l+1;i<=y-bl[ql].l+1;i++){
			if(tmp[i]==v1+bl[ql].r-bl[ql].l+1) tmp[i]=v2+bl[ql].r-bl[ql].l+1;
		}
		for(int i=1;i<=bl[ql].r-bl[ql].l+101;i++){
			bl[ql].fa[i]=i;
		}
		for(int i=1;i<=bl[ql].r-bl[ql].l+1;i++){
			connect(i,tmp[i],ql);
		}
		return;
	}
	for(int i=ql+1;i<qr;i++){
		if(v1+bl[i].r-bl[i].l+1!=find(v1+bl[i].r-bl[i].l+1,i)) continue;
		if(v2+bl[i].r-bl[i].l+1==find(v2+bl[i].r-bl[i].l+1,i)){
			connect(v1+bl[i].r-bl[i].l+1,v2+bl[i].r-bl[i].l+1,i);
		}else{
			bl[i].fa[v1+bl[i].r-bl[i].l+1]=v2+bl[i].r-bl[i].l+1;
			bl[i].fa[v2+bl[i].r-bl[i].l+1]=v2+bl[i].r-bl[i].l+1;
		}
	}
	for(int i=1;i<=bl[ql].r-bl[ql].l+1;i++){
		tmp[i]=find(i,ql);
	}
	for(int i=x-bl[ql].l+1;i<=bl[ql].r-bl[ql].l+1;i++){
		if(tmp[i]==v1+bl[ql].r-bl[ql].l+1) tmp[i]=v2+bl[ql].r-bl[ql].l+1;
	}
	for(int i=1;i<=bl[ql].r-bl[ql].l+101;i++){
		bl[ql].fa[i]=i;
	}
	for(int i=1;i<=bl[ql].r-bl[ql].l+1;i++){
		connect(i,tmp[i],ql);
	}
 
	for(int i=1;i<=bl[qr].r-bl[qr].l+1;i++){
		tmp[i]=find(i,qr);
	}
	for(int i=1;i<=y-bl[qr].l+1;i++){
		if(tmp[i]==v1+bl[qr].r-bl[qr].l+1) tmp[i]=v2+bl[qr].r-bl[qr].l+1;
	}
	for(int i=1;i<=bl[qr].r-bl[qr].l+101;i++){
		bl[qr].fa[i]=i;
	}
	for(int i=1;i<=bl[qr].r-bl[qr].l+1;i++){
		connect(i,tmp[i],qr);
	}	
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build();
	cin>>q;
	while(q--){
		int ll,rr,xx,yy;
		cin>>ll>>rr>>xx>>yy;
		upd(ll,rr,xx,yy);
	}
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=bl[i].r-bl[i].l+1;j++){
			cout<<find(j,i)-(bl[i].r-bl[i].l+1)<<" ";
		}
	}
	return 0;
}
2024/6/16 18:42
加载中...