#AT2362. F - Erase Subarrays

F - Erase Subarrays

当前没有测试数据。

F - 删除子数组

分数:500分

问题描述

给定一个整数数组 $A=(a_1,a_2,\ldots,a_N)$。
你可以执行以下操作任意次数(可能为零)。

  • 选择数组 $A$ 中的一个非空连续子数组,并将其从数组中删除。

对于每个 $x=1,2,\ldots,M$,解决以下问题:

  • 找到使数组 $A$ 元素和等于 $x$ 的最小操作次数。如果无法使数组 $A$ 的元素和等于 $x$,则输出 -1

注意,空数组的元素和为 $0$。

约束

  • $1 \leq N,M \leq 3000$
  • $1 \leq a_i \leq 3000$
  • 输入中的所有值都是整数。

输入

从标准输入中按以下格式给出:

NN MM

a1a_1 \ldots aNa_N

输出

输出 $M$ 行。第 $i$ 行应包含 $x=i$ 时的答案。


4 5
1 2 3 4
1
2
1
1
1

以下是实现目标的最小操作次数的示例。

  • 对于 $x=1$,删除 $a_2,a_3,a_4$,数组 $A$ 的元素和变为 $x$。
  • 对于 $x=2$,删除 $a_3,a_4$,然后删除 $a_1$,数组 $A$ 的元素和变为 $x$。
  • 对于 $x=3$,删除 $a_3,a_4$,数组 $A$ 的元素和变为 $x$。
  • 对于 $x=4$,删除 $a_1,a_2,a_3$,数组 $A$ 的元素和变为 $x$。
  • 对于 $x=5$,删除 $a_2,a_3$,数组 $A$ 的元素和变为 $x$。

1 5
3
-1
-1
0
-1
-1

12 20
2 5 6 5 2 1 7 9 7 2 5 5
2
1
2
2
1
2
1
2
2
1
2
1
1
1
2
2
1
1
1
1