Submission #1214431

#TimeUsernameProblemLanguageResultExecution timeMemory
1214431rkgenaSirni (COCI17_sirni)C++20
140 / 140
4604 ms114204 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)); np.pb(p[0]); rep(i,1,n-1){ if(p[i] != p[i-1] ) np.pb(p[i]); } n = np.size(); vector<vpi> edges(np[0]); rep(i,0,n-1){ lli lwr = -1, upr = i; for(lli j = np[i]; j<=mxm; j+=np[i]){ lwr = lower_bound(all(np), j) - np.begin(); if(lwr >= 0 && lwr < n && lwr!=upr){ if(np[lwr]%np[i] < np[0] && j!=np[i]){ edges[np[lwr]%np[i]].pb({lwr, i}); } } upr = upper_bound(all(np), j) - np.begin(); if(upr >= 0 && upr < n && (np[upr]%np[i] < np[0]) && upr != lwr){ edges[np[upr]%np[i]].pb({upr, i}); } } } DSU dsu(n); lli ans = 0; rep(i,0,np[0]-1){ for(auto edge : edges[i]){ lli u = edge.first; lli v = edge.second; if(dsu.unite(u, v)){ ans += i; } } } 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...