제출 #547271

#제출 시각아이디문제언어결과실행 시간메모리
547271pure_memSafety (NOI18_safety)C++14
100 / 100
765 ms23884 KiB
#pragma GCC optimize("Ofast")

#include <bits/stdc++.h>

#define ll long long
#define ld long double
#define X first
#define Y second
#define MP make_pair

using namespace std;

const int N = 2e5 + 2;
const int INF = 1e9;

int n;
ll h;
ll res, lhs_d, rhs_d;
multiset< ll > lhs_s, rhs_s;

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

	cin >> n >> h;
	
	for(int i = 1;i <= n;i++) {
		ll x;
		cin >> x;
		if(i == 1) {
			lhs_s.insert(x);
			rhs_s.insert(x);
			lhs_d -= h, rhs_d += h;
		}	
		else {
			ll lv = *lhs_s.rbegin() + lhs_d;
		    res += abs(x - lv);
			
			if(*rhs_s.begin() + rhs_d > x) {
				lhs_s.insert(x - lhs_d);
				lhs_s.insert(x - lhs_d);
				
				ll hi = *lhs_s.rbegin() + lhs_d;
				lhs_s.erase(--lhs_s.end());	
				rhs_s.insert(hi - rhs_d);
			}
			else {
				rhs_s.insert(x - rhs_d);
				rhs_s.insert(x - rhs_d);

				ll lo = *rhs_s.begin() + rhs_d;	
				rhs_s.erase(rhs_s.begin());
				lhs_s.insert(lo - lhs_d);
			}

			
			ll lv_n = *lhs_s.rbegin() + lhs_d, rv_n = *rhs_s.begin() + rhs_d;
			if(rv_n < lv) {
				res -= lv - rv_n;
			}
			else if(lv < lv_n){
				res -= lv_n - lv;
			}

			lhs_d -= h, rhs_d += h;
		}
		cerr << res << "\n";
	}

	cout << res;
}
#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...