제출 #164920

#제출 시각아이디문제언어결과실행 시간메모리
164920gs18103Safety (NOI18_safety)C++14
100 / 100
133 ms45060 KiB
#include <bits/stdc++.h>
#define eb emplace_back
#define em emplace
#define all(v) v.begin(), v.end()
#define fi first
#define se second

using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

const int MAX = 303030;
const int INF = 1 << 30;
const ll LINF = 1LL << 60;

struct Node {
    priority_queue <ll> L;
    priority_queue <ll, vector <ll>, greater <ll> > R;
    ll ans = 0, s = 0;
    
    void init(int x) {L.em(x), R.em(x);}
    int size() {return (int)(L.size() + R.size());}
    void merge(Node &X) {
        ans += X.ans;
        while(!X.L.empty()) {
            ll temp = X.L.top() - X.s;
            X.L.pop();
            if(temp >= R.top() + s){
                ans += temp - R.top() - s;
                L.em(R.top() + 2 * s); R.pop();
                R.em(temp - s);
            }
            else L.em(temp + s);
        }
        while(!X.R.empty()) {
            ll temp = X.R.top() + X.s;
            X.R.pop();
            if(temp <= L.top() - s){
                ans += L.top() - temp - s;
                R.em(L.top() - 2 * s); L.pop();
                L.em(temp + s);
            }
            else R.em(temp - s);
        }
    }
} dp[MAX];

int p[MAX], idx[MAX];
ll l[MAX];

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

    int n;
    ll h;
    cin >> n >> h;
    for(int i = 1; i <= n; i++) {
        cin >> l[i];
        dp[i].init(l[i]);
        idx[i] = i;
    }
    for(int i = 2; i <= n; i++) {
        p[i] = i - 1;
    }

    for(int i = n; i > 1; i--) {
        dp[idx[i]].s += h;
        if(dp[idx[i]].size() < dp[idx[p[i]]].size()) {
            dp[idx[p[i]]].merge(dp[idx[i]]);
        }
        else {
            dp[idx[i]].merge(dp[idx[p[i]]]);
            idx[p[i]] = idx[i];
        }
    }
    cout << dp[idx[1]].ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...