#P12569. [UOI 2023] An Array and Partial Sums

    ID: 14136 远端评测题 2000ms 256MiB 尝试: 0 已通过: 0 显示难度NOI/NOI+/CTS 上传者: 标签>2023Special JudgeUOI(乌克兰)

[UOI 2023] An Array and Partial Sums

题目描述

对于一个长度为 nn 的整数数组 aa,其前缀和数组 bb 定义为长度为 nn 的数组,其中 bi=a1+a2+…+aib_i = a_1 + a_2 + \ldots + a_i。

对于一个长度为 nn 的整数数组 aa,其后缀和数组 bb 定义为长度为 nn 的数组,其中 bi=an+an−1+…+aib_i = a_n + a_{n-1} + \ldots + a_i。

我们定义整数数组 aa 的标准化操作为:对于 1≤i≤n1 \le i \le n,执行赋值 ai←max⁡(min⁡(ai,1018),−1018)a_i \leftarrow \max(\min(a_i, 10^{18}), -10^{18})。

给定一个长度为 nn 的整数数组 aa。

允许执行以下三种类型的操作:

  1. 将数组 aa 的每个元素取相反数(即对 1≤i≤n1 \le i \le n 执行赋值 ai←(−ai)a_i \leftarrow (-a_i));
  2. 选择数组 aa 的任意子段,并用其前缀和数组替换该子段,然后对数组 aa 进行标准化;
  3. 选择数组 aa 的任意子段,并用其后缀和数组替换该子段,然后对数组 aa 进行标准化。

找到使数组 aa 的所有元素变为非负数的最短操作序列。

注意:对于某些测试用例组,允许输出的操作序列不一定是最短的。

输入格式

第一行包含两个整数 nn 和 gg(1≤n≤2⋅1051 \le n \le 2 \cdot 10^5,0≤g≤80 \le g \le 8)——分别表示数组的长度和测试用例组编号。

第二行包含 nn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_n(−1≤ai≤1-1 \le a_i \le 1)——数组的元素。

输出格式

第一行输出一个整数 mm —— 使数组 aa 的所有元素变为非负数所需的最小操作次数。

接下来的 mm 行,每行输出一个操作的描述:

  • 对于类型 1 的操作,输出格式为 1;
  • 对于类型 2 的操作,输出格式为 2 l r,其中 ll 和 rr(1≤l≤r≤n1 \le l \le r \le n)表示操作子段的左右边界;
  • 对于类型 3 的操作,输出格式为 3 l r,其中 ll 和 rr 的定义同上。

如果存在多个正确答案,输出任意一个均可。

7 0
0 0 1 -1 -1 -1 1
2
3 1 3
2 1 7

提示

在第一个样例中,数组 aa 的变化如下:

  1. 执行类型 3 的操作,参数为 l=1l=1、r=3r=3 后,数组变为 [1,1,1,−1,−1,−1,1][1, 1, 1, -1, -1, -1, 1];
  2. 执行类型 2 的操作,参数为 l=1l=1、r=7r=7 后,数组变为 [1,2,3,2,1,0,1][1, 2, 3, 2, 1, 0, 1]。

评分标准

设某测试用例的最短操作次数为 mansm_{ans},你的解使用的操作次数为 muserm_{user}。

  • (1414 分):mans≤1m_{ans} \le 1;
  • (1717 分):若 muser≤100m_{user} \le 100 则视为正确。可以证明在给定约束下总存在不超过 100100 次操作的解;
  • (1818 分):若 muser≤mans+3m_{user} \le m_{ans} + 3 则视为正确;
  • (77 分):若 muser≤mans+1m_{user} \le m_{ans} + 1 则视为正确;
  • (77 分):n≤3000n \le 3000,且保证所有最短操作序列仅包含类型 2 的操作;
  • (1919 分):保证所有最短操作序列仅包含类型 2 的操作;
  • (1717 分):n≤3000n \le 3000;
  • (11 分):无额外限制。

翻译由 DeepSeek V3 完成