Submission #1053602

#TimeUsernameProblemLanguageResultExecution timeMemory
1053602n1kText editor (CEOI24_editor)C++17
5 / 100
1 ms348 KiB
#include <bits/stdc++.h>

#if defined(LOCAL)
#include "debug.cpp"
#else
#define debug(x...) 0
#endif // LOCAL

using namespace std;

using ll = long long;

#define all(a) (a).begin(), (a).end()



struct Node{
	ll v = 1e15;
	Node(){};
	Node(ll _v){
		v=_v;
	}
};

void __print(Node n){
	cerr<<n.v;
}

void solve(){
	int n, sr, sc, er, ec; cin >> n >> sr >> sc >> er >> ec;
	sr--, sc--, er--, ec--;
	vector<ll> l(n), smin(n, 1e15);
	for(int i=0; i<n; i++) cin >> l[i];
	smin[er]=l[er];
	debug(smin);
	for(int r=er-1; r>=0; r--){
		smin[r]=min(smin[r+1], l[r]);
	}
	for(int r=er+1; r<n; r++){
		smin[r]=min(smin[r-1], l[r]);
	}

	vector<array<ll, 2>> save(n, {ll(1e15), ll(1e15)});
	map<int, Node> row;

	row[sc]=0;

	ll add = 0, ans = 1e15;

	auto clean = [&](int c1){
		if(not row.count(c1)) return;
		while(next(row.find(c1))!=row.end()){
			auto [c2, cost] = *next(row.find(c1));
			if(row[c1].v + c2 - c1 < cost.v){
				row.erase(next(row.find(c1)));
			}else{
				break;
			}
		}
		while(row.find(c1)!=row.begin()){
			auto [c2, cost] = *prev(row.find(c1));
			if(row[c1].v + c1 - c2 < cost.v){
				row.erase(prev(row.find(c1)));
			}else{
				break;
			}
		}
	};
	debug(er, ec);
	auto simup = [&](int startr, int endr=0){
		// simulate up
		for(int r=startr; r>endr; r--){
			// answer
			auto it = row.lower_bound({ec});
			if(it!=row.end()){
				ans = min(ans, abs(r - er) + abs(min(smin[r], ll(it->first)) - ec) + it->second.v + add);
			}
			if(it!=row.begin()){
				it--;
				ans = min(ans, abs(r - er) + abs(min(smin[r], ll(it->first)) - ec) + it->second.v + add);
			}

			debug(r, row, add);
			save[r][0] = min(save[r][0], row[0].v + add);
			save[r][1] = min(save[r][1], row[l[r]].v + add);
			row[0] = min(row[0].v, save[r][0] - add);
			row[l[r]] = min(row[l[r]].v, save[r][1] - add);

			clean(0); clean(l[r]);

			ll bc, cost;
			Node node;
			// anfange
			tie(bc, node) = *row.begin();
			cost = node.v;
			row[0] = min(row[0].v, cost + bc);
			// ende
			tie(bc, node) = *--row.end();
			cost=node.v;
			row[l[r]] = min(row[l[r]].v, cost + l[r] - bc);

			// anfange nach oben 
			// alle direkt nach oben
			while(row.size() and (--row.end())->first > l[r-1]){
				tie(bc, node) = *--row.end();
				cost=node.v;
				row[l[r-1]] = min(row[l[r-1]].v, cost);
				row.erase(--row.end());
			}
			row[l[r-1]] = min(row[l[r-1]].v, row[0].v);
			clean(0);
			clean(l[r-1]);
			add++;
		}
	};
	auto simdown = [&](int startr){
		// simulate down
		for(int r=startr; r+1<n; r++){

			auto it = row.lower_bound({ec});
			if(r==1 and it->first==7){
				debug(smin[r]);
			}
			if(it!=row.end()){
				ans = min(ans, abs(r - er) + abs(min(smin[r], ll(it->first)) - ec) + it->second.v + add);
			}
			if(it!=row.begin()){
				it--;
				ans = min(ans, abs(r - er) + abs(min(smin[r], ll(it->first)) - ec) + it->second.v + add);
			}

			debug(r, row, add);
			save[r][0] = min(save[r][0], row[0].v + add);
			save[r][1] = min(save[r][1], row[l[r]].v + add);

			row[0] = min(row[0].v, save[r][0] - add);
			row[l[r]] = min(row[l[r]].v, save[r][1] - add);

			clean(0); clean(l[r]);

			ll bc, cost;
			Node node;
			// anfange
			tie(bc, node) = *row.begin();
			cost=node.v;
			row[0] = min(row[0].v, cost + bc);
			// ende
			tie(bc, node) = *--row.end();
			cost=node.v;
			row[l[r]] = min(row[l[r]].v, cost + l[r] - bc);

			// ende nach unten

			// alle direkt nach untern 
			while(row.size() and (--row.end())->first > l[r+1]){
				tie(bc, node) = *--row.end();
				cost=node.v;
				row[l[r+1]] = min(row[l[r+1]].v, cost);
				row.erase(--row.end());
			}
			row[0] = min(row[0].v, row[l[r]].v);
			clean(0);
			clean(l[r+1]);
			add++;
		}
	};

	simup(sr);
	simdown(0);
	simup(n-1);
	simdown(0);
	simup(n-1, er);

	for(auto [cc, cost]:row){
		ans=min(ans, cost.v+add + abs(ec - cc));
	}

	cout << ans << endl;
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int t=1; //cin >> t;
	while(t--) solve();
}

Compilation message (stderr)

Main.cpp: In function 'void solve()':
Main.cpp:6:21: warning: statement has no effect [-Wunused-value]
    6 | #define debug(x...) 0
      |                     ^
Main.cpp:35:2: note: in expansion of macro 'debug'
   35 |  debug(smin);
      |  ^~~~~
Main.cpp:6:21: warning: statement has no effect [-Wunused-value]
    6 | #define debug(x...) 0
      |                     ^
Main.cpp:69:2: note: in expansion of macro 'debug'
   69 |  debug(er, ec);
      |  ^~~~~
Main.cpp: In lambda function:
Main.cpp:6:21: warning: statement has no effect [-Wunused-value]
    6 | #define debug(x...) 0
      |                     ^
Main.cpp:83:4: note: in expansion of macro 'debug'
   83 |    debug(r, row, add);
      |    ^~~~~
Main.cpp: In lambda function:
Main.cpp:6:21: warning: statement has no effect [-Wunused-value]
    6 | #define debug(x...) 0
      |                     ^
Main.cpp:122:5: note: in expansion of macro 'debug'
  122 |     debug(smin[r]);
      |     ^~~~~
Main.cpp:6:21: warning: statement has no effect [-Wunused-value]
    6 | #define debug(x...) 0
      |                     ^
Main.cpp:132:4: note: in expansion of macro 'debug'
  132 |    debug(r, row, add);
      |    ^~~~~
#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...