P3645-[APIO2015]雅加达的摩天楼【bfs,根号分治】
正题
题目链接: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,根号分治】的更多相关文章
- luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治
		
LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...
 - 【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)
		
[题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是\(O(n^2)\)的过不去 然而我们有一个优化的办法,可以建一个新图\(G=( ...
 - 洛谷P3645 [APIO2015]雅加达的摩天楼
		
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N − 1.除了这 NN 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神 ...
 - 洛咕 P3645 [APIO2015]雅加达的摩天楼
		
暴力连边可以每个bi向i+kdi连边权是k的边. 考虑这样的优化: 然后发现显然是不行的,因为可能还没有走到一个dog的建筑物就走了这个dog的边. 然后就有一个很妙的方法--建一个新的图,和原图分开 ...
 - 洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)
		
传送门 这最短路的建图怎么和网络流一样玄学…… 一个最朴素的想法是从每一个点向它能到达的所有点连边,边权为跳的次数,然后跑最短路(然而边数是$O(n^2)$除非自创复杂度比spfa和dijkstra还 ...
 - luogu P3645 [APIO2015]雅加达的摩天楼
		
luogu 暴力? 暴力! 这个题有点像最短路,所以设\(f_{i,j}\)表示在\(i\)号楼,当前\(doge\)跳跃能力为\(j\)的最短步数,转移要么跳一步到\(f_{i+j,j}\)和\(f ...
 - 洛谷$P3645\ [APIO2015]$雅加达的摩天楼 最短路
		
正解:最短路 解题报告: 传送门$QwQ$ 考虑暴力连边,发现最多有$n^2$条边.于是考虑分块 对于长度$p_i$小于等于$\sqrt(n)$的边,建立子图$d=p_i$.说下关于子图$d$的定义? ...
 - bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图
		
[Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 644 Solved: 238[Submit][Status][D ...
 - 【BZOJ4070】[Apio2015]雅加达的摩天楼 set+最短路
		
[BZOJ4070][Apio2015]雅加达的摩天楼 Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼 ...
 - BZOJ 4070:[APIO2015]雅加达的摩天楼 最短路
		
4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 464 Solved: 164[Submit][Sta ...
 
随机推荐
- null的坑 和 比较运算符、相等运算符的隐式转换问题 (在javascript中,null>=0 为真,null<=0 为真,null==0却为假,null到底是什么?)
			
null在关系运算中的坑 & 关系运算符的隐式转换问题 注意: 比较运算符 和 相等运算符 的 ECMAscript 语法实现不同. 比较运算符 和 相等运算符 对数据进行了隐式转换, 相当于 ...
 - ASP.NET Core教程:ASP.NET Core中使用Redis缓存
			
参考网址:https://www.cnblogs.com/dotnet261010/p/12033624.html 一.前言 我们这里以StackExchange.Redis为例,讲解如何在ASP.N ...
 - C#基础知识---Lambda表达式
			
一.Lambda表达式简介 Lambda表达式可以理解为匿名函数,可以包含表达式和语句.它提供了一种便利的形式来创建委托. Lambda表达式使用这个运算符--- "=>", ...
 - 12.SpringMVC之拦截器
			
1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以 ...
 - LeetCoded第25题题解--K个一组翻转链表--java--链表
			
链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素的引用字段链接在一起. 双链表:与单链表不同的是,双链表的每个节点都含有两个引用字段. 链表优点 灵活分配内存空间 能在O ...
 - SpringBoot笔记(4)
			
一.请求处理 1.1 常用参数注解使用 注解 使用 @PathVariable 获取URI模板指定请求,并赋值到变量中,不指定可以将所有请求放到map中,但是健值都为String @RequestHe ...
 - 🏆【Alibaba工具型技术系列】「EasyExcel技术专题」摒除OOM!让你的Excel操作变得更加优雅和安全
			
前提概要 针对于后端开发者而言的,作为报表的导入和导出是一个很基础且有很棘手的问题!之前常用的工具和方案大概有这么几种: JXL(Java Excel API 工具服务),此种只支持xls的文件格式, ...
 - python glob.glob()
			
glob()函数可以将某目录下所有跟通配符模式相同的文件放到一个列表中,有了这个函数,我们再想生成所有文件的列表就不需要使用for循环遍历目录了,直接使用glob.glob(path+pattern) ...
 - 模拟BS服务器
			
一.模拟BS服务器分析 二.BS模拟服务器代码实现 图片都是单独请求,后台单独线程,这边是通过构造方法传入的Runable接口的实现类匿名对象创建线程: 创建本地输入流读取到网络输出流传过来的信息再放 ...
 - [第十一篇]——Docker 仓库管理之Spring Cloud直播商城 b2b2c电子商务技术总结
			
Docker 仓库管理 仓库(Repository)是集中存放镜像的地方.以下介绍一下 Docker Hub.当然不止 docker hub,只是远程的服务商不一样,操作都是一样的. Docker H ...