#include <bits/stdc++.h> using namespace std; int n, t, cnt, sum; int tab[500005]; priority_queue <pair <int, int>> pqmx; priority_queue <pair <int, int>> pqmn; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 0; i < n; ++i) { cin >> t; ++tab[t]; } for (int i = 0; i <= n; ++i) { if (tab[i] != 0) { pqmn.push({-tab[i], i}); pqmx.push({tab[i], i}); } } while (!pqmx.empty()) { pair <int, int> top = pqmx.top(); pqmx.pop(); if (tab[top.second] != top.first) { if (tab[top.second] == 0) continue; pqmx.push({tab[top.second], top.second}); continue; } sum = top.first-1; tab[top.second] = 0; ++cnt; while (sum && !pqmn.empty()) { pair <int, int> pot = pqmn.top(); pqmn.pop(); if (tab[pot.second] != -pot.first) { if (tab[pot.second] == 0) continue; pqmn.push({-tab[pot.second], pot.second}); continue; } if (-pot.first <= sum) { sum += pot.first; tab[pot.second] = 0; } else { tab[pot.second] = (-pot.first - sum); pqmn.push({-tab[pot.second], pot.second}); sum = 0; } } } cout << cnt; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <bits/stdc++.h> using namespace std; int n, t, cnt, sum; int tab[500005]; priority_queue <pair <int, int>> pqmx; priority_queue <pair <int, int>> pqmn; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 0; i < n; ++i) { cin >> t; ++tab[t]; } for (int i = 0; i <= n; ++i) { if (tab[i] != 0) { pqmn.push({-tab[i], i}); pqmx.push({tab[i], i}); } } while (!pqmx.empty()) { pair <int, int> top = pqmx.top(); pqmx.pop(); if (tab[top.second] != top.first) { if (tab[top.second] == 0) continue; pqmx.push({tab[top.second], top.second}); continue; } sum = top.first-1; tab[top.second] = 0; ++cnt; while (sum && !pqmn.empty()) { pair <int, int> pot = pqmn.top(); pqmn.pop(); if (tab[pot.second] != -pot.first) { if (tab[pot.second] == 0) continue; pqmn.push({-tab[pot.second], pot.second}); continue; } if (-pot.first <= sum) { sum += pot.first; tab[pot.second] = 0; } else { tab[pot.second] = (-pot.first - sum); pqmn.push({-tab[pot.second], pot.second}); sum = 0; } } } cout << cnt; } |