状态机写法:
/*
集合表示f[i][2] :
f[i][0]表示以第i个元素结尾的区间中正数的个数;
f[i][1]表示以第i个元素结尾的区间中负数的个数;
集合划分:
对第i个元素分类讨论并对最后一步做划分;
假如第i个元素为正数:
以第i个元素结尾的区间中正数的个数 = 以第i - 1个元素结尾的区间中正数的个数 + 他本身;
以第i个元素结尾的区间中负数的个数 = 以第i - 1个元素结尾的区间中负数的个数;
即:
f[i][0] = f[i - 1][0] + 1;
f[i][1] = f[i - 1][1];
假如第i个元素为负数:
以第i个元素结尾的区间中正数的个数 = 以第i - 1个元素结尾的区间中负数的个数;
以第i个元素结尾的区间中负数的个数 = 以第i - 1个元素结尾的区间中正数的个数 + 它本身;
即:
f[i][0] = f[i - 1][1];
f[i][1] = f[i - 1][0] + 1;
*/
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
int n;
int a[N];
int f[N][2];
int main()
{
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
for(int i = 1;i <= n;i ++)
if(a[i] > 0)
{
f[i][0] = f[i - 1][0] + 1;
f[i][1] = f[i - 1][1];
}
else
{
f[i][0] = f[i - 1][1];
f[i][1] = f[i - 1][0] + 1;
}
LL cnt1 = 0, cnt2 = 0;
for(int i = 1;i <= n;i ++) cnt1 += f[i][1], cnt2 += f[i][0];
cout << cnt1 << ' ' << cnt2 << endl;
return 0;
}