Codeforces 1131F Asya And Kittens (构造)【并查集】

<题目链接>

题目大意:
有$n$只小猫,开始将它们放在指定的n个单元格内,然后随机从n-1个隔板中拆除隔板,最终使得这些小猫在同一单元格。现在依次给出拆除隔板的顺序,比如:1 4 就表示1号和4号小猫之间的隔板会被拆除(注:只能拆除相邻区域小猫之间的隔板)。

解题分析:
利用并查集处理,$nxt[i]$ 表示 $i$ 之后的小猫序号, $mxri[i]$表示以第$i$个小猫已确定区域的最右端(方便其它小猫接入)。

#include <bits/stdc++.h>
using namespace std;

#define N int(2e5+7)
#define rep(i,s,t) for(int i=s;i<=t;i++)
int n;
int nxt[N],fa[N],mxri[N];
int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); }
int main(){
    scanf("%d",&n);
    rep(i,1,n)fa[i]=i,mxri[i]=i;
    rep(i,1,n-1){
        int x,y;scanf("%d%d",&x,&y);
        x=find(x),y=find(y);
        nxt[mxri[x]]=y;   //将y接在x最右边的元素右边
        mxri[x]=mxri[y];    //将y所连着的元素一块接上
        fa[y]=x;
    }
    for(int i=find(1);i;i=nxt[i])printf("%d ",i);
}

2019-02-24

原文地址:https://www.cnblogs.com/00isok/p/10427936.html