re 6~10 https://www.luogu.com.cn/record/221289223
#include <bits/stdc++.h>
using namespace std;
#define N 800005
struct qwe {
int i, dis_i;
friend bool operator<(qwe a,qwe b) {
return a.dis_i > b.dis_i;
}
};
struct edge {
int to,dis;
};
int n,m,a[N],s;
map <int,int> dis,vis;
//int dis[N],vis[N];
vector <edge> G[N];
int id(int i,int j) {
return i * n + j;
}
void Dijkstra() {
for (int i = id(1,1); i <= id(n,m); i++) {
dis[i] = 0x3f3f3f3f;
vis[i] = 0;
}
priority_queue<qwe> q;
q.push({id(1,s),0});
dis[id(1,s)] = 0;
while(!q.empty()) {
qwe now = q.top();
q.pop();
if (vis[now.i] == 1) continue;
vis[now.i] = 1;
for (auto v : G[now.i]) {
if (dis[v.to] > dis[now.i] + v.dis) {
dis[v.to] = dis[now.i] + v.dis;
q.push({v.to,dis[v.to]});
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> a[i];
if (a[i] == 0) s = i;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (i != 1) G[id(j,i)].push_back({id(j,i - 1),1});
if (i != m) G[id(j,i)].push_back({id(j,i + 1),1});
if (j + a[i] <= n && j + a[i] >= 1 && i != s) {
G[id(j,i)].push_back({id(j + a[i],i),abs(a[i]) * 2});
}
}
}
Dijkstra();
int mini = 0x3f3f3f3f;
for (int i = 1; i <= m; i++) {
mini = min(mini,dis[id(n,i)]);
}
cout << ((mini == 0x3f3f3f3f) ? -1 : mini);
return 0;
}