Submission #1359161

#TimeUsernameProblemLanguageResultExecution timeMemory
1359161yusuf12360Potatoes and fertilizers (LMIO19_bulves)C++20
100 / 100
120 ms11556 KiB
#include<bits/stdc++.h>
#define int long long
#define ld long double
#define pii pair<int, int>
#define vi vector<int>
#define vvi vector<vi> 
#define pb push_back
#define fi first
#define se second
#define TII tuple<int, int, int>
#define MT make_tuple
#define mp make_pair
#define ts to_string
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define MIN(x) *min_element(all(x))
#define MAX(x) *max_element(all(x))
#define lb lower_bound
#define ub upper_bound
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;
const int INF = 1e15, ADD = 3e4 + 1, MX = 6e4 + 5, N = 3'005;
int dp[2][MX];
void cmin(int &a, int b) { a = min(a, b); }
void outin_1(priority_queue<int> pq, int add) {
    cout << " -> ";
    while(!pq.empty()) cout << pq.top() + add << ' ', pq.pop();
    cout << endl;
}
void outin_2(priority_queue<int, vi, greater<int>> pq, int add) {
    cout << " -> ";
    while(!pq.empty()) cout << pq.top() + add << ' ', pq.pop();
    cout << endl;
}
int32_t main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n; cin >> n;
    priority_queue<int> lef;
    priority_queue<int, vi, greater<int>> rig;
    int ladd = 0, radd = 0, ans = 0;
    int l_zero = 0, r_zero = 0;
    for(int k = 0; k < 1; k++) lef.push(0), rig.push(0);

    // real_val = in_val + lazy
    // in_val = real_val - lazy
    for(int i = 1; i <= n; i++) {
        if(!lef.empty() && 0 < lef.top() + ladd) {
            ans += lef.top() + ladd;
            lef.push(-ladd); lef.push(-ladd);
            int real_val = lef.top() + ladd; 
            if(real_val != l_zero) lef.pop();
            rig.push(real_val - radd);
        } else if(!rig.empty() && rig.top() + radd < 0) {
            ans += -(rig.top() + radd);
            rig.push(-radd); rig.push(-radd);
            int real_val = rig.top() + radd; 
            if(real_val != r_zero) rig.pop();
            lef.push(real_val - ladd);
        } else lef.push(-ladd), rig.push(-radd);

        int a, b; cin >> a >> b;
        int k = abs(a - b);
        if(a < b) ladd -= k, radd -= k, l_zero -= k, r_zero -= k;
        else radd += k, r_zero += k;

        // cout << "_______" << ans << endl;
        // outin_1(lef, ladd);
        // outin_2(rig, radd);
    }
        
    int cnt = 0;
    while(rig.top() + radd < 0) {
        int real_val = rig.top() + radd;
        while(rig.top() + radd == real_val) cnt++, rig.pop();
        int cur_val = min(rig.top() + radd, 0ll);
        ans += (cur_val - real_val) * cnt;
    }
    cout << ans << '\n';
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...