Advertisement
alisadafi

Reverse-Operation-D&C

Dec 18th, 2023
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. long long maxCrossingSum(vector<long long>& arr, int l, int m, int r) {
  7.     long long sm = 0;
  8.     long long left_sum = LLONG_MIN;
  9.  
  10.     for (int i = m; i >= l; i--) {
  11.         sm = sm + arr[i];
  12.         if (sm > left_sum) {
  13.             left_sum = sm;
  14.         }
  15.     }
  16.  
  17.     sm = 0;
  18.     long long right_sum = LLONG_MIN;
  19.     for (int i = m; i <= r; i++) {
  20.         sm = sm + arr[i];
  21.         if (sm > right_sum) {
  22.             right_sum = sm;
  23.         }
  24.     }
  25.  
  26.     return max(left_sum + right_sum - arr[m], max(left_sum, right_sum));
  27. }
  28.  
  29. long long maxSubArraySum(vector<long long>& arr, int l, int r) {
  30.     if (l > r) {
  31.         return LLONG_MIN;
  32.     }
  33.     if (l == r) {
  34.         return arr[l];
  35.     }
  36.  
  37.     int m = (l + r) / 2;
  38.  
  39.     return max({maxSubArraySum(arr, l, m - 1), maxSubArraySum(arr, m + 1, r), maxCrossingSum(arr, l, m, r)});
  40. }
  41.  
  42. long long reverse_operation(vector<long long>& arr, int n) {
  43.     vector<long long> b_1, b_2;
  44.     for (int i = 1; i < n; i += 2) {
  45.         b_1.push_back(arr[i] - arr[i - 1]);
  46.     }
  47.     for (int i = 1; i < n - 1; i += 2) {
  48.         b_2.push_back(arr[i] - arr[i + 1]);
  49.     }
  50.  
  51.     long long change = max(maxSubArraySum(b_1, 0, b_1.size() - 1), maxSubArraySum(b_2, 0, b_2.size() - 1));
  52.     long long even_sum = 0;
  53.     for (int i = 0; i < n; i++) {
  54.         if (i % 2 == 0) {
  55.             even_sum += arr[i];
  56.         }
  57.     }
  58.  
  59.     return even_sum + max(0LL, change);
  60. }
  61.  
  62. int main() {
  63.     int t;
  64.     cin >> t;
  65.     while (t--) {
  66.         int n;
  67.         cin >> n;
  68.         vector<long long> arr(n);
  69.         for (int i = 0; i < n; i++) {
  70.             cin >> arr[i];
  71.         }
  72.         cout << reverse_operation(arr, n) << endl;
  73.     }
  74.     return 0;
  75. }
  76.  
Tags: D&C
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement