首页 > 代码库 > bzoj4668: 冷战 并查集

bzoj4668: 冷战 并查集

并查集,按秩合并,树高log,暴力查询。

果然bzoj新挂的题中过的人多的全是sb题。

写了一发秒WA,发现姿势不对。(@_@)

然后过了50min,开始怀疑人生。(*_*)

这么长时间我lct都写完了。(Q_Q)

本着凡事要往好处想的精神,至少我改正了姿势。(T_T)

#include<cstdio>#define N 500005int n,m,q,k,s,t,l;int f[N],d[N],r[N],p[N];int find(int i){	if(p[i]==i)		return i;	int j=find(p[i]);	return d[i]	=d[p[i]]+1,j;}int join(int i,int j){	if((i=find(i))	==(j=find(j)))		return 0;	if(r[i]>r[j])		i^=j,j^=i,i^=j;	if(r[i]==r[j])		++r[j];	return p[i]=j,i;}int query(int i,int j){	int k=0;	if(find(i)==find(j))		while(i^j){			if(d[i]<d[j])				i^=j,j^=i,i^=j;			k<f[i]?			k=f[i]:0,i=p[i];		}	return k;}int main(){	scanf("%d%d",&n,&m);	for(int i=1;i<=n;++i)		p[i]=i;	for(;m;--m){		scanf("%d%d%d",&k,&s,&t);		s^=l,t^=l;		if(k)			printf("%d\n",			l=query(s,t));		else			f[join(s,t)]=++q;	}}

  

bzoj4668: 冷战 并查集