Submission #1337170

#TimeUsernameProblemLanguageResultExecution timeMemory
1337170boyliguanhanSirni (COCI17_sirni)C++17
112 / 140
5114 ms447332 KiB
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int id[10001000];
int par[100100];
int abp(int x){
    return par[x]?par[x]=abp(par[x]):x;
}
int merge(int u,int v){
    u=abp(u);
    v=abp(v);
    return u==v?0:par[u]=v;
}
vector<pair<int,int>> edges[5000100];
signed main(){
    cin.tie(0)->sync_with_stdio(0);
    int n,x,CC=0;
    cin>>n;
    set<int>st;
    while(n--)cin>>x,st.insert(x);
    for(auto i:st)id[i]=++CC;
    for(auto i:st) {
        int I=id[i];
        auto x = ++st.find(i);
        while(x!=st.end()) {
            edges[*x%i].push_back({id[*x],I});
            int z = *x/i;
            x++;
            if(x==st.end())break;
            if(*x <(z+1)*i)
                x=st.lower_bound((z+1)*i);
        }
    }
    long long cost=0;
    for(int i=0;i<5e6;i++)
        for(auto[u,v]:edges[i])
            if(merge(u,v))
                cost+=i;
    cout<<cost;
}
#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...