萌新求助曼哈顿距离最小生成树
  • 板块学术版
  • 楼主Sharpsmile
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/1/11 20:56
  • 上次更新2024/1/12 10:09:12
查看原帖
萌新求助曼哈顿距离最小生成树
455490
Sharpsmile楼主2024/1/11 20:56

RT,在51nod测得,但是感觉那边没啥人就来洛谷问了、

#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <random>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#include <bitset>
#include <fstream>
#include <climits>
#include <time.h>
#include <cassert>
using namespace std;
#define int long long
#define double long double
#define endl "\n"
#define pii pair<int,int>
#define p1(x) ((x).first)
#define p2(x) ((x).second)
int n;
struct node{int x,y;}T[50300];
inline int MAN(node A,node B){
    return abs(A.x-B.x)+abs(A.y-B.y);
}
inline bool cmpru(int x,int y){
    node A=T[x],B=T[y];
    return A.x==B.x?A.y>B.y:A.x>B.x;
}
inline bool cmprd(int x,int y){
    node A=T[x],B=T[y];
    return A.x==B.x?A.y<B.y:A.x>B.x;
}
inline bool cmplu(int x,int y){
    node A=T[x],B=T[y];
    return A.x==B.x?A.y>B.y:A.x<B.x;
}
inline bool cmpld(int x,int y){
    node A=T[x],B=T[y];
    return A.x==B.x?A.y<B.y:A.x<B.x;
}
int p[50030];
pii tl[1000300],tr[1000300];
inline int lb(int x){
    return x&-x;
}


inline void modl(int x,pii k){
    while(x<=1000001){
        tl[x]=min(tl[x],k);
        x+=lb(x);
    }
}
inline void clrl(){
    memset(tl,0x3f,sizeof(tl));
}
inline pii gl(int x){
    pii res={1e9,0};
    while(x){
        res=min(res,tl[x]);
        x-=lb(x);
    }
    return res;
}


inline void modr(int x,pii k){
    while(x){
        tr[x]=min(tr[x],k);
        x-=lb(x);
    }
}
inline void clrr(){
    memset(tr,0x3f,sizeof(tr));
}
inline pii gr(int x){
    pii res={1e9,0};
    while(x<=1000001){
        res=min(res,tr[x]);
        x+=lb(x);
    }
    return res;
}
struct edge{int u,v,w;};
vector<edge>E;
int f[50030];
inline int ff(int x){
    return f[x]==x?x:f[x]=ff(f[x]);
}
inline bool merge(int x,int y){
    x=ff(x),y=ff(y);
    if(x==y)return 0;
    f[x]=y;
    return 1;
}
inline bool cmp(edge A,edge B){
    return A.w<B.w;
}
inline int KR(vector<edge> E){
    int res=0;
    sort(E.begin(),E.end(),cmp);
    for(auto e:E)
        if(merge(e.u,e.v))
            res+=e.w;
    return res;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    //freopen("/Users/noip2019/Downloads/51nod_1213_8_in.txt","r",stdin);
    cin>>n;
    for(int i=1;i<=n;i ++)
          cin>>T[i].x>>T[i].y,p[i]=i,T[i].x++,T[i].y++,f[i]=i;
    sort(p+1,p+n+1,cmpru);
    clrr();
    for(int i=1;i<=n;i++){
        pii S=gr(T[p[i]].y);
        if(p2(S))
            E.push_back({p[i],p2(S),p1(S)-T[p[i]].x-T[p[i]].y});
        modr(T[p[i]].y,{T[p[i]].x+T[p[i]].y,p[i]});
    }
    
    sort(p+1,p+n+1,cmplu);
    clrr();
    for(int i=1;i<=n;i++){
        pii S=gr(T[p[i]].y);
        if(p2(S))
            E.push_back({p[i],p2(S),p1(S)+T[p[i]].x-T[p[i]].y});
        modr(T[p[i]].y,{-T[p[i]].x+T[p[i]].y,p[i]});
    }
    
    sort(p+1,p+n+1,cmprd);
    clrl();
    for(int i=1;i<=n;i++){
        pii S=gl(T[p[i]].y);
        if(p2(S))
            E.push_back({p[i],p2(S),p1(S)-T[p[i]].x+T[p[i]].y});
        modl(T[p[i]].y,{T[p[i]].x-T[p[i]].y,p[i]});
    }
    sort(p+1,p+n+1,cmpld);
    clrl();
    for(int i=1;i<=n;i++){
        pii S=gl(T[p[i]].y);
        if(p2(S))
            E.push_back({p[i],p2(S),p1(S)+T[p[i]].x+T[p[i]].y});
        modl(T[p[i]].y,{-T[p[i]].x-T[p[i]].y,p[i]});
    }
//        for(edge e:E)
//            cout<<e.u<<" "<<e.v<<" "<<e.w<<" "<<MAN(T[e.u],T[e.v])<<endl;
//    for(int i=1;i<=n;i++)
//        for(int j=i+1;j<=n;j++)
//            E.push_back({i,j,MAN(T[i],T[j])});
    //cout<<E.size()<<endl;
    cout<<KR(E)<<endl;
    cout.flush();
    return 0;
}
/*
 */

2024/1/11 20:56
加载中...