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. iview修改table组件实现循环向上滚屏

    前提,最近项目中需要实现table的滚屏效果,并且使用的是iview的table组件,踩坑,填坑如下. 1.首先找到Table组件中的table,就是这个class:ivu-table-body te ...

  2. 思科ACS的性能总结

    ACS Performance & Scale 思科ACS目前还能支持的可能就是ACS5.8版本了,该版本也将于2020年停止支持,关于ACS信息会逐步退出大家的视野.该文档是Cisco论坛t ...

  3. [python] VSCode+Jupyter 安装步骤以及注意事项

    1. 安装Python2. 安装Jupyter, pip install 安装Jupyter(若使用Anaconda,则需要将其添加到环境变量中)3. 将Python的Scripts文件夹添加到系统环 ...

  4. [lua]紫猫lua教程-命令宝典-L1-01-06. 循环结构

    L1[循环]01. for循环结构介绍 只是简单的说了下计数型的for循环结构 for i=1,10,1 do testlib.traceprint(i) end 注意几点: 1.上面的1和10表示循 ...

  5. 素问 - 信贷和GDP

    摘自<小韭的学习圈> Q:近期看到2019年金融统计数据,全年人民币贷款增加16.81万亿元,同比多增6439亿元.这里有个问题我储备好久了,没有高人指点俺.请问2019年全年GDP近10 ...

  6. token是个什么东西?怎样生成并携带token

    什么是token及怎样生成token  转载自:https://www.cnblogs.com/lufeiludaima/p/pz20190203.html 什么是token Token是服务端生成的 ...

  7. NTP服务安装及时间同步

    1.安装ntp服务命令 yum install -y ntp 2.常用NTP服务器地址: ntp1.aliyun.com ntp2.aliyun.com ntp3.aliyun.com ntp4.al ...

  8. Building Ethereum private chain on CentOS

    golang安装 yum install golang 查看版本 go version 安装以太坊源代码 Building Geth (command line client) Clone the r ...

  9. AcWing - 156 矩阵(二维哈希)

    题目链接:矩阵 题意:给定一个$m$行$n$列的$01$矩阵$($只包含数字$0$或$1$的矩阵$)$,再执行$q$次询问,每次询问给出一个$a$行$b$列的$01$矩阵,求该矩阵是否在原矩阵中出现过 ...

  10. unittest和unittest2的区别差异、unittest2框架------执行原理

    unittest和unittest2的区别差异 参考:https://pypi.org/project/unittest2/ unittest2是Python 2.7及更高版本中添加到unittest ...