此题卡Dijkstra...

Code:

  1. #include <bits/stdc++.h>
  2. #define N 30005
  3. #define M 4000000
  4. #define ll long long
  5. #define inf 100000000
  6. #define E 14300000
  7. #define setIO(s) freopen(s".in","r",stdin)
  8. using namespace std;
  9. ll d[M];
  10. int n,m,block,cnt,edges,s,t;
  11. int id[N][103],hd[M],to[E],nex[E],val[E],done[M];
  12. struct Node
  13. {
  14. int u;
  15. ll dis;
  16. Node(int u=0,ll dis=0):u(u),dis(dis){}
  17. bool operator<(Node b) const
  18. {
  19. return b.dis<dis;
  20. }
  21. };
  22. priority_queue<Node>q;
  23. void add(int u,int v,int c)
  24. {
  25. // ++edges;
  26. nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
  27. }
  28. void Dijkstra()
  29. {
  30. memset(d,0x3f,sizeof(d));
  31. for(d[s]=0,q.push(Node(s,0));!q.empty();)
  32. {
  33. Node e=q.top(); q.pop();
  34. int u=e.u;
  35. if(done[u]) continue;
  36. done[u]=1;
  37. for(int i=hd[u];i;i=nex[i])
  38. {
  39. int v=to[i];
  40. if(d[v]>d[u]+val[i])
  41. {
  42. d[v]=d[u]+val[i];
  43. q.push(Node(v, d[v]));
  44. }
  45. }
  46. }
  47. }
  48. int main()
  49. {
  50. int i,j,k;
  51. // setIO("input");
  52. scanf("%d%d",&n,&m);
  53. block=min(100,(int)sqrt(n));
  54. cnt = n + 23;
  55. for(i=1;i<=block;++i)
  56. {
  57. for(j=0;j<i;++j)
  58. {
  59. for(k=j;k<n;k+=i)
  60. {
  61. id[k][i]=++cnt;
  62. add(cnt,k,0);
  63. if(k>=i)
  64. add(cnt-1,cnt,1), add(cnt,cnt-1,1);
  65. }
  66. }
  67. }
  68. for(i=1;i<=m;++i)
  69. {
  70. int a,b;
  71. scanf("%d%d",&a,&b);
  72. if(i==1) s=a;
  73. if(i==2) t=a;
  74. if(b<=block)
  75. add(a, id[a][b], 0);
  76. else
  77. {
  78. int tt=0;
  79. for(j=a-b;j>=0;j-=b) add(a,j,++tt);
  80. tt=0;
  81. for(j=a+b;j<n;j+=b) add(a,j,++tt);
  82. }
  83. }
  84. // printf("%d %d\n",cnt,edges);
  85. Dijkstra();
  86. printf("%lld\n",d[t]>=inf?-1:d[t]);
  87. return 0;
  88. }

  

BZOJ 4070: [Apio2015]雅加达的摩天楼 根号分治+spfa的更多相关文章

  1. BZOJ 4070:[APIO2015]雅加达的摩天楼 最短路

    4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 164[Submit][Sta ...

  2. bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图

    [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 644  Solved: 238[Submit][Status][D ...

  3. BZOJ 4070 [Apio2015]雅加达的摩天楼 ——分块 SPFA

    挺有趣的分块的题目. 直接暴力建边SPFA貌似是$O(nm)$的. 然后考虑分块,$\sqrt n$一下用虚拟节点辅助连边, 以上的直接暴力连边即可. 然后卡卡时间,卡卡空间. 终于在UOJ上T掉辣. ...

  4. bzoj 4070: [Apio2015]雅加达的摩天楼【spfa】

    明明是个最短路却有网络流一样的神建图= A = 首先要是暴力建图的话最坏有O(nm)条边.所以优化建图. 考虑分块思想,设bs=sqrt(n),对于p大于bs的,直接连边即可,最多有sqrt(n)条, ...

  5. 4070: [Apio2015]雅加达的摩天楼

    Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼.   有 M 只叫做 “do ...

  6. 【BZOJ4070】[Apio2015]雅加达的摩天楼 set+最短路

    [BZOJ4070][Apio2015]雅加达的摩天楼 Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼 ...

  7. 【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)

    [题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是\(O(n^2)\)的过不去 然而我们有一个优化的办法,可以建一个新图\(G=( ...

  8. luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治

    LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...

  9. [APIO2015]雅加达的摩天楼

    Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 " ...

随机推荐

  1. JVM学习(一)Java虚拟机运行时数据区域

    一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数 ...

  2. ubuntu 忘记密码如何 修改密码

    ubuntu 忘记密码如何 修改密码 这个链接讲的很不错 https://blog.csdn.net/zd147896325/article/details/81664558 本来我只是玩一玩,但是我 ...

  3. AC自动机fail树上dfs序建线段树+动态memset清空

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=4117 思路:https://blog.csdn.net/u013306830/article/detail ...

  4. nginx浏览器开启密码验证

    如果我们在 nginx 下搭建了一些站点,但是由于站点内容或者流量的关系,我们并不想让所有人都能正常访问,那么我们可以设置访问认证.只有让用户输入正确的用户名和密码才能正常访问.效果如下: 在 ngi ...

  5. java对象序列化并存储到文件中

    ● 如何将一个Java对象序列化到文件里 使用输入输出流,,一个是ObjectOutputStream 对象,ObjectOutputStream 负责向指定的流中写入序列化的对象.当从文件中读取序列 ...

  6. react 管理平台

    https://open.vbill.cn/react-admin/ 开源中国:https://gitee.com/sxfad/react-admin.git GitHub:https://githu ...

  7. SQLServer · 最佳实践 · 如何将SQL Server 2012降级到2008 R2-博客-云栖社区-阿里云

    迁移须知 使用SQLSERVER 2012的特性在SQL 2008 R2不支持,比如新的分页方式 此迁移操作手册适用于MSSQL2012到MSSQL2008R2的迁移 迁移使用微软提供的脚本生成和导入 ...

  8. 为Vim 添加vimgdb支持

    为Vim 添加vimgdb支持 1.    下载最新的vim74的源码包 wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 2.下载vimgdb- ...

  9. 在windows部署service

    首先,需要在环境变量的path中加入Install Util的路径: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 注意这里的Framework\v2.0 ...

  10. ORACLE_笔记_练习题目

    一.plsql用法网址及时复习 extract()函数----用于截取年.月.日.时.分.秒 https://www.cnblogs.com/xqzt/p/4477239.html case when ...