AtCoder Regular Contest 067: D - Walk and Teleport

,

http://arc067.contest.atcoder.jp/tasks/arc067_b

実装結果が短くて驚く。

solution

テレポートは東に$1$つ分しかしないとしてよい。$O(N)$。

西へ向かって歩くことがあるかと考えると、東へ大きくテレポートして戻ってくるとき。 そうした場合、西へ歩き終わった後再度東へ大きくテレポートする。 これは西へ向かって歩く部分の歩く向きを反転させてよく、常に東へ歩くようにできる。必然的にテレポートの距離は$1$。

implementation

#include <iostream>
#include <vector>
#define repeat(i,n) for (int i = 0; (i) < int(n); ++(i))
using ll = long long;
using namespace std;
int main() {
    int n, a, b; cin >> n >> a >> b;
    vector<int> x(n); repeat (i,n) cin >> x[i];
    ll acc = 0;
    repeat (i,n-1) acc += min<ll>(b, a *(ll) (x[i+1] - x[i]));
    cout << acc << endl;
    return 0;
}