Samkit5025

Untitled

Aug 19th, 2022
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int maximumReward(int N, int K, vector<int> &C)
  5. {
  6.     priority_queue<int, vector<int>, greater<int>> min_heap; // min heap to calculate the maximum sum till i element
  7.     priority_queue<int> max_heap;                            // max heap to calculate the minimum sum after i element
  8.  
  9.     int preSum = 0;
  10.     int sufSum = 0;
  11.  
  12.     vector<int> prefix(2 * N, -1);
  13.     vector<int> suffix(2 * N, 1e9);
  14.  
  15.     for (int i = 0; i < K; i++)
  16.     {
  17.         preSum += C[i];
  18.         min_heap.push(C[i]);
  19.     }
  20.     prefix[K - 1] = preSum;
  21.  
  22.     for (int i = K; i < (2 * N); i++)
  23.     {
  24.         int top_ele = min_heap.top();
  25.         if (C[i] > top_ele)
  26.         {
  27.             preSum -= top_ele;
  28.             min_heap.pop();
  29.             preSum += C[i];
  30.             min_heap.push(C[i]);
  31.         }
  32.         prefix[i] = preSum;
  33.     }
  34.  
  35.     for (int i = 2 * N - 1; i >= (2 * N - K); i--)
  36.     {
  37.         sufSum += C[i];
  38.         max_heap.push(C[i]);
  39.     }
  40.     suffix[2 * N - K] = sufSum;
  41.  
  42.     for (int i = 2 * N - K - 1; i >= 0; i--)
  43.     {
  44.         int top_ele = max_heap.top();
  45.         if (C[i] < top_ele)
  46.         {
  47.             sufSum -= top_ele;
  48.             max_heap.pop();
  49.             sufSum += C[i];
  50.             max_heap.push(C[i]);
  51.         }
  52.         suffix[i] = sufSum;
  53.     }
  54.  
  55.     int res = -1;
  56.     for (auto i = K - 1; i < 2 * N - K; i++)
  57.     {
  58.         res = max(res, prefix[i] - suffix[i + 1]);
  59.     }
  60.  
  61.     return res;
  62. }
  63.  
  64. int main()
  65. {
  66.     int N, K;
  67.     cin >> N >> K;
  68.  
  69.     vector<int> C(2 * N);
  70.     for (int i = 0; i < 2 * N; i++)
  71.     {
  72.         cin >> C[i];
  73.     }
  74.  
  75.     cout << maximumReward(N, K, C) << endl;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment