#include <bits/stdc++.h> #define pb push_back using namespace std; typedef long long ll; const int MAX = 5e5 + 7; int tab[MAX]; bool visited[MAX]; int sort_kub[MAX]; bool visited2[MAX]; bool cmp(const pair<int, int> &first_data, const pair<int, int> &second_data) { return first_data.first > second_data.first; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; set<pair<int, int>> jakie_zliczone; vector<pair<int, int>> jakie_sa; vector<int> jakie_byly; for(int i = 1; i <= n; ++i) { cin >> tab[i]; sort_kub[tab[i]] += 1; if(visited[tab[i]] == false) { visited[tab[i]] = true; jakie_byly.pb(tab[i]); } } sort(jakie_byly.begin(), jakie_byly.end()); for(int i = 0; i < jakie_byly.size(); ++i) { jakie_sa.push_back({sort_kub[jakie_byly[i]], jakie_byly[i]}); jakie_zliczone.insert({sort_kub[jakie_byly[i]], jakie_byly[i]}); } sort(jakie_sa.begin(), jakie_sa.end(), cmp); int res = 0; int akt_sum = 0; int akt_koniec = jakie_sa.size() - 1; for(int i = 0; i < jakie_sa.size(); ++i) { if(akt_koniec < i) { break; } akt_sum += jakie_sa[akt_koniec].first; if(akt_sum == jakie_sa[i].first && jakie_sa[i].first == jakie_sa[akt_koniec].first) { jakie_sa[akt_koniec].first = 1; ++res; akt_sum = 0; continue; } else if(akt_sum >= jakie_sa[i].first) { ++res; akt_sum = 0; } else { --i; --akt_koniec; } } cout << res; 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 | #include <bits/stdc++.h> #define pb push_back using namespace std; typedef long long ll; const int MAX = 5e5 + 7; int tab[MAX]; bool visited[MAX]; int sort_kub[MAX]; bool visited2[MAX]; bool cmp(const pair<int, int> &first_data, const pair<int, int> &second_data) { return first_data.first > second_data.first; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; set<pair<int, int>> jakie_zliczone; vector<pair<int, int>> jakie_sa; vector<int> jakie_byly; for(int i = 1; i <= n; ++i) { cin >> tab[i]; sort_kub[tab[i]] += 1; if(visited[tab[i]] == false) { visited[tab[i]] = true; jakie_byly.pb(tab[i]); } } sort(jakie_byly.begin(), jakie_byly.end()); for(int i = 0; i < jakie_byly.size(); ++i) { jakie_sa.push_back({sort_kub[jakie_byly[i]], jakie_byly[i]}); jakie_zliczone.insert({sort_kub[jakie_byly[i]], jakie_byly[i]}); } sort(jakie_sa.begin(), jakie_sa.end(), cmp); int res = 0; int akt_sum = 0; int akt_koniec = jakie_sa.size() - 1; for(int i = 0; i < jakie_sa.size(); ++i) { if(akt_koniec < i) { break; } akt_sum += jakie_sa[akt_koniec].first; if(akt_sum == jakie_sa[i].first && jakie_sa[i].first == jakie_sa[akt_koniec].first) { jakie_sa[akt_koniec].first = 1; ++res; akt_sum = 0; continue; } else if(akt_sum >= jakie_sa[i].first) { ++res; akt_sum = 0; } else { --i; --akt_koniec; } } cout << res; return 0; } |