結果
問題 | No.1059 素敵な集合 |
ユーザー | kkk |
提出日時 | 2024-11-30 02:58:57 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 678 ms / 2,000 ms |
コード長 | 1,982 bytes |
コンパイル時間 | 954 ms |
コンパイル使用メモリ | 89,364 KB |
実行使用メモリ | 52,556 KB |
最終ジャッジ日時 | 2024-11-30 02:59:03 |
合計ジャッジ時間 | 5,490 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 678 ms
52,432 KB |
testcase_02 | AC | 96 ms
6,352 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 61 ms
6,480 KB |
testcase_07 | AC | 57 ms
6,480 KB |
testcase_08 | AC | 95 ms
6,480 KB |
testcase_09 | AC | 16 ms
5,248 KB |
testcase_10 | AC | 123 ms
9,552 KB |
testcase_11 | AC | 67 ms
6,356 KB |
testcase_12 | AC | 33 ms
5,248 KB |
testcase_13 | AC | 163 ms
9,428 KB |
testcase_14 | AC | 5 ms
5,248 KB |
testcase_15 | AC | 350 ms
15,692 KB |
testcase_16 | AC | 78 ms
6,352 KB |
testcase_17 | AC | 81 ms
6,484 KB |
testcase_18 | AC | 184 ms
5,248 KB |
testcase_19 | AC | 616 ms
52,428 KB |
testcase_20 | AC | 606 ms
52,556 KB |
testcase_21 | AC | 329 ms
15,696 KB |
ソースコード
#include <vector> #include <math.h> #include <iostream> #include <algorithm> using namespace std; #define FOR(i, N) for(int i=0; i<(N); i++) #define REP(i, N) for(int i=1; i<=(N); i++) typedef pair<int, int> Edge; struct Union_Find { vector<int> parent, rank; Union_Find(int n){ parent.resize(n, 0); rank.resize(n, 0); for (int i=0; i<n; i++){ parent[i] = i; rank[i] = 0; } } int get_parent(int x){ if (x != parent[x]){ parent[x] = get_parent(parent[x]); } return parent[x]; } void unite(int x, int y){ x = get_parent(x); y = get_parent(y); if (rank[x] > rank[y]){ parent[y] = x; }else{ parent[x] = y; if (rank[x] == rank[y]){ rank[y]++; } } return; } }; int main() { int L, R; vector<pair<int, Edge>> edges; cin >> L >> R; for(int i=L; i<=R; i++){ if (i < R) edges.push_back({1, {i, i+1}}); for(int j=1; j<=sqrt(i); j++){ if (i % j == 0){ if (L <= j && j < i){ edges.push_back({0, {i, j}}); } if (L <= (i/j) && (i/j) < i && j != (i/j)){ edges.push_back({0, {i, i/j}}); } } } } sort(edges.begin(), edges.end()); int V = R - L + 1; int v_cnt = 0; int answer = 0; Union_Find uf(V); for (auto e : edges){ int cost = e.first; int e1 = e.second.first - L; int e2 = e.second.second - L; if (uf.get_parent(e1) != uf.get_parent(e2)){ uf.unite(e1, e2); answer += cost; v_cnt++; } if (v_cnt == V-1){ break; } } cout << answer << endl;; return 0; }