Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 3000005
int head[maxn], to[maxn], nex[maxn], val[maxn],edges,s,t,pre[maxn],nxt[maxn];
struct Node{
int dist,u;
Node(int dist=0,int u=0):dist(dist),u(u){}
bool operator <(Node a) const{
return a.dist<dist;
}
};
priority_queue<Node>Q;
void addedge(int u,int v,int c){
nex[++edges]=head[u],head[u]=edges,to[edges]=v,val[edges]=c;
}
int d[maxn];
bool done[maxn];
void dijkstra(){
memset(d,0x3f,sizeof(d));
d[s]=0;
Q.push(Node(0,s));
while(!Q.empty()){
int u=Q.top().u; Q.pop();
if(done[u]) continue;
if(u==t) break;
done[u]=true;
for(int v=head[u];v;v=nex[v])
if(d[u]+val[v] < d[to[v]]){
d[to[v]]=d[u]+val[v];
Q.push(Node(d[to[v]],to[v]));
}
}
}
int main(){
//freopen("input.in","r",stdin);
int n,a;
scanf("%d",&n);
s=1, t=n+1;
for(int i=1;i<=n;++i){
scanf("%d",&a);
for(int j=i+1;j<=min(n+1,a+i+1)&&!pre[j];++j) addedge(j,j-1,1), pre[j]=1;
for(int j=i+a+1;j<=n&&!nxt[j];++j) addedge(j,j+1,1),nxt[j]=1;
if(i+a<=n) addedge(i,i+a+1,0);
else addedge(i,n+1,i+a-n);
}
dijkstra();
printf("%d",d[t]);
return 0;
}

  

最新文章

  1. ASP.NET Web API 控制器创建过程(一)
  2. JQuery事件之鼠标事件
  3. Unity字节序问题
  4. 网页动物园2.0发布,经过几个月的努力,采用JAVA编写!
  5. 【转载】solr初体验
  6. [JS] JavaScript框架(1) jQuery
  7. mysql lower,upper实现大小写
  8. MYfirst
  9. 欢迎使用 Markdown 编辑器写博客
  10. 《Swift Programming Language 》——Swift中怎样使用继承(Inheritance)
  11. 获取JUnit的执行结果
  12. sqlserver优化
  13. Python 二分查找
  14. 剑指Offer——咪咕笔试题+知识点总结
  15. osg做的路面项目
  16. Holer服务端软件使用
  17. 【原创】IO流:读写操作研究(输入流)
  18. sql 表连接
  19. 没有备份怎么恢复被drop的表(利用undrop-for-innodb)
  20. Python 默认值字典

热门文章

  1. 手动配置IP网络
  2. jqGrid添加删除功能(不和数据库交互)
  3. (转载)安卓6.0之前的系统 判断app是否有录音权限
  4. JavaScript学习——使用JS完成省市二级联动
  5. ZBrush中常用笔刷综合简介
  6. 常用类Object,String类详解
  7. Qt之图形(绘制漂亮的圆弧)
  8. 程序设计基石与实践系列之编写高效的C程序与C代码优化
  9. 《从零開始学Swift》学习笔记(Day 51)——扩展构造函数
  10. YTUOJ-计算该日在本年中是第几天(用户自己定义类型)