제출 #1138083

#제출 시각아이디문제언어결과실행 시간메모리
1138083phamducminhSirni (COCI17_sirni)C++20
84 / 140
5115 ms790304 KiB
#include <bits/stdc++.h> #include <iostream> #include <cmath> #include <vector> #include <map> #include <unordered_map> #include <set> #include <unordered_set> #include <stack> #include <algorithm> #include <string> #include <queue> #include <cctype> #include <cstring> #include <iomanip> #include <deque> #include <random> #include <sstream> // #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt") // #pragma GCC optimize("Ofast","inline","no-stack-protector") // #pragma GCC target("arch=skylake") using namespace std; #define file(name) freopen(name".inp","r",stdin);\ freopen(name".out","w",stdout); #define TIME (1.0*clock()/CLOCKS_PER_SEC) #define all(a) a.begin(),a.end() #define all1(a) a+1,a+n+1 #define ll long long const long long INF=1e18; const long long MOD=1e9+7; const long long MODD[] = {(long long)998244353,(long long)1e9+2277, (long long)1e9+5277}; // 998244353 const int maxN=2e5+9; const long long LOG=19; const double eps = 1e-1; //------------------------ void solve(); signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int t; // cin >> t; t=1; while (t--){ solve(); } return 0; } /// -------------- PROBLEM SOLUION -------------------- int n, a[100009]; int ans=0, ans1=0, mx=0; bool visited[100009]; struct canh{ int x, y, w; }; vector<canh> dscanh; int truoc[100009],rnk[100009]; vector<int> b; void init(int n){ for(int i=1; i<=n; i++){ truoc[i] = i; rnk[i] = 1; } } int root(int u){ if (truoc[u]==u) return u; return truoc[u]=root(truoc[u]); } bool hop(int x, int y){ int u=root(x), v=root(y); if (u==v) return false; if (rnk[u]<rnk[v]) swap(u,v); truoc[u]=v; rnk[u]+=rnk[v]; return true; } bool cmp(canh a, canh b){ return a.w < b.w; } void solve(){ cin >> n; for (int i=1; i<=n; i++){ cin >> a[i]; b.push_back(a[i]); mx=max(mx,a[i]); } sort(all(b)); b.resize(unique(all(b)) - b.begin()); for(int i=0; i<b.size(); i++) a[i+1] = b[i]; n=b.size(); if (n == 1) return cout << 0, void(); if (a[1] == 1) return cout << 0, void(); // sort(a+1,a+n+1); for (int i=2; i<=n; i++){ ans+=min(a[1]%a[i], a[i]%a[1]); } // if (n>1000) return cout << 0, void(); init(n+1); for (int i=1; i<=n; i++) { // for (int j=i+1; j<=n; j++) { // int w = a[j] % a[i]; // dscanh.push_back({i, j, w}); // } for (int m=a[i]; m<=mx; m+=a[i]){ int it=lower_bound(a+i,a+n+1,m)-a; if (it>n) continue; if (m==a[i] && a[it]==a[i]) it++; if (it>n) continue; dscanh.push_back({i, it, a[it]%a[i]}); } } sort(dscanh.begin(), dscanh.end(), cmp); int d1=0; for (int i=0; i<dscanh.size(); i++){ if (d1==n-1) break; canh tmp = dscanh[i]; if (hop(tmp.x, tmp.y)){ ans1 += tmp.w; d1++; } } cout << min(ans,ans1); }
#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...