結果
| 問題 |
No.1059 素敵な集合
|
| コンテスト | |
| ユーザー |
anagohirame
|
| 提出日時 | 2020-05-23 00:21:17 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 30 ms / 2,000 ms |
| コード長 | 1,139 bytes |
| コンパイル時間 | 1,663 ms |
| コンパイル使用メモリ | 171,904 KB |
| 実行使用メモリ | 8,192 KB |
| 最終ジャッジ日時 | 2024-07-23 09:35:45 |
| 合計ジャッジ時間 | 2,496 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
class UnionFind {
public:
vector<ll> table, num;
UnionFind(){}
UnionFind(int size){
table.resize(size, -1);
num.resize(size, 1);
}
int find(int x){
if (table[x] < 0) return x;
else {
table[x] = find(table[x]);
return table[x];
}
}
bool same(int x, int y) {
return find(x) == find(y);
}
bool is_root(int x){
if (table[x] < 0) return true;
else return false;
}
ll get_size(int x){
return num[find(x)];
}
void unite(int x, int y){
int r1 = find(x);
int r2 = find(y);
if (r1 != r2) {
if (table[r1] > table[r2]){
table[r2] = r1;
table[r1]--;
num[r1] += num[r2];
num[r2]--;
} else {
table[r1] = r2;
table[r2]--;
num[r2] += num[r1];
num[r1]--;
}
}
return;
}
};
int main() {
int l, r; cin >> l >> r;
UnionFind uf(r-l+1);
for (int i = l; i < r+1; ++i) {
for (int j = 2*i; j < r+1; j += i) {
uf.unite(i-l, j-l);
}
}
int ans = -1;
for (int i = 0; i < r-l+1; ++i) {
if (uf.is_root(i)) ans++;
}
cout << ans << endl;
return 0;
}
anagohirame