Submission #1266984

#TimeUsernameProblemLanguageResultExecution timeMemory
1266984k12_khoiSirni (COCI17_sirni)C++17
140 / 140
1515 ms608480 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N=2e7+5;

struct edges
{
    int X,Y,Z;
};
vector <edges> b;

bool cmp(edges x,edges y)
{
    return x.Z<y.Z;
}

int n,x,y,ma; ll res;
int nxt[N],par[N];
bool check[N];
vector <int> a,ve[N];

int acs(int u)
{
    if (par[u]<0) return u;
    return par[u]=acs(par[u]);
}

bool join(int u,int v)
{
    int x=acs(u);
    int y=acs(v);
    if (x!=y)
    {
        if (par[x]>par[y]) swap(x,y);
        par[x]+=par[y];
        par[y]=x;

        return true;
    }
    return false;
}

int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL); cout.tie(NULL);

    cin >> n;
    a.resize(n);
    for (int i=0;i<n;i++)
    cin >> a[i];

    sort(a.begin(),a.end());
    a.resize(unique(a.begin(),a.end())-a.begin());
    n=a.size();

    if (a[0]==1)
    {
        cout << 0;
        return 0;
    }


    for (int i=1;i<=n;i++)
    {
        nxt[a[i-1]]=i;
        par[i]=-1;
    }

    ma=a[n-1];
    for (int i=ma;i>=0;i--)
    if (nxt[i]==0) nxt[i]=nxt[i+1];

    for (int i=1;i<n;i++)
    {
        x=a[i-1];

        y=nxt[x+1];

        b.push_back({i,y,a[y-1]-x});

        for (int j=2*x;j<=ma;j+=x)
        if (y!=nxt[j])
        {
            if (b.back().Z>=a[0]) b.pop_back();

            y=nxt[j];

            b.push_back({i,y,a[y-1]-j});
        }
        else b.back().Z=a[y-1]-j;

        if (b.back().Z>=x) b.pop_back();
    }

    sort(b.begin(),b.end(),cmp);

    res=0;
    for (int i=0;i<b.size();i++)
    if (join(b[i].X,b[i].Y)) res+=b[i].Z;

    cout << res;
}
#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...