最大子段和,但是两段
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

注意本题数据量大,C++ 选手请关闭流同步:
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);

给定长度为 n 的整数数组 a,从中选择两个非空、连续、不重叠的子段。使这两个子段中元素之和最大。

用数学语言描述:

选择区间 [l_1, r_1][l_2, r_2],满足

  • 1 \le l_1 \le r_1 \le n
  • 1 \le l_2 \le r_2 \le n
  • r_1 < l_2r_2 < l_1

S_1 = \sum_{i=l_1}^{r_1} a_i,\quad S_2 = \sum_{i=l_2}^{r_2} a_i.

计算最大子段和 S_1+S_2

输入描述:

第一行只有一个整数 T,表示测试数据的组数。

接下来每组测试数据包含两行:

第一行一个整数 n 表示数组长度。

第二行 n 个用空格分开的整数 a_i,表示数组 a 的每个元素。

数据规模:
1 \le T \le 10,\quad 2 \le n \le 5\times 10^5, \quad \sum_{t=1}^T n_t \;\le\; 5\times 10^6,\quad |a_i|\le 10^9.

输出描述:

对每组测试数据,在一行中输出一个整数,表示两个不重叠连续子段元素之和最大值。
示例1

输入

复制
2
5
2 -1 3 -4 5
4
-1 -2 -3 -4

输出

复制
9
-3

说明

样例 1:在数组 a 上取区间 [1,3] 和子段 [5,5],总和为 4+5=9

样例 2:在数组 a 上取区间 [1,1] 和子段 [2,2],总和为 (-1)+(-2)=-3