#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
using namespace std;
const long long INF = 1e18;
vector<vector<pair<int,int>>> con;
vector<long long> dist;
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;
}
}
con.resize(cate+2);
dist.resize(cate+2);
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
*/
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
1116 KB |
Output is correct |
2 |
Correct |
8 ms |
4956 KB |
Output is correct |
3 |
Correct |
90 ms |
42068 KB |
Output is correct |
4 |
Execution timed out |
977 ms |
350292 KB |
Time limit exceeded |
5 |
Runtime error |
476 ms |
524288 KB |
Execution killed with signal 9 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
604 KB |
Output is correct |
2 |
Correct |
1 ms |
860 KB |
Output is correct |
3 |
Correct |
3 ms |
2140 KB |
Output is correct |
4 |
Correct |
2 ms |
1372 KB |
Output is correct |
5 |
Correct |
12 ms |
7616 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
2140 KB |
Output is correct |
2 |
Correct |
16 ms |
9988 KB |
Output is correct |
3 |
Correct |
573 ms |
165200 KB |
Output is correct |
4 |
Execution timed out |
874 ms |
524288 KB |
Time limit exceeded |
5 |
Runtime error |
627 ms |
524288 KB |
Execution killed with signal 9 |
6 |
Runtime error |
355 ms |
524288 KB |
Execution killed with signal 9 |
7 |
Runtime error |
209 ms |
524288 KB |
Execution killed with signal 9 |
8 |
Runtime error |
205 ms |
524288 KB |
Execution killed with signal 9 |
9 |
Runtime error |
217 ms |
524288 KB |
Execution killed with signal 9 |
10 |
Runtime error |
219 ms |
524288 KB |
Execution killed with signal 9 |