样例只有#2过了为什么A了
查看原帖
样例只有#2过了为什么A了
555381
zlttcl楼主2023/3/22 19:57
#pragma G++ optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll n, m, cnt, ans, f[N];
inline ll read(){
	ll x = 0, m = 1;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-') m = -1;
		ch = getchar();
	}
	while(isdigit(ch)){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * m;
}
inline void write(ll x){
	if(x < 0){
		putchar('-');
		write(-x);
		return;
	}
	if(x >= 10) write(x / 10);
	putchar(x % 10 + '0');
}
struct Code{
	ll u, v, sum;
}a[N << 2];
inline bool cmp(Code x, Code y){
	return x.sum < y.sum;
}
struct code{
	ll x, y, z, id;
}b[N << 2];
inline bool cmp1(code x, code y){
	return x.x < y.x;
}
inline bool cmp2(code x, code y){
	return x.y < y.y;
}
inline bool cmp3(code x, code y){
	return x.z < y.z;
}
inline int choose(int x, int y){
	return min(abs(b[x].x - b[y].x), min(abs(b[x].y - b[y].y), abs(b[x].z - b[y].z)));
}
inline ll find(int x){
	return f[x] == x ? x : f[x] = find(f[x]);
}
inline void kruskal(){
	for(int i = 1; i <= n; ++ i) f[i] = i;
	for(int i = 1; i <= m; ++ i){
		int u = find(a[i].u), v = find(a[i].v);
		if(u == v) continue;
		ans += a[i].sum;
		f[v] = u;
		++ cnt;
		if(cnt == n - 1){
			return;
		}
	}
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
    n = read();
	for(int i = 1; i <= n; ++ i){
		b[i].x = read(), b[i].y = read(), b[i].z = read(), b[i].id = i;
	} 
	sort(b + 1, b + 1 + n, cmp1);
	for(int i = 1; i <= n; ++ i){
		a[++ m] = (Code){
			b[i].id, b[i + 1].id, choose(i, i + 1)
		};
	}
	sort(b + 1, b + 1 + n, cmp2);
	for(int i = 1; i <= n; ++ i){
		a[++ m] = (Code){
			b[i].id, b[i + 1].id, choose(i, i + 1)
		};
	}
	sort(b + 1, b + 1 + n, cmp3);
	for(int i = 1; i <= n; ++ i){
		a[++ m] = (Code){
			b[i].id, b[i + 1].id, choose(i, i + 1)
		};
	}
	sort(a + 1, a + 1 + m, cmp);
	kruskal();
	write(ans);
	return 0;
}

RT。

2023/3/22 19:57
加载中...