Submission #318615

#TimeUsernameProblemLanguageResultExecution timeMemory
318615MetBSafety (NOI18_safety)C++14
16 / 100
479 ms262148 KiB
#include <bits/stdc++.h>
 
#define N 2000001
 
using namespace std;
 
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
 
const ll INF = 1e18, MOD = 998244353, MOD2 = 1e6 + 3;

ll d[500][500*600], a[500], n, h;
vector <ll> srt;

struct window : deque < pair <ll, ll> > {
	void append (ll x, ll v) {
		while (!empty () && back ().second > v) pop_back ();
		emplace_back (x, v);
	}

	void erase (ll x) {
		if (front().first == x) pop_front ();
	}
};

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

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

		srt.push_back (a[i]);

		for (int j = 1; j <= n; j++) {
			srt.push_back (a[i] + j * h);
			srt.push_back (a[i] - j * h);
		}
	}

	sort (srt.begin(), srt.end());
	srt.erase (unique (srt.begin(), srt.end()), srt.end ());

	int sz = srt.size ();

	for (int i = 0; i < sz; i++) {
		d[0][i] = abs (srt[i] - a[0]);
		//cout << d[0][i] << ' ' << srt[i] << endl;
	}

	for (int i = 1; i < n; i++) {
		int l = 0, r = 0;
		window wd;
		for (int j = 0; j < sz; j++) {
			while (r < sz && srt[r] <= srt[j] + h) { wd.append (r, d[i-1][r]); r++; };
			while (l < r && srt[l] < srt[j] - h) { wd.erase (l); l++; };
			d[i][j] = abs (srt[j] - a[i]) + wd.front ().second;
			//cout << i << ' ' << srt[j] << ' ' << srt[l] << ' ' << srt[r-1] << ' ' << *ms.begin () << endl; 
		}
	}

	cout << *min_element (d[n-1], d[n-1] + sz);
}
#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...