题意:
给你一个值都不为零的数组,分别找出有多少个连续的子串乘积小于零,大于零。
从首开始找负数字串,即有一个负数后,在下一个负数前这里面的都是负数子串。而其他的就为正数子串,正数子串初始化应为 1 1 1 ,所以得的正数子串最后应加上 1 1 1 。两个负数作为边上的元素的子串也可看为一个正数子串,负数子串和正数子串的乘积即为子串乘积为负数的数量。,例如 − 1 , 2 , 3 , − 4 -1,2,3,-4 −1,2,3,−4 这个数组,它的负数子串为 3 3 3 ,正数子串为 2 2 2, 3 × 2 = 3 3×2=3 3×2=3,这个 2 2 2,一个是 − 1 -1 −1 ,一个是 − 4 -4 −4。。负数个数出来了,用总数 n × ( n + 1 ) 2 \frac{n×(n+1)}{2} 2n×(n+1)减去负数个数便是正数的个数。
AC代码:
ll n, m, x;
ll res, ans1, ans2;
int main()
{
sld(n);
ll cnt1 = 0, cnt2 = 1, t = 1;
rep(i, 1, n)
{
sld(x);
if (x < 0)
t *= -1;
if (t > 0)
cnt2++;
else
cnt1++;
}
pldd(cnt1 * cnt2, n * (n + 1) / 2 - cnt1 * cnt2);
return 0;
}