Submission #799501

#TimeUsernameProblemLanguageResultExecution timeMemory
799501iskhakkutbilimSirni (COCI17_sirni)C++14
140 / 140
1929 ms386244 KiB
#include <bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define all(a) a.begin(), a.end()
const int N = 1e5;
const int NUMS = 1e7;
int par[NUMS+1], sz[NUMS+1], cnt[NUMS+1], up[NUMS+1], Divs[NUMS+1];
int find_set(int v){
	if(v == par[v]) return v;
	return par[v] = find_set(par[v]);
}
long long ans;			
void union_set(int a, int b, int c){
//	cout << a << ' ' << b << ' '  << c << '\n';
	a = find_set(a);
	b = find_set(b);
	if(a == b) return;
	
	ans+= c;
	sz[a]+= sz[b];
	par[b] = a;
}
int a[N+1], n;

main(){
   ios::sync_with_stdio(0);
   cin.tie(0); cout.tie(0);
   cin >> n;
   vector<int> v;
	for(int i = 1;i <= n; i++){
		cin >> a[i];
		v.push_back(a[i]);	
	}
	for(int i = 1;i <= NUMS; i++){
		par[i] = i, sz[i] = 1;
	}		
	sort(all(v));
	v.erase(unique(all(v)), v.end());
	for(auto x : v) cnt[x] = 1;
	for(int i = 1;i < v[0]; i++) up[i] = v[0];
	for(int i = 1; i < v.size(); i++){
		for(int k = v[i-1]; k < v[i]; k++) up[k] = v[i];
	}
	if(cnt[1]){
		cout << 0;
		return 0;
	}
	vector< pair<int, pair<int,int>>> edge;
	for(int i = 1;i <= NUMS; i++){
		if(!cnt[i]) continue;
		if(Divs[i]) continue;
		for(int j = i; j <= NUMS; j+= i){
			if(cnt[j]) union_set(i, j, 0);
			if(up[j] != 0 and up[j] < (j+i)){
				if(cnt[up[j]])
				edge.push_back({up[j]%i, {i, up[j]}});
			}
			Divs[j] = i;
		}
		
	}
	sort(all(edge));
	for(auto [x, u] : edge){
		union_set(u.ff, u.ss, x);
	}
	cout << ans;
	
	return 0;
}

Compilation message (stderr)

sirni.cpp:27:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   27 | main(){
      | ^~~~
sirni.cpp: In function 'int main()':
sirni.cpp:43:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |  for(int i = 1; i < v.size(); i++){
      |                 ~~^~~~~~~~~~
sirni.cpp:65:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   65 |  for(auto [x, u] : edge){
      |           ^
#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...