Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <cstdint>
- #include <set>
- #include <tuple>
- #include <vector>
- class Stock {
- private:
- uint64_t cur_num = 0;
- std::vector<int> w_val;
- std::vector<int> v_val;
- struct Param {
- int param;
- uint64_t box_num;
- bool operator<(const Param& rhs) const {
- return std::tie(param, rhs.box_num) < std::tie(rhs.param, box_num);
- }
- };
- std::set<Param> w_set;
- std::set<Param> v_set;
- int get_box(int param, const std::set<Param>& cur_set) {
- auto it = std::lower_bound(cur_set.begin(), cur_set.end(), param,
- [](const Param& lhs, const int rhs) {return lhs.param < rhs;});
- if (it == cur_set.end()) {
- return -1;
- } else {
- uint64_t box_num = it->box_num;
- w_set.erase({w_val[box_num], box_num});
- v_set.erase({v_val[box_num], box_num});
- return box_num;
- }
- }
- public:
- void add(int w, int v) {
- w_val.push_back(w);
- v_val.push_back(v);
- w_set.insert({w, cur_num});
- v_set.insert({v, cur_num});
- ++cur_num;
- }
- int get_by_w(int min_w) {
- return get_box(min_w, w_set);
- }
- int get_by_v(int min_v) {
- return get_box(min_v, v_set);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment