求助大佬,70pts
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*f;
}
struct coor{
int x,y,z,id;
coor(){}
coor(int a,int b,int c,int d){
x=a,y=b,z=c,id=d;
}
}f[100010];
bool cmpx(coor a,coor b){
return a.x<b.x;
}
bool cmpy(coor a,coor b){
return a.y<b.y;
}
bool cmpz(coor a,coor b){
return a.z<b.z;
}
struct edge{
int u,v,w;
edge(){}
edge(int a,int b,int c){
u=a,v=b,w=c;
}
bool operator <(const edge &W) const{
return w<W.w;
}
}g[300010];
int n,m;
int res,cnt;
int p[100010];
int find(int x){
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
void kruskal(){
for(int i=1;i<=n;++i) p[i]=i;
sort(g+1,g+m+1);
for(int i=1;i<=m;++i){
int u=g[i].u,v=g[i].v,w=g[i].w;
u=find(u),v=find(v);
if(u!=v){
p[u]=v;
res+=w;
cnt++;
if(cnt==n-1) break;
}
}
return;
}
signed main(){
cin>>n;
for(int i=1;i<=n;++i){
int x=read(),y=read(),z=read();
f[i]=coor(x,y,z,i);
}
sort(f+1,f+1+n,cmpx);
for(int i=1;i<n;++i){
int w=abs(f[i].x-f[i+1].x);
g[++m]=edge(f[i].id,f[i+1].id,w);
}
sort(f+1,f+1+n,cmpy);
for(int i=1;i<n;++i){
int w=abs(f[i].y-f[i+1].y);
g[++m]=edge(f[i].id,f[i+1].id,w);
}
sort(f+1,f+1+n,cmpz);
for(int i=1;i<n;++i){
int w=abs(f[i].z-f[i+1].z);
g[++m]=edge(f[i].id,f[i+1].id,w);
}
kruskal();
cout<<res;
return 0;
}