Alternating Subsequence _牛哄哄的柯南

简介: Alternating Subsequence

题目链接: Alternating Subsequence


C. Alternating Subsequence

time limit per test1 second

memory limit per test256 megabytes

inputstandard input

outputstandard output

Recall that the sequence b is a a subsequence of the sequence a if b can be derived from a by removing zero or more elements without changing the order of the remaining elements. For example, if a=[1,2,1,3,1,2,1], then possible subsequences are: [1,1,1,1], [3] and [1,2,1,3,1,2,1], but not [3,2,3] and [1,1,1,1,2].


You are given a sequence a consisting of n positive and negative elements (there is no zeros in the sequence).


Your task is to choose maximum by size (length) alternating subsequence of the given sequence (i.e. the sign of each next element is the opposite from the sign of the current element, like positive-negative-positive and so on or negative-positive-negative and so on). Among all such subsequences, you have to choose one which has the maximum sum of elements.


In other words, if the maximum length of alternating subsequence is k then your task is to find the maximum sum of elements of some alternating subsequence of length k.


You have to answer t independent test cases.


Input

The first line of the input contains one integer t (1≤t≤104) — the number of test cases. Then t test cases follow.


The first line of the test case contains one integer n (1≤n≤2⋅105) — the number of elements in a. The second line of the test case contains n integers a1,a2,…,an (−109≤ai≤109,ai≠0), where ai is the i-th element of a.


It is guaranteed that the sum of n over all test cases does not exceed 2⋅105 (∑n≤2⋅105).


Output

For each test case, print the answer — the maximum sum of the maximum by size (length) alternating subsequence of a.


Example

inputCopy

4

5

1 2 3 -1 -2

4

-1 -2 -1 -3

10

-2 8 3 8 -4 -15 5 -2 -3 1

6

1 -1000000000 1 -1000000000 1 -1000000000

outputCopy

2

-1

6

-2999999997

题意:就是给你一串数你需要找出其中的子串,并且这个子串是正负交替的,并且尽量让这个子串的和最大。

思路:这样的处理,就栈用着最方便了,对前面的数是正是负稍加判断,分别处理就好了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        stack<int> s;
        int n;
        cin>>n;
        int flag=1;
        int k;
        cin>>k;
        s.push(k);  // 先插入第一个
        if(k<0)  // 先判断下第一个
        {
            flag=0; // 当前位为负数
        }
        else
        {
            flag=1;  // 当前位为正数
        }
        for(int i=1;i<n;i++)
        {
            cin>>k;
            if(flag==0)  // 当前位为负数
            {
                if(k<0&&k>s.top())  // 后一位为负的并且比当前栈顶大,替换掉
                {
                    s.pop();
                    s.push(k);
                }
                if(k>0)  // 与其符号相反,压入即可
                {
                    s.push(k);
                    flag=1;
                }
            }
            else  // 当前位为正数
            {
                if(k>0&&k>s.top())  // 后一位为正的并且比当前栈顶大,替换掉
                {
                    s.pop();
                    s.push(k);
                }
                if(k<0)    // 与其符号相反,压入即可
                {
                    s.push(k);
                    flag=0;
                }
            }
        }
        ll num=0;
        while(!s.empty())  // 累加求和,输出即可
        {
            //cout<<s.top()<<" ";
            num+=s.top();
            s.pop();
        }
        cout<<num<<endl;  //输出即可
    }
    return 0;
}


相关文章
AtCoder Beginner Contest 214 F - Substrings(subsequence DP)
AtCoder Beginner Contest 214 F - Substrings(subsequence DP)
93 0
AtCoder Beginner Contest 225 F.String Cards(dp)
AtCoder Beginner Contest 225 F.String Cards(dp)
87 0
|
人工智能 JavaScript BI
AtCoder Beginner Contest 222 D - Between Two Arrays(前缀和优化dp)
AtCoder Beginner Contest 222 D - Between Two Arrays(前缀和优化dp)
100 0
HDU-1029,Ignatius and the Princess IV
HDU-1029,Ignatius and the Princess IV
|
人工智能
POJ 2533 Longest Ordered Subsequence
POJ 2533 Longest Ordered Subsequence
103 0
|
Java C语言
HDOJ/HDU 1029 Ignatius and the Princess IV(简单DP,排序)
HDOJ/HDU 1029 Ignatius and the Princess IV(简单DP,排序)
136 0
|
算法 Java
java之 ------------[LeetCode] House Robber 打家劫舍||
做完打家劫舍后我发现自己动态规划方面处理问题的能力,终于迎来了开篇,虽然打家劫舍是在我看网上的别的人做的,然后自己理解的,但是我知道我再遇到这类题不会再手足无措了,隔了两天再来挑战,我看看自己的动态规划能力是否有那么一点点,于是做了打家劫舍||,虽然我做了将近2个小时,但是庆幸的是自己依靠自己的能力做了出来,很感动,自己花了一晚上的时间做出来了,我都被自己感动的哭了,我算法如此垃圾,竟然能完全依靠自己的能力做出这个算法,真的很让我相信:天才是少数的,大多数人喜欢给自己的懒,找借口。
1550 0
|
Java
java之 ------------[LeetCode] House Robber 打家劫舍
刚开始做这一道题感觉卧槽,这不简单吗,直接去把数组下标和2取余的数相加再把剩下的数相加,比较这两个和谁大就输出谁,不就行了,但是啊,我操,事实证明,我还是太天真了,我操出现[2,1,1,2]这种情况,我当时还怀疑为什么那么简单后来一想,我操,这不是动态规划吗,于是乎,恶补一下怎么实现动态规划的,说白了,动态规划就是把大的数据拆成小的数据,如我想计算f(10),我就要计算出f(9)+1,然后我想计算出f(9)=f(8)+1,递推的方式直到f(1)=f(0)+1,就结束了。
1566 0
|
算法 iOS开发