voidsolve(int n, vector<int>& nums, int k, int x){ if (x < 0) { x = -x; k = n - k; } for (auto& num : nums) { num -= x; } // the case subarray is bigger than k // we need to find a minimum of k numbers to add value to vector<longlong> preSum(n + 1, 0); for (int i = 0; i < n; i++) { preSum[i + 1] = preSum[i] + nums[i]; } deque<longlong> minQ; int left = 0, right = 0; longlong res = LLONG_MIN; while (right < preSum.size()) { if (right - k >= 0) { while (!minQ.empty() && preSum[right - k] < minQ.back()) { minQ.pop_back(); } minQ.push_back(preSum[right - k]); res = max(res, preSum[right] - minQ.front()); } right++; } res += 2 * (longlong) k * x;
// the case subarray size is less than or equal to k for (auto& num: nums) { num += 2 * x; } preSum[0] = 0; for (int i = 0; i < n; i++) { preSum[i + 1] = preSum[i] + nums[i]; } left = 0, right = 0; minQ.clear(); while (right < preSum.size()) { while (!minQ.empty() && preSum[right] < minQ.back()) { minQ.pop_back(); } minQ.push_back(preSum[right++]); if (right - left > k) { if (minQ.front() == preSum[left]) { minQ.pop_front(); } left++; } if (!minQ.empty()) { res = max(res, minQ.back() - minQ.front()); } } out << (res < 0 ? 0 : res) << endl; }
intmain(){ int tc; in >> tc; for (int t = 1; t <= tc; t++) { int n, k, x; in >> n >> k >> x; vector<int> nums; for (int i = 0; i < n; i++) { int num; in >> num; nums.push_back(num); } solve(n, nums, k, x); } return0; }