Submission #1096073

#TimeUsernameProblemLanguageResultExecution timeMemory
1096073alexddClimbers (RMI18_climbers)C++17
55 / 100
2616 ms524288 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_STARI = 8300000; const long long INF = 1e18; vector<pair<int,int>> con[MAX_STARI]; long long dist[MAX_STARI]; int nrm[5005][5005],cate; int n,p[5005]; void add_edge(int v1, int m1, int v2, int m2) { con[nrm[v1][m1]].push_back({nrm[v2][m2],abs(p[v1]-p[v2])}); con[nrm[v2][m2]].push_back({nrm[v1][m1],abs(p[v1]-p[v2])}); } priority_queue<pair<long long,int>> pq; signed main() { cin>>n; for(int i=1;i<=n;i++) cin>>p[i]; assert(p[1]==0); assert(p[n]==0); for(int v=1;v<=n;v++) { for(int m=1;m<n;m++) { if(p[v] < min(p[m],p[m+1]) || p[v] > max(p[m],p[m+1])) continue; nrm[v][m] = ++cate; } } for(int v=1;v<=n;v++) { for(int m=1;m<n;m++) { if(p[v] < min(p[m],p[m+1]) || p[v] > max(p[m],p[m+1])) continue; for(int newv:{v-1,v+1}) { if(newv>=1 && newv<=n && min(p[m],p[m+1]) <= p[newv] && p[newv] <= max(p[m],p[m+1])) { add_edge(v,m,newv,m); } } if(p[v] == p[m] && m-1>0) { add_edge(v,m,v,m-1); } if(p[v] == p[m+1] && m+1<n) { add_edge(v,m,v,m+1); } if(v+1<n && min(p[v],p[v+1]) <= p[m] && p[m] <= max(p[v],p[v+1])) { add_edge(v,m,m,v); } if(v-1>0 && min(p[v],p[v-1]) <= p[m] && p[m] <= max(p[v],p[v-1])) { add_edge(v,m,m,v-1); } if(v+1<n && min(p[v],p[v+1]) <= p[m+1] && p[m+1] <= max(p[v],p[v+1])) { add_edge(v,m,m+1,v); } if(v-1>0 && min(p[v],p[v-1]) <= p[m+1] && p[m+1] <= max(p[v],p[v-1])) { add_edge(v,m,m+1,v-1); } } } for(int i=1;i<=cate;i++) dist[i]=INF; dist[nrm[n][1]]=0; dist[nrm[1][n-1]]=0; pq.push({0,nrm[n][1]}); pq.push({0,nrm[1][n-1]}); while(!pq.empty()) { long long cdist = -pq.top().first; int nod = pq.top().second; pq.pop(); if(dist[nod]!=cdist) continue; //cerr<<nod<<" new dist "<<dist[nod]<<"\n"; for(auto [adj,c]:con[nod]) { if(cdist + c < dist[adj]) { dist[adj] = cdist + c; pq.push({-dist[adj],adj}); } } } long long rez=INF; for(int m=1;m<n;m++) { rez = min(rez, dist[nrm[m][m]]); rez = min(rez, dist[nrm[m+1][m]]); } assert(rez<INF); cout<<rez; return 0; } /* 7 0 10 1 20 5 10 0 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...