The Captain 题解
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 题解的更多相关文章
- the Captain题解;
BZOJ 4152 很显然这个题是让找最短路: 这种通过一个节点到达另一个点的路径我们可以想到dijkstra,然后这道题我们可以看到点是比较多的,所以我们怎么存图呢? 首先我们对于任意三个点,A(x ...
- BZOJ4152:[AMPPZ2014]The Captain——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4152 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1 ...
- [题解] [BZOJ4152] The Captain
题面 题解 将所有点根据
- Codeforces Round #271 (Div. 2)题解【ABCDEF】
Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...
- 【BZOJ】【4152】【AMPZZ2014】The Captain
最短路 题解:http://zyfzyf.is-programmer.com/posts/97953.html 按x坐标排序,相邻点之间连边.满足dist(x1,x3)<=dist(x1,x2) ...
- 【BZOJ4152】The Captain(最短路)
[BZOJ4152]The Captain(最短路) 题面 BZOJ Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求 ...
- 【BZOJ4152】[AMPPZ2014]The Captain 最短路
[BZOJ4152][AMPPZ2014]The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1 ...
- 【CODEFORCES】 C. Captain Marmot
C. Captain Marmot time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- CoderForces Round60-(1117A,1117B,1117C题解)
A. Best Subsegment time limit per test 1 second memory limit per test 256 megabytes input standard i ...
随机推荐
- 美多商城后台MIS系统部署之Nginx配置
先进入Nginx的配置文件中,进行配置. Nginx配置文件夹的区别: cd /etc/nginx/conf.d/ 创建.conf后缀的文件 /etc/nginx/sites-enabled 创 ...
- JavaScript arguments对象浅析
arguments对象 概念 用法 属性 arguments对象 概念 arguments 是一个类数组对象.代表传给一个function的参数列表. 用法 function a() { consol ...
- Flask 教程 第十八章:Heroku上的部署
本文翻译自The Flask Mega-Tutorial Part XVIII: Deployment on Heroku 这是Flask Mega-Tutorial系列的第十八部分,我将在其中部署M ...
- Servlet继承体系结构
Servlet如何只定义1个service方法,其它的方法按需求设置 Servlet——接口 ↑继承 GenericServlet——抽象类 ↑继承 HttpServlet——抽象类:推荐使用 Gen ...
- 7_2 最大乘积(UVa11059)<枚举连续子序列>
给一个数字集合{ S1,S2,…,Sn },请从这个数字集合里找出一段连续数字,使他们的乘积是最大的.以Case 1为例子,2 x 4 = 8为这个集合的最大乘积:而Case 2则为2 x 5 x(– ...
- Object 反射 List
public static object DeserializeModel<T>(object dataModel) { Type type = typeof(T); Object ent ...
- 自己常用的Linux命令和Hadoop命令
记录自己常用的Linux命令: ss的启动命令:ssserver -c /etc/shadowsocks.json jupyter notebook的启动命令:jupyter notebook --a ...
- 每天进步一点点------Altium Designer Rules规则详解
对于PCB的设计, AD提供了详尽的10种不同的设计规则,这些设计规则则包括导线放置.导线布线方法.元件放置.布线规则.元件移动和信号完整性等规则.根据这些规则, Protel DXP进行自动布局和自 ...
- Java 前加加和后加加 总结
public class Test { public static void main(String[] args) { int age = 6; //先自加,再使用(age先自加1,然后再打印age ...
- 吴裕雄 python 机器学习——数据预处理流水线Pipeline模型
from sklearn.svm import LinearSVC from sklearn.pipeline import Pipeline from sklearn import neighbor ...