Динамическое программирование, СПбГУ 2024, тренировка 1
A. 1-стабильная последовательность по номеру
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

Последовательность целых положительных чисел назовём $$$1$$$-стабильной, если любые два соседних элемента в ней отличаются не более чем на $$$1$$$.

Про две последовательности одинаковой длины говорят, что первая лексикографически меньше второй, если первые $$$k$$$ чисел в них совпадают, а $$$(k + 1)$$$-е число в первой последовательности меньше, чем соответствующее число во второй.

Список последовательностей называется лексикографически упорядоченным, если в нём каждая последовательность лексикографически меньше, чем следующая.

Ясно, что из всех $$$n$$$-элементных $$$1$$$-стабильных последовательностей можно единственным образом построить лексикографически упорядоченный список. Например, для $$$n = 3$$$ этот список начинается так: $$$$$$(1, 1, 1),\; (1, 1, 2),\; (1, 2, 1),\; (1, 2, 2),\; (1, 2, 3),\; (2, 1, 1),\; (2, 1, 2),\; \ldots$$$$$$

Лексикографическим номером $$$n$$$-элементной $$$1$$$-стабильной последовательности называется её номер в лексикографически упорядоченном списке всех $$$n$$$-элементных $$$1$$$-стабильных последовательностей. Последовательности нумеруются начиная с $$$0$$$. Для любого $$$n$$$ лексикографически упорядоченный список таких последовательностей, очевидно, бесконечен. Поэтому для любого номера существует $$$1$$$-стабильная последовательность с таким лексикографическим номером.

Вам требуется написать программу, которая будет находить $$$n$$$-элементную $$$1$$$-стабильную последовательность по её лексикографическому номеру $$$x$$$.

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

В первой строке заданы два числа: $$$n$$$ и $$$x$$$ ($$$1 \leq n \leq 40$$$, $$$0 \leq x \leq 10^{18}$$$).

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

Вам необходимо выдать саму последовательность — $$$n$$$ целых положительных чисел.

Примеры
Входные данные
1 10
Выходные данные
11 
Входные данные
2 10
Выходные данные
4 5 
B. Соберём портфель вместе
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

В компании [REDACTED] думают запустить несколько проектов.

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

Команда аналитиков предоставила ожидаемые затраты и выручку для каждого способа запуска.

Система устроена так, что затраты тратятся из фиксированного бюджета, который руководство утвердило заранее. При этом любая полученная выручка не увеличивает бюджет для старта ещё не запущенных проектов.

Руководство интересуется только максимальной суммарной выручкой. То есть их не интересуют суммарные затраты, кроме того, что они вписываются в рамки заданного бюджета.

Вас, как высококвалифицированного специалиста, просят найти максимальную суммарную выручку.

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

Первая строка содержит два целых числа $$$n$$$ и $$$b$$$ — количество проектов и выделенный бюджет ($$$1 \le n \le 20$$$, $$$0 \le b \le 10^9$$$).

Далее записаны $$$n$$$ проектов, каждый с новой строки. Описание $$$i$$$-го проекта начинается со строки, содержащей целое число $$$k_i$$$ — количество возможных запусков ($$$1 \le k_i \le 20$$$). Далее в $$$k_i$$$ строках записаны два целых числа $$$r_{ij}$$$ и $$$e_{ij}$$$ — выручка и затраты соответственно в случае запуска $$$i$$$-го проекта $$$j$$$-м способом ($$$0 \le r_{ij}, e_{ij} \le 10^9$$$).

Суммарное количество всех способов запуска для всех проектов не превосходит $$$20$$$ ($$$\sum k_i \le 20$$$).

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

Выведите одно целое число $$$r$$$ — максимальную суммарную выручку.

Примеры
Входные данные
2 10
2
100 10
80 9
1
10 1
Выходные данные
100
Входные данные
2 5
2
200 3
100 2
2
10 2
20 3
Выходные данные
210
C. Разноцветное дерево
ограничение по времени на тест
1.5 секунд
ограничение по памяти на тест
512 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

Разноцветным взвешенным деревом называется дерево, у которого у каждой вершины $$$i$$$ есть вес $$$w_i$$$ и цвет $$$c_i$$$. «Хорошим» множеством разноцветного взвешенного дерева является любое подмножество вершин дерева, которое удовлетворяет следующим условиям:

  • никакие две вершины в подмножестве не соединены ребром,
  • все вершины в подмножестве разного цвета.

Определим вес «хорошего» множества как суммарный вес вершин в этом множестве (пустое множество имеет вес $$$0$$$).

Дано разноцветное взвешенное дерево, необходимо найти максимальный вес «хорошего» множества в нём.

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

Первая строка содержит два целых числа $$$n$$$ ($$$1 \le n \le 1000$$$) и $$$C$$$ ($$$1 \le C \le 10$$$) — количество вершин в дереве и количество различных цветов, соответственно.

Вторая и третья строки содержат по $$$n$$$ целых чисел $$$w_1, w_2, \ldots, w_n$$$ ($$$1 \le w_i \le 10^{9}$$$) и $$$c_1, c_2, \ldots, c_n$$$ ($$$1 \le c_i \le C$$$) — веса вершин и их цвет, соответственно.

Следующие $$$n - 1$$$ строк описывают рёбра дерева. В $$$j$$$-й из этих строк содержится два целых числа $$$u_j$$$ и $$$v_j$$$ ($$$1 \le u_j, v_j \le n$$$, $$$u_j \neq v_j$$$) — номера вершин, соединённых $$$j$$$-м ребром. Гарантируется, что заданный граф является деревом.

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

Выведите одно число — наибольший возможный вес «хорошего» множества в данном дереве.

Примеры
Входные данные
4 4
1 1 1 1
1 2 3 4
1 2
1 3
1 4
Выходные данные
3
Входные данные
5 3
5 1 2 3 1
1 2 2 3 1
1 2
1 3
2 4
2 5
Выходные данные
8
D. Да Хун Пао
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

Женя совсем не любит работать, однако ему очень нравится чай Да Хун Пао, который известен своим релаксирующим эффектом. На очередной чайной сессии с Да Хун Пао Евгений задался вопросом, как он может максимизировать своё суммарное расслабление.

На сессии ему предлагается $$$n$$$ чашек с любимым чаем различных сортов, каждая из которых имеет свой коэффициент расслабления $$$a_i$$$. Чашки с чаем стоят в ряд, без пропусков, на одинаковом расстоянии друг от друга. Чтобы не нарушать эстетику, которой Женя очень дорожит, он действует так: пока на столе ещё остались чашки, выбирает либо самую левую, либо самую правую чашку, и выпивает весь чай из неё. После этого сервировщик убирает чашку со стола.

От первой выпитой в течение сессии чашки Женя расслабляется на $$$x_1$$$ единиц, где $$$x_1$$$ — это коэффициент расслабления для первой выпитой чашки чая. От следующей — на $$$2 x_2$$$ единиц, где $$$x_2$$$ — это коэффициент расслабления для второй выпитой чашки чая. И так далее: от чашки, выпитой под номером $$$i$$$, Евгений расслабляется на $$$i x_i$$$ единиц.

Помогите Жене узнать, какое максимальное суммарное количество единиц расслабления он сможет получить за сессию с Да Хун Пао.

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

В первой строке задано целое число $$$n$$$ ($$$1 \le n \le 5000$$$).

В следующей строке записано $$$n$$$ целых чисел $$$a_1, a_2, \ldots, a_n$$$ ($$$1 \le a_i \le 1000$$$) — коэффициенты расслабления всех предоставленных Жене чашек Да Хун Пао.

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

Выведите одно целое число: максимальную суммарную величину расслабления, которой Женя может достичь в течение сессии Да Хун Пао.

Примеры
Входные данные
4
1 2 3 4
Выходные данные
30
Входные данные
4
1 2 1 1
Выходные данные
14
E. Дождь
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

В волшебном королевстве Эквилибрия после могущественного заклинания случилась непредвиденная буря, которая затопила земли между Великой библиотекой Эквилибрии и торговым кварталом. Ваш герой, юный маг, должен пройти от библиотеки к рынку, чтобы доставить важные свитки с заклинаниями. Затопленные поля королевства представляют собой сетку размером $$$n \times m$$$, и каждая ячейка сетки содержит воду определённой глубины. Маг может перемещаться только вправо, влево и вниз по сетке ($$$(\mathit{row}, \mathit{col} + 1)$$$, $$$(\mathit{row}, \mathit{col} - 1)$$$ и $$$(\mathit{row} + 1, \mathit{col})$$$), начиная своё путешествие из верхнего левого угла ($$$(1, 1)$$$, библиотека) и заканчивая в нижнем правом ($$$(n, m)$$$, рынок). Ваша задача — найти путь, при проходе по которому максимальная глубина воды будет минимальной, чтобы ваш герой оставался как можно более сухим.

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

В первой строке даны два целых числа $$$n$$$ и $$$m$$$ ($$$2 \le n, m \le 500$$$) — размеры Эквилибрии. В следующих $$$n$$$ строках даны по $$$m$$$ целых чисел $$$d_{i, j}$$$ ($$$0 \le d_{i, j} \le 10^9$$$, $$$d_{1, 1} = d_{n, m} = 0$$$), обозначающих глубину воды в каждой ячейке.

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

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

Примеры
Входные данные
3 3
0 1 9
9 1 9
9 1 0
Выходные данные
1
Входные данные
5 3
0 1 1
9 9 2
1 1 1
2 9 9
1 1 0
Выходные данные
2
F. Большое замощение доминошками
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

Доминошка на клетчатой плоскости — это фигура из двух клеток, имеющих общую сторону. Замощение доминошками прямоугольника из $$$m \times n$$$ клеток — это такой набор доминошек, целиком лежащих внутри прямоугольника, что каждая клетка прямоугольника покрыта ровно одной из них. Два замощения $$$P$$$ и $$$Q$$$ считаются различными, если существуют доминошки $$$p \in P$$$ и $$$q \in Q$$$, у которых ровно одна общая клетка.

Сколько существует способов замостить прямоугольник $$$m \times n$$$ доминошками? Так как количество способов может быть очень большим, нужно вывести ответ по модулю $$$10^9 + 7$$$.

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

Первая строка ввода содержит два целых числа $$$m$$$ и $$$n$$$ — высота и ширина прямоугольника, соответственно ($$$1 \le m \le 6$$$, $$$1 \le n \le 10^{18}$$$).

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

Выведите одно число — количество способов замостить прямоугольник $$$m \times n$$$ доминошками по модулю $$$10^9 + 7$$$.

Примеры
Входные данные
3 4
Выходные данные
11
Входные данные
3 1
Выходные данные
0
G. Окорочок на диете
ограничение по времени на тест
3 секунды
ограничение по памяти на тест
256 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

Окорочок худеет, и потому вплоть до осени его диета будет состоять только из брокколи, риса и куриной грудки. Окорочок может кушать любое количество брокколи, но на рис и куриную грудку есть ограничения.

До осени у Окорочка будет ровно $$$n$$$ походов в магазин, и для каждого похода известно $$$a_i$$$ — количество сухого риса в граммах — и $$$b_i$$$ — количество сырой куриной грудки в граммах, которые он собирается купить. Также известно, что один приём пищи Окорочка будет состоять из $$$k$$$ граммов риса и грудки в сумме. Но Окорочок решил не смешивать рис и грудку из разных походов в магазин, а потому приём пищи всегда будет иметь один из следующих типов:

  • $$$x$$$ граммов риса и $$$y$$$ граммов грудки, которые были куплены в один и тот же поход в магазин, причём $$$x + y = k$$$;
  • $$$x_1, x_2, \ldots, x_r$$$ граммов риса ($$$x_1 + x_2 + \ldots + x_r = k$$$), где $$$x_i$$$ — часть от всего риса, купленного в какой-то из походов в магазин;
  • $$$y_1, y_2, \ldots, y_r$$$ граммов грудки ($$$y_1 + y_2 + \ldots + y_r = k$$$), где $$$y_i$$$ — часть от всей грудки, купленной в какой-то из походов в магазин.
Все числа $$$x$$$, $$$y$$$, $$$x_i$$$ и $$$y_i$$$ целые.

Например, если у Окорочка будет два похода в магазин, в первый поход он купит 200 граммов риса и 500 граммов куриной грудки, а во второй — 100 граммов риса и 200 граммов куриной грудки, то он сможет приготовить только 2 приёма пищи с $$$k = 400$$$ — например, так:

  • первый приём пищи: 100 граммов риса и 300 граммов куриной грудки с первого похода;
  • второй приём пищи: 200 оставшихся граммов куриной грудки с первого похода и 200 граммов куриной грудки со второго похода.

Помогите Окорочку определить максимальное количество приёмов пищи, которые он сможет приготовить для себя до осени!

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

В первой строке заданы два целых числа $$$n$$$ и $$$k$$$ ($$$1 \leq n, k \leq 500$$$) — количество походов в магазин и суммарный вес еды в граммах для одного приёма пищи, соответственно.

В $$$i$$$-й из следующих $$$n$$$ строк заданы два целых числа $$$a_i$$$ и $$$b_i$$$ ($$$0 \leq a_i, b_i \leq 10^9$$$) — количество граммов риса и куриной грудки, купленной в $$$i$$$-й поход в магазин, соответственно.

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

Выведите единственное число — максимальное количество приёмов пищи, которые Окорочок сможет приготовить.

Примеры
Входные данные
2 400
200 500
100 200
Выходные данные
2
Входные данные
1 350
100 250
Выходные данные
1
Входные данные
2 500
100 200
300 100
Выходные данные
0
Примечание

Первый пример описан выше.

Во втором примере: Окорочок может приготовить ровно один приём пищи, используя все продукты с первого (и единственного) похода в магазин.

В третьем примере: Окорочок не сможет приготовить ни одного приёма пищи, потому что в обоих походах в магазин суммарный вес риса и куриной грудки меньше, чем нужно для одного приёма пищи. Кроме того, суммарный вес риса за два похода меньше, чем нужно для одного приёма пищи. Аналогичное утверждение верно и для куриной грудки.

H. Опять эти кучи камней!
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

Петя и Вася играют в игру. У них есть три кучки камней размера $$$n_1$$$, $$$n_2$$$, и $$$n_3$$$ соответственно. За ход разрешается взять из одной любой кучки ровно $$$a_1$$$, $$$a_2$$$, $$$\ldots$$$, $$$a_{k - 1}$$$ или $$$a_k$$$ камней. Петя и Вася по очереди берут камни, начинает Петя. Проигрывает тот, кто не может сделать свой ход. Определите имя того, кто победит.

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

В первой строке даны целые числа $$$n_1$$$, $$$n_2$$$, $$$n_3$$$ ($$$0 \leq n_1, n_2, n_3 \leq 100$$$).

Во второй строке дано целое число $$$k$$$ ($$$1 \leq k \leq \max(n_1, n_2, n_3)$$$).

В третьей строке даны $$$k$$$ целых чисел в порядке строгого возрастания: $$$a_1, a_2, \ldots, a_k$$$ ($$$1 \leq a_i \leq \max(n_1, n_2, n_3)$$$).

Гарантируется, что существует хотя бы один ход, и любое $$$a_i$$$ можно взять первым ходом.

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

Выведите имя того, кто победит: Peter или Vasya.

Примеры
Входные данные
1 1 1
1
1
Выходные данные
Peter
Входные данные
10 10 10
2
2 3
Выходные данные
Vasya
I. Путь и k вершин
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мебибайт
ввод
стандартный ввод
вывод
стандартный вывод

Дан ориентированный граф, являющийся корневым деревом. Дуги графа направлены от сыновей к отцам, и из каждой вершины можно по дугам прийти в корень. В вершинах графа написаны целые числа. Гарантируется, что все числа различные.

Рассмотрим все пути из листьев в корень; здесь листом считается вершина, у которой нет сыновей. Для каждого пути посчитаем сумму $$$k$$$ максимальных чисел, встречающихся в его вершинах — или всех этих чисел, если в пути меньше $$$k$$$ вершин. Найдите максимальную такую сумму.

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

В первой строке записаны через пробел два целых числа $$$n$$$ и $$$k$$$ — количество вершин в графе и ограничение на количество взятых вершин на пути ($$$1 \leq n \leq 300\,000$$$, $$$1 \leq k \leq 300\,000$$$). В следующих $$$n$$$ строках задан граф. В $$$i$$$-й из этих строк записаны через пробел два целых числа $$$p_i$$$ и $$$q_i$$$; здесь $$$p_i$$$ — номер вершины-предка $$$i$$$-й вершины, а $$$q_i$$$ — число, записанное в этой вершине ($$$0 \leq q_i \leq 10^9$$$). Для корня дерева $$$p_i = 0$$$; для всех остальных вершин $$$1 \leq p_i \leq n$$$. Числа $$$q_i$$$ все различны.

Гарантируется, что заданный граф является корневым деревом.

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

В первой строке выведите одно число — максимальную сумму не более чем $$$k$$$ чисел на некотором пути из листа в корень.

Примеры
Входные данные
5 2
0 1
1 2
1 3
2 4
3 5
Выходные данные
8
Входные данные
7 3
0 15
1 1
2 21
3 99
1 14
5 20
6 100
Выходные данные
135