可否再开下题解通道
查看原帖
可否再开下题解通道
530180
KingPowers楼主2023/2/7 21:21

蒟蒻闲的没事找了场 ABC vp 了一下,找到了这场,并过掉了这个 F。

然后想过来发篇题解,发现题解里全都是并查集的做法,而我的做法比较特别,受梦幻布丁那道题的影响,我直接暴力开了 10610^6 个 vector 维护每个箱子,然后用了个启发式合并的思想,过掉了这题,如下:

//bel[i]第i个球所在集合  f[i]第i个vector实际对应箱子  id[i] 对应第i个箱子的是哪个vector 
int n,q,id_ball,bel[N],f[N],id[N]; 
vector<int>s[N];  //维护集合 

void Main(){
	read(n,q);id_ball=n;
	For(i,1,n) s[i].pb(i),f[i]=id[i]=bel[i]=i;
	while(q--){
		int typ=read(),x,y;
		if(typ==1){
			read(x,y);
			x=id[x],y=id[y];
			if(s[x].size()<s[y].size()){  //启发式合并,保证复杂度
				id[f[x]]=y;id[f[y]]=x;
				swap(f[x],f[y]);swap(x,y);
			}
			while(s[y].size()){
				int t=s[y].back();
				s[x].pb(t);s[y].pop_back();
				bel[t]=x;
			}
		}
		else if(typ==2){
			read(x);++id_ball;
			bel[id_ball]=id[x];
			s[id[x]].pb(id_ball);
		}
		else if(typ==3){
			read(x);
			printf("%lld\n",f[bel[x]]);
		}
	}
}

可否再次开放下题解通道,多一个参考

2023/2/7 21:21
加载中...