[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 = ; struct edge
{
int to , w , nxt;
} e[]; 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 = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
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] = ;
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] : -;
} int main()
{ read(n); read(m);
block = min((int)sqrt(n) , );
for (int i = ; i <= block; ++i)
{
for (int j = i; j < n; ++j)
{
addedge(id(j , i) , id(j - i , i) , );
addedge(id(j - i , i) , id(j , i) , );
}
for (int j = ; j < n; ++j) addedge(id(j , i) , id(j , ) , );
}
for (int k = ; k <= m; ++k)
{
int Bi , Pi;
read(Bi); read(Pi);
if (Pi <= block) addedge(id(Bi , ) , id(Bi , Pi) , );
else
{
for (int i = Bi + Pi; i < n; i += Pi) addedge(id(Bi , ) , id(i , ) , (i - Bi) / Pi);
for (int i = Bi - Pi; i >= ; i -= Pi) addedge(id(Bi , ) , id(i , ) , (Bi - i) / Pi);
}
if (k == ) S = id(Bi , );
if (k == ) T = id(Bi , );
}
printf("%d\n" , SPFA()); return ; }
[APIO 2015] 雅加达的摩天楼的更多相关文章
- 解题:APIO 2015 雅加达的摩天大楼
题面 分块思想+最短路 发现对于步长小的doge会连出很多边,很容易导致大量的重边,于是对doge们根据步长分块讨论:根据步长建出分层图,然后把步长不超过某个值的doge们连到对应层上的点上,其余的d ...
- 【CTSC 2015】&【APIO 2015】酱油记
蒟蒻有幸参加了神犇云集的CTSC & APIO 2015,感觉真是被虐成傻逼了……这几天一直没更新博客,今天就来补一下吧~~(不过不是题解……) Day 0 从太原到北京现在坐高铁只需3小时= ...
- 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 座摩天楼 ...
- BZOJ 4070:[APIO2015]雅加达的摩天楼 最短路
4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 464 Solved: 164[Submit][Sta ...
- luogu_3645: 雅加达的摩天楼
雅加达的摩天楼 题意描述: 有\(N\)座摩天楼,从左到右依次编号为\(0\)到\(N-1\). 有\(M\)个信息传递员,编号依次为\(0\)到\(M-1\).编号为i的传递员最初在编号为\(B_i ...
- 【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)
[题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是\(O(n^2)\)的过不去 然而我们有一个优化的办法,可以建一个新图\(G=( ...
- luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治
LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...
- 【BZOJ 4070】【APIO 2015】雅加达的摩天楼
http://www.lydsy.com/JudgeOnline/problem.php?id=4070 分块建图. 对每个\(P_i\)分类讨论,\(P_i>\sqrt N\)则直接连边,边数 ...
随机推荐
- 【转载】Linux下套接字学习
感觉这个系列还不错,学习一下. 先看的是第三篇: http://blog.csdn.net/gatieme/article/details/46334337 < Linux下套接字详解(三)-- ...
- Linux进程调度(3):进程切换分析
3.调度函数schedule()分析 当kernel/sched.c:sched_tick()执行完,并且时钟中断返回时,就会调用kernel/sched.c:schedule()完成进程切换.我们 ...
- Geometry Shader 【转】
Geometry shader – receives as its input complete primitives as a collection of vertices, and these i ...
- 转:android studio入门合集
http://blog.csdn.net/column/details/zsl-androidstudio.html
- 使用fuser命令kill一个终端(特殊文件)的方法
/********************************************************************* * Author : Samson * Date ...
- MySQL 下优化SQL语句的一些经验
http://java-guru.iteye.com/blog/143377
- 关于 ++x 和 x++ 比较难的一个例子
public class testMain { static{ int x = 5;//如果后面有static int x, 前面的定义就没有用x会被重新定义为0 } static int y; st ...
- bluedroid源代码分析之ACL包发送和接收(一)
很多其它内容请參照我的个人网站: http://stackvoid.com/ ACL 链路在 Bluetooth 中很重要,一些重要的应用如 A2DP, 基于 RFCOMM 的应用,BNEP等都要建立 ...
- Fedora 25/24/23 nVidia Drivers Install Guide
https://www.if-not-true-then-false.com/2015/fedora-nvidia-guide/ search Most Popular Featured Linux ...
- php把时间存入数据库为年月日时分秒类型
时间用now() $sql1 = "insert into registerip (name,logintime,ip,url) values ('1211121',now(),'127.0 ...