// #include <bits/stdc++.h> using namespace std; #define int long long constexpr int sizik = 1000 * 1001; #define ar std::array #define pr std::pair #define vec std::vector typedef vec<vec<int>> _kra; int licz[sizik]; struct cmp { bool operator()(const int& __x, const int& __y) const { return licz[__x] < licz[__y]; } }; void solve() { int n; std::cin >> n; for (int i = 0; i < n; i++) { int a; std::cin >> a; licz[a]++; } // std::priority_queue<int, vec<int>, cmp> q; std::vector<int> v; for (int i = 1; i <= n; i++) { if (licz[i] != 0) { v.push_back(i); } } std::sort(v.begin(), v.end(), cmp()); // std::cout << "v ~> "; // for (const auto& a : v) { // std::cout << a << " "; // } // std::cout << '\n'; int p = 0, k = v.size() - 1, r = n, ans = 0; while (p <= k) { ans++; // std::cout << p << " " << k << '\n'; if (2 * licz[v[k]] > r || p == k) { break; } r -= licz[v[k]] + licz[v[k]] - 1; int poz = licz[v[k]] - 1; for (int i = p; poz > 0; i++) { if (licz[v[i]] <= poz) { poz -= licz[v[i]]; licz[v[i]] = 0; p++; } else { // licz[i] > poz licz[v[i]] -= poz; poz = 0; break; } } k--; } std::cout << ans << '\n'; } int32_t main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int t = 1; // std::cin >> t; for (; t > 0; t--) { solve(); } return 0; }
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | // #include <bits/stdc++.h> using namespace std; #define int long long constexpr int sizik = 1000 * 1001; #define ar std::array #define pr std::pair #define vec std::vector typedef vec<vec<int>> _kra; int licz[sizik]; struct cmp { bool operator()(const int& __x, const int& __y) const { return licz[__x] < licz[__y]; } }; void solve() { int n; std::cin >> n; for (int i = 0; i < n; i++) { int a; std::cin >> a; licz[a]++; } // std::priority_queue<int, vec<int>, cmp> q; std::vector<int> v; for (int i = 1; i <= n; i++) { if (licz[i] != 0) { v.push_back(i); } } std::sort(v.begin(), v.end(), cmp()); // std::cout << "v ~> "; // for (const auto& a : v) { // std::cout << a << " "; // } // std::cout << '\n'; int p = 0, k = v.size() - 1, r = n, ans = 0; while (p <= k) { ans++; // std::cout << p << " " << k << '\n'; if (2 * licz[v[k]] > r || p == k) { break; } r -= licz[v[k]] + licz[v[k]] - 1; int poz = licz[v[k]] - 1; for (int i = p; poz > 0; i++) { if (licz[v[i]] <= poz) { poz -= licz[v[i]]; licz[v[i]] = 0; p++; } else { // licz[i] > poz licz[v[i]] -= poz; poz = 0; break; } } k--; } std::cout << ans << '\n'; } int32_t main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int t = 1; // std::cin >> t; for (; t > 0; t--) { solve(); } return 0; } |