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;
}

luogu P3645 [APIO2015]雅加达的摩天楼的更多相关文章

  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. 洛谷$P3645\ [APIO2015]$雅加达的摩天楼 最短路

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

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

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

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

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

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

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

随机推荐

  1. 安装nodejs 后运行 npm 命令无响应

    安装和卸载过nodejs, 也编辑过 C:\Users\{账户}\下的.npmrc文件. 再全新安装nodejs ,运行npm 命令,无响应. 处理方法,删除C:\Users\{账户}\下的.npmr ...

  2. Java堆大小[z]

    JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制. 32位系统下,一般限制在1.5G~2G:64为操作系统对内存 ...

  3. tensorflow自动写诗

    1.目录结构 2.入口类 # coding = utf-8 """ 注意:RNN使用的数据为序列化的数据 RNN网络:主要由多个LSTM计算单元组成,依靠BPTT算法进行 ...

  4. js图片预览带进度条

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. UNITY3D 添加预制的方法

    预制文件(Prefabs)的做法 我这里需要的图片 在hierarchy 视图下新建一个2D object->sprite 然后设置这个sprite的背景为需要的图片 新建一个prefabs目录 ...

  6. Swift 3.0 闭包的定义和使用

    // // ViewController.swift // 闭包的定义和使用 // // Created by 思 彭 on 16/9/17. // Copyright © 2016年 思 彭. Al ...

  7. 【JVM学习笔记】扩展类加载器

    扩展类加载器独有的特点,代码如下 public class Sample { } public class Test { static { System.out.println("Test ...

  8. 3-3 man手册介绍

    man手册介绍 内容表示的意义: 各部分功能说明: SECTION: name:命令的名称及功能描述: SYNOPSIS:命令使用格式摘要: DESCRIPTION:详细描述信息: OPTIONS:选 ...

  9. Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber)

    Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber) 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互 ...

  10. spring-cloud-starter-stream-rocketmq 坑点j记录