美文网首页程序员
636div3 - C. Alternating Subsequ

636div3 - C. Alternating Subsequ

作者: waaagh | 来源:发表于2020-05-24 23:49 被阅读0次

首先想到二维dp,不过肯定超时。
先找规律:同号的为一类,每类找最大的,相加即为所求。比如:(1 2 3) (-1 -2),最大序列数肯定为2,和即为最大的之和3+(-1)=2。算法使用two-pointer,两指针之间为一类数。
代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 2e5+10;
using ll = long long;

int t, n;
ll a[N];
inline int sgn(int x) {
    return x>0?1:-1;
}
int main() {
    cin >> t;
    while(t--) {
        cin >> n;
        for(int i=1; i<=n; i++) {
            cin >> a[i];
        }
        int i, j;
        ll ans = 0;
        for(i=1; i<=n; i++) {
            ll cur = a[i];
            j = i;
            while(j<=n && sgn(a[i]) == sgn(a[j])) {
                cur = max(cur, a[j]);
                j++;
            }
            ans += cur;
            i = j-1;
        }
        cout << ans << endl;
    }
    return 0;
}

相关文章

网友评论

    本文标题:636div3 - C. Alternating Subsequ

    本文链接:https://www.haomeiwen.com/subject/ydzsahtx.html