#CF2043C. 子段和
子段和
C. 子段和 时间限制:1 秒 内存限制:256 MB
给定一个长度为 的整数数组 ,其中除了最多一个元素之外,其余所有元素都等于 或 。剩下的那个元素 满足 。
求出数组 的所有可能的子段和(包括空子段,其和定义为 )。换句话说,求出所有整数 ,使得数组 存在至少一个子段(可能为空)的和等于 。子段是数组的连续子区间。
将这些和按升序输出。每个和只输出一次,即使它由多个子段得到。
输入 第一行包含一个整数 ()—— 测试用例的数量。接下来是 个测试用例。
每个测试用例包含两行:
- 第一行包含一个整数 ()—— 数组的长度。
- 第二行包含 个整数 ()—— 数组 的元素。在数组 中,最多有一个元素既不是 也不是 。
输入附加约束:所有测试用例的 之和不超过 。
输出
对于每个测试用例,输出两行:
- 第一行输出一个整数 —— 不同子段和的数量。
- 第二行按升序输出这些和,每个和只输出一次。
示例
输入:
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
说明 定义 为从位置 到 的子段。
考虑第一个测试用例:
- 由 得到;
- 由空子段得到;
- 由 得到;
- 由 得到;
- 由 得到;
- 由 得到;
- 由 得到;
- 由 得到。