Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int maximumReward(int N, int K, vector<int> &C)
- {
- priority_queue<int, vector<int>, greater<int>> min_heap; // min heap to calculate the maximum sum till i element
- priority_queue<int> max_heap; // max heap to calculate the minimum sum after i element
- int preSum = 0;
- int sufSum = 0;
- vector<int> prefix(2 * N, -1);
- vector<int> suffix(2 * N, 1e9);
- for (int i = 0; i < K; i++)
- {
- preSum += C[i];
- min_heap.push(C[i]);
- }
- prefix[K - 1] = preSum;
- for (int i = K; i < (2 * N); i++)
- {
- int top_ele = min_heap.top();
- if (C[i] > top_ele)
- {
- preSum -= top_ele;
- min_heap.pop();
- preSum += C[i];
- min_heap.push(C[i]);
- }
- prefix[i] = preSum;
- }
- for (int i = 2 * N - 1; i >= (2 * N - K); i--)
- {
- sufSum += C[i];
- max_heap.push(C[i]);
- }
- suffix[2 * N - K] = sufSum;
- for (int i = 2 * N - K - 1; i >= 0; i--)
- {
- int top_ele = max_heap.top();
- if (C[i] < top_ele)
- {
- sufSum -= top_ele;
- max_heap.pop();
- sufSum += C[i];
- max_heap.push(C[i]);
- }
- suffix[i] = sufSum;
- }
- int res = -1;
- for (auto i = K - 1; i < 2 * N - K; i++)
- {
- res = max(res, prefix[i] - suffix[i + 1]);
- }
- return res;
- }
- int main()
- {
- int N, K;
- cin >> N >> K;
- vector<int> C(2 * N);
- for (int i = 0; i < 2 * N; i++)
- {
- cin >> C[i];
- }
- cout << maximumReward(N, K, C) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment