#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_Y = 10;
//-------------------- DSU --------------------
struct DSU {
vector<int> parent, sizes;
DSU(int n) {
parent.resize(n);
sizes.assign(n, 1);
for (int i = 0; i < n; i++) parent[i] = i;
}
int find(int a) {
if (parent[a] == a) return a;
return parent[a] = find(parent[a]);
}
bool unite(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return false;
if (sizes[b] > sizes[a]) swap(a, b);
parent[b] = a;
sizes[a] += sizes[b];
return true;
}
};
//-------------------- Structs --------------------
struct Point {
ll x, y;
int idx;
};
struct Edge {
ll dist;
int u, v;
bool operator<(const Edge &other) const {
return dist < other.dist;
}
};
//-------------------- Main --------------------
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<Point> points(n);
for (int i = 0; i < n; i++) {
cin >> points[i].x >> points[i].y;
points[i].idx = i;
}
// sắp xếp theo x trước, rồi y
sort(points.begin(), points.end(), [](const Point &a, const Point &b) {
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
});
// buffer lưu điểm có x lớn nhất cho mỗi y
vector<Point> buffer(MAX_Y + 1, {-1, -1, -1});
vector<Edge> edges;
for (int i = 0; i < n; i++) {
for (int y = 0; y <= MAX_Y; y++) {
if (buffer[y].idx != -1) {
ll dx = points[i].x - buffer[y].x;
ll dy = points[i].y - buffer[y].y;
ll dist = dx * dx + dy * dy;
edges.push_back({dist, points[i].idx, buffer[y].idx});
}
}
buffer[points[i].y] = points[i];
}
sort(edges.begin(), edges.end());
// Kruskal MST
DSU dsu(n);
ll ans = 0;
for (auto &e : edges) {
if (dsu.unite(e.u, e.v)) ans += e.dist;
}
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKY29uc3QgaW50IE1BWF9ZID0gMTA7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tIERTVSAtLS0tLS0tLS0tLS0tLS0tLS0tLQpzdHJ1Y3QgRFNVIHsKICAgIHZlY3RvcjxpbnQ+IHBhcmVudCwgc2l6ZXM7CgogICAgRFNVKGludCBuKSB7CiAgICAgICAgcGFyZW50LnJlc2l6ZShuKTsKICAgICAgICBzaXplcy5hc3NpZ24obiwgMSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHBhcmVudFtpXSA9IGk7CiAgICB9CgogICAgaW50IGZpbmQoaW50IGEpIHsKICAgICAgICBpZiAocGFyZW50W2FdID09IGEpIHJldHVybiBhOwogICAgICAgIHJldHVybiBwYXJlbnRbYV0gPSBmaW5kKHBhcmVudFthXSk7CiAgICB9CgogICAgYm9vbCB1bml0ZShpbnQgYSwgaW50IGIpIHsKICAgICAgICBhID0gZmluZChhKTsKICAgICAgICBiID0gZmluZChiKTsKICAgICAgICBpZiAoYSA9PSBiKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHNpemVzW2JdID4gc2l6ZXNbYV0pIHN3YXAoYSwgYik7CiAgICAgICAgcGFyZW50W2JdID0gYTsKICAgICAgICBzaXplc1thXSArPSBzaXplc1tiXTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RydWN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLQpzdHJ1Y3QgUG9pbnQgewogICAgbGwgeCwgeTsKICAgIGludCBpZHg7Cn07CgpzdHJ1Y3QgRWRnZSB7CiAgICBsbCBkaXN0OwogICAgaW50IHUsIHY7CiAgICBib29sIG9wZXJhdG9yPChjb25zdCBFZGdlICZvdGhlcikgY29uc3QgewogICAgICAgIHJldHVybiBkaXN0IDwgb3RoZXIuZGlzdDsKICAgIH0KfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG47CiAgICBjaW4gPj4gbjsKCiAgICB2ZWN0b3I8UG9pbnQ+IHBvaW50cyhuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY2luID4+IHBvaW50c1tpXS54ID4+IHBvaW50c1tpXS55OwogICAgICAgIHBvaW50c1tpXS5pZHggPSBpOwogICAgfQoKICAgIC8vIHPhuq9wIHjhur9wIHRoZW8geCB0csaw4bubYywgcuG7k2kgeQogICAgc29ydChwb2ludHMuYmVnaW4oKSwgcG9pbnRzLmVuZCgpLCBbXShjb25zdCBQb2ludCAmYSwgY29uc3QgUG9pbnQgJmIpIHsKICAgICAgICBpZiAoYS54ID09IGIueCkgcmV0dXJuIGEueSA8IGIueTsKICAgICAgICByZXR1cm4gYS54IDwgYi54OwogICAgfSk7CgogICAgLy8gYnVmZmVyIGzGsHUgxJFp4buDbSBjw7MgeCBs4bubbiBuaOG6pXQgY2hvIG3hu5dpIHkKICAgIHZlY3RvcjxQb2ludD4gYnVmZmVyKE1BWF9ZICsgMSwgey0xLCAtMSwgLTF9KTsKICAgIHZlY3RvcjxFZGdlPiBlZGdlczsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDw9IE1BWF9ZOyB5KyspIHsKICAgICAgICAgICAgaWYgKGJ1ZmZlclt5XS5pZHggIT0gLTEpIHsKICAgICAgICAgICAgICAgIGxsIGR4ID0gcG9pbnRzW2ldLnggLSBidWZmZXJbeV0ueDsKICAgICAgICAgICAgICAgIGxsIGR5ID0gcG9pbnRzW2ldLnkgLSBidWZmZXJbeV0ueTsKICAgICAgICAgICAgICAgIGxsIGRpc3QgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICAgICAgICAgIGVkZ2VzLnB1c2hfYmFjayh7ZGlzdCwgcG9pbnRzW2ldLmlkeCwgYnVmZmVyW3ldLmlkeH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ1ZmZlcltwb2ludHNbaV0ueV0gPSBwb2ludHNbaV07CiAgICB9CgogICAgc29ydChlZGdlcy5iZWdpbigpLCBlZGdlcy5lbmQoKSk7CgogICAgLy8gS3J1c2thbCBNU1QKICAgIERTVSBkc3Uobik7CiAgICBsbCBhbnMgPSAwOwogICAgZm9yIChhdXRvICZlIDogZWRnZXMpIHsKICAgICAgICBpZiAoZHN1LnVuaXRlKGUudSwgZS52KSkgYW5zICs9IGUuZGlzdDsKICAgIH0KCiAgICBjb3V0IDw8IGFucyA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0K