質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

517閲覧

AtCoder ABC289 B問題のUnion-Findを用いた実装で出る1WA

maimaimai

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/04/11 05:25

実現したいこと

atcoder beginner contest289のB問題"レ"を解いています。
https://atcoder.jp/contests/abc289/tasks/abc289_b

Python (3.8.2) においてUnion-Findを用いて実装しようとしたのですが、1つのテストケースでWAが出ています(サンプルは3つとも試しました)。

自分のソースコードのどこが誤っていてWAが出ているのかが理解できません。

間違いを教えてくださるとありがたいです。よろしくお願いいたします。

前提

テストケースは現時点では公開されていません。

発生している問題・エラーメッセージ

テストケースにおけるWA1つ

該当のソースコード

Python

1N,M=map(int,input().split()) 2if M>0: 3 A=list(map(int, input().split())) 4 5 6# Union-Find 木 7class UnionFind(): 8 def __init__(self,N): 9 self.par=[-1]*N 10 self.siz=[1]*N 11 self.max_node=[_ for _ in range(N)] 12 self.min_node=[_ for _ in range(N)] 13 def root(self,x): 14 if self.par[x]==-1: 15 return x 16 else: 17 self.par[x]=self.root(self.par[x]) 18 return self.par[x] 19 20 def issame(self,x,y): 21 return self.root(x)==self.root(y) 22 23 def unite(self,x,y): 24 rootx=self.root(x) 25 rooty=self.root(y) 26 if rootx != rooty: 27 if self.siz[rootx]>=self.siz[rooty]: 28 self.par[rooty]=rootx 29 self.siz[rootx]+=self.siz[rooty] 30 self.max_node[rootx]=max(self.max_node[rootx],self.max_node[rooty]) 31 self.min_node[rootx]=min(self.min_node[rootx],self.min_node[rooty]) 32 33 elif self.siz[rootx]<self.siz[rooty]: 34 self.par[rootx]=rooty 35 self.siz[rooty]+=self.siz[rootx] 36 self.max_node[rooty]=max(self.max_node[rootx],self.max_node[rooty]) 37 self.min_node[rooty]=min(self.min_node[rootx],self.min_node[rooty]) 38 39 40 def size(self,x): 41 return self.siz[self.root(x)] 42 43 def get_max_node(self,x): 44 return self.max_node[self.root(x)] 45 46 def get_min_node(self,x): 47 return self.min_node[self.root(x)] 48 49UF=UnionFind(N) 50for m in range(M): 51 UF.unite(A[m]-1,A[m]) 52list3=[] 53for n in range(N): 54 list3.append(UF.root(n)) 55list3.sort() 56set1=set(list3) 57 58max1=[] 59min1=[] 60for s in set1: 61 #print(s) 62 max1.append(UF.get_max_node(s)+1) 63 min1.append(UF.get_min_node(s)+1) 64#print(min1) 65list1=[] 66for s in range(len(set1)): 67 list2=[] 68 for x in range(min1[s],max1[s]+1): 69 list2.append(x) 70 for x in reversed(list2): 71 list1.append(x) 72print(*list1)

試したこと

サンプルケースで期待される出力が得られることを確認しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2023/04/11 08:11

N は高々 100 で M は高々 99 なので、乱数でテストケースを作れば(あるいは最小値や最大値でコーナーケースを作れば)引っかかるものは簡単にみつかりそうです。 WA になるかどうかは、AC になるソースを取ってくれば判定できます。
maimaimai

2023/04/15 11:16

ありがとうございます。テストケースを作って調べる方法を学習します。
guest

回答1

0

ベストアンサー

setには順序が無いので、list3.sort()してからset1=set(list3)のように作成しても、for s in set1:が小さい順に処理されるとは限りません。(公式のsetの説明を参照)

駄目な入力例を挙げておきます。

9 5 1 2 3 4 5

正しい出力

6 5 4 3 2 1 7 8 9

このコードの出力

6 5 4 3 2 1 9 7 8

投稿2023/04/11 11:13

actorbug

総合スコア2224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maimaimai

2023/04/15 11:15

ありがとうございます!この点を解消しましたらうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問