1. 程式人生 > >BZOJ4152: [AMPPZ2014]The Captain

BZOJ4152: [AMPPZ2014]The Captain

empty pbd names type std pac pair bin nbsp

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 題目傳送門 哈哈哈哈哈模擬模擬n<=200000
這就是裸的最短路問題啊,但是n有200000 那麽兩兩建邊就是200000*200000/2 那就一定得優化 再想:他這個題目很怪,min(|X1-X2|,|Y1-Y2|)???
那tm不就從這下文章了嗎 再想,的確,只有X坐標或Y坐標相鄰的能用啊,這應該不用證明吧 然後SPFA,可惜,大千世界,無(sang)奇(xin)不(bing)有(kuang) 它把我SPFA卡掉了!!卡掉了!! 因為我不會其他的了,所以要得跑dijstra 至於這個東西,我看了實現之後感嘆:真貪啊,不給出題人一點活路 代碼如下:
#include<cmath>
#include<cstdio>
#include
<cstdlib> #include<cstring> #include<algorithm> #include<ext/pb_ds/priority_queue.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; struct node{ int x,y,d,next; }a[2100000];int len,last[2100000]; typedef __gnu_pbds::priority_queue<pair<ll,int
> > heap; void ins(int x,int y,int d) { len++; a[len].x=x;a[len].y=y;a[len].d=d; a[len].next=last[x];last[x]=len; } const ll Maxn=1ll<<51; struct coordinate{ int x,y,id; }b[210000]; bool X_coordinate(coordinate a,coordinate b) { if(a.x!=b.x)return a.x<b.x; return a.id<b.id; } bool Y_coordinate(coordinate a,coordinate b) { if(a.y!=b.y)return a.y<b.y; return a.id<b.id; } ll d[210000]; bool v[210000]; int head,tail,list[210000]; int n; heap::point_iterator id[1000005]; void dijkstra() { heap q; memset(d,127,sizeof(d)); id[1]=q.push(make_pair(0,1)); d[1]=0; while(!q.empty()) { int x=q.top().second; q.pop(); if(x==n)break; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(d[y]>d[x]+a[k].d) { d[y]=d[x]+a[k].d; if(id[y]!=0)q.modify(id[y],make_pair(-d[y],y)); else id[y]=q.push(make_pair(-d[y],y)); } } } printf("%lld\n",d[n]); } int main() { scanf("%d",&n); len=0;memset(last,0,sizeof(last)); for(int i=1;i<=n;i++) { scanf("%d%d",&b[i].x,&b[i].y); b[i].id=i; } sort(b+1,b+1+n,X_coordinate); for(int i=1;i<n;i++)ins(b[i].id,b[i+1].id,min(abs(b[i].x-b[i+1].x),abs(b[i].y-b[i+1].y))); for(int i=1;i<n;i++)ins(b[i+1].id,b[i].id,min(abs(b[i].x-b[i+1].x),abs(b[i].y-b[i+1].y))); sort(b+1,b+1+n,Y_coordinate); for(int i=1;i<n;i++)ins(b[i].id,b[i+1].id,min(abs(b[i].x-b[i+1].x),abs(b[i].y-b[i+1].y))); for(int i=1;i<n;i++)ins(b[i+1].id,b[i].id,min(abs(b[i].x-b[i+1].x),abs(b[i].y-b[i+1].y))); dijkstra(); return 0; }

by_lmy

BZOJ4152: [AMPPZ2014]The Captain