#include <bits/stdc++.h>
#define all(x) ((x).begin(), (x).end())
#define sz(x) ((int) (x).size())
using namespace std;
typedef long long lint;
typedef pair<lint,lint> ii;
const lint inf = 12345678901234;
lint H[5005];
int n;
int to(int peak, int slope){
return peak * 6000 + slope;
}
lint dis[3100005];
vector<ii> adj[3100005];
void addEdge(int u, int v){
int pu = u / 6000;
int pv = v / 6000;
int su = u % 6000;
int sv = v % 6000;
//if(pv == 2 && sv == 3 && pu == 3 && su == 1) cout << "FDDF\n";
int w = abs(H[pu] - H[pv]);
adj[u].push_back(ii(w,v));
adj[v].push_back(ii(w,u));
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 0;i < n;i++) cin >> H[i];
if(n == 3){
cout << H[1];
return 0;
}
for(int peak = 1;peak < n-1;peak++){
for(int slope = 0;slope < n-1;slope++){
int cur = to(peak,slope);
if(H[peak] > H[slope] && H[peak] > H[slope+1]) continue;
if(H[peak] < H[slope] && H[peak] < H[slope+1]) continue;
if(peak&1){ ///is peak
int slopeEnd;
if(slope & 1) slopeEnd = slope+1;
else slopeEnd = slope;
///go right
if(H[slopeEnd] >= H[peak+1]){
int nxt = to(slopeEnd, peak);
addEdge(cur,nxt);
}
else{
int nxt = to(peak+1, slope);
addEdge(cur,nxt);
}
///go left
if(H[slopeEnd] >= H[peak-1]){
int nxt = to(slopeEnd, peak-1);
addEdge(cur,nxt);
}
else{
int nxt = to(peak-1, slope);
addEdge(cur,nxt);
}
}
else{ ///is valley
int slopeEnd;
if(slope & 1) slopeEnd = slope;
else slopeEnd = slope + 1;
///go right
if(H[slopeEnd] <= H[peak+1]){
int nxt = to(slopeEnd, peak);
addEdge(cur,nxt);
}
else{
int nxt = to(peak+1, slope);
addEdge(cur,nxt);
}
///go left
if(H[slopeEnd] <= H[peak-1]){
//if(peak == 2 && slope == 3) cout << slopeEnd << "FFD\n";
int nxt = to(slopeEnd, peak-1);
addEdge(cur,nxt);
}
else{
//if(peak == 2 && slope == 3) cout << slopeEnd << "FFD\n";
int nxt = to(peak-1, slope);
addEdge(cur,nxt);
}
}
}
}
fill(dis,dis+3100005,inf);
int S = 0;
if(H[1] < H[n-2]){
S = to(1,n-2);
}
else S = to(n-2,0);
priority_queue<ii, vector<ii>, greater<ii> > pq;
dis[S] = 0; pq.push(ii(0,S));
while(!pq.empty()){
ii cur = pq.top(); pq.pop();
int peak = cur.second / 6000;
int slope = cur.second % 6000;
for(ii nei : adj[cur.second]){
if(dis[nei.second] > nei.first + cur.first){
int npeak = nei.second / 6000;
int nslope = nei.second % 6000;
//cout << peak << " " << slope << " " << cur.first << " " << npeak << " " << nslope << " " << nei.first << "\n";
dis[nei.second] = nei.first + cur.first;
pq.push(ii(dis[nei.second], nei.second));
}
}
}
lint ans = inf;
for(int peak = 1;peak < n-1;peak++){
int slope = peak;
//cout << peak << " " << slope << " " << dis[to(peak,slope)] << "P\n";
ans = min(ans, dis[to(peak,slope)]);
slope = peak-1;
//cout << peak << " " << slope << " " << dis[to(peak,slope)] << "P\n";
ans = min(ans, dis[to(peak,slope)]);
}
ans += min(H[1], H[n-2]);
cout << ans;
}
Compilation message
climbers.cpp: In function 'void addEdge(int, int)':
climbers.cpp:22:6: warning: unused variable 'su' [-Wunused-variable]
int su = u % 6000;
^~
climbers.cpp:23:6: warning: unused variable 'sv' [-Wunused-variable]
int sv = v % 6000;
^~
climbers.cpp: In function 'int main()':
climbers.cpp:137:9: warning: unused variable 'npeak' [-Wunused-variable]
int npeak = nei.second / 6000;
^~~~~
climbers.cpp:138:9: warning: unused variable 'nslope' [-Wunused-variable]
int nslope = nei.second % 6000;
^~~~~~
climbers.cpp:130:7: warning: unused variable 'peak' [-Wunused-variable]
int peak = cur.second / 6000;
^~~~
climbers.cpp:131:7: warning: unused variable 'slope' [-Wunused-variable]
int slope = cur.second % 6000;
^~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
62 ms |
97952 KB |
Output isn't correct |
2 |
Incorrect |
69 ms |
100728 KB |
Output isn't correct |
3 |
Runtime error |
136 ms |
148728 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
4 |
Runtime error |
136 ms |
148472 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
5 |
Runtime error |
134 ms |
148344 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
57 ms |
97400 KB |
Output is correct |
2 |
Incorrect |
58 ms |
97568 KB |
Output isn't correct |
3 |
Incorrect |
65 ms |
98296 KB |
Output isn't correct |
4 |
Incorrect |
60 ms |
97784 KB |
Output isn't correct |
5 |
Incorrect |
74 ms |
102008 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
59 ms |
98040 KB |
Output isn't correct |
2 |
Incorrect |
73 ms |
102264 KB |
Output isn't correct |
3 |
Runtime error |
139 ms |
148856 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
4 |
Runtime error |
138 ms |
148088 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
5 |
Runtime error |
137 ms |
148088 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
6 |
Runtime error |
141 ms |
148216 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
7 |
Runtime error |
133 ms |
148088 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
8 |
Runtime error |
137 ms |
148088 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
9 |
Runtime error |
143 ms |
148120 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
10 |
Runtime error |
139 ms |
148856 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |