제출 #1266984

#제출 시각아이디문제언어결과실행 시간메모리
1266984k12_khoiSirni (COCI17_sirni)C++17
140 / 140
1515 ms608480 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int N=2e7+5; struct edges { int X,Y,Z; }; vector <edges> b; bool cmp(edges x,edges y) { return x.Z<y.Z; } int n,x,y,ma; ll res; int nxt[N],par[N]; bool check[N]; vector <int> a,ve[N]; int acs(int u) { if (par[u]<0) return u; return par[u]=acs(par[u]); } bool join(int u,int v) { int x=acs(u); int y=acs(v); if (x!=y) { if (par[x]>par[y]) swap(x,y); par[x]+=par[y]; par[y]=x; return true; } return false; } int main() { ios_base::sync_with_stdio(NULL); cin.tie(NULL); cout.tie(NULL); cin >> n; a.resize(n); for (int i=0;i<n;i++) cin >> a[i]; sort(a.begin(),a.end()); a.resize(unique(a.begin(),a.end())-a.begin()); n=a.size(); if (a[0]==1) { cout << 0; return 0; } for (int i=1;i<=n;i++) { nxt[a[i-1]]=i; par[i]=-1; } ma=a[n-1]; for (int i=ma;i>=0;i--) if (nxt[i]==0) nxt[i]=nxt[i+1]; for (int i=1;i<n;i++) { x=a[i-1]; y=nxt[x+1]; b.push_back({i,y,a[y-1]-x}); for (int j=2*x;j<=ma;j+=x) if (y!=nxt[j]) { if (b.back().Z>=a[0]) b.pop_back(); y=nxt[j]; b.push_back({i,y,a[y-1]-j}); } else b.back().Z=a[y-1]-j; if (b.back().Z>=x) b.pop_back(); } sort(b.begin(),b.end(),cmp); res=0; for (int i=0;i<b.size();i++) if (join(b[i].X,b[i].Y)) res+=b[i].Z; cout << res; }
#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...