Rudolf and 121 (Codeforces 1941B)
Tags: Greedy, brute force

Rudolf has an array $$$a$$$ of $$$n$$$ integers, the elements are numbered from $$$1$$$ to $$$n$$$.In one operation, he can choose an index $$$i$$$ ($$$2 \le i \le n - 1$$$) and assign:  $$$a_{i - 1} = a_{i - 1} - 1$$$  $$$a_i = a_i - 2$$$  $$$a_{i + 1} = a_{i + 1} - 1$$$ Rudolf can apply this operation any number of times. Any index $$$i$$$ can be used zero or more times.Can he make all the elements of the array equal to zero using this operation?

Input: The first line of the input contains a single integer $$$t$$$ ($$$1 \le t \le 10^4$$$) — the number of test cases in the test.The first line of each case contains a single integer $$$n$$$ ($$$3 \le n \le 2 \cdot 10^5$$$) — the number of elements in the array.The second line of each case contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$0 \le a_j \le 10^9$$$) — the elements of the array.It is guaranteed that the sum of the values of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, output "YES" if it is possible to make all the elements of the array zero using the described operations. Otherwise, output "NO".You can output each letter in any case (lowercase or uppercase). For example, the strings "yEs", "yes", "Yes", and "YES" will be accepted as a positive answer.

Note: In the first example, the original array is $$$[1, 3, 5, 5, 2]$$$, to make all its elements zero, Rudolf can act as follows:  apply the operation at $$$i=4$$$ and get the array $$$[1, 3, 4, 3, 1]$$$;  apply the operation at $$$i=3$$$ and get the array $$$[1, 2, 2, 2, 1]$$$;  apply the operation at $$$i=2$$$ and get the array $$$[0, 0, 1, 2, 1]$$$;  apply the operation at $$$i=4$$$ and get the array $$$[0, 0, 0, 0, 0]$$$. 

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

Sample Outputs:
YES
NO
YES
NO
NO
NO
NO

Solution (Python):
import sys
from functools import lru_cache
sys.setrecursionlimit(100000000)

def read():
    return sys.stdin.readline().strip()

def ii():
    return int(read())

def il():
    return list(map(int, read().split()))
t = ii()

def solve():
    n = ii()
    a = il()
    for i in range(n - 2):
        if a[i] < 0:
            print('NO')
            return
        op = a[i]
        a[i + 1] -= 2 * op
        a[i + 2] -= op
    if a[-1] != 0 or a[-2] != 0:
        print('NO')
    else:
        print('YES')
for i in range(t):
    solve()

Solution (Python):
import sys
MOD = 10 ** 9 + 7
INF = int(1e+18)
input = lambda : sys.stdin.readline().rstrip()
''

def solve():
    n = int(input())
    a = list(map(int, input().split()))
    for i in range(n - 2):
        val = a[i]
        a[i] -= val
        a[i + 1] -= 2 * val
        a[i + 2] -= val
        if a[i + 1] < 0 or a[i + 2] < 0:
            print('NO')
            return
    print('YES' if sum(a) == 0 else 'NO')
for _ in range(int(input())):
    solve()

Solution (Python):
def main():
    t = int(input())
    for _ in range(t):
        n = int(input())
        a = list(map(int, input().split()))
        var1 = a[0]
        var2 = a[1] - 2 * a[0]
        possible = True
        for i in range(2, n - 1):
            var = a[i] - var1 - 2 * var2
            if var < 0:
                possible = False
                break
            var1 = var2
            var2 = var
        if a[1] - 2 * a[0] < 0 or a[n - 1] - var1 != 0 or var2 != 0:
            possible = False
        print('YES' if possible else 'NO')
if __name__ == '__main__':
    main()