Codeforces 1131F Asya And Kittens 【並查集】
阿新 • • 發佈:2019-02-25
依次 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) #definerep(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 【並查集】