Guest User

subsums

a guest
Feb 8th, 2023
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. #define ll long long
  6.  
  7. std::vector<ll> subsetSumsPartial(std::vector<ll>::iterator beg,
  8.                                   std::vector<ll>::iterator end) {
  9.   uint16_t n{static_cast<uint16_t>(end - beg)};
  10.   std::vector<ll> sums((1 << n), 0);
  11.   for (uint16_t i{1}; i < (1 << n); i++) {
  12.     ll sum{0};
  13.     uint16_t j{i}, pos{0};
  14.     while (j) {
  15.       if (j & 1) sum += *(beg + pos);
  16.       pos++;
  17.       j >>= 1;
  18.     }
  19.     sums[i] = sum;
  20.   }
  21.   return sums;
  22. }
  23.  
  24. ll subsetSumsTotal(const std::vector<ll> &sum1, const std::vector<ll> &sum2,
  25.                    int a, int b) {
  26.   ll ans{0};
  27.   for (auto x : sum1) {
  28.     auto lit = std::lower_bound(sum2.begin(), sum2.end(), a - x);
  29.     auto hit = std::upper_bound(sum2.begin(), sum2.end(), b - x);
  30.     ans += (hit - lit);
  31.   }
  32.   return ans;
  33. }
  34.  
  35. int main() {
  36.   uint16_t n{};
  37.   int a{}, b{};
  38.   std::cin >> n >> a >> b;
  39.   std::vector<ll> v(n);
  40.   for (uint16_t i{0}; i < n; i++) std::cin >> v[i];
  41.   std::vector<ll> sum1{subsetSumsPartial(v.begin(), (v.begin() + n / 2))};
  42.   std::vector<ll> sum2{subsetSumsPartial(v.begin() + n / 2, v.end())};
  43.   std::sort(sum2.begin(), sum2.end());
  44.   std::cout << subsetSumsTotal(sum1, sum2, a, b) << '\n';
  45.   return 0;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment