Submission #1245909

#TimeUsernameProblemLanguageResultExecution timeMemory
1245909khoiSirni (COCI17_sirni)C++20
70 / 140
981 ms236444 KiB
#include <bits/stdc++.h> using namespace std; struct Edge{ int u,v; int w; Edge(int _u,int _v,int _w):u(_u),v(_v),w(_w){} Edge():u(0),v(0),w(0){} bool operator<(Edge const& o)const{return w<o.w;} } e[20000007]; int m=0; struct DSU{ vector<int> par,rank; DSU(int n):par(n+1),rank(n+1){} void make_set(int u){ par[u]=u; rank[u]=0; } int find_set(int v){return par[v]==v?v:find_set(par[v]);} bool union_set(int u,int v){ u=find_set(u); v=find_set(v); if(u!=v){ if(rank[u]<rank[v]) swap(u,v); par[v]=u; if(rank[u]==rank[v]) rank[u]++; return 1; } else return 0; } }; int n,p[100005]; int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>p[i]; sort(p+1,p+1+n); int mx=*max_element(p+1,p+1+n); for(int i=1;i<=n;i++){ for(int j=p[i];j<=mx;j+=p[i]){ auto it=lower_bound(p+i+1,p+n+1,j); if(it==p+n+1) break; int j1=it-p; e[++m]={i,j1,p[j1]-j}; } } //----------------------------------------- sort(e+1,e+1+m); DSU d(n); for(int i=1;i<=n;i++) d.make_set(i); int total=0; int dem=0; for(int i=1;i<=m;i++){ auto [u,v,w]=e[i]; if(d.union_set(u,v)){ total+=w; if(++dem==n-1) break; } } cout<<total; }
#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...