bzoj 4152[AMPPZ2014]The Captain
bzoj 4152[AMPPZ2014]The Captain
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
一开始我居然把这个取min看成取曼哈顿距离。。
暴力建图是\(n^2\)
考虑两个点,可以以\(|x_1-x_2|\)和\(|y_1-y_2|\)为权值分别建图,在跑最短路的时候也不会去走那条权值大的边,这样就不用再管\(\min\)了
以以\(|x_1-x_2|\)为权值加边为例,有三个点\(i\),\(j\),\(k\),\(x_i\leq x_j\leq x_k\),则\(dis(i,k)=dis(i,j)+dis(j,k)\),所以只要把n个点按x排序,只把相邻两个点建一条边就行了
以\(|y_1-y_2|\)为权值时同理
最后跑一遍最短路
code.
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define R register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
struct point{
int x,y,id;
}a[200006];
int n;
int fir[200006],nex[800006],to[800006],w[800008],tot;
LL dis[200006];int in[200006];
int dui[200006],size;
inline void push(int x){
dui[size++]=x;
R int i=size-1,fa;
while(i){
fa=i>>1;
if(dis[dui[fa]]<=dis[dui[i]]) return;
std::swap(dui[fa],dui[i]);i=fa;
}
}
inline int pop(){
int ret=dui[0];dui[0]=dui[--size];
R int i=0,ls,rs;
while((i<<1)<size){
ls=i<<1;rs=ls|1;
if(rs<size&&dis[dui[rs]]<dis[dui[ls]]) ls=rs;
if(dis[dui[ls]]>=dis[dui[i]]) break;
std::swap(dui[ls],dui[i]);i=ls;
}
return ret;
}
inline int cmpx(point aa,point bb){return aa.x<bb.x;}
inline int cmpy(point aa,point bb){return aa.y<bb.y;}
inline void add(int x,int y,int z){
to[++tot]=y;w[tot]=z;
nex[tot]=fir[x];fir[x]=tot;
}
inline void dij(){
std::memset(dis,0x3f,sizeof dis);
dis[1]=0;push(1);in[1]=1;
while(size){
R int u=pop();in[u]=0;
for(R int i=fir[u];i;i=nex[i]){
R int v=to[i];
if(dis[v]>dis[u]+w[i]){
dis[v]=dis[u]+w[i];
if(!in[v]) push(v),in[v]=1;
}
}
}
}
int main(){
n=read();
for(R int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(),a[i].id=i;
std::sort(a+1,a+1+n,cmpx);
for(R int i=1;i<n;i++)
add(a[i].id,a[i+1].id,a[i+1].x-a[i].x),
add(a[i+1].id,a[i].id,a[i+1].x-a[i].x);
std::sort(a+1,a+1+n,cmpy);
for(R int i=1;i<n;i++)
add(a[i].id,a[i+1].id,a[i+1].y-a[i].y),
add(a[i+1].id,a[i].id,a[i+1].y-a[i].y);
dij();
std::printf("%lld",dis[n]);
return 0;
}
bzoj 4152[AMPPZ2014]The Captain的更多相关文章
- 循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain
循环队列基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,fr ...
- BZOJ 4152: [AMPPZ2014]The Captain( 最短路 )
先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就dijkstra ---------------------------------------------- ...
- BZOJ 4152: [AMPPZ2014]The Captain Dijkstra+贪心
Code: #include <queue> #include <cstdio> #include <cstring> #include <algorithm ...
- 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】
4152: [AMPPZ2014]The Captain Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2107 Solved: 820[Submi ...
- 4152: [AMPPZ2014]The Captain
4152: [AMPPZ2014]The Captain Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1561 Solved: 620[Submi ...
- bzoj4152[AMPPZ2014]The Captain 最短路
4152: [AMPPZ2014]The Captain Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1517 Solved: 603[Submi ...
- BZOJ4152 AMPPZ2014 The Captain 【最短路】【贪心】*
BZOJ4152 AMPPZ2014 The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点 ...
- 【BZOJ4152】[AMPPZ2014]The Captain 最短路
[BZOJ4152][AMPPZ2014]The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1 ...
- [BZOJ 4152][AMPPZ 2014]The Captain
这道题对费用的规定是min(|x1-x2|,|y1-y2|).如果暴力枚举所有的点复杂度O(n²),n <= 200000,显然爆炸.于是我们要考虑加“有效边”,一个显然的事实是对于两个点,如果 ...
随机推荐
- Java第二十五天,多线程之等待唤醒机制
当线程被创建并且被启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,而是具有以下多种状态: 这六种状态之间的转换关系如下: 1.等待唤醒机制 注意: (1)两个线程之间必须用同步代码块 ...
- VSCode设置大小写转换的快捷键
本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. VSCode在默认情况下没 ...
- 10.6 IoStudentManager
package day11_io_student.student_demo; public class Student { private String id; private String name ...
- Netty:ChannelFuture
上一篇我们完成了对Channel的学习,这一篇让我们来学习一下ChannelFuture. ChannelFuture的简介 ChannelFuture是Channel异步IO操作的结果. Netty ...
- BAT脚本编写要点_特殊字符
BAT脚本编写要点(1)_特殊字符 分类: 其他 2011-03-20 00:58 5621人阅读 评论(0) 收藏 举报 脚本cdatecmdtreesystem 1. 点 与echo连用,作用是换 ...
- compareAndSet() 注意点
compareAndSet()与weakCompareAndSet()是有条件的修改程序的方法,这两个方法都要取用两个参数:在方法启动时预期数据所具有的的值,以及要把数据所设定成的值.它们都只会在变量 ...
- stand up meeting 12-9
今天项目小组本已约好在今天下午四点半进行今天的daily scrum: 但是在四点半的时候,天赋和士杰同学均因组内项目会议延时,导致今天的daily scrum只能在晚上进行,但静雯同学因身体不舒服无 ...
- Jmeter发送jdbc请求进行大批量造数
创建批量造数脚本,一个简单的结构如下图所示, 1.线程组(10个线程重复运行2次,相当于造20个数) 2.用户定义变量(这是全局变量,用于后面随机筛选用) 3.数据库连接配置 4.计数器(用于主键递增 ...
- 4. js
1.) ~ 操作符 console.log(~-2) // 1 console.log(~-1) // 0 console.log(~0) // -1 console.log(~1) // ...
- 聊聊Spring Boot Actuator
概述 在本文中,我们将介绍Spring Boot Actuator.我们将首先介绍基础知识,然后详细讨论Spring Boot 1.x和2.x中的可用内容. 我们将在Spring Boot 1.x中学 ...