#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void) {
    int i, j, k, n, m, maxmax = -999999999, cnt, x, y, z;
    cin>>n;
    vector<int> t(n);
    for(i = 0; i < n; i++) scanf("%d", &t[i]);
    vector<int> f(t), pt(n, 0), ng(n, 0);
    pt[0] = t[0] > 0? 1:0;
    ng[0] = t[0] > 0? 0:1;
    for(i = 1; i < n; i++) {
        if(t[i] > 0) {
            pt[i] = pt[i-1] + 1;
            if(ng[i-1] > 0) ng[i] = ng[i-1] + 1; // 下面<0的判断已经经历过1次,也就是前面出现过一次负号,此时即使是>0,ng也要累加的,防止后续有<0的出现,导致乘积突变
            else ng[i] = 0; // 前面还没有<0出现
        } else if(t[i] < 0) {
            ng[i] = pt[i-1] + 1;
            if(ng[i-1] > 0) pt[i] = ng[i-1] + 1; // 已经出现了偶数次的<0,此时是正数>0,要赋值给pt的
            else pt[i] = 0; // 前面还没有<0出现
        } else {
            pt[i] = 0;
            ng[i] = 0;
        }
    }
    vector<int>::iterator kk = max_element(pt.begin(),pt.end());
    cout<<kk[0]<<endl;
    return 0;
}

根据上面的super-programmer给出来的题解,负号就需要不停的累加,正号可以来自负负得正,也可以来自纯正号的,负号需要在正号的基础上累加。