这份代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(a); i<(b); i++)
#define per(i,a,b) for (int i=(b)-1; i>=(a); i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef basic_string<int> BI;
typedef long long ll;
typedef pair<int, int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) {return mrand() % x;}
ll powmod(ll b, ll e, ll md=mod) {ll a=1; b %= md; assert(e>=0); for (;e;e>>=1, b=b*b%md) if(e&1) {a=a*b%md;} return a;}
ll gcd(ll a, ll b) {return b?gcd(b,a%b):a;}
// head
const int N = 101000;
int n, f[N];
VI v[11];
vector<array<ll, 3>> E;
map<PII, int> id;
int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); }
int main() {
scanf("%d", &n);
rep(i,0,n) {
int x, y;
scanf("%d%d", &x, &y);
v[y].pb(x);
}
auto addedge = [&](int px, int py, int qx, int qy) {
E.pb({1ll * (px - qx) * (px - qx) + 1ll * (py - qy) * (py - qy),
(ll)id[{px, py}], (ll)id[{qx, qy}]});
};
int m = 0;
rep(y,0,11) {
sort(all(v[y]));
v[y].erase(unique(all(v[y])), v[y].end());
for (auto x : v[y]) id[{x, y}] = m++;
}
rep(i,0,11) rep(j,0,11) {
if (i == j) {
rep(k,0,SZ(v[i])-1) addedge(v[i][k], i, v[i][k+1], i);
} else {
for (auto x : v[i]) {
auto it = lower_bound(all(v[j]), x);
if (it != v[j].end()) addedge(x, i, *it, j);
it = upper_bound(all(v[j]), x);
if (it != v[j].begin()) addedge(x, i, *(--it), j);
}
}
}
rep(i,0,m) f[i] = i;
sort(all(E));
ll ans = 0;
for (auto [w, u, v] : E) if (find(u) != find(v)) f[find(u)] = find(v), ans += w;
printf("%lld\n",ans);
}
在你谷上不吸氧 TLE,但在 USACO 原比赛时最慢一个点跑了 2.2s,这是为何?