0
点赞
收藏
分享

微信扫一扫

Restructuring Company CodeForces - 566D


2操作为关键

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

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

 

#include <bits/stdc++.h>
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;
}

 


举报

相关推荐

0 条评论