ljh出的省赛模拟的水题三号
是这种题被出烂了还是这玩意本身就是原题啊……不能理解
对于每个点能对最短路产生贡献的只有x或y坐标与其相邻的点,然后就是sort一下建图跑最短路。
然后!!!!!!!!!
最短路!!!!!!!!
不知道是我写的挫还是怎么
尼玛spfa居然T掉了是什么心态???强行卡spfa是吧????
还好我是cpp选手能写dij+heap 2333
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define For(i,a,b) for(int i=a;i< b;i++)
#define fore(i,u ) for(int i=head[u];i;i=nxt[i])
#define pii pair<int , int>
#define pli pair<ll , int>
#define mp make_pair
#define pb push_back
#define key first
#define id second
inline int rd() {
char c = getchar();
while (!isdigit(c)) c = getchar() ; int x = c - '0';
while (isdigit(c = getchar())) x = x * 10 + c - '0';
return x;
}
typedef long long ll;
const int maxn = 262143;
const ll inf = 1ll << 60;
typedef int arr[maxn];
typedef int adj[maxn << 3 | 1];
arr head , x , y , vis;
adj to , nxt , val;
ll dis[maxn] ;
int n , ett;
vector<pii> X , Y;
priority_queue<pli , vector<pli> , greater<pli> > q;
inline void ins(int u , int v , int w) {
to[++ ett] = v , nxt[ett] = head[u] , val[ett] = w , head[u] = ett;
to[++ ett] = u , nxt[ett] = head[v] , val[ett] = w , head[v] = ett;
}
void input() {
n = rd();
rep(i , 1 , n) {
x[i] = rd() , y[i] = rd();
X.pb(mp(x[i] , i));
Y.pb(mp(y[i] , i));
}
sort(X.begin() , X.end());
sort(Y.begin() , Y.end());
}
inline int get_val(int i , int j)
{ return min( abs(x[i] - x[j]) , abs(y[i] - y[j]) ) ; }
void solve() {
For(i , 1 , X.size()) ins(X[i].id , X[i - 1].id , get_val(X[i].id , X[i - 1].id));
For(i , 1 , Y.size()) ins(Y[i].id , Y[i - 1].id , get_val(Y[i].id , Y[i - 1].id));
q.push(mp(0 , 1));
rep(i , 1 , n) dis[i] = inf;
dis[1] = 0;
while (!q.empty()) {
pii x = q.top() ; q.pop();
int u = x.id;
if (vis[u]) continue;
vis[u] = 1;
fore(i , u) {
int v = to[i] , w = val[i];
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push(mp(dis[v] , v));
}
}
}
printf("%lld\n" , dis[n]);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("data.txt" , "r" , stdin);
#endif
input();
solve();
return 0;
}