Submission #1214422

#TimeUsernameProblemLanguageResultExecution timeMemory
1214422rkgenaSirni (COCI17_sirni)C++20
0 / 140
1878 ms851968 KiB
#include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define IOS ios::sync_with_stdio(0); cin.tie(0); #define lli long long int #define pb push_back #define all(x) x.begin(),x.end() #define rep(i,a,b) for(int i=a;i<=b;i++) #define repp(i,a,b) for(int i=a;i>=b;i--) #define vi vector<lli> #define vvi vector<vi> #define vpi vector<pair<lli,lli>> #define pi pair<lli,lli> #define msi multiset<lli> #define mspi multiset<pair<lli,lli>> #define mii map<lli,lli> #define mpi map<pair<lli,lli>,lli> #define si set<lli> #define spi set<pair<lli,lli>> #define qi queue<lli> #define pqi priority_queue<lli> #define pqimin priority_queue<lli,vi,greater<lli>> template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template<class T1, class T2> using ordered_map = tree<T1, T2, less<T1>, rb_tree_tag, tree_order_statistics_node_update>; class DSU { private: vi parent, size; public: lli comps; DSU(lli n) : parent(n), size(n, 1), comps(n){ rep(i, 0, n-1) parent[i] = i; } lli find(lli u) {return (u == parent[u]) ? u : (parent[u] = find(parent[u]));} bool unite(lli u, lli v){ u = find(u); v = find(v); if(u == v) return false; if(size[u] < size[v]) swap(u, v); parent[v] = u; size[u] += size[v]; comps--; return true; } bool connected(lli u, lli v) { u = find(u); v = find(v); return (u == v); } }; lli mod_pow(lli base, lli pwr, lli mod){ lli res = 1; while(pwr){ if(pwr&1) res = (res * base) % mod; base = (base * base) % mod; pwr >>= 1; } return res; } lli gcd(lli a, lli b){ while(b) { lli t = a % b; a = b; b = t; } return a; } lli calcdist(lli x1, lli x2){ return min(x1%x2, x2%x1); } void solve() { lli n; cin>>n; vi p(n); rep(i,0,n-1)cin>>p[i]; sort(all(p)); vi np; lli mxm = *max_element(all(p)); vector<bool> done(mxm+1, false); np.pb(p[0]); done[p[0]] = true; for(lli i = 2*p[0]; i <= mxm; i += p[0]) { done[i] = true; } rep(i,1,n-1){ if(done[p[i]]) continue; if(p[i] != p[i-1] && !done[p[i]]) np.pb(p[i]); done[p[i]] = true; for(lli j = 2*p[i]; j <= mxm; j += p[i]) { done[j] = true; } } n = np.size(); vvi edges; rep(i,0,n-1){ rep(j,i+1,n-1){ lli lc = gcd(np[i], np[j]); lc = (np[i] * np[j]) / lc; if(lc <= mxm && done[lc]){ edges.pb({0, i, j}); continue; } edges.pb({calcdist(np[i], np[j]), i, j}); } } sort(all(edges)); DSU dsu(n); lli ans = 0; for(auto &edge : edges){ lli cost = edge[0]; lli u = edge[1]; lli v = edge[2]; if(!dsu.connected(u, v)){ dsu.unite(u, v); ans += cost; } } cout<<ans<<"\n"; } signed main() { int t=1; //cin>>t; while(t--) solve(); 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...