Submission #1204263

#TimeUsernameProblemLanguageResultExecution timeMemory
1204263NK_Text editor (CEOI24_editor)C++20
5 / 100
1 ms580 KiB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'
#define pb push_back
#define sz(x) int(x.size())

#define f first
#define s second
#define mp make_pair

using ll = long long;
using pl = pair<ll, ll>;
template<class T> using V = vector<T>;
template<class T> using pq = priority_queue<T, vector<T>, greater<T>>;
using vi = V<int>;
using vl = V<ll>;
using vpl = V<pl>;



const ll INFL = 1e18;
int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int N; cin >> N;
	int r, c; cin >> r >> c; --r, --c;
	int R, C; cin >> R >> C; --R, --C;

	vl A(N); for(auto& x : A) cin >> x;


	vi nxt(N), prv(N);
	for(int t = 0; t < 2; t++) {
		vi stk = {-1};
		for(int i = 0; i < N; i++) {
			while(stk.back() != -1 && A[stk.back()] > A[i]) stk.pop_back();
			prv[i] = stk.back();
			stk.push_back(i);
		}

		prv.swap(nxt);
		reverse(begin(A), end(A));
	}

	reverse(begin(nxt), end(nxt));
	for(int i = 0; i < N; i++) nxt[i] = N - 1 - nxt[i];

	// for(int i = 0; i < N; i++) cout << prv[i] << " " << nxt[i] << endl;

	V<vl> dst(N, vl(2, INFL)); // distance to 0 - start of line, 1 - end of line

	{ 
		ll at = c;
		for(int i = r; i < N; i++) {
			dst[i][0] = min(dst[i][0], abs(r - i) + at);
			dst[i][1] = min(dst[i][1], abs(r - i) + A[i] - at);
			if (i + 1 < N) at = min(A[i + 1], at);
		}
	}

	{ 
		ll at = c;
		for(int i = r; i >= 0; i--) {
			dst[i][0] = min(dst[i][0], abs(r - i) + at);
			dst[i][1] = min(dst[i][1], abs(r - i) + A[i] - at);
			if (i - 1 >= 0) at = min(A[i - 1], at);
		}
	}

	pq<pl> q; for(int i = 0; i < N; i++) {  
		q.push(mp(dst[i][0], i));
		q.push(mp(dst[i][1], i + N));
	}

	V<vi> vis(N, vi(2));
	while(sz(q)) {
		auto [d, u] = q.top(); q.pop();

		int t = 0; if (u >= N) u -= N, t = 1;

		if (vis[u][t]) continue;
		vis[u][t] = 1;

		// cout << u << " " << t << " -> " << dst[u][t] << endl;


		if (t == 0) { // start of line
			if (u - 1 >= 0 && dst[u - 1][1] > dst[u][0] + 1) { // start to end of line (left)
				dst[u - 1][1] = dst[u][0] + 1;
				q.push(mp(dst[u - 1][1], u - 1 + N));
			}

			if (u - 1 >= 0 && dst[u - 1][0] > dst[u][0] + 1) { // start to start of line (up)
				dst[u - 1][0] = dst[u][0] + 1;
				q.push(mp(dst[u - 1][0], u - 1));
			}

			if (u + 1 < N && dst[u + 1][0] > dst[u][0] + 1) { // start to start of line (dwn)
				dst[u + 1][0] = dst[u][0] + 1;
				q.push(mp(dst[u + 1][0], u + 1));
			}

			if (dst[u][1] > dst[u][0] + A[u]) { // (right)
				dst[u][1] = dst[u][0] + A[u];
				q.push(mp(dst[u][1], u + N));
			}
		} else { // end of line
			if (u + 1 < N && dst[u + 1][0] > dst[u][1] + 1) { // end to start of line (right)
				dst[u + 1][0] = dst[u][1] + 1;
				q.push(mp(dst[u + 1][0], u + 1));
			}

			if (dst[u][0] > dst[u][1] + A[u]) { // (left)
				dst[u][0] = dst[u][1] + A[u];
				q.push(mp(dst[u][0], u));
			}

			if (u - 1 >= 0 && dst[u - 1][1] > dst[u][1] + abs(A[u] - A[u - 1])) { // (up)
				dst[u - 1][1] = dst[u][1] + abs(A[u] - A[u - 1]);
				q.push(mp(dst[u - 1][1], u - 1 + N));
			}

			if (u + 1 < N && dst[u + 1][1] > dst[u][1] + abs(A[u] - A[u + 1])) { // (dwn)
				dst[u + 1][1] = dst[u][1] + abs(A[u] - A[u + 1]); 
				q.push(mp(dst[u + 1][1], u + 1 + N));
			}

			if (prv[u] != -1 && dst[prv[u]][1] > dst[u][1] + abs(prv[u] - u)) { // (up)
				dst[prv[u]][1] = dst[u][1] + abs(prv[u] - u);
				q.push(mp(dst[prv[u]][1], prv[u] + N));
			}

			if (nxt[u] != N && dst[nxt[u]][1] > dst[u][1] + abs(nxt[u] - u)) { // (dwn)
				dst[nxt[u]][1] = dst[u][1] + abs(nxt[u] - u);
				q.push(mp(dst[nxt[u]][1], nxt[u] + N));
			}
		}
	}

	ll ans = INFL;
	
	ll at = c;
	for(int i = min(r, R); i <= max(r, R); i++) at = min(at, A[i]);
	ans = min(ans, abs(R - r) + abs(at - C));	

	// cout << ans << nl;
	
	{
		ll mn = A[R];
		for(int i = R; i >= 0; i--) {
			mn = min(A[i], mn);
			ans = min(ans, dst[i][1] + abs(i - R) + abs(mn - C));
			ans = min(ans, dst[i][0] + abs(i - R) + C);
			// cout << ans << nl;
		}
	}

	{
		ll mn = A[R];
		for(int i = R; i < N; i++) {
			mn = min(A[i], mn);
			ans = min(ans, dst[i][1] + abs(i - R) + abs(mn - C));
			ans = min(ans, dst[i][0] + abs(i - R) + C);
			// cout << ans << nl;
		}
	}

	cout << ans << nl;


	exit(0-0);
}

// Breathe In, Breathe Out
#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...