Description

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

Input

第一行包含一个正整数n(2<=n<=200000),表示点数。
接下来n行,每行包含两个整数x[i],y[i](0<=x[i],y[i]<=10^9),依次表示每个点的坐标。

Output

一个整数,即最小费用。

Sample Input

5
2 2
1 1
4 5
7 1
6 7

Sample Output

2
 
 
又一道卡spfa的最短路题,学长HugeGun说用堆优dijkstra就好,但是我只会spfa,然后狂T,又以为有什么智障错误内心紧张无比。
分别根据横坐标和纵坐标排两次序,把每次排好序后相邻的连边(似乎以前有学长讲过?)。
最近连续遇到两道卡spfa的题了,或许真的应该学一学堆优dijkstra。
用SLF优化的spfa刚好卡过的代码:
  1. //Serene
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cstdio>
  7. #include<cmath>
  8. using namespace std;
  9. const int maxn=2e5+10,maxm=4e5+10;
  10. int n;
  11.  
  12. int aa;char cc;
  13. int read() {
  14. aa=0;cc=getchar();
  15. while(cc<'0'||cc>'9') cc=getchar();
  16. while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
  17. return aa;
  18. }
  19.  
  20. struct Node1{
  21. int pos,x;
  22. }node1[maxn];
  23.  
  24. struct Node2{
  25. int pos,x;
  26. }node2[maxn];
  27.  
  28. bool cmp1(const Node1& a,const Node1& b) {
  29. return a.x<b.x;
  30. }
  31.  
  32. bool cmp2(const Node2& a,const Node2& b) {
  33. return a.x<b.x;
  34. }
  35.  
  36. int fir[maxn],nxt[2*maxm],to[2*maxm],v[2*maxm],e=0;
  37. void add(int x,int y,int z) {
  38. to[++e]=y;nxt[e]=fir[x];fir[x]=e;v[e]=z;
  39. to[++e]=x;nxt[e]=fir[y];fir[y]=e;v[e]=z;
  40. }
  41.  
  42. int dis[maxn],zz[maxn];
  43. bool vis[maxn];
  44. void spfa() {
  45. for(int i=2;i<=n;++i) dis[i]=0x3f3f3f3f;
  46. int s=1,t=0,x,y,z,tot=1;
  47. dis[1]=0;zz[++t]=1;vis[1]=1;
  48. while(tot) {
  49. x=zz[s];s=(s+1)%maxn;vis[x]=0;tot--;
  50. for(y=fir[x];y;y=nxt[y]) {
  51. z=to[y];
  52. if(dis[z]<=dis[x]+v[y]) continue;
  53. dis[z]=dis[x]+v[y];
  54. if(!vis[z]) {
  55. vis[z]=1;tot++;
  56. if(dis[z]<=dis[zz[s]]) {
  57. s=(s-1+maxn)%maxn;
  58. zz[s]=z;
  59. }
  60. else {
  61. t=(t+1)%maxn;
  62. zz[t]=z;
  63. }
  64. }
  65. }
  66. }
  67. printf("%d",dis[n]);
  68. }
  69.  
  70. int main() {
  71. scanf("%d",&n);
  72. for(int i=1;i<=n;++i) {
  73. node1[i].pos=node2[i].pos=i;
  74. scanf("%d%d",&node1[i].x,&node2[i].x);
  75. }
  76. sort(node1+1,node1+n+1,cmp1);
  77. for(int i=1;i<n;++i) add(node1[i].pos,node1[i+1].pos,node1[i+1].x-node1[i].x);
  78. sort(node2+1,node2+n+1,cmp2);
  79. for(int i=1;i<n;++i) add(node2[i].pos,node2[i+1].pos,node2[i+1].x-node2[i].x);
  80. spfa();
  81. return 0;
  82. }

  

bzoj4152 The Captain的更多相关文章

  1. BZOJ4152 The Captain(dijkstra+巧妙建图)

    BZOJ4152 The Captain 题面很简洁: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 很明显 ...

  2. bzoj4152 The Captain (dijkstra)

    做dijkstra,但只需要贪心地把每个点连到它左边.右边.上边.下面的第一个点就可以了 #include<bits/stdc++.h> #define pa pair<int,in ...

  3. [题解] [BZOJ4152] The Captain

    题面 题解 将所有点根据

  4. $bzoj4152\ The\ Captain$ 最短路

    正解:最短路+优化连边 解题报告: 传送门$w$ 这种优化连边啥的真的好妙噢$QwQ$ 首先显然离散化下不说$QwQ$.然后对所有横坐标纵坐标分别建点,相邻两横坐标点相连,边权为离散前的坐标差.纵坐标 ...

  5. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下.Noip2007 树网的核:floyd,推出性质,暴力.Noip2008 笨小猴:模拟Noip2008 火柴棒等式:枚举Noip2008 传纸条:棋盘dpNoip2 ...

  6. 【BZOJ4152】The Captain(最短路)

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

  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. bzoj4152[AMPPZ2014]The Captain 最短路

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

随机推荐

  1. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  2. springcloud熔断器代码简单实现

    Feign包赖熔断器相关的包,所有不用再单独引用 1.在服务消费方的基础上修改,开启熔断机制, feign.hystrix.enabled=true 2.修改消费者调用的接口 package com. ...

  3. 如何在 Flink 1.9 中使用 Hive?

    Apache Flink 从 1.9.0 版本开始增加了与 Hive 集成的功能,用户可以通过 Flink 来访问 Hive 的元数据,以及读写 Hive 中的表.本文将主要从项目的设计架构.最新进展 ...

  4. 超干货!Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  5. LUOGU P1414 又是毕业季II

    题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业 ...

  6. 20190927 - 28 后觉 「雅礼Day3 - 4」

    我再不开$C++11$编译我就从三楼跳下去$$\text{%%%lsc}$$ Day3 -lm -O2 -std=c++ Before $Day3$? 全是$Subtask$? $\frac{1}{4 ...

  7. 关于python的元组操作

    关于元组: 元组和列表是类似的,但是元组中的数据是不可以修改的. 元组是一对 () 元组操作: 元组是不可以修改的所以对元组的操作极少 定义空元组(因为元组一旦创建,数据不可被修改,所以极少创建空元组 ...

  8. python基础--数据类型的常用方法1

    1.数字类型 整型 用途:存qq号,手机号,不带字母的身份证号... 进制转换: 二进制转十进制:10 -->  1*(2**1) + 0*(2**0) 2 八进制转十进制:  235  --& ...

  9. day37 01-上次课内容回顾

  10. ML面试1000题系列(81-90)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 81.已知一组数据的协方差矩阵P,下面关于主分量 ...