Submission #1095326

#TimeUsernameProblemLanguageResultExecution timeMemory
1095326epicci23Text editor (CEOI24_editor)C++17
100 / 100
827 ms464724 KiB
#include "bits/stdc++.h"
#define int long long
#define all(v) v.begin() , v.end()
#define sz(a) (int)a.size()
using namespace std;

const int INF = 1e18;

void _(){
  int n,a,b,c,d;
  cin >> n >> a >> b >> c >> d;
  vector<int> pre(n+5),suf(n+5),ar(n+5);
  int Sparse[n+5][20];
  for(int i=1;i<=n;i++){
  	cin >> ar[i];
  	ar[i]++;
    Sparse[i][0]=ar[i];
  }
  for(int j=1;j<20;j++){
   for(int i=1;i+(1<<j)-1<=n;i++){
    Sparse[i][j]=min(Sparse[i][j-1],Sparse[i+(1<<(j-1))][j-1]);
   }
  }
  
  auto Get=[&](int l,int r)->int {
    if(l>r) swap(l,r);
    int k=__lg(r-l+1);
    return min(Sparse[l][k],Sparse[r-(1<<k)+1][k]);
  };

  pre[a]=suf[a]=b;
  
  for(int i=a-1;i>=1;i--) pre[i]=min(pre[i+1],ar[i]);
  for(int i=a+1;i<=n;i++) suf[i]=min(suf[i-1],ar[i]);

  int ans=INF;
  
  if(a<=c){
    for(int i=a;i>=1;i--){
      ans=min(ans,a-i+c-i+abs(min(pre[i],suf[c])-d));
    }
  } 
  else{
    for(int i=a;i<=n;i++){
      ans=min(ans,i-a+i-c+abs(min(suf[i],pre[c])-d));
    }
  }


  priority_queue<array<int,2>> pq;
  vector<int> dist(2*n+5,INF),vis(2*n+5,0);
  vector<array<int,2>> v[2*n+5];
  int st=2*n+1,en=2*n+2;

  v[st].push_back({2*a-1,b-1});
  v[st].push_back({2*a,ar[a]-b});
  v[2*a-1].push_back({st,b-1});
  v[2*a].push_back({st,ar[a]-b});

  v[en].push_back({2*c-1,d-1});
  v[en].push_back({2*c,ar[c]-d});
  v[2*c-1].push_back({en,d-1});
  v[2*c].push_back({en,ar[c]-d});

  for(int i=1;i<=n;i++){
    v[2*i].push_back({2*i-1,ar[i]-1});
    v[2*i-1].push_back({2*i,ar[i]-1});
    if(i<n){
      v[2*i].push_back({2*i+1,1});
      v[2*i+1].push_back({2*i,1});
      v[2*i-1].push_back({2*i+1,1});
      v[2*i+1].push_back({2*i-1,1});
      if(ar[i]<=ar[i+1]){
        v[2*i].push_back({2*i+2,1+ar[i+1]-ar[i]});
        v[2*i+2].push_back({2*i,1});
      }
      else{
        v[2*i].push_back({2*i+2,1});
        v[2*i+2].push_back({2*i,1+ar[i]-ar[i+1]});
      }
    }
  }

  for(int i=1;i<=n;i++){
    if(Get(a,i)<=b && ar[i]==Get(a,i)) v[st].push_back({2*i,abs(a-i)});
  }

  dist[st]=0;
  pq.push({0,st});

  while(!pq.empty()){
    int c=pq.top()[1];
    pq.pop();
    if(vis[c]) continue;
    vis[c]=1;
    for(auto [u,d]:v[c]){
      if(!vis[u] && d+dist[c]<dist[u]){
        dist[u]=d+dist[c];
        pq.push({-dist[u],u});
      }
    }
  }

  ans=min(ans,dist[en]);
  for(int i=1;i<=n;i++){
    if(Get(i,c)==ar[i]) ans=min(ans,dist[2*i]+abs(c-i)+abs(d-ar[i]));
  }

  cout << ans << '\n';
}

int32_t main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tc=1;//cin >> tc;
  while(tc--) _();
  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...