关于本题时限之疑问
查看原帖
关于本题时限之疑问
551375
junxis楼主2022/12/31 17:12

这份代码:

#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,这是为何?

2022/12/31 17:12
加载中...