bzoj4152 The Captain

Description

给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。

Input

第一行包含一个正整数n(2<=n<=200000),表示点数。

接下来n行,每行包含两个整数x[i],y[i](0<=x[i],y[i]<=10^9),依次表示每个点的坐标。

Output

一个整数,即最小费用。

Sample Input

5
2 2
1 1
4 5
7 1
6 7

Sample Output

2

又一道卡spfa的最短路题,学长HugeGun说用堆优dijkstra就好,但是我只会spfa,然后狂T,又以为有什么智障错误内心紧张无比。

分别根据横坐标和纵坐标排两次序,把每次排好序后相邻的连边(似乎以前有学长讲过?)。

最近连续遇到两道卡spfa的题了,或许真的应该学一学堆优dijkstra。

用SLF优化的spfa刚好卡过的代码:

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=2e5+10,maxm=4e5+10;
int n;

int aa;char cc;
int read() {
	aa=0;cc=getchar();
	while(cc<‘0‘||cc>‘9‘) cc=getchar();
	while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
	return aa;
}

struct Node1{
	int pos,x;
}node1[maxn];

struct Node2{
	int pos,x;
}node2[maxn];

bool cmp1(const Node1& a,const Node1& b) {
	return a.x<b.x;
}

bool cmp2(const Node2& a,const Node2& b) {
	return a.x<b.x;
}

int fir[maxn],nxt[2*maxm],to[2*maxm],v[2*maxm],e=0;
void add(int x,int y,int z) {
	to[++e]=y;nxt[e]=fir[x];fir[x]=e;v[e]=z;
	to[++e]=x;nxt[e]=fir[y];fir[y]=e;v[e]=z;
}

int dis[maxn],zz[maxn];
bool vis[maxn];
void spfa() {
	for(int i=2;i<=n;++i) dis[i]=0x3f3f3f3f;
	int s=1,t=0,x,y,z,tot=1;
	dis[1]=0;zz[++t]=1;vis[1]=1;
	while(tot) {
		x=zz[s];s=(s+1)%maxn;vis[x]=0;tot--;
		for(y=fir[x];y;y=nxt[y]) {
			z=to[y];
			if(dis[z]<=dis[x]+v[y]) continue;
			dis[z]=dis[x]+v[y];
			if(!vis[z]) {
				vis[z]=1;tot++;
				if(dis[z]<=dis[zz[s]]) {
					s=(s-1+maxn)%maxn;
					zz[s]=z;
				}
				else {
					t=(t+1)%maxn;
					zz[t]=z;
				}
			}
		}
	}
	printf("%d",dis[n]);
}

int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;++i) {
		node1[i].pos=node2[i].pos=i;
		scanf("%d%d",&node1[i].x,&node2[i].x);
	}
	sort(node1+1,node1+n+1,cmp1);
	for(int i=1;i<n;++i) add(node1[i].pos,node1[i+1].pos,node1[i+1].x-node1[i].x);
	sort(node2+1,node2+n+1,cmp2);
	for(int i=1;i<n;++i) add(node2[i].pos,node2[i+1].pos,node2[i+1].x-node2[i].x);
	spfa();
	return 0;
}

  

时间: 2024-10-26 16:26:34

bzoj4152 The Captain的相关文章

bzoj4152 The Captain (dijkstra)

做dijkstra,但只需要贪心地把每个点连到它左边.右边.上边.下面的第一个点就可以了 1 #include<bits/stdc++.h> 2 #define pa pair<int,int> 3 #define lowb(x) ((x)&(-(x))) 4 #define REP(i,n0,n) for(i=n0;i<=n;i++) 5 #define PER(i,n0,n) for(i=n;i>=n0;i--) 6 #define MAX(a,b) ((a

bzoj4152[AMPPZ2014]The Captain 最短路

4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1517  Solved: 603[Submit][Status][Discuss] Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2<=n<=200000),表示点数. 接下来n行,每行包含

BZOJ4152: [AMPPZ2014]The Captain

Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2<=n<=200000),表示点数. 接下来n行,每行包含两个整数x[i],y[i](0<=x[i],y[i]<=10^9),依次表示每个点的坐标. Output 一个整数,即最小费用. Sample Input 5 2 2 1 1 4 5 7 1 6 7 Sample Output

Mac升级到EI Captain之后pip install 无法使用问题

错误log: creating /System/Library/Frameworks/Python.framework/Versions/2.7/share error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted 原因:因为EI Captain引入了SIP管理机制,所以旧版本的pip创建的文件目录操作被拒绝,包括使用root也

循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain

循环队列基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置: (3)当队列为空时,front与rear的值相等,但不一定为零: 3.循环队列入队的伪算法 (1)把值存在rear所在的位置: (2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度: 4.循环队列

【BZOJ】【4152】【AMPZZ2014】The Captain

最短路 题解:http://zyfzyf.is-programmer.com/posts/97953.html 按x坐标排序,相邻点之间连边.满足dist(x1,x3)<=dist(x1,x2)+dist(x2,x3)(因为可以走y) 再按y坐标排序,相邻点之间连边.同上 然而SPFA挂了……写了Dijkstra 1 /************************************************************** 2 Problem: 4152 3 User: Tu

Captain Marmot(Codeforces Round #271 div2) C

Captain Marmot Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description Captain Marmot wants to prepare a huge and important battle against his enemy, Captain Snake. For this battle he has n regiments, e

Captain Icon – 350+ 有趣的矢量图标免费下载

Captain Icon 是一套一个惊人的免费图标集,包含350+有趣的矢量图标,可以缩放到任意大小而不会降低质量.图标的类别很丰富,有设计,体育,社会,天气等很多类别.提供 EPS.PSD.PNG.SVG 和 Web 字体,因此您可以将它们应用在您的 Web ,移动和桌面项目中. 您可能感兴趣的相关文章 太赞了!超炫的页面切换动画效果[附源码下载] 真是好东西!13种非常动感的页面加载动画效果 你见过吗?9款超炫的复选框(Checkbox)效果 超赞!基于 Bootstrap 的响应式的后台管

BZOJ4152The Captain[DIjkstra]

4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 700  Solved: 266[Submit][Status][Discuss] Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2<=n<=200000),表示点数. 接下来n行,每行包含两