#include <bits/stdc++.h>
using namespace std;
const int nx=1e5+5, kx=1e7+5;
int n, dsu[nx], mx, idx, res, p[nx];
vector<int> qrs[kx];
vector<pair<int, int>> edg[kx], v;
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], dsu[i]=i, mx=max(mx, p[i]), v.push_back({p[i], i});
sort(v.begin(), v.end());
idx=n-1;
for (int i=1; i<=n; i++) for (int j=2*p[i]; j<=mx; j+=p[i]) qrs[j].push_back(i);
for (int i=mx; i>=1; i--)
{
while (idx>0&&v[idx-1].first>=i) idx--;
for (auto x:qrs[i]) edg[v[idx].first-i].push_back({x, v[idx].second});
}
idx=n;
for (int i=n-1; i>=0; i--)
{
while (idx>0&&v[idx-1].first>v[i].first) idx--;
if (idx<n) edg[v[idx].first-v[i].first].push_back({v[idx].second, v[i].second});
}
for (int i=1; i<n; i++) if (v[i].first==v[i-1].first) dsu[find(v[i].second)]=find(v[i-1].second);
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);
}
}
//for (int i=1; i<=n; i++) cout<<dsu[i]<<' ';
//cout<<'\n';
cout<<res;
}
/*
10
7 10 5 6 4 7 9 8 7 2
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |