제출 #1154506

#제출 시각아이디문제언어결과실행 시간메모리
1154506sitablechairSirni (COCI17_sirni)C++20
126 / 140
1293 ms746344 KiB
#include <bits/stdc++.h> #define ll long long #define ldb long double #define For(i,l,r) for(int i=l;i<=r;i++) #define ForD(i,r,l) for(int i=r;i>=l;i--) #define ff first #define ss second #define pb push_back #define all(x) x.begin(),x.end() #define sz(x) (signed)x.size() #define unq(x) x.resize(unique(all(x))-x.begin()) #define F "TASK" #define fio freopen(F".INP","r",stdin);freopen(F".OUT","w",stdout); const int N=1e5+3; using namespace std; int n,a[N],g[N*100],f[N]; vector<pair<int,int>> mmb[N*100]; int m; vector<int> aa; ll ans=0; int find_set(int x) { return (f[x]<0?x:f[x]=find_set(f[x])); } void unite(int u,int v,ll w) { int a=find_set(u),b=find_set(v); if (a==b) return; m--; ans+=w; if (f[a]>f[b]) swap(a,b); f[a]+=f[b]; f[b]=a; } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n; For(i,1,n) { int x; cin >> x; aa.pb(x); } sort(all(aa)); unq(aa); n=sz(aa); For(i,1,n) a[i]=aa[i-1]; m=n; fill(g,g+10000001,-1); fill(f,f+1+n,-1); For(i,1,1e7) { g[i]=g[i-1]; if (i>=a[g[i]+1]) g[i]++; } For(i,1,n) for(int j=a[i];j<=1e7;j+=a[i]) if (a[g[j]]==j && j>a[i]) mmb[0].pb({i,g[j]}); else if (g[j]+1<=n) mmb[a[g[j]+1]%a[i]].pb({g[j]+1,i}); For(i,0,1e7) { for(auto el: mmb[i]) { unite(el.ff,el.ss,i); } if (m==1) break; } cout << ans; return 0; }
#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...