/*
https://github.com/mostafa-saad/MyCompetitiveProgramming/blob/master/Olympiad/COCI/official/2017/contest6_solutions/solutions.pdf
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define For(i, a, b) for(int i=a; i<b; i++)
#define ffi For(i, 0, N)
#define ffj For(j, 0, M)
#define ffa ffi ffj
#define s <<" "<<
#define c <<" : "<<
#define w cout
#define e endl//"\n"
#define pb push_back
#define mp make_pair
#define a first
#define b second
//#define int ll
const int MAXN=100000, INF=1000000000;
///500,000,000
int N, big, par[MAXN], siz[MAXN];
ll out;
set<int> inp;
vector<int> vals;
vector<pair<int, pair<int, int> > > edges; /// (weight, (n1, n2))
void make(int n1, int x, int add=0) {
int a = 0, b=N+1;
while (a != b) {
int mid = (a+b)/2;
if (vals[mid] >= x) b = mid;
else a = mid+1;
}
if (vals[a] == INF) return;
if (edges.size() > 0 && edges.back().b.a == n1 && edges.back().b.b == a) {
edges.pop_back();
//w<< "remove"<<e;
}
edges.pb(mp(vals[a]-x+add, mp(n1, a)));
//w<< "connecting" s n1+1 s a+1 s x c vals[a]-x+add<<e;
}
int root (int x) {
if (par[x] == x) return x;
par[x] = root(par[x]);
return par[x];
}
int join(int a, int b) {
if (siz[a] > siz[b]) {
/// push b into a
siz[a] += siz[b];
par[b] = a;
}
else {
/// push a into b
siz[b] += siz[a];
par[a] = b;
}
}
main() {
//ifstream cin("test.in");
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N;
ffi {int a; cin >> a; inp.insert(a); par[i] = i; siz[i] = 1;}
for (int i: inp) vals.pb(i); vals.pb(INF);
big = vals[vals.size()-2];
N = vals.size()-1;
ffi {
int x = vals[i];
make(i, x+1, 1);
for (int j=x+x; j<=big; j+=x) {
make(i, j);
}
}
sort(edges.begin(), edges.end());
for (auto i: edges) {
int cost = i.a, a = i.b.a, b = i.b.b;
if (root(a) == root(b)) continue;
out += cost;
join(par[a], par[b]); /// just called root so this should be fine
}
w<< out<<e;
}
Compilation message
sirni.cpp: In function 'int join(int, int)':
sirni.cpp:60:1: warning: no return statement in function returning non-void [-Wreturn-type]
}
^
sirni.cpp: At global scope:
sirni.cpp:62:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
main() {
^
sirni.cpp: In function 'int main()':
sirni.cpp:67:2: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
for (int i: inp) vals.pb(i); vals.pb(INF);
^~~
sirni.cpp:67:31: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
for (int i: inp) vals.pb(i); vals.pb(INF);
^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
504 KB |
Output is correct |
2 |
Correct |
105 ms |
3632 KB |
Output is correct |
3 |
Correct |
5 ms |
700 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
640 KB |
Output is correct |
2 |
Correct |
1033 ms |
1364 KB |
Output is correct |
3 |
Correct |
5 ms |
760 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
632 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
3 ms |
632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
321 ms |
18652 KB |
Output is correct |
2 |
Correct |
1085 ms |
55260 KB |
Output is correct |
3 |
Correct |
449 ms |
30248 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
41 ms |
4412 KB |
Output is correct |
2 |
Correct |
496 ms |
51036 KB |
Output is correct |
3 |
Correct |
310 ms |
17756 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
680 ms |
55536 KB |
Output is correct |
2 |
Correct |
1395 ms |
104632 KB |
Output is correct |
3 |
Correct |
421 ms |
30876 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
104 ms |
8676 KB |
Output is correct |
2 |
Correct |
1306 ms |
103924 KB |
Output is correct |
3 |
Correct |
412 ms |
30324 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
386 ms |
31232 KB |
Output is correct |
2 |
Execution timed out |
5098 ms |
401468 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
386 ms |
31252 KB |
Output is correct |
2 |
Execution timed out |
5109 ms |
400436 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
53 ms |
4904 KB |
Output is correct |
2 |
Execution timed out |
5124 ms |
400060 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |