bzoj 4152[AMPPZ2014]The Captain

给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。

一开始我居然把这个取min看成取曼哈顿距离。。

暴力建图是\(n^2\)

考虑两个点,可以以\(|x_1-x_2|\)和\(|y_1-y_2|\)为权值分别建图,在跑最短路的时候也不会去走那条权值大的边,这样就不用再管\(\min\)了

以以\(|x_1-x_2|\)为权值加边为例,有三个点\(i\),\(j\),\(k\),\(x_i\leq x_j\leq x_k\),则\(dis(i,k)=dis(i,j)+dis(j,k)\),所以只要把n个点按x排序,只把相邻两个点建一条边就行了

以\(|y_1-y_2|\)为权值时同理

最后跑一遍最短路

code.

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<iomanip>
  6. #include<cstring>
  7. #define R register
  8. #define EN std::puts("")
  9. #define LL long long
  10. inline int read(){
  11. int x=0,y=1;
  12. char c=std::getchar();
  13. while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
  14. while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
  15. return y?x:-x;
  16. }
  17. struct point{
  18. int x,y,id;
  19. }a[200006];
  20. int n;
  21. int fir[200006],nex[800006],to[800006],w[800008],tot;
  22. LL dis[200006];int in[200006];
  23. int dui[200006],size;
  24. inline void push(int x){
  25. dui[size++]=x;
  26. R int i=size-1,fa;
  27. while(i){
  28. fa=i>>1;
  29. if(dis[dui[fa]]<=dis[dui[i]]) return;
  30. std::swap(dui[fa],dui[i]);i=fa;
  31. }
  32. }
  33. inline int pop(){
  34. int ret=dui[0];dui[0]=dui[--size];
  35. R int i=0,ls,rs;
  36. while((i<<1)<size){
  37. ls=i<<1;rs=ls|1;
  38. if(rs<size&&dis[dui[rs]]<dis[dui[ls]]) ls=rs;
  39. if(dis[dui[ls]]>=dis[dui[i]]) break;
  40. std::swap(dui[ls],dui[i]);i=ls;
  41. }
  42. return ret;
  43. }
  44. inline int cmpx(point aa,point bb){return aa.x<bb.x;}
  45. inline int cmpy(point aa,point bb){return aa.y<bb.y;}
  46. inline void add(int x,int y,int z){
  47. to[++tot]=y;w[tot]=z;
  48. nex[tot]=fir[x];fir[x]=tot;
  49. }
  50. inline void dij(){
  51. std::memset(dis,0x3f,sizeof dis);
  52. dis[1]=0;push(1);in[1]=1;
  53. while(size){
  54. R int u=pop();in[u]=0;
  55. for(R int i=fir[u];i;i=nex[i]){
  56. R int v=to[i];
  57. if(dis[v]>dis[u]+w[i]){
  58. dis[v]=dis[u]+w[i];
  59. if(!in[v]) push(v),in[v]=1;
  60. }
  61. }
  62. }
  63. }
  64. int main(){
  65. n=read();
  66. for(R int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(),a[i].id=i;
  67. std::sort(a+1,a+1+n,cmpx);
  68. for(R int i=1;i<n;i++)
  69. add(a[i].id,a[i+1].id,a[i+1].x-a[i].x),
  70. add(a[i+1].id,a[i].id,a[i+1].x-a[i].x);
  71. std::sort(a+1,a+1+n,cmpy);
  72. for(R int i=1;i<n;i++)
  73. add(a[i].id,a[i+1].id,a[i+1].y-a[i].y),
  74. add(a[i+1].id,a[i].id,a[i+1].y-a[i].y);
  75. dij();
  76. std::printf("%lld",dis[n]);
  77. return 0;
  78. }

bzoj 4152[AMPPZ2014]The Captain的更多相关文章

  1. 循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain

    循环队列基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,fr ...

  2. BZOJ 4152: [AMPPZ2014]The Captain( 最短路 )

    先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就dijkstra ---------------------------------------------- ...

  3. BZOJ 4152: [AMPPZ2014]The Captain Dijkstra+贪心

    Code: #include <queue> #include <cstdio> #include <cstring> #include <algorithm ...

  4. 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2107  Solved: 820[Submi ...

  5. 4152: [AMPPZ2014]The Captain

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1561  Solved: 620[Submi ...

  6. bzoj4152[AMPPZ2014]The Captain 最短路

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1517  Solved: 603[Submi ...

  7. BZOJ4152 AMPPZ2014 The Captain 【最短路】【贪心】*

    BZOJ4152 AMPPZ2014 The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点 ...

  8. 【BZOJ4152】[AMPPZ2014]The Captain 最短路

    [BZOJ4152][AMPPZ2014]The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1 ...

  9. [BZOJ 4152][AMPPZ 2014]The Captain

    这道题对费用的规定是min(|x1-x2|,|y1-y2|).如果暴力枚举所有的点复杂度O(n²),n <= 200000,显然爆炸.于是我们要考虑加“有效边”,一个显然的事实是对于两个点,如果 ...

随机推荐

  1. Visual Studio2000系列版本安装OpenGL可以这么简单!

    是啥 直接上图 [翻译过来]这个库将各种库添加到您的项目中,这些库在x86和x64架构上构建OpenGL应用程序所必需的.包括FreeGLUT,GLFW和GLEW.也就是说,大家常用的几个OpenGL ...

  2. Java第二十一天,集合三大接口Set、List、Map的新方法——of方法

    of public static List<E> of(E.....e) 这是jdk 9推出的一个针对于Set,List,Map三大集合接口的新方法. 注意: 是静态方法. 只适用于Set ...

  3. WordPress文章阅读量统计和显示(非插件, 刷新页面不累加)

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. WordPress文章阅读 ...

  4. 理解class.forName() ---使用jdbc方式链接数据库时会经常看到这句代码

    目录(?)[-] 官方文档 类装载 两种装载方法的区别 不同的类装载器 是否实例化类 在jdbc链接数据库中的应用 资源   原文地址:http://yanwushu.sinaapp.com/clas ...

  5. JS生成随机颜色(rgb)

    /*随机获取颜色*/ function getRandomColor() { var r = Math.floor(Math.random() * 256); var g = Math.floor(M ...

  6. Julia基础语法复数和分数

     1.复数   2.分数

  7. L24 word2vec

    词嵌入基础 我们在"循环神经网络的从零开始实现"一节中使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择.一个主要的原因是,one-hot 词向量无 ...

  8. Daily Scrum 1/4/2015

    Process: After New year's Day, we start our project in plan. Zhanyang: Add some useful UI in the IOS ...

  9. 原创zookeeper3.4.6集群安装

    tar -zxvf zookeeper-3.4.6.tar.gz -C /home/hadoop/ vi ~/.bash_profile export ZOOKEEPER_HOME=/home/had ...

  10. php7.2.1+redis3.2.1 安装redis扩展(windows系统)

    前提:已成功安装PHP环境和Redis服务 下面进入正题: 第一步,下载redis驱动扩展文件,注意:需要根据上面信息下载对应版本 https://windows.php.net/downloads/ ...