🙌
【python】100日後に緑コーダーになるためのABC209 C,D問題【2日目】
はじめに
100日後に緑コーダーになるためにAtcoder Beginner Contest225の解説を行います。
今回はC,D問題です。
使用言語はpythonです。
ACコードだけでなく出題者の意図や考察過程も記述しています。
気になるところや要望があればお気軽にコメントください。
それでは解説です。
対象読者
灰・茶コーダー
C - Calendar Validator
解法
カレンダーの中に入っているか判定
出題者の意図
カレンダーの問題を解けるか
特殊なケースが気付けるか
コード
N,M = map(int,input().split())
B = []
for i in range(N):
b = list(map(int,input().split()))
B.append(b)
if M == 1:
for i in range(N-1):
if B[i][0]+7 != B[i+1][0]:
print('No')
exit()
if N == 1:
for j in range(M-1):
if B[0][j]+1 != B[0][j+1]:
print('No')
exit()
if (B[0][j]-1)%7+1 != (B[0][j+1]-1)%7:
print('No')
exit()
for i in range(N-1):
if B[i][0]+7 != B[i+1][0]:
print('No')
exit()
for j in range(M-1):
if B[i][j]+1 != B[i][j+1]:
print('No')
exit()
if (B[i][j]-1)%7+1 != (B[i][j+1]-1)%7:
print('No')
exit()
print('Yes')
D - Play Train
解法
連結リストで管理して、深さ優先探索
出題者の意図
連結リストを管理できるか
簡単な深さ優先探索を実装できるか
考察
電車が連結するときは直列しかないので連結リストで管理しやすそうです。
連結リストの
0列目が前にいる電車、1列目が後ろにいる電車です。
繋がっていないときは-1にしておきましょう。
クエリ3で連結した電車は深さ優先探索を使います。
コード
N,Q = map(int,input().split())
train = [[-1,-1] for _ in range(N+1)]
for _ in range(Q):
query = list(map(int,input().split()))
if query[0] == 1:
x,y = query[1],query[2]
train[x][1], train[y][0] = y,x
elif query[0] == 2:
x,y = query[1],query[2]
train[x][1], train[y][0] = -1,-1
else:
x = query[1]
front = []
back = []
f = train[x][0]
b = train[x][1]
while f != -1:
front.append(f)
f = train[f][0]
while b != -1:
back.append(b)
b = train[b][1]
ans = front[::-1] + [x] + back
print(len(ans), *ans)
Discussion