class UnionFind: """ 非再帰で実装 """ def __init__(self,n): """ n:ノード数 """ self.n=n self.pr=[-1]*n # self.pr[i]:ノードiがチームの親ならメンバー数*-1の値。そうでないなら、親ノード def union(self,x,y): """ xとyのチームを合体 """ x=self.find(x) y=self.find(y) if x==y:return # メンバー多い方が少ない方を取り込む.xを多い方にする if -self.pr[x]<-self.pr[y]: x,y=y,x # xがyを取り込む assert self.pr[x]<0 assert self.pr[y]<0 self.pr[x]+=self.pr[y] self.pr[y]=x assert self.pr[y]!=y assert self.pr[x]!=x def find(self,x): """ xの親を見つける """ y=x route=[] while self.pr[y]>=0:# 親を探す route.append(y) y=self.pr[y] assert y>=0 and self.pr[y]<0 while self.pr[x]>=0:# 親を付け替える assert y!=x x_=self.pr[x] self.pr[x]=y x=x_ return y def main1(n,a,b,x): # 駅i<->駅s~uまで双方向に移動可能のとき,駅s-uを1つの駅とみなす->UnionFind uf=UnionFind(n) idx_s=0 idx_e=0 idx_uf=0 # idx_ufは直前の駅と連結している for i in range(n):# 駅iから右方向を while idx_s