답안 #389137

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
389137 2021-04-13T17:32:30 Z solaimanope Potatoes and fertilizers (LMIO19_bulves) C++17
100 / 100
372 ms 23320 KB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;


/**
 * @brief Slope-Trick
 * @see https://maspypy.com/slope-trick-1-%E8%A7%A3%E8%AA%AC%E7%B7%A8
 */
template< typename T >
struct SlopeTrick {

    const T INF = numeric_limits< T >::max() / 3;

    T min_f;
    priority_queue< T, vector< T >, less<> > L;
    priority_queue< T, vector< T >, greater<> > R;
    T add_l, add_r;


private:
    void push_R(const T &a) {
        R.push(a - add_r);
    }

    T top_R() const {
        return R.top() + add_r;
    }

    T pop_R() {
        T val = top_R();
        R.pop();
        return val;
    }

    void push_L(const T &a) {
        L.push(a - add_l);
    }

    T top_L() const {
        return L.top() + add_l;
    }

    T pop_L() {
        T val = top_L();
        L.pop();
        return val;
    }

public:
    SlopeTrick() : min_f(0), add_l(0), add_r(0) {
        L.push(-INF);
        R.push(INF);
    }

    struct Query {
        T lx, rx, min_f;
    };

    // return min f(x)
    Query query() const {
        return (Query) {top_L(), top_R(), min_f};
    }

    // f(x) += a
    void add_all(const T &a) {
        min_f += a;
    }

    // add \_
    // f(x) += max(a - x, 0)
    void add_a_minus_x(const T &a) {
        min_f += max(T(0), a - top_R());
        push_R(a);
        push_L(pop_R());
    }

    // add _/
    // f(x) += max(x - a, 0)
    void add_x_minus_a(const T &a) {
        min_f += max(T(0), top_L() - a);
        push_L(a);
        push_R(pop_L());
    }

    // add \/
    // f(x) += abs(x - a)
//    void add_abs(const T &a) {
//        add_a_minus_x(a);
//        add_x_minus_a(a);
//    }

    void add_abs(const T &a) {
        if (a < top_L()) {
            min_f += top_L() - a;
            push_L(a);
            push_L(a);
            push_R(pop_L());
        } else if (top_R() < a) {
            min_f += a - top_R();
            push_R(a);
            push_R(a);
            push_L(pop_R());
        } else {
            push_L(a);
            push_R(a);
        }
    }

    // \/ -> \_
    // f_{new} (x) = min f(y) (y <= x)
    void clear_right() {
        while(R.size() >= 2) R.pop();
    }

    // \/ -> _/
    // f_{new} (x) = min f(y) (y >= x)
    void clear_left() {
        while(L.size() >= 2) L.pop();
    }

    // \/. -> .\/
    // f_{new} (x) = f(x - a)
    void shift(const T &a) {
        add_l += a;
        add_r += a;
    }

    T get(const T &x) {
        T ret = min_f;

        if (!L.empty() && x < top_L()) {
            while(!L.empty()) {
                ret += max(T(0), pop_L() - x);
            }
        }
        if (!R.empty() && top_R() < x) {
            while(!R.empty()) {
                ret += max(T(0), x - pop_R());
            }
        }
        return ret;
    }

};

const int MAXN = 5e5+7;
int a[MAXN], b[MAXN];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i] >> b[i];

    SlopeTrick<LL> trick;
    for (int i = 0; i < n; i++) trick.add_abs(0);

    for (int i = 1; i <= n; i++) {
        trick.shift(-(b[i]-a[i]));
        trick.clear_left();
        trick.add_abs(0);
    }

    cout << trick.get(0) << "\n";

    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 460 KB Output is correct
3 Correct 2 ms 472 KB Output is correct
4 Correct 28 ms 2624 KB Output is correct
5 Correct 56 ms 4768 KB Output is correct
6 Correct 163 ms 11920 KB Output is correct
7 Correct 371 ms 23308 KB Output is correct
8 Correct 251 ms 21400 KB Output is correct
9 Correct 329 ms 20744 KB Output is correct
10 Correct 224 ms 18456 KB Output is correct
11 Correct 227 ms 18588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 460 KB Output is correct
3 Correct 2 ms 472 KB Output is correct
4 Correct 28 ms 2624 KB Output is correct
5 Correct 56 ms 4768 KB Output is correct
6 Correct 163 ms 11920 KB Output is correct
7 Correct 371 ms 23308 KB Output is correct
8 Correct 251 ms 21400 KB Output is correct
9 Correct 329 ms 20744 KB Output is correct
10 Correct 224 ms 18456 KB Output is correct
11 Correct 227 ms 18588 KB Output is correct
12 Correct 101 ms 6196 KB Output is correct
13 Correct 194 ms 17392 KB Output is correct
14 Correct 348 ms 23316 KB Output is correct
15 Correct 247 ms 21364 KB Output is correct
16 Correct 338 ms 20760 KB Output is correct
17 Correct 151 ms 18460 KB Output is correct
18 Correct 1 ms 460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 460 KB Output is correct
3 Correct 1 ms 460 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 2 ms 460 KB Output is correct
8 Correct 2 ms 460 KB Output is correct
9 Correct 1 ms 460 KB Output is correct
10 Correct 2 ms 460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 460 KB Output is correct
3 Correct 2 ms 472 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 2 ms 460 KB Output is correct
8 Correct 2 ms 460 KB Output is correct
9 Correct 1 ms 460 KB Output is correct
10 Correct 2 ms 460 KB Output is correct
11 Correct 1 ms 460 KB Output is correct
12 Correct 2 ms 460 KB Output is correct
13 Correct 3 ms 460 KB Output is correct
14 Correct 2 ms 500 KB Output is correct
15 Correct 2 ms 460 KB Output is correct
16 Correct 2 ms 516 KB Output is correct
17 Correct 1 ms 460 KB Output is correct
18 Correct 2 ms 460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 460 KB Output is correct
3 Correct 2 ms 472 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 2 ms 460 KB Output is correct
8 Correct 2 ms 460 KB Output is correct
9 Correct 1 ms 460 KB Output is correct
10 Correct 2 ms 460 KB Output is correct
11 Correct 28 ms 2624 KB Output is correct
12 Correct 56 ms 4768 KB Output is correct
13 Correct 163 ms 11920 KB Output is correct
14 Correct 371 ms 23308 KB Output is correct
15 Correct 251 ms 21400 KB Output is correct
16 Correct 329 ms 20744 KB Output is correct
17 Correct 224 ms 18456 KB Output is correct
18 Correct 227 ms 18588 KB Output is correct
19 Correct 101 ms 6196 KB Output is correct
20 Correct 194 ms 17392 KB Output is correct
21 Correct 348 ms 23316 KB Output is correct
22 Correct 247 ms 21364 KB Output is correct
23 Correct 338 ms 20760 KB Output is correct
24 Correct 151 ms 18460 KB Output is correct
25 Correct 2 ms 460 KB Output is correct
26 Correct 3 ms 460 KB Output is correct
27 Correct 2 ms 500 KB Output is correct
28 Correct 2 ms 460 KB Output is correct
29 Correct 2 ms 516 KB Output is correct
30 Correct 1 ms 460 KB Output is correct
31 Correct 2 ms 460 KB Output is correct
32 Correct 1 ms 460 KB Output is correct
33 Correct 67 ms 6216 KB Output is correct
34 Correct 154 ms 17508 KB Output is correct
35 Correct 306 ms 23320 KB Output is correct
36 Correct 245 ms 20992 KB Output is correct
37 Correct 262 ms 21420 KB Output is correct
38 Correct 299 ms 23320 KB Output is correct
39 Correct 165 ms 19484 KB Output is correct
40 Correct 159 ms 18700 KB Output is correct
41 Correct 164 ms 18444 KB Output is correct
42 Correct 166 ms 18584 KB Output is correct
43 Correct 158 ms 18464 KB Output is correct
44 Correct 164 ms 18528 KB Output is correct
45 Correct 372 ms 23260 KB Output is correct
46 Correct 151 ms 18840 KB Output is correct
47 Correct 204 ms 17536 KB Output is correct