Submission #1301985

#TimeUsernameProblemLanguageResultExecution timeMemory
1301985EkinOnalSirni (COCI17_sirni)C++20
14 / 140
667 ms851968 KiB
#include <bits/stdc++.h> using namespace std; // #define double long double #define int long long #define pb push_back #define vi vector<int> #define vpii vector<pair<int,int>> #define MAX 200005 #define f first #define s second const int INF = 1e18; const int mod = 1e9+7; #define pii pair<int,int> int sum(int a,int b){return ((a%mod)+(b%mod))%mod;} int mul(int a,int b){return ((a%mod)*(b%mod))%mod;} vi dsu(1e7+2),sz(1e7+2); int find(int a){ if(dsu[a]==a) return a; return dsu[a]=find(dsu[a]); } bool unite(int a,int b){ a=find(a); b=find(b); if(a==b) return 0; if(sz[a]<sz[b]) swap(a,b); sz[a]+=sz[b]; dsu[b]=a; return 1; } vector<array<int,3>> edges; void solve(){ int n; cin>>n; vi v(n); for(int i=0;i<n;i++) cin>>v[i],dsu[i]=i,sz[i]=1; sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); int largest=v.back(); vi nxt(largest+2,-1); for(int i=0;i<v.size();i++) nxt[v[i]]=i; for(int i=largest-1;i>=0;i--){ if(nxt[i]==-1) nxt[i]=nxt[i+1]; } vector<vector<pair<int, int>>> good_links(largest + 1); for (int i = 0; i < v.size() - 1; i++) { // get all relevant v this card could be connected to good_links[v[i + 1] % v[i]].push_back({i, i + 1}); for (int at = 2 * v[i]; at <= largest; at += v[i]) { int good_mod = nxt[at]; good_links[v[good_mod] % v[i]].push_back({i, good_mod}); } } long long total_cost = 0; for (int c = 0; c <= largest; c++) { for (const pair<int, int> &link : good_links[c]) { bool result = unite(link.first, link.second); total_cost += c * result; } } cout << total_cost << endl; // for(int i=0;i<v.size()-1;i++){ // edges.pb({ v[i+1]%v[i] , i, i+1 }); // for(int j=2*v[i];j<=largest;j+=v[i]){ // edges.pb({ v[nxt[j]] % v[i] , i , nxt[j] } ); // } // } // sort(edges.begin(),edges.end()); // int ans=0; // for(auto u : edges){ // // cout<<u[0]<<" "<<u[1]<<" "<<u[2]<<endl; // if(find(u[1])==find(u[2])) continue; // ans+=u[0]; unite(u[1],u[2]); // // cout<<u[0]<<" "<<u[1]<<" "<<u[2]<<endl; // } // cout<<ans<<endl; } int32_t main(){ // freopen("walk.in","r",stdin); // freopen("walk.out","w",stdout); int t=1; // cin>>t; while(t--) solve(); }
#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...