[题目链接]

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

[算法]

考虑将每个"Doge"向其所能到达的楼连边

直接SPFA求单源最短路可以获得57分

那么 , 怎样拿到满分呢?

我们发现这张图的边的数量达到了NM的数量级

考虑分块 , 将每个点拆成SQRT(N)个点

将每个Pi <= SQRT(N)的点向(Bi , Pi)连边 , 这样的边不会超过N * SQRT(N)条

将每个Pi > SQRT(N)的点向其所能到达的所有点连边 , 这样的边不会超过NlogN条

时间复杂度 : O(N ^ 2) , 实际远不能达到这个上限

[代码]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int inf = 1e9;
const int N = 6000050;struct edge
{int to , w , nxt;
} e[15000005];int n , m , block , tot , S , T;
int head[N] , dist[N];
bool inq[N];template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{T f = 1; x = 0;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';x *= f;
}
inline int id(int x , int y)
{return y * n + x;
}
inline void addedge(int u , int v , int w)
{++tot;e[tot] = (edge){v , w , head[u]};head[u] = tot;
}
inline int SPFA()
{queue< int > q;q.push(S);memset(dist , 0x3f , sizeof(dist));dist[S] = 0;inq[S] = true;while (!q.empty()){int cur = q.front();q.pop();inq[cur] = false;for (int i = head[cur]; i; i = e[i].nxt){int v = e[i].to , w = e[i].w;if (dist[cur] + w < dist[v]){dist[v] = dist[cur] + w;if (!inq[v]){inq[v] = true;q.push(v);        }        }        }                }return dist[T] != 0x3f3f3f3f ? dist[T] : -1;
}int main()
{read(n); read(m);block = min((int)sqrt(n) , 100);for (int i = 1; i <= block; ++i){for (int j = i; j < n; ++j){addedge(id(j , i) , id(j - i , i) , 1);addedge(id(j - i , i) , id(j , i) , 1);        }    for (int j = 0; j < n; ++j) addedge(id(j , i) , id(j , 0) , 0);}for (int k = 1; k <= m; ++k){int Bi , Pi;read(Bi); read(Pi);if (Pi <= block) addedge(id(Bi , 0) , id(Bi , Pi) , 0);    else{for (int i = Bi + Pi; i < n; i += Pi) addedge(id(Bi , 0) , id(i , 0) , (i - Bi) / Pi);for (int i = Bi - Pi; i >= 0; i -= Pi) addedge(id(Bi , 0) , id(i , 0) , (Bi - i) / Pi);}if (k == 1) S = id(Bi , 0);if (k == 2) T = id(Bi , 0);}printf("%d\n" , SPFA());return 0;}

转载于:https://www.cnblogs.com/evenbao/p/10549370.html

[APIO 2015] 雅加达的摩天楼相关推荐

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

    传送门 思路 正解 参考代码 Update 传送门 思路   唉,我太弱了,我都看出来要分块了,就是做不来.不过终于把题读对了.   先来看子任务三怎么做.显然可以有一个 O(m2) O ( m 2 ...

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

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

  3. [AOIP 2015] 雅加达的摩天楼

    题目描述: qwq- 题目分析: 其实就是个最短路啊,然后发现建的边最多会有 N2 N 2 N^2条- 所以我们考虑用分块的思想来优化建图. Pi>sqrt(n),暴力加入每一条边,每次最多sq ...

  4. 4070: [Apio2015]雅加达的摩天楼

    4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 415   Solved: 146 [ Submit ...

  5. 题解 P3645 【[APIO2015]雅加达的摩天楼】

    题解 P3645 [[APIO2015]雅加达的摩天楼] 一看求最短先想dp,发现要考虑的状态和转移太多没法做. 再一看是从一个点往另一个点跳,可以考虑最短路. 直接建边会O(n^2) 优化:本题中, ...

  6. bzoj4070【APIO2015】雅加达的摩天楼

    4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 189   Solved: 70 [ Submit] ...

  7. 【BZOJ 4070】 [Apio2015]雅加达的摩天楼

    4070: [Apio2015]雅加达的摩天楼 Time limit: 1000 ms Memory limit: 262144 KB Description The city of Jakarta ...

  8. [APIO2015]雅加达的摩天楼

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

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

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

最新文章

  1. 平年闰年c语言源代码,C语言平年闰年问题
  2. python3.7.2安装-Centos7.6,安装python3.7.2
  3. dos模式下切换电脑用户
  4. Linux内核 sysctl.conf 优化设置
  5. UA MATH567 高维统计 专题1 Supervised PCA Regression概述
  6. aix服务重启mysql_mysqld进程几分钟重启一次,如何解决?
  7. 部署在Netweaver应用上的Fiori缓存的调试
  8. 切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道
  9. python连载第十五篇~史上最全列表知识源码+答案
  10. python 字符串数组_python用法笔记(数组(list、touple、dict)、字符串)
  11. Python安装Pandas库
  12. iOS开发-XIB、Storyboard操作小技巧
  13. 一个非计算机专业的 软考中级 网络工程师考试之路
  14. archlinux 解决蓝牙无法连接问题
  15. 什么是动态代理?实际开发中如何使用?
  16. 大数据学习之路-Hadoop
  17. 论文浏览(27) Long-Term Feature Banks for Detailed Video Understanding
  18. 【basler】Chapter5:basler相机C#代码实现与详解
  19. 无人机技术在森林资源保护中的应用
  20. 2020-11-03Paderborn大学轴承数据集

热门文章

  1. android+so+upx,UPX压缩壳简介
  2. Spring Boot+WebSocket实现扫码登录
  3. 怎样知道自己身体缺少哪些维生素?
  4. echarts中使用散点图根据后端接口动态生成点,并根据点数据动态渲染点颜色
  5. 大咖实录 亲眼见到这么多优秀的人,压力真的很大—中国35岁以下科技创新青年35人名单发布
  6. Java实现 LeetCode 667 优美的排列 II(暴力)
  7. stata统计分析及行业应用案例分析_数据分析之路(二)——描述性统计分析和应用案例...
  8. 揭秘 | 阿里云IoT物联网平台亿级设备接入方案大揭秘
  9. Excel2016 逗号分隔一段数据
  10. linux c语言,gcc基于信号机制的程序抢占型调度,用linux编一个迷你操作系统,实现了多线程的功能