[AtCoder] ABC 160 D – Line++
問題
方針
頂点 \( i \) と 頂点 \( j \) の最短距離を \( l(i, j) \ (i < j)\) とすると、頂点 \( X \) と 頂点 \( Y \) と経由して行く方法を考えると、
\[l(i, j) = \min(j – i , |X – i| + |Y – j| + 1)\]
となります。よって、全ての頂点間を調べることで解答できます。
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int N, X, Y; cin >> N >> X >> Y; ll cnt[N]{}; // i < j for (int i = 1; i <= N; i++) { for (int j = i + 1; j <= N; j++) { int i_j = j - i; int i_X_Y_j = abs(X - i) + 1 + abs(Y - j); cnt[min(i_j, i_X_Y_j)]++; } } for (int i = 1; i < N; i++) { cout << cnt[i] << "\n"; } return 0; }
ディスカッション
コメント一覧
まだ、コメントがありません