Submission #55324

# Submission time Handle Problem Language Result Execution time Memory
55324 2018-07-07T01:24:48 Z IvanC Sirni (COCI17_sirni) C++17
112 / 140
5000 ms 549396 KB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<int,int> ii;
 
const int MAXN = 1e7 + 1;
 
int pai[MAXN],proximo[MAXN],N,conjuntos;
vector<int> ordenado;
vector<ii> Kruskal[MAXN]; 
 
int find(int x){
	int y = x;
	while(pai[y] != y) y = pai[y];
	while(x != y){
		int z = pai[x];
		pai[x] = y;
		x = z; 
	}
	return y;
}
 
void join(int x,int y){
	x = find(x);y = find(y);
	if(x == y) return;
	conjuntos--;
	if(x > y) swap(x,y);
	pai[y] = x;
}
 
int main(){
 
	scanf("%d",&N);
	int maioral = 0;
	for(int i = 1;i<=N;i++){
		int x;
		scanf("%d",&x);
		maioral = max(maioral,x);
		if(pai[x] == x) continue;
		pai[x] = x;
		conjuntos++;
	}
 


	for(int i = 1;i<=maioral;i++){
		if(pai[i] == 0) continue;
		ordenado.push_back(i);
		for(int j = 2*i;j<=maioral;j+=i) if(pai[j] != 0) join(i,j);
	}
 
	int ultimo_visto = ordenado.back();
 
	for(int i = maioral;i>=1;i--){
		proximo[i] = ultimo_visto;
		if(!ordenado.empty() && ordenado.back() == i){
			ultimo_visto = i;
			ordenado.pop_back();
		}
	}
 
 	if(conjuntos == 1){
 		printf("0\n");
 		return 0;
 	}

	for(int i = 2;i<=maioral;i++){
		if(pai[i] == 0) continue;
		ultimo_visto = -1;
		for(int j = i;j<=maioral;j+=i){
			int candidato = proximo[j];
			if(candidato == ultimo_visto) continue;
			ultimo_visto = candidato;
			Kruskal[candidato % i].push_back(ii(i,candidato));
		}
	}
 
	ll total = 0;
	for(int w = 0;w<maioral && conjuntos > 1;w++){
 	
		for(ii davez : Kruskal[w]){
			int u = davez.first, v = davez.second;
			if(find(u) != find(v)){
				join(u,v);
				total += w;
			}
		}
		
	}
 
	printf("%lld\n",total);
 
	return 0;
}

Compilation message

sirni.cpp: In function 'int main()':
sirni.cpp:34:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&N);
  ~~~~~^~~~~~~~~
sirni.cpp:38:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&x);
   ~~~~~^~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 275 ms 278008 KB Output is correct
2 Correct 389 ms 278648 KB Output is correct
3 Correct 290 ms 278648 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 196 ms 278648 KB Output is correct
2 Correct 829 ms 278648 KB Output is correct
3 Correct 283 ms 278648 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 286 ms 278648 KB Output is correct
2 Correct 289 ms 278648 KB Output is correct
3 Correct 283 ms 278720 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 307 ms 278720 KB Output is correct
2 Correct 437 ms 279592 KB Output is correct
3 Correct 303 ms 279592 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 218 ms 279592 KB Output is correct
2 Correct 346 ms 279592 KB Output is correct
3 Correct 249 ms 279592 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 316 ms 279592 KB Output is correct
2 Correct 378 ms 294344 KB Output is correct
3 Correct 298 ms 294344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 219 ms 294344 KB Output is correct
2 Correct 462 ms 294344 KB Output is correct
3 Correct 312 ms 294344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 608 ms 326264 KB Output is correct
2 Correct 3886 ms 519884 KB Output is correct
3 Correct 591 ms 519884 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 557 ms 519884 KB Output is correct
2 Execution timed out 5073 ms 549396 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 418 ms 549396 KB Output is correct
2 Execution timed out 5062 ms 549396 KB Time limit exceeded
3 Halted 0 ms 0 KB -