#111. 【APIO2015】Jakarta Skyscrapers

印尼首都雅加达市有 NN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 00 到 N−1N−1。除了这 NN 座摩天楼外,雅加达市没有其他摩天楼。

有 MM 只叫做 “doge” 的神秘生物在雅加达市居住,它们的编号依次是 00 到 M−1M−1。编号为 ii 的 doge 最初居住于编号为 BiBi 的摩天楼。每只 doge 都有一种神秘的力量,使它们能够在摩天楼之间跳跃,编号为 ii 的 doge 的跳跃能力为 PiPi (Pi>0Pi>0)。

在一次跳跃中,位于摩天楼 bb 而跳跃能力为 pp 的 doge 可以跳跃到编号为 b−pb−p (如果 0≤b−p<N0≤b−p<N)或 b+pb+p (如果 0≤b+p<N0≤b+p<N)的摩天楼。

编号为 00 的 doge 是所有 doge 的首领,它有一条紧急的消息要尽快传送给编 号为 11 的 doge。任何一个收到消息的 doge 有以下两个选择:

  1. 跳跃到其他摩天楼上;
  2. 将消息传递给它当前所在的摩天楼上的其他 doge。

请帮助 doge 们计算将消息从 00 号 doge 传递到 11 号 doge 所需要的最少总跳跃步数,或者告诉它们消息永远不可能传递到 11 号 doge。

输入格式

输入的第一行包含两个整数 NN 和 MM。

接下来 MM 行,每行包含两个整数 BiBi 和 PiPi。

输出格式

输出一行,表示所需要的最少步数。如果消息永远无法传递到 11 号 doge,输出 −1−1。

样例一

input

5 3
0 2
1 1
4 1

output

5

explanation

下面是一种步数为 55 的解决方案:

  • 00 号 doge 跳跃到 22 号摩天楼,再跳跃到 44 号摩天楼(22 步)。
  • 00 号 doge 将消息传递给 22 号 doge。
  • 22 号 doge 跳跃到 33 号摩天楼,接着跳跃到 22 号摩天楼,再跳跃到 11 号摩天楼(33 步)。
  • 22 号 doge 将消息传递给 11 号 doge。

子任务

所有数据都保证 0≤Bi<N0≤Bi<N。

  • 子任务 1 (10 分)

    • 1≤N≤101≤N≤10
    • 1≤Pi≤101≤Pi≤10
    • 2≤M≤32≤M≤3
  • 子任务 2 (12 分)
    • 1≤N≤1001≤N≤100
    • 1≤Pi≤1001≤Pi≤100
    • 2≤M≤20002≤M≤2000
  • 子任务 3 (14 分)
    • 1≤N≤20001≤N≤2000
    • 1≤Pi≤20001≤Pi≤2000
    • 2≤M≤20002≤M≤2000
  • 子任务 4 (21 分)
    • 1≤N≤20001≤N≤2000
    • 1≤Pi≤20001≤Pi≤2000
    • 2≤M≤300002≤M≤30000
  • 子任务 5 (43 分)
    • 1≤N≤300001≤N≤30000
    • 1≤Pi≤300001≤Pi≤30000
    • 2≤M≤300002≤M≤30000

时间限制:1s1s

空间限制:256MB

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define maxn 30010
using namespace std;
int B,num,tot,s,t,head[maxn*],m,n,vis[maxn*],d[maxn*],pos[][maxn];
struct node{int b,p;}a[maxn];
struct Node{int to,pre,v;}e[maxn*];
void Insert(int from,int to,int v){
e[++num].to=to;
e[num].v=v;
e[num].pre=head[from];
head[from]=num;
}
queue<int>q;
void spfa(){
for(int i=;i<=tot;i++)d[i]=1e9,vis[i]=;
q.push(a[].b);
d[a[].b]=;vis[a[].b]=;
while(!q.empty()){
int x=q.front();q.pop();vis[x]=;
for(int i=head[x];i;i=e[i].pre){
int to=e[i].to;
if(d[to]>d[x]+e[i].v){
d[to]=d[x]+e[i].v;
if(!vis[to])q.push(to),vis[to]=;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)scanf("%d%d",&a[i].b,&a[i].p);
tot=n-;
B=min(,(int)sqrt(n));
for(int i=;i<=B;i++)
for(int j=;j<i;j++)
for(int k=j;k<n;k+=i){
pos[i][k]=++tot;
Insert(tot,k,);
if(k>=i){
Insert(tot,tot-,);
Insert(tot-,tot,);
}
}
for(int i=;i<m;i++){
if(a[i].p<=B)
Insert(a[i].b,pos[a[i].p][a[i].b],);
else {
for(int j=;;j++)
if(j*a[i].p+a[i].b>=n)break;
else Insert(a[i].b,j*a[i].p+a[i].b,j);
for(int j=;;j++)
if(a[i].b-j*a[i].p<)break;
else Insert(a[i].b,a[i].b-j*a[i].p,j);
}
}
spfa();
if(d[a[].b]==1e9)puts("-1");
else printf("%d\n",d[a[].b]);
return ;
}

uoj #111. 【APIO2015】Jakarta Skyscrapers的更多相关文章

  1. 【APIO2015】Jakarta Skyscrapers

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

  2. UOJ#110. 【APIO2015】Bali Sculptures 贪心 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ110.html 题解 我们发现n=2000 的子任务保证A=1! 分两种情况讨论: $n\leq 100$ ...

  3. UOJ#110. 【APIO2015】Bali Sculptures

    印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 YiYi 年 ...

  4. uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)

    [题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...

  5. uoj #5. 【NOI2014】动物园 kmp

    #5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日 ...

  6. UOJ #148. 【NOIP2015】跳石头 二分

    #148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...

  7. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  8. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

  9. UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树

    [NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...

随机推荐

  1. dd命令的解释

    dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. if=文件名:输入 ...

  2. http响应chunked格式分析

    有的时候服务器生成HTTP回应是无法确定信息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码. 在进行Chunked编码传输时 ...

  3. seureCRT快捷键

    前言    secureCRT 是一个非常不错的终端软件,在嵌入式开发过程中经常使用到,所以了解一下其快捷键操作是非常有必要的,可以提高开发效率. 复制:[ctrl] + [shift] + c 粘贴 ...

  4. Python IO 多路复用 \协程

    IO 多路复用 作用:  检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据) 即(可读/可写) IO请求时 解决并发  :  单线程 def get_data(key): cl ...

  5. leetcode796

    public class Solution { public bool RotateString(string A, string B) { string temp = A; int len = A. ...

  6. Struts2处理逻辑的方式

    1.可以统一写一个action 对应方法名处理不同逻辑 2.也可以分别写Action 分别处理不同的逻辑

  7. BurpSuite—-decoder模块(编码模块)

    一.简介 Burp Decoder是Burp Suite中一款编码解码工具,将原始数据转换成各种编码和哈希表的简单工具,它能够智能地识别多种编码格式采用启发式技术. 二.模块说明 通过有请求的任意模块 ...

  8. IdentityHashMap

    区别与其他的键不能重复的容器,IdentityHashMap允许key值重复,但是——key必须是两个不同的对象,即对于k1和k2,当k1==k2时,IdentityHashMap认为两个key相等, ...

  9. Directshow 采集音视频数据H264+AAC+rtmp效果还不错

    从usb摄像头或者采集卡中采集效果还是不错的.

  10. Jsp页面中的中文乱码问题解决

    Jsp页面中的中文乱码问题解决 在编写Jsp页面的时候,发现写入其中的中文在浏览器浏览的时候会出现乱码的情况. 出现乱码的原因分析: 因为页面中对自己的编码格式的声明和页面的实际编码格式不相同,而浏览 ...