您的位置:首页 > 其它

[并查集]51 Nod 1525——重组公司

2017-10-18 19:13 429 查看

题目梗概

普通的并查集问题?

多了一种区间合并的操作。

解题思路

还是很水。

维护每个点前面最近的没合并的节点是谁就可以了。

#include<cstdio>
using namespace std;
char nc(){
static char buf[100000],*l=buf,*r=buf;
if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
if (l==r) return EOF;return *l++;
}
inline int _read(){
int num=0;char ch=nc();
while(ch<'0'||ch>'9') ch=nc();
while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=nc();
return  num;
}
const int maxn=200005;
int n,m;
int f[maxn],lst[maxn];
inline int get(int x){
if (f[x]==x) return x;
f[x]=get(f[x]);
return f[x];
}
inline int get1(int x){
if (lst[x]==x) return x;
lst[x]=get1(lst[x]);
return lst[x];
}
int main(){
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
n=_read();m=_read();
for (int i=1;i<=n;i++) f[i]=i,lst[i]=i;
for (int i=1;i<=m;i++){
int d=_read(),x=_read(),y=_read();
if (d==1) f[get(x)]=get(y);
if (d==2) for (int j=get1(y);j>x;j=get1(j)) lst[j]=get1(j-1),f[get(j-1)]=get(j);
if (d==3) if (get(x)==get(y)) putchar('Y'),putchar('E'),putchar('S'),putchar('\n');else putchar('N'),putchar('O'),putchar('\n');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: