제출 #1139165

#제출 시각아이디문제언어결과실행 시간메모리
1139165ChottuFSirni (COCI17_sirni)C++20
0 / 140
348 ms7048 KiB
#include <bits/stdc++.h> using namespace std; struct DSU{ vector<int> parent,sz; DSU(int n){ parent.resize(n); sz.resize(n,1); for (int i = 0; i<n; i++){ parent[i] = i;; } } int find(int x){ if (x != parent[x]){ return parent[x] = find(parent[x]); } return parent[x]; } bool merge(int a, int b){ a = find(a); b = find(b); if (a == b) return false; if (sz[b] > sz[a]) swap(a,b); parent[b] = a; sz[a] += sz[b]; return true; } }; int func(int x, int y){ int zz = x/y; zz *= y; return zz; } int main(){ int n; cin >> n; int arr[n]; map<int,int> mp; for (int i = 0; i<n; i++){ cin >> arr[i]; mp[arr[i]] = i; } sort(arr,arr+n); priority_queue<pair<int,int>> pq; int mx = arr[n-1]; for (int i = 0; i<n; i++){ pq.push({func(mx,arr[i]),arr[i]}); } int i = n-1; int ans = 0; DSU dsu(n); while (!pq.empty() && i >= 0){ auto [a,b] = pq.top(); if (a > arr[i]){ pq.pop(); pq.push({func(arr[i],b),b}); } else if (b == a){ pq.pop(); } else{ if (dsu.merge(i, mp[b])){ ans += arr[i] - a; i--; } else{ pq.pop(); } } } cout << ans; 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...