思路:如果当前位置是正数那么就一直寻找到遇到第一个负数的前一个数,取这个区间的最大值。负数也是这样
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int t,n,m,x,tmp;
int sgn(int num){
if(num>0)return 1;
return -1;
}
void solve(){
long long res=0;
for(int i=0;i<n;){
int j=i;
tmp=a[i];
while(j<n&&sgn(tmp)==sgn(a[j])){
tmp=max(tmp,a[j]);
j++;
}
i=j;
res+=tmp;
}
printf("%lld\n",res);
}
void INPUT(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
solve();
}
}
int main(){
INPUT();
//solve();
return 0;
}