Use this to learn the idea, then write your own version.
123 45class Solution {6public:7 int maxCapacity(vector<int>& costs, vector<int>& capacity, int budget) {8 const auto& mid = (budget - 1) / 2;9 vector<int> lookup(budget);10 for (int i = 0; i < size(costs); ++i) {11 if (costs[i] >= budget) {12 continue;13 }14 lookup[costs[i]] = max(lookup[costs[i]], capacity[i]);15 }16 for (int i = 0; i + 1 <= mid; ++i) {17 lookup[i + 1] = max(lookup[i + 1], lookup[i]);18 }19 int result = 0, mx = 0;20 for (int i = 0; i < size(costs); ++i) {21 if (costs[i] > mid) {22 continue;23 }24 result = max(result, mx + capacity[i]);25 mx = max(mx, capacity[i]);26 }27 for (int i = mid + 1; i <= budget - 1; ++i) {28 result = max(result, lookup[i] + lookup[(budget - 1) - i]);29 }30 return result;31 }32};33 34353637class Solution2 {38public:39 int maxCapacity(vector<int>& costs, vector<int>& capacity, int budget) {40 vector<int> idxs(size(costs));41 iota(begin(idxs), end(idxs), 0);42 sort(begin(idxs), end(idxs), [&](const auto& a, const auto& b) {43 return costs[a] < costs[b];44 });45 46 int result = 0;47 vector<pair<int, int>> stk;48 for (const auto& i : idxs) {49 const auto& cost = costs[i], &cap = capacity[i];50 if (cost >= budget) {51 break;52 }53 while (!empty(stk) && stk.back().first + cost >= budget) {54 stk.pop_back();55 }56 result = max(result, (!empty(stk) ? stk.back().second : 0) + cap);57 if (empty(stk) || stk.back().second < cap) {58 stk.emplace_back(cost, cap);59 }60 }61 return result;62 }63};64 65666768class Solution3 {69public:70 int maxCapacity(vector<int>& costs, vector<int>& capacity, int budget) {71 vector<int> idxs(size(costs));72 iota(begin(idxs), end(idxs), 0);73 sort(begin(idxs), end(idxs), [&](const auto& a, const auto& b) {74 return costs[a] < costs[b];75 });76 77 vector<int> prefix(size(capacity) + 1);78 for (int i = 0; i < size(capacity); ++i) {79 prefix[i + 1] = max(prefix[i], capacity[idxs[i]]);80 }81 int result = 0;82 vector<pair<int, int>> stk;83 vector<int> sorted_costs;84 sorted_costs.reserve(size(costs));85 for (const auto& i : idxs) {86 sorted_costs.emplace_back(costs[i]);87 }88 for (int i = 0; i < size(idxs); ++i) {89 const auto& cost = costs[idxs[i]], &cap = capacity[idxs[i]];90 if (cost >= budget) {91 break;92 }93 const auto& j = distance(cbegin(sorted_costs), lower_bound(cbegin(sorted_costs), cbegin(sorted_costs) + i, budget - cost)) - 1;94 result = max(result, prefix[j + 1] + cap);95 }96 return result;97 }98};99 100101102103class Solution4 {104public:105 int maxCapacity(vector<int>& costs, vector<int>& capacity, int budget) {106 const auto& binary_search_right = [](int left, int right, const auto& check) {107 while (left <= right) {108 const auto& mid = left + (right - left) / 2;109 if (!check(mid)) {110 right = mid - 1;111 } else {112 left = mid + 1;113 }114 }115 return right;116 };117 118 vector<int> idxs(size(costs));119 iota(begin(idxs), end(idxs), 0);120 sort(begin(idxs), end(idxs), [&](const auto& a, const auto& b) {121 return costs[a] < costs[b];122 });123 124 vector<int> prefix(size(capacity) + 1);125 for (int i = 0; i < size(capacity); ++i) {126 prefix[i + 1] = max(prefix[i], capacity[idxs[i]]);127 }128 int result = 0;129 vector<pair<int, int>> stk;130 for (int i = 0; i < size(idxs); ++i) {131 const auto& cost = costs[idxs[i]], &cap = capacity[idxs[i]];132 if (cost >= budget) {133 break;134 }135 const auto& j = binary_search_right(0, i - 1, [&](const auto& x) {136 return costs[idxs[x]] + cost < budget;137 });138 result = max(result, prefix[j + 1] + cap);139 }140 return result;141 }142};143