正题

题目链接:https://www.luogu.com.cn/problem/P3645


题目大意

\(n\)个点,\(m\)条狗,第\(i\)条狗可以往左或者右跳恰好\(p_i\)步,开始是\(0\)号狗,每次跳跃到达一个点可以选择换一条狗,求到\(1\)号狗所在点的最短路。


解题思路

为了方便设\(n,m\)同级

对于\(p_i\leq \sqrt n\)的狗,\(p_i\)的种类只有\(\sqrt n\)级别,每条狗能到达的点是\(O(n)\)级别

对于\(p_i>\sqrt n\)的狗,\(p_i\)的种类有\(O(n)\)级别,每条狗能到达的点数是\(O(\sqrt n)\)级别。

所以总共的状态数不超过\(O(n\sqrt n)\)个,暴力\(bfs\)就好了。

对于储存状态可以按照\(\sqrt n\)为分界用两种不同的方式储存,当然还有更暴力的方法就是直接用\(bitset\)存。

时间复杂度\(O(n\sqrt n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<bitset>
#include<vector>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=3e4+10;
int n,m,S,T;
bitset<N>v[N];
vector<int>s[N];
queue<pair<pair<int,int> ,int> >q;
int bfs(){
for(int i=0;i<s[S].size();i++)
q.push(mp(mp(S,s[S][i]),0)),v[S][s[S][i]]=1;
while(!q.empty()){
int x=q.front().first.first,w=q.front().first.second,d=q.front().second;
int y=x-w;
if(y>=0){
if(y==T)return d+1;
for(int i=0;i<s[y].size();i++)
if(!v[y][s[y][i]])
q.push(mp(mp(y,s[y][i]),d+1)),v[y][s[y][i]]=1;
if(!v[y][w])q.push(mp(mp(y,w),d+1)),v[y][w]=1;
}
y=x+w;
if(y<n){
if(y==T)return d+1;
for(int i=0;i<s[y].size();i++)
if(!v[y][s[y][i]])
q.push(mp(mp(y,s[y][i]),d+1)),v[y][s[y][i]]=1;
if(!v[y][w])q.push(mp(mp(y,w),d+1)),v[y][w]=1;
}
q.pop();
}
return -1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int x,w;
scanf("%d%d",&x,&w);
if(i==0)S=x;
if(i==1)T=x;
s[x].push_back(w);
}
if(S==T)return puts("0")&0;
printf("%d\n",bfs());
return 0;
}

P3645-[APIO2015]雅加达的摩天楼【bfs,根号分治】的更多相关文章

  1. luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治

    LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...

  2. 【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)

    [题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是\(O(n^2)\)的过不去 然而我们有一个优化的办法,可以建一个新图\(G=( ...

  3. 洛谷P3645 [APIO2015]雅加达的摩天楼

    题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N − 1.除了这 NN 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神 ...

  4. 洛咕 P3645 [APIO2015]雅加达的摩天楼

    暴力连边可以每个bi向i+kdi连边权是k的边. 考虑这样的优化: 然后发现显然是不行的,因为可能还没有走到一个dog的建筑物就走了这个dog的边. 然后就有一个很妙的方法--建一个新的图,和原图分开 ...

  5. 洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)

    传送门 这最短路的建图怎么和网络流一样玄学…… 一个最朴素的想法是从每一个点向它能到达的所有点连边,边权为跳的次数,然后跑最短路(然而边数是$O(n^2)$除非自创复杂度比spfa和dijkstra还 ...

  6. luogu P3645 [APIO2015]雅加达的摩天楼

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

  7. 洛谷$P3645\ [APIO2015]$雅加达的摩天楼 最短路

    正解:最短路 解题报告: 传送门$QwQ$ 考虑暴力连边,发现最多有$n^2$条边.于是考虑分块 对于长度$p_i$小于等于$\sqrt(n)$的边,建立子图$d=p_i$.说下关于子图$d$的定义? ...

  8. bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图

    [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 644  Solved: 238[Submit][Status][D ...

  9. 【BZOJ4070】[Apio2015]雅加达的摩天楼 set+最短路

    [BZOJ4070][Apio2015]雅加达的摩天楼 Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼 ...

  10. BZOJ 4070:[APIO2015]雅加达的摩天楼 最短路

    4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 164[Submit][Sta ...

随机推荐

  1. Azkaban入门(启动一个Simple Example)

    Azkaban简介 azkaban是一个开源的任务调度系统 Azkaban是一套简单的任务调度服务,整体包括三部分webserver.dbserver.executorserver. 开发语言为Jav ...

  2. 安装RHEL7配置本地yum源 -- yum不能安装时,在本地安装,亲测成功

    RHEL7 本地yum源配置我们在安装Redhat的时候一般都不会填写注册信息,因为该产品是要购买的,所以我们在使用安装好的Redhat时有的功能是受限的,使用yum源install就是其中之一.那么 ...

  3. 最简 jenkins-agent 镜像

    jenkins-agent 老版本叫 jenkins-slave,利用K8S集群集成 JENKINS,可以更好的利用系统资源,扩展更方便.如果构建频繁 jenkins-agent iamge 比较大, ...

  4. 使用TypeConverter类

    3.2.2 使用TypeConverter类将XAML标签的Attribute与对象的Property进行映射注意本小节的例子对于初学者来说理解起来比较困难而且实用性不大,主要是为喜欢刨根问底的WPF ...

  5. redis知识点及常见面试题

    redis知识点及常见面试题 参考: https://zm8.sm-tc.cn/?src=l4uLj4zF0NCIiIjRnJGdk5CYjNGckJLQrIqNiZaJnpOWjIvQno2Llpy ...

  6. 11.SpringMVC之HttpMessageConverter

    HttpMessageConverter简介 HTTP 请求和响应的传输是字节流,意味着浏览器和服务器通过字节流进行通信.但是,使用 Spring,controller 类中的方法返回纯 String ...

  7. Java File常见用法

    一.构造方法 File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例. File(String pathname) 通过将给定的路径名字符 ...

  8. REST设计风格:你写的 RESTful API 到第几层了?

    理解REST 在理解其真正概念前,我们先来明确: REST它的核心思想是面向资源的抽象(相对于RPC就是面向过程抽象),它是一种设计风格的指导,而非具有较强约束的协议. REST源于Roy Thoma ...

  9. 详细解读go语言中的map

    Map map底层是由哈希表实现的 Go使用链地址法来解决键冲突. map本质上是一个指针,指向hmap 这里的buckets就是桶,bmap 每一个bucket最多可以放8个键值对,但是为了让内存排 ...

  10. 常用cron表达式

    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午12点 " ...