답안 #830188

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
830188 2023-08-18T23:27:56 Z Mathandski Sirni (COCI17_sirni) C++14
140 / 140
4097 ms 576248 KB
#include <bits/stdc++.h> 
using namespace std;
#define pb push_back 
#define is insert
#define ll long long
#define V vector
#define MS multiset
#define PL pair<int, int>
#define F first
#define S second
#define PQ priority_queue
#define f0r(i, begin, end) for (int i = begin; i < end; i ++) 
#define For(i, end, begin) for (int i = end; i > begin; i --) 
#define all(x) x.begin(), x.end()
#define INF 1000000000000000000
#define inf 1000000000
#define MOD 1000000009
#define len(x) (int)x.size()
#define fileread(file) ifstream fin; fin.open((string)file + ".in"); ofstream fout; fout.open((string)file + ".out")
#define fastio ios_base::sync_with_stdio(0); cin.tie(nullptr)
template<typename T> istream& operator>>(istream& in, V<T>& a) {for(auto &x : a) in >> x; return in;};
template<typename T> ostream& operator<<(ostream& out, V<T>& a) {for(auto &x : a) out << x << ' '; return out;};

struct DSU {
	vector<int> e;
	DSU(int N) { e = vector<int>(N, -1); }

	// get representive component (uses path compression)
	int get(int x) { return e[x] < 0 ? x : e[x] = get(e[x]); }

	bool same_set(int a, int b) { return get(a) == get(b); }

	int size(int x) { return -e[get(x)]; }

	bool unite(int x, int y) {  // union by size
		x = get(x), y = get(y);
		if (x == y) return false;
		if (e[x] > e[y]) swap(x, y);
		e[x] += e[y];
		e[y] = x;
		return true;
	}
};

int N;
ll ans = 0;
set<int> nums;
int decomp[10000001];
vector<PL> edges[10000001];

void krustal () {
    int tot = N - 1;
    DSU dsu(N);
    f0r (i, 0, 10000001) {
        for (auto e : edges[i]) {
            if (dsu.unite(e.F, e.S)) {
                ans += i;
                if ((--tot) == 0) break;
            }
        }
        if (tot == 0) break;
    }
}

int main () {
    cin >> N;
    DSU dsu(N);
    f0r (i, 0, N) {
        int a; cin >> a;
        nums.is(a);
    }
    int i = 0;
    for (auto n : nums) {
        decomp[n] = (i ++);
    }

    for (auto n : nums) {
        auto pos = nums.lower_bound(n + 1);
        int factor = 1;
        while (pos != nums.end()) {
            if ((*pos) / n > factor) {
                factor = (*pos) / n;
            }
            edges[(*pos) % n].pb({decomp[n], decomp[*pos]});
            pos = nums.lower_bound((++factor) * n);
        }
    }
    
    krustal();
    cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 238948 KB Output is correct
2 Correct 127 ms 239616 KB Output is correct
3 Correct 101 ms 239268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 115 ms 235308 KB Output is correct
2 Correct 119 ms 236468 KB Output is correct
3 Correct 120 ms 239284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 104 ms 239188 KB Output is correct
2 Correct 124 ms 237648 KB Output is correct
3 Correct 107 ms 239188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 332 ms 253388 KB Output is correct
2 Correct 737 ms 280208 KB Output is correct
3 Correct 336 ms 257544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 147 ms 241420 KB Output is correct
2 Correct 346 ms 261320 KB Output is correct
3 Correct 288 ms 250752 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 513 ms 265576 KB Output is correct
2 Correct 842 ms 295104 KB Output is correct
3 Correct 346 ms 257192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 175 ms 241016 KB Output is correct
2 Correct 703 ms 288712 KB Output is correct
3 Correct 321 ms 255824 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 381 ms 291692 KB Output is correct
2 Correct 3058 ms 487440 KB Output is correct
3 Correct 399 ms 294792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 378 ms 291588 KB Output is correct
2 Correct 4097 ms 576248 KB Output is correct
3 Correct 430 ms 298408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 272572 KB Output is correct
2 Correct 3647 ms 564940 KB Output is correct
3 Correct 347 ms 258516 KB Output is correct