BZOJ 4070 [Apio2015]雅加达的摩天楼 ——分块 SPFA
挺有趣的分块的题目。
直接暴力建边SPFA貌似是$O(nm)$的。
然后考虑分块,$\sqrt n$一下用虚拟节点辅助连边,
以上的直接暴力连边即可。
然后卡卡时间,卡卡空间。
终于在UOJ上T掉辣。
遂弃疗
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define inf 0x3f3f3f3f
#define maxn 30005int n,m,b[maxn],p[maxn],cnt=0;
int num[maxn][101],T,s,t;
int h[maxn*101],to[maxn*500],ne[maxn*500],en=0,dis[maxn*101];
int w[maxn*500],inq[maxn*101];
queue <int> q;
void add(int a,int b,int c)
{to[en]=b;ne[en]=h[a];w[en]=c;h[a]=en++;}void SPFA()
{memset(dis,0x3f,sizeof dis);dis[s]=0;inq[s]=1;q.push(s);while (!q.empty()){int x=q.front();q.pop();inq[x]=0;for (int i=h[x];i>=0;i=ne[i])if (dis[to[i]]>dis[x]+w[i]){dis[to[i]]=dis[x]+w[i];if (!inq[to[i]]){inq[to[i]]=1;q.push(to[i]);}}}if (dis[t]!=inf) printf("%d\n",dis[t]);else printf("-1\n");return;
}int read()
{int x=0,f=1; char ch=getchar();while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}int main()
{memset(h,-1,sizeof h);n=read();m=read();T=min((int)sqrt(n),100);cnt=n;F(i,1,n) F(j,1,T) num[i][j]=++cnt;F(i,1,m) b[i]=read(),p[i]=read(),b[i]++;s=b[1];t=b[2];F(i,1,n) F(j,1,T){if (i+j<=n) add(num[i][j],num[i+j][j],1);if (i-j>0) add(num[i][j],num[i-j][j],1);add(num[i][j],i,0);}F(i,1,m){if (p[i]<=T) add(b[i],num[b[i]][p[i]],0);else{for (int j=1;b[i]+j*p[i]<=n;j++) add(b[i],b[i]+j*p[i],j);for (int j=1;b[i]-j*p[i]>=1;j++) add(b[i],b[i]-j*p[i],j);}}SPFA();return 0;
}
转载于:https://www.cnblogs.com/SfailSth/p/6776435.html
BZOJ 4070 [Apio2015]雅加达的摩天楼 ——分块 SPFA相关推荐
- bzoj 4070: [Apio2015]雅加达的摩天楼 最短路+分块
题意 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 "doge&quo ...
- bzoj4070 [Apio2015]雅加达的摩天楼 分块+spfa
Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 " ...
- 4070: [Apio2015]雅加达的摩天楼
4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 415 Solved: 146 [ Submit ...
- 【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 ...
- [APIO2015] 雅加达的摩天楼
link 考虑暴力,每个狗直接向他能到达的点连一条以到达时间为边权的边,然后跑$spfa$即可,建变数量$N\times M$ 但是$N \leq 30000,M \leq 30000$,所以优化建图 ...
- P3645/BZOJ4070 [APIO2015]雅加达的摩天楼
显然任意一种doge都只会单向行走且最多使用一次. 假设p<=√n,那么总状态不超过n√n; 假设p>√n,因为任意一个doge行走不超过n/p<√n步,总状态不超过m√n. 于是暴 ...
最新文章
- 在思科模拟器下搭建WWW、DNS、FTP、Email服务
- 数据结构1:单链表反转java代码解释
- Unity3D学习笔记之二资源导入以及工程管理
- 设计模式:原型模式(C++)【克隆羊多莉】
- 谷歌为什登不上去github_安卓开源是假的,谷歌随时禁用,华为手机在海外市场已经快跌没了...
- 高甜预警|甜齁你的情人节促销海报设计模板
- Linux RT(1)-硬实时Linux(RT-Preempt Patch)在PC上的编译、使用和测试
- 流形学习t-SNE,LLE,Isomap
- SQL Server 2008 示例库 AdventureWorks2008R2
- 进程的初步认识(程序与进程、并发、单道程序设计、多道程序设计、CPU、MMU)
- 微信支付开发(1)--普通商户申请、账户验证、签约、公众号授权流程详解
- 桌面图标计算机图标被禁用,电脑桌面图标常见问题
- 获取手机IMEI/ICCID/IMSI
- 华为Datacom认证介绍
- 专访民生银行:CPOS平台如何从线下布局移动支付
- 【Pyecharts】Python数据可视化:英雄联盟2020赛季数据全方位解读~
- 8个企业微信的功能,你知道几个,喜欢用哪个?
- 设计一个三维向量类,并实现向量的加法、减法以及向量与标量的乘法和除法运算。
- android 同根动画_Android(java)学习笔记141:Android下的逐帧动画(Drawable Animation)...
- 2016年十大商业领袖:敢于冒险,善于坚持,勇于自省
热门文章
- DCMTK:类DcmSequence和DcmPixelSequence的测试程序
- C语言删除链表的算法(附完整源码)
- OpenGL Texture Coordinate Wrapping纹理坐标包装的实例
- OpenGL linesmooth线平滑的实例
- OpenGL次表面散射
- C语言实现了一个顺序表(附完整源码)
- C++const修饰成员函数
- 计算机辅助测试英语缩写,“CAT”是“Computer-Aided Testing”的缩写,意思是“计算机辅助测试”...
- java 经典语录_JavaSpring过时的经典语录
- python数据库教程_Python连接mysql数据库及简单增删改查操作示例代码