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. linux 压测jmeter24h稳定性测试

    环境准备: 安装jmeter,JDK: wget  https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.1.tgz cd  ...

  2. 链剖-进阶ing-填坑-NOIP2013-货车运输

    This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...

  3. java读/写文件

    读取文件参考:https://blog.csdn.net/weixin_42129373/article/details/82154471 写入文件参考:https://blog.csdn.net/B ...

  4. 每天进步一点点------基础实验_13_有限状态机 :Mealy型序列检测器

    /********************************************************************************* * Company : * Eng ...

  5. css 溢出滚动条显示,修改滚动条样式

    文本或者内容溢出滚动条显示: a/横纵都出滚动条:css添加属性{overflow:auto;} b/横向滚动条:css添加属性{overflow-x:auto;} c/纵向滚动条:css添加属性{o ...

  6. pwnable.kr-bof-Writeup

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

  7. python报错使用yum命令报错File &quot;/usr/bin/yum&quot;, line 30 except KeyboardInterrupt, e: SyntaxError: invalid syntax问题

    参考链接:https://blog.csdn.net/ltz150/article/details/77870735 1.背景: CentOS 7升级Python到3.6.2后,需要在/usr/bin ...

  8. windows10下VS2013搭建opencv2.4.9吐血之作

    1.下载opencv2.4.9.exe文件,然后双击extract文件到指定目录 2.按此链接安装opencv:https://www.cnblogs.com/cuteshongshong/p/405 ...

  9. yii2.0框架安装

    通过 Composer 安装 如果还没有安装 Composer,你可以按 getcomposer.org 中的方法安装. 在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS ...

  10. MySQL基本查询

    1.查询某数据库中表的总数 select count(*) from information_schema.tables where table_schema='dbname'; 2.仅占一列显示某数 ...