[APIO2015] 雅加达的摩天楼 (分块,最短路)
题目链接
Solution
分块+\(Dijkstra\).
难点在于建边,很明显 \(O(n^2)\) 建边会挂一堆 .
那么考虑一下, \(n^2\) 建边多余的是哪些东西 \(???\)
很显然是冗杂的边,即两个点在之前已经可以互达了,但是在这一次仍然又连接一遍.
所以我们对于 \(n\) 个点都开 \(sqrt(n)\) 个辅助点.代表第 \(i\) 个点可以走出 \(j\) .
辅助点之间也需要与相邻的连上一条边权为 \(1\) 的边.
然后对于 \(m\) 个点分类讨论.
如果 \(p_i<sqrt(n)\)
那么在这 \(sqrt(n)\) 里面对应连边.如果 \(p_i>sqrt(n)\)
那么很显然他所连向的边一般不会有冗杂(大概率).所以直接暴力连边即可.
然后最后面跑一遍 \(Diskstra\) 即可.
注意距离要开 \(long~long\).
Code
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define rg register
#define num(x,y) x*n+y
using namespace std;
const int maxn=30008;
const int inf=0x3f3f3f3f;
struct sj{int to,next; ll w;}a[maxn*500];
int n,m,head[maxn*105],size,s,t,tmp;
int b[maxn],p[maxn];ll dis[maxn*105];
il void add(int x,int y,ll w)
{
a[++size].to=y;
a[size].next=head[x];
head[x]=size;
a[size].w=w;
}
il int read()
{
char ch=getchar();int f=1,w=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){w=w*10+ch-'0';ch=getchar();}
return f*w;
}
struct node{int u; ll d;
bool operator <(const node& kkk)const
{return d>kkk.d;}
};
il void Dijkstra()
{
priority_queue<node>q;
memset(dis,127,sizeof(dis));
q.push((node){s,0});
dis[s]=0;
while(!q.empty())
{
node x=q.top();q.pop();
int u=x.u;
for(int i=head[u];i;i=a[i].next)
{
int tt=a[i].to;
if(dis[tt]>dis[u]+a[i].w)
{
dis[tt]=dis[u]+a[i].w;
q.push((node){tt,dis[tt]});
}
}
}
return;
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;i++) b[i]=read()+1,p[i]=read();
s=b[1];t=b[2];
tmp=min((int)sqrt(n),100);
for(int i=1;i<=tmp;i++)
for(int j=1;j<=n;j++)
add(num(i,j),j,0);
for(int i=1;i<=tmp;i++)
for(int j=1;j<=n-i;j++)
add(num(i,j),num(i,j+i),1),
add(num(i,j+i),num(i,j),1);
for(int i=1;i<=m;i++)
{
if (p[i]<=tmp) add(b[i],num(p[i],b[i]),0);
else
{
for(ll j=1;b[i]+j*p[i]<=n;j++) add(b[i],b[i]+j*p[i],j);
for(ll j=1;b[i]-j*p[i]>=1;j++) add(b[i],b[i]-j*p[i],j);
}
}
Dijkstra();
cout<<(dis[t]>192608173?-1:dis[t])<<endl;
return 0;
}
[APIO2015] 雅加达的摩天楼 (分块,最短路)的更多相关文章
- 【BZOJ4070】[Apio2015]雅加达的摩天楼 set+最短路
[BZOJ4070][Apio2015]雅加达的摩天楼 Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼 ...
- luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治
LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...
- 洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)
传送门 这最短路的建图怎么和网络流一样玄学…… 一个最朴素的想法是从每一个点向它能到达的所有点连边,边权为跳的次数,然后跑最短路(然而边数是$O(n^2)$除非自创复杂度比spfa和dijkstra还 ...
- BZOJ 4070 [Apio2015]雅加达的摩天楼 ——分块 SPFA
挺有趣的分块的题目. 直接暴力建边SPFA貌似是$O(nm)$的. 然后考虑分块,$\sqrt n$一下用虚拟节点辅助连边, 以上的直接暴力连边即可. 然后卡卡时间,卡卡空间. 终于在UOJ上T掉辣. ...
- 【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)
[题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是\(O(n^2)\)的过不去 然而我们有一个优化的办法,可以建一个新图\(G=( ...
- BZOJ 4070:[APIO2015]雅加达的摩天楼 最短路
4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 464 Solved: 164[Submit][Sta ...
- bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图
[Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 644 Solved: 238[Submit][Status][D ...
- BZOJ4070 [Apio2015]雅加达的摩天楼 【分块 + 最短路】
题目链接 BZOJ4070 题解 考虑暴力建图,将每个\(B_i\)向其能到的点连边,复杂度\(O(\sum \frac{n}{p_i})\),当\(p\)比较小时不适用 考虑优化建图,每个\(dog ...
- 洛谷$P3645\ [APIO2015]$雅加达的摩天楼 最短路
正解:最短路 解题报告: 传送门$QwQ$ 考虑暴力连边,发现最多有$n^2$条边.于是考虑分块 对于长度$p_i$小于等于$\sqrt(n)$的边,建立子图$d=p_i$.说下关于子图$d$的定义? ...
随机推荐
- PopClip:你会热爱的文本穿梭机
http://www.ifanr.com/234952 由于我是一名 Evernote 用户(不是印象笔记),最近发现它所提供的浏览器插件无论是 Web Cliper 还是 Clearly,反应速度都 ...
- CPP-网络/通信:经典HTTP协议详解
2008-11-03 09:11 by Hundre, 266688 阅读, 23 评论, 收藏, 编辑 转自:http://blog.csdn.net/gueter/archive/2007/03/ ...
- 用requests爬取图片
# coding=utf-8 from bs4 import BeautifulSoup import requests import urllib x = 1 def crawl(url): res ...
- ovx openVirtex的阅读文档
由于flowvisor只有4个版本, 最新更新都是2013年的, 跟底层ovs版本不跟进, 最近斯坦福post一个 ovx, 猜测是flowvisor的加强版, 所以看一下文档说明 文档详见http: ...
- C#访问数组元素
在C#中,使用索引来访问数组元素.索引必须是一个整型值. 在数组中,每一个维度的索引从0开始. 一.访问一维数组元素 int[] array = {1,2,3,4,5,6,7,8,9,10}; // ...
- 文件下载(NSURLConnection/NSURLSession)
最基本的网络文件下载(使用原生的网络请求) #pragma mark - 小文件下载 // 方法一: NSData dataWithContentsOfURL - (void)downloadFile ...
- 【Python高级工程师之路】入门+进阶+实战+爬虫+数据分析整套教程
点击了解更多Python课程>>> 全网最新最全python高级工程师全套视频教程学完月薪平均2万 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加 ...
- PHP 日常开发过程中的bug集合(持续更新中。。。)
PHP 日常开发过程中的bug集合(持续更新中...) 在日常php开发过程中,会遇到一些意想不到的bug,所以想着把这些bug记录下来,以免再犯! 1.字符串 '0.00'.'0.0'.'0' 是 ...
- 14-15.Yii2.0模型的创建/读取数据使用,框架防止sql注入
目录 创建数据库 表article 配置 db.php 连接数据库 创建控制器 HomeController.php 创建models 创建数据库 表article 1.创建库表 CREATE TAB ...
- GoF23种设计模式之行为型模式之访问者模式
概述 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依 ...