fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. ios::sync_with_stdio(false);
  6. cin.tie(nullptr);
  7. int T;
  8. if (!(cin >> T)) return 0;
  9. while (T--) {
  10. int n, q;
  11. cin >> n >> q;
  12. vector<long long> a(n);
  13. for (auto &x : a) cin >> x;
  14. sort(a.begin(), a.end(), greater<long long>()); // dùng lại cho mọi query
  15.  
  16. while (q--) {
  17. long long c;
  18. cin >> c;
  19.  
  20. // con trỏ vào a và heap cho phần dư trong query này
  21. int p = 0;
  22. priority_queue<long long> rem; // các phần "dung lượng còn lại"
  23.  
  24. long long ans = 0;
  25. for (int k = 29; k >= 0; --k) if ( (c >> k) & 1LL ) {
  26. long long best = 0;
  27.  
  28. // lấy max giữa a[p] và rem.top()
  29. if (p < n) best = a[p];
  30. if (!rem.empty()) best = max(best, rem.top());
  31.  
  32. // tiến con trỏ/heap tương ứng
  33. if (!rem.empty() && best == rem.top()) rem.pop();
  34. else if (p < n && best == a[p]) ++p;
  35. else best = 0; // cả hai trống
  36.  
  37. long long need = 1LL << k;
  38. if (best >= need) {
  39. long long leftover = best - need;
  40. if (leftover > 0) rem.push(leftover);
  41. } else {
  42. ans += need - best;
  43. // leftover = 0, không đẩy lại
  44. }
  45. }
  46. cout << ans << "\n";
  47. }
  48. }
  49. return 0;
  50. }
  51.  
Success #stdin #stdout 0.01s 5308KB
stdin
4
2 1
5 7
9
3 1
9 9 8
24
6 4
1 1 4 5 1 4
10
20
30
40
1 1
0
0
stdout
1
7
3
11
16
31
0