Submission #1245915

#TimeUsernameProblemLanguageResultExecution timeMemory
1245915daiquocSirni (COCI17_sirni)C++20
140 / 140
4544 ms434356 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge{
    int u, v, w;
    Edge() {}
    Edge(int u, int v, int w) : u(u), v(v), w(w) {}
    bool operator < (const Edge& other) const {
        return w < other.w;
    }
};
const int MAXN=1e5;
const int MAXP=1e7;
int n, nxt[MAXP+5], par[MAXN+5];
vector<int> p;
vector<Edge> edges;

void build(){
    for(int i=0; i<n; i++) par[i]=i;
}
int find(int u){
    if (u == par[u]) return u;
    return par[u]=find(par[u]);
}
bool dsu(int u, int v) {
    u=find(u);
    v=find(v);
    if(u==v) return false;
    par[v]=u;
    return true;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n;
    for(int i=0, x; i<n; i++){
        cin>>x;
        p.push_back(x);
    }

    sort(p.begin(), p.end());
    p.erase(unique(p.begin(), p.end()), p.end());
    n=p.size();
    for(int i=0; i<n-1; i++){
        nxt[p[i]]=i;
        for(int j=p[i]+1; j<p[i+1]; j++){
            nxt[j]=i+1;
        }
    }
    nxt[p[n-1]]=n-1;

    for(int i=0; i<n; i++){
        edges.emplace_back(i, nxt[p[i]+1], p[nxt[p[i]+1]]%p[i]);
        for(int k=2*p[i]; k<=p[n-1]; k+=p[i]){
            edges.emplace_back(i, nxt[k], p[nxt[k]]%p[i]);
            k=p[nxt[k]]/p[i]*p[i];
        }
    }

    sort(edges.begin(), edges.end());
    build();
    int ans=0;
    for(auto& c:edges) {
        if(dsu(c.u, c.v)){
            ans+=c.w;
        }
    }
    cout<<ans;
}
#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...