Monsters And Spells (Codeforces 1626C)
Tags: Greedy, two pointers

Monocarp is playing a computer game once again. He is a wizard apprentice, who only knows a single spell. Luckily, this spell can damage the monsters.The level he's currently on contains $$$n$$$ monsters. The $$$i$$$-th of them appears $$$k_i$$$ seconds after the start of the level and has $$$h_i$$$ health points. As an additional constraint, $$$h_i \le k_i$$$ for all $$$1 \le i \le n$$$. All $$$k_i$$$ are different.Monocarp can cast the spell at moments which are positive integer amounts of second after the start of the level: $$$1, 2, 3, \dots$$$ The damage of the spell is calculated as follows. If he didn't cast the spell at the previous second, the damage is $$$1$$$. Otherwise, let the damage at the previous second be $$$x$$$. Then he can choose the damage to be either $$$x + 1$$$ or $$$1$$$. A spell uses mana: casting a spell with damage $$$x$$$ uses $$$x$$$ mana. Mana doesn't regenerate.To kill the $$$i$$$-th monster, Monocarp has to cast a spell with damage at least $$$h_i$$$ at the exact moment the monster appears, which is $$$k_i$$$.Note that Monocarp can cast the spell even when there is no monster at the current second.The mana amount required to cast the spells is the sum of mana usages for all cast spells. Calculate the least amount of mana required for Monocarp to kill all monsters.It can be shown that it's always possible to kill all monsters under the constraints of the problem.

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 10^4$$$) — the number of testcases.The first line of the testcase contains a single integer $$$n$$$ ($$$1 \le n \le 100$$$) — the number of monsters in the level.The second line of the testcase contains $$$n$$$ integers $$$k_1 < k_2 < \dots < k_n$$$ ($$$1 \le k_i \le 10^9$$$) — the number of second from the start the $$$i$$$-th monster appears at. All $$$k_i$$$ are different, $$$k_i$$$ are provided in the increasing order.The third line of the testcase contains $$$n$$$ integers $$$h_1, h_2, \dots, h_n$$$ ($$$1 \le h_i \le k_i \le 10^9$$$) — the health of the $$$i$$$-th monster.The sum of $$$n$$$ over all testcases doesn't exceed $$$10^4$$$.

Output: For each testcase, print a single integer — the least amount of mana required for Monocarp to kill all monsters.

Note: In the first testcase of the example, Monocarp can cast spells $$$3, 4, 5$$$ and $$$6$$$ seconds from the start with damages $$$1, 2, 3$$$ and $$$4$$$, respectively. The damage dealt at $$$6$$$ seconds is $$$4$$$, which is indeed greater than or equal to the health of the monster that appears.In the second testcase of the example, Monocarp can cast spells $$$3, 4$$$ and $$$5$$$ seconds from the start with damages $$$1, 2$$$ and $$$3$$$, respectively.In the third testcase of the example, Monocarp can cast spells $$$4, 5, 7, 8$$$ and $$$9$$$ seconds from the start with damages $$$1, 2, 1, 1$$$ and $$$2$$$, respectively.

Sample Inputs:
3
1
6
4
2
4 5
2 2
3
5 7 9
2 1 2

Sample Outputs:
10
6
7

Solution (Python):
""""""
import sys
inp = sys.stdin.readline

def getCost(a: int):
    return a * (a + 1) // 2
for _ in range(int(inp())):
    n = int(inp())
    k = list(map(int, inp().split()))
    h = list(map(int, inp().split()))
    ans = 0
    segEnd = len(k) - 1
    segMax = len(k) - 1
    for i in range(len(k) - 2, -1, -1):
        if h[segMax] <= k[segMax] - k[i]:
            ans += getCost(h[segMax] + (k[segEnd] - k[segMax]))
            segEnd = i
            segMax = i
        elif h[i] + k[segMax] - k[i] > h[segMax]:
            segMax = i
    ans += getCost(h[segMax] + (k[segEnd] - k[segMax]))
    print(ans)

Solution (Python):
import sys
input = sys.stdin.readline
ans = []
for _ in range(int(input())):
    n = int(input())
    k = list(map(int, input().split()))
    h = list(map(int, input().split()))
    a = 0
    p = h[-1]
    q = k[-1]
    for i in range(n - 2, -1, -1):
        d = p - (q - k[i])
        if d > 0:
            if d < h[i]:
                p += h[i] - d
        else:
            a += (1 + p) * p // 2
            p = h[i]
            q = k[i]
    a += (1 + p) * p // 2
    ans.append(a)
for i in ans:
    print(i)

Solution (Python):
import sys
input = sys.stdin.readline

def helper(a):
    return a * (a + 1) // 2

def solve(n, arr):
    ans = helper(arr[0][1])
    curr = arr[0][1]
    for i in range(1, n):
        d = arr[i][0] - arr[i - 1][0]
        if d >= arr[i][1]:
            ans += helper(arr[i][1])
            curr = arr[i][1]
        else:
            ans += helper(curr + d) - helper(curr)
            curr += d
    return ans
t = int(input())
for _ in range(t):
    n = int(input())
    k = list(map(int, input().split()))
    h = list(map(int, input().split()))
    arr = list(zip(k, h))
    arr.sort(key=lambda x: x[0] - x[1])
    a = []
    a.append(arr[0])
    for i in range(1, n):
        if arr[i][0] > a[-1][0]:
            a.append(arr[i])
    print(solve(len(a), a))