算法1
(前缀和) $O(n)$
用+-1重新记录数组
前缀和,注意细节
对每个数,计数它之前同号的数量
python 代码
n = int(input())
arr = list(map(int, input().split()))
#print(n,arr)
sgn = []
for a in arr:
if a>0:
sgn.append(1)
else:
sgn.append(-1)
# 只要求正数个数即可 总数-正数即为负数个数
pre_product = [1]
for s in sgn:
pre_product.append(pre_product[-1]*s)
#print(pre_product)
ans = 0 # number of postive pairs
pos = 1 #stats of pos
neg = 0 #stats of neg
for i in range(1,n+1):
if pre_product[i]>0:
ans += pos
else:
ans += neg
if pre_product[i]>0:
pos += 1
else:
neg += 1
print(n*(n+1)//2-ans, ans) #注意先输出负数