제출 #1157382

#제출 시각아이디문제언어결과실행 시간메모리
1157382eudhsyfSirni (COCI17_sirni)C++20
0 / 140
287 ms65332 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int nmax = 1e7 + 5;
int a[nmax], vis[nmax];
struct E {
    int u, v, w;
    bool operator<(const E &other) const {
        return w < other.w;
    }
}; 
vector<E> edges;
class DSU
{
private:
    vector<int> parent, rank;

public:
    DSU(int n)
    {
        parent.resize(n + 1);
        rank.resize(n + 1, 0);
        for (int i = 1; i <= n; i++)
        {
            parent[i] = i;
        }
    }
    int find_set(int v)
    {
        if (v == parent[v])
            return v;
        return parent[v] = find_set(parent[v]);
    }
    bool union_sets(int a, int b)
    {
        a = find_set(a);
        b = find_set(b);
        if (a != b)
        {
            if (rank[a] < rank[b])
                swap(a, b);
            parent[b] = a;
            if (rank[a] == rank[b])
                rank[a]++;
            return false;
        }
        return true;
    }
};
int n;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        vis[a[i]] = i;
    }
    DSU dsu(n);
    sort(a + 1, a + n + 1);
    n = unique(a + 1, a + n + 1) - a - 1;
    a[n + 1] = 1e9;
    int m = a[n];
    for (int i = 1; i <= n; i++)
    {
        for (int j = 2 * a[i]; j <= m; j += a[i])
        {
            int l = upper_bound(a + 1, a + n + 2, j - a[i]) - a;
            if (a[l] <= j)
            {
                edges.push_back({i, l, a[l] % a[i]});
            }
        }
    }
    sort(edges.begin(), edges.end());
    int res = 0;
    for (auto [u, v, w] : edges) {
        if(!dsu.union_sets(u, v)) {
            res += w;
        }
    }
    cout << res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...