Submission #1301985

#TimeUsernameProblemLanguageResultExecution timeMemory
1301985EkinOnalSirni (COCI17_sirni)C++20
14 / 140
667 ms851968 KiB
#include <bits/stdc++.h>
using namespace std;

// #define double long double
#define int long long
#define pb push_back
#define vi vector<int>
#define vpii vector<pair<int,int>>
#define MAX 200005
#define f first
#define s second
const int INF = 1e18;
const int mod = 1e9+7;
#define pii pair<int,int>
	
int sum(int a,int b){return ((a%mod)+(b%mod))%mod;}
int mul(int a,int b){return ((a%mod)*(b%mod))%mod;}

vi dsu(1e7+2),sz(1e7+2);

int find(int a){
	if(dsu[a]==a) return a;
	return dsu[a]=find(dsu[a]);
}

bool unite(int a,int b){
	a=find(a); b=find(b);
	if(a==b) return 0;
	if(sz[a]<sz[b]) swap(a,b);
	sz[a]+=sz[b]; dsu[b]=a;
	return 1;
}	

vector<array<int,3>> edges;
void solve(){
	int n; cin>>n;
	vi v(n); for(int i=0;i<n;i++) cin>>v[i],dsu[i]=i,sz[i]=1;

	sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());
	int largest=v.back();

	vi nxt(largest+2,-1); for(int i=0;i<v.size();i++) nxt[v[i]]=i;
	for(int i=largest-1;i>=0;i--){
		if(nxt[i]==-1) nxt[i]=nxt[i+1];
	}



	vector<vector<pair<int, int>>> good_links(largest + 1);
	for (int i = 0; i < v.size() - 1; i++) {
		// get all relevant v this card could be connected to
		good_links[v[i + 1] % v[i]].push_back({i, i + 1});
		for (int at = 2 * v[i]; at <= largest; at += v[i]) {
			int good_mod = nxt[at];
			good_links[v[good_mod] % v[i]].push_back({i, good_mod});
		}
	}

	long long total_cost = 0;
	for (int c = 0; c <= largest; c++) {
		for (const pair<int, int> &link : good_links[c]) {
			bool result = unite(link.first, link.second);
			total_cost += c * result;
		}
	}

	cout << total_cost << endl;

	// for(int i=0;i<v.size()-1;i++){
	// 	edges.pb({ v[i+1]%v[i] , i, i+1 });
	// 	for(int j=2*v[i];j<=largest;j+=v[i]){

	// 		edges.pb({ v[nxt[j]] % v[i] , i , nxt[j] } );
	// 	}
	// }
	// sort(edges.begin(),edges.end());

	// int ans=0;
	// for(auto u : edges){
	// 	// cout<<u[0]<<" "<<u[1]<<" "<<u[2]<<endl;
	// 	if(find(u[1])==find(u[2])) continue;
	// 	ans+=u[0]; unite(u[1],u[2]);
	// 	// cout<<u[0]<<" "<<u[1]<<" "<<u[2]<<endl;
	// }
	// cout<<ans<<endl;
}	
	
int32_t main(){
	// freopen("walk.in","r",stdin);
	// freopen("walk.out","w",stdout);

	int t=1; 
	// cin>>t;
	while(t--) solve();

}	
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...