fork download
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. signed main() {
  6. // Tối ưu hóa tốc độ nhập xuất
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9.  
  10. int n, q;
  11. if (!(cin >> n >> q)) return 0;
  12.  
  13. vector<int> a(n + 1), pref(n + 1, 0);
  14. for (int i = 1; i <= n; i++) cin >> a[i];
  15.  
  16. // Sắp xếp mảng tăng dần
  17. sort(a.begin() + 1, a.end());
  18.  
  19. // Tạo mảng cộng dồn để tính tổng nhanh
  20. for (int i = 1; i <= n; i++) {
  21. pref[i] = pref[i - 1] + a[i];
  22. }
  23.  
  24. while (q--) {
  25. int k, m;
  26. cin >> k >> m;
  27.  
  28. // Đếm số lượng hoa thuộc nhóm < k và nhóm >= k
  29. int pos = lower_bound(a.begin() + 1, a.end(), k) - a.begin();
  30. int N_L = pos - 1; // Số lượng hoa < k
  31. int N_R = n - pos + 1; // Số lượng hoa >= k
  32.  
  33. // Tìm kiếm nhị phân số lượng hoa (x) sẽ lấy ở nhóm bên trái (< k)
  34. int low = max(0LL, m - N_R);
  35. int high = min(m, N_L);
  36.  
  37. while (low < high) {
  38. int mid = (low + high) / 2;
  39.  
  40. // Nếu đang lấy `mid` bông bên trái, bông tiếp theo có thể lấy là:
  41. int cost_left = a[mid + 1];
  42.  
  43. // Bông bên phải tương ứng định bị thay thế (bông thứ m - mid từ cuối mảng lên):
  44. int idx_right = n - (m - mid) + 1;
  45. int cost_right = 2 * k - a[idx_right];
  46.  
  47. // Nếu bông bên trái rẻ hơn bông bên phải, ta nên dịch sang phải để lấy thêm hoa bên trái
  48. if (cost_left < cost_right) {
  49. low = mid + 1;
  50. } else {
  51. high = mid;
  52. }
  53. }
  54.  
  55. // Kết quả x tối ưu tìm được
  56. int opt_x = low;
  57. int opt_y = m - opt_x; // Số bông lấy từ cuối mảng lên
  58.  
  59. // Tính tổng kết quả
  60. int ans = pref[opt_x]; // Nhóm bên trái giữ nguyên giá trị f(a_i) = a_i
  61. if (opt_y > 0) {
  62. int sum_R = pref[n] - pref[n - opt_y];
  63. ans += 2 * k * opt_y - sum_R; // Nhóm bên phải tính theo công thức 2k - a_i
  64. }
  65.  
  66. cout << ans << '\n';
  67. }
  68. return 0;
  69. }
Success #stdin #stdout 0s 5332KB
stdin
Standard input is empty
stdout
Standard output is empty