Submission #844145

#TimeUsernameProblemLanguageResultExecution timeMemory
844145amine_arouaSirni (COCI17_sirni)C++17
98 / 140
1887 ms786432 KiB
#include <bits/stdc++.h> //#pragma GCC optimize("O3") //#pragma GCC optimize("unroll-loops") using namespace std; #define int long long #define vi vector<int> #define vl vector<long long> #define vii vector<pair<int,int>> #define vll vector<pair<long long,long long>> #define pb push_back #define ll long long #define ld long double #define nl '\n' #define boost ios::sync_with_stdio(false) #define mp make_pair #define se second #define fi first #define fore(i, y) for(int i = 0; i < y; i++) #define forr(i,x,y) for(int i = x;i<=y;i++) #define forn(i,y,x) for(int i = y; i >= x; i--) #define all(v) v.begin(),v.end() #define sz(v) (int)v.size() #define clr(v,k) memset(v,k,sizeof(v)) #define rall(v) v.rbegin() , v.rend() #define pii pair<int,int> #define pll pair<ll , ll> const ll MOD = 1e9 + 7; const ll INF = 1e18 + 1; ll gcd(ll a , ll b) {return b ? gcd(b , a % b) : a ;} // greatest common divisor (gcd) ll lcm(ll a , ll b) {return a * (b / gcd(a , b));} // least common multiple (lcm) // HERE IS THE SOLUTION struct DSU { vi e; DSU(int n) { e.assign(n , -1); } int getPar(int x) { return (e[x] < 0 ? x : e[x] = getPar(e[x])); } int getSZ(int x) { return -e[getPar(x)]; } bool unite(int u , int v) { u = getPar(u) , v = getPar(v); if(u == v) return 0; if(e[u] > e[v]) swap(u , v); e[u]+=e[v]; e[v] = u; return 1; } }; signed main() { boost; cin.tie(0); cout.tie(0); int n ; cin>>n; vi v(n); int mx = 0; fore(i , n) { cin>>v[i]; mx = max(mx , v[i]); } if(n <= 1000) { vector<tuple<int , int , int>> edg; fore(i , n) { forr(j, i + 1, n - 1) { edg.pb({min(v[i]%v[j] , v[j]%v[i]) , i , j}); } } sort(all(edg)); DSU dsu(n); int ans =0; for(auto [c , U , V] : edg) { if(dsu.unite(U , V)) { ans+=c; } } cout<<ans<<nl; } else { sort(all(v)); vector<vii> edg(mx + 1); fore(i , n - 1) { if(v[i] == v[i + 1]) { edg[0].pb({i , i + 1}); } } vector<bool> vis(mx + 1 , 0); fore(i , n) { if(vis[v[i]]) continue; vis[v[i]] = 1; int x = v[i]; for(int j = x;j<=mx;j+=x) { int idx ; if(j == x) idx = upper_bound(all(v) , j) - v.begin(); else idx = lower_bound(all(v) , j) - v.begin(); if(idx < n && idx >= 0) { edg[v[idx]%x].pb({i, idx}); } } } vector<tuple<int , int , int>> sorted; fore(i , mx + 1) { for(auto [a , b] : edg[i]) { sorted.pb({i , a , b}); } } DSU dsu(n); int ans = 0; for(auto [c , U , V] : sorted) { if(dsu.unite(U , V)) { ans+=c; } } cout<<ans<<nl; } }
#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...