121pts,求助,悬关
查看原帖
121pts,求助,悬关
561632
Chis725楼主2023/10/19 19:33
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+1;
int a[N],x,maxn,n,fa[N],ans;
inline int read() {
	int x = 0, c = getchar();
	while (!isdigit(c))
		c = getchar();
	while (isdigit(c)) {
		x = 10 * x + c - '0';
		c = getchar();
	}
	return x;
}
struct node{
	int u,v,w;
};
vector<node> e;
int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	fa[find(x)]=find(y);
}
bool cmp(node x,node y){
	return x.w<y.w;
}
signed main(){
	//scanf("%lld",&n);
	n=read();
	for(int i=1;i<=n;i++){
		//scanf("%lld",&a[i]);
		a[i]=read();
		maxn=max(maxn,a[i]);
	}
	sort(a+1,a+n+1);
	n=unique(a+1,a+n+1)-a-1;
	for(int i=1;i<=n;i++){
        fa[i]=i;
		int x=a[i];
		for(int j=x;j<=maxn;j+=x){
			int k=lower_bound(a+i+1,a+n+1,j)-a;
			if (k<=n&&a[k]/x==j/x)e.push_back({i,k,a[k]%a[i]});
		}
	}
	sort(e.begin(),e.end(),cmp);
	if(n==1){
		cout<<0;
		return 0;
	}
	for(int i=0;i<e.size();i++){
		if(find(e[i].u)!=find(e[i].v)){
			merge(e[i].u,e[i].v);
			ans+=e[i].w;
		}
	}
	printf("%lld",ans);
	return 0;
}

求助,T第8,26,29,32这四个点

2023/10/19 19:33
加载中...