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 ...
随机推荐
- Codeforces 1204D2. Kirk and a Binary String (hard version) (dp思路)
题目链接:http://codeforces.com/contest/1204/problem/D2 题目是给定一个01字符串,让你尽可能多地改变1变为0,但是要保证新的字符串,对任意的L,R使得Sl ...
- springboot12(rabbitmq)
RabbitAutoConfiguration @Configuration @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) ...
- go语言 二叉树
package main import ( "fmt" "reflect" ) type BinaryNode struct { Data interface{ ...
- QT+VS后中文字符乱码问题
在VS中写QT项目会出现中文乱码现象,尤其是控件的中文乱码以及qDebug()时候中文乱码通用的解决办法: 在头文件(.h)前面加上如下代码: #ifdef WIN32 #pragma executi ...
- angular清空node_modules
安装全局包 npm install rimraf -g 执行清空命令 rimraf node_modules
- 浏览器渲染页面原理,reflow、repaint及其优化
浏览器的主要组件包括: 1. 用户界面 - 包括地址栏.前进/后退按钮.书签菜单等.除了浏览器主窗口显示的你请求的页面外,其他显示的各个部分都属于用户界面. 2. 浏览器引擎 - ...
- class实现React继承以及constructor的super的问题
看这篇文章之前 建议先看看阮一峰 的Class继承 便于更好的理解 首先要知道一个问题 React的父子组件和组件类的继承有什么关系?答案是:没有关系 父子组件:指的得是组件标签包含关系 父子组件通过 ...
- 046_使用Scanner获得键盘输入 047_控制语句介绍 048_控制语句_if单选择结构 049_ifelse双选择结构 050_ifelseifelse多选择结构
046_使用Scanner获得键盘输入 package test_package;import java.util.Scanner;/** * 测试获得键盘输入 * @author * */publi ...
- CSS学习(7)继承、属性值的计算过程
子元素会继承父元素的某些css属性 通常跟字体相关的属性都能被继承,具体的可以在mdn里查询是否是可继承属性 属性值的计算过程(渲染过程) 按照页面文档的树形目录结构进行依次渲染 前提条件:渲染的元素 ...
- Fluent_Python_Part1序幕,01-data-model, 数据模型
01-data-model/frenchdeck.py 1. Python解释器碰到特殊的句法时,会使用__特殊方法__去激活一些基本的对象操作. 特殊方法的存在是为了被解释器用的.没有my_obje ...