제출 #1344676

#제출 시각아이디문제언어결과실행 시간메모리
1344676thelegendary08Text editor (CEOI24_editor)C++20
100 / 100
1760 ms243092 KiB
#include<bits/stdc++.h>
#define int long long
#define f0r(i,n) for(int i = 0; i < n; i++)
#define FOR(i,k,n) for(int i = k; i < n; i++)
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define F first
#define S second
#define vi vector<int>
#define pii pair<int,int>
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) cout<<#v<<": "; for(auto u : v)cout<<u<<' '; cout<<endl
using namespace std; 
struct segtree{
	int n; vector<pii> tree; 
	segtree(vi &a){
		n = a.size(); tree.resize(4*n+5); build(1,0,n-1,a);
	}
	void pull(int v){tree[v]=min(tree[v*2],tree[v*2+1]);}
	void build(int v, int tl, int tr, vi &a){
		if(tl==tr){tree[v] = mp(a[tl], tl); return;}
		int tm = tl + tr >> 1; build(v*2,tl,tm,a); build(v*2+1,tm+1,tr,a); pull(v);
	}
	pii quer(int v, int tl, int tr, int l, int r){
		if(tl > r || tr < l)return mp(4e18,4e18); if(tl >= l && tr <= r)return tree[v]; 
		int tm = tl + tr >> 1; return min(quer(v*2,tl,tm,l,r), quer(v*2+1,tm+1,tr,l,r));
	}
	int first_less(int v, int tl, int tr, int l, int r, int x){
		if(tl > r || tr < l)return -1; if(tree[v].F >= x)return -1; if(tl==tr)return tl; 
		int tm = tl + tr >> 1; int lef = first_less(v*2,tl,tm,l,r,x); if(lef!=-1)return lef; return first_less(v*2+1,tm+1,tr,l,r,x);
	}
	int last_less(int v, int tl, int tr, int l, int r, int x){
		if(tl > r || tr < l)return -1; if(tree[v].F >= x)return -1; if(tl==tr)return tl;
		int tm = tl + tr >> 1; int lef = last_less(v*2+1,tm+1,tr,l,r,x); if(lef!=-1)return lef; return last_less(v*2,tl,tm,l,r,x);
	}
};
const int mxn = 1e6 + 5; 
int n, d[mxn][2][2], sx, sy, ex, ey; 
signed main(){
	cin>>n>>sx>>sy>>ex>>ey; sx--,sy--,ex--,ey--; vi h(n); f0r(i,n)cin>>h[i]; segtree S = segtree(h); 
	vi dn(n), up(n); f0r(i,n)dn[i] = h[i] - 2*i, up[i] = h[i] + 2*i; segtree A = segtree(dn), B = segtree(up);
	f0r(i,n){
		d[i][0][1] = abs(sx - i) + h[i] - min(sy,S.quer(1,0,n-1,min(sx,i),max(sx,i)).F);
		d[i][1][0] = ey + abs(ex - i);
		int l = min(sx,i), r = max(sx,i); int ld = A.quer(1,0,n-1,0,l).S, rd = B.quer(1,0,n-1,r,n-1).S; 
		d[i][0][0] = min(l + r - 2 * ld + h[ld], 2 * rd - l - r + h[rd]); 
		d[i][0][0] = min(d[i][0][0], r - l + min(S.quer(1,0,n-1,l,r).F,sy)); 
		l = min(ex,i), r = max(ex,i); int ch = S.quer(1,0,n-1,l,r).F; 
		if(ch <= ey)d[i][1][1] = r - l + ey - ch; else{
			int mn = 4e18; 
			int lp = S.last_less(1,0,n-1,0,l-1,ey); if(lp != -1){
				mn = min(mn, l + r - 2 * lp + ey - h[lp]);
			}
			int ld = A.quer(1,0,n-1,lp+1,l).S; mn = min(mn, l + r - 2 * ld + h[ld] - ey);
			int rp = S.first_less(1,0,n-1,r+1,n-1,ey); if(rp != -1){
				mn = min(mn, 2 * rp - l - r + ey - h[rp]); 
			}
			int rd = B.quer(1,0,n-1,r,(rp == -1 ? n : rp) - 1).S; mn = min(mn, 2 * rd - l - r + h[rd] - ey);
			d[i][1][1] = mn; 
		}
	}
	// dout2(d[0][1][1], d[1][0][0]); dout2(sx,sy);
	// f0r(i,n)cout<<d[i][0][1]<<' '; cout<<'\n';
	int ans = 4e18; f0r(i,n-1){
		ans = min(ans, d[i][0][1] + d[i+1][1][0] + 1); ans = min(ans, d[i][1][1] + d[i+1][0][0] + 1); 
	} //dout(ans);
	int smin = 1e18; for(int i = n-1; i >= 0; i--){
		ans = min(ans, d[i][0][1] - i + smin + 2); smin = min(smin, d[i][1][1] + i); 
	}
	smin = 1e18; for(int i = n-1; i >= 0; i--){
		ans = min(ans, d[i][1][1] - i + smin + 2); smin = min(smin, d[i][0][1] + i); 
	}
	int ch = S.quer(1,0,n-1,min(sx,ex),max(sx,ex)).F; ch = min(ch, sy); ans = min(ans, abs(sx - ex) + abs(ey - ch)); if(ch > ey){
		int mn = ch, pt = 0; for(int i = max(sx, ex) + 1; i < n; i++){
			pt+=2; mn = min(mn, h[i]); ans = min(ans, pt + abs(ey - mn) + abs(sx - ex)); 
		}
		mn = ch, pt = 0; for(int i = min(sx, ex) - 1; i >= 0; i--){
			pt+=2; mn = min(mn, h[i]); ans = min(ans, pt + abs(ey - mn) + abs(sx - ex));
		}
	}
	cout<<ans;
}
#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...