Submission #1160191

#TimeUsernameProblemLanguageResultExecution timeMemory
116019112345678Sirni (COCI17_sirni)C++17
84 / 140
3732 ms851968 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=1e5+5, kx=1e7+5;

int n, dsu[nx], mx, idx, res, p[nx], sz;
vector<int> qrs[kx], v;
vector<pair<int, int>> edg[kx];
set<int> s;

int find(int x)
{
    if (dsu[x]==x) return x;
    return dsu[x]=find(dsu[x]);
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n;
    for (int i=1; i<=n; i++) cin>>p[i], s.insert(p[i]), mx=max(mx, p[i]);
    sz=s.size();
    for (int i=0; i<sz; i++) dsu[i]=i;
    for (auto x:s) v.push_back(x);
    idx=sz-1;
    for (int i=0; i<sz; i++) for (int j=2*v[i]; j<=mx; j+=v[i]) qrs[j].push_back(i);
    for (int i=mx; i>=1; i--)
    {
        while (idx>0&&v[idx-1]>=i) idx--;
        for (auto x:qrs[i]) edg[v[idx]-i].push_back({idx, x});
    }

    for (int i=0; i<sz-1; i++) edg[v[i+1]-v[i]].push_back({i, i+1});
    for (int i=0; i<=mx; i++)
    {
        for (auto [u, v]:edg[i])
        {
            //cout<<"edg "<<u<<' '<<v<<' '<<i<<'\n';
            if (find(u)!=find(v)) res+=i, dsu[find(u)]=find(v);
        }
    }
    cout<<res;

}
/*
10
7 10 5 6 4 7 9 8 7 2
*/
#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...