Submission #1164241

#TimeUsernameProblemLanguageResultExecution timeMemory
1164241altern23Sirni (COCI17_sirni)C++17
140 / 140
1733 ms785428 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll int
#define pii pair<ll, ll>
#define fi first
#define sec second

const ll N = 1e7;
const ll INF = 4e18;
const ll MOD = 1e9 + 7;

struct DSU{
    ll n;
    vector<ll> par;
    DSU(ll _n){
        n = _n;
        par.resize(n + 5);
        for(int i = 1; i <= n; i++){
            par[i] = i;
        }
    }

    ll find(ll idx){
        if(par[idx] == idx) return idx;
        return par[idx] = find(par[idx]);
    }

    bool join(ll a, ll b){
        a = find(a), b = find(b);
        if(a == b) return false;
        par[b] = a;
        return true;
    }
};

vector<pii> edges[N + 5];
vector<ll> isi;
ll nxt[N + 5];

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int tc = 1;
    // cin >> tc;
    for(;tc--;){
        ll n; cin >> n;
        for(int i = 1; i <= n; i++){
            ll x; cin >> x;
            isi.push_back(x);
        }

        sort(isi.begin(), isi.end());
        isi.erase(unique(isi.begin(), isi.end()), isi.end());

        ll cur = 0;
        for(int i = 1; i <= N; i++){
            while(cur < isi.size() && isi[cur] < i) cur++;
            if(cur < isi.size()) nxt[i] = isi[cur];
        }

        DSU dsu(N);

        for(int i = 0; i < isi.size(); i++){
            for(ll j = isi[i]; j <= N; j += isi[i]){
                if(nxt[j]){
                    edges[nxt[j] % isi[i]].push_back({nxt[j], isi[i]});
                }
            }
        }

        for(int i = 1; i < isi.size(); i++){
            edges[isi[i] % isi[i - 1]].push_back({isi[i], isi[i - 1]});
        }

        ll ans = 0;
        for(ll i = 0; i <= N; i++){
            for(auto [x, y] : edges[i]){
                ans += dsu.join(x, y) * i;
            }
        }

        cout << ans << "\n";
    }   
}

/*

*/ 

Compilation message (stderr)

sirni.cpp:10:16: warning: overflow in conversion from 'double' to 'int' changes value from '4.0e+18' to '2147483647' [-Woverflow]
   10 | const ll INF = 4e18;
      |                ^~~~
#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...