Codeforces 1215 B. The Number of Products

在这里插入图片描述

题意:

给你一个值都不为零的数组,分别找出有多少个连续的子串乘积小于零,大于零。

从首开始找负数字串,即有一个负数后,在下一个负数前这里面的都是负数子串。而其他的就为正数子串,正数子串初始化应为 1 1 1 ,所以得的正数子串最后应加上 1 1 1 。两个负数作为边上的元素的子串也可看为一个正数子串,负数子串和正数子串的乘积即为子串乘积为负数的数量。,例如 − 1 , 2 , 3 , − 4 -1,2,3,-4 1234 这个数组,它的负数子串为 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值