【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)
【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)
感觉分层图是个很灵活的东西
直接连边的话,边数是\(O(n^2)\)的过不去
然而我们有一个优化的办法,可以建一个新图\(G=(V,E)\)其中\(V\)和原图\(V\)一一对应且连接一个\(0\)边,此外每个点向V中的\(i+-d\)连边。
类似网络流的办法瞎建就行了。
过不了uoj
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int N=90;
struct DOGE{unsigned int b:16,p:16;}dg[2];
struct E{
unsigned int to:28,w:15;
E(){to=w=0;}
E(const int&t,const int&f){to=t; w=f;}
};
vector< vector<E> > e;
int n,m,cnt;
inline void add(const int&fr,const int&to,const int&w){
if(fr>=e.size()) e.resize(fr+1);
e[fr].push_back(E(to,w));
}
struct SUBGraph{
int begin;
SUBGraph(){begin=0;}
inline int operator[](int x){return begin+x;}
inline void gen(const int&d){
begin=cnt+1; cnt+=n;
for(int t=0;t<n;++t){
if(t+d<n) add(begin+t+d,begin+t,1);
if(t-d>=0) add(begin+t-d,begin+t,1);
add(begin+t,t,0);
}
}
}G[N];
vector<int> d;
/*
struct cmp{inline bool operator ()(const int&a,const int&b)const{return d[a]>d[b];}};
priority_queue<int,vector<int>,cmp> q;
*/
queue<int> q;
vector<bool> usd;
const int inf=1e9;
inline void bfs(){
d.resize(cnt+1);
usd.resize(cnt+1);
for(auto&t:d) t=inf;
d[dg[0].b]=0,q.push(dg[0].b);
while(q.size()){
int now=q.front();
usd[now]=0;
q.pop();
if(now==dg[1].b) continue;
for(const auto&t:e[now]){
if(d[t.to]>d[now]+t.w){
d[t.to]=d[now]+t.w;
if(!usd[t.to]) q.push(t.to),usd[t.to]=1;
}
}
}
}
int main(){
n=qr(); m=qr(); cnt=n-1;
for(int t=0,p,b;t<m;++t){
b=qr();p=qr();
if(t<2)dg[t].b=b,dg[t].p=p;
if(p>=N)
for(int i=p,k=1;i<n;i+=p,++k){
if(b-i>=0) add(b,b-i,k);
if(b+i< n) add(b,b+i,k);
}
else {
if(!G[p].begin) G[p].gen(p);
add(b,G[p][b],0);
}
}
bfs();
printf("%d\n",d[dg[1].b]==inf?-1:d[dg[1].b]);
return 0;
}
【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)的更多相关文章
- 洛谷P3645 [APIO2015]雅加达的摩天楼
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N − 1.除了这 NN 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神 ...
- luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治
LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...
- 洛咕 P3645 [APIO2015]雅加达的摩天楼
暴力连边可以每个bi向i+kdi连边权是k的边. 考虑这样的优化: 然后发现显然是不行的,因为可能还没有走到一个dog的建筑物就走了这个dog的边. 然后就有一个很妙的方法--建一个新的图,和原图分开 ...
- 洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)
传送门 这最短路的建图怎么和网络流一样玄学…… 一个最朴素的想法是从每一个点向它能到达的所有点连边,边权为跳的次数,然后跑最短路(然而边数是$O(n^2)$除非自创复杂度比spfa和dijkstra还 ...
- 洛谷$P3645\ [APIO2015]$雅加达的摩天楼 最短路
正解:最短路 解题报告: 传送门$QwQ$ 考虑暴力连边,发现最多有$n^2$条边.于是考虑分块 对于长度$p_i$小于等于$\sqrt(n)$的边,建立子图$d=p_i$.说下关于子图$d$的定义? ...
- luogu P3645 [APIO2015]雅加达的摩天楼
luogu 暴力? 暴力! 这个题有点像最短路,所以设\(f_{i,j}\)表示在\(i\)号楼,当前\(doge\)跳跃能力为\(j\)的最短步数,转移要么跳一步到\(f_{i+j,j}\)和\(f ...
- BZOJ4070 [Apio2015]雅加达的摩天楼 【分块 + 最短路】
题目链接 BZOJ4070 题解 考虑暴力建图,将每个\(B_i\)向其能到的点连边,复杂度\(O(\sum \frac{n}{p_i})\),当\(p\)比较小时不适用 考虑优化建图,每个\(dog ...
- bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图
[Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 644 Solved: 238[Submit][Status][D ...
- 【BZOJ4070】[Apio2015]雅加达的摩天楼 set+最短路
[BZOJ4070][Apio2015]雅加达的摩天楼 Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼 ...
随机推荐
- QT 获取系统时间
1.导入QTime #include <QTime> 2.定义QTime 对象接受当前时间 QTime t=QTime::currentTime(); t就是系统时间. 3.将t转化为st ...
- laravel 验证码手机与提交手机的验证?
假如我用自己的手机号码获得了验证码,然后在点击提交之前,更换了手机号一栏的input,用一个比如18888888888的手机号进行注册,用之前得到的验证码,是不是会出现注册成功的情况?是否应该考虑验证 ...
- 2016国产开源软件Top100(Q1)
2016国产开源软件Top100(Q1) 随着互联网的发展.开放标准的普及和虚拟化技术的应用等诸多IT新领域的创新及拓展,开源技术凭借其开放性.低成本.稳定性.灵活性.安全性和技术创新性等特点迅速走向 ...
- xml path 列转行实例
SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A.学生表B,要查询一个班级里有哪些学生?针对这个需 ...
- git的安装与命令行基本的使用
1.https://git-scm.com/ 点击这个网址进入git的官方网站 2,.进去里面会有提示,64位于32位的,根据自己的电脑安装 3 下载完了过后就直接安装,一般会安装在c盘里面 ,进入安 ...
- 深入java面向对象二:final关键字
文章内容源于对<疯狂java讲义>及<疯狂Java:突破程序员基本功的16课>学习和总结. 一. final成员变量 final 修饰变量时,表示该变量一旦获取了值就不可以改变 ...
- H3C NAT ALG
- POI 导入、导出Excel
POI,全称Apache POI,是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.项目地址:Apache POI - t ...
- Intellij Idea更换主题
<h1 class="title">Intellij Idea更换主题</h1> <!-- 作者区域 --> <div class=&qu ...
- codeforce 381 div2
---恢复内容开始--- C: 由mex函数性质可知 ,对任意一个区间,都需要从0开始依次填1,2直到填满,那么,所有区间最小mex的最大值取决于最短区间长度k. 构造a数组之需要从0-k-1依次填数 ...