70pts,RE三个点求救
查看原帖
70pts,RE三个点求救
752094
MornHus楼主2023/1/14 13:11
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;
	char c=getchar();
	while(c>'9'||c<'0'){
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar();
	}
	return x;
}
struct lines{
	int u,v;
	long long val;
	bool operator < (const lines & a)const{
		return val<a.val;
	}
}l[250001];
int n;
int f[250001];
int size[250001];
int a[250001];
int tot;
int find(int x){
	if(f[x]!=x)f[x]=find(f[x]);
	return f[x];
}
inline void unity(int x,int y,long long w){
	x=find(x);
	y=find(y);
	if(x!=y){
		f[x]=y;
		size[y]+=size[x];
		if(size[y]>=(n*n+1)/2){
			cout<<w;
			exit(0);
		}
	}
}
inline int ex(int i,int j){
	return (i-1)*n+j;
}
inline void buildmap(){
	for(int i=2;i<=n;i++){
		for(int j=1;j<=n;j++){
			l[++tot].u=ex(i,j);
			l[tot].v=ex(i-1,j);
			l[tot].val=abs(a[ex(i,j)]-a[ex(i-1,j)]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<n;j++){
			l[++tot].u=ex(i,j);
			l[tot].v=ex(i,j+1);
			l[tot].val=abs(a[ex(i,j)]-a[ex(i,j+1)]);
		}
	}
}
int main(){
	n=read();
	for(int i=1;i<=n*n;i++){
		f[i]=i;
		size[i]=1;
	}
	for(int i=1;i<=n*n;i++){
		a[i]=read();
	}
	buildmap();
	sort(l+1,l+tot+1);
	for(int i=1;i<=tot;i++){
		if(find(l[i].u)!=find(l[i].v)){
			unity(l[i].u,l[i].v,l[i].val);
		}
	}
	return 0;
} 
2023/1/14 13:11
加载中...