本文共 964 字,大约阅读时间需要 3 分钟。
题目链接:
平面上有 n n n个点,每个点在 m a x ( x , y ) max(x,y) max(x,y)层,走第 k k k层的点之前一定要先走前面层的点,求走完所有点的最短路。
对于每一层来说,我们可以将其看成一条直线,那么我们走某一层一定是先走到最边上的点再走到另一边最边上的点,因为如果这两个点也是必走的,如果没有走到这个点不行,如果走到了这个点,那么这边的所有点一定已经走到过。
所以排序来做即可
#include#include #include #include #define ll long long using namespace std;const ll N=2e6+10;ll n,cnt,x[N],y[N],z[N],b[N*2];ll mx[N],mn[N],f[N],dmin,dmax;vector q[N];ll get_dis(ll x1,ll y1,ll x2,ll y2){ return abs(x1-x2)+abs(y1-y2);} int main(){ scanf("%lld",&n); for(ll i=1;i<=n;i++){ scanf("%lld%lld",&x[i],&y[i]); b[++cnt]=x[i];b[++cnt]=y[i]; } sort(b+1,b+1+cnt); cnt=unique(b+1,b+1+cnt)-b-1; for(ll i=1;i<=n;i++){ x[i]=lower_bound(b+1,b+1+cnt,x[i])-b; y[i]=lower_bound(b+1,b+1+cnt,y[i])-b; ll k=max(x[i],y[i]); if(x[i]==k) q[k].push_back(z[i]=b[k]-b[y[i]]); else q[k].push_back(z[i]=b[x[i]]-b[k]); if(z[i]>z[mx[k]]||!mx[k])mx[k]=i; if(z[i]
转载地址:http://bcwaf.baihongyu.com/