1. 程式人生 > >Codeforces 1131F Asya And Kittens 【並查集】

Codeforces 1131F Asya And Kittens 【並查集】

依次 bsp blank 開始 tar %d n) div get

<題目鏈接>

題目大意:
有$1~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

Codeforces 1131F Asya And Kittens 【並查集】