4070: [Apio2015]雅加达的摩天楼
4070: [Apio2015]雅加达的摩天楼
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 415 Solved: 146
[ Submit][ Status][ Discuss]
Description
印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1。除了这 N 座摩天楼外,雅加达市没有其他摩天楼。
Input
输入的第一行包含两个整数 N 和 M。
Output
输出一行,表示所需要的最少步数。如果消息永远无法传递到 1 号 doge,输出 −1。
Sample Input
0 2
1 1
4 1
Sample Output
explanation
下面是一种步数为 5 的解决方案:
0 号 doge 跳跃到 2 号摩天楼,再跳跃到 4 号摩天楼(2 步)。
0 号 doge 将消息传递给 2 号 doge。
2 号 doge 跳跃到 3 号摩天楼,接着跳跃到 2 号摩天楼,再跳跃到 1 号摩天楼(3 步)。
2 号 doge 将消息传递给 1 号 doge。
HINT
子任务
Source
[ Submit][ Status][ Discuss]
很容易想到用spfa解决 但是暴力建图是O(n^2)条边,TLE没商量-- 学习了网上的解法,对于p分块 如果p>=sqrt,那么这样的点暴力建边,一共nsqrt条 否则对于每栋摩天大楼,我们假象它真的变成一栋摩天大楼~ 对于每栋楼建sqrt层,第一层代表p = 1时的走法,第二层...... 最底层就代表doge居住的地方 对于楼上的每层,前后顺次连边,即第i个点的第k层向第i-k点的第k层及i+k点的第k层连边,权值为1 我们假象doge正常都是在最底层跳,一般是不上楼的,, 但是如果doge的p值很小,那么我们就让它先上楼再跳 这样建边一共nsqrt条
苟蒻第一发代码常数简直巨大。。。。去掉vector和pairing_heap_tag以后就跑得飞起了。。 迷之STL
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<bitset>
#include<algorithm>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#include<cmath>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;/*struct data{int x,y;data(){}data(int x,int y): x(x),y(y){}bool operator < (const data &B) const {return y > B.y;}
};*/struct E{int to,w;E(){}E(int to,int w): to(to),w(w){}
};const int maxn = 3E4 + 30;
const int maxm = maxn*450;
const int INF = ~0U>>1;
//typedef __gnu_pbds::priority_queue<data,less<data>,__gnu_pbds::pairing_heap_tag> Heap;int n,m,cnt,s,t,Sqrt,tot,dis[maxn*110],pos[110][maxn],tail[maxm],to[maxm],va[maxm],from[maxm];
bool inq[maxm];//Heap Q;
//Heap::point_iterator id[maxm];
queue <int> Q2;int getint()
{char ch = getchar();int ret = 0;while (ch < '0' || '9' < ch) ch = getchar();while ('0' <= ch && ch <= '9')ret = ret*10 + ch - '0',ch = getchar();return ret;
}void Add(int x,int y,int w)
{from[++tot] = tail[x];tail[x] = tot;to[tot] = y;va[tot] = w;
}void Build()
{for (int i = 1; i <= Sqrt; i++)for (int j = 0; j < i; j++)for (int k = j; k < n; k += i) {pos[i][k] = ++cnt;if (k - i >= 0) Add(cnt,cnt - 1,1);if (k + i < n) Add(cnt,cnt + 1,1);Add(cnt,k,0);}for (int i = 0; i < m; i++) {int B = getint(),P = getint();if (!i) s = B;if (i == 1) t = B;if (P > Sqrt) {int Nex = B + P,w = 1;while (Nex < n) {Add(B,Nex,w);Nex += P; ++w;} Nex = B - P; w = 1;while (Nex >= 0) {Add(B,Nex,w);Nex -= P; ++w;}}else Add(B,pos[P][B],0);}
}int main()
{//freopen("4070.in","r",stdin);//freopen("4070.out","w",stdout);cin >> n >> m;Sqrt = min((int)sqrt(n),100);cnt = n - 1;Build();for (int i = 0; i <= cnt; i++) dis[i] = INF;/*id[s] = Q.push(data(s,0));inq[s] = 1; dis[s] = 0; while (!Q.empty()) {data k = Q.top(); Q.pop();for (int i = 0; i < v[k.x].size(); i++) {int to = v[k.x][i].to;int w = v[k.x][i].w;if (dis[to] > dis[k.x] + w) {dis[to] = dis[k.x] + w;if (!inq[to]) {inq[to] = 1;id[to] = Q.push(data(to,dis[to]));}else Q.modify(id[to],data(to,dis[to]));}}}*/Q2.push(s);inq[s] = 1;dis[s] = 0;while (!Q2.empty()) {int k = Q2.front(); inq[k] = 0; Q2.pop();for (int i = tail[k]; i; i = from[i]) {int nex = to[i];int w = va[i];if (dis[nex] > dis[k] + w) {dis[nex] = dis[k] + w;if (!inq[nex]) Q2.push(nex),inq[nex] = 1;}}}if (dis[t] < INF) cout << dis[t];else cout << -1;return 0;
}
4070: [Apio2015]雅加达的摩天楼相关推荐
- bzoj 4070: [Apio2015]雅加达的摩天楼 最短路+分块
题意 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 "doge&quo ...
- BZOJ 4070 [Apio2015]雅加达的摩天楼 ——分块 SPFA
挺有趣的分块的题目. 直接暴力建边SPFA貌似是$O(nm)$的. 然后考虑分块,$\sqrt n$一下用虚拟节点辅助连边, 以上的直接暴力连边即可. 然后卡卡时间,卡卡空间. 终于在UOJ上T掉辣. ...
- 【BZOJ 4070】 [Apio2015]雅加达的摩天楼
4070: [Apio2015]雅加达的摩天楼 Time limit: 1000 ms Memory limit: 262144 KB Description The city of Jakarta ...
- 题解 P3645 【[APIO2015]雅加达的摩天楼】
题解 P3645 [[APIO2015]雅加达的摩天楼] 一看求最短先想dp,发现要考虑的状态和转移太多没法做. 再一看是从一个点往另一个点跳,可以考虑最短路. 直接建边会O(n^2) 优化:本题中, ...
- [APIO2015]雅加达的摩天楼
题目描述 印尼首都雅加达市有 NNN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 000 到 $N − 1$ .除了这 NNN 座摩天楼外,雅加达市没有其他摩天楼. 有 MMM 只叫做 ...
- 洛谷P3645 [APIO2015]雅加达的摩天楼
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N − 1.除了这 NN 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 "dog ...
- bzoj4070 [Apio2015]雅加达的摩天楼 分块+spfa
Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 " ...
- 【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 "doge&q ...
- [APIO2015] 雅加达的摩天楼
link 考虑暴力,每个狗直接向他能到达的点连一条以到达时间为边权的边,然后跑$spfa$即可,建变数量$N\times M$ 但是$N \leq 30000,M \leq 30000$,所以优化建图 ...
最新文章
- Android开发出现Warning:Gradle version 2.10 is required. Current version is 2.8
- Go性能测试benchmark
- 一种轻量级的C4C业务数据同步到S/4HANA的方式:Odata通知 1
- 工程数学(数值分析)第六讲:数值微积分
- window7 已经分好区的硬盘如何再次分区?
- Linux 3g上网卡 拨号,Ubuntu 3G上网卡拨号过程分析
- 语录:101条伟大的计算机编程名言
- Macbook使用技巧,分享必备
- 作业帮基于 Flink 的实时计算平台实践
- 渗透测试神器Nmap使用教程
- JS常用字符串方法复习
- 2021苹果AppleiOS开发证书申请详细图文流程
- VS2008 简体中文正式版序列号(到期解决办法)
- 关于计算机系调查问卷表,计算机系统调查问卷.xls
- Microsoft Visual Studio 注册码
- FlexRay网络唤醒、启动和错误管理
- matlab 里定义全局变量,常量
- mongodb 查询数据排序
- MacDroid for Mac v1.4 安卓手机文件传输助手
- Knife4j文档请求异常
热门文章
- 蓝桥杯——杨辉三角分析总结
- 数字万用表来测量三极管的极性和NPN、PNP的方法
- matlab画平面心形线,matlab三维心形线画法
- 手机搭建php环境,Almp——安卓系统上搭建本地php服务器环境
- 梅花雪Web Calendar ver 3.0 网页日历在asp.net 2.0的应用
- 《数据结构与算法》(十五)- 图的应用:有向无环图
- java maven程序包不存在_Maven install 报错程序包不存在问题的解决方法
- vue模仿新年集福活动(移动端)
- Pytorch的可视化工具visdom的基本使用
- 2021.2.4DataGrip中使用clickhouse 时区差了8小时