luogu

暴力?

暴力!

这个题有点像最短路,所以设\(f_{i,j}\)表示在\(i\)号楼,当前\(doge\)跳跃能力为\(j\)的最短步数,转移要么跳一步到\(f_{i+j,j}\)和\(f_{i-j,j}\),要么换到别的\(doge\),转移到\(f_{i,k}\)

这看似有\(n^2\)的状态,实际上状态数只有\(n\sqrt n\).因为当\(p> \sqrt n\)时,一个\(doge\)只能跳到\(\sqrt n\)个不同的点,这部分为\(m\sqrt n\);当\(p\le \sqrt n\)时,因为\(j\le \sqrt n\),所以总状态数为\(n \sqrt n\).然后是边数,边权只有0/1两种,1边每个状态最多两个,然后0边(也就是换一个\(doge\)),显然对于每个\(i\)只用在\(f_{i,j}\)最小的状态转移更优,所以转移总数也是\(n\sqrt n\)的

实现的话可以用双端队列实现0/1最短路.另外还需要判断一个状态是否访问过,\(30000*30000\)的\(bool\)数组开不下,所以可以\(bitset\)

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int N=30000+10;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
bitset<N> v[N];
int n,m,ps,ans=1<<30;
vector<int> dog[N];
struct node
{
int x,j,d;
};
deque<node> q; int main()
{
n=rd(),m=rd();
int b=rd()+1,p=rd();
v[b][p]=1,q.push_front((node){b,p,0});
for(int i=1;i<m;++i)
{
b=rd()+1,p=rd();
if(i==1) ps=b;
dog[b].push_back(p);
}
while(!q.empty())
{
int x=q.front().x,j=q.front().j,d=q.front().d;
q.pop_front();
if(x==ps) ans=min(ans,d);
vector<int>::iterator it;
for(it=dog[x].begin();it!=dog[x].end();++it)
{
int y=*it;
if(!v[x][y]) v[x][y]=1,q.push_front((node){x,y,d});
}
dog[x].clear();
if(x-j>=1&&!v[x-j][j]) v[x-j][j]=1,q.push_back((node){x-j,j,d+1});
if(x+j<=n&&!v[x+j][j]) v[x+j][j]=1,q.push_back((node){x+j,j,d+1});
}
printf("%d\n",ans<(1<<30)?ans:-1);
return 0;
}

最新文章

  1. 60-chmod 修改文件的权限
  2. C语言:stat,fstat和lstat函数
  3. flume ng之TailSource
  4. oracle:触发器,自治事务 trigger
  5. 01_安装redhat 7.1时常出现的问题
  6. 织梦DedeCMS网站地图模板
  7. Flex中如何通过showAllDataTips属性使鼠标移动到图表时显示所有的数据Tips的例子
  8. java操作oracle空间信息介绍
  9. Linux内核头文件与内核与库的关系
  10. winform程序中为无边框窗体手动添加窗体拖动代码
  11. Python2和Python3的差异
  12. Django的ORM操作
  13. 20165314 [第二届构建之法论坛] 预培训心得(Java版)
  14. 转发: 探秘Java中的String、StringBuilder以及StringBuffer
  15. _ZNote_Window_技巧_删除开机启动项
  16. POJ3320 Jessica&#39;s Reading Problem 2017-05-25 19:55 38人阅读 评论(0) 收藏
  17. Python开发【笔记】:关闭线程的方法
  18. Python3基础 函数 有参数有返回值 对传入的参数加1
  19. 纠错帖:Zuul &amp; Spring Cloud Gateway &amp; Linkerd性能对比 (转载)
  20. 推荐一款超级漂亮的HTML5 CSS3的图片轮播器

热门文章

  1. [MyBatis]查询SQL得到一个数字
  2. Kettle源码学习(一)——把Kettle项目跑起来
  3. 一百零七:CMS系统之权限和角色模型定义
  4. java+web文件的上传和下载代码
  5. Elasticsearch 空值过滤
  6. mapreduce案例:获取PI的值
  7. C#常用处理数据类型转换、数据源转换、数制转换、编码转换相关的扩展
  8. 「java.util.concurrent并发包」之 CAS
  9. hashmap 为什么初始化容量是2的幂次方
  10. ABP领域层创建实体