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;
}


相关文章
|
6月前
|
人工智能
HDU-1159-Common Subsequence
HDU-1159-Common Subsequence
33 0
P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组(poj3261)
P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组(poj3261)
96 0
|
索引
LeetCode 392. Is Subsequence
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
102 0
LeetCode 392. Is Subsequence
AtCoder Beginner Contest 225 F.String Cards(dp)
AtCoder Beginner Contest 225 F.String Cards(dp)
90 0
AtCoder Beginner Contest 214 F - Substrings(subsequence DP)
AtCoder Beginner Contest 214 F - Substrings(subsequence DP)
96 0
|
人工智能 JavaScript BI
AtCoder Beginner Contest 222 D - Between Two Arrays(前缀和优化dp)
AtCoder Beginner Contest 222 D - Between Two Arrays(前缀和优化dp)
105 0
hdu-1098 Ignatius's puzzle(费马小定理)
hdu-1098 Ignatius's puzzle(费马小定理)
154 0
hdu-1098 Ignatius's puzzle(费马小定理)
|
人工智能
POJ 2533 Longest Ordered Subsequence
POJ 2533 Longest Ordered Subsequence
107 0
|
算法 Java
java之 ------------[LeetCode] House Robber 打家劫舍||
做完打家劫舍后我发现自己动态规划方面处理问题的能力,终于迎来了开篇,虽然打家劫舍是在我看网上的别的人做的,然后自己理解的,但是我知道我再遇到这类题不会再手足无措了,隔了两天再来挑战,我看看自己的动态规划能力是否有那么一点点,于是做了打家劫舍||,虽然我做了将近2个小时,但是庆幸的是自己依靠自己的能力做了出来,很感动,自己花了一晚上的时间做出来了,我都被自己感动的哭了,我算法如此垃圾,竟然能完全依靠自己的能力做出这个算法,真的很让我相信:天才是少数的,大多数人喜欢给自己的懒,找借口。
1556 0
|
机器学习/深度学习