Restructuring Company CodeForces - 566D

点击打开链接

2操作为关键

首先通过next[n]数组保存每个点之后(右)下一个要更新的点的下标

若该点的下标超出范围 则再无需操作

 

#include 
using namespace std;

int f[200010],next[200010];
int n;

int getf(int p)
{
	if(f[p]==p) return p;
	else
	{
		f[p]=getf(f[p]);
		return f[p];
	}
}

void unite(int x,int y)
{
	int fx,fy;
	fx=getf(x);
	fy=getf(y);
	if(fx!=fy)
	{
		f[fy]=fx;
	}
	return;
}

int main()
{
	int q,i,op,t,x,y,fx,fy;
	while(scanf("%d%d",&n,&q)!=EOF)
	{
		for(i=1;i<=n;i++)
		{
			f[i]=i;
			next[i]=i+1;
		}
		while(q--)
		{
			scanf("%d%d%d",&op,&x,&y);
			if(op==1)
			{
				unite(x,y);
			}
			else if(op==2)
			{
				unite(x,y);
				while(next[x]<=y)
				{
					unite(x,next[x]);
					t=next[x],next[x]=next[y],x=t;
				}
			}
			else
			{
				fx=getf(x);
				fy=getf(y);
				if(fx==fy) printf("YES\n");
				else printf("NO\n");
			}
		}
	}
	return 0;
} 

 

你可能感兴趣的:(并查集)