TopCoder SRM 719 Div1 Easy: LongMansionDiv1

,

問題文がこどふぉのように難しい。 どうでもいいストーリーを付けるな。 $x$-th rowと$y$-th columnなのをやめろ。

solution

あるrowを選んで$y$方向の移動はすべてそこで行うようにする。選ぶrowについて総当たり。$O(N)$。

implementation

#include <bits/stdc++.h>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
#define whole(x) begin(x), end(x)
typedef long long ll;
using namespace std;
template <class T> inline void setmin(T & a, T const & b) { a = min(a, b); }
class LongMansionDiv1 { public: long long minimalTime(vector<int> t, int sX, int sY, int eX, int eY); };

constexpr ll inf = ll(1e18)+9;
ll LongMansionDiv1::minimalTime(vector<int> t, int sX, int sY, int eX, int eY) {
    int w = t.size();
    vector<int> acc(w + 1);
    partial_sum(whole(t), acc.begin() + 1);
    ll result = inf;
    repeat (x, w) {
        ll it = 0;
        it += acc[max(x, sX) + 1] - acc[min(x, sX)];
        it += acc[max(x, eX) + 1] - acc[min(x, eX)];
        it += t[x] *(ll) (abs(eY - sY) - 1);
        setmin(result, it);
    }
    return result;
}