[APIO 2015] 雅加达的摩天楼
[题目链接]
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] 雅加达的摩天楼相关推荐
- Luogu 3645 [APIO 2015] 雅加达的摩天楼
传送门 思路 正解 参考代码 Update 传送门 思路 唉,我太弱了,我都看出来要分块了,就是做不来.不过终于把题读对了. 先来看子任务三怎么做.显然可以有一个 O(m2) O ( m 2 ...
- 解题:APIO 2015 雅加达的摩天大楼
题面 分块思想+最短路 发现对于步长小的doge会连出很多边,很容易导致大量的重边,于是对doge们根据步长分块讨论:根据步长建出分层图,然后把步长不超过某个值的doge们连到对应层上的点上,其余的d ...
- [AOIP 2015] 雅加达的摩天楼
题目描述: qwq- 题目分析: 其实就是个最短路啊,然后发现建的边最多会有 N2 N 2 N^2条- 所以我们考虑用分块的思想来优化建图. Pi>sqrt(n),暴力加入每一条边,每次最多sq ...
- 4070: [Apio2015]雅加达的摩天楼
4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 415 Solved: 146 [ Submit ...
- 题解 P3645 【[APIO2015]雅加达的摩天楼】
题解 P3645 [[APIO2015]雅加达的摩天楼] 一看求最短先想dp,发现要考虑的状态和转移太多没法做. 再一看是从一个点往另一个点跳,可以考虑最短路. 直接建边会O(n^2) 优化:本题中, ...
- bzoj4070【APIO2015】雅加达的摩天楼
4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 189 Solved: 70 [ Submit] ...
- 【BZOJ 4070】 [Apio2015]雅加达的摩天楼
4070: [Apio2015]雅加达的摩天楼 Time limit: 1000 ms Memory limit: 262144 KB Description The city of Jakarta ...
- [APIO2015]雅加达的摩天楼
题目描述 印尼首都雅加达市有 NNN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 000 到 $N − 1$ .除了这 NNN 座摩天楼外,雅加达市没有其他摩天楼. 有 MMM 只叫做 ...
- 洛谷P3645 [APIO2015]雅加达的摩天楼
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N − 1.除了这 NN 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 "dog ...
最新文章
- 平年闰年c语言源代码,C语言平年闰年问题
- python3.7.2安装-Centos7.6,安装python3.7.2
- dos模式下切换电脑用户
- Linux内核 sysctl.conf 优化设置
- UA MATH567 高维统计 专题1 Supervised PCA Regression概述
- aix服务重启mysql_mysqld进程几分钟重启一次,如何解决?
- 部署在Netweaver应用上的Fiori缓存的调试
- 切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道
- python连载第十五篇~史上最全列表知识源码+答案
- python 字符串数组_python用法笔记(数组(list、touple、dict)、字符串)
- Python安装Pandas库
- iOS开发-XIB、Storyboard操作小技巧
- 一个非计算机专业的 软考中级 网络工程师考试之路
- archlinux 解决蓝牙无法连接问题
- 什么是动态代理?实际开发中如何使用?
- 大数据学习之路-Hadoop
- 论文浏览(27) Long-Term Feature Banks for Detailed Video Understanding
- 【basler】Chapter5:basler相机C#代码实现与详解
- 无人机技术在森林资源保护中的应用
- 2020-11-03Paderborn大学轴承数据集
热门文章
- android+so+upx,UPX压缩壳简介
- Spring Boot+WebSocket实现扫码登录
- 怎样知道自己身体缺少哪些维生素?
- echarts中使用散点图根据后端接口动态生成点,并根据点数据动态渲染点颜色
- 大咖实录 亲眼见到这么多优秀的人,压力真的很大—中国35岁以下科技创新青年35人名单发布
- Java实现 LeetCode 667 优美的排列 II(暴力)
- stata统计分析及行业应用案例分析_数据分析之路(二)——描述性统计分析和应用案例...
- 揭秘 | 阿里云IoT物联网平台亿级设备接入方案大揭秘
- Excel2016 逗号分隔一段数据
- linux c语言,gcc基于信号机制的程序抢占型调度,用linux编一个迷你操作系统,实现了多线程的功能