Олимпиадный тренинг

Задача . B. Тренировка Поликарпа


Поликарп тренирует свое умение решать задачи. У него есть список из \(n\) задач со сложностями \(a_1, a_2, \dots, a_n\) соответственно. Его план состоит в том, чтобы тренироваться ровно \(k\) дней. Каждый день он должен решать хотя бы одну задачу из своего списка. Поликарп решает задачи в том порядке, в котором они заданы в списке, и он не может пропустить какую-либо задачу из списка. Он должен решить ровно \(n\) задач ровно за \(k\) дней.

Таким образом, каждый день Поликарп решает последовательность подряд идущих (последовательных) задач с самого начала списка. Он не может пропускать задачи или решать их несколько раз. В итоге за \(k\) дней он решит \(n\) задач.

Полезность \(j\)-го дня тренировки Поликарпа равна максимальной сложности задачи среди всех задач, которые Поликарп решит в течение \(j\)-го дня (то есть если он решит задачи с номерами от \(l\) до \(r\) в течение какого-то дня, тогда полезность этого дня равна \(\max\limits_{l \le i \le r}a_i\)). Общая полезность его тренировки — это сумма полезностей по всем \(k\) дням его тренировки.

Вы хотите помочь Поликарпу получить максимально возможную общую полезность среди всех доступных способов решить задачи. Ваша задача — распределить \(n\) задач по \(k\) дням таким образом, что это распределение удовлетворяет ограничениям, описанным выше, и общая полезность является максимально возможной.

Например, если \(n = 8, k = 3\) и \(a = [5, 4, 2, 6, 5, 1, 9, 2]\), одним из возможных способов с максимальной общей полезностью является следующий: \([5, 4, 2], [6, 5], [1, 9, 2]\). Здесь общая полезность равна \(5 + 6 + 9 = 20\).

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2000\)) — количество задач и количество дней соответственно.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 2000\)) — сложности задач в списке Поликарпа, в порядке их следования в списке (то есть в порядке, в котором Поликарп будет их решать).

Выходные данные

В первой строке выведите максимально возможную общую полезность.

Во второй строке выведите \(k\) натуральных чисел \(t_1, t_2, \dots, t_k\) (\(t_1 + t_2 + \dots + t_k\) должно равняться \(n\)), где \(t_j\) равно количеству задач, которое Поликарп решит в \(j\)-й день, чтобы достигнуть максимальной общей полезности его тренировки.

Если существует несколько возможных решений, выведите любое из них.

Примечание

Первый тестовый пример описан в условии задачи.

Во втором тестовом примере только один способ распределить задачи из списка и только одна возможная общая полезность.

В третьем тестовом примере лучшим ответом является распределить задачи следующим образом: \([1, 2000], [2000, 2]\). Тогда суммарная полезность будет равна \(2000 + 2000 = 4000\).


Примеры
Входные данныеВыходные данные
1 8 3
5 4 2 6 5 1 9 2
20
3 2 3
2 5 1
1 1 1 1 1
1
5
3 4 2
1 2000 2000 2
4000
2 2

time 2000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя