主程序将数组分割成若干个不含0的子数组,从而使的子数组的乘积不会是0. 在分割过程中,为了方便把正数用1表示,负数用0表示。

函数ml意为一个不含0的数组ll的乘积为正数的最长连续子数组点长度max_len。这又可以按ll中有多少负数分成三种情况:

Case 1:含有偶数个负数,全部乘起来一定是正数;

Case 2:含有1个负数,把数组分割成前后两段,哪段长那段就是乘积为正数的最长连续子数组;

Case 3:含有奇数个负数且把数组分割成至少四段,这时要么舍弃第一段、要么舍弃最后一段不加入我们想要的乘积为正数的最长连续子数组,哪段短就舍弃哪段。

#     negative number index
    ni = [i for i in range(len(ll)) if ll[i] == 0]
    if len(ni)%2 == 0:
        return len(ll)
    elif len(ni) == 1:
        return max(len(ll)-ni[0], ni[0])
    elif len(ni)%2 == 1:
        return max(ni[-1],len(ll)-ni[0]-1)

input()
nn = list(map(int, input().split()))+[0]

res,nl = 0,[[]]
# Split nn (list) into nl (list of lists) with 0 as separater
for n in nn:
    if n>0:
        nl[-1].append(1)
    elif n<0:
        nl[-1].append(0)
    elif n==0:
        nl.append([])

for l in nl:
    res = max(res, ml(l))
print(res)