20200216题目题解

这是一篇题解祭题解记,但一共就一道题目。(ROS菜大了)

题目如下:

The Captain

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

Input
第一行包含一个正整数n(<=n<=),表示点数。
接下来n行,每行包含两个整数x[i],y[i](<=x[i],y[i]<=^),依次表示每个点的坐标。 Output
一个整数,即最小费用。 Sample Input Sample Output
2 Time limit
20000 ms Memory limit
262144 kB OS
Linux Source
AMPPZ2014

先分析这道题,说实话一开始没什么头绪。第一反应是把两点之间都建一条边,单只建边复杂度就是n²了。(一共建n*(n-1)/2条边)然后看一下n的范围:2<=n<=200000。那n²最大=4e10,1s的话可以大概进行3e7此操作,20s也就6e8次操作,所以必定fake做法,pass。

那么我们来对这道题进行深入思考,看分块是“最短路,最小生成树”那就肯定类似dijkstra求单源最短路径的做法,所以第一感觉是直接直接取路径中所有最短边然后广度优先搜索即可,后来发现此举行不通。

于是想到可以将横纵坐标分别临近(或相同)的两边进行连边,这样的话可以得知有可能使得到达最终点的路径变得更短(最坏的情况也不过是路径相同而已,路径一定不会变得更长)

那么我们现在就分析一下上段所说的话:上段所说的话的意思概括来说就是说从A点到C点,如果中间有B点可途径,那么途径B点便一定是更优的方案;即使不能够使所经路程更短,也一定不会更长。(算法精髓)

好的现在算法思路明确了,那么开始看代码:

 #include<bits/stdc++.h>
#define N 400001
#define inf 1000000001
using namespace std;
bool vis[N];
int dis[N];
int head[N];
int n,tot;
priority_queue < pair<int,int> > q;
inline void do_it(){
for(int i=;i<=n;i++){
dis[i]=inf;
}
return ;
}
struct node{
int x;
int y;
int id;
}a[N];
struct edge{
int to;
int nxt;
int val;
}e[*N];
bool cmx(node x,node y){
return x.x<y.x;
}
bool cmy(node x,node y){
return x.y<y.y;
}
void add(int x,int y,int z){
e[++tot].to=y;
e[tot].nxt=head[x];
head[x]=tot;
e[tot].val=z;
return;
}
void Dijkstra()
{
q.push(make_pair(,)); memset(vis,,sizeof(vis)); /*memset(dis,0x3f,sizeof(dis));*/ dis[] = ;
while(!q.empty())
{
int x = q.top().second; q.pop(); if(vis[x]) continue; vis[x] = ;
for(int i=head[x];i;i=e[i].nxt)
{
int to1=e[i].to;
if(dis[to1] > dis[x] + e[i].val)
dis[to1] = dis[x] + e[i].val , q.push(make_pair(-dis[to1],to1));
}
}
return ;
}
int main(){
scanf("%d",&n);
do_it();
for(int i=;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id=i;
}
sort(a+,a++n,cmx);
for(int i=;i<=n-;i++){
int u=a[i].id,v=a[i+].id;
add(u,v,a[i+].x-a[i].x);
add(v,u,a[i+].x-a[i].x);
}
sort(a+,a++n,cmy);
for(int i=;i<=n-;i++){
int u=a[i].id,v=a[i+].id;
add(u,v,a[i+].y-a[i].y);
add(v,u,a[i+].y-a[i].y);
}
Dijkstra();
printf("%d",dis[n]);
return ;
}

THE END.

The Captain 题解的更多相关文章

  1. the Captain题解;

    BZOJ 4152 很显然这个题是让找最短路: 这种通过一个节点到达另一个点的路径我们可以想到dijkstra,然后这道题我们可以看到点是比较多的,所以我们怎么存图呢? 首先我们对于任意三个点,A(x ...

  2. BZOJ4152:[AMPPZ2014]The Captain——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4152 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1 ...

  3. [题解] [BZOJ4152] The Captain

    题面 题解 将所有点根据

  4. Codeforces Round #271 (Div. 2)题解【ABCDEF】

    Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...

  5. 【BZOJ】【4152】【AMPZZ2014】The Captain

    最短路 题解:http://zyfzyf.is-programmer.com/posts/97953.html 按x坐标排序,相邻点之间连边.满足dist(x1,x3)<=dist(x1,x2) ...

  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. 【CODEFORCES】 C. Captain Marmot

    C. Captain Marmot time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. CoderForces Round60-(1117A,1117B,1117C题解)

    A. Best Subsegment time limit per test 1 second memory limit per test 256 megabytes input standard i ...

随机推荐

  1. main函数的参数详解

    1.定义 C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv.因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整 ...

  2. opencv:联通组件扫描

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  3. IDE - IDEA - 快捷键整理 - 01. Navigation

    1. 概述 工具的熟练程度, 会决定工作效率 总共也就 140 条左右吧 需要讲解吗? 2. ref 1. idea 自带的 ReferenceCard.pdf 3. keymap 1. 文件移动 C ...

  4. toString()和toLocaleString()方法有什么区别和联系

    toString()和toLocaleString()有什么区别 偶然之间用到这两个方法 然后在数字转换成字符串的时候,并没有感觉这两个方法有什么区别,如下: 1 2 3 4 5 6 7 8 var  ...

  5. pwnable.kr-balckjack-Writeup

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  6. DIV 设置垂直居中

    要说面试官经常问的问题中“如何将一个块元素水平垂直居中”就算一个. 之前的面试中也有中招,现在总结一下. 1.CSS垂直水平居中 要让DIV水平和垂直居中,必需知道该DIV得宽度和高度,然后设置位置为 ...

  7. 第一篇 Python中一切皆对象

  8. Django框架之ORM的相关操作之分页(六)

    分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...

  9. nginx解决WordPress 上传到服务器后页面404错误的方法

    人啊,要说你傻了吧,真是啥事都能碰到: 因为换了nginx,把新做的上传到服务器配置好后,就主页和后台能打开,其他的所有页面,全是404,果真404和502是我最讨厌的数字啊,这让我很怀疑人生啊,怀疑 ...

  10. LeetCode日常小习题

    LeetCode练习题: 1.给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入 ...