結果
問題 | No.1059 素敵な集合 |
ユーザー | KoD |
提出日時 | 2020-05-22 21:48:48 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 209 ms / 2,000 ms |
コード長 | 2,508 bytes |
コンパイル時間 | 665 ms |
コンパイル使用メモリ | 79,228 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-23 09:27:57 |
合計ジャッジ時間 | 2,952 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 209 ms
6,940 KB |
testcase_02 | AC | 54 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 32 ms
6,940 KB |
testcase_07 | AC | 30 ms
6,940 KB |
testcase_08 | AC | 52 ms
6,944 KB |
testcase_09 | AC | 10 ms
6,940 KB |
testcase_10 | AC | 57 ms
6,940 KB |
testcase_11 | AC | 34 ms
6,940 KB |
testcase_12 | AC | 18 ms
6,940 KB |
testcase_13 | AC | 84 ms
6,944 KB |
testcase_14 | AC | 3 ms
6,944 KB |
testcase_15 | AC | 167 ms
6,944 KB |
testcase_16 | AC | 43 ms
6,944 KB |
testcase_17 | AC | 46 ms
6,940 KB |
testcase_18 | AC | 138 ms
6,944 KB |
testcase_19 | AC | 208 ms
6,940 KB |
testcase_20 | AC | 207 ms
6,944 KB |
testcase_21 | AC | 182 ms
6,940 KB |
ソースコード
#include <iostream> #include <algorithm> #include <utility> #include <vector> #include <numeric> template <class T, class U> inline bool chmin(T &lhs, const U &rhs) { if (lhs > rhs) { lhs = rhs; return true; } return false; } template <class T, class U> inline bool chmax(T &lhs, const U &rhs) { if (lhs < rhs) { lhs = rhs; return true; } return false; } // [l, r) from l to r struct range { struct itr { int i; constexpr itr(int i_): i(i_) { } constexpr void operator ++ () { ++i; } constexpr int operator * () const { return i; } constexpr bool operator != (itr x) const { return i != x.i; } }; const itr l, r; constexpr range(int l_, int r_): l(l_), r(std::max(l_, r_)) { } constexpr itr begin() const { return l; } constexpr itr end() const { return r; } }; // [l, r) from r to l struct revrange { struct itr { int i; constexpr itr(int i_): i(i_) { } constexpr void operator ++ () { --i; } constexpr int operator * () const { return i; } constexpr bool operator != (itr x) const { return i != x.i; } }; const itr l, r; constexpr revrange(int l_, int r_): l(l_ - 1), r(std::max(l_, r_) - 1) { } constexpr itr begin() const { return r; } constexpr itr end() const { return l; } }; class union_find { private: int component; std::vector<int> parent; public: union_find() = default; union_find(int size_) { init(size_); } void init(int size_) { component = size_; parent.assign(size_, -1); } int count_components() const { return component; } int component_size(int i) { return -parent[find_parent(i)]; } bool same_component(int i, int j) { return find_parent(i) == find_parent(j); } int find_parent(int i) { if (parent[i] < 0) { return i; } else { return parent[i] = find_parent(parent[i]); } } bool unite(int i, int j) { i = find_parent(i); j = find_parent(j); if (i == j) { return false; } if (parent[i] > parent[j]) { std::swap(i, j); } parent[i] += parent[j]; parent[j] = i; --component; return true; } }; int main() { int L, R; std::cin >> L >> R; union_find uni(R - L + 1); for (int i = L; i <= R; ++i) { for (int x = 1; x * x <= i; ++x) { if (i % x == 0) { if (x >= L) uni.unite(i - L, x - L); if (i / x >= L) uni.unite(i - L, i / x - L); } } } std::cout << uni.count_components() - 1 << '\n'; return 0; }