Submission #483524

#TimeUsernameProblemLanguageResultExecution timeMemory
483524oneloveforeverSirni (COCI17_sirni)C++14
140 / 140
3715 ms711676 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define x first #define y second #define ii pair<int,int> int n; const int M=1e7+7; struct DSU { vector<int>sz,trace; int n; DSU(int _n=0) { n=_n; sz.assign(n+7,1); trace.resize(n+7); iota(trace.begin(),trace.end(),0); } int find_dsu(int x) { return trace[x]==x?trace[x]:find_dsu(trace[x]); } bool check(int x,int y) { int u=find_dsu(x); int v=find_dsu(y); if(u==v)return false; if(sz[u]>sz[v])swap(u,v); trace[u]=v; sz[v]+=sz[u]; return true; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; vector<vector<ii> >edge(M+10); vector<int>id; set<int>s; for(int i=1;i<=n;i++) { int x; cin>>x; s.insert(x); } n=s.size(); vector<int>a(n+1); n=0; for(int node:s) { ++n; a[n]=node; } for(int i=1; i<=n; i++) { int vt=i+1; for(int j=a[i]; j<M; j+=a[i]) { while(vt<=n && a[vt]<j)vt++; if(vt<=n) edge[a[vt]%a[i]].push_back({i,vt}); } } DSU dsu(n); ll ans=0; for(int i=0;i<M;i++) { for(ii node:edge[i]) { //cout<<node.x<<" "<<node.y<<" "<<i<<endl; if(dsu.check(node.x,node.y))ans+=i; } } cout<<ans; }
#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...