"""
array_size n
divide arr in 4 subarray such that
(sum[0,i-1]+sum[j,k-1]) - (sum[i,j-1]+sum[k,n-1]) :=> maximum
Bruteforce:
PreCompute : Prefix_Sum
There are 3 pointers : i , j , k
N Cube Iteration : O(N^3)
Optimized:
(sum[0,i-1]+sum[j,k-1]) - (sum[i,j-1]+sum[k,n-1]) :=> maximum
(sum[0,i-1]-sum[i,j-1]) + (sum[j,k-1]-sum[k,n-1]) :=> reshuffled
A: sum[0,i-1]-sum[i,j-1] => 2*PS[i-1] - PS[j-1]
J is second pointer and 2 subarrays does not include
B: sum[j,k-1]-sum[k,n-1] => SS[j] - 2*SS[k]
J is the second pointer and remaing 3 subarray include j index
for A we need max PS[i-1] meaning prev PS
for B we need min SS[k] meaning prev SS
Maximize (A + B) => Max A possible + Max B Possible
PreCompute : Prefix_Sum
Algo
1. Compute Prefix_Sum
2. Compute Suffix_sum
3. Compute bestAPrefixSum
4. Compute bestBSuffixSum
5. Iterate once a get max
"""
import math
def main(arr):
n = len(arr)
prefix_sum = [0]*n
for i in range(n):
prefix_sum[i] = arr[i] if i==0 else arr[i] + prefix_sum[i-1]
suffix_sum = [0]*n
for i in range(n-1,-1,-1):
suffix_sum[i] = arr[i] if i==n-1 else arr[i] + suffix_sum[i+1]
bestAPrefixSum = [0]*n
# TWEAK 1: Start maxi at 0 to allow an empty first subarray
maxi = 0
# TWEAK 2: Start j from 1, so you don't skip evaluating wall j=1
for j in range(1, n):
# Update maxi before calculating to allow i = j
maxi = max(maxi, prefix_sum[j-1])
bestAPrefixSum[j] = 2*maxi - prefix_sum[j-1]
bestBSuffixSum = [0]*n
# TWEAK 1: Start mini at 0 to allow an empty fourth subarray
mini = 0
# TWEAK 2: Loop down to 0, so you don't skip evaluating wall j=n-2 or lower
for j in range(n-1, -1, -1):
# Update mini before calculating to allow k = j
mini = min(mini, suffix_sum[j] if j < n else 0)
bestBSuffixSum[j] = suffix_sum[j] - 2*mini
# Default ans to negative infinity instead of 0 to handle negative max scores
ans = -math.inf
for i in range(1, n): # Evaluate valid split points
ans = max(ans, bestAPrefixSum[i] + bestBSuffixSum[i])
return ans
print(main([1, 2, 1, -5]))
IiIiCgphcnJheV9zaXplIG4KCmRpdmlkZSBhcnIgaW4gNCBzdWJhcnJheSBzdWNoIHRoYXQKCihzdW1bMCxpLTFdK3N1bVtqLGstMV0pIC0gKHN1bVtpLGotMV0rc3VtW2ssbi0xXSkgOj0+IG1heGltdW0KCgpCcnV0ZWZvcmNlOgpQcmVDb21wdXRlIDogUHJlZml4X1N1bQpUaGVyZSBhcmUgMyBwb2ludGVycyA6IGkgLCBqICwgawpOIEN1YmUgSXRlcmF0aW9uIDogTyhOXjMpCgpPcHRpbWl6ZWQ6Cgooc3VtWzAsaS0xXStzdW1baixrLTFdKSAtIChzdW1baSxqLTFdK3N1bVtrLG4tMV0pIDo9PiBtYXhpbXVtCgooc3VtWzAsaS0xXS1zdW1baSxqLTFdKSArIChzdW1baixrLTFdLXN1bVtrLG4tMV0pIDo9PiByZXNodWZmbGVkCgpBOiBzdW1bMCxpLTFdLXN1bVtpLGotMV0gPT4gMipQU1tpLTFdIC0gICBQU1tqLTFdIAoKSiBpcyBzZWNvbmQgcG9pbnRlciBhbmQgMiBzdWJhcnJheXMgZG9lcyBub3QgaW5jbHVkZQoKQjogc3VtW2osay0xXS1zdW1bayxuLTFdID0+ICAgU1Nbal0gICAtIDIqU1Nba10KCkogaXMgdGhlIHNlY29uZCBwb2ludGVyIGFuZCByZW1haW5nIDMgc3ViYXJyYXkgaW5jbHVkZSBqIGluZGV4Cgpmb3IgQSB3ZSBuZWVkIG1heCBQU1tpLTFdIG1lYW5pbmcgcHJldiBQUwpmb3IgQiB3ZSBuZWVkIG1pbiBTU1trXSBtZWFuaW5nIHByZXYgU1MKCk1heGltaXplIChBICsgQikgPT4gTWF4IEEgcG9zc2libGUgKyBNYXggQiBQb3NzaWJsZQoKUHJlQ29tcHV0ZSA6IFByZWZpeF9TdW0KCkFsZ28KMS4gQ29tcHV0ZSBQcmVmaXhfU3VtCjIuIENvbXB1dGUgU3VmZml4X3N1bQoKMy4gQ29tcHV0ZSBiZXN0QVByZWZpeFN1bQo0LiBDb21wdXRlIGJlc3RCU3VmZml4U3VtCgo1LiBJdGVyYXRlIG9uY2UgYSBnZXQgbWF4CgoiIiIKCgppbXBvcnQgbWF0aApkZWYgbWFpbihhcnIpOgogICAgbiA9IGxlbihhcnIpCiAgICAKICAgIHByZWZpeF9zdW0gPSBbMF0qbgogICAgZm9yIGkgaW4gcmFuZ2Uobik6CiAgICAgICAgcHJlZml4X3N1bVtpXSA9IGFycltpXSBpZiBpPT0wIGVsc2UgYXJyW2ldICsgcHJlZml4X3N1bVtpLTFdCiAgICAKICAgIHN1ZmZpeF9zdW0gPSBbMF0qbgogICAgZm9yIGkgaW4gcmFuZ2Uobi0xLC0xLC0xKToKICAgICAgICBzdWZmaXhfc3VtW2ldID0gYXJyW2ldIGlmIGk9PW4tMSBlbHNlIGFycltpXSArIHN1ZmZpeF9zdW1baSsxXQogICAgCiAgICBiZXN0QVByZWZpeFN1bSA9IFswXSpuCiAgICAjIFRXRUFLIDE6IFN0YXJ0IG1heGkgYXQgMCB0byBhbGxvdyBhbiBlbXB0eSBmaXJzdCBzdWJhcnJheQogICAgbWF4aSA9IDAgCiAgICAKICAgICMgVFdFQUsgMjogU3RhcnQgaiBmcm9tIDEsIHNvIHlvdSBkb24ndCBza2lwIGV2YWx1YXRpbmcgd2FsbCBqPTEKICAgIGZvciBqIGluIHJhbmdlKDEsIG4pOgogICAgICAgICMgVXBkYXRlIG1heGkgYmVmb3JlIGNhbGN1bGF0aW5nIHRvIGFsbG93IGkgPSBqCiAgICAgICAgbWF4aSA9IG1heChtYXhpLCBwcmVmaXhfc3VtW2otMV0pCiAgICAgICAgYmVzdEFQcmVmaXhTdW1bal0gPSAyKm1heGkgLSBwcmVmaXhfc3VtW2otMV0KICAgICAgICAKICAgIGJlc3RCU3VmZml4U3VtID0gWzBdKm4KICAgICMgVFdFQUsgMTogU3RhcnQgbWluaSBhdCAwIHRvIGFsbG93IGFuIGVtcHR5IGZvdXJ0aCBzdWJhcnJheQogICAgbWluaSA9IDAgCiAgICAKICAgICMgVFdFQUsgMjogTG9vcCBkb3duIHRvIDAsIHNvIHlvdSBkb24ndCBza2lwIGV2YWx1YXRpbmcgd2FsbCBqPW4tMiBvciBsb3dlcgogICAgZm9yIGogaW4gcmFuZ2Uobi0xLCAtMSwgLTEpOgogICAgICAgICMgVXBkYXRlIG1pbmkgYmVmb3JlIGNhbGN1bGF0aW5nIHRvIGFsbG93IGsgPSBqCiAgICAgICAgbWluaSA9IG1pbihtaW5pLCBzdWZmaXhfc3VtW2pdIGlmIGogPCBuIGVsc2UgMCkKICAgICAgICBiZXN0QlN1ZmZpeFN1bVtqXSA9IHN1ZmZpeF9zdW1bal0gLSAyKm1pbmkKICAgICAgICAKICAgICMgRGVmYXVsdCBhbnMgdG8gbmVnYXRpdmUgaW5maW5pdHkgaW5zdGVhZCBvZiAwIHRvIGhhbmRsZSBuZWdhdGl2ZSBtYXggc2NvcmVzCiAgICBhbnMgPSAtbWF0aC5pbmYKICAgIAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbik6ICAjIEV2YWx1YXRlIHZhbGlkIHNwbGl0IHBvaW50cwogICAgICAgIGFucyA9IG1heChhbnMsIGJlc3RBUHJlZml4U3VtW2ldICsgYmVzdEJTdWZmaXhTdW1baV0pCiAgICAgICAgCiAgICByZXR1cm4gYW5zCgpwcmludChtYWluKFsxLCAyLCAxLCAtNV0pKQoK