#CF2043C. 子段和

子段和

C. 子段和 时间限制:1 秒 内存限制:256 MB

给定一个长度为 nn 的整数数组 aa,其中除了最多一个元素之外,其余所有元素都等于 1-111。剩下的那个元素 xx 满足 109x109-10^9 \le x \le 10^9

求出数组 aa 的所有可能的子段和(包括空子段,其和定义为 00)。换句话说,求出所有整数 xx,使得数组 aa 存在至少一个子段(可能为空)的和等于 xx。子段是数组的连续子区间。

将这些和按升序输出。每个和只输出一次,即使它由多个子段得到。

输入 第一行包含一个整数 tt1t1041 \le t \le 10^4)—— 测试用例的数量。接下来是 tt 个测试用例。

每个测试用例包含两行:

  • 第一行包含一个整数 nn1n21051 \le n \le 2 \cdot 10^5)—— 数组的长度。
  • 第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n109ai109-10^9 \le a_i \le 10^9)—— 数组 aa 的元素。在数组 aa 中,最多有一个元素既不是 11 也不是 1-1

输入附加约束:所有测试用例的 nn 之和不超过 21052 \cdot 10^5

输出

对于每个测试用例,输出两行:

  • 第一行输出一个整数 —— 不同子段和的数量。
  • 第二行按升序输出这些和,每个和只输出一次。

示例

输入:

5
5
1 -1 10 1 1
5
-1 -1 -1 -1 -1
2
-1 2
2
7 1
3
1 4 -1

输出:

8
-1 0 1 2 9 10 11 12 
6
-5 -4 -3 -2 -1 0 
4
-1 0 1 2 
4
0 1 7 8 
6
-1 0 1 3 4 5 

说明 定义 a[i,j]a[i,j] 为从位置 iijj 的子段。

考虑第一个测试用例:

  • 1-1a[2,2]a[2,2] 得到;
  • 00 由空子段得到;
  • 11a[4,4]a[4,4] 得到;
  • 22a[4,5]a[4,5] 得到;
  • 99a[2,3]a[2,3] 得到;
  • 1010a[1,3]a[1,3] 得到;
  • 1111a[3,4]a[3,4] 得到;
  • 1212a[3,5]a[3,5] 得到。