Submission #503520

#TimeUsernameProblemLanguageResultExecution timeMemory
503520hoanghq2004Sirni (COCI17_sirni)C++14
140 / 140
3131 ms440132 KiB
#include <bits/stdc++.h>
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;

const int Nmax = 1e5 + 10;

int n, a[Nmax];
int root[Nmax], sz[Nmax];
int near[10000010];

inline int Find(int u) { return (u == root[u] ? u : root[u] = Find(root[u])); }

int comp;
long long cost = 0;

inline int Union(int u, int v, int w) {
    if ((u = Find(u)) == (v = Find(v)))
        return 0;
    if (sz[u] < sz[v])
        swap(u, v);
    sz[u] += sz[v];
    root[v] = u;
    --comp;
    cost += w;
    if (comp == 1) {
        cout << cost << "\n";
        exit(0);
    }
    return 1;
}

vector<pair<int, int> > e[10000010];

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];
    sort(a + 1, a + n + 1);
    n = unique(a + 1, a + n + 1) - a - 1;
    comp = n;
    for (int i = 1; i <= n; ++i) near[a[i]] = i;
    for (int i = a[n]; i >= 0; --i)
        if (!near[i])
            near[i] = near[i + 1];

    for (int i = 1; i <= n; ++i) root[i] = i, sz[i] = 1;
    for (int i = 1; i <= n; ++i) {
        if (i + 1 <= n)
            e[a[i + 1] % a[i]].push_back({ i, i + 1 });
        for (int j = a[i] * 2; j <= a[n]; j += a[i]) {
            int t = near[j];
            if (a[t] - j >= a[i])
                continue;
            if (Find(t) == Find(i))
                continue;
            if (a[t] == j)
                Union(i, t, 0);
            else
                e[a[t] - j].push_back({ i, t });
        }
    }
    //    cout << e.size() << "\n";
    for (int i = 1; i <= a[n]; ++i) {
        for (auto [u, v] : e[i]) Union(u, v, i);
    }
}

Compilation message (stderr)

sirni.cpp:2: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    2 | #pragma GCC optimization ("O3")
      | 
sirni.cpp:3: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    3 | #pragma GCC optimization ("unroll-loops")
      | 
sirni.cpp: In function 'int main()':
sirni.cpp:74:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   74 |         for (auto [u, v] : e[i]) Union(u, v, i);
      |                   ^
#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...