AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

ABC160 D - Line++

問題原文

atcoder.jp

問題要旨

 N 頂点の直線状のグラフがあり、 辺  i は頂点  i と 頂点  i  + 1 をつないでいる。
またバイパスが張られていて、 頂点  X と頂点  Y をつないでいる。
 k = 1, 2, ... N - 1 について 最短距離が  k となるような  (i, j) (i < j) の通り数を求めよ。

  •   1 \leq N \leq 2000

解法

 (i, j) の組み合わせを全探索することを考える。
各最短距離は min(真っ直ぐ進む場合, バイパスを経由する場合)になる。

実装

N, X, Y = map(int, input().split())
ans = [0] * N

for fr in range(1, N + 1):
    for to in range(fr + 1, N + 1):
        cost = min(to - fr, abs(X - fr) + abs(to - Y) + 1)
        ans[cost] += 1

print(*ans[1:], sep="\n")

感想

特殊な条件を使う or 使わない とすると見通しがよくなるパターンと名付けることにします。
下手に小さな部分に着目するとハマりそう。