Submission #927910

#TimeUsernameProblemLanguageResultExecution timeMemory
927910Beerus13Sirni (COCI17_sirni)C++14
140 / 140
1448 ms669112 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
const int N = 1e5 + 5;
const int maxn = 1e7 + 5;

int n, a[N], Next[maxn];
bool exist[maxn];
int par[maxn], sz[maxn];
vector<pii> g[maxn];

int find(int u) {
    if(u == par[u]) return u;
    return par[u] = find(par[u]);
}

bool join(int u, int v) {
    u = find(u); v = find(v);
    if(u == v) return true;
    if(sz[u] < sz[v]) swap(u, v);
    sz[u] += sz[v];
    par[v] = u;
    return false;
}

void solve() {
    cin >> n;
    int Max = 0;
    for(int i = 1; i <= n; ++i) {
        cin >> a[i];
        Next[a[i]] = a[i];
        Max = max(Max, a[i]);
        exist[a[i]] = 1;
    }
    for(int i = Max; i >= 0; --i) {
        if(!exist[i]) Next[i] = Next[i + 1];
    }
    for(int i = 1; i <= n; ++i) {
        if(!exist[a[i]]) continue;
        int x = a[i];
        for(int j = 1; j <= Max / x; ++j) {
            int y = (j == 1) ? x + 1 : x * j;
            y = Next[y];
            if(x * (j + 1) > y) g[y % x].emplace_back(y, x);   
        }
        exist[a[i]] = 0; // duyet 1 lan
    }
    int ans = 0;
    for(int i = 1; i <= n; ++i) par[a[i]] = a[i], sz[a[i]] = 1;
    for(int i = 0; i <= Max; ++i) {
        for(auto [u, v] : g[i]) {
            if(!join(u, v)) ans += i;
        }
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int test = 1;
    // cin >> test;
    while(test--) solve();
}

/*
    g[i] : cách cạnh có độ dài i
    y > x -> giá trị cạnh = y % x
    -> Max = max(a[i])
    với mỗi node giá trị x, duyệt bội của x -> y = k * x <= Max
                                            tìm số gần y nhất xuất hiện -> push cạnh 
    -> tìm cây khung nhỏ nhất
*/

Compilation message (stderr)

sirni.cpp: In function 'void solve()':
sirni.cpp:52:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   52 |         for(auto [u, v] : g[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...