题目描述
题目译自 Ukrainian Olympiads in Informatics 2023 Stage 4 Day1 T4. Масив і часткові суми
对于一个长度为 n 的整数数组 a,其前缀和数组是一个长度为 n 的数组 b,其中 bi=a1+a2+…+ai。
对于一个长度为 n 的整数数组 a,其后缀和数组是一个长度为 n 的数组 b,其中 bi=an+an−1+…+ai。
我们定义数组 a 的归一化操作为对每个 1≤i≤n,执行赋值 ai←max(min(ai,1018),−1018)。
给定一个长度为 n 的整数数组 a。
你可以执行以下三种类型的操作:
- 将数组 a 的每个元素替换为其相反数(即对 1≤i≤n 执行赋值 ai←(−ai));
- 选择数组 a 的任意子区间,将其替换为该子区间的前缀和数组,然后对数组 a 进行归一化;
- 选择数组 a 的任意子区间,将其替换为该子区间的后缀和数组,然后对数组 a 进行归一化。
找出使数组 a 的所有元素变为非负所需的最短操作序列。
注意,在某些测试块中,允许找到非最短的操作序列。
输入格式
输入的第一行包含两个整数 n 和 g (1≤n≤2⋅105,0≤g≤8),分别表示数组的长度和子任务编号。
第二行包含 n 个整数 a1,a2,…,an (−1≤ai≤1),表示数组的元素。
输出格式
输出第一行包含一个整数 m,表示使数组 a 的所有元素变为非负所需的最小操作次数。
接下来的 m 行,输出操作的描述。第一类操作的描述格式为 1。第二类和第三类操作的描述格式分别为 2 l 和 3 l r,其中 l 和 r (1≤l≤r≤n) 表示当前操作子区间的左边界和右边界。
如果存在多个正确答案,可以输出任意一个。
7 0
0 0 1 -1 -1 -1 1
2
3 1 3
2 1 7
在第一个样例中,数组 a 经历了两次变化:
- 执行第三类操作,参数为 l=1,r=3,数组 a 变为 [1,1,1,−1,−1,−1,1];
- 执行第二类操作,参数为 l=1,r=7,数组 a 变为 [1,2,3,2,1,0,1]。
数据范围与提示
设对于某个测试点,所需的最小操作次数为 mans,而你的解决方案使用的操作次数为 muser。
详细子任务附加限制及分值如下表所示:
| 子任务 |
分值 |
附加限制 |
| 1 |
14 |
mans≤1 |
| 2 |
17 |
解决方案视为正确,如果 muser≤100。可以证明,在给定约束下总是存在不超过 100 次操作的序列 |
| 3 |
18 |
解决方案视为正确,如果 muser≤mans+3 |
| 4 |
7 |
解决方案视为正确,如果 muser≤mans+1 |
| 5 |
7 |
n≤3000;保证所有最短操作序列仅包含第二类操作 |
| 6 |
19 |
保证所有最短操作序列仅包含第二类操作 |
| 7 |
17 |
n≤3000 |
| 8 |
1 |
无附加限制 |