제출 #1245844

#제출 시각아이디문제언어결과실행 시간메모리
1245844dangkhoiSirni (COCI17_sirni)C++20
0 / 140
26 ms5564 KiB
#include <bits/stdc++.h> using namespace std; struct Edge{ int u,v; long long w; bool operator<(Edge const& o)const{return w<o.w;} }; 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; } }; vector<vector<pair<int,int>>> adj; vector<Edge> e; bool d[1000006][11]; 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]; p[0]=1e9; int idx=0; for(int i=1;i<=n;i++) if(p[i]<p[idx]) idx=i; for(int i=1;i<=n;i++){ if(i==idx) continue; int w=min(p[i]%p[idx],p[idx]%p[i]); e.push_back({idx,i,w}); } vector<pair<int,int>> v(n); for(int i=0;i<n;i++){ v[i]={p[i+1],i+1}; } sort(v.begin(),v.end()); for(int i=1;i<n;i++){ int a=v[i-1].second; int b=v[i].second; int w=min(p[a]%p[b],p[b]%p[a]); e.push_back({a,b,w}); } //----------------------------------------- sort(e.begin(),e.end()); DSU d(n); for(int i=1;i<=n;i++) d.make_set(i); long long total=0; int dem=0; for(auto [u,v,w]:e){ 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...