CF1114B Yet Another Array Partitioning Task

题目描述

如果一个数组 $b$ 是数组 $a$ 的一个子数组,那么它一定是 $a$ 的一个连续子序列,即存在某些 $l, r$ 使得 $b = a_l, a_{l+1}, \ldots, a_r$。 假设 $m$ 是一个已知常数。对于任意长度不少于 $m$ 的数组,我们定义它的“美丽值”为该数组中最大的 $m$ 个元素之和。例如: - 对于数组 $x = [4, 3, 1, 5, 2]$ 且 $m = 3$,最大的 $3$ 个元素为 $5, 4, 3$,所以 $x$ 的美丽值为 $5 + 4 + 3 = 12$。 - 对于数组 $x = [10, 10, 10]$ 且 $m = 2$,美丽值为 $10 + 10 = 20$。 现在给定一个数组 $a_1, a_2, \ldots, a_n$,已知常数 $m$ 和整数 $k$。你需要将数组 $a$ 划分为恰好 $k$ 个子数组,要求: - 每个元素都属于且只属于一个子数组。 - 每个子数组的长度不少于 $m$。 - $k$ 个子数组的美丽值之和最大。

输入格式

第一行包含三个整数 $n, m, k$($2 \le n \le 2 \cdot 10^5$,$1 \le m$,$2 \le k$,$m \cdot k \le n$)——表示数组 $a$ 的长度、美丽值定义中的常数 $m$ 以及要划分的子数组个数。 第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($-10^9 \le a_i \le 10^9$)。

输出格式

第一行输出在最优划分下,所有子数组美丽值之和的最大值。 第二行输出 $k-1$ 个整数 $p_1, p_2, \ldots, p_{k-1}$($1 \le p_1 < p_2 < \ldots < p_{k-1} < n$),表示数组的划分方式: - 下标 $1$ 到 $p_1$ 的元素属于第一个子数组。 - 下标 $p_1+1$ 到 $p_2$ 的元素属于第二个子数组。 - $\ldots$ - 下标 $p_{k-1}+1$ 到 $n$ 的元素属于第 $k$ 个子数组。 如果有多种最优划分方案,输出任意一种即可。

说明/提示

在第一个样例中,一种最优划分为 $[5, 2, 5]$,$[2, 4]$,$[1, 1, 3, 2]$。 - 子数组 $[5, 2, 5]$ 的美丽值为 $5 + 5 = 10$。 - 子数组 $[2, 4]$ 的美丽值为 $2 + 4 = 6$。 - 子数组 $[1, 1, 3, 2]$ 的美丽值为 $3 + 2 = 5$。 它们的美丽值之和为 $10 + 6 + 5 = 21$。 在第二个样例中,一种最优划分为 $[4]$,$[1, 3]$,$[2, 2]$,$[3]$。 由 ChatGPT 4.1 翻译