P12569 [UOI 2023] An Array and Partial Sums
题目描述
对于一个长度为 $n$ 的整数数组 $a$,其**前缀和数组** $b$ 定义为长度为 $n$ 的数组,其中 $b_i = a_1 + a_2 + \ldots + a_i$。
对于一个长度为 $n$ 的整数数组 $a$,其**后缀和数组** $b$ 定义为长度为 $n$ 的数组,其中 $b_i = a_n + a_{n-1} + \ldots + a_i$。
我们定义整数数组 $a$ 的**标准化**操作为:对于 $1 \le i \le n$,执行赋值 $a_i \leftarrow \max(\min(a_i, 10^{18}), -10^{18})$。
给定一个长度为 $n$ 的整数数组 $a$。
允许执行以下三种类型的操作:
1. 将数组 $a$ 的每个元素取相反数(即对 $1 \le i \le n$ 执行赋值 $a_i \leftarrow (-a_i)$);
2. 选择数组 $a$ 的任意子段,并用其前缀和数组替换该子段,然后对数组 $a$ 进行**标准化**;
3. 选择数组 $a$ 的任意子段,并用其后缀和数组替换该子段,然后对数组 $a$ 进行**标准化**。
找到使数组 $a$ 的所有元素变为非负数的最短操作序列。
注意:对于某些测试用例组,允许输出的操作序列不一定是最短的。
输入格式
第一行包含两个整数 $n$ 和 $g$($1 \le n \le 2 \cdot 10^5$,$0 \le g \le 8$)——分别表示数组的长度和测试用例组编号。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($-1 \le a_i \le 1$)——数组的元素。
输出格式
第一行输出一个整数 $m$ —— 使数组 $a$ 的所有元素变为非负数所需的最小操作次数。
接下来的 $m$ 行,每行输出一个操作的描述:
- 对于类型 1 的操作,输出格式为 `1`;
- 对于类型 2 的操作,输出格式为 `2 l r`,其中 $l$ 和 $r$($1 \le l \le r \le n$)表示操作子段的左右边界;
- 对于类型 3 的操作,输出格式为 `3 l r`,其中 $l$ 和 $r$ 的定义同上。
如果存在多个正确答案,输出任意一个均可。
说明/提示
在第一个样例中,数组 $a$ 的变化如下:
1. 执行类型 3 的操作,参数为 $l=1$、$r=3$ 后,数组变为 $[1, 1, 1, -1, -1, -1, 1]$;
2. 执行类型 2 的操作,参数为 $l=1$、$r=7$ 后,数组变为 $[1, 2, 3, 2, 1, 0, 1]$。
### 评分标准
设某测试用例的最短操作次数为 $m_{ans}$,你的解使用的操作次数为 $m_{user}$。
- ($14$ 分):$m_{ans} \le 1$;
- ($17$ 分):若 $m_{user} \le 100$ 则视为正确。可以证明在给定约束下总存在不超过 $100$ 次操作的解;
- ($18$ 分):若 $m_{user} \le m_{ans} + 3$ 则视为正确;
- ($7$ 分):若 $m_{user} \le m_{ans} + 1$ 则视为正确;
- ($7$ 分):$n \le 3000$,且保证**所有**最短操作序列**仅包含**类型 2 的操作;
- ($19$ 分):保证**所有**最短操作序列**仅包含**类型 2 的操作;
- ($17$ 分):$n \le 3000$;
- ($1$ 分):无额外限制。
翻译由 DeepSeek V3 完成