B - 駅から駅へ / From Station to Station Editorial by admin
Qwen3-Coder-480B概要
各駅から次の駅が決まっている路線上で、駅 \(1\) から駅 \(N\) に到達するまでに訪れる駅の数を求めます。
考察
この問題は、駅から駅への移動が一意に定まっているので、単純にシミュレーションすれば解けそうです。つまり、駅 \(1\) から出発して、指示に従って次の駅に移動し、駅 \(N\) にたどり着くまで何ステップかかったかを数えるだけです。
しかし、もしループがある場合や非常に長い経路がある場合、ナイーブな実装でも間に合うか不安になるかもしれません。しかし制約には「駅 \(1\) から駅 \(N\) に到達可能」とあるので、途中で無限ループすることはなく、また \(N\) は最大 \(2 \times 10^5\) なので、全駅を一回ずつ通るとしても十分間に合います。
したがって、愚直にシミュレーションを行うのが適切です。各駅から次の駅への遷移を配列に持っておき、現在地を更新しながらカウントを増やすことで答えを得られます。
例えば、入力が以下のような場合:
N = 5
P = [2, 3, 4, 5]
これは、駅1→2→3→4→5と一直線に進むだけなので、訪れる駅の数は5個です。
もう一つ例を見てみましょう:
N = 4
P = [3, 3, 4]
これは、 - 駅1 → 駅3 - 駅2 → 駅3 - 駅3 → 駅4
となるので、駅1からスタートすると、 駅1 → 駅3 → 駅4 となり、訪れる駅の数は3個です。
このように、ただ一つ前の情報をもとに次の駅に進んでいけば良いので、ループや再帰など複雑な処理は必要ありません。
アルゴリズム
- 各駅 \(i\) からの次の駅 \(P_i\) の情報をリストとして保持します(ただし、0-indexedに変換して扱いやすくします)。
- 現在位置を駅 \(1\)(0-indexedでは
0)とし、訪れた駅の数を初期値 \(1\) としておきます。 - 現在位置が駅 \(N\)(0-indexedでは
N-1)になるまで、次の駅に移動し続け、その都度カウントを増やします。 - 最終的なカウントを出力します。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(N)\)
時間計算量は、最悪の場合すべての駅を通る可能性があるため、\(O(N)\) です。空間計算量も、次の駅の情報を持つ配列のサイズが \(N-1\) であり、定数倍を除けば \(O(N)\) となります。
実装のポイント
- 駅番号は1-indexedで与えられるので、内部処理では0-indexedに変換すると扱いやすくなります。
- 終了条件は現在位置が
N-1(0-indexedでの駅N)になったときです。 - 入力の受け取りを高速化するため、
sys.stdin.readを使用しています。
## ソースコード
```python
def main():
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
P = list(map(int, data[1:]))
# 駅番号は1-indexedなので、P[i-1] が 駅iから次の駅を示す
# next_station[i] = 駅i+1から次の駅 (0-indexed)
next_station = [p - 1 for p in P]
current = 0 # 駅1 (0-indexed)
count = 1 # 駅1を含む
while current != N - 1: # 駅Nに到達するまで (N-1は0-indexed)
current = next_station[current]
count += 1
print(count)
if __name__ == "__main__":
main()
この解説は qwen3-coder-480b によって生成されました。