TrickmanOff

last

Oct 11th, 2020 (edited)
1,164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdint>
  3. #include <set>
  4. #include <tuple>
  5. #include <vector>
  6.  
  7. class Stock {
  8. private:
  9.     uint64_t cur_num = 0;
  10.     std::vector<int> w_val;
  11.     std::vector<int> v_val;
  12.  
  13.     struct Param {
  14.         int param;
  15.         uint64_t box_num;
  16.  
  17.         bool operator<(const Param& rhs) const {
  18.             return std::tie(param, rhs.box_num) < std::tie(rhs.param, box_num);
  19.         }
  20.     };
  21.  
  22.     std::set<Param> w_set;
  23.     std::set<Param> v_set;
  24.  
  25.     int get_box(int param, const std::set<Param>& cur_set) {
  26.         auto it = std::lower_bound(cur_set.begin(), cur_set.end(), param,
  27.                                    [](const Param& lhs, const int rhs) {return lhs.param < rhs;});
  28.  
  29.         if (it == cur_set.end()) {
  30.             return -1;
  31.         } else {
  32.             uint64_t box_num = it->box_num;
  33.             w_set.erase({w_val[box_num], box_num});
  34.             v_set.erase({v_val[box_num], box_num});
  35.             return box_num;
  36.         }
  37.     }
  38.  
  39. public:
  40.     void add(int w, int v) {
  41.         w_val.push_back(w);
  42.         v_val.push_back(v);
  43.         w_set.insert({w, cur_num});
  44.         v_set.insert({v, cur_num});
  45.         ++cur_num;
  46.     }
  47.  
  48.     int get_by_w(int min_w) {
  49.         return get_box(min_w, w_set);
  50.     }
  51.  
  52.     int get_by_v(int min_v) {
  53.         return get_box(min_v, v_set);
  54.     }
  55. };
  56.  
Advertisement
Add Comment
Please, Sign In to add comment