2个TLE,1个MLE,其余WA
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
struct node{
long long v,w;
};
vector<node> G[2000000];
int n,k;
int dis[2000000];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i = 1;i<n;i++){
int a;
cin>>a;
G[i].push_back(node{i+1,a});
G[i+1].push_back(node{i,a});
G[i+n].push_back(node{i+n+1,a});
G[i+n+1].push_back(node{i+n,a});
int front = i+k,back = i-k;
if(front>n) front = n;
if(back<1) back = 1;
G[i].push_back(node{front+n,0});
G[i].push_back(node{back+n,0});
}
G[n].push_back(node{0,0});
G[n*2].push_back(node{0,0});
for(int i = 0;i<=n+n;i++){
for(int j = 0;j<G[i].size();j++){
//cout<<i<<' '<<G[i][j].v<<' '<<G[i][j].w<<endl;
}
}
memset(dis,0x3f3f3f3f,sizeof(dis));
dis[1] = 0;
q.push(make_pair(0,1));
while(!q.empty()){
pair<int,int> p = q.top();
q.pop();
int u = p.second;
int d = p.first;
//cout<<u<<' '<<d<<endl;
if(dis[u]<d) continue;
for(int i = 0;i<G[u].size();i++){
int v = G[u][i].v;
int w = G[u][i].w;
if(dis[v]>dis[u]+w){
dis[v] = dis[u]+w;
q.push(make_pair(dis[v],v));
}
}
}
cout<<dis[0];
return 0;
}