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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值