Advertisement
cosenza987

Untitled

Mar 11th, 2024
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. //Слава Україні, Героям слава
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     ios_base::sync_with_stdio(false);
  9.     cin.tie(nullptr);
  10.     int t;
  11.     cin >> t;
  12.     while(t--) {
  13.         long long n, b, k1, k2;
  14.         cin >> n >> b >> k1 >> k2;
  15.         vector<int> v(n + 1), c(n + 1), d(n + 1), e(n + 1);
  16.         for(int i = 1; i <= n; i++) {
  17.             cin >> v[i];
  18.             c[i] = (v[i] + 1) / 2;
  19.             d[i] = max(v[i] - b, 0ll);
  20.             e[i] = min(max((v[i] + 1) / 2 - b, 0ll), (max(v[i] - b, 0ll) + 1) / 2);
  21.         }
  22.         function<tuple<long long, long long, long long>(int, int)> calc2 = [&](int k, int l) {
  23.             long long res = 0, cntk = 0, cntl = 0, other = 0;
  24.             for(int i = 1; i <= n; i++) {
  25.                 if(v[i] <= min({c[i] + k, d[i] + l, e[i] + k + l})) {
  26.                     res += v[i];
  27.                 } else if(e[i] + k + l < min(c[i] + k, d[i] + l)) {
  28.                     res += e[i] + k + l;
  29.                     cntk++;
  30.                     cntl++;
  31.                 } else if(c[i] + k < d[i] + l) {
  32.                     res += c[i] + k;
  33.                     cntk++;
  34.                 } else if(d[i] + l < c[i] + k) {
  35.                     res += d[i] + l;
  36.                     cntl++;
  37.                 } else {
  38.                     res += c[i] + k;
  39.                     other++;
  40.                 }
  41.             }
  42.             long long rem = max(0ll, min(other, k1 - cntk));
  43.             cntk += rem;
  44.             cntl += other - rem;
  45.             cout << res << " " << cntk << " " << cntl << "\n";
  46.             return tie(res, cntk, cntl);
  47.         };
  48.         function<pair<long long, int>(int)> calc = [&](int k) {
  49.             int l = 0, r = 1e9, ans = 0;
  50.             while(l <= r) {
  51.                 int mid = (l + r) >> 1;
  52.                 auto [x, y, z] = calc2(k, mid);
  53.                 cout << x << " " << y << " " << z << "\n";
  54.                 if(z <= k2) {
  55.                     ans = mid;
  56.                     r = mid - 1;
  57.                 } else {
  58.                     l = mid + 1;
  59.                 }
  60.             }
  61.             auto [x, y, z] = calc2(k, ans);
  62.             return make_pair(x - k1 * k - k2 * ans, y);
  63.         };
  64.         int l = 0, r = 1e9, ans = 0;
  65.         while(l <= r) {
  66.             int mid = (l + r) >> 1;
  67.             if(calc(mid).second <= k1) {
  68.                 ans = mid;
  69.                 r = mid - 1;
  70.             } else {
  71.                 l = mid + 1;
  72.             }
  73.         }
  74.         cout << calc(ans).first << "\n";
  75.     }
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement