UOJ 111 & BZOJ 4070 [Apio2015]雅加达的摩天楼
来源:互联网 发布:手甲钩淘宝 编辑:程序博客网 时间:2024/04/27 14:15
分块+最短路
我们把一个(有doge的)点连向所有它能到达的所有点,这样就是一个最短路问题。考虑优化建图,用分块。
如果
这样总边数
然后在UOJ上交了半天,在Extra Test 31上一直TLE,死活卡不过去。跑去BZOJ交,过了。跑回UOJ再交,突然就也过了???
#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define N 30005#define S 205using namespace std;namespace runzhe2000{ int n, m, s, t, ecnt, lim, last[N], vis[N], dis[N], inf, have[S][N]; struct edge{int next, to, val;}e[N*S<<1]; int read() { int r = 0; char c = getchar(); for(; c < '0' || c > '9'; c = getchar()); for(; c >='0' && c <='9'; r = r * 10 + c - '0', c = getchar()); return r; } void addedge(int a, int b, int c) { e[++ecnt] = (edge){last[a], b, c}; last[a] = ecnt; } struct data { int id, dis; bool operator < (const data &that) const {return dis < that.dis;} }h[N*S<<1]; int tot = 0; void heap_ins(data x) { h[++tot] = x; for(int i = tot, j = i >> 1; j; i = j, j >>= 1) if(h[i] < h[j]) swap(h[j], h[i]); else break; } void heap_pop() { h[1] = h[tot--]; for(int i = 1, j = 2; j <= tot; i = j, j <<= 1) { if(h[j|1] < h[j] && j < tot) j |= 1; if(h[j] < h[i]) swap(h[j], h[i]); else break; } } void dijkstra() { memset(dis, 63, sizeof(dis)); inf = dis[0]; heap_ins((data){s, dis[s] = 0}); for(; tot; ) { int x = h[1].id; heap_pop(); if(vis[x]) continue; vis[x] = 1; for(int i = last[x]; i; i = e[i].next) { int y = e[i].to; if(dis[x] + e[i].val < dis[y]) { dis[y] = dis[x] + e[i].val; heap_ins((data){y, dis[y]}); } } } } void main() { n = read(), m = read(); lim = sqrt((double)(n+1)); for(int i = 1; i <= m; i++) { int b = read(), p = read(); if(i == 1) s = b; if(i == 2) t = b; if(p > lim) { for(int j = b+p, s = 1; j < n; j += p, s++) addedge(b, j, s); for(int j = b-p, s = 1; j >= 0; j -= p, s++) addedge(b, j, s); } else have[p][b] = 1; } for(int j = 1; j <= lim; j++) { int *hj = have[j]; for(int i = 0; i < n; i++)if(hj[i]) { for(int k = i+j, s = 1; k < n; k += j, s++){addedge(i, k, s); if(hj[k])break;} for(int k = i-j, s = 1; k >= 0; k -= j, s++){addedge(i, k, s); if(hj[k])break;} } } dijkstra();printf("%d\n",dis[t]!=inf?dis[t]:-1); }}int main(){ runzhe2000::main();}
0 0
- UOJ 111 & BZOJ 4070 [Apio2015]雅加达的摩天楼
- 【BZOJ 4070】 [Apio2015]雅加达的摩天楼
- bzoj 4070: [Apio2015]雅加达的摩天楼
- 4070: [Apio2015]雅加达的摩天楼
- [SPFA 分块建图] BZOJ 4070 [Apio2015]雅加达的摩天楼
- bzoj 4070: [Apio2015]雅加达的摩天楼 最短路+分块
- bzoj4070【APIO2015】雅加达的摩天楼
- BZOJ4070: [Apio2015]雅加达的摩天楼
- BZOJ4070: [Apio2015]雅加达的摩天楼
- 【bzoj4070】【APIO2015】【雅加达的摩天楼】【最短路】
- 【bzoj4070】[Apio2015]雅加达的摩天楼 分块+最短路
- UOJ 112 & BZOJ 4071 [Apio2015]巴邻旁之桥
- APIO2015 UOJ 110-112
- [APIO] [最短路] [UOJ#111] APIO2015 Jakarta Skyscrapers
- 【BZOJ 4069】 [Apio2015]巴厘岛的雕塑
- bzoj 4069: [Apio2015]巴厘岛的雕塑
- APIO2015 UOJ #110 - #112 题解
- UOJ 110 [APIO2015]Bali Sculptures
- HDU
- 回调函数和发消息的作用比较
- 在android studio的虚拟机的sd卡上创建文件夹
- php项目学习
- HTML第一天
- UOJ 111 & BZOJ 4070 [Apio2015]雅加达的摩天楼
- OrangeUI之ListView的简单介绍
- 自定义Dialog(详细)
- android-4.0.3_r1源码下载和编译
- 如何确定I²C总线上拉电阻的阻值
- HTML学习第一段落结束
- spark厦大-----协同过滤算法 -- spark.mllib包
- Android应用开发学习笔记05--使用基本的UI控件
- 136. Single Number