Submission #1057635

#TimeUsernameProblemLanguageResultExecution timeMemory
1057635vjudge1Sirni (COCI17_sirni)C++17
140 / 140
2173 ms545052 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
#define all(s) s.begin(), s.end()

const int ar = 1e7+2;
const ll mod = 1e9+7;
const int oo = 1e9;

int n, x, ma = 0;
vector <int> a;

#define set3 pair <int, int>

vector <set3> edge[ar];

int lab[ar];

int find_set(int v) {
    return lab[v] < 0 ? v : lab[v] = find_set(lab[v]);
}

bool union_sets(int a, int b) {
    a = find_set(a);
    b = find_set(b);

    if (a != b) {
        if (lab[a] > lab[b]) swap(a, b);
        lab[a] += lab[b];
        lab[b] = a;
        return 1;
    }
    return 0;
}
bool check[ar];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    #define task "MODST"
    if(fopen(task".inp", "r")) {
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }

    cin >> n;
    a.push_back(0);
    for(int i = 1; i <= n; ++i) {
        cin >> x;
        a.push_back(x);
        ma = max(ma, x);
    }
    sort(all(a));
    a.resize(unique(all(a)) - a.begin());
    n = a.size() - 1;

    for(int i = 1; i <= n; ++i) {
        lab[i] = -1;
        vector <int> ex;
        if(i < n) {
            check[i + 1] = 1;
            ex.push_back(i + 1),
            edge[a[i + 1] % a[i]].push_back({i, i + 1});
        }
        for(int j = a[i] * 2; j <= ma; j += a[i]) {
            int p = lower_bound(all(a), j) - a.begin();
            if(p <= n && !check[p])
                check[p] = 1, ex.push_back(p),
                edge[a[p] % a[i]].push_back({i, p});
        }
        for(auto x : ex) check[x] = 0;
    }

    ll res = 0;
    for(int i = 0; i <= ma; ++i) if(edge[i].size())
    for(auto &[u, v] : edge[i]) if(union_sets(u, v))
        res += i;
    cout << res;

    return 0;
}

Compilation message (stderr)

sirni.cpp: In function 'int main()':
sirni.cpp:44:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   44 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sirni.cpp:45:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...