[ABC445] ABC 445(Atcoder Beginner Contest)のA~C(A,B,C)問題をPythonで解説(復習)
A問題
- 添字で
0-1にアクセスする.
A.py
"""
<方針>
- 添字で `0` `-1` にアクセスする.
"""
# 入力
S = input()
# 条件分岐
if(S[0] == S[-1]):
# 出力
print("Yes")
else:
print("No")
B問題
-
mを取得する. - 足りない部分は前後に
.で補う.
B.py
"""
<方針>
- `m` を取得する.
- 足りない部分は前後に `.` で補う.
"""
# 入力
N = int(input())
SS = [input() for _ in range(N)]
# mを取得
m = max(map(len, SS))
# 出力ループ
for S in SS:
# 左右に詰めるもの
padding = "."*((m - len(S))//2)
# 出力
print(padding + S + padding)
C問題
方針
- トポロジーソートをしよう.
- 移動と逆方向に有向辺を作る.
- スタート
stと同じ値を記入してけば良い.
前提
-
C問題あたりで,TLEになる人は,制約条件を見る癖をつけよう. -
AとB問題では,基本的に制約条件を見ずにやっても解ける. - しかし,
C問題以降では,制約条件を見ないと必ずTLEすると思っても良い. - 詳しい話は私の352回の記事 の
C問題の解説に記したので,是非参照してほしい.
C.py
"""
<方針>
- トポロジーソートをしよう.
- 移動と逆方向に有向辺を作る.
- スタート `st` と同じ値を記入してけば良い.
"""
# 入力
N = int(input())
A = [0] + list(map(int, input().split()))
# トポロジーソート
cnt = [0]*(N+1) # 入力エッジ数
E = [[] for _ in range(N+1)]
for i, a in enumerate(A):
if(i == a):
continue
E[a].append(i)
cnt[i] += 1
# 答え
ans = [-1]*(N+1)
# 塗る
for st, c in enumerate(cnt):
if(c != 0):
continue
q = [st]
while q:
u = q.pop()
ans[u] = st
for v in E[u]:
q.append(v)
# 出力
print(*ans[1:])
補足
関係するリンク(参考文献など)
筆者について
- Atcoderアカウント
- 今回も不参加のため,成績なし.
- 解説で示したA問題の提出
- 解説で示したB問題の提出
- 解説で示したC問題の提出
その他
- 間違いを含んでいる可能性があります.
- 方針と言いつつ,方針ではない感想などを書いている可能性があります.
- A問題から解説がだんだん省略されます.
- コードに書かれている解説の文言と,その上に書いてある解説の文言を変えている場合があります.
最後に一言
- タスク溜まり侍