码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj4668: 冷战 并查集

时间:2016-08-26 01:10:59      阅读:348      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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

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

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

#include<cstdio>
#define N 500005
int 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: 冷战 并查集

标签:

原文地址:http://www.cnblogs.com/f321dd/p/5808806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!