#include <bits/stdc++.h> using namespace std; void addFish(map<long long, long long> &count, long long w) { auto a = count.find(w); if (a == count.end()) { count.insert({w, 1}); } else { a->second++; } } void remFish(map<long long, long long> &count, long long w) { auto a = count.find(w); if (a->second == 1) { count.erase(a); } else { a->second--; } } int getHaps(map<long long, long long> &count, long long s, long long k) { int result = 0; map<long long, long long> eaten; while (s < k) { auto a = count.lower_bound(s); if (a == count.begin()) { return -1; } a--; if (a->first >= s) { return -1; } auto b = eaten.find(a->first); long long howMany = 0; if (b != eaten.end()) { howMany = b->second; } if (howMany == a->second) { return -1; } s += a->first; addFish(eaten, a->first); result++; } return result; } int main() { ios_base::sync_with_stdio(0); map<long long, long long> count; long long n, w; cin >> n; for (int i = 0; i < n; i++) { cin >> w; addFish(count, w); } long long e, t, s, k; cin >> e; for (int i = 0; i < e; i++) { cin >> t; switch (t) { case 1: cin >> s >> k; cout << getHaps(count, s, k) << "\n"; break; case 2: cin >> w; addFish(count, w); break; case 3: cin >> w; remFish(count, w); break; } } 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 | #include <bits/stdc++.h> using namespace std; void addFish(map<long long, long long> &count, long long w) { auto a = count.find(w); if (a == count.end()) { count.insert({w, 1}); } else { a->second++; } } void remFish(map<long long, long long> &count, long long w) { auto a = count.find(w); if (a->second == 1) { count.erase(a); } else { a->second--; } } int getHaps(map<long long, long long> &count, long long s, long long k) { int result = 0; map<long long, long long> eaten; while (s < k) { auto a = count.lower_bound(s); if (a == count.begin()) { return -1; } a--; if (a->first >= s) { return -1; } auto b = eaten.find(a->first); long long howMany = 0; if (b != eaten.end()) { howMany = b->second; } if (howMany == a->second) { return -1; } s += a->first; addFish(eaten, a->first); result++; } return result; } int main() { ios_base::sync_with_stdio(0); map<long long, long long> count; long long n, w; cin >> n; for (int i = 0; i < n; i++) { cin >> w; addFish(count, w); } long long e, t, s, k; cin >> e; for (int i = 0; i < e; i++) { cin >> t; switch (t) { case 1: cin >> s >> k; cout << getHaps(count, s, k) << "\n"; break; case 2: cin >> w; addFish(count, w); break; case 3: cin >> w; remFish(count, w); break; } } return 0; } |