Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Слава Україні, Героям слава
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int t;
- cin >> t;
- while(t--) {
- long long n, b, k1, k2;
- cin >> n >> b >> k1 >> k2;
- vector<int> v(n + 1), c(n + 1), d(n + 1), e(n + 1);
- for(int i = 1; i <= n; i++) {
- cin >> v[i];
- c[i] = (v[i] + 1) / 2;
- d[i] = max(v[i] - b, 0ll);
- e[i] = min(max((v[i] + 1) / 2 - b, 0ll), (max(v[i] - b, 0ll) + 1) / 2);
- }
- function<tuple<long long, long long, long long>(int, int)> calc2 = [&](int k, int l) {
- long long res = 0, cntk = 0, cntl = 0, other = 0;
- for(int i = 1; i <= n; i++) {
- if(v[i] <= min({c[i] + k, d[i] + l, e[i] + k + l})) {
- res += v[i];
- } else if(e[i] + k + l < min(c[i] + k, d[i] + l)) {
- res += e[i] + k + l;
- cntk++;
- cntl++;
- } else if(c[i] + k < d[i] + l) {
- res += c[i] + k;
- cntk++;
- } else if(d[i] + l < c[i] + k) {
- res += d[i] + l;
- cntl++;
- } else {
- res += c[i] + k;
- other++;
- }
- }
- long long rem = max(0ll, min(other, k1 - cntk));
- cntk += rem;
- cntl += other - rem;
- cout << res << " " << cntk << " " << cntl << "\n";
- return tie(res, cntk, cntl);
- };
- function<pair<long long, int>(int)> calc = [&](int k) {
- int l = 0, r = 1e9, ans = 0;
- while(l <= r) {
- int mid = (l + r) >> 1;
- auto [x, y, z] = calc2(k, mid);
- cout << x << " " << y << " " << z << "\n";
- if(z <= k2) {
- ans = mid;
- r = mid - 1;
- } else {
- l = mid + 1;
- }
- }
- auto [x, y, z] = calc2(k, ans);
- return make_pair(x - k1 * k - k2 * ans, y);
- };
- int l = 0, r = 1e9, ans = 0;
- while(l <= r) {
- int mid = (l + r) >> 1;
- if(calc(mid).second <= k1) {
- ans = mid;
- r = mid - 1;
- } else {
- l = mid + 1;
- }
- }
- cout << calc(ans).first << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement