Submission #1043037

#TimeUsernameProblemLanguageResultExecution timeMemory
1043037Aldas25Safety (NOI18_safety)C++14
100 / 100
56 ms7168 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 2e5 + 100;

int n;
ll h;
priority_queue<ll> pqLeft;
priority_queue<ll, vector<ll>, greater<ll>> pqRight;
ll ans = 0;
ll a[MAXN];

int main() {
	cin >> n >> h;

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

	pqLeft.push(a[0]); pqRight.push(a[0]);

	for (int i = 1; i < n; i++) {
		ll range = ((ll)i) * h; // mimic shifting left side by -h, and right side by h

		// minimum area in graph is interval [pqLeft.top() - range; pqRight.top() + range]
		ll minFrom = pqLeft.top() - range;
		ll minTo = pqRight.top() + range;

		if (a[i] < minFrom) {
			pqLeft.push(a[i] + range);
			pqLeft.push(a[i] + range);
			ans += minFrom - a[i];
			
			pqRight.push(pqLeft.top() - 2*range);
			pqLeft.pop();
		} else if (a[i] > minTo) {
			pqRight.push(a[i] - range);
			pqRight.push(a[i] - range);
			ans += a[i] - minTo;

			pqLeft.push(pqRight.top() + 2*range);
			pqRight.pop();
		} else {
			pqLeft.push(a[i] + range);
			pqRight.push(a[i] - range);
		}
	}

	cout << ans << "\n";

	return 0;
}
#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...