Submission #1193146

#TimeUsernameProblemLanguageResultExecution timeMemory
1193146UnforgettableplText editor (CEOI24_editor)C++20
100 / 100
614 ms65204 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; int startL,startC,endL,endC; cin >> startL >> startC >> endL >> endC; vector<int> l(N+1); for(int i=1;i<=N;i++){ cin >> l[i]; l[i]++; } vector<int> minimas = l; for(int i=endL+1;i<=N;i++)minimas[i]=min(minimas[i],minimas[i-1]); for(int i=endL-1;i;i--)minimas[i]=min(minimas[i],minimas[i+1]); auto trivialDist = [&](int x,int y){ return abs(x-endL)+abs(min(y,minimas[x])-endC); }; vector<int> beforeLower(N+1,-1); { stack<pair<int,int>> s; s.emplace(-1,-1); for(int i=1;i<=N;i++){ while(s.top().first>l[i])s.pop(); beforeLower[i]=s.top().second; s.emplace(l[i],i); } } vector<int> beforeAfter(N+1,-1); { stack<pair<int,int>> s; s.emplace(-1,-1); for(int i=N;i;i--){ while(s.top().first>l[i])s.pop(); beforeAfter[i]=s.top().second; s.emplace(l[i],i); } } vector<int> starts(N+1); vector<int> ends(N+1); vector<bool> visitedStarts(N+1); vector<bool> visitedEnds(N+1); priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq; int ans = trivialDist(startL,startC); pq.emplace(startC-1,startL); pq.emplace(l[startL]-startC,-startL); for(int i=startL-1;i;i--){ if(l[i]<startC){ pq.emplace(startL-i,-i); break; } } for(int i=startL+1;i<=N;i++){ if(l[i]<startC){ pq.emplace(i-startL,-i); break; } } while(!pq.empty()){ auto [dist,idx] = pq.top();pq.pop(); int type = 0; if(idx<0){type=1;idx=-idx;} if(type){ if(visitedEnds[idx])continue; visitedEnds[idx]=true; ans = min(ans,dist+trivialDist(idx,l[idx])); if(!visitedStarts[idx]){ pq.emplace(dist+l[idx]-1,idx); } if(idx!=N and !visitedStarts[idx+1]){ pq.emplace(dist+1,idx+1); } if(beforeLower[idx]!=-1 and !visitedEnds[beforeLower[idx]]){ pq.emplace(dist+abs(beforeLower[idx]-idx),-beforeLower[idx]); } if(beforeAfter[idx]!=-1 and !visitedEnds[beforeAfter[idx]]){ pq.emplace(dist+abs(beforeAfter[idx]-idx),-beforeAfter[idx]); } } else { if(visitedStarts[idx])continue; visitedStarts[idx]=true; ans = min(ans,dist+trivialDist(idx,1)); if(!visitedEnds[idx]){ pq.emplace(dist+l[idx]-1,-idx); } if(idx!=1 and !visitedEnds[idx-1]){ pq.emplace(dist+1,-(idx-1)); } if(idx!=1 and !visitedStarts[idx-1]){ pq.emplace(dist+1,idx-1); } if(idx!=N and !visitedStarts[idx+1]){ pq.emplace(dist+1,idx+1); } } } cout << ans << '\n'; }
#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...