Submission #888046

# Submission time Handle Problem Language Result Execution time Memory
888046 2023-12-15T20:42:56 Z shmax Sirni (COCI17_sirni) C++14
140 / 140
1622 ms 399848 KB
/*
 * powered by ANDRIY POPYK
 * in honor of MYSELF and SEGMENT DECOMPOSITION and N^(log(N)) and (Harry Potter and the Methods of Rationality) and Monkie D. Luffy
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

//#pragma GCC optimize("O3")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC optimization ("unroll-loops")
//#pragma GCC target("avx,avx2,sse,sse2,sse3,sse4,popcnt")

using namespace std;
using namespace __gnu_pbds;
#define int long long
#define float long double
#define elif else if
#define endl "\n"
#define mod 1000000007
#define pi acos(-1)
#define eps 0.000000001
#define inf 1000'000'000'000'000'000LL
#define FIXED(a) cout << fixed << setprecision(a)
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define time_init auto start = std::chrono::high_resolution_clock::now()
#define time_report                                       \
    auto end = std::chrono::high_resolution_clock::now(); \
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << endl
#define debug(x) \
    { cerr << #x << " = " << x << endl; }
#define len(x) (int) x.size()
#define sqr(x) ((x) * (x))
#define cube(x) ((x) * (x) * (x))
#define bit(x, i) (((x) >> (i)) & 1)
#define set_bit(x, i) ((x) | (1LL << (i)))
#define clear_bit(x, i) ((x) & (~(1LL << (i))))
#define toggle_bit(x, i) ((x) ^ (1LL << (i)))
#define low_bit(x) ((x) & (-(x)))
#define count_bit(x) __builtin_popcountll(x)
#define srt(x) sort(all(x))
#define rsrt(x) sort(rall(x))
#define mp make_pair
#define maxel(x) (*max_element(all(x)))
#define minel(x) (*min_element(all(x)))
#define maxelpos(x) (max_element(all(x)) - x.begin())
#define minelpos(x) (min_element(all(x)) - x.begin())
#define sum(x) (accumulate(all(x), 0LL))
#define product(x) (accumulate(all(x), 1LL, multiplies<int>()))
#define gcd __gcd
#define lcm(a, b) ((a) / gcd(a, b) * (b))
#define rev(x) (reverse(all(x)))
#define shift_left(x, k) (rotate(x.begin(), x.begin() + k, x.end()))
#define shift_right(x, k) (rotate(x.rbegin(), x.rbegin() + k, x.rend()))
#define is_sorted(x) (is_sorted_until(all(x)) == x.end())
#define is_even(x) (((x) &1) == 0)
#define is_odd(x) (((x) &1) == 1)
#define pow2(x) (1LL << (x))

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

template<typename T>
using min_heap = priority_queue<T, vector<T>, greater<T>>;
template<typename T>
using max_heap = priority_queue<T, vector<T>, less<T>>;
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T>
using matrix = vector<vector<T>>;
template<typename T>
using graph = vector<vector<T>>;
using hashmap = gp_hash_table<int, int, custom_hash>;

template<typename T>
vector<T> vect(int n, T val) {
    return vector<T>(n, val);
}

template<typename T>
vector<vector<T>> vect(int n, int m, T val) {
    return vector<vector<T>>(n, vector<T>(m, val));
}

template<typename T>
vector<vector<vector<T>>> vect(int n, int m, int k, T val) {
    return vector<vector<vector<T>>>(n, vector<vector<T>>(m, vector<T>(k, val)));
}

template<typename T>
vector<vector<vector<vector<T>>>> vect(int n, int m, int k, int l, T val) {
    return vector<vector<vector<vector<T>>>>(n, vector<vector<vector<T>>>(m, vector<vector<T>>(k, vector<T>(l, val))));
}

template<typename T>
matrix<T> new_matrix(int n, int m, T val) {
    return matrix<T>(n, vector<T>(m, val));
}

template<typename T>
graph<T> new_graph(int n) {
    return graph<T>(n);
}

template<class T, class S>
inline bool chmax(T &a, const S &b) {
    return (a < b ? a = b, 1 : 0);
}

template<class T, class S>
inline bool chmin(T &a, const S &b) {
    return (a > b ? a = b, 1 : 0);
}

using i8 = int8_t;
using i16 = int16_t;
using i32 = int32_t;
using i64 = int64_t;
using i128 = __int128_t;
using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;
using u128 = __uint128_t;

template<typename T>
using vec = vector<T>;

using pII = pair<int, int>;
template<typename T>
using enumerated = pair<T, int>;
int n = 0;
vec<int> v;
set<int> st;
int cnt[1000'000'2];


struct DSU {
public:
    DSU() : _n(0) {}

    explicit DSU(int n) : _n(n), parent_or_size(n, -1) {}

    int unite(int a, int b) {
        assert(0 <= a && a < _n);
        assert(0 <= b && b < _n);
        int x = leader(a), y = leader(b);
        if (x == y) return x;
        if (-parent_or_size[x] < -parent_or_size[y]) std::swap(x, y);
        parent_or_size[x] += parent_or_size[y];
        parent_or_size[y] = x;
        return x;
    }

    bool one(int a, int b) {
        assert(0 <= a && a < _n);
        assert(0 <= b && b < _n);
        return leader(a) == leader(b);
    }

    int leader(int a) {
        assert(0 <= a && a < _n);
        if (parent_or_size[a] < 0) return a;
        return parent_or_size[a] = leader(parent_or_size[a]);
    }

    int size(int a) {
        assert(0 <= a && a < _n);
        return -parent_or_size[leader(a)];
    }

    std::vector<std::vector<int>> groups() {
        std::vector<int> leader_buf(_n), group_size(_n);
        for (int i = 0; i < _n; i++) {
            leader_buf[i] = leader(i);
            group_size[leader_buf[i]]++;
        }
        std::vector<std::vector<int>> result(_n);
        for (int i = 0; i < _n; i++) {
            result[i].reserve(group_size[i]);
        }
        for (int i = 0; i < _n; i++) {
            result[leader_buf[i]].push_back(i);
        }
        result.erase(
                std::remove_if(result.begin(), result.end(),
                               [&](const std::vector<int> &v) { return v.empty(); }),
                result.end());
        return result;
    }

private:
    int _n;
    // root node: -1 * component size
    // otherwise: parent
    std::vector<int> parent_or_size;
};


signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t_n;
    cin >> t_n;
    set<int> stt;
    for (int i = 0; i < t_n; i++) {
        int x;
        cin >> x;
        stt.insert(x);
    }


    v = vec<int>(all(stt));
    n = len(v);
    srt(v);
    vec<array<int, 3>> edges;
    int minE = minel(v);
    for (int i = 0; i < n; i++) {
        int x = v[i];
        int c = x;
        int y_id = lower_bound(all(v), c + 1) - v.begin();
        if (y_id == n) continue;
        if (v[y_id] % v[i] < minE)
            edges.push_back({i, y_id, v[y_id] % v[i]});
        while (x < 1000'000'2) {
            y_id = lower_bound(v.begin() + y_id, v.end(), x) - v.begin();
            if (y_id == n) break;
            if (v[y_id] % v[i] < minE)
                edges.push_back({i, y_id, v[y_id] % v[i]});
            x += c;
        }
    }


    sort(all(edges), [&](array<int, 3> &a, array<int, 3> &b) {
        return a[2] < b[2];
    });

    DSU dsu(n);
    int ans = 0;
    for (auto &t: edges) {
        if (!dsu.one(t[0], t[1])) {
            ans += t[2];
            dsu.unite(t[0], t[1]);
        }
    }
    cout << ans << endl;


}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 856 KB Output is correct
2 Correct 114 ms 50608 KB Output is correct
3 Correct 2 ms 856 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 796 KB Output is correct
2 Correct 891 ms 394612 KB Output is correct
3 Correct 3 ms 2000 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 656 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
3 Correct 2 ms 876 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 133 ms 32244 KB Output is correct
2 Correct 302 ms 56492 KB Output is correct
3 Correct 132 ms 29628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 5120 KB Output is correct
2 Correct 143 ms 51880 KB Output is correct
3 Correct 122 ms 31156 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 244 ms 56236 KB Output is correct
2 Correct 314 ms 55024 KB Output is correct
3 Correct 138 ms 31932 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 49 ms 16288 KB Output is correct
2 Correct 287 ms 55028 KB Output is correct
3 Correct 131 ms 29824 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 152 ms 30916 KB Output is correct
2 Correct 1156 ms 203800 KB Output is correct
3 Correct 180 ms 57512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 140 ms 31504 KB Output is correct
2 Correct 1622 ms 399740 KB Output is correct
3 Correct 377 ms 203476 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 9420 KB Output is correct
2 Correct 1613 ms 399848 KB Output is correct
3 Correct 137 ms 31292 KB Output is correct