Qpwoeirut And The City (Codeforces 1706C)
Tags: Greedy, flows

Qpwoeirut has taken up architecture and ambitiously decided to remodel his city.Qpwoeirut's city can be described as a row of $$$n$$$ buildings, the $$$i$$$-th ($$$1 \le i \le n$$$) of which is $$$h_i$$$ floors high. You can assume that the height of every floor in this problem is equal. Therefore, building $$$i$$$ is taller than the building $$$j$$$ if and only if the number of floors $$$h_i$$$ in building $$$i$$$ is larger than the number of floors $$$h_j$$$ in building $$$j$$$.Building $$$i$$$ is cool if it is taller than both building $$$i-1$$$ and building $$$i+1$$$ (and both of them exist). Note that neither the $$$1$$$-st nor the $$$n$$$-th building can be cool.To remodel the city, Qpwoeirut needs to maximize the number of cool buildings. To do this, Qpwoeirut can build additional floors on top of any of the buildings to make them taller. Note that he cannot remove already existing floors.Since building new floors is expensive, Qpwoeirut wants to minimize the number of floors he builds. Find the minimum number of floors Qpwoeirut needs to build in order to maximize the number of cool buildings.

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 10^4$$$) — the number of test cases.The first line of each test case contains the single integer $$$n$$$ ($$$3 \le n \le 10^5$$$) — the number of buildings in Qpwoeirut's city.The second line of each test case contains $$$n$$$ integers $$$h_1, h_2, \ldots, h_n$$$ ($$$1 \le h_i \le 10^9$$$) — the number of floors in each of the buildings of the city.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, print a single integer — the minimum number of additional floors Qpwoeirut needs to build in order to maximize the number of cool buildings.

Note: In the first test case, it is optimal for Qpwoeirut to make the second building cool by building $$$2$$$ additional floors on top of it, making it taller than both of its adjacent buildings. The final heights of buildings will be $$$[2, \underline{3}, 2]$$$.  In the second test case, the number of cool buildings is already maximized, so Qpwoeirut does not need to do anything.In the third test case, it is optimal for Qpwoeirut to make the third and fifth buildings cool by building $$$2$$$ additional floors onto the third building and $$$1$$$ additional floor onto the fifth building. The final heights of buildings will be $$$[3, 1, \underline{6}, 5, \underline{6}, 2]$$$.  It can be shown that it is impossible to make more than $$$2$$$ of the buildings cool, or to make $$$2$$$ buildings cool using fewer than $$$3$$$ additional floors.In the fourth test case, Qpwoeirut can either make the second building cool, or he can make the third building cool. Either way, he will be building $$$3$$$ additional floors and maximizing the number of cool buildings. The final heights of buildings will be $$$[4, 2, \underline{4}, 3, 5, 3, 6, 1]$$$ or $$$[4, \underline{5}, 1, 3, 5, 3, 6, 1]$$$.  

Sample Inputs:
6
3
2 1 2
5
1 2 1 4 3
6
3 1 4 5 5 2
8
4 2 1 3 5 3 6 1
6
1 10 1 1 10 1
8
1 10 11 1 10 11 10 1

Sample Outputs:
2
0
3
3
0
4

Solution (Python):
t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    if n % 2 == 0:
        res = 0
        for i in range(1, n - 1, 2):
            mx = max(a[i - 1], a[i + 1])
            tmp = mx - a[i] + 1 if a[i] <= mx else 0
            res += tmp
        ans = res
        for i in range(n - 3, 0, -2):
            mx1 = max(a[i - 1], a[i + 1])
            tmp1 = mx1 - a[i] + 1 if a[i] <= mx1 else 0
            i += 1
            mx2 = max(a[i - 1], a[i + 1])
            tmp2 = mx2 - a[i] + 1 if a[i] <= mx2 else 0
            res = res - tmp1 + tmp2
            ans = min(ans, res)
    else:
        ans = 0
        for i in range(1, n - 1, 2):
            mx = max(a[i - 1], a[i + 1])
            if a[i] <= mx:
                ans += mx - a[i] + 1
    print(ans)

Solution (Python):
for _ in range(int(input())):
    n = int(input())
    a = list(map(int, input().split()))
    if n % 2 == 1:
        ans = 0
        for i in range(1, n - 1, 2):
            ans += max(0, max(a[i - 1], a[i + 1]) - a[i] + 1)
        print(ans)
    else:
        count_ = 0
        arr1 = []
        arr2 = []
        for i in range(1, n - 1, 2):
            count_ += max(0, max(a[i - 1], a[i + 1]) - a[i] + 1)
            arr1.append(count_)
        count_ = 0
        for i in range(2, n - 1, 2):
            count_ += max(0, max(a[i - 1], a[i + 1]) - a[i] + 1)
            arr2.append(count_)
        ans = min(arr1[-1], arr2[-1])
        for i in range((n - 1) // 2):
            ans = min(ans, arr1[i] + arr2[-1] - arr2[i])
        print(ans)

Solution (Python):
for _ in range(int(input())):
    n = int(input())
    l = list(map(int, input().split()))
    l1 = []
    for i in range(1, n - 1):
        l1.append(max(0, max(l[i - 1], l[i + 1]) + 1 - l[i]))
    if n % 2 == 1:
        print(sum(l1[::2]))
        continue
    a = sum(l1[1::2])
    b = a
    for i in range(0, len(l1), 2):
        b += l1[i] - l1[i + 1]
        a = min(a, b)
    print(a)