#include<iostream> #include <algorithm> #include<map> #define T long long int int solve(std::map<T, int> sprats, T sum, T s, T k) { std::map<T, int>::iterator ss; int ret = 0; // std::cout << "---" << std::endl; // for(auto s = sprats.begin(); s != sprats.end(); s++) { // std::cout << s->first << " " << s->second << std::endl; // } if(s+sum < k) { ret = -1; return ret; } while(s < k) { if(!sprats.size()) { ret = -1; break; } ss = sprats.lower_bound(s-1); if(ss == sprats.end()) { ss--; } else { if(ss->first > s-1) { if(ss == sprats.begin()) { ret = -1; break; } else { ss--; } } } s += ss->first; // std::cout << "Eaten: " << ss->first << " s: " << s << std::endl; ss->second--; if(!ss->second) { sprats.erase(ss); } ret++; } return ret; } int main() { std::map<T, int> sprats; int n, q, op; T w, s, k, sum=0; std::cin >> n; while(n--) { std::cin >> w; sprats[w]++; sum += w; } std::cin >> q; while(q--) { std::cin >> op >> s; if(op == 1) { std::cin >> k; std::cout << solve(sprats, sum, s, k) << std::endl; } if(op == 2) { sprats[s]++; sum += s; } if(op == 3) { sprats[s]--; if(!sprats[s]) { sprats.erase(s); } sum -= s; } } 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 | #include<iostream> #include <algorithm> #include<map> #define T long long int int solve(std::map<T, int> sprats, T sum, T s, T k) { std::map<T, int>::iterator ss; int ret = 0; // std::cout << "---" << std::endl; // for(auto s = sprats.begin(); s != sprats.end(); s++) { // std::cout << s->first << " " << s->second << std::endl; // } if(s+sum < k) { ret = -1; return ret; } while(s < k) { if(!sprats.size()) { ret = -1; break; } ss = sprats.lower_bound(s-1); if(ss == sprats.end()) { ss--; } else { if(ss->first > s-1) { if(ss == sprats.begin()) { ret = -1; break; } else { ss--; } } } s += ss->first; // std::cout << "Eaten: " << ss->first << " s: " << s << std::endl; ss->second--; if(!ss->second) { sprats.erase(ss); } ret++; } return ret; } int main() { std::map<T, int> sprats; int n, q, op; T w, s, k, sum=0; std::cin >> n; while(n--) { std::cin >> w; sprats[w]++; sum += w; } std::cin >> q; while(q--) { std::cin >> op >> s; if(op == 1) { std::cin >> k; std::cout << solve(sprats, sum, s, k) << std::endl; } if(op == 2) { sprats[s]++; sum += s; } if(op == 3) { sprats[s]--; if(!sprats[s]) { sprats.erase(s); } sum -= s; } } return 0; } |