http://www.lydsy.com/JudgeOnline/problem.php?id=4070

分块建图。

对每个\(P_i\)分类讨论,\(P_i>\sqrt N\)则直接连边,边数少于\(\sqrt N\)。

对每个横跨长度\(\leq\sqrt N\)的边,建一条“滑轨”,当\(P_i\leq\sqrt N\)时则把这个点送到滑轨上,可以到任何一个位置下来。一共要建\(\sqrt N\)条滑轨。

最后跑最短路就可以了,uoj上死活过不了hack数据,貌似过了的都没有建图?

时间复杂度\(O(n\sqrt n)\),如果spfa是\(O(m)\)的话。

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 30003;
const int B = 113;
const int Qtot = N * B - 1; int nxt[N * B * 5], to[N * B * 5], w[N * B * 5];
int point[N * B], cnt = 0, n, m, S[N], P[N]; void ins(int u, int v, int W) {
nxt[++cnt] = point[u]; to[cnt] = v; w[cnt] = W; point[u] = cnt;
} bool inq[N * B];
int dist[N * B], tot;
queue <int> qu; int spfa(int s, int t) {
memset(dist, 127, sizeof(int) * (tot + 1));
dist[s] = 0;
int u, v, di; qu.push(s); inq[s] = true;
while (!qu.empty()) {
inq[u = qu.front()] = false; qu.pop();
for (int i = point[u]; i; i = nxt[i]) {
v = to[i];
if ((di = dist[u] + w[i]) < dist[v]) {
dist[v] = di;
if (!inq[v]) {
inq[v] = true;
qu.push(v);
}
}
}
}
return dist[t] == dist[0] ? -1 : dist[t];
} int main() {
scanf("%d%d", &n, &m);
int Si, Pi; tot = B * n; int tt = n;
for (int i = 1; i < B; ++i)
for (int j = 1; j <= n; ++j)
ins(++tt, j, 0); for (int i = 1; i < B; ++i)
for (int j = 1; j <= i; ++j) {
int tmp = j + i, st = i * n;
while (tmp <= n) {
ins(st + tmp - i, st + tmp, 1);
ins(st + tmp, st + tmp - i, 1);
tmp += i;
}
} for (int i = 1; i <= m; ++i) {
scanf("%d%d", &Si, &Pi);
S[i] = ++Si; P[i] = Pi;
if (Pi >= B) {
for (int tmp = Si + Pi, j = 1; tmp <= n; tmp += Pi, ++j)
ins(Si, tmp, j);
for (int tmp = Si - Pi, j = 1; tmp >= 1; tmp -= Pi, ++j)
ins(Si, tmp, j);
} else
ins(Si, Pi * n + Si, 0);
} printf("%d\n", spfa(S[1], S[2]));
return 0;
}

【BZOJ 4070】【APIO 2015】雅加达的摩天楼的更多相关文章

  1. [APIO 2015] 雅加达的摩天楼

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4070 [算法] 考虑将每个"Doge"向其所能到达的楼连边 直接 ...

  2. 解题:APIO 2015 雅加达的摩天大楼

    题面 分块思想+最短路 发现对于步长小的doge会连出很多边,很容易导致大量的重边,于是对doge们根据步长分块讨论:根据步长建出分层图,然后把步长不超过某个值的doge们连到对应层上的点上,其余的d ...

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

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

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

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

  5. 【CTSC 2015】&【APIO 2015】酱油记

    蒟蒻有幸参加了神犇云集的CTSC & APIO 2015,感觉真是被虐成傻逼了……这几天一直没更新博客,今天就来补一下吧~~(不过不是题解……) Day 0 从太原到北京现在坐高铁只需3小时= ...

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

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

  7. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  8. [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会

    [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...

  9. luogu_3645: 雅加达的摩天楼

    雅加达的摩天楼 题意描述: 有\(N\)座摩天楼,从左到右依次编号为\(0\)到\(N-1\). 有\(M\)个信息传递员,编号依次为\(0\)到\(M-1\).编号为i的传递员最初在编号为\(B_i ...

  10. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

随机推荐

  1. JavaScript 字符串操作:substring, substr, slice

    在 JavaScript 中,对于字符串的操作有 substring, substr, slice 等好多个内置函数,这里给大家推荐一篇介绍 substring, substr, slice 三者区别 ...

  2. 引用类型 ( 对象定义 )——Date 类型

    本文地址:http://www.cnblogs.com/veinyin/p/7607743.html  1 创建日期对象 var date = new Date(); 2 可以给日期对象传值 2.1 ...

  3. 在iOS开发中如何播放视频

     技术博客http://www.cnblogs.com/ChenYilong/  新浪微博http://weibo.com/luohanchenyilong  如何播放视频 •iOS提供了叫做MPMo ...

  4. MQTT协议及推送服务

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ...

  5. JAVA 企业培训

  6. Oracle笔记之序列(Sequence)

    Oracle中序列是一种数据对象,可以视为一个等差数列,我们自增就是一个遍历这个数列的过程,可以取当前值,也可以将当前值自加n后返回,Sequence与表没有太大的关系,有的时候如果表的主键是数值类型 ...

  7. php常用函数——数组函数

    php常用函数——数组函数

  8. 004_Gradle 笔记——Java构建入门

    Gradle是一个通用的构建工具,通过它的构建脚本你可以构建任何你想要实现的东西,不过前提是你需要先写好构建脚本的代码.而大部分的项目,它 们的构建流程基本是一样的,我们不必为每一个工程都编写它的构建 ...

  9. CSU 1412 Line and Circles

    原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1412 题目要求判断是否有一条直线可以穿过所有的圆. 做法:把所有圆心做一次凸包,然后判断 ...

  10. MVC – 15.路由机制

    15.1.路由检测插件 - RouteDebug 15.2.路由约束 15.3.命名路由 15.4.验证码 15.5.ASP.NET MVC 与 三层架构 15.6.Area区域 15.6.1.尝试将 ...