题解 CF1215B 【The Number of Products】

· · 题解

这题就是一道简单DP啊,还卡我10min。

我们设f_i表示以i结尾为乘积正数的个数,g_i表示以i结尾为乘积负数的个数,我们就可以推递推式了。

$2.$ 递推: (1)$a[i] > 0:f[i] += f[i - 1],g[i] +=g[i - 1]

(2)a[i] < 0:f[i] += g[i - 1], g[i] += f[i - 1]

解释一下:若a[i] > 0,对子串乘积的正负没有影响,反之会使子串乘积的正负正好相反,本题的转移方程就显而易见了。

上代码: ```cpp #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #define N 200005 using namespace std; int n, a[N], pos[N], tot; long long f[N], g[N]; int main () { scanf ("%d", &n); for (int i = 1; i <= n; ++i) { scanf ("%d", a + i); if (a[i] > 0) f[i] = 1; else g[i] = 1; } for (int i = 2; i <= n; ++i) { if (a[i] > 0) { f[i] += f[i - 1]; g[i] += g[i - 1]; } else { f[i] += g[i - 1]; g[i] += f[i - 1]; } } long long rg = 0, rf = 0; for (int i = 1; i <= n; ++i) { rf += f[i]; rg += g[i]; } printf ("%I64d %I64d\n", rg, rf); return 0; } ```