Submission #1150393

#TimeUsernameProblemLanguageResultExecution timeMemory
1150393dpsaveslivesText editor (CEOI24_editor)C++20
100 / 100
2821 ms957012 KiB
#include <bits/stdc++.h>
#define ff first
#define ss second
#define int long long
using namespace std;
const int MAXN = 1e6+5;
int N, sx, sy, tx, ty;
int len[MAXN],dist[MAXN<<2],A[MAXN],B[MAXN],C[MAXN];
bool vis[MAXN<<2];
map<pair<int,int>,int> mp;
int nodescnt;
vector<pair<int,int>> adj[MAXN<<2];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
void add(int u, int v, int w){
    adj[u].push_back({v,w});
}
void dijkstra(){
    while(!pq.empty()){
        int u = pq.top().ss, cd = pq.top().ff; pq.pop();
        if(vis[u]) continue;
        vis[u] = true;
        for(auto pa : adj[u]){
            int v = pa.ff;
            if(dist[v] > dist[u]+pa.ss){
                dist[v] = dist[u]+pa.ss;
                pq.push({dist[v],v});
            }
        }
    }
}
signed main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> N;
    cin >> sx >> sy >> tx >> ty;
    for(int i = 1;i<=N;++i) cin >> len[i];
    for(int i = 1;i<=N;++i){
        mp[{i,1}] = ++nodescnt;
        mp[{i,len[i]+1}] = ++nodescnt;
        if(sy < len[i]+1) mp[{i,sy}] = ++nodescnt;
        A[i] = mp[{i,1}], B[i] = mp[{i,sy}], C[i] = mp[{i,len[i]+1}];
        if(B[i]){
            add(A[i],B[i],sy-1);
            add(B[i],A[i],sy-1);
            add(B[i],C[i],len[i]+1-sy);
            add(C[i],B[i],len[i]+1-sy);
        }
        else{
            add(A[i],C[i],len[i]);
            add(C[i],A[i],len[i]);
        }
    }
    for(int i = 1;i<=nodescnt;++i) dist[i] = 2147483647;
    for(int i = sx, tmp = sy;i;i--){
        tmp = min(tmp,len[i]+1);
        int id = mp[{i,tmp}];
        dist[id] = sx-i;
        pq.push({dist[id],id});
    }
    for(int i = sx, tmp = sy;i<=N;++i){
        tmp = min(tmp,len[i]+1);
        int id = mp[{i,tmp}];
        dist[id] = i-sx;
        pq.push({dist[id],id});
    }
    for(int i = 1;i<N;++i){
        add(A[i],A[i+1],1); add(A[i+1],A[i],1);
        add(A[i],C[i+1],len[i+1]+1); add(C[i+1],A[i],len[i+1]+1);
        add(C[i],A[i+1],1); add(A[i+1],C[i],1);
        if(len[i] >= len[i+1]){
            add(C[i],C[i+1],1);
            add(C[i+1],C[i],len[i]-len[i+1]+1);
        }
        if(len[i] <= len[i+1]){
            add(C[i+1],C[i],1);
            add(C[i],C[i+1],len[i+1]-len[i]+1);
        }
        if(B[i] && B[i+1]){
            add(B[i],B[i+1],1);
            add(B[i+1],B[i],1);
        }
        if(B[i]){
            add(B[i],C[i+1],B[i+1] ? (len[i+1]+1-sy+1) : 1);
            add(B[i],A[i+1],sy);
            add(C[i+1],B[i],abs(sy-len[i+1]));
            add(A[i+1],B[i],sy);
        }
        if(B[i+1]){
            add(A[i],B[i+1],sy);
            add(C[i],B[i+1],abs(sy-len[i]));
            add(B[i+1],C[i],B[i] ? (len[i]+1-sy+1) : 1);
            add(B[i+1],A[i],sy);
        }
    }
    dijkstra();
    int ans = 2147483647;
    int tmp = len[tx]+1;
    for(int i = tx;i;--i){
        tmp = min(tmp,len[i]+1);
        ans = min(ans,dist[A[i]]+tx+ty-i-1);
        ans = min(ans,dist[C[i]]+tx-i+abs(len[i]+1-tmp)+abs(ty-tmp));
        if(B[i]) ans = min(ans,dist[B[i]]+tx-i+abs(ty-sy)+abs(tmp-sy));
    }
    tmp = len[tx]+1;
    for(int i = tx;i <= N;++i){
        tmp = min(tmp,len[i]+1);
        ans = min(ans,dist[A[i]]+i-tx+ty-1);
        ans = min(ans,dist[C[i]]+i-tx+abs(len[i]+1-tmp)+abs(ty-tmp));
        if(B[i]) ans = min(ans,dist[B[i]]+i-tx+abs(ty-tmp)+abs(tmp-sy));
    }
    tmp = 2147483647;
    for(int i = min(sx,tx);i<=max(tx,sx);++i) tmp = min(tmp,len[i]+1);
    if(tmp >= sy && tmp >= ty){
        ans = min(ans,abs(sx-tx)+abs(sy-ty));
    }
    cout << ans << "\n";
    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...