//
#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; } |
English