#include <iostream> #include <set> #include <vector> #include <map> using namespace std; typedef long long int lint; struct Event { int type; lint w; lint s; lint k; }; void read_data(vector<lint>& w, vector<Event>& events) { int n; cin >> n; for (int i = 0; i < n; ++i) { int wi; cin >> wi; w.push_back(wi); } int q; cin >> q; for (int i = 0; i < q; ++i) { Event ev; cin >> ev.type; if (ev.type == 1) { cin >> ev.s >> ev.k; } else { cin >> ev.w; } events.push_back(ev); } } class Mlotek { public: typedef void (Mlotek::*eventHandler)(Event); vector<lint>& w; vector<Event>& events; multiset<lint> ws; map<int, eventHandler> eventHandlers = { {1, &Mlotek::handleSimulation}, {2, &Mlotek::handleAdd}, {3, &Mlotek::handleRemove}, }; Mlotek(vector<lint>& _w, vector<Event>& _events) : w(_w) , events(_events) { for (lint wi: w) { ws.insert(wi); } } void solve() { for (Event ev: events) { (this->*eventHandlers[ev.type])(ev); } } void handleSimulation(Event ev) { multiset<lint> removed; int steps = 0; lint s = ev.s; while (!ws.empty() && s < ev.k) { auto it = ws.lower_bound(s); // iterator to smallest wi such that s <= wi if (it == ws.begin()) { break; // no fish smaller than s } --it; s += *it; removed.insert(*it); ws.erase(it); steps++; } if (s >= ev.k) { cout << steps << endl; } else { cout << -1 << endl; } for (lint wi: removed) { ws.insert(wi); } } void handleAdd(Event ev) { ws.insert(ev.w); } void handleRemove(Event ev) { ws.erase(ev.w); } }; int main() { ios_base::sync_with_stdio(0); vector<lint> w; vector<Event> events; read_data(w, events); Mlotek m(w, events); m.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 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <iostream> #include <set> #include <vector> #include <map> using namespace std; typedef long long int lint; struct Event { int type; lint w; lint s; lint k; }; void read_data(vector<lint>& w, vector<Event>& events) { int n; cin >> n; for (int i = 0; i < n; ++i) { int wi; cin >> wi; w.push_back(wi); } int q; cin >> q; for (int i = 0; i < q; ++i) { Event ev; cin >> ev.type; if (ev.type == 1) { cin >> ev.s >> ev.k; } else { cin >> ev.w; } events.push_back(ev); } } class Mlotek { public: typedef void (Mlotek::*eventHandler)(Event); vector<lint>& w; vector<Event>& events; multiset<lint> ws; map<int, eventHandler> eventHandlers = { {1, &Mlotek::handleSimulation}, {2, &Mlotek::handleAdd}, {3, &Mlotek::handleRemove}, }; Mlotek(vector<lint>& _w, vector<Event>& _events) : w(_w) , events(_events) { for (lint wi: w) { ws.insert(wi); } } void solve() { for (Event ev: events) { (this->*eventHandlers[ev.type])(ev); } } void handleSimulation(Event ev) { multiset<lint> removed; int steps = 0; lint s = ev.s; while (!ws.empty() && s < ev.k) { auto it = ws.lower_bound(s); // iterator to smallest wi such that s <= wi if (it == ws.begin()) { break; // no fish smaller than s } --it; s += *it; removed.insert(*it); ws.erase(it); steps++; } if (s >= ev.k) { cout << steps << endl; } else { cout << -1 << endl; } for (lint wi: removed) { ws.insert(wi); } } void handleAdd(Event ev) { ws.insert(ev.w); } void handleRemove(Event ev) { ws.erase(ev.w); } }; int main() { ios_base::sync_with_stdio(0); vector<lint> w; vector<Event> events; read_data(w, events); Mlotek m(w, events); m.solve(); return 0; } |