思路:找一段跌的最厉害的,然后设 k 为跌之前的值。如果有几段相同,则找跌之前 Rating 最大的来算。
找样例规律找的,没有证明。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define for1(i, s, t) for (int i(s); i<=t; ++i)
#define for2(i, t, s) for (int i(t); i>=s; --i)
#define for3(i, vec) for (auto i: vec)
#define INF 0x3f3f3f3f
#define opb pop_back
#define pb push_back
#define pf push_front
#define opf pop_front
#define fi first
#define se second
#define gc() getchar()
#define pc(x) putchar(x);
#define sp pc(' ');
#define el pc('\n');
#define pr(x) printf(x);
#define Yes pr("YES");
#define No pr("NO");
#define err assert(0);
const int MAXN(3e5+1);
//const ll MOD(1e9+7);
ll re(){
ll x(0), f(1);
char ch;
while ((ch = gc()) < 48) f = ch == '-' ? -1 : 1;
do{
x = (x << 1) + (x << 3) + (ch ^ 48);
}while ((ch = gc()) > 47);
return x * f;
}
void uwr(ll x){
ll tmp(x/10);
if (tmp) uwr(tmp);
pc(x-(tmp<<1)-(tmp<<3)^48);
}
void wr(ll x){
if (x < 0){
pc('-');
x = -x;
}
uwr(x);
}
int n, flag, ind;
deque<pair<ll, int>> dq;
ll sum, minn, ans;
ll a[MAXN];
void solve(){
n = re();
dq.clear();
a[1] = re();
flag = abs(a[1]) == a[1];
sum = a[1];
for1(i, 2, n){
a[i] = re();
if ((abs(a[i]) == a[i]) != flag){
dq.push_back({sum, i-1});
sum = 0;
flag = (abs(a[i]) == a[i]);
}else{
sum += a[i];
}
}
dq.push_back({sum, n});
sum = minn = ans = ind = 0;
for1(i, 0, dq.size()-1){
// cout << sum << ' ';
if (dq[i].first < minn || (dq[i].first == minn && sum > ans)){
minn = dq[i].first;
ans = sum;
ind = dq[i].second;
}
sum += dq[i].first;
}
cout << ans;
}
int main(){
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
int t(1);
t = re();
while (t--){
solve();
el
}
return 0;
}