#include<unordered_set>
#include<cstdio>
#include<functional>
using namespace std;
int n;
unordered_multiset<int> C;
vector<int> P;
int main() {
int a;
scanf("%d", &n);
for (int i = 0; i < n; i ++) {
scanf("%d", &a);
C.insert(a);
}
for (auto it = C.begin(); it != C.end(); ) {
auto count = C.count(*it);
P.push_back(count);
advance(it, count);
}
sort(P.begin(), P.end(), greater<int>());
for (int i = 1; i <= n; i++) {
int sum = 0;
for (auto it = P.begin(); it != P.end(); it++) {
sum += (*it / i) * i;
}
printf("%d ", sum);
while (P.size() > 0 && P.back() <= i) {
P.pop_back();
}
}
}
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 | #include<unordered_set> #include<cstdio> #include<functional> using namespace std; int n; unordered_multiset<int> C; vector<int> P; int main() { int a; scanf("%d", &n); for (int i = 0; i < n; i ++) { scanf("%d", &a); C.insert(a); } for (auto it = C.begin(); it != C.end(); ) { auto count = C.count(*it); P.push_back(count); advance(it, count); } sort(P.begin(), P.end(), greater<int>()); for (int i = 1; i <= n; i++) { int sum = 0; for (auto it = P.begin(); it != P.end(); it++) { sum += (*it / i) * i; } printf("%d ", sum); while (P.size() > 0 && P.back() <= i) { P.pop_back(); } } } |
English