fork download
  1. #include <bits/stdc++.h>
  2. #define X first
  3. #define Y second
  4. #define ll long long
  5. #define pii pair<ll, ll>
  6. #define all(x) (x).begin(), (x).end()
  7. #define tp tuple<ll,int,int>
  8. #define oo (ll) 1e18
  9. #define LOG_MAX 20
  10. using namespace std;
  11. #define MAXN 100010
  12. #define MOD 1000000007
  13.  
  14. int n;
  15. int par[MAXN];
  16. vector<pii>points[5];
  17. vector<tp>op;
  18. int Find(int u){
  19. if(u==par[u]) return u;
  20. return par[u]=Find(par[u]);
  21. }
  22. bool join(int u,int v){
  23. u = Find(u) , v = Find(v);
  24. if(u!=v){
  25. par[v] = u;
  26. return true;
  27. }
  28. return false;
  29. }
  30. void add(int j,int i){
  31. int x=abs(points[j][i].X-points[j][i-1].X);
  32. op.push_back({x,points[j][i].Y,points[j][i-1].Y});
  33. }
  34. signed main(){
  35. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  36. //freopen("SHIP.inp","r",stdin);
  37. //freopen("SHIP.out","w",stdout);
  38. cin>>n;
  39. for(int i=1;i<=n;i++){
  40. int x,y,z; cin>>x>>y>>z;
  41. points[1].push_back({x,i});
  42. points[2].push_back({y,i});
  43. points[3].push_back({z,i});
  44. par[i]=i;
  45. }
  46. ll ans=0;
  47. sort(all(points[1]));
  48. sort(all(points[2]));
  49. sort(all(points[3]));
  50. for(int i=1;i<n;i++){
  51. for(int j=1;j<=3;j++)
  52. add(j,i);
  53. }
  54. sort(all(op));
  55. for(auto [w,u,v] : op){
  56. if(join(u,v)) ans+=w;
  57. }
  58. cout<<ans;
  59. return 0;
  60. }
  61. /*
  62. */
  63.  
Success #stdin #stdout 0.01s 5312KB
stdin
5
11 -15 -15
14 -5 -15
-1 -1 -5
10 -4 -1
19 -4 19
stdout
4