Плюсануть
Поделиться
Класснуть
Запинить


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

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

B. Электронные таблицы

математика реализация *1600

В популярных системах электронных таблиц (например, в программе Excel) используется следующая нумерация колонок. Первая колонка имеет номер A, вторая B и т.д. до 26-ой, которая обозначается буквой Z. Затем идут двухбуквенные обозначения: 27-ая обозначается как AA, 28-ая как AB, а 52-я обозначается парой AZ. Аналогично, следом за ZZ следуют трехбуквенные обозначения и т.д.

Строки обычно обозначаются целыми числами от 1. Номер ячейки получается конкатенацией обозначений для столбца и строки. Например, BC23 это обозначение для ячейки в столбце 55, строке 23.

Иногда используется другая форма записи: RXCY, где X и Y это целые числа, обозначающие номер строки и столбца, соответственно. Например, R23C55 это ячейка из примера выше.

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

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

В первой строке записано целое число n (1 ≤ n ≤ 105), количество обозначений в тесте. Далее идет n строк, каждая из которых содержит обозначение. Известно, что все обозначения корректны, и не содержат ячейки с номерами строк или столбцов больших 106.

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

Выведите n строк — каждая строка должна содержать обозначение ячейки в отличной форме записи.

A. Учет энергопотребления

реализация *900

Васе стало интересно, сколько его любимый ноутбук потребляет электроэнергии за день. У его ноутбука есть три режима. В режиме нормальной работы он потребляет P1 Вт в минуту. Через T1 минут после того, как Вася с последний раз двинул мышью или нажал кнопку на клавиатуре, на дисплее запускается скринсейвер и потребление энергии меняется до P2 Вт в минуту. И, наконец, через T2 минут после запуска скринсейвера ноутбук переходит в режим "сна", в котором потребляет P3 Вт в минуту. Если Вася двигает мышью или касается клавиатуры в момент, когда ноутбук находится во втором или в третьем режимах, ноутбук возвращается в первый режим энергопотребления. Работу Васи за ноутбуком можно разбить на n временных отрезков [l1, r1], [l2, r2], ..., [ln, rn], в течение которых он только и делал, что работал мышью и нажимал на клавиатуру, а в промежутках между ними ничего этого не делал. Посчитайте, какое суммарное количество энергии было потреблено ноутбуком за период [l1, rn].

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

Первая строка содержит 6 целых чисел n, P1, P2, P3, T1, T2 (1 ≤ n ≤ 100, 0 ≤ P1, P2, P3 ≤ 100, 1 ≤ T1, T2 ≤ 60). Следующие n строк содержат описание отрезков работы Васи за ноутбуком. i-я из этих строк содержит два целых числа li и ri (0 ≤ li < ri ≤ 1440, ri < li + 1 для i < n), обозначающие моменты начала и конца соответствующего отрезка.

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

Выведите единственное число — ответ на задачу.

B. Кассир в кинотеатре

дп реализация *1500

Залы всех кинотеатров Берлядии представляют собой прямоугольники в K рядов по K кресел в каждом, причем K — нечетное число. Ряды и места нумеруются с 1 до K. Из соображений безопасности, человек, пришедший в кассу за билетами, не может сам выбрать места. Раньше это делал кассир, а теперь этим будет заниматься специальная программа рассадки. Было выяснено, что подавляющее большинство жителей Берляндии в кинотеатре предпочитают смотреть фильм, поэтому хотят сидеть как можно ближе к центру зала. Кроме того, компания из M человек, желающая посмотреть фильм, хочет непременно занять M последовательных мест в одном ряду. Сформулируем алгоритм, в соответствии с которым программа выдает людям билеты. При поступлении запроса на M мест программа должна определить номер ряда x и отрезок [yl, yr] номеров кресел на этом ряду, причем yr - yl + 1 = M. Из всех таких возможных вариантов программа должна выдать тот, для которого значение функции суммарной удаленности от центра минимально. Пусть — номер ряда и номер места у самого "центрального" кресла. Тогда значением функции удаленности от центра зала будет . Если вариантов с минимальным значением этой функции несколько, то программа должна выдать тот, что ближе к экрану (т.е. номер ряда x меньше). Если же вновь имеется неоднозначность, следует выдать вариант с минимальным yl. Если вы еще не догадались, то ваша задача — промоделировать работу программы.

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

Первая строка содержит два целых числа N и K (1 ≤ N ≤ 1000, 1 ≤ K ≤ 99) — число запросов и размер зала соответственно. Во второй строке содержится N целых чисел Mi из диапазона [1, K], разделенных пробелами, — запросы к программе.

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

Выведите N строк. В i-й строке выведите «-1» (без кавычек), если невозможно найти Mi свободных подряд идущих кресел в одном ряду, или выведите тройку x, yl, yr в противном случае. Числа разделяйте пробелами.

A. Персидские ковры

*особая задача реализация *1100

Комната Соруша представляет собой квадрат со стороной n. Перед этим контестом он захотел устлать пол своей комнаты коврами в честь 100-го контеста на своем любимом сайте и купил k превосходных персидских ковров. Каждый персидский ковер представляет собой квадрат со стороной n1.

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

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

Во входных данных содержатся три целых числа n, k и n1 (10 ≤ n ≤ 12, 1 ≤ k ≤ 10, ).

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

Выведите единственное слово: YES или NO. Выведите YES в том случае, если Соруш сможет устлать всю свою комнату коврами.

B. Числа-друзья

*особая задача реализация *1500

Киана считает, что два целых числа являются друзьями тогда и только тогда, когда одно из них можно разделить на другое. Например, 12 и 4 — это друзья, 6 и 6 — тоже друзья, а вот 120 и 36 друзьями не являются.

Группа целых отличных от нуля чисел называется группой друзей, если каждая пара чисел в данной группе представляет собой пару друзей.

Вам дана группа целых отличных от нуля чисел. Проверьте, друзья ли они.

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

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

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

Если группа чисел является группой друзей, выведите «FRIENDS», в противном случае выведите «NOT FRIENDS».

C. A+B

*особая задача реализация *1400

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

К примеру, они не пишут низкоуровневый код для того, чтобы сложить два целых числа, потому что используемые программистами языки могут сложить эти числа. А если все-таки написать писать эту процедуру с нуля... Может ли опытный кодировщик, побывавший более чем на ста контестах, сложить два целых числа?

Биджану в это верится с трудом. А вам?

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

Даны два целых числа a и b, по одному в строке (1 ≤ a, b < 10500). Данные числа не имеют лидирующих нулей.

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

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

F. Полином

*особая задача реализация *1800

Вам задан полином в форме p(x) = (x + a1)·(x + a2)·... (x + an). Напишите программу на языке Pike, которая выведет его в стандартном виде p(x) = xn + b1xn - 1 + ... + bn - 1x + bn. Каждое слагаемое должно иметь вид «C*X^K» (например, 5*X^8).

Напишите программу, которая выводит кратчайшую из подобных записей, то есть вы должны опустить необязательные элементы вывода — некоторые слагаемые «C*X^K» могут быть выведены в сокращенном виде или даже опущены. Тесты из условия поясняют задание.

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

Первая строка содержит целое n (1 ≤ n ≤ 9). Следующие n строк содержат по целому числу ai ( - 10 ≤ ai ≤ 10).

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

Выведите многочлен в требуемой форме. Заметим, что в этой задаче ответ определяется однозначно.

G. Как назвать альбом

*особая задача реализация Структуры данных *1800

Ивестный певец Арьё, собирается выпустить новый альбом своих великих произведений!

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

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

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

Помогите ему назвать альбом.

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

Первая строка содержит единственное целое число n (0 ≤ n ≤ 105), количество использованных названий. Следующие n строк содержат каждая по строке (названию альбома) и целому числу (году, в который был выпущен альбом). Названия альбома состоят из строчных латинских букв и содержат не более 14 букв. Год принадлежит интервалу [1900, 2011].

Следующая строка содержит единственное целое число m (1 ≤ m ≤ 104), количество подходящих названий альбома.

В каждой из следующих m строк содержится по строке — подходящему названию. Каждое название состоит из не более, чем 14 строчных латинских букв.

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

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

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

H. Морской бой

*особая задача поиск в глубину и подобное реализация *2100

Вам дано расположение кораблей на доске 10 × 10 при игре в морской бой. На ней по правилам должно быть размещено:

  • четырехпалубных ­— 1 шт.;
  • трехпалубных — 2 шт.;
  • двухпалубных — 3 шт.;
  • однопалубных — 4 шт.

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

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

В первой строке записано число n (1 ≤ n ≤ 10) — количество досок. Каждая доска описывается 10 строками по 10 символов. Символ «0» обозначает, что клетка пуста, а символ «*», что занята. Описания досок разделяются пустыми строками.

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

Выведите n строк YES или NO. Первое слово выводите, если доска соответствует правилам, а второе в противном случае.

A. Футболки Codehorses

жадные алгоритмы реализация *1200

Codehorses вот только закончил проведение второго Codehorses Cup! В этом году, как и в прошлом, организаторы дарят победителям футболки.

Валидным размером футболки называют либо «M», либо от \(0\) до \(3\) «X», за которыми следуют «S» или «L». Например, размеры «M», «XXS», «L», «XXXL» валидны, а «XM», «Z», «XXXXL» не валидны.

И в прошлом году, и в этом в кубке \(n\) победителей. У Ксении есть список размеров футболок, которые печатались к прошлому году, и теперь ей надо отправить новый список в типографию.

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

Какое минимальное количество секунд потребуется Ксении, чтобы изменить список прошлого года на список текущего?

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

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

В первой строке записано одно целое число \(n\) (\(1 \le n \le 100\)) — количество футболок.

В \(i\)-й из следующих \(n\) строк записано \(a_i\) — размер \(i\)-й футболки списка прошлого года.

В \(i\)-й из следующих \(n\) строк записано \(b_i\) — размер \(i\)-й футболки списка текущего года.

Гарантируется, что все размеры футболок во входных данных валидны. Также гарантируется, что Ксения сможет сделать список \(b\) из списка \(a\).

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

Выведите минимальное количество секунд, которое потратит Ксения на то, чтобы изменить список прошлого года на список текущего. Если списки уже одинаковы, то выведите 0.

Примечание

В первом примере Ксения может заменить «M» на «S» и «S» в одном из вхождений «XS» на «L».

Во втором примере Ксения должна заменить «L» в «XXXL» на «S».

В третьем примере списки совпадают.

C. Подсчет покрытых точек

реализация сортировки Структуры данных *1700

Задано \(n\) отрезков на координатной прямой; концы отрезков имеют целочисленные координаты. Отрезки могут вырождаться в точки. Отрезки могут пересекаться друг с другом, вкладываться и даже совпадать.

Ваша задача: для каждого \(k \in [1..n]\) посчитать количество таких точек с целочисленными координатами, что количество отрезков, покрывающих эти точки, равно \(k\). Отрезок с границами \(l_i\) и \(r_i\) покрывает точку \(x\) тогда и только тогда, когда \(l_i \le x \le r_i\).

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

Первая строка входных данных содержит целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество отрезков.

Следующие \(n\) cтрок содержат отрезки. Строка с индексом \(i\) состоит из пары целых чисел \(l_i, r_i\) (\(0 \le l_i \le r_i \le 10^{18}\)) — концы \(i\)-го отрезка.

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

Выведите \(n\) целых чисел через пробел \(cnt_1, cnt_2, \dots, cnt_n\), где \(cnt_i\) равно количеству таких точек, что количество отрезков, покрывающих эти точки, равно \(i\).

Примечание

Картинка, описывающая первый тестовый пример:

Точки с координатами \([0, 4, 5, 6, 7, 8]\) покрыты одним отрезком, точки \([1, 2]\) покрыты двумя отрезками и точка \([3]\) покрыта тремя отрезками.

Картинка, описывающая второй тестовый пример:

Точки \([1, 4, 5, 6, 7]\) покрыты одним отрезком, точки \([2, 3]\) покрыты двумя отрезками и точек, покрытых тремя отрезками, нет.

A. Карманы Поликарпа

реализация *800

У Поликарпа есть \(n\) монет, достоинство \(i\)-й монеты равно \(a_i\). Поликарп хочет распределить монеты по своим карманам, но он не может класть две монеты одинакового достоинства в один и тот же карман.

Например, елси у Поликарпа есть шесть монет, представленных в виде массива \(a = [1, 2, 4, 3, 3, 2]\), он может распределить их по двум карманам следующим образом: \([1, 2, 3], [2, 3, 4]\).

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

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

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

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)) — достоинства монет.

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

Выведите одно целое число — минимальное возможное количество карманов, необходимое Поликарпу, чтобы распределить все имеющиеся у него монеты таким образом, что никакие две монеты с одинаковым достоинством не лежат в одном и том же кармане.

C. Сильная жара

математика Перебор реализация *1300

На протяжении нескольких последних дней очень жарко. Ученые всей Берляндии изучают, как изменяется температура и погода, и утверждают, что этим летом аномально жарко. Но любой ученый считает утверждения более правдивыми, если есть цифры, подтверждающие их, поэтому ученые решили найти какую-то оценку, которая показывает, насколько высока температура.

Математики Берляндского Государственного Университета (БГУ) придумали специальную оценку, которую назвали интенсивностью температуры. Эта оценка считается следующим образом:

Предположим, что мы хотим проанализировать отрезок из \(n\) подряд идущих дней. Мы измерили температуры в каждый из этих \(n\) дней; температура в \(i\)-й день равна \(a_i\).

Обозначим за среднюю температуру отрезка подряд идущих дней как среднее арифметическое измерений температур, принадлежащих этому отрезку дней. Таким образом, если мы хотим проанализировать среднюю температуру с дня \(x\) по день \(y\), мы будем считать ее как \(\frac{\sum \limits_{i = x}^{y} a_i}{y - x + 1}\) (обратите внимание, что деление производится без округления). Интенсивность температуры — это максимум среди средних температур среди всех отрезков подряд идущих дней длины не менее \(k\). Например, если анализировать измерения \([3, 4, 1, 2]\) и \(k = 3\), интерес представляют отрезки \([3, 4, 1]\), \([4, 1, 2]\) и \([3, 4, 1, 2]\) (мы хотим найти максимальное значение средней температуры среди всех этих отрезков).

Вас нанял Берляндский Государственный Университет, чтобы вы написали программу, которая посчитает интенсивность температуры в заданном отрезке дней. Вы займетесь этой задачей?

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

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

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

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

Выведите одно вещественное число — the интенсивность температуры, то есть максимум среди средних температур по всем отрезкам, состоящим не менее, чем из \(k\) последовательных дней.

Ваш ответ будет считаться правильным, если выполняется следующее условие: \(|res - res_0| < 10^{-6}\), где \(res\) — это ваш ответ, а \(res_0\) — ответ авторского решения.

A. Соня и отели

реализация *900

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

Страна, в которой живет Соня, представляет собой бесконечную прямую. В каждой целочисленной координате на этой прямой находится город. У девочки есть \(n\) отелей, \(i\)-й отель находится в городе с координатой \(x_i\). Соня — девочка умная, поэтому, она не открывает два или более отеля в одном городе.

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

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

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

Первая строка содержит два целых числа \(n\) и \(d\) (\(1\leq n\leq 100\), \(1\leq d\leq 10^9\)) — количество отелей Сони и требуемое расстояние от нового отеля до ближайшего.

В следующей строке записана строго возрастающая последовательность из \(n\) различных чисел \(x_1, x_2, \ldots, x_n\) (\(-10^9\leq x_i\leq 10^9\)) — координаты отелей Сони.

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

Выведите количество городов, в которых Соня может построить новый отель так, чтобы расстояние до ближайшего другого отеля было равно \(d\).

Примечание

В первом примере есть \(6\) возможных городов, где можно построить новый отель, эти города имеют координаты: \(-6\), \(5\), \(6\), \(12\), \(13\) и \(19\).

Во втором примере можно построить отель в \(5\) возможных городах, которые имеют координаты: \(2\), \(6\), \(13\), \(16\) и \(21\).

B. Соня и выставка

жадные алгоритмы Конструктив математика реализация *1300

Соня решила провести выставку цветов. Так как девочка любит только розы и лилии, она решила, что на выставке будут только эти два вида цветов.

Выставка представляет собой ряд из \(n\) цветов. Соня может поставить на позицию \(i\) либо розу, либо лилию. Таким образом, каждая из \(n\) позиций будет содержать ровно один цветок — розу или лилию.

Она знает, что выставку посетят ровно \(m\) людей, при чем \(i\)-й посетитель будет рассматривать только цветки от \(l_i\) до \(r_i\) включительно. Девочка понимает, что у каждого подотрезка цветов есть своя красота, которая равна произведению количества роз и количества лилий.

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

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1\leq n, m\leq 10^3\)) — количество цветов и посетителей соответственно.

Каждая из следующих \(m\) строк содержит два целых числа \(l_i\) и \(r_i\) (\(1\leq l_i\leq r_i\leq n\)), что значит, что \(i\)-й посетитель пройдет по всем цветам в диапазоне от \(l_i\) до \(r_i\) включительно.

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

Выведите строку из \(n\) символов, \(i\)-й из которых должен быть «0», если вы хотите поставить розу на \(i\)-ю позицию, иначе «1», если хотите поставить лилию.

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

Примечание

В первом примере на первой, четвертой и пятой позициях стоят розы, а на второй и третьей позициях — лилии;

  • на подотрезке \([1\ldots3]\) есть одна роза и две лилии, поэтому красота равна \(1\cdot 2=2\);
  • на подотрезке \([2\ldots4]\) есть одна роза и две лилии, поэтому красота равна \(1\cdot 2=2\);
  • на подотрезке \([2\ldots5]\) есть две розы и две лилии, поэтому красота равна \(2\cdot 2=4\).

Суммарная красота равна \(2+2+4=8\).

Во втором примере на третьей, четвертой и шестой позициях стоят розы, а на первой, второй и пятой позициях — лилии;

  • на подотрезке \([5\ldots6]\) есть одна роза и одна лилия, поэтому красота равна \(1\cdot 1=1\);
  • на подотрезке \([1\ldots4]\) есть две розы и две лилии, поэтому красота равна \(2\cdot 2=4\).
  • на подотрезке \([4\ldots6]\) есть две розы и одна лилия, поэтому красота равна \(2\cdot 1=2\).

Суммарная красота равна \(1+4+2=7\).

C. Соня и роботы

Конструктив реализация *1400

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

Соня нарисовала в ряд \(n\) чисел, где на \(i\)-й позиции находится число \(a_i\). Она так же поставила по роботу в каждый конец ряда (слева от первого числа и справа от последнего). Соня даст каждому роботу по одному числу (они могут быть как одинаковые, так и различны) и запустит их. Когда робот запущен, он движется навстречу другому роботу, считывая числа в ряду. Когда робот считывает число, которое равно тому числу, что ему ввели, он выключится и останется на этой же позиции.

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

Например, если ряд состоит из чисел \([1, 5, 4, 1, 3]\), первому роботу дали число \(1\), а второму \(4\), то первый робот остановится на позиции \(1\), а второй на позиции \(3\). В таком случае, роботы не встретятся, как результат, роботы не поломаются. Но если дать первому число \(4\), а второму \(5\), то они встретятся, так как первый остановится на позиции \(3\), а второй на позиции \(2\).

Соня понимает, что нет смысла давать роботу число, которого нет в ряду, так как он не найдет такое число и встретится со вторым роботом.

Соне теперь стало интересно, сколько различных пар чисел можно дать роботам так, чтобы они не встретились. То есть, если есть пара чисел (\(p\), \(q\)), то девочка даст число \(p\) первому роботу, а \(q\) второму. Пары чисел (\(p_i\), \(q_i\)) и (\(p_j\), \(q_j\)) считаются различными, если \(p_i\neq p_j\) или \(q_i\neq q_j\).

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

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

Первая строка содержит одно целое число \(n\) (\(1\leq n\leq 10^5\)) — количество чисел в ряду.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1\leq a_i\leq 10^5\)) — числа ряда.

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

Выведите одно число — количество возможных пар чисел, которые можно дать роботам, чтобы они не встретились.

Примечание

В первом примере можно дать пары чисел (\(1\), \(1\)), (\(1\), \(3\)), (\(1\), \(4\)), (\(1\), \(5\)), (\(4\), \(1\)), (\(4\), \(3\)), (\(5\), \(1\)), (\(5\), \(3\)) и (\(5\), \(4\)).

Во втором примере можно дать пары чисел (\(1\), \(1\)), (\(1\), \(2\)), (\(1\), \(3\)), (\(2\), \(1\)), (\(2\), \(2\)), (\(2\), \(3\)) и (\(3\), \(2\)).

D. Соня и матрица

Конструктив Перебор реализация *2300

Поскольку Соня недавно выучила основы матриц, она решила немножко поиграть с ними.

Соня быстро придумала новый вид матриц, которые назвала ромбические матрицы. Эти матрицы имеют ровно один ноль, а во всех остальных ячейках записано манхэттенское расстояние до клетки с нулём. Ячейки с одинаковыми числами имеют форму ромбов, поэтому, Соня так этот вид и назвала.

Манхэттенское расстояние между ячейками (\(x_1\), \(y_1\)) и (\(x_2\), \(y_2\)) равно величине \(|x_1 - x_2| + |y_1 - y_2|\). Например, манхэттенское расстояние между ячейками \((5, 2)\) и \((7, 1)\) равно \(|5-7|+|2-1|=3\).

Пример ромбической матрицы.

Отметим, что ромбическая матрица однозначно задается своими размерами \(n\), \(m\) и положением ячейки со значением \(0\).

Она нарисовала некоторую \(n\times m\) ромбическую матрицу. Девочка полагает, что вы не сможете возобновить матрицу, если она вам даст только элементы матрицы в случайном порядке (то есть последовательность из \(n\cdot m\) чисел). Отметим, что Соня не даст вам сами числа \(n\) и \(m\), в вашем распоряжении будет только последовательность всех элементов матрицы.

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

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

Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 10^6\)) — количество ячеек в матрице.

Вторая строка содержит \(t\) целых чисел \(a_1, a_2, \ldots, a_t\) (\(0\leq a_i< t\)) — значения ячеек в произвольном порядке.

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

В первой строке выведите два целых положительных числа \(n\) и \(m\) (\(n \times m = t\)) — размеры матрицы.

В следующей строке выведите два целых числа \(x\) и \(y\) (\(1\leq x\leq n\), \(1\leq y\leq m\)) — номер строки и номер колонки, на пересечении которых расположена ячейка со значением \(0\).

Если существует несколько решений, выведите любое из них. Если решения не существует, выведите одно целое число \(-1\).

Примечание

Рисунок к первому примеру можно увидеть в легенде. Так же можно выбрать ячейку \((2, 2)\) для нуля. Кроме этого, матрица \(5\times 4\) с нулём в \((4, 2)\) тоже является правильной.

Для второго примера существует матрица размером \(3\times 6\), ноль которой находится в ячейки \((2, 3)\).

Для третьего примера решения не существует.

A. Таня и лестницы

реализация *800

Маленькая девочка Таня поднимается по лестницам внутри многоэтажного дома. Каждый раз, когда она идет по очередной лестнице, она начинает считать ступеньки от \(1\) до количества ступенек в этой лестнице. Все числа она произносит вслух. Например, если она поднимется по двум лестницам, первая из которых содержит \(3\) ступеньки, а вторая — \(4\) ступеньки, то она произнесет вслух числа \(1, 2, 3, 1, 2, 3, 4\).

Заданы числа, которые произнесла Таня. Сколько лестниц она прошла? Выведите сами количество ступенек в каждой из пройденных лестниц.

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

В первой строке содержится \(n\) (\(1 \le n \le 1000\)) — общее количество названных Таней чисел.

Вторая строка содержит целые числа \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 1000\)) — все числа, которые произнесла Таня, поднимаясь по лестницам в порядке от первого произнесённого до последнего. Проходя лестницу из \(x\) ступенек, она произнесет числа \(1, 2, \dots, x\).

Заданная последовательность такова, что в самом деле была произнесена Таней при подъеме по одной или более лестнице.

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

В первую строку выведите \(t\) — количество лестниц, которые прошла Таня. Во вторую строку выведите \(t\) чисел — количества ступенек в каждой из пройденных лестниц. Числа выводите в порядке прохождения лестниц.

B. Удаляй слева

Перебор реализация Строки *900

Заданы две строки \(s\) и \(t\). За один ход можно выбрать произвольную из двух строк и удалить её первый (самый левый) символ. При этом длина строки уменьшается на \(1\).

Например:

  • применив ход к строке «where», в результате получится строка «here»,
  • применив ход к строке «a», в результате получится пустая строка «».

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

Напишите программу, которая найдет минимальное количество ходов, чтобы сделать две заданные строки \(s\) и \(t\) равными.

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

В первой строке входных данных записана строка \(s\). Во второй строке входных данных записана строка \(t\). Строки состоят только из строчных букв латинского алфавита. Длина каждой строки от 1 до \(2\cdot10^5\) букв.

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

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

Примечание

В первом примере следует один раз применить ход к первой строке и один раз применить ход ко второй строке. В результате обе строки будут равны «est».

Во втором примере ход следует применить \(8\) раз к «codeforces». В результате будет получена строка «codeforces» \(\to\) «es». К строке «yes» ход следует применить один раз. В результате будет получена такая же строка «yes» \(\to\) «es».

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

В четвёртом примере следует удалить первый символ второй строки.

C. Суммируй до степени двойки

жадные алгоритмы Перебор реализация *1300

Последовательность \(a_1, a_2, \dots, a_n\) называется хорошей, если для любого его элемента \(a_i\) найдется такой элемент \(a_j\) (\(i \ne j\)), что \(a_i+a_j\) является степенью двойки (то есть равен \(2^d\) для некоторого неотрицательного целого \(d\)).

Например, следующие последовательности — хорошие:

  • \([5, 3, 11]\) (например, для \(a_1=5\) можно выбрать \(a_2=3\), что сумма — степень двойки, подобную пару можно найти и для \(a_2\) и \(a_3\)),
  • \([1, 1, 1, 1023]\),
  • \([7, 39, 89, 25, 89]\),
  • \([]\).

Обратите внимание, что по определению пустая последовательность (то есть такая, длина которой равна \(0\)) является хорошей.

Например, следующие последовательности не являются хорошими:

  • \([16]\) (для \(a_1=16\) невозможно найти другой элемент \(a_j\), что их сумма — степень двойки),
  • \([4, 16]\) (для \(a_1=4\) невозможно найти другой элемент \(a_j\), что их сумма — степень двойки),
  • \([1, 3, 2, 8, 8, 8]\) (для \(a_3=2\) невозможно найти другой элемент \(a_j\), что их сумма — степень двойки).

Задана последовательность \(a_1, a_2, \dots, a_n\). Какое наименьшее количество элементов надо удалить, чтобы сделать её хорошей? Удалять можно произвольный набор элементов.

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

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

Во второй строке записана последовательность целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

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

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

Примечание

В первом примере достаточно удалить один элемент \(a_4=5\). Оставшиеся элементы образуют последовательность \([4, 7, 1, 4, 9]\), которая является хорошей.

A. Соседние замены

реализация *800

В подарок на день рождения Мишка получил массив целых чисел \(a\) длины \(n\) (какая неожиданность!).

Мишке не нравится этот подарок и он хочет как-нибудь его изменить. Он изобрел алгоритм и назвал его «Алгоритм Мишки для Соседних Замен». Этот алгоритм может быть представлен в виде последовательности ходов:

  • Заменить все вхождения \(1\) в массиве \(a\) на \(2\);
  • Заменить все вхождения \(2\) в массиве \(a\) на \(1\);
  • Заменить все вхождения \(3\) в массиве \(a\) на \(4\);
  • Заменить все вхождения \(4\) в массиве \(a\) на \(3\);
  • Заменить все вхождения \(5\) в массиве \(a\) на \(6\);
  • Заменить все вхождения \(6\) в массиве \(a\) на \(5\);
  • \(\dots\)
  • Заменить все вхождения \(10^9 - 1\) в массиве \(a\) на \(10^9\);
  • Заменить все вхождения \(10^9\) в массиве \(a\) на \(10^9 - 1\).

Заметим, что многоточие в середине алгоритма означает, что Мишка применяет эти замены к каждой паре соседних чисел (\(2i - 1, 2i\)) для всех \(i \in\{1, 2, \ldots, 5 \cdot 10^8\}\), как это описано выше.

Например, для массива \(a = [1, 2, 4, 5, 10]\) следующая последовательность массивов описывает алгоритм:

\([1, 2, 4, 5, 10]\) \(\rightarrow\) (заменить все вхождения \(1\) на \(2\)) \(\rightarrow\) \([2, 2, 4, 5, 10]\) \(\rightarrow\) (заменить все вхождения \(2\) на \(1\)) \(\rightarrow\) \([1, 1, 4, 5, 10]\) \(\rightarrow\) (заменить все вхождения \(3\) на \(4\)) \(\rightarrow\) \([1, 1, 4, 5, 10]\) \(\rightarrow\) (заменить все вхождения \(4\) на \(3\)) \(\rightarrow\) \([1, 1, 3, 5, 10]\) \(\rightarrow\) (заменить все вхождения \(5\) на \(6\)) \(\rightarrow\) \([1, 1, 3, 6, 10]\) \(\rightarrow\) (заменить все вхождения \(6\) на \(5\)) \(\rightarrow\) \([1, 1, 3, 5, 10]\) \(\rightarrow\) \(\dots\) \(\rightarrow\) \([1, 1, 3, 5, 10]\) \(\rightarrow\) (заменить все вхождения \(10\) на \(9\)) \(\rightarrow\) \([1, 1, 3, 5, 9]\). Дальнейшие шаги алгоритма не изменят массив.

Мишка очень ленивый и он не хочет сам применять эти изменения. Но ему очень интересно узнать, как будет выглядеть результат их применения. Помогите Мишке найти его.

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество элементов в подарке Мишки с его дня рождения (внезапно, массиве).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — элементы массива.

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

Выведите \(n\) целых чисел — \(b_1, b_2, \dots, b_n\), где \(b_i\) означает измененное значение \(i\)-го элемента массива \(a\) после применения к нему «Алгоритма Мишки для Соседних Замен». Заметьте, что вы не можете менять порядок элементов массива.

Примечание

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

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

жадные алгоритмы реализация сортировки *1200

Поликарп тренирует свое умение решать задачи. У него есть список из \(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\).

D. Обмены в двух строках

реализация *1700

Заданы две строки \(a\) и \(b\), состоящие из строчных букв латинского алфавита, каждая длины \(n\). Символы обеих строк имеют позиции от \(1\) до \(n\) включительно.

Вы можете производить следующие изменения:

  • Выбрать любую позицию \(i\) (\(1 \le i \le n\)) и поменять местами символы \(a_i\) и \(b_i\);
  • Выбрать любую позицию \(i\) (\(1 \le i \le n\)) и поменять местами символы \(a_i\) и \(a_{n - i + 1}\);
  • Выбрать любую позицию \(i\) (\(1 \le i \le n\)) и поменять местами символы \(b_i\) и \(b_{n - i + 1}\).

Заметим, что для нечетного \(n\) формально можно поменять \(a_{\lceil\frac{n}{2}\rceil}\) с \(a_{\lceil\frac{n}{2}\rceil}\) (и то же самое для строки \(b\)), но это изменение не имеет смысла. Также вы можете менять местами одинаковые символы, но это изменение тоже не имеет смысла.

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

За один предварительный ход вы можете заменить любой символ в \(a\) любым другим символом. Другими словами, за один предварительный ход вы можете выбрать любую позицию \(i\) (\(1 \le i \le n\)), любой символ \(c\) и применить следующее присвоение: \(a_i := c\).

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

Заметим, что количество изменений, которое вы сделаете после некоторого количества предварительных ходов, не важно. Также заметим, что вы не можете применять предварительные ходы к строке \(b\) или применять какой-либо предварительный ход после того, как первое изменение было сделано.

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — длину строк \(a\) и \(b\).

Вторая строка содержит строку \(a\), состоящую ровно из \(n\) строчных букв латинского алфавита.

Третья строка содержит строку \(b\), состоящую ровно из \(n\) строчных букв латинского алфавита.

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

Выведите одно целое число — минимальное число предварительных ходов, которое необходимо применить перед изменениями, чтобы можно было сделать равными строки \(a\) и \(b\) при помощи какой-то последовательности изменений из списка, описанного выше.

Примечание

В первом тестовом примере предварительные ходы будут следующие: \(a_1 := \)'b', \(a_3 := \)'c', \(a_4 := \)'a' и \(a_5:=\)'b'. После этого строка \(a = \)"bbcabba". Теперь мы можем получить равные строки при помощи следующей последовательности изменений: \(swap(a_2, b_2)\) и \(swap(a_2, a_6)\). Не существует способа использовать менее \(4\) предварительных ходов перед последовательностью изменений для того, чтобы сделать строки равными, поэтому ответ на первый тестовый пример равен \(4\).

Во втором тестовом примере строки \(a\) и \(b\) почти равны. Здесь не требуется предварительных ходов. Но нужна следующая последовательность изменений: \(swap(b_1, b_5)\), \(swap(a_2, a_4)\).

A. Ромадзи

реализация Строки *900

Витя начал учить берляндский язык. Известно, что в Берляндии используют латинский алфавит. Буквы «a», «o», «u», «i» и «e» являются гласными. Остальные буквы — согласные.

В берляндском языке после каждой согласной буквы обязательно идёт гласная буква, а после гласной — может идти любая. Единственным исключением является согласная буква «n» — после неё может идти любая буква (не только гласная), а может и не идти буква вообще. Например, слова «harakiri», «yupie», «man» и «nbo» являются берляндскими, а слова «horse», «king», «my» и «nz» — нет.

Помогите Вите понять, является ли слово \(s\) берляндским.

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

Первая строка входных данных содержит строку \(s\), состоящую из \(|s|\) (\(1\leq |s|\leq 100\)) строчных латинских букв.

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

Выведите «YES» (без кавычек), если идет гласная после каждой согласной кроме «n», иначе выведите «NO».

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

В первом и втором примерах после каждой согласной кроме «n» идёт гласная, поэтому слово является берляндским.

В третьем примере после согласной «r» идёт другая согласная «c», а согласная «s» стоит в конце, поэтому слово не является берляндским.

A. Покупка игр

реализация *800

Максим хочет купить себе несколько игр в игровом магазине. Всего в магазине есть \(n\) игр, \(i\)-я игра стоит \(c_i\).

У Максима есть бумажник, который можно представить в виде массива целых чисел. В его бумажнике есть \(m\) купюр, номинал \(j\)-й купюры — \(a_j\).

Игры в магазине пронумерованы в порядке слева направо, Максим пытается купить каждую игру в этом порядке.

Когда Максим находится на позиции \(i\) в магазине, он берет первую купюру из его бумажника (если его бумажник пустой, то он просто сразу же переходит к следующей позиции) и пытается купить \(i\)-ю игру, используя эту банкноту. После попытки купить \(n\)-ю игру Максим покидает магазин.

Максим покупает \(i\)-ю игру тогда и только тогда, когда номинал первой банкноты (которую он достает) из его бумажника больше либо равен цене \(i\)-й игры. Если он успешно покупает \(i\)-ю игру, первая банкнота из его бумажника пропадает и следующая по счету становится первой. Иначе Максим возвращает первую банкноту в свой бумажник (эта банкнота остается первой) и переходит к следующей игре.

Например, для массива \(c = [2, 4, 5, 2, 4]\) и массива \(a = [5, 3, 4, 6]\) будет происходить следующее: Максим покупает первую игру, используя первую банкноту (ее номинал равен \(5\)), она пропадает, и вторая банкнота (ее номинал равен \(3\)) становится первой в бумажнике Максима. Затем Максим не покупает вторую игру, потому что \(c_2 > a_2\), то же самое происходит с третьей игрой, затем он покупает четвертую игру, используя банкноту с номиналом \(a_2\) (третья банкнота становится первой в бумажнике Максима), и покупает пятую игру, используя банкноту с номиналом \(a_3\).

Ваша задача — сообщить, сколько игр купит Максим.

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

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 1000\)) — количество игр и количество банкнот в бумажнике Максима.

Вторая строка входных данных содержит \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le 1000\)), где \(c_i\) равно стоимости \(i\)-й игры.

Третья строка входных данных содержит \(m\) целых чисел \(a_1, a_2, \dots, a_m\) (\(1 \le a_j \le 1000\)), где \(a_j\) равно номиналу \(j\)-й банкноты из бумажника Максима.

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

Выведите одно целое число — количество игр, купленных Максимом.

Примечание

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

Во втором тестовом примере Максим не может купить ни одну игру, потому что номинал первой банкноты в его бумажнике меньше, чем цена любой из игр в магазине.

В третьем тестовом примере номиналы банкнот в бумажнике Максима достаточно большие, чтобы покупать каждую встречающуюся игру до тех пор, пока у него не кончатся купюры.

B. Минимальная троичная строка

жадные алгоритмы реализация *1400

Задана троичная строка (строка, состоящая только из символов '0', '1' и '2').

Можно обменивать местами любую пару соседних (последовательных) символов '0' и '1' (то есть заменять «01» на «10» и наоборот) или любую пару соседних (последовательных) символов '1' и '2' (то есть заменять «12» на «21» и наоборот). Другие обмены запрещены.

Например, со строкой «010210» можно проводить следующие действия:

  • «010210» \(\rightarrow\) «100210»;
  • «010210» \(\rightarrow\) «001210»;
  • «010210» \(\rightarrow\) «010120»;
  • «010210» \(\rightarrow\) «010201».

Заметим, что нельзя менять местами «02» \(\rightarrow\) «20» и наоборот. Также нельзя проводить никаких других операций со строкой, за исключением тех, что описаны выше.

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

Строка \(a\) лексикографически меньше строки \(b\) (если строки \(a\) и \(b\) имеют одинаковую длину), если найдется такая позиция \(i\) (\(1 \le i \le |a|\), где \(|s|\) — длина строки \(s\)), что для всех \(j < i\) выполняется \(a_j = b_j\), и \(a_i < b_i\).

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

Первая строка входных данных содержит строку \(s\), состоящую из символов '0', '1' и '2', ее длина от \(1\) до \(10^5\) (включительно).

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

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

C. Вектора

математика реализация *2000

На уроке геометрии Геральду дали задание: из вектора A получить вектор B. При этом учитель разрешил ему делать с вектором А следующие операции:

  • Повернуть вектор на 90 градусов по часовой стрелке.
  • Прибавить к вектору определенный вектор С.

Операции можно производить в произвольной последовательности любое количество раз.

Сможет ли Геральд справиться с заданием?

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

В первой строке даны целые числа x1 и y1 — координаты вектора A ( - 108 ≤ x1, y1 ≤ 108). Во второй и третьей строках в аналогичном виде даны вектора B и C (их координаты — целые числа, по модулю не превосходящие 108).

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

Выведите «YES» (без кавычек), если с помощью описанных операций возможно получить вектор B. Иначе выведите «NO» (без кавычек).

D. Марсоход

графы Деревья поиск в глубину и подобное реализация *2000

Наташа передвигалась по Марсу на марсоходе. Но неожиданно он сломался, а именно — логическая схема внутри него. Она представляет собой неориентированное дерево (связный ациклический граф) с корнем в вершине \(1\), в котором листья, не являющиеся корнем — входы, все остальные вершины — логические элементы, в том числе корень — выход. На каждый вход подается один бит. На выходе возвращается один бит.

Логические элементы бывают четырех видов: AND (И, \(2\) входа), OR (ИЛИ, \(2\) входа), XOR (исключающее ИЛИ, \(2\) входа), NOT (НЕ, \(1\) вход). Логические элементы принимают значения со своих прямых потомков (входов) и возвращают результат функции, которую они выполняют. Наташе известна логическая схема марсохода, а также то, что в ней сломался ровно один вход. Чтобы починить марсоход, ей нужно изменить значение на этом входе.

Для каждого входа определите, каким будет результат на выходе, если изменить именно этот вход.

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) — количество вершин графа (входов + элементов).

\(i\)-я из следующих \(n\) строк содержит описание \(i\)-й вершины: сначала идёт строка "AND", "OR", "XOR", "NOT" или "IN" (означает вход схемы) — тип вершины. Если эта вершина — "IN", то далее написано значение данного входа (\(0\) или \(1\)), в противном случае — номера вершин-входов данного элемента: "AND", "OR", "XOR" — \(2\) входа (номера вершин), "NOT" — \(1\) вход (номер вершины). Вершины нумеруются с единицы.

Гарантируется, что во входных данных задана корректная логическая схема с выходом в вершине \(1\).

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

Выведите строку из символов '0' и '1' (без кавычек) — ответы на задачу для каждого листка по порядку их сортировки по номеру вершины во входных данных.

Примечание

Изначальная схема из тестового примера (до изменения входа):

Зелёным цветом обозначены единичные биты, жёлтым — нулевые.

Если изменить бит на входе \(2\) на \(0\), то на выходе будет \(1\).

Если изменить бит на входе \(3\) на \(0\), то на выходе будет \(0\).

Если изменить бит на входе \(6\) на \(1\), то на выходе будет \(1\).

Если изменить бит на входе \(8\) на \(0\), то на выходе будет \(1\).

Если изменить бит на входе \(9\) на \(0\), то на выходе будет \(0\).

A. Ступени

жадные алгоритмы реализация сортировки *900

Наташа собирается полететь на Марс. Ей необходимо построить ракету, которая собирается из нескольких ступеней в определённом порядке. Каждая из ступеней описывается одной строчной буквой латинского алфавита. Тем самым ракета описывается строкой — конкатенацией букв, соответствующих ступеням.

Всего на складе есть \(n\) ступеней. Ракета должна содержать ровно \(k\) из них. Ступени в ракете должны быть упорядочены по весу. После ступени с некоторой буквой можно ставить только ступень с буквой, идущей хотя бы на две позиции позже в алфавите (то есть через одну букву или более). Например, после буквы 'c' нельзя ставить буквы 'a', 'b', 'c' и 'd', зато можно ставить 'e', 'f', ..., 'z'.

Чтобы ракета летела максимально далеко, нужно, чтобы её вес был минимален. Вес ракеты равен сумме весов её ступеней. Ступень весит столько тонн, каков номер её буквы в алфавите. Иными словами, ступень 'a' весит одну тонну, 'b' весит две тонны, а 'z' — \(26\) тонн.

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

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

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

Вторая строка содержит строку \(s\) из \(n\) строчных букв латинского алфавита. Каждая из букв задаёт очередную ступень, которую можно использовать при постройке. Каждую ступень можно использовать не более одного раза.

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

Выведите одно число — минимальный суммарный вес ракеты или -1, если ни одной ракеты построить нельзя.

Примечание

В первом примере условию удовлетворяют такие ракеты:

  • «adx» (вес равен \(1+4+24=29\));
  • «ady» (вес равен \(1+4+25=30\));
  • «bdx» (вес равен \(2+4+24=30\));
  • «bdy» (вес равен \(2+4+25=31\)).

Минимальный вес имеет ракета «adx», следовательно ответ равен \(29\).

Во втором примере искомая ракета — «belo». Её вес — \(2+5+12+15=34\).

В третьем примере \(n=k=2\), поэтому ракета должна содержать обе ступени: 'a' и 'b'. Такая ракета не удовлетворяет условию, поскольку эти буквы стоят в алфавите рядом. Ответ — -1.

B. Планировние экспедиции

Бинарный поиск Перебор реализация *1200

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

Всего на складе доступны \(m\) суточных комплектов питания. Каждый комплект характеризуется своим типом \(a_i\).

Каждый из участников в день должен съедать ровно один суточный комплект питания. По причине экстремальных нагрузок, каждый участник в каждый из дней экспедиции должен съедать комплект одного и того же типа. Для разных участников типы съедаемых комплектов могут как различаться, так и совпадать.

Формально, для каждого участника \(j\) Наташа должна выбрать тип питания \(b_j\) и каждый день \(j\)-й участник дожен съедать комплект питания типа \(b_j\). Значения \(b_j\) у разных участников могут как различаться, так и совпадать.

Какой максимальной продолжительности в днях можно спланировать экспедицию, чтобы выполнить требования выше?

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 100\), \(1 \le m \le 100\)) — количество участников экспедиции и количество суточных комплектов питания на складе.

Во второй строке записана последовательность целых чисел \(a_1, a_2, \dots, a_m\) (\(1 \le a_i \le 100\)), где \(a_i\) — тип \(i\)-го комплекта питания.

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

Выведите максимальное количество дней, сколько может продолжаться экспедиция. Если невозможно спланировать экспедицию даже на один день, то выведите 0.

Примечание

В первом примере Наташа может назначить первому участнику тип \(1\), второму — тип \(1\), третьему — тип \(5\), четвёртому — тип \(2\). В таком случае, экспедиция может продолжаться \(2\) дня, так как каждому участнику достанется суточный комплект питания его типа (будут израсходованы \(4\) комлекта типа \(1\) и по два комлекта типов \(2\) и \(5\)).

Во втором примере на \(100\) человек есть только \(1\) комплект питания на базе. Таким образом, экспедиция длительности даже \(1\) день невозможна.

A. Фотография неба

математика Перебор реализация сортировки *1500

Паша сделал фото своих любимых звёзд на небе. Его камера сфотографировала все звёзды на небе, которые лежали в некотором прямоугольнике со сторонами, параллельными осям координат.

Более формально, она сделала фотографию всех точек с координатами \((x, y)\), для которых выполнено \(x_1 \leq x \leq x_2\) и \(y_1 \leq y \leq y_2\), где \((x_1, y_1)\) и \((x_2, y_2)\) — координаты левого нижнего и правого верхнего прямоугольника, который фотографируют. Площадь фотографируемого прямоугольника может быть нулевой.

Сразу после фотографирования Паша выписал в блокнот координаты \(n\) своих любимых звёзд, попавших на фото. Эти точки не обязательно различны, так как в одной точке неба может быть несколько звёзд.

Но потом, к сожалению, Павел потерял свою камеру и хочет купить новую, похожую на предыдущую. В частности, он хочет знать размер фотографии, снятой ранее. К сожалению, эта фотография тоже оказалась утеряна. Его записи в блокноте сохранились, но не осообо помогают — все координаты оказались перемешаны и невозможно определить, каким точкам соответствуют.

Паша попросил вас определить, каков мог быть размер фотографии, не противоречащей его записям.

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

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

В первой строке входных данных находится одно целое число \(n\) (\(1 \leq n \leq 100\,000\))— количество точек, координаты которых выписал Паша.

Во второй строке находятся \(2 \cdot n\) целых чисел \(a_1\), \(a_2\), ..., \(a_{2 \cdot n}\) (\(1 \leq a_i \leq 10^9\)) — все координаты, выписанные Пашей, в каком-то порядке.

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

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

Примечание

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

F. Паспорта

дп реализация *3400

Глеб  — известный спортивный программист из Иннополиса. Он планирует поехать на N сборов по программированию в ближайшем будущем. Каждые сборы будут проходить в другой стране. И для въезда в каждую из этих стран Глебу нужно получать визу.

Для каждой поездки Глебу известны три числа: номер первого дня поездки si, продолжительность поездки в днях leni и количество дней ti, которое консульство соответствующей страны тратит на оформление визы. Глеб имеет P (1 ≤ P ≤ 2) действующих паспортов и может решать, в какой паспорт проставлять какую визу.

В каждую поездку Глеб улетает рано утром для si и возвращается поздно вечером дня si + leni - 1.

Чтобы подать паспорт на визу в день d, Глебу нужно быть в Иннополисе в середине соответствующего дня. Поэтому он не может подавать на визу, пока он в другой поездке, включая ее первый и последний день. Если поездка начинается на следующий день после окончания предыдущей, Глеб не может подать на визу между ними. Самое раннее, когда Глеб может подать на визу  — это день номер 1.

После подачи на визу страны i в день d Глеб получит паспорт назад в середине дня d + ti. Консультсва используют службы доставки, поэтому он может получить свой паспорт, даже если находится в поездке в этот день. Но Глеб может подать паспорт на другую визу в день получения паспорта, но только если в этот день он находится в Иннополисе в этот день.

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

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

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

В первой строке входных данных находятся два целых числа N (1 ≤ N ≤ 22) и P (1 ≤ P ≤ 2): количество поездок и количество паспортов у Глеба соответственно.

Следующие N строк описывают поездки Глеба. Каждая строка описания содержит три положительных целых числа si, leni, ti (1 ≤ si, leni, ti ≤ 109): первый день поездки, продолжительность поездки и количество дней, которое требуется для получения соответствующей визы. Гарантируется, что никакие две поездки не пересекаются.

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

Если невозможно получить все визы во-время, просто выведите "NO" без кавычек.

В другом случае в первой строке выведите "YES", а затем N строк, соответствующих поездкам. Для каждой поездки выведите сначала номер паспорта, в который Глеб будет проставлять соответствующую визу, а затем номер дня, в который следует подавать на эту визу. Дни нумеруются с 1, начиная с первого дня, когда Глеб может подать на визу. Паспорта нумеруются от 1 до P.

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

Примечание

Примеры с ответом "YES" изображены ниже.

На рисунке каждая ячейка ленты соответствует одному дню. Прямоугольники представляют поездки (каждая поездка начинается утром и заканчивается вечером). Прямоугольники с угловыми краями представляют оформления виз. Каждая подача начинается в середине дня и заканчивается ti дней спустя. Поездка и получение визы в соответствующую страну обозначены одним и тем же цветом.

В примерах с двумя паспортами, оформления виз и поездка написанные сверху делаются с помощью первого паспорта, а написанные снизу делаются с помощью второго паспорта.

Example 1:

Example 2:

Example 3:

A. Точки в отрезках

реализация *800

Задан набор из \(n\) отрезков на оси \(Ox\), каждый отрезок имеет целочисленные координаты концов от \(1\) до \(m\) включительно. Отрезки могут пересекаться, вкладываться или даже совпадать друг с другом. Каждый отрезок характеризуется двумя целыми числами \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le m\)) — координатами левого и правого концов.

Рассмотрим все целочисленные точки между \(1\) и \(m\) включительно. Ваша задача — вывести все точки из этого множества, не принадлежащие ни одному отрезку. Точка \(x\) принадлежит отрезку \([l; r]\) тогда и только тогда, когда \(l \le x \le r\).

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

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

Следующие \(n\) строк содержат по два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le m\)) — концы \(i\)-го отрезка. Отрезки могут пересекаться, вкладываться или даже совпадать друг с другом. Заметьте, что возможен случай \(l_i=r_i\), то есть отрезок может вырождаться в точку.

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

В первой строке выведите одно целое число \(k\) — количество точек, не принадлежащих ни одному отрезку.

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

Если оказывается, что таких точек нет вообще, выведите одно целое число \(0\) и либо оставьте вторую строку пустой, либо не выводите ее вообще.

Примечание

В первом тестовом примере точка \(1\) принадлежит второму отрезку, точка \(2\) принадлежит первому и второму отрезкам и точка \(5\) принадлежит третьему отрезку. Точки \(3\) и \(4\) не принадлежат ни одному отрезку.

Во втором тестовом примере все точки от \(1\) до \(7\) принадлежат первому отрезку.

A. Точки в отрезках

реализация *800

Задан набор из \(n\) отрезков на оси \(Ox\), каждый отрезок имеет целочисленные координаты концов от \(1\) до \(m\) включительно. Отрезки могут пересекаться, вкладываться или даже совпадать друг с другом. Каждый отрезок характеризуется двумя целыми числами \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le m\)) — координатами левого и правого концов.

Рассмотрим все целочисленные точки между \(1\) и \(m\) включительно. Ваша задача — вывести все точки из этого множества, не принадлежащие ни одному отрезку. Точка \(x\) принадлежит отрезку \([l; r]\) тогда и только тогда, когда \(l \le x \le r\).

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

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

Следующие \(n\) строк содержат по два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le m\)) — концы \(i\)-го отрезка. Отрезки могут пересекаться, вкладываться или даже совпадать друг с другом. Заметьте, что возможен случай \(l_i=r_i\), то есть отрезок может вырождаться в точку.

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

В первой строке выведите одно целое число \(k\) — количество точек, не принадлежащих ни одному отрезку.

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

Если оказывается, что таких точек нет вообще, выведите одно целое число \(0\) и либо оставьте вторую строку пустой, либо не выводите ее вообще.

Примечание

В первом тестовом примере точка \(1\) принадлежит второму отрезку, точка \(2\) принадлежит первому и второму отрезкам и точка \(5\) принадлежит третьему отрезку. Точки \(3\) и \(4\) не принадлежат ни одному отрезку.

Во втором тестовом примере все точки от \(1\) до \(7\) принадлежат первому отрезку.

B. Получение строки

реализация *1200

Задано две строки \(s\) и \(t\). Обе строки имеют длину \(n\) и состоят из строчных букв латинского алфавита. Символы в строках пронумерованы от \(1\) до \(n\).

Вы можете последовательно применять следующую операцию любое количество раз (возможно, нулевое):

  • поменять местами любые два смежных (соседних) символа строки \(s\) (то есть для любого \(i = \{1, 2, \dots, n - 1\}\) можно поменять местами \(s_i\) и \(s_{i + 1})\).

Нельзя применять операции к строке \(t\). Операции применяются к строке \(s\) одна за другой.

Ваша задача — получить строку \(t\) из строки \(s\). Необходимо найти любой способ сделать это с любым количеством операций, не превышающим \(10^4\).

Нет необходимости минимизировать количество операций, необходимо найти любую последовательность операций длины \(10^4\) или меньше, чтобы превратить строку \(s\) в строку \(t\).

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 50\)) — длина строк \(s\) и \(t\).

Вторая строка входных данных содержит строку \(s\), состоящую из \(n\) строчных букв латинского алфавита.

Третья строка входных данных содержит строку \(t\), состоящую из \(n\) строчных букв латинского алфавита.

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

Если невозможно при получить строку \(t\) при помощи применения описанных выше операций, выведите «-1».

Иначе в первой строке выведите одно целое число \(k\) — количество ходов, необходимое для того, чтобы превратить \(s\) в \(t\). Заметьте, что \(k\) должно быть целым числом от \(0\) до \(10^4\) включительно.

Во второй строке выведите \(k\) целых чисел \(c_j\) (\(1 \le c_j < n\)), где \(c_j\) означает, что \(j\)-й операций вы меняете местами \(s_{c_j}\) и \(s_{c_j + 1}\).

Если нет необходимости применять операции вообще, выведите одно целое число \(0\) и либо оставьте вторую строку пустой, либо не выводите ее вообще.

Примечание

В первом тестовом примере строка \(s\) изменяется следующим образом: «abcdef» \(\rightarrow\) «abdcef» \(\rightarrow\) «abdcfe» \(\rightarrow\) «abdfce» \(\rightarrow\) «abdfec».

Во втором тестовом примере невозможно получить из строки \(s\) строку \(t\) при помощи применения любых допустимых операций.

A. Тетрадь Смерти

жадные алгоритмы математика реализация *900

Вам досталась тетрадь, которая называется Тетрадь Смерти. В ней бесконечное количество страниц. На последней странице этой тетради (хех) написано правило. Оно гласит: «Вы должны записывать в эту тетрадь имена в течение \(n\) последовательных дней. В течение \(i\)-го дня вы должны записать ровно \(a_i\) имен.». Вы очень испугались (конечно вы испугались, кто бы не испугался, если бы он получил тетрадь, которая называется Тетрадь Смерти, с каким-то странным правилом, написанным в ней?).

Конечно же вы решили последовать этому правилу. Когда вы успокоились, вы разработали план, как именно вы будете записывать имена в тетрадь. Вы посчитали, что на каждой странице тетради можно записать ровно \(m\) имен. Вы начинаете записывать имена с первой страницы. Вы будете записывать имена на текущей страницу до тех пор, пока на ней умещается хотя бы еще одно имя. Когда текущая страница заканчивается, вы ее переворачиваете. Заметим, что вы всегда переворачиваете страницу, не важно, последний это день или нет. Если после какого-то дня на текущей странице умещается еще хотя бы одно имя, то на следующий день вы продолжите записывать имена с текущей страницы.

Теперь вас интересует следующий вопрос: сколько раз вы перевернете страницу в течение каждого дня? Вы заинтересованы в количестве переворотов страницы в течение каждого дня от \(1\) до \(n\).

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

Первая строка входных данных содержит два целых числа \(n\), \(m\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le m \le 10^9\)) — количество дней, в течение которых вы будете записывать имена в тетрадь, и количество номеров, которое можно записать на одной странице тетради.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)), где \(a_i\) означает количество имен, которое вы впишете в тетрадь в течение \(i\)-го дня.

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

Выведите \(n\) целых чисел \(t_1, t_2, \dots, t_n\), где \(t_i\) означает количество переворотов страницы в течение \(i\)-го дня.

Примечание

В первом тестовом примере страницы Тетради Смерти будут выглядеть так: \([1, 1, 1, 2, 2], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [3, 3, 3, 3]\). Каждое число в массиве означает, в какой именно день будет написано имя на соответствующей позиции. Хорошо видно, что вы должны перевернуть первую и вторую страницу в течение второго дня и третью страницу в течение третьего дня.

B. Вхождения в отрезках

Перебор реализация *1300

Заданы две строки \(s\) и \(t\), состоящие только из строчных латинских букв.

Подстрока \(s[l..r]\) — это такая строка, которая получается путем взятия \(s_l, s_{l + 1}, \dots, s_r\) без изменения порядка.

Каждое вхождение строки \(a\) в строку \(b\) — это такая позиция \(i\) (\(1 \le i \le |b| - |a| + 1\)), что \(b[i..i + |a| - 1] = a\) (\(|a|\) — это длина строки \(a\)).

Вам приходят \(q\) запросов: для \(i\)-го запроса необходимо посчитать количество вхождений строки \(t\) в подстроку \(s[l_i..r_i]\).

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

В первой строке записаны три целых числа \(n\), \(m\) и \(q\) (\(1 \le n, m \le 10^3\), \(1 \le q \le 10^5\)) — длина строки \(s\), длина строки \(t\) и количество запросов, соответственно.

Вторая строка — это строка \(s\) (\(|s| = n\)), состоящая только из строчных латинских букв.

Третья строка — это строка \(t\) (\(|t| = m\)), состоящая только из строчных латинских букв.

В каждой из следующих \(q\) строк записаны по два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le n\)) — параметры для \(i\)-го запроса.

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

Выведите \(q\) строк — в \(i\)-й строке должен содержаться ответ на \(i\)-й запрос, то есть количество вхождений строки \(t\) в подстроку \(s[l_i..r_i]\).

Примечание

В первом примере запросами является подстроки: «cod», «deforces», «fo» и «for», соответственно.

C. Вася и грибы

дп реализация *1800

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

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

Помогите Васе! Сообщите ему максимальный суммарный вес грибов, который он может собрать.

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

Первая строка содержит число n (1 ≤ n ≤ 3·105) — длина поляны.

Вторая строка содержит n чисел a1, a2, ..., an (1 ≤ ai ≤ 106) — скорость роста грибов в первом ряду поляны.

Третья строка содержит n чисел b1, b2, ..., bn (1 ≤ bi ≤ 106) — скорость роста грибов во втором ряду поляны.

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

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

Примечание

В первом тестовом примере оптимальный маршрут выглядит следующим образом:

Таким образом, собраный вес грибов будет 0·1 + 1·2 + 2·3 + 3·4 + 4·5 + 5·6 = 70.

Во втором тестовом примере оптимальный маршрут выглядит следующим образом:

Таким образом, собраный вес грибов будет 0·1 + 1·10 + 2·100 + 3·1000 + 4·10000 + 5·100000 = 543210.

A. Место в таблице

реализация *800

Джон Смит знает, что его сын, Томас Смит, один из лучших учеников не только в его классе, а и во всей школе. После того, как все ученики школы сдали экзамены по английскому языку, немецкому языку, математики и истории, была сформирована таблица результатов.

В таблице результатов расположены \(n\) учеников, каждый из которых имеет свой уникальный id (от \(1\) до \(n\)). У Томаса id \(1\). Каждый из учеников получил баллы по каждому из четырех предметов: английскому, немецкому, математики и истории. Ученики даны в порядке увеличения их id.

В таблице результатов ученики будут отсортированы по убыванию суммы их оценок. Это значит, что ученик с самой большой суммой балов займет первое место в таблице. Если два или более ученика имеют одинаковую сумму балов, то они будут отсортированы по увеличению их id.

Пожалуйста, помогите Джону понять, какое место займет его сын.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество учеников.

Каждая из следующих \(n\) строк содержит четыре целых числа \(a_i\), \(b_i\), \(c_i\) и \(d_i\) (\(0\leq a_i, b_i, c_i, d_i\leq 100\)) — оценки \(i\)-го ученика по английскому, немецкому, математики и истории. У \(i\)-го ученика номер id равен \(i\).

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

Выведите место Томаса в таблице. У Томаса id равен \(1\).

Примечание

В первом примере ученики получили такие оценки: \(398\), \(400\), \(398\), \(379\) и \(357\). Среди \(5\)-ти учеников Томас и третий ученик имеют вторую максимальную сумму, но поскольку Томас имеет меньший id, то он займет \(2\)-е место.

Во втором примере ученики получили такие оценки: \(369\), \(240\), \(310\), \(300\), \(300\) и \(0\). Среди \(6\) учеников Томас имеет максимальную сумму, поэтому он займет \(1\)-е место.

B. Биты

математика реализация *1200

Рудольф отправляется в замок. Перед тем, как попасть туда, сотрудники службы безопасности задали ему вопрос:

Задано два числа \(a\) и \(b\) в двоичной системе счисления, их длина равна \(n\). Сколько есть различных способов поменять местами два бита в числе \(a\) (только в \(a\), не в \(b\)) так, чтобы побитовое ИЛИ чисел изменилось? Другими словами, пусть \(c\) равно побитовому ИЛИ \(a\) и \(b\), тогда вам нужно найти количество способов поменять местами два бита в \(a\) так, чтобы побитовое ИЛИ не было равно \(c\).

Обратите внимание, что числа могут содержать ведущие нули, так что длина каждого числа равна \(n\).

Побитовое ИЛИ — это бинарная операция. Результат — это такое число, в двоичном представлении которого в каждом разряде стоит единица, если единица находится в двоичной записи хотя бы одного из аргументов. Например, \(01010_2\) ИЛИ \(10011_2\) = \(11011_2\).

К вашему удивлению, вы не Рудольф, и вам не нужно помогать ему\(\ldots\) Вы — сотрудник службы безопасности! Пожалуйста, найдите количество способов поменять местами два бита в \(a\) так, чтобы побитовое ИЛИ изменилось.

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

Первая строка содержит одно целое число \(n\) (\(2\leq n\leq 10^5\)) — количество битов в каждом числе.

Вторая строка содержит число \(a\) длиной \(n\) в двоичной системе счисления.

Третья строка содержит число \(b\) длиной \(n\) в двоичной системе счисления.

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

Выведите количество возможных способов поменять местами два бита в \(a\) так, чтобы побитовое ИЛИ изменилось.

Примечание

В первом примере вы можете поменять местами биты с такими индексами: \((1, 4)\), \((2, 3)\), \((3, 4)\) и \((3, 5)\).

Во втором примере вы можете поменять местами биты с такими индексами: \((1, 2)\), \((1, 3)\), \((2, 4)\), \((3, 4)\), \((3, 5)\) и \((3, 6)\).

B. Сумма цифр

реализация *1000

Посмотрев последний фильм про Гарри Поттера, маленький Геральд решил тоже попрактиковаться в магии. Он нашел в папиной магической книге заклинание, которое превращает любое число в его сумму цифр. И тут Геральду как раз попалось число n. Сколько раз Геральд сможет применить к нему заклинание до того, как число станет однозначным?

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

В первой строке записано единственное целое число n (0 ≤ n ≤ 10100000). Гарантируется, что n не содержит лидирующих нулей.

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

Выведите, сколько раз можно заменить число на его сумму цифр пока оно не станет однозначным.

Примечание

В первом тесте число уже однозначное — Геральд не сможет применить заклинание ни разу.

Во втором тесте дано число 10. После одного применения заклинания оно превратится в 1, и на этом процесс будет завершен. Таким образом, Геральд сможет применить заклинание один раз.

В третьем тесте дано число 991. При применении заклинания последует следующая цепочка превращений: 991 → 19 → 10 → 1. Число станет однозначным после трех превращений.

A. Соответствие шаблону с одним джокером

Перебор реализация Строки *1200

Задано две строки \(s\) и \(t\). Строка \(s\) состоит из строчных букв латинского алфавита и не более одного символа звездочки '*', строка \(t\) состоит только из строчных букв латинского алфавита. Длина строки \(s\) равна \(n\), длина строки \(t\) равна \(m\).

Символ зведочки '*' в строке \(s\) (если он есть) можно заменить на произвольную последовательность символов (возможно, пустую) строчных латинских букв. Другие символы строки \(s\) ни на что заменять нельзя. Если после такой замены в \(s\) можно получить строку \(t\), то говорят, что строка \(t\) соответствует шаблону \(s\).

Например, если \(s=\)«aba*aba», то такому шаблону соответствуют строки «abaaba», «abacaba», «abazzzzaba», но не соответствуют строки «ababa», «abcaaba», «codeforces», «aba1aba», «aba?aba».

Если строка \(t\) из соответствует шаблону \(s\), выведите «YES», иначе выведите «NO».

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

В первой строке входных данных записано два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — длина строки \(s\) и длина строки \(t\) соответственно.

Во второй строке входных данных записана строка \(s\) длины \(n\), состоящая из строчных букв латинского алфавита и не более одного символа звездочки '*'.

В третьей строке входных данных записана строка \(t\) длины \(m\), состоящая только из строчных букв латинского алфавита.

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

Выведите «YES» (без кавычек), если можно получить строку \(t\) из строки \(s\). В противном случае выведите «NO» (без кавычек).

Примечание

В первом тестовом примере символ звездочки '*' может быть заменен строкой «force». Таким образом, строка \(s\) после этой замены будет равна «codeforces», а ответ «YES».

Во втором тестовом примере символ звездочки '*' может быть заменен пустой строкой. Таким образом, строка \(s\) после этой замены будет равна «vkcup», а ответ «YES».

В третьем тестовом примере нет символа звездочки '*', а строки «v» и «k» не равны, таким образом ответ «NO».

В четвертом тестовом примере не существует такой замены символа звездочки '*', что вы сможете получить строку \(t\), таким образом ответ «NO».

A. Перекраска собачек

реализация сортировки *900

В комитете по стандартизации собачек паника — щенки из нового выводка умудрились родиться разноцветными! Всего в природе существует 26 различных цветов щенков и они обозначаются буквами от 'a' до 'z' включительно.

Свод правил комитета запрещает даже малейшие отличия между щенками, а потому сотруднику Славе поручили перекрасить часть щенков в другие цвета, тем самым устранив досадные расхождения. К сожалению, излишняя бюрократия и ограниченный бюджет привели к тому, что перекрашивать щенков можно лишь одним образом: выбрать цвет \(x\) такой, что на текущий момент существуют хотя бы два щенка цвета \(x\) (иначе это будет признано нецелевыми расходами), и перекрасить всех щенков цвета \(x\) в произвольный цвет \(y\). По счастью, операцию покраски можно применять неограниченное количество раз (в том числе нулевое).

Например, если количество щенков равно \(7\) и их цвета характеризуются строкой «abababc», то за одну операцию Слава может получить последовательности «zbzbzbc», «bbbbbbc», «aaaaaac», «acacacc» и другие. Однако, если текущая последовательность цветов равна «abababc», то выбрать \(x\)='c' прямо сейчас он не может, так как прямо сейчас только один щенок имеет цвет 'c'.

Помогите Славе и комитету понять, можно ли стандартизировать щенков, покрасив их всех в один цвет.

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

В первой строке задано число \(n\) (\(1 \le n \le 10^5\)) — количество щенков.

Далее следует строка \(s\) длины \(n\) из маленьких латинских букв, где \(i\)-я буква описывает цвет \(i\)-й щенка.

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

Если всех щенков можно перекрасить в один цвет, выведите «Yes».

Если же хотя бы двум щенкам суждено остаться разноцветными, выведите «No».

Выводите ответ без кавычек.

Примечание

В первом примере Слава может произвести следующие шаги:

  1. взять всех щенков цвета 'a' (их всего две штуки) и перекрасить их всех в цвет 'b';
  2. взять всех щенков цвета 'd' (их всего две штуки) и перекрасить их всех в цвет 'c';
  3. взять всех щенков цвета 'b' (обратите внимание, их теперь три штуки) и перекрасить их в цвет 'c'.

Во втором примере невозможно перекрасить ни одного щенка.

В третьем примере все щенки изначально имеют один и тот же цвет, поэтому перекрашивать никого не надо.

C. Пластилиновая зебра

Конструктив реализация *1600

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

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

Прежде чем приступать к самой лепке, Гриша может несколько раз (\(0\) или более) изменить порядок кусочков следующим образом: произвольно разрезать последовательность полосок на две части, развернуть каждую из частей и затем склеить их вновь. К примеру, если у Гриши были полоски в порядке «bwbbw» (здесь «b» означает черную полоску, а «w» — белую), то можно было бы разрезать последовательность как bw|bbw (черта обозначает место разреза), перевернуть и получить «wbwbb» после склеивания.

Помогите Грише найти максимально возможную длину зебры.

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

В единственной строке находится строка \(s\) (\(1 \le |s| \le 10^5\), где \(|s|\) обозначает длину строки \(s\)), состоящая из строчных латинских букв «b» и «w», которые обозначают черный и белый кусочки пластилина соответственно.

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

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

Примечание

В первом примере одна из возможных цепочек превращений выглядит как bwwwbww|bw \(\to\) w|wbwwwbwb \(\to\) wbwbwwwbw, что дает ответ, равный \(5\).

Во втором примере переупорядочивание полосок не улучшает ответ.

E. Цветные кубики

Конструктив матрицы реализация *2700

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

Вася вспомнил, что у него есть несложная головоломка: на шахматной доске размера \(n \times n\) находятся \(m\) цветных кубиков, причем \(m \leq n\), а все цвета кубиков различны. Каждый кубик занимает ровно одну клетку. Также для каждого кубика известна клетка доски, на которую его нужно поставить. Кубики хрупкие и их очень легко разбить, поэтому за одну операцию можно только бережно передвинуть один кубик на соседнюю по стороне клетку, если она свободна. Вася настолько аккуратен, что одна операция занимает у него целую секунду.

Вася специально тренировался к финалу VK Cup, поэтому его концентрации хватает максимум на \(3\) часа, то есть на \(10800\) секунд. Помогите Васе найти последовательность действий, которая приведет к тому, что все кубики окажутся на соответствующих клетках, но при этом будет достаточно короткой, чтобы Вася не потерял концентрацию и не разбил кубик.

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

Первая строка содержит два натуральных числа \(n\) и \(m\) (\(1 \leq m \leq n \leq 50\)) — размер доски и количество кубиков соответственно.

Каждая из следующих \(m\) строк содержит два натуральных числа \(x_i\), \(y_i\) (\(1 \leq x_i, y_i \leq n\)) — начальные позиции кубиков.

Следующие \(m\) строк описывают конечные позиции кубиков в том же формате и в том же порядке.

Гарантируется, что все начальные позиции кубиков попарно различны, все конечные позиции кубиков попарно различны, однако, начальные позиции некоторых кубиков могут совпадать с некоторыми конечными позициями.

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

В первой строке вывести число \(k\) (\(0 \le k \leq 10800\)) — количество действий Васи. В каждой из следующих \(k\) строк нужно описать одно действие — вывести четыре целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\), где \(x_1, y_1\) — позиция кубика, который двигает Вася, \(x_2, y_2\) — новая позиция этого кубика. Клетки \(x_1, y_1\) и \(x_2, y_2\) должны быть соседними по стороне, клетка \(x_2, y_2\) должна быть пустой перед выполнением операции.

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

Примечание

В четвертом примере выведенная последовательность действий (показана на рисунке ниже) является корректной, но не является кратчайшей. Существует решение, содержащее лишь \(3\) действия.

A. Палиндромная замена

реализация Строки *1000

Задана строка \(s\), состоящая из \(n\) строчных букв латинского алфавита. \(n\) всегда четно.

Для каждой позиции \(i\) (\(1 \le i \le n\)) в строке \(s\) вам необходимо заменить букву на этой позиции либо на предыдущую в алфавитном порядке, либо на следующую (для букв 'a' и 'z' доступен только один вариант). Буква на каждой позиции должна быть изменена ровно один раз.

Например, буква 'p' должна быть изменена либо на 'o', либо на 'q', буква 'a' должна быть изменена на 'b', и буква 'z' должна быть изменена на 'y'.

Таким образом, строка «codeforces», например, может быть изменена на «dpedepqbft» ('c' \(\rightarrow\) 'd', 'o' \(\rightarrow\) 'p', 'd' \(\rightarrow\) 'e', 'e' \(\rightarrow\) 'd', 'f' \(\rightarrow\) 'e', 'o' \(\rightarrow\) 'p', 'r' \(\rightarrow\) 'q', 'c' \(\rightarrow\) 'b', 'e' \(\rightarrow\) 'f', 's' \(\rightarrow\) 't').

Строка \(s\) называется палиндромом, если она читается одинаково как слева направо, так и справа налево. Например, строки «abba» и «zz» — палиндромы, а строки «abca» и «zy» — нет.

Ваша задача — проверить, что можно сделать строку \(s\) палиндромом, применив выше приведенные замены к каждой позиции. Выведите «YES», если строку \(s\) можно сделать палиндромом. В противном случае выведите «NO».

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

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

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

Затем следуют \(2T\) строк — строки \((2i - 1)\) и \(2i\) описывают \(i\)-ю строку. В первой строке пары записано одно целое число \(n\) (\(2 \le n \le 100\), \(n\) четно) — длина соответствующей строки. Во второй строке пары содержится строка \(s\), состоящая из \(n\) строчных букв латинского алфавита.

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

Выведите \(T\) строк. \(i\)-я строка должна содержать ответ для \(i\)-й строки входных данных. Выведите «YES», если \(i\)-ю строку можно сделать палиндромом, применив выше приведенные замены к каждой позиции. В противном случае выведите «NO».

Примечание

Первая строка примера может быть изменена на «bcbbcb», две самых левых буквы и две самых правых буквы заменяются на соответствующие следующие по алфавиту буквы, две центральные заменяются на предыдущие.

Вторая строка может быть изменена на «be», «bg», «de», «dg», но ни одна из этих строк не является палиндромом.

Третья строка может быть изменена на палиндром «beeb».

Пятая строка может быть изменена на «lk», «lm», «nk», «nm», но ни одна из этих строк не является палиндромом. Также обратите внимание, что нельзя оставить букву без изменений, поэтому нельзя получить строки «ll» или «mm».

B. Числа на шахматной доске

математика реализация *1200

Задана шахматная доска размера \(n \times n\). Она заполнена числами от \(1\) до \(n^2\) следующим образом: первые \(\lceil \frac{n^2}{2} \rceil\) чисел от \(1\) до \(\lceil \frac{n^2}{2} \rceil\) записаны в клетках с четной суммой координат слева направо сверху вниз. Оставшиеся \(n^2 - \lceil \frac{n^2}{2} \rceil\) чисел от \(\lceil \frac{n^2}{2} \rceil + 1\) до \(n^2\) записаны в клетках с нечетной суммой координат в порядке слева направо сверху вниз. Операция \(\lceil\frac{x}{y}\rceil\) означает деление \(x\) на \(y\) с округлением вверх.

Например, левая доска на картинке ниже — эта шахматная доска, которая задана для \(n=4\), а правая доска — это шахматная доска, которая задана для \(n=5\).

Также задано \(q\) запросов. \(i\)-й запрос описывается парой \(x_i, y_i\). Ответ на \(i\)-й запрос — это число, записанное в клетке \(x_i, y_i\) (\(x_i\) это строка, \(y_i\) это столбец). Строки и столбцы пронумерованы от \(1\) до \(n\).

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

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n \le 10^9\), \(1 \le q \le 10^5\)) — размер доски и количество запросов.

Следующие \(q\) строк содержат по два целых числа каждая. \(i\)-я строка содержит два целых числа \(x_i, y_i\) (\(1 \le x_i, y_i \le n\)) — описание \(i\)-го запроса.

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

Для каждого запроса от \(1\) до \(q\) выведите ответ на него. Ответом на \(i\)-й запрос является число, записанное в клетке \(x_i, y_i\) (\(x_i\) это строка, \(y_i\) это столбец). Строки и столбцы пронумерованы от \(1\) до \(n\). Запросы пронумерованы от \(1\) до \(q\) в порядке их описания во входных данных.

Примечание

Ответы на запросы из тестовых примеров находятся на досках на картинке из условия задачи.

A. Найди квадрат

реализация *800

Рассмотрим таблицу размера \(n \times m\) клеток, изначально полностью белую. Строки нумеруются от \(1\) до \(n\) сверху вниз, а столбы от \(1\) до \(m\) слева направо. Некоторый квадрат со стороной нечётной длины был покрашен в чёрный цвет. Найдите центр этого квадрата.

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(1 \le n, m \le 115\)) — количество строк и столбцов таблицы соответственно.

В \(i\)-й из \(n\) последующих строк содержится \(m\) символов \(s_{i1} s_{i2} \ldots s_{im}\) (\(s_{ij}\) равен «W» для белых ячеек и «B» для чёрных ячеек), описывающие \(i\)-ю строку таблицы.

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

Выведите два целых числа \(r\) и \(c\) (\(1 \le r \le n\), \(1 \le c \le m\)) через пробел — номер строки и столбца центра чёрного квадрата.

C. Прямоугольники

геометрия реализация сортировки *1600

На плоскости даны \(n\) прямоугольников, которые заданы координатами своих левого нижнего и правого верхнего углов. Известно, что некоторые \((n-1)\) из этих \(n\) прямоугольников имеют хотя бы одну общую точку. Точка принадлежит прямоугольнику, если она находится строго внутри прямоугольника или на его границе.

Найдите любую точку с целыми координатами, которая принадлежит хотя бы \((n-1)\) прямоугольнику из заданных.

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

В первой строке задано число \(n\) (\(2 \le n \le 132\,674\)) — количество прямоугольников.

В следующих \(n\) строках заданы прямоугольники четверками целых чисел: \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(-10^9 \le x_1 < x_2 \le 10^9\), \(-10^9 \le y_1 < y_2 \le 10^9\)).

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

Выведите два целых числа \(x\), \(y\) — координаты произвольной точки на плоскости, принадлежащей хотя бы \((n-1)\) прямоугольнику.

Примечание

Рисунок ниже показывает расположение прямоугольников в первом и втором тестах из примера. Возможные ответы выделены.

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

A. Много одинаковых подстрок

реализация Строки *1300

Задана строка \(t\) длины \(n\), состоящая из строчных букв латинского алфавита, и целое число \(k\).

Определим подстроку какой-либо строки \(s\) с индексами от \(l\) до \(r\) как \(s[l \dots r]\).

Ваша задача — составить такую строку \(s\) минимальной возможной длины, что в ней существует ровно \(k\) позиций \(i\) таких, что \(s[i \dots i + n - 1] = t\). Другими словами, ваша задача — составить такую строку \(s\) минимальной возможной длины, что ровно \(k\) подстрок строки \(s\) равны \(t\).

Гарантируется, что существует один возможный ответ.

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

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n, k \le 50\)) — длину строки \(t\) и количество подстрок.

Вторая строка входных данных содержит строку \(t\), состоящую ровно из \(n\) строчных букв латинского алфавита.

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

Выведите такую строку \(s\) минимально возможной длины, что ровно \(k\) подстрок строки \(s\) равны \(t\).

Гарантируется, что существует один возможный ответ.

D. Склеенные множители

математика реализация *1900

Задан массив \(a\), состоящий из \(n\) положительных целых чисел.

Назовем конкатенацией чисел \(x\) и \(y\) такое число, что оно получается при записывании чисел \(x\) и \(y\) подряд без изменения порядка. Например, конкатенация чисел \(12\) и \(3456\) — это число \(123456\).

Посчитайте количество упорядоченных пар позиций \((i, j)\) (\(i \neq j\)) в массиве \(a\) таких, что конкатенация \(a_i\) и \(a_j\) делится на \(k\).

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

В первой строке записаны два целых числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5\), \(2 \le k \le 10^9\)).

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

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

Выведите одно целое число — количество упорядоченных пар позиций \((i, j)\) (\(i \neq j\)) в массиве \(a\) таких, что конкатенация \(a_i\) и \(a_j\) делится на \(k\).

Примечание

В первом примере пары \((1, 2)\), \((1, 3)\), \((2, 3)\), \((3, 1)\), \((3, 4)\), \((4, 2)\), \((4, 3)\) подходят. Они образуют числа \(451\), \(4510\), \(110\), \(1045\), \(1012\), \(121\), \(1210\), соответственно, каждое из них делится на \(11\).

Во втором примере все \(n(n - 1)\) пар подходят.

В третьем примере ни одна пара не подходит.

A. Проверка штанов на унылость

жадные алгоритмы математика реализация *1100

Реквестирую набор задач про штаны шахтера.
freopen

Обычный среднестатистический шахтер Ваганыч проходит курсы повышения квалификации. По завершении этих курсов все шахтеры должны сдать экзамены, самый сложный из которых — компьютерный тест «Проверка штанов на унылость».

Тест состоит из n вопросов, отвечать на них необходимо строго по порядку: с 1-го до n-го. В i-ом вопросе ai вариантов ответа, ровно один из которых является верным.

Кликом считается выбор любого ответа в любом вопросе. Задача Ваганыча — выбрать верный ответ на каждый вопрос. Если на какой-то вопрос дан неверный ответ, то все выбранные ответы сбрасываются, и тест начинается с самого начала, с первого вопроса. Но при этом шахтер запоминает все свои действия. Порядок ответов, сами ответы в пределах одного вопроса и порядок самих вопросов не меняются.

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

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

В первой строке дано целое число n (1 ≤ n ≤ 100) — количество вопросов в тесте. Во второй строке записаны через пробел n целых чисел ai (1 ≤ ai ≤ 109) — количество вариантов ответа на i-ый вопрос.

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

Выведите одно число — минимальное количество кликов, требуемое для прохождения теста в худшем случае.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

Пояснение ко второму примеру. В худшем случае потребуется пять кликов:

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

A. В поисках простой задачи

реализация *800

Начиная очередной чемпионат, координаторы Codeforces всегда стараются сделать первую задачу максимально простой. В этот раз координатор выбрал некоторую задачу и спросил у \(n\) человек, достаточно ли она простая. Каждый человек ответил, что задача простая, или что задача сложная.

Если хоть кто-то из этих \(n\) человек ответил, что задача сложная, ее нужно заменить, иначе не нужно. По данным ответам определите, нужно ли заменить задачу.

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

В первой строке задано одно целое число \(n\) (\(1 \le n \le 100\)) — количество опрошенных человек.

Во второй строке заданы \(n\) целых чисел, каждое из которых равно либо \(0\), либо \(1\) — ответы опрошенных. Если \(i\)-е число равно \(0\), то \(i\)-й человек считает задачу простой, а если оно равно \(1\), то \(i\)-й человек считает задачу сложной.

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

Выведите одно слово: «EASY», если задача по мнению всех опрошенных является легкой, либо «HARD», если хотя бы один опрошенный считает задачу сложной.

Вы можете выводить каждую из букв в любом регистре (как строчную или как заглавную): «EASY», «easy», «EaSY» и «eAsY» будут распознаны корректно.

Примечание

В первом примере третий человек считает, что задача слишком сложная, поэтому ее надо заменить.

Во втором примере единственный человек считает, что задача простая, поэтому ее не обязательно заменять.

C. Вася и золотой билет

реализация *1300

Недавно Вася нашел золотой билет — последовательность из \(n\) цифр \(a_1a_2\dots a_n\). Вася считает билет счастливым, если его можно разбить на два или более непересекающихся отрезка с одинаковой суммой цифр на каждом отрезке. Например, билет \(350178\) счастливый, т. к. его можно разбить на три отрезка \(350\), \(17\) и \(8\): \(3+5+0=1+7=8\). Заметим, что каждая цифра должна принадлежать ровно одному отрезку.

Помогите Васе! Сообщите ему, является ли найденный им золотой билет счастливым.

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

В первой строке содержится целое число \(n\) (\(2 \le n \le 100\)) — количество цифр в билете.

Вторая строка содержит \(n\) цифр \(a_1 a_2 \dots a_n\) (\(0 \le a_i \le 9\)) — сам билет. Цифры записаны без пробелов.

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

В единственной строке выведите «YES», если найденный Васей билет является счастливым. В противном случае выведите «NO» (в любом случае без учета регистра).

Примечание

В первом примере билет можно разбить на \(7\), \(34\) и \(52\): \(7=3+4=5+2\).

Во втором примере невозможно разбить билет на равные по сумме цифр отрезки.

A. Золотая тарелка

математика реализация *800

У вас есть тарелка, на которую надо нанести позолоту. Тарелка представляет собой прямоугольник, который мы представляем как таблицу из \(w\times h\) клеток. Всего должно быть \(k\) позолоченных колец, первое из которых должно идти по периметру тарелки, второе — отступать \(2\) клетки от края, и так далее. Каждое кольцо имеет толщину в \(1\) клетку. Более формально, \(i\)-е из колец должно идти содержать все крайние клетки внутреннего прямоугольника \((w - 4(i - 1))\times(h - 4(i - 1))\).

Картинка соответствует третьему примеру.

Ваша цель — узнать, сколько клеток будет позолочено.

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

Первая строка содержит три целых числа \(w\), \(h\) и \(k\) (\(3 \le w, h \le 100\), \(1 \le k \le \left\lfloor \frac{min(n, m) + 1}{4}\right\rfloor\), где \(\lfloor x \rfloor\) означает округление вниз числа \(x\)) — количество строк, столбцов и колец, соответственно.

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

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

Примечание

Первый пример показан на рисунке ниже.

Второй пример показан на рисунке ниже.

Третий пример показан на рисунке в постановке задачи.

D. Барселонское расстояние

геометрия реализация *1900

В этой задаче мы рассматриваем упрощённую модель города Барселона.

Барселона может быть представлена как плоскость, а её улицы — как прямые вида \(x = c\) и \(y = c\) для любого целого числа \(c\) (то есть, улицы представляют собой прямоугольную сетку). Однако есть кое-что, что отличает Барселону от Манхеттена, а именно, проспект, который называется Avinguda Diagonal (Диагональный проспект) и который может быть представлен на плоскости как множество точек \((x, y)\), удовлетворяющих \(ax + by + c = 0\).

Перемещаться по городу можно только по улицам, в том числе и по Диагональному проспекту. Вам даны точки \(A\) и \(B\) в Барселоне. Найдите минимальное расстояние, которое необходимо пройти, чтобы попасть в точку \(B\) из точки \(A\).

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

Первая строка содержит три целых числа \(a\), \(b\) и \(c\) (\(-10^9\leq a, b, c\leq 10^9\), at хотя бы одно из чисел \(a\) и \(b\) не равно нулю), задающих Диагональный проспект.

Следующая строчка содержит четыре целых числа \(x_1\), \(y_1\), \(x_2\) и \(y_2\) (\(-10^9\leq x_1, y_1, x_2, y_2\leq 10^9\)), задающих точки \(A = (x_1, y_1)\) и \(B = (x_2, y_2)\).

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

Найдите минимальное расстояние, которое необходимо пройти от \(A\) до \(B\). Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не превосходит \(10^{-6}\).

Формально, пусть ваш ответ равен \(a\), а ответ жюри равен \(b\). Ваш ответ будет зачтен, если и только если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).

Примечание

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

A. Побег короля

графы поиск в глубину и подобное реализация *1000

Алиса и Боб играют в шахматы на большом поле с размерами \(n \times n\). У Алисы осталась только одна фигура — ферзь, который находится в позиции \((a_x, a_y)\), а у Боба остался только король, расположенный на \((b_x, b_y)\). Алиса считает, что поскольку её ферзь доминирует на поле, то победа уже её.

Но Боб придумал хитрый план, который принесет ему победу, для этого ему нужно передвинуть его короля на позицию \((c_x, c_y)\). Поскольку Алису отвлекает её чувство превосходства, она больше не передвигает её фигуру, поэтому только Боб может передвигать его фигуру.

Боб победит, если он может передвинуть его короля с позиции \((b_x, b_y)\) на \((c_x, c_y)\), не попадая под шах. Не забудьте, что король может передвигаться только в соседние \(8\) ячеек. Король находится под шахом, если находится в той же строке, столбце или диагонали, что и ферзь.

Определите, сможет ли Боб победить или нет.

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

Первая строка содержит одно целое число \(n\) (\(3 \leq n \leq 1000\)) — размеры шахматного поля.

Вторая строка содержит два целых числа \(a_x\) и \(a_y\) (\(1 \leq a_x, a_y \leq n\)) — координаты ферзя Алисы.

Третья строка содержит два целых числа \(b_x\) и \(b_y\) (\(1 \leq b_x, b_y \leq n\)) — координаты короля Боба.

Четвёртая строка содержит два целых числа \(c_x\) и \(c_y\) (\(1 \leq c_x, c_y \leq n\)) — координаты позиции, куда Боб хочет передвинуть его короля.

Гарантируется, что король Боба не находится под шахом и то, что конечная точка тоже не под шахом.

Кроме того, король не находится на том же квадрате, что и ферзь (то есть \(a_x \neq b_x\) или \(a_y \neq b_y\)), и конечная точка не совпадает ни с позицией ферзя (то есть \(c_x \neq a_x\) или \(c_y \neq a_y\)), ни с позицией короля (то есть \(c_x \neq b_x\) или \(c_y \neq b_y\)).

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

Выведите «YES» (без кавычек), если Боб может попасть из позиции \((b_x, b_y)\) в \((c_x, c_y)\), не попадая под шах, иначе выведите «NO».

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

На приведенных ниже рисунках квадраты, контролируемые черным ферзем, отмечены красным цветом, а квадрат, куда Боб хочет передвинуть короля, обозначен синим.

В первом примере король может достичь цели, например, через квадраты \((2, 3)\) и \((3, 2)\). Обратите внимание, что прямой маршрут через \((2, 2)\) попадает под шах.

Во втором примере ферзь контролирует четвёртую строку, и король не может её пересечь.

В третьем примере ферзь контролирует третий столбец.

A. Равенство

реализация Строки *800

Вам дана строка \(s\) длины \(n\), которая содержит только первые \(k\) букв латинского алфавита. Все буквы в строке \(s\) заглавные.

Строка называется подпоследовательностью строки \(s\), если она получается удалением из \(s\) нескольких символов без изменения порядка остальных символов. Например, «ADE» и «BD» являются подпоследовательностями «ABCDE», а «DEA» — нет.

Подпоследовательность \(s\) называется хорошей, если каждая из первых \(k\) букв алфавита встречается одинаковое число раз.

Найдите длину самой длинной хорошей подпоследовательности \(s\).

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

Первая строка входных данных содержит целые числа \(n\) (\(1\le n \le 10^5\)) и \(k\) (\(1 \le k \le 26\)).

Вторая строка входных данных содержит строку \(s\) длины \(n\). Строка \(s\) содержит только заглавные латинские буквы от 'A' до \(k\)-й буквы латинского алфавита.

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

Выведите одно целое число — длину самой длинной хорошей подпоследовательности строки \(s\).

Примечание

В первом примере, подпоследовательность «ACBCAB» («ACAABCCAB») является одной из подпоследовательностей содержащей одинаковое число 'A', 'B' и 'C'. Подпоследовательность «CAB» тоже содержит одинаковое число этих букв, но не является максимальной по длине.

Во втором примере, ни одна из подпоследовательность не может содержать 'D', а значит ответ равен \(0\).

D. Слизняки

дп жадные алгоритмы реализация *1800

Есть ряд из \(n\) слизней. У каждого слизня есть некоторая целочисленная ценность, связанная с ним (ценность может быть также меньше нуля или равна нулю).

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

Когда слизень с ценностью \(x\) съедает слизня со значением \(y\), то съеденный слизень исчезает, а ценность оставшегося слизня становится равной \(x - y\).

Слизни будут есть друг друга, пока не останется ровно один слизень.

Выясните какая наибольшая возможная ценность может оказаться у последнего слизня.

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

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

Вторая строка содержит \(n\) целых чисел \(a_i\) (\(-10^9 \le a_i \le 10^9\)), где \(a_i\) — это ценность \(i\)-го слизня.

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

Выведите одно число — наибольшую возможную ценность у последнего слизня.

Примечание

В первом примере одним из способов получить последнего слизня с ценностью \(4\) следующий:

  • Второй слизень съедает третьего, ряд теперь содержит слизней \(2, -1, 1\)
  • Второй слизень съедает третьего, ряд теперь содержит слизней \(2, -2\)
  • Первый слизень съедает второго, ряд теперь содержит одного слизня \(4\)

Во втором примере первый слизень может есть слизней слева направо, тем самым получая итоговую ценность \(4\).

A. Блэкджек

реализация *800

Дождливым пасмурным вечером, когда все модули попрятались по ближайшим кафетериям, попивая горячие энергококтейли, вирус Хексадесимал решила пролететь над Мэйнфреймом в поисках Гениальной Идеи. И Гениальная Идея нашлась!

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

В Мэйнфрейме в блэкджек играют стандартной колодой из 52-х карт, содержащей 13 значений — 2, 3, 4, 5, 6, 7, 8, 9, 10, валеты, дамы, короли, тузы — каждой из четырех мастей — черви, бубны, трефы и пики. Значения очков каждой карты: от двойки до десятки — соответственно от 2 до 10, у туза — 1 или 11 по желанию игрока, у картинок (король, дама, валет) — 10. Значение очков карты не зависит от масти. Правила игры предельно просты. Игрок получает две карты, если сумма очков этих карт равна n, то игрок победил, иначе — проиграл.

Игрок уже получил первую карту — это дама пик. Чтобы оценить шансы на победу, нужно определить, сколько существует способов получить вторую карту так, чтобы сумма очков была равна именно n.

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

В единственной строке дано n (1 ≤ n ≤ 25) — требуемая сумма очков.

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

Выведите, сколько способов существует получить вторую карту требуемым образом, если первая карта — дама пик.

Примечание

В первом примере для получения требуемой суммы подходят только четыре двойки разных мастей.

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

В третьем примере не существует карт, добавляющих ноль очков к текущим десяти.

A. Кража в магазине

жадные алгоритмы реализация сортировки *800

В магазине компьютерной техники ночью произошла кража.

До этого все клавиатуры, которые продавались в магазине, были пронумерованы по очереди, начиная с некоторого натурального числа \(x\). Например, если \(x = 4\) и в магазине продавалось \(3\) клавиатуры, то они имели номера \(4\), \(5\) и \(6\), а если \(x = 10\) и в магазине продавалось \(7\) клавиатур, то они имели номера \(10\), \(11\), \(12\), \(13\), \(14\), \(15\) и \(16\).

После кражи в магазине осталось \(n\) клавиатур с номерами \(a_1, a_2, \dots, a_n\). Определите минимальное количество клавиатур, которые могли быть украдены, если никто из сотрудников магазина не помнит значение \(x\).

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

Первая строка содержит одно целое число \(n\) \((1 \le n \le 1\,000)\) — количество оставшихся в магазине клавиатур.

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

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

Выведите минимальное количество клавиатур, которые могли быть украдены, если никто из сотрудников магазина не помнит значение \(x\).

Примечание

В первом примере, если \(x=8\), то минимальное количество клавиатур, украденных из магазина, равно \(2\). То есть были украдены компьютеры с номерами \(9\) и \(11\).

Во втором примере, если \(x=4\), то ни одна клавиатура не была украдена из магазина.

A. Лавочки

Бинарный поиск реализация *1100

В берляндском парке есть \(n\) лавочек. Про каждую лавочку известно количество людей \(a_i\), которые уже сидят на \(i\)-й лавочке. Известно, что в ближайшее время в парк придут ещё \(m\) человек, каждый из которых сядет на одну из \(n\) лавочек.

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

Считайте, что никто из посетителей парка не будет вставать с лавочек.

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

В первой строке следует целое число \(n\) \((1 \le n \le 100)\) — количество лавочек в парке.

Во второй строке следует целое число \(m\) \((1 \le m \le 10\,000)\) — количество людей, которые ещё придут в парк и сядут на лавочки.

В следующих \(n\) строках следует по одному целому числу \(a_i\) \((1 \le a_i \le 100)\) — количество людей, которые изначально сидят на \(i\)-й лавочке.

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

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

Примечание

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

Во втором примере минимальная величина \(k\) равна \(15\) и максимальная величина \(k\) равна \(15\), так как в парке есть всего одна лавочка и все \(10\) новых человек сядут именно на неё.

B. Витамины

битмаски дп Перебор реализация *1200

В берляндском магазине есть \(n\) видов сока. Каждый сок характеризуется своей ценой \(c_i\), а также витаминами, которые в нём содержатся. В Берляндии есть всего три типа витаминов: витамин «A», витамин «B» и витамин «C». В каждом соке может быть один, два или все три витамина.

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

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

В первой строке следует целое число \(n\) \((1 \le n \le 1\,000)\) — количество видов сока.

В каждой из следующих \(n\) строк следует целое число \(c_i\) \((1 \le c_i \le 100\,000)\) и строка \(s_i\) — цена \(i\)-го сока и описание витаминов, которые в нём есть. Строка \(s_i\) имеет длину от \(1\) до \(3\) и состоит из букв «A», «B» и «C». Гарантируется, что каждая буква встречается в каждой строке \(s_i\) не более одного раза. Порядок букв в строках \(s_i\) произвольный.

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

Если Петя не сможет получить каждый из трёх витаминов, выведите -1. В противном случае выведите минимальную стоимость соков, которые Петя может купить, чтобы получить каждый из трёх витаминов.

Примечание

В первом примере Петя должен купить первый, второй и четвертый сок. Тогда он потратит \(5 + 6 + 4 = 15\) и получит все три витамина. Также он может купить только третий сок и получить все три витамина, но это невыгодно, так как третий сок стоит \(16\).

Во втором примере Петя не сможет получить все три витамина, так как витамина «C» нет ни в одном соке.

A. Выборы

математика реализация *800

Аурук принимает участие в выборах в своей школе. Это последний раунд. У него есть ровно один оппонент — Элодрейп. В школе есть ровно \(n\) студентов. У каждого студента есть ровно \(k\) голосов и он обязан использовать их все. Тем самым, Аурук понимает, что если какой-то человек отдаёт \(a_i\) голосов за Элодрейпа, то ему достанется \(k - a_i\) голосов от этого человека. Конечно, должно выполняться \(0 \le k - a_i\).

Аурук знает, что если он проиграет, то его жизнь всё равно что кончится. Он поговорил со своими друзьями и теперь знает \(a_1, a_2, \dots, a_n\) — сколько голосов каждый школьник отдаст за Элодрейпа. Теперь он хочет поменять число \(k\), чтобы выиграть выборы. Он понимает, что чем больше \(k\), тем больше шансов, что кто-то заметит неладное, и что его дисквалифицируют.

Тем самым, Аурук знает \(a_1, a_2, \dots, a_n\) — сколько голосов каждый из школьников отдаст его оппоненту. Помогите ему выбрать наименьшее \(k\), которое приведёт к его выигрышу. Чтобы выиграть, Аурук должен набрать строго больше голосов, чем Элодрейп.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество школьников в школе.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 100\)) — количество голосов, которые отдаст Элодрейпу каждый школьник.

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

Выведите минимальное число \(k\) (\(k \ge \max a_i\)), которое приводит к победе Аурука. Чтобы выиграть, Аурук должен набрать строго больше голосов, чем Элодрейп.

Примечание

В первом примере Элодрейп получает \(1 + 1 + 1 + 5 + 1 = 9\) голосов. Наименьшее выигрышное \(k\) равно \(5\) (и оно заведомо не может быть меньше из-за четвёртого человека), и оно приводит к \(4 + 4 + 4 + 0 + 4 = 16\) голосам за Аурука, чего достаточно, чтобы выиграть.

Во втором примере Элодрейп получает \(11\) голосов. Если \(k = 4\), то Аурук получает \(9\) голосов и проигрывает Элодрейпу.

B. Потерянный массив

реализация *1200

Байтек, славящийся своими необычными подарками, недавно получил в подарок массив целых чисел \(x_0, x_1, \ldots, x_{k-1}\).

К сожалению, после фантастической вечеринки, посвящённой этому массиву, он осознал, что он его потерял. После нескольких часов поисков новой игрушки, Байтек обнаружил на сайте производителя массива \(x\) другой массив \(a\) длины \(n + 1\). Согласно формальному описанию \(a\), \(a_0 = 0\), а для всех остальных \(i\) (\(1 \le i \le n\)) \(a_i = x_{(i-1)\bmod k} + a_{i-1}\), где \(p \bmod q\) обозначает остаток от деления \(p\) на \(q\).

Например, если \(x = [1, 2, 3]\) и \(n = 5\), то:

  • \(a_0 = 0\),
  • \(a_1 = x_{0\bmod 3}+a_0=x_0+0=1\),
  • \(a_2 = x_{1\bmod 3}+a_1=x_1+1=3\),
  • \(a_3 = x_{2\bmod 3}+a_2=x_2+3=6\),
  • \(a_4 = x_{3\bmod 3}+a_3=x_0+6=7\),
  • \(a_5 = x_{4\bmod 3}+a_4=x_1+7=9\).

Таким образом, если \(x = [1, 2, 3]\) и \(n = 5\), то \(a = [0, 1, 3, 6, 7, 9]\).

Байтек надеется, что, зная массив \(a\), он сможет восстановить массив \(x\). Зная, что \(1 \le k \le n\), помогите ему и найдите все возможные значения \(k\) — возможные длины потерянного массива.

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

Первая строка содержит ровно одно целое число \(n\) (\(1 \le n \le 1000\)) — длину массива \(a\), исключая элемент \(a_0\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^6\)).

Обратите внимание, что \(a_0\) всегда равно \(0\) и не дано во входных данных.

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

Первая строка выходных данных должна содержать одно целое число \(l\), обозначающее количество подходящих длин потерянного массива.

Вторая строка должна содержать ровно \(l\) целых чисел — возможные длины потерянного массива в возрастающем порядке.

Примечание

В первом примере возможны любые значения \(k\), так как \(a\) является арифметической прогрессией.

Возможны следующие массивы:

  • \([1]\)
  • \([1, 1]\)
  • \([1, 1, 1]\)
  • \([1, 1, 1, 1]\)
  • \([1, 1, 1, 1, 1]\)

Во втором примере массив Байтека может содержать три или пять элементов.

Возможные массивы \(x\):

  • \([1, 2, 2]\)
  • \([1, 2, 2, 1, 2]\)

Например, \(k = 4\) не подходит, потому что это приводит к тому, что \(6 + x_0 = 8\) а также \(0 + x_0 = 1\), что является очевидным противоречием.

В третьем примере подходит только \(k = n\).

Массив \([1, 4, -2]\) удовлетворяет всем требованиям.

Обратите внимание, что значения \(x_i\) могут быть отрицательными.

C. Наименьшее слово

жадные алгоритмы Конструктив реализация *1500

У IA есть невероятно много цветных магнитиков на её холодильнике. На каждом магнитике написана одна буква «a» или «b». Она любит играть с ними, располагая все магнитики в ряд. Однако девочка быстро устаёт и начинает думать, как сделать её развлечение ещё более интересным.

Сегодня, когда IA взглянула на холодильник, она заметила, что слово, образованное магнитиками, выглядит достаточно сомнительно. «Пожалуй, будет гораздо лучше, если я поменяю некоторые из них местами, — думает она, — но как это сделать?». Через некоторое время к ней пришла неплохая идея. IA будет рассматривать все префиксы с длинами от \(1\) до длины всего слова и для каждого префикса будет выбирать, стоит ли его развернуть или оставить как есть. Она будет рассматривать префиксы в фиксированном порядке: начнет с кратчайшего и закончит самым длинным. Она хочет получить в итоге лексикографически минимальное возможное слово. Можете ли вы помочь ей, сказав, какие именно из префиксов следует развернуть?

Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов:

  • \(a\) — префикс \(b\), но \(a \ne b\);
  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Входные данные

Первая и единственная строка содержит строку \(s\) (\(1 \le |s| \le 1000\)), задающую исходную строку, образованную магнитиками. Строка \(s\) состоит только из символов «a» и «b».

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

Выведите ровно \(|s|\) целых чисел. Если IA следует развернуть \(i\)-й префикс (то есть подстроку с индексами от \(1\) до \(i\)), то \(i\)-е число должно быть равно \(1\), иначе оно должно быть равно \(0\).

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

Примечание

В первом примере IA может развернуть второй и третий префикс, получив строку «abbb». Она не может получить ответ лучше, так как это наименьшая строка, которую можно получить перестановкой символов в исходной строке.

Во втором примере, она может перевернуть любое подмножество префиксов — все буквы равны «a».

E. Сортировка сетки

реализация *3100

Вам задана сетка \(n \times m\). Каждая ячейка сетки имеет свой уникальный номер от \(1\) до \(nm\), то есть номера во всех ячейках разные.

За одну операцию вы можете выбрать цикл и переместить все числа на одну позицию. Здесь цикл представляет собой любую последовательность, для которой выполняются условия:

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

Например, если бы у нас была следующая сетка:

Мы могли бы, например, выбрать такой цикл:

И получили бы такую сетку:

В этом конкретном случае, выбранный цикл может быть представлен как последовательность \([1, 2, 3, 6, 5, 8, 7, 4]\), в которой числа расположены в том направлении, в котором мы хотим их сместить.

Найдите любую последовательность операций, которая отсортирует сетку так, чтобы массив, созданный путем объединения строк от верхней до нижней, был отсортирован (посмотрите на первый рисунок сверху).

Обратите внимание, что вам не нужно минимизировать количество операций или сумму всех длин циклов. Единственное ограничение состоит в том, что сумма всех длин циклов не должна быть больше, чем \(10^5\).

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

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(3 \leq n,m \leq 20\)) — размеры сетки.

Каждая из следующих \(n\) строк содержит \(m\) целых чисел \(x_{i,1}, x_{i,2}, \ldots, x_{i, m}\) (\(1 \leq x_{i,j} \leq nm\)), обозначающие значения в ячейке на пересечении строки \(i\) и столбца \(j\).

Гарантируется, что все \(x_{i,j}\) различны.

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

Сначала выведите одно целое число \(k\) — количество операций (\(k \geq 0\)).

В каждой из следующих \(k\) строк выведите один цикл в формате:

\(\)s\ y_1\ y_2\ \ldots\ y_s\(\)

Где \(s\) — количество ячеек в сдвиге (\(s \geq 4\)). Число в \(y_1\) переместится в ячейку \(y_2\), а число в \(y_2\) переместится в ячейку \(y_3\), и так далее до числа в \(y_s\), которое переместится в ячейку \(y_1\).

Сумма всех \(s\) не должна превышать \(10^5\).

Примечание

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

F. Дележ монет

реализация *1400

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

Это оказалось отличной новостью для Алисы, чей дедушка начал майнить биткоин еще в 2013, и накопил достаточно много. К сожалению, когда вы платите за что-то в биткоинах, все могут видеть, какая сумма у вас находится на данном биткоин-кошельке.

Это испугало Алису, поэтому она решила разделить все имеющиеся у нее биткоины по нескольким кошелькам так, чтобы в каждом кошельке было не более чем \(x\) сатоши (1 биткоин = \(10^8\) сатоши). Она может бесплатно создавать новые кошельки и будет платить по \(f\) сатоши за перевод некоторого количества биткоинов на новый кошелек. Эта плата списывается с кошелька, с которого выполняется перевод. Вычислите для Алисы, сколько она должна заплатить за переводы, чтобы достичь своей цели.

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

Первая строка содержит одно целое число \(N\) (\(1 \leq N \leq 200\,000\)) — число кошельков, имеющихся сейчас у Алисы.

Следующая строка содержит \(N\) целых чисел \(a_i\) (\(1 \leq a_i \leq 10^9\)) — количества сатоши на каждом из кошельков.

Последняя строка содержит два целых числа \(x\) и \(f\) (\(1 \leq f < x \leq 10^9\)) — максимальное количество сатоши на одном кошельке, которое Алиса хочет получить, и стоимость одного перевода.

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

Выведите одно целое число — минимальная суммарная стоимость переводов в сатоши, необходимая для достижения цели Алисы.

Примечание

В примере Алиса может сделать два перевода по следующей схеме:

0. 13 7 6 (начальное состояние)

1. 6 7 6 5 (создать новый кошелек и перевести 5 сатоши с первого кошелька)

2. 6 4 6 5 1 (создать новый кошелек и перевести 1 сатоши со второго кошелька)

Так как стоимость перевода равна 2 сатоши, суммарная стоимость равна 4 сатоши.

A. Трансмиграция

реализация *1700

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

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

Трансмиграция — это реинкарнация персонажа в новое существо, переселение его души с сохранением части его опыта из прошлой жизни.

В результате трансмиграции новый персонаж получает все навыки, которые были у старого персонажа, а степень владения ими уменьшается в соответствии с коэффициентом k (если степень владения была равна x, то после трансмиграции она становится равна [kx], где [y] — целая часть числа y). Если степень владения какими либо навыками теперь строго меньше 100, то эти навыки забываются (персонаж больше ими не владеет). После этого новый персонаж дополнительно получает все навыки, которые характерны для класса нового персонажа, но которыми персонаж сейчас не владеет. Степень владения этими дополнительными навыками устанавливается в 0.

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

Вам, в качестве упражнения, предлагается определить, какие навыки получит персонаж после трансмиграции, а также степень владения этими навыками.

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

В первой строке находятся три числа n, m и k — количество навыков у текущего персонажа, количество навыков, характерных для класса, в который происходит трансмиграция и коэффициент уменьшения соответственно, n и m — целые числа, а k — вещественное, заданное с точностью ровно два знака после десятичной точки (1 ≤ n, m ≤ 20, 0.01 ≤ k ≤ 0.99).

Далее идут n строк, в каждой из которых описан навык персонажа в формате «name exp» — название навыка и степень владения им персонажем: name — это строка, а exp — целое число в диапазоне от 0 до 9999 включительно.

После этого идут m строк, в каждой из которых находится названия навыков, характерных для класса, в который идет трансмиграция.

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

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

В первой строке выведите число z — количество навыков, которыми будет владеть персонаж после трансмиграции. Далее выведите z строк, в каждой из которых выведите название навыка и степень владения им, разделенные одиночным пробелом. Навыки должны быть приведены в лексикографическом порядке.

C. Мир Вещей

Перебор реализация сортировки *2200

Каждый предмет в игре имеет уровень. Чем выше уровень — тем более высокие базовые параметры имеет вещь. Мы будем рассматривать только следующие базовые параметры: атака (atk), защита (def) и сопротивления к различным воздействиям (res).

Каждая вещь принадлежит одному из классов. В данной задаче мы будем рассматривать только три таких класса: оружие (weapon), броня (armor), защитные сферы (orb).

Кроме того, внутри каждого предмета скрыт целый мир. С помощью путешествий в мир данного предмета можно повышать его уровень. Также в Мире Вещей можно захватывать так называемых резидентов.

Резиденты — это существа, которые живут внутри предметов. Каждый резидент дает некоторый бонус предмету, в котором он на данный момент находится. Мы будем рассматривать только резидентов типов: гладиатор (gladiator, увеличивает параметр atk предмета), часовой (sentry, увеличивает def) и целитель (physician, увеличивает res).

Каждый предмет имеет параметр вместимости. Он означает максимальное количество резидентов, которые могут жить внутри предмета. Резидентов можно перемещать между предметами. За один момент времени можно взять любого резидента в любом предмете, и переместить его в какой-либо другой предмет, если там есть место для нового жителя. При этом вынимать резидентов из предметов наружу не разрешается — каждый резидент обязательно должен быть в каком-либо предмете в любой момент времени.

У Лахарла есть некоторое количество предметов. Он хочет перераспределить резидентов между предметами таким образом, чтобы затем выбрать себе оружие, броню и защитную сферу для экипировки. При этом параметр оружия atk должен получиться максимально возможным. Из всех экипировок с максимальным параметром оружия atk параметр брони def должен быть максимальным. Из всех таких экипировок следует выбрать ту, в которой параметр защитной сферы res максимален. Значения параметров def и res у оружия, atk и res у брони и atk и def у защитной сферы Лахарлу безразличны.

Найдите оптимальную экипировку, которую Лахарл может получить.

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

В первой строке находится число n (3 ≤ n ≤ 100) — количество предметов у Лахарла.

Далее идут n строк, в каждой из которых описывается один предмет. Описание предмета имеет вид: «name class atk def res size» — имя предмета, его класс, базовые параметры атаки, защиты, сопротивления и вместимость соответственно.

  • name и class — строки, а atk, def, res и size — целые числа.
  • name состоит из малых латинских букв и имеет длину от 1 до 10.
  • class может быть "weapon", "armor" или "orb".
  • 0 ≤ atk, def, res ≤ 1000.
  • 1 ≤ size ≤ 10.

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

В следующей строке находится целое число k (1 ≤ k ≤ 1000) — количество резидентов.

Далее идут k строк, в каждой из которых описывается один резидент. Описание резидента имеет вид: «name type bonus home» — имя резидента, его тип, количество очков, на которые увеличивает данный резидент соответствующий типу резидента параметр предмета и имя предмета, в котором резидент сейчас находится.

  • name, type и home — строки, а bonus — целое число.
  • name состоит из малых латинских букв и имеет длину от 1 до 10.
  • type может быть "gladiator", "sentry" или "physician".
  • 1 ≤ bonus ≤ 100.

Гарантируется, что количество резидентов в каждом предмете не превосходит вместимости предмета.

Имена всех предметов и резидентов попарно различны.

Все слова и числа во входных данных разделены одиночными пробелами.

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

В первой строке выведите имя оружия в оптимальной экипировке, затем количество резидентов в этом оружии, после чего выведите список имен резидентов.

Во второй и третьей строке в аналогичном формате выведите имена брони и защитной сферы, а так же имена резидентов, находящихся в них.

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

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

Примечание

Во втором примере свободного места в предметах нет, поэтому перемещать резидентов нельзя.

D. Занимательная Геодезия

Перебор реализация снм *2700

Карты в игре разбиты на квадратные ячейки, которые называются гео-панелями. Некоторые из этих панелей окрашены. Будем считать, что гео-панели, которые не имеют цвета, покрашены в прозрачный цвет.

Еще на карте есть так называемые гео-символы. Они имеют вид цветных пирамидок (в том числе существуют гео-символы прозрачного цвета). Каждый гео-символ расположен на одной гео-панели, а на каждой гео-панели может находиться не более одного гео-символа.

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

В самом начале поместим в очередь только что уничтоженный гео-символ. Далее будем повторять следующую операцию:

Извлечем из начала очереди гео-символ. Посмотрим на цвет панели, на которой находился данный гео-символ. Если он отличен от прозрачного и отличен от цвета данного гео-символа, то происходит перекрашивание всех гео-панелей этого цвета в цвет данного гео-символ (в том числе, прозрачные гео-символы перекрашивают гео-панели в прозрачный цвет). Перекрашивание происходит по бесконечной спирали строго в следующем порядке, начиная от панели, на которой стоял гео-символ:

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

Если в момент перекрашивания панели на ней находится еще один гео-символ, то он удаляется с карты и помещается в конец очереди.

После перекрашивания гео-символ уничтожается окончательно и из начала очереди извлекается следующий гео-символ (если он есть) и процесс повторяется. Процесс заканчивается если очередь оказалась пуста.

Чтобы лучше понять этот процесс — смотрите разбор примера.

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

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

В первой строке находятся два целых числа n и m (1 ≤ n, m ≤ 300) — высота и ширина карты (в клетках).

Далее идут n строк по m чисел в каждой — цвета гео-панелей.

После этого идут еще n строк по m чисел в каждой — описание гео-символов. -1 означает, что в данной позиции нет гео-символа, иначе число означает цвет гео-символа в данной позиции.

Все цвета — целые числа в диапазоне от 0 до 109. 0 обозначает прозрачный цвет.

В последней строке находятся два целых числа x и y (1 ≤ x ≤ n, 1 ≤ y ≤ m) — номер строки и номер столбца, где находится гео-символ, который уничтожается первым. Строки нумеруются начиная с единицы сверху вниз, столбцы нумеруются начиная с единицы слева направо. Гарантируется, что в позиции с координатами (x, y) находится гео-символ.

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

Выведите одно целое число — общее количество перекрашиваний после уничтожения гео-символа.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

Примечание

Все действия, происходящие в примере можно видеть на следующей картинке:

Если ваш браузер не поддерживает APNG, и вы видите только статичную картинку, то вы можете посмотреть GIF версию этой картинки по следующей ссылке:

105_D_img_2.gif

A. Вася и пароль

жадные алгоритмы реализация Строки *1200

Для регистрации на сайте EatForces Вася придумал пароль — строку \(s\). Пароль на сайте EatForces — это строка, состоящая из строчных и заглавных латинских букв, а также цифр.

Но так как EatForces заботится о безопасности своих пользователей, пароли пользователей должны содержать минимум одну цифру, минимум одну заглавную латинскую букву и минимум одну строчную латинскую букву. Например пароли «abaCABA12», «Z7q» и «3R24m» допустимы, а пароли «qwerty», «qwerty12345» и «Password» — нет.

Подстрока строки \(s\) — строка \(x = s_l s_{l + 1} \dots s_{l + len - 1} (1 \le l \le |s|, 0 \le len \le |s| - l + 1)\). \(len\) — длина подстроки. Обратите внимание, что пустая строка так же считается подстрокой строки \(s\), и имеет длину \(0\).

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

Обратите внимание, что длина строки \(s\) после замены подстроки не должна измениться, а сама строка должна состоять только из строчных и заглавных латинских букв, а также цифр.

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

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

Следующие \(T\) строк содержат изначальный пароль \(s~(3 \le |s| \le 100)\), состоящий из строчных и заглавных латинских букв, а также цифр.

Для взломов разрешается только \(T = 1\).

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

Для каждого теста в отдельной строке выведите новый пароль, который удовлетворяет описанным выше условиям.

Длина замененной подстроки подсчитывается следующим способом: выпишем все измененные позиции. Если таких нет, то длина равна \(0\). В противном случае длина равна разности первой и последней измененной позиции плюс один. Например, длина измененной подстроки между паролями "abcdef" \(\rightarrow\) "a7cdEf" равна \(4\), потому что измененные позиции — это \(2\) и \(5\), соответственно, длина \((5 - 2) + 1 = 4\).

Гарантируется, что всегда существует подходящий пароль.

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

Примечание

В первом тестовом примере в Васином пароле не хватает цифры, он заменяет подстроку «C» на «4», и получает пароль «abcD4E». Таким образом, он заменил подстроку длины 1.

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

C. Вася и мультимножества

дп жадные алгоритмы математика Перебор реализация *1500

У Васи есть мультимножество чисел \(s\), состоящее из \(n\) элементов. Вася называет число \(x\) хорошим, если это число встречается в мультимножестве ровно один раз. Например, в мультимножестве \(\{1, 1, 2, 3, 3, 3, 4\}\) хорошими числами являются \(2\) и \(4\).

Вася хочет разбить мультимножество \(s\) на два мультимножества \(a\) и \(b\) (одно из которых может оказаться пустым) так, чтобы количество хороших чисел в мультимножестве \(a\) равнялось количеству хороших чисел в мультимножестве \(b\) (количество чисел, встречающихся ровно один раз в мультимножестве \(a\), равнялось количеству чисел, встречающихся ровно один раз в мультимножестве \(b\)).

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

В первой строке записано целое число \(n~(2 \le n \le 100)\).

Во второй строке записаны \(n\) целых чисел \(s_1, s_2, \dots s_n~(1 \le s_i \le 100)\) — мультимножество \(s\).

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

Если не существует разбиения мультимножества \(s\), удовлетворяющих описанным выше условиям, в первой строке выведите «NO».

В противном случае в первой строке выведите «YES».

Во второй строке выведите строку из \(n\) символов. \(i\)-й символ должен равняться 'A', если \(i\)-й элемент мультимножества \(s\) попадает в мультимножество \(a\), и 'B', если \(i\)-й элемент мультимножества \(s\) попадает в мультимножество \(b\). Элементы нумеруются от \(1\) до \(n\) в том порядке, в каком они заданы во входном файле.

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

A. На лифте или по лестнице?

реализация *800

Маша живет в многоэтажном доме, у которого этажи пронумерованы натуральными числами. Два этажа называются соседними, если их номера — соседние натуральные числа. Маша решила сходить в гости к Егору. Маша живет на этаже с номером \(x\), Егор на этаже с номером \(y\) (не совпадающим с этажом Маши).

В доме есть лестница и работает лифт. Если Маша идет по лестнице, то она проходит между соседними этажами (в любую сторону) за \(t_1\) секунд. Лифт проезжает между соседними этажами (в любую сторону) за \(t_2\) секунд. Лифт передвигается с закрытыми дверьми. Чтобы открыть или закрыть двери, лифт тратит \(t_3\) секунд. Можно считать, что время не тратится ни на какие действия, кроме перемещения между соседними этажами и ожидания открытия или закрытия дверей. Если Маша вызовет лифт, то он тут же поедет к нужному этажу напрямую.

Выйдя из квартиры на своем этаже, она заметила, что лифт сейчас находится ровно на уровне этажа с номером \(z\) и у него закрыты двери. Теперь ей надо решить — пойти по лестнице или поехать на лифте.

Если время, которое Маше потребуется, чтобы попасть на нужный этаж в случае похода по лестнице строго меньше времени, которое ей потребуется, чтобы попасть на нужный этаж в случае поездки на лифте, то она пойдет по лестнице, а иначе она поедет на лифте.

Помогите Маше понять: ехать на лифте или идти по лестнице.

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

В единственной строке находятся шесть целых чисел \(x\), \(y\), \(z\), \(t_1\), \(t_2\), \(t_3\) (\(1 \leq x, y, z, t_1, t_2, t_3 \leq 1000\)) — номер этажа, на котором находится Маша, номер этажа, на который хочет попасть Маша, номер этажа, на котором находится лифт, время, за которое Маша проходит между соседними этажами по лестнице, время, за которое лифт проезжает между этажами и время, за которое открываются и закрываются двери у лифта, соответственно.

Гарантируется, что \(x \ne y\).

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

Если поездка на лифте займет не больше времени, чем использование лестницы, выведите одну строку «YES» (без кавычек), иначе выведите одну строку «NO» (без кавычек).

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

Рассмотрим первый пример.

Eсли Маша пойдет пешком, то время, которое она потратит, будет равно \(4 \cdot 4 = 16\) секундам, так как ей надо пройти \(4\) раза между соседними этажами и на каждый такой пролет она тратит \(4\) секунды.

Если она поедет на лифте, то сначала ей нужно будет подождать \(2\) секунды, пока лифт доедет с \(4\)-го этажа на \(5\)-й. Потом двери будут открываться ещё \(1\) секунду. Затем Маша зайдёт в лифт, и ей нужно будет ещё подождать \(1\) секунду, пока двери закроются. Далее лифт будет ехать \(4 \cdot 2 = 8\) секунд с \(5\)-го этажа на \(1\)-й, потому что лифт \(4\) раза проезжает между соседними этажами и тратит на это по \(2\) секунды. И, наконец, пройдет ещё \(1\) секунда перед тем, как двери откроются, и Маша выйдет.

Таким образом, весь путь на лифте займет \(2 + 1 + 1 + 8 + 1 = 13\) секунд, что меньше, чем \(16\) секунд, поэтому она должна выбрать поездку на лифте.

Во втором примере Маше выгоднее пойти по лестнице, потому что время, которое занимает поездка на лифте — \(13\) секунд — больше, чем время, которое занимает поход по лестнице — \(10\) секунд.

В третьем примере время поездки на лифте равно времени, которое потребуется для того, чтобы пойти по лестнице, и равно \(12\) секундам. Это означает, что она выберет лифт.

B. Приписывание mex

реализация *1000

Изначально у Ильдара есть пустой массив. Он делает \(n\) шагов. Каждый шаг состоит в том, что Ильдар выбирает некоторое подмножество элементов массива, полученного ранее, и приписывает в конец массива mex чисел этого подмножества.

Mex мультимножества чисел есть минимальное целое неотрицательное число, не содержащееся в массиве. Например, mex мультимножества чисел \([0, 2, 3]\) равен \(1\), а mex мультимножества чисел \([1, 2, 1]\) равен \(0\).

Более формально, на шаге с номером \(m\), когда у Ильдара уже есть массив \(a_1, a_2, \ldots, a_{m-1}\), он выбирает подмножество индексов \(1 \leq i_1 < i_2 < \ldots < i_k < m\) (возможно, пустое), где \(0 \leq k < m\), и записывает число \(mex(a_{i_1}, a_{i_2}, \ldots a_{i_k})\) в конец массива.

После всех шагов он заметил, что мог ошибиться и записать какие-нибудь числа неправильно. Поэтому он простит вас определить по массиву \(a_1, a_2, \ldots, a_n\) такой минимальный номер шага \(t\), что он точно совершил ошибку на одном из шагов с номерами \(1, 2, \ldots, t\), или определить, что он мог получить такой массив, не совершив ни одной ошибки.

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

В первой строке записано единственное целое число \(n\) (\(1 \leq n \leq 100\,000\)) — количество шагов, которое сделал Ильдар.

Во второй строке находятся \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^9\)) — массив, полученный Ильдаром.

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

Если Ильдар мог так выбирать подмножества на каждом шаге, что в конце у него получится массив \(a_1, a_2, \ldots, a_n\), выведите \(-1\).

Иначе выведите одно целое число \(t\) — такой минимальный номер шага, что он точно ошибся на одном из шагов \(1, 2, \ldots, t\).

Примечание

В первом примере Ильдар мог получить такой массив, не совершив ни одной ошибки. Вот как он мог это сделать:

  • \(1\)-й шаг. Изначальный массив пустой. Он может выбрать пустое подмножество изначального массива и получить число \(0\), так как mex пустого массива равен \(0\). Дописав это число в конец, он получит массив \([0]\).
  • \(2\)-й шаг. Сейчас массив \([0]\). Он может выбрать подмножество \([0]\) и получить число \(1\), так как \(mex(0) = 1\). Дописав это число в конец, он получит массив \([0,1]\).
  • \(3\)-й шаг. Сейчас массив \([0,1]\). Он может выбрать подмножество \([0,1]\) и получить число \(2\), так как \(mex(0,1) = 2\). Дописав это число в конец, он получит массив \([0,1,2]\).
  • \(4\)-й шаг. Сейчас массив \([0,1,2]\). Он может выбрать подмножество \([0]\) и получить число \(1\), так как \(mex(0) = 1\). Дописав это число в конец, он получит массив \([0,1,2,1]\).

Таким образом он сможет получить массив без ошибок, поэтому ответ \(-1\).

Во втором тесте он точно совершит ошибку на первом шаге, так как ничего, кроме \(0\), он получить не мог.

В третьем примере он мог получить \([0, 1, 2]\) без ошибок, но \(239\) — явно ошибка.

C. Раздача конфет

Конструктив реализация *1500

В детском саду в группе \(n\) детей, пронумерованных от \(1\) до \(n\). Воспитательница дала \(i\)-му ребенку \(a_i\) (\(1 \leq a_i \leq n\)) конфет. Дети сели в ряд в порядке от \(1\) до \(n\) слева направо и стали есть конфеты.

Во время поедания конфет \(i\)-й ребенок заметил, что нескольким детям, сидящим левее него, и нескольким детям, сидящим правее него, дали больше конфет, чем ему самому. Поэтому каждый ребенок посчитал по два числа \(l_i\) и \(r_i\) — количество детей слева от него, которым дали больше конфет, чем ему, и количество детей справа от него, которым дали больше конфет, чем ему.

Формально, \(l_i\) есть количество индексов \(j\) (\(1 \leq j < i\)), таких что \(a_i < a_j\), а \(r_i\) есть количество индексов \(j\) (\(i < j \leq n\)), таких что \(a_i < a_j\).

Каждый ребенок сказал воспитательнице посчитанные им числа \(l_i\) и \(r_i\). К сожалению, она уже забыла, сколько конфет кому она дала. Поэтому она просит помощи у вас — по массивам \(l\) и \(r\) определите, могла ли она дать детям конфеты так, что дети правильно посчитали свои значения \(l_i\) и \(r_i\), или кто-то из ребят точно ошибся, и она не могла так раздать конфеты. Если она могла раздать конфеты, то определите любой возможный способ того, как она могла это сделать.

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

В первой строке входных данных находится одно целое число \(n\) (\(1 \leq n \leq 1000\)) — количество детей.

Во второй строке находится \(n\) целых чисел \(l_1, l_2, \ldots, l_n\) (\(0 \leq l_i \leq n\)), разделенных пробелами.

Во третьей строке находится \(n\) целых чисел \(r_1, r_2, \ldots, r_n\) (\(0 \leq r_i \leq n\)), разделенных пробелами.

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

Если воспитательница не могла так раздать конфеты, и кто-то из детей точно ошибся в своих расчетах, то в единственной строке выведите «NO» (без кавычек).

Иначе в первой строке выведите «YES» (без кавычек), а во второй строке выведите \(n\) целых чисел \(a_1, a_2, \ldots, a_n\), разделённых пробелами — количества конфет, которые можно было выдать детям с номерами \(1, 2, \ldots, n\), соответственно. Обратите внимание, что эти числа не обязаны быть различными, но для них должно выполняться ограничение \(1 \leq a_i \leq n\). Также, должно быть выполнено, что количество детей левее \(i\)-го, которым дали больше конфет, чем ему, было равно \(l_i\), а количество детей правее \(i\)-го, которым дали больше конфет, чем ему, было равно \(r_i\). Если существует несколько способов раздать конфеты, найдите любой из них.

Примечание

В первом примере, если раздать по \(1\), \(3\), \(1\), \(2\), \(1\) конфет \(1\), \(2\), \(3\), \(4\), \(5\) ребенку соответственно, то все значения, посчитанные детьми, совпадут со значениями из входных данных. Например, \(5\)-му ребенку дали \(1\) конфету, левее него \(2\) детям дали по \(1\) конфете, \(1\) ребёнку \(2\) конфеты и \(1\) ребенку \(3\) конфеты, то есть всего \(2\) детям левее него дали больше конфет, чем ему.

Во втором примере раздать конфеты невозможно, так как \(4\)-й ребёнок точно ошибся в подсчете значения \(r_4\), ведь правее него нет детей, поэтому \(r_4\) точно должно быть равно \(0\).

В третьем примере все дети могли получить поровну конфет, поэтому все числа равны \(0\). Обратите внимание, что каждый ребенок должен получить хотя бы одну конфету.

D. Изменения массива

жадные алгоритмы реализация *1900

На перемене Ваня зашел в класс и увидел на доске массив из \(n\) целых неотрицательных \(k\)-битных чисел \(a_1, a_2, \ldots, a_n\). Число \(x\) называется \(k\)-битным, если \(0 \leq x \leq 2^k - 1\).

Естественно, Ваня не удержался и стал менять числа, написанные на доске. Для того, чтобы никто ничего не заметил, Ваня разрешил себе сделать несколько следующих изменений: выбрать индекс массива \(i\) (\(1 \leq i \leq n\)) и заменить число \(a_i\) на число \(\overline{a_i}\). Будем обозначать за \(\overline{x}\) для \(k\)-битного числа \(x\) такое \(k\)-битное число, что все его \(k\) битов отличаются от соответствующих битов числа \(x\).

Ване очень не нравится число \(0\). Поэтому ему нравятся такие отрезки \([l, r]\) (\(1 \leq l \leq r \leq n\)), что \(a_l \oplus a_{l+1} \oplus \ldots \oplus a_r \neq 0\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ. Определите, какое максимальное количество таких отрезков он сможет получить, выполнив несколько (возможно, ноль) операций, описанных выше.

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

В первой строке входных данных находятся два целых числа \(n\) и \(k\) (\(1 \leq n \leq 200\,000\), \(1 \leq k \leq 30\)).

В следующей строке находятся \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 2^k - 1\)), разделённых пробелами — массив из \(k\)-битных чисел.

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

Выведите одно целое число — максимальное возможное количество отрезков с побитовым исключающим ИЛИ, не равным \(0\), которое можно получить, сделав несколько (возможно, \(0\)) операций, описанных в условии.

Примечание

В первом тесте можно не делать операций, тогда мы получим, что у нас \(5\) отрезков, которые нравятся Ване. Если сделать операцию с \(i = 2\), то получится массив \([1, 0, 0]\), так как \(\overline{3} = 0\) при \(k = 2\). У такого массива будет \(3\) подотрезка, которые нравятся Ване. Можно получить массив с \(5\) подотрезками, которые нравятся Ване, если сделать операцию с \(i = 3\) и операцию с \(i = 2\). Тогда получится массив \([1, 0, 3]\). Можно доказать, что \(6\) и более отрезков, которые будут нравиться Ване, получить невозможно.

Во втором тесте, чтобы получить \(19\) подотрезков, которые нравятся Ване, можно сделать \(4\) операции с \(i = 3\), \(i = 4\), \(i = 5\) и \(i = 6\). Получится массив \([1, 4, 3, 0, 4, 3]\).

E. Головоломка из фишек

Конструктив математика реализация *2400

Егор придумал новую головоломку из фишек, в которую предлагает сыграть вам.

Головоломка имеет вид таблицы из \(n\) строк и \(m\) столбцов, в каждой клетке которой могут располагаться несколько черных и белых фишек, положенных в ряд. Таким образом, состояние в клетке можно описать строкой, состоящей из символов «0» (белая фишка) и «1» (черная фишка), возможно пустой, а вся головоломка — это таблица, в каждой клетке которой стоит строка из нулей и единиц. Задача состоит в том, чтобы из одного состояния таблицы получить другое.

Для этого можно использовать следующую операцию:

  • выбрать две различные клетки \((x_1, y_1)\) и \((x_2, y_2)\), при этом клетки должны находиться в одной строке или одном столбце таблицы, и строка в клетке \((x_1, y_1)\) должна быть непустой;
  • за операцию можно переместить последний символ строки в клетке \((x_1, y_1)\) в начало строки в клетке \((x_2, y_2)\).

Для вас Егор загадал 2 состояния таблицы — начальное и конечное. Гарантируется, что количества нулей и единиц в таблицах совпадают. Ваша задача — с помощью нескольких операций получить из начального состояния конечное. Конечно, Егор не хочет, чтобы количество операций было очень большим. Обозначим за \(s\) количество символов в каждой из таблиц (в таблицах поровну символов). Тогда вы должны использовать не более \(4 \cdot s\) операций.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(2 \leq n, m \leq 300\)) — количества строк и столбцов у таблиц в головоломке, соответственно.

В следующих \(n\) строках находится описание начального состояния таблицы в следующем формате: в каждой строке находится \(m\) непустых строк, состоящих из нулей и единиц. В \(i\)-й из этих строк, \(j\)-я строка описывает строку, записанную в клетке \((i, j)\). Строки нумеруются от \(1\) до \(n\), столбцы нумеруются от \(1\) до \(m\).

В следующих \(n\) строках находится описание конечного состояния таблицы в аналогичном формате.

Обозначим суммарную длину строк в начальном состоянии за \(s\). Гарантируется, что \(s \leq 100\, 000\). Также гарантируется, что количества нулей и единиц совпадают в начальном и конечном состояниях.

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

В первой строке выведите одно целое число \(q\) — количество использованных операций. Необходимо найти решение, для которого \(0 \leq q \leq 4 \cdot s\).

В следующих \(q\) строках выведите по 4 целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\). \(i\)-я из этих строк должна описывать \(i\)-ю операцию. Необходимо, чтобы было выполнено \(1 \leq x_1, x_2 \leq n\), \(1 \leq y_1, y_2 \leq m\), \((x_1, y_1) \neq (x_2, y_2)\), \(x_1 = x_2\) или \(y_1 = y_2\). При этом строка в клетке \((x_1, y_1)\) должна быть непустой. Данная последовательность операций должна переводить таблицу из начального состояния в конечное.

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

Примечание

Рассмотрим первый пример.

  • Текущее состояние таблицы:

    00 10
    01 11

    Первая операция. В клетке \((2, 1)\) записана строка \(01\). Применяя операцию к двум клеткам \((2, 1)\) и \((1, 1)\), мы переносим \(1\) из конца строки \(01\) в начало строки \(00\), получая строку \(100\).

  • Текущее состояние таблицы:

    100 10
    0 11

    Вторая операция. В клетке \((1, 1)\) записана строка \(100\). Применяя операцию к двум клеткам \((1, 1)\) и \((1, 2)\), мы переносим \(0\) из конца строки \(100\) в начало строки \(10\), получая строку \(010\).

  • Текущее состояние таблицы:

    10 010
    0 11

    Третья операция. В клетке \((1, 2)\) записана строка \(010\). Применяя операцию к двум клеткам \((1, 2)\) и \((2, 2)\), мы переносим \(0\) из конца строки \(010\) в начало строки \(11\), получая строку \(011\).

  • Текущее состояние таблицы:

    10 01
    0 011

    Четвертая операция. В клетке \((2, 2)\) записана строка \(011\). Применяя операцию к двум клеткам \((2, 2)\) и \((2, 1)\), мы переносим \(1\) из конца строки \(011\) в начало строки \(0\), получая строку \(10\).

  • Текущее состояние таблицы:

    10 01
    10 01

Можно видеть, что мы получили требуемое состояние таблицы.

B. Алиса и парикмахер

реализация снм *1300

Волосы Алисы стали расти не по дням, а по минутам. Возможно, этому причиной является избыток витаминов, а возможно — чёрная магия...

Чтобы предотвратить это, Алиса решила сходить в парикмахерскую. При этом она хочет, чтобы после стрижки её волосы стали иметь длину не более \(l\) сантиметров, где \(l\) — её любимое число. Для наглядности будем считать, что голова Алисы представляет собой прямую линию, на которой последовательно растут \(n\) волос. Давайте пронумеруем их от \(1\) до \(n\). За один взмах ножницами парикмахер может укоротить все волосы на любом отрезке до длины \(l\), но с одним условием: все волосы на этом отрезке изначально имели длину строго больше \(l\). Парикмахер хочет сделать свою работу как можно скорее, поэтому сделает минимальное число взмахов ножницами, так как каждый взмах занимает одну секунду.

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

  • \(0\) — Алиса интересуется сколько времени займёт стрижка если она прямо сейчас пойдёт в парикмахерскую.
  • \(1\) \(p\) \(d\) — \(p\)-й волос вырос на \(d\) сантиметров.

Обратите внимание, что в запросе \(0\) Алису интересует гипотетический сценарий стрижки волос — длина волос после этого не изменяется.

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

Первая строка содержит три целых числа \(n\), \(m\) и \(l\) (\(1 \le n, m \le 100\,000\), \(1 \le l \le 10^9\)) — количество волос, количество запросов и любимое число Алисы.

Вторая строка содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 10^9\)) — исходные длины волос Алисы.

Каждая из следующих \(m\) строк содержит очередной запрос в формате описанном в условии.

Описание запроса начинается с целого числа \(t_i\). Если \(t_i = 0\), то необходимо узнать время стрижки. Иначе \(t_i = 1\) и в этот момент вырастает волос. Тогда на той же строке даны ещё два целых числа: \(p_i\) и \(d_i\) (\(1 \le p_i \le n\), \(1 \le d_i \le 10^9\)) — номер волоса и длина, на которую он вырастает.

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

Для каждого запроса типа \(0\) выведите время стрижки Алисы.

Примечание

Рассмотрим пример из условия:

  • Изначально длины волос равны \(1, 2, 3, 4\) и только \(4\)-й волос длиннее \(l=3\), и парикмахер может укоротить его за \(1\) секунду.
  • Затем у Алисы подрастает второй волос, и длины волос теперь равны \(1, 5, 3, 4\)
  • Теперь стрижка занимает две секунды: требуется два взмаха ножницами — на \(4\)-й волос и на \(2\)-й.
  • Затем у Алисы подрастает первый волос, и длины волос теперь равны \(4, 5, 3, 4\)
  • Стрижка всё ещё занимает две секунды: за один взмах парикмахер может состричь \(4\)-й волос и за ещё один отрезок с \(1\)-го по \(2\)-й волос.
  • Затем у Алисы подрастает третий волос, и длины волос теперь равны \(4, 5, 4, 4\)
  • Теперь стрижка занимает всего одну секунду: за один взмах можно укоротить подотрезок с \(1\)-го волоса по \(4\)-й.

D. Рефакторинг

жадные алгоритмы реализация Строки *2400

Алиса написала программу, и теперь всячески работает над улучшением её читаемости. Один из способов улучшить читаемость — давать переменным подходящие имена, поэтому Алиса хочет переименовать часть переменных в своей программе. В её среде разработке есть команда под названием «масштабный рефакторинг», которая позволяет менять сразу имена многим переменным. Для этого нужно выбрать две строки \(s\) и \(t\), после чего для всех переменных выполняется следующий алгоритм: если название переменной содержит \(s\) как подстроку, то первое (и только первое) вхождение \(s\) заменяется на \(t\), а если не содержит \(s\), то оно остаётся прежним.

Дан список переменных, для каждой из которых известно её исходное название и название, на которое Алиса хочет его заменить. Известно, что у каждой переменной длины этих двух названий совпадают (это связано с тем, что выравнивание блоков может «поехать», если длины названий переменных изменятся). Требуется произвести переименование всех переменных за ровно один вызов команды масштабного рефакторинга, или сказать, что это невозможно сделать.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 3000\)) — количество переменных в программе Алисы.

Следующие \(n\) строк содержат исходные названия переменных \(w_1, w_2, \ldots, w_n\) по одному в строке. Затем идут ещё \(n\) строк, \(i\)-я из них содержит требуемое название \(i\)-й переменной \(w'_i\). Гарантируется, что \(1 \le |w_i| = |w'_i| \le 3000\).

Гарантируется, что хотя бы у одной переменной желаемое название отличается от исходного. Как исходные, так и желаемые названия состоят только из строчных букв латинского алфавита. Для каждой переменной длина её исходного названия равна длине её желаемого названия.

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

Если произвести переименование всех переменных за один вызов команды «масштабный рефакторинг» невозможно, выведите «NO» (без кавычек).

Иначе на первой строке выведите «YES» (без кавычек), а на следующих строках \(s\) и \(t\) (\(1 \le |s|, |t| \le 5000\)), которые необходимо использовать для замены. Строки \(s\) и \(t\) должны состоять только из строчных букв латинского алфавита.

Если существует несколько способов провести «масштабный рефакторинг», то можно воспользоваться любым из них.

A. Определи маршрут

реализация *800

— Какое же утро в 12 часов?

— Самое доброе!

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

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

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 100\)) — количество остановок, увиденных Аркадием.

Следующие \(n\) строк описывают остановки. В начале каждой из них находится одно целое число \(r\) (\(1 \le r \le 100\)) — количество трамвайных маршрутов, останавливающихся на ней. Далее следуют \(r\) различных целых чисел, каждое от \(1\) до \(100\) включительно, — номера маршрутов. Эти номера могут быть даны в любом порядке.

Гарантируется, что информация Аркадий достоверная, то есть существует хотя бы один трамвайный маршрут, на котором Аркадий мог ехать.

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

Выведите все трамвайные маршруты, на которых Аркадий мог ехать, в любом порядке.

Примечание

Рассмотрим первый пример. Аркадий просыпался четыре раза. Первый раз он увидел остановку с маршрутами \(1\), \(4\), \(6\). Во второй раз он увидел остановку с маршрутами \(1\) и \(4\). В третий раз он увидел большую остановку с маршрутами \(10\), \(5\), \(6\), \(4\) и \(1\). Таким образом, он может быть в трамвае одного из двух маршрутов: \(1\) или \(4\).

C. Выбери героев

жадные алгоритмы интерактив реализация сортировки *1700

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

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

Друзья оценивают силу \(i\)-го героя как \(p_i\). Каждая команда хочет максимизировать суммарную силу своих героев. Однако, есть одно исключение: есть \(m\) пар героев, которые особенно сильны друг против друга, поэтому когда одна команда выбирает героя из пары, другая команда на своем ходу обязана выбрать другого героя из пары. Каждый герой входит максимум в одну такою пару.

Это — интерактивная задача. Вам нужно написать программу, которая будет оптимально выбирать героев в одну команду, в то время как программа жюри будет играть за другую команду. Обратите внимание, что программа жюри может играть не оптимально, в таком случае вам необходимо использовать шанс и все равно максимизировать суммарную силу своей команды. Формально, если в какой-то момент у вас есть возможность набрать суммарную силу героев в \(q\) или больше, независимо от дальнейших ходов программы жюри, вы должны набрать \(q\) или больше для того, чтобы пройти тест.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 10^3\), \(0 \le m \le n\)) — количество игроков в одной команде и количество специальных пар героев.

Следующая строка содержит \(2n\) целых чисел \(p_1, p_2, \ldots, p_{2n}\) (\(1 \le p_i \le 10^3\)) — силы героев.

Каждая из следующих \(m\) строк содержит два целых числа \(a\) и \(b\) (\(1 \le a, b \le 2n\), \(a \ne b\)) — пару героев, которые особенно сильны друг против друга. Гарантируется, что каждый герое встречается не более одного раза в этом списке.

Следующая строка содержит одно целое число \(t\) (\(1 \le t \le 2\)) — номер команды, за которую вы должны играть. Если \(t = 1\), то первый ход ваш, иначе ваш ход — второй.

Взломы

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

Протокол взаимодействия

Когда очередь ходить ваша, выведите одно целое число \(x\) (\(1 \le x \le 2n\)) — индекс героя, которого вы выбираете. Обратите внимание, вы не можете выбрать героя, которого ранее выбрали вы либо другой игрок, и вы должны следовать правилу о специальных парах героев.

Когда очередь ходить вашему сопернику, считайте одно целое число \(x\) (\(1 \le x \le 2n\)) — индекс героя, выбранного другой командой. Гарантируется, что выбранный герой не будет выбран ранее; гарантируется, что соперник будет следовать правилу о специальных парах героев.

После последнего хода вы должны завершиться, не выводя ничего.

После вывода хода не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Ход жюри \(-1\) означает, что ваша программа сделала некорректный ход. Ваша программа должна немедленно завершиться после прочтения ответа \(-1\), вы получите вердикт Неправильный ответ. В противном случае вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока.

Примечание

В первом примере первый ход ваш. В примере вы выбираете \(6\), другая команда обязана выбрать \(2\). Вы выбираете \(5\), другая команда выбирает \(4\). Наконец, вы выбираете \(3\), а другая команда выбирает \(1\).

Во втором примере вы ходите вторыми. Соперник выбирает \(6\), вы выбираете \(5\), заставляя соперника выбрать \(1\). Затем вы выбираете \(4\), другая команда выбирает \(3\) и вы выбираете \(2\).

A. Кассир

реализация *1000

Кассир Вася недавно устроился на работу в одну известную сеть продуктовых магазинов. Его рабочий день длится \(L\) минут. За непродолжительное время работы Вася уже выявил \(n\) постоянных клиентов, \(i\)-й из которых обычно приходит спустя \(t_{i}\) минут после начала рабочего дня, а его обслуживание длится \(l_{i}\) минут. Гарантируется, что к приходу очередного клиента Вася успевает обслужить всех пришедших ранее.

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

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

В первой строке даны три целых числа \(n\), \(L\) и \(a\) (\(0 \le n \le 10^{5}\), \(1 \le L \le 10^{9}\), \(1 \le a \le L\)).

Далее следуют \(n\) строк, в \(i\)-й из которых даны два целых числа \(t_{i}\) и \(l_{i}\) (\(0 \le t_{i} \le L - 1\), \(1 \le l_{i} \le L\)). Гарантируется, что \(t_{i} + l_{i} \le t_{i + 1}\) и \(t_{n} + l_{n} \le L\).

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

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

Примечание

В первом примере Вася может сделать \(3\) перекура: спустя \(2\), \(5\) и \(8\) минут после начала дня.

Во втором примере Вася может сделать \(2\) перекура: спустя \(0\) и \(2\) минуты после начала дня.

В третьем примере Вася не может сделать ни одного перекура.

B. Подделка

реализация *1300

Студент Андрей весь семестр пропускал физкультуру в своем университете, и вот теперь настала пора получать по ней зачет. Разумеется, получить зачет честно Андрей не успевает, но он не сдается. Добыв в местной поликлинике пустой бланк справки, Андрей, зная почерк местного врача, решил подделать справку о болезни. И вот, когда большая часть уже написана, Андрей с ужасом понял, что подпись врача подделать невозможно. Или возможно?

Для удобства Андрей мысленно представил подпись как клетчатое поле \(n\times m\), где каждая клетка либо заполнена чернилами, либо пуста. Ручка Андрея заполняет чернилами квадрат \(3\times3\) без центральной клетки, если он полностью лежит внутри поля, как показано ниже.


xxx
x.x
xxx

Определите, может ли Андрей нарисовать подпись врача на пустом листе бумаги \(n\times m\).

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

В первой строке даны 2 целых числа \(n\) и \(m\) (\(3 \le n, m \le 1000\)).

Далее следуют \(n\) строк по \(m\) символов в каждой. Каждый из символов — либо «.», обозначающий пустую клетку, либо «#», обозначающий клетку с чернилами.

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

Если Андрей может подделать подпись, выведите «YES». Иначе выведите «NO».

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

В первом примере Андрей может покрасить границу квадрата с центром в \((2, 2)\).

Во втором примере подпись невозможно подделать.

В третьем примере Андрей может покрасить границы квадратов с центрами в \((2, 2)\) и \((3, 2)\):

  1. изначально бумага чистая:

    ...
    ...
    ...
    ...
  2. используем ручку с центром в \((2, 2)\).

    ###
    #.#
    ###
    ...
  3. используем ручку с центром в \((3, 2)\).

    ###
    ###
    ###
    ###

В четвёртом примере Андрей может покрасить границы квадратов с центрами в \((3, 3)\) и \((3, 5)\).

A. Дурак

реализация *1000

Дурак — карточная игра, популярная в странах бывшего СССР. В этой задаче не раскрывается всех правил этой игры — при желании вы можете найти их потом сами.

В дурака играют колодой из 36 карт. Каждая карта имеет масть («S», «H», «D» и «C») и достоинство (в порядке увеличения: «6», «7», «8», «9», «T», «J», «Q», «K» и «A»). В начале каждой партии одна из мастей случайным образом назначается козырной.

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

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

Вам даны козырная масть и две различные карты. Определите покрывает ли первая их них вторую или нет.

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

В первой строке находится козырная масть. Это «S», «H», «D» или «C».

Во второй строке находится описание двух различных карт. Каждая из карт описывается словом из двух символов. Первый символ означает достоинство («6», «7», «8», «9», «T», «J», «Q», «K» или «A»), а второй — масть («S», «H», «D» или «C»).

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

Выведите «YES» (без кавычек) если первая карта покрывает вторую. Иначе выведите «NO» (тоже без кавычек).

B. Выбор ноутбука

Перебор реализация *1000

Вася выбирает ноутбук. В магазине имеется n ноутбуков на самый разный вкус.

Васе интересны такие параметры ноутбука как скорость процессора, объем оперативной памяти и место на жестком диске. Вася программист, Вася в игры не играет, поэтому все остальные параметры Васе не интересны.

Если у одного ноутбука все три параметра cтрого меньше, чем у какого либо другого ноутбука, то первый из них Вася считает устаревшим. Из всех ноутбуков, которые он не считает устаревшими, Вася выбирает самый дешевый.

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

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

В первой строке находится число n (1 ≤ n ≤ 100).

Далее идут n строк. В каждой из них описан ноутбук в формате «speed ram hdd cost». При этом:

  • speed, ram, hdd и cost — целые числа
  • 1000 ≤ speed ≤ 4200 — скорость процессора в мегагерцах
  • 256 ≤ ram ≤ 4096 — объем оперативной памяти в мегабайтах
  • 1 ≤ hdd ≤ 500 — размер жесткого диска в гигабайтах
  • 100 ≤ cost ≤ 1000 — цена в тугриках

Все цены ноутбуков различны.

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

Выведите одно число — номер ноутбука, который выберет Вася. Ноутбуки нумеруются натуральными числами от 1 до n в том порядке, в котором они даны во входных данных.

Примечание

В первом примере Вася считает устаревшими первый и пятый ноутбуки, поскольку они во всем уступают третьему ноутбуку. Из оставшихся четвертый — самый дешевый. Его и выбирает Вася.

D. Остров сокровищ

Перебор реализация *1700

Наконец отважные путешественники достигли острова, где зарыты сокровища пиратов. Однако, когда корабль уже подплывал к острову, капитан обнаружил, что какая-то крыса отгрызла кусочек от карты сокровищ.

Карту сокровищ можно представить себе как прямоугольник размера n × m, каждая ячейка которого означает квадрат острова со стороной в одну милю. Некоторые ячейки означают море и они непроходимы. Все остальные ячейки проходимы, а в некоторых из них находятся некоторые достопримечательности. Например, большой дуб на холме или пещера в скалах.

Кроме того, на карте имеется набор из k инструкций, каждая из которых имеет вид:

«Пройти x миль в направлении y»,

где возможны направления: север, юг, восток и запад. Если последовательно выполнить все эти инструкции последовательно от первой до последней, то придешь ровно в то место, где зарыты сокровища.

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

Капитан хочет узнать какие из достопримечательностей имеет смысл проверить. Он просит вас помочь в этом деле.

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

В первой строке находятся два целых числа n и m (3 ≤ n, m ≤ 1000).

Далее расположены n строк по m символов в каждой — описание карты острова. «#» означает море. Гарантируется, что все ячейки по периметру прямоугольника — море. «.» означает проходимую клетку без каких либо достопримечательностей, а достопримечательности обозначаются большими буквами латинского алфавита (от «A» до «Z»). Не все буквы алфавита могут быть использованы. Однако гарантируется, что хотя бы одна из них на карте присутствует. Все достопримечательности обозначены различными буквами.

В следующей строке находится число k (1 ≤ k ≤ 105), после чего идут k строк, в каждой из которых описывается одна инструкция. Каждая из инструкций имеет вид «dir len», где dir — направление, а len — расстояние. dir может принимать значения «N», «S», «W» и «E» для севера, юга, запада и востока соответственно. При этом север находится наверху, юг внизу, запад слева, а восток справа. len — целое число от 1 до 1000.

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

Выведите все достопримечательности, удовлетворяющие инструкциям, в виде одной строки без каких либо разделителей в алфавитном порядке. Если ни одна из достопримечательностей не подходит, то выведите «no solution» без кавычек.

C. Максимальный подпрямоугольник

Бинарный поиск реализация *1600

Даны два массива \(a\) и \(b\) из целых положительных чисел, длины \(n\) и \(m\) соответственно.

Рассмотрим матрицу \(c\) размера \(n \times m\), где \(c_{i,j} = a_i \cdot b_j\).

Вам необходимо найти в матрице \(c\) подпрямоугольник максимальной площади, сумма чисел в котором не превосходит \(x\).

Формально, необходимо найти такую максимальную площадь \(s\), что существуют четыре целых числа \(x_1, x_2, y_1, y_2\), удовлетворяющих ограничениям \(1 \leq x_1 \leq x_2 \leq n\), \(1 \leq y_1 \leq y_2 \leq m\), \((x_2 - x_1 + 1) \times (y_2 - y_1 + 1) = s\), таких что \(\)\sum_{i=x_1}^{x_2}{\sum_{j=y_1}^{y_2}{c_{i,j}}} \leq x.\(\)

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 2000\)).

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 2000\)).

В третьей строке записаны \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) (\(1 \leq b_i \leq 2000\)).

В четвертой строке записано одно целое число \(x\) (\(1 \leq x \leq 2 \cdot 10^{9}\)).

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

Если существуют четыре целых числа \(x_1, x_2, y_1, y_2\), таких что \(1 \leq x_1 \leq x_2 \leq n\), \(1 \leq y_1 \leq y_2 \leq m\) и \(\sum_{i=x_1}^{x_2}{\sum_{j=y_1}^{y_2}{c_{i,j}}} \leq x\), выведите максимально возможное значение \((x_2 - x_1 + 1) \times (y_2 - y_1 + 1)\) среди всех подходящих четвёрок, иначе выведите \(0\).

Примечание

Матрица из первого примера и выбранный подпрямоугольник (синего цвета):

Матрица из второго примера и выбранный подпрямоугольник (синего цвета):

A. Монеты

жадные алгоритмы математика реализация *800

У вас есть неограниченное количество монет с номиналами \(1, 2, \ldots, n\). Вы хотите выбрать некоторый набор монет имеющий суммарную стоимость \(S\).

Разрешается чтобы в наборе были монеты имеющие одну и ту же стоимость. Какое минимальное количество монет нужно, чтобы набрать сумму \(S\)?

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

Единственная строка входных данных содержит два целых числа \(n\) и \(S\) (\(1 \le n \le 100\,000\), \(1 \le S \le 10^9\))

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

Выведите ровно одно целое число — минимальное количество монет, которое нужно чтобы набрать сумму \(S\).

Примечание

Некоторые из способов набрать сумму \(11\) в первом примере с помощью \(3\) монет перечислены ниже:

  • \((3, 4, 4)\)
  • \((2, 4, 5)\)
  • \((1, 5, 5)\)
  • \((3, 3, 5)\)

Набрать сумму \(11\) меньше чем за \(3\) монеты нельзя.

Во втором примере некоторые из способов набрать \(16\) используя \(3\) монеты такие:

  • \((5, 5, 6)\)
  • \((4, 6, 6)\)

Набрать сумму \(16\) меньше чем за \(3\) монеты нельзя.

B. Экспонат

жадные алгоритмы реализация сортировки *1400

Вы пришли на выставку и один экспонат привлёк ваше внимание. Он состоит из \(n\) колонн, где \(i\)-я колонна состоит из \(a_i\) блоков стоящих на полу.

Высота экспоната равна \(m\), а значит количество блоков в каждой колонне не превосходит \(m\).

На потолке есть камера, которая снимает вид экспонат сверху, а также ещё одна камера расположена сбоку и снимает боковой вид этого экспоната.

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

Обратите внимание, что изначально все блоки «прижаты» к полу, однако не требуется, чтобы это было верно после удаления удаляемых блоков. На экспонат не действует гравитация, а значит ни один блок не упадёт вниз, даже если убрать блок под ним. Перемещать блоки вручную также не разрешается.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 100\,000\), \(1 \le m \le 10^9\)) — количество колонн и высота всего экспоната.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le m\)) — количества блоков в каждой колонне слева направо.

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

Выведите одно целое число — наибольшее количество блоков, которое можно удалить.

Примечание

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

Синие клетки иллюстрируют удалённые блоки. Всего есть \(10\) синих клеток, а значит ответ \(10\).

C. Делимость

дп математика реализация Структуры данных теория чисел *1700

Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\).

Массив \(b\) называется подпоследовательностью \(a\) если можно удалить некоторые элементы \(a\), чтобы остался массив \(b\).

Массив \(b_1, b_2, \ldots, b_k\) называется хорошим если он не пуст и для каждого \(i\) (\(1 \le i \le k\)) \(b_i\) делится на \(i\).

Посчитайте количество хороших подпоследовательностей \(a\) по модулю \(10^9 + 7\). Две подпоследовательности считаются различными, если множества индексов входящих в них чисел различны, то есть значения элементов не учитываются при сравнении подпоследовательностей. В частности, у массива \(a\) есть ровно \(2^n - 1\) различных подпоследовательностей (не считая пустую).

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 100\,000\)) — длину массива \(a\).

Вторая строка содержит целые числа \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^6\)).

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

Выведите одно целое число — количество хороших подпоследовательностей по модулю \(10^9 + 7\).

Примечание

В первом примере все три непустые подпоследовательности являются хорошими: \(\{1\}\), \(\{1, 2\}\), \(\{2\}\)

Во втором примере хорошими являются следующие подпоследовательности: \(\{2\}\), \(\{2, 2\}\), \(\{2, 22\}\), \(\{2, 14\}\), \(\{2\}\), \(\{2, 22\}\), \(\{2, 14\}\), \(\{1\}\), \(\{1, 22\}\), \(\{1, 14\}\), \(\{22\}\), \(\{22, 14\}\), \(\{14\}\).

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

D. Телепередачи

жадные алгоритмы реализация сортировки Структуры данных *2000

Есть \(n\) телепередач, которые вы хотите посмотреть. Предположим, что всё время разбито на равные отрезки называемые «минутами». Тогда \(i\)-я телепередача идёт с \(l_i\)-й по \(r_i\)-ю минуту, оба конца включительно.

Конечно, чтобы посмотреть телепередачу нужен телевизор, а также нельзя смотреть две телепередачи идущие одновременно на одном телевизоре. Из-за этого, возможно, в некоторые минуты вам понадобится более одного телевизора. В частности, если отрезки \([l_i, r_i]\) и \([l_j, r_j]\) пересекаются, то телепередачи \(i\) и \(j\) нельзя смотреть одновременно на одном телевизоре.

После того как вы начали смотреть какую-то телепередачу на каком-то телевизоре её нельзя «переместить» на другой телевизор (это было бы слишком отвлекающим действием), а также нельзя начать смотреть другую телепередачу на том же телевизоре пока эта телепередача не закончится.

К счастью, рядом с вами есть магазин по аренде телевизоров. Он сдаёт телевизор в аренду за \(x\) рупий и взимает \(y\) (\(y < x\)) рупий за каждую следующую минуту, в течении которой вы держите телевизор у себя. В частности, чтобы арендовать один телевизор на время \([a; b]\) нужно заплатить \(x + y \cdot (b - a)\) рупий.

Считайте, что аренда и возврат телевизора не занимает времени и не отвлекает от просмотра других телепередач. Выясните минимальное возможное количество денег, которое нужно заплатить, чтобы посмотреть все телепередачи. Так как это значение может быть достаточно велико, выведите его по модулю \(10^9 + 7\).

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

Первая строка содержит три целых числа \(n\), \(x\) и \(y\) (\(1 \le n \le 10^5\), \(1 \le y < x \le 10^9\)) — количество телепередач, стоимость аренды телевизора в первую минуту и cтоимость аренды телевизора в каждую последующую минуту.

Каждая из следующих \(n\) строк содержит два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le 10^9\)), обозначающие начальную и конечную минуту \(i\)-й телепередачи.

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

Выведите одно целое число — минимальную стоимость просмотра всех телепередач, взятую по модулю \(10^9 + 7\).

Примечание

В первом примере оптимально арендовать \(3\) телевизора и посмотреть:

  • Телепередачу \([1, 2]\) на первом телевизоре,
  • Телепередачу \([4, 10]\) на втором телевизоре,
  • Тепередачи \([2, 4], [5, 9], [10, 11]\) на третьем телевизоре.

Таким образом, стоимость аренды первого телевизора равна \(4 + 3 \cdot (2 - 1) = 7\), второго \(4 + 3 \cdot (10 - 4) = 22\) и треьего \(4 + 3 \cdot (11 - 2) = 31\), что в сумме составляет \(60\) рупий.

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

В третьем примере тоже оптимально посмотреть каждую телепередачу на отдельном телевизоре. Обратите внимание, что ответ нужно вывести по модулю \(10^9 + 7\).

A. Пранк

жадные алгоритмы реализация *1300

JATC и его друг Giraffe сейчас находятся в своей комнате и решают задачи. Giraffe написал на доске массив \(a_1\), \(a_2\), ..., \(a_n\) из целых чисел, такой что \(1 \le a_1 < a_2 < \ldots < a_n \le 10^3\), а затем вышел в ванную.

JATC хочет разыграть своего друга удалив несколько последовательных элементов массива. Так как он не хочет, чтобы этот пранк вышел из под контроля, он собирается удалять элементы только таким образом, что Giraffe всё равно сможет восстановить исходный массив, пользуясь информацией о сохранившихся элементах. Так как Giraffe создал исходный массив, то он также знает, что этот массив возрастающий, и что все числа целые и лежат в диапазоне \([1, 10^3]\).

JATC хочет узнать, какое наибольшее количество элементов он может удалить?

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество элементов в массиве.

Вторая строка входных данных содержит \(n\) целых чисел \(a_i\) (\(1 \le a_1<a_2<\dots<a_n \le 10^3\)) — массив, который написал Giraffe.

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

Выведите одно целое число — наибольшее количество последовательных элементов, которые JATC может удалить.

Если нельзя удалить даже один элемент, выведите \(0\).

Примечание

В первом примере JATC может удалить третий и четвёртый элемент, превратив массив в \([1, 3, \_, \_, 6, 9]\). Как можно заметить, есть только один способ заполнить пустоты.

Во втором примере JATC может удалить второй и третий элемент. Массив тем самым превратится в \([998, \_, \_]\). Так как все элементы должны быть меньше или равны \(1000\), то массив всё равно может быть одозначно восстановлен. Заметим, что удалить первые \(2\) элемента нельзя.

В третьем примере JATC может удалить первые \(4\) элемента. Так как все элементы больше или равны \(1\), то Giraffe всё равно может восстановить массив. Заметим, что удалить последние \(4\) элемента нельзя.

C. Бань-ми

жадные алгоритмы математика реализация *1600

JATC любит Бань-ми (вьетнамское блюдо). Его привязанность к Бань-ми настолько велика, что он ест Бань-ми каждый день на завтрак. Сегодня утром, как обычно, он купил Бань-ми, но собирается насладиться им необычным образом.

Сначала, он разбивает Бань-ми на \(n\) кусочков, выкладывает их в ряд и нумерует от \(1\) до \(n\). Для каждого кусочка \(i\) он определяет его вкусность как \(x_i \in \{0, 1\}\). JATC собирается съесть все кусочки один за другим. Каждый раз он выбирает произвольный из оставшихся кусочков и съедает его. Пусть этот кусочек был под номером \(i\), тогда его удовольствие от Бань-ми увеличивается на \(x_i\), вкусность каждого из оставшихся кусочков также увеличивается на \(x_i\). Изначально удовольствие JATC равно \(0\).

Например, пусть есть \(3\) кусочка с вкусностями \([0, 1, 0]\). Если JATC съест второй кусочек, то его удовольствие станет равно \(1\), а вкусность оставшихся кусочков будет равна \([1, \_, 1]\). Затем, если он съест первый кусочек, то его удовольствие станет равна \(2\), а вкусность оставшихся кусочков станет \([\_, \_, 2]\). После того как JATC съест последний кусочек, его удовольствие станет равно \(4\).

Однако JATC не хочет съесть сразу все кусочки, оставив часть на будущее. Он дал вам \(q\) запросов, каждый из которых задаётся двумя целыми числам \(l_i\) и \(r_i\). Для каждого запроса выясните какое наибольшее удовольствие он может получить, если съест все кусочки в отрезке \([l_i, r_i]\) в каком-то порядке.

Все запросы независимы друг от друга. Так как ответ на запрос может быть очень большим, выведите его по модулю \(10^9+7\).

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

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 100\,000\)).

Вторая строка содержит строку из \(n\) символов, каждый из которых равен или '0' или '1'. Символ под номером \(i\) определяет вкусность \(i\)-го кусочка.

Каждая из следующих \(q\) строк содержит по два целых числа \(l_i\) или \(r_i\) (\(1 \le l_i \le r_i \le n\)) — отрезок соответствующего запроса.

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

Выведите \(q\) строчек, где \(i\)-я из них содержит одно целое число — ответ на \(i\)-й запрос по модулю \(10^9 + 7\).

Примечание

В первом примере:

  • В запросе \(1\), одним из оптимальных порядков поедания является следующий: \(1\), \(4\), \(3\), \(2\).
  • В запросе \(2\): и порядок \(3\), \(4\), и порядок \(4\), \(3\) приводят к одному и тому же ответу.

Во втором примере любой порядок поедания кусочков приведёт к одному и тому же ответу.

D. Развлечения с целыми числами

графы математика поиск в глубину и подобное реализация *1800

Вам дано положительное целое число \(n\) большее или равное \(2\). Для пары целых чисел \(a\) и \(b\) (\(2 \le |a|, |b| \le n\)), вы можете преобразовать \(a\) в \(b\) тогда и только тогда, когда существует целое число \(x\), такое что \(1 < |x|\) и (\(a \cdot x = b\) или \(b \cdot x = a\)), где \(|x|\) обозначает модуль числа \(x\).

После такого преобразования ваш счёт увеличивается на \(|x|\) и вам больше не разрешается превращать \(a\) в \(b\) и \(b\) в \(a\).

Изначально ваш счёт равен \(0\). Вы можете начать с любого числа и преобразовывать его столько раз, сколько вы хотите. Какого наибольшего счёта можно добиться?

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

Единственная строка содержит ровно одно целое число \(n\) (\(2 \le n \le 100\,000\)) — целое число определённое выше.

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

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

Примечание

В первом примере можно делать такие преобразования: \(2 \rightarrow 4 \rightarrow (-2) \rightarrow (-4) \rightarrow 2\).

В третьем примере, нельзя выполнить ни одного преобразования.

A. Вася и шоколадки

математика реализация *800

В любимом Васином магазине началась акция: купи \(a\) шоколадок и \(b\) получи в подарок! Один и тот же клиент может воспользоваться этим акционным предложением неограниченное количество раз.

За время каникул Вася накопил \(s\) рублей, и он хочет купить на них максимально возможно количество шоколадок. Зная, что каждая шоколадка стоит \(c\) рублей, сообщите Васе, какое максимальное количество шоколадок он может получить!

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

Первая строка содержит число \(t\) (\(1 \le t \le 100\)) — количество тестов.

Следующие \(t\) строк содержит по четыре целых числа \(s, a, b, c~(1 \le s, a, b, c \le 10^9)\) – количество денег у Васи, количество шоколадок, которые необходимо купить, чтобы получить подарок, количество шоколадок, которое покупатель получает в подарок и цена одной шоколадки.

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

Выведите \(t\) строк. \(i\)-я строка должна содержать максимальное количество шоколадок, которые Вася может получить в \(i\)-м тесте.

Примечание

В первом тестовом примере Вася покупает \(9\) шоколадок и получает в подарок \(3\). На оставшийся рубль Вася покупает одну шоколадку и в итоге получает \(13\) шоколадок.

Во втором тестовом примере Вася покупает \(1000000000\) шоколадок и \(1000000000000000000\) получает в подарок. В итоге он получает \(1000000001000000000\) шоколадок.

C. Книжные запросы

реализация *1400

У вас есть полка и вы хотите положить на нее книги.

Вам задано \(q\) запросов трех типов:

  1. L \(id\) — положить книгу с номером \(id\) на полку слева от самой левой существующей книги;
  2. R \(id\) — положить книгу с номером \(id\) на полку справа от самой правой существующей книги;
  3. ? \(id\) — посчитать минимальное количество книг, которые нужно убрать с полки слева или справа, чтобы книга с номером \(id\) стала самой левой или самой правой.

Можете считать, что первая книга, которую вы положите на полку, может иметь любую позицию (это неважно) и запросы типа \(3\) всегда являются корректными (гарантируется, что книга в каждом таком запросе уже положена на полку). Также можете считать, что вы не кладете одну и ту же книгу на полку дважды, таким образом \(id\) не повторяются в запросах первых двух типов.

Ваша задача — ответить на все запросы типа \(3\) в порядке их появления во входных данных.

Заметьте, что после ответа на запрос типа \(3\) все книги остаются на полке и их относительный порядок не меняется.

Если вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете посылать свой код.

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

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Далее следуют \(q\) строк. \(i\)-я строка содержит \(i\)-й запрос в таком же формате, как и в условии задачи. Гарантируется, что все запросы корректны (для запроса типа \(3\) гарантируется, что книга в каждом таком запросе уже положена на полку, а для других типов гарантируется, что книга не была положена ранее).

Гарантируется, что во входных данных есть хотя бы один запрос типа \(3\).

Для каждого запроса выполняется ограничение \(1 \le id \le 2 \cdot 10^5\).

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

Выведите ответы на запросы типа \(3\) в порядке их появления во входных данных.

Примечание

Посмотрим на первый тестовый пример и рассмотрим запросы:

  1. Полка будет выглядеть следующим образом: \([1]\);
  2. Полка будет выглядеть следующим образом: \([1, 2]\);
  3. Полка будет выглядеть следующим образом:\([1, 2, 3]\);
  4. Полка выглядит как \([1, \textbf{2}, 3]\), таким образом ответ равен \(1\);
  5. Полка будет выглядеть следующим образом: \([4, 1, 2, 3]\);
  6. Полка выглядит как \([4, \textbf{1}, 2, 3]\), таким образом ответ равен \(1\);
  7. Полка будет выглядеть следующим образом: \([5, 4, 1, 2, 3]\);
  8. Полка выглядит как \([5, 4, \textbf{1}, 2, 3]\), таким образом ответ равен \(2\).

Посмотрим на второй тестовый пример и рассмотрим запросы:

  1. Полка будет выглядеть следующим образом: \([100]\);
  2. Полка будет выглядеть следующим образом: \([100, 100000]\);
  3. Полка будет выглядеть следующим образом: \([100, 100000, 123]\);
  4. Полка будет выглядеть следующим образом: \([101, 100, 100000, 123]\);
  5. Полка выглядит как \([101, 100, 100000, \textbf{123}]\), таким образом ответ равен \(0\);
  6. Полка будет выглядеть следующим образом: \([10, 101, 100, 100000, 123]\);
  7. Полка будет выглядеть следующим образом: \([10, 101, 100, 100000, 123, 115]\);
  8. Полка выглядит как \([10, 101, \textbf{100}, 100000, 123, 115]\) , таким образом ответ равен \(2\);
  9. Полка будет выглядеть следующим образом: \([10, 101, 100, 100000, 123, 115, 110]\);
  10. Полка выглядит как \([10, 101, 100, 100000, 123, \textbf{115}, 110]\), таким образом ответ равен \(1\).

D. Упаковывание в коробки

Бинарный поиск реализация *1800

У Максима есть \(n\) предметов и \(m\) коробок, каждая коробка имеет размер \(k\). Предметы пронумерованы от \(1\) до \(n\) в порядке слева направо, размер \(i\)-го предмета равен \(a_i\).

Максим хочет упаковать предметы в коробки и он собирается упаковывать предметы по следующему алгоритму: он берет одну из пустых коробок, которые у него имеются, идет слева направо по предметам, которые у него есть, и если \(i\)-й предмет помещается в текущую коробку (оставшийся размер коробки больше либо равен \(a_i\)), он кладет его в эту коробку и оставшийся размер коробки уменьшается на \(a_i\). Иначе он берет новую коробку и продолжает процесс, описанный выше. Если у него не остается пустых коробок и есть еще хотя бы один предмет, который не упакован в коробку, то Максим не может упаковать выбранный набор предметов.

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

Каждый раз, когда Максим пытается упаковать предметы в коробки, сначала он опустошает все коробки, которые у него есть (и относительный порядок оставшегося набора предметов не меняется).

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

Первая строка входных данных содержит три целых числа \(n\), \(m\) и \(k\) (\(1 \le n, m \le 2 \cdot 10^5\), \(1 \le k \le 10^9\)) — количество предметов, количество коробок и размер каждой коробки.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)), где \(a_i\) равно размеру \(i\)-го предмета.

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

Выведите максимальное количество предметов, которые сможет упаковать Максим при помощи алгоритма, описанного в условии задачи.

Примечание

В первом тестовом примере Максим может упаковать только \(4\) предмета. Сначала он пытается упаковать все \(5\) предметов. Распределение предметов будет выглядеть как \([5], [2, 1]\). Максим не может упаковать следующий предмет во вторую коробку и пустых коробок у него не осталось. Затем он выбрасывает первый предмет и распределение предметов будет выглядеть как \([2, 1], [4, 2]\). Таким образом, ответ равен \(4\).

Во втором тестовом примере очевидно ,что Максим не может упаковать предметы, начиная с первого, второго, третьего и четвертого (во всех этих случаях распределение предметов выглядит как \([4]\)), но он может упаковать последний предмет (\([1]\)).

В третьем тестовом примере Максим может упаковать все предметы, которые у него есть. Распределение предметов будет выглядеть как \([1, 2], [3], [1, 1]\).

E. Сумма AND двоичных чисел

математика реализация Структуры данных *1700

Задано два длинных двоичных натуральных числа \(a\) и \(b\) длин \(n\) и \(m\) соответственно. Вы собираетесь повторять следующий процесс: если \(b > 0\), тогда добавить к ответу значение \(a~ \&~ b\) и поделить \(b\) на \(2\) с округлением вниз (то есть удалить последнюю цифру \(b\)) и продолжить процесс, иначе прекратить процесс.

Значение \(a~ \&~ b\) означает побитовый AND \(a\) и \(b\). Ваша задача — посчитать ответ по модулю \(998244353\).

Заметим, что вам необходимо добавлять значение \(a~ \&~ b\) к ответу в десятичном представлении, не в двоичном. Таким образом, ваша задача заключается в том, чтобы посчитать ответ в десятичном представлении. Например, если \(a = 1010_2~ (10_{10})\) и \(b = 1000_2~ (8_{10})\), тогда значение \(a~ \&~ b\) будет равно \(8\), а не \(1000\).

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

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — длина \(a\) и длина \(b\) соответственно.

Вторая строка входных данных содержит одно длинное число \(a\). Гарантируется, что это число состоит ровно из \(n\) нулей и единиц, а первая цифра всегда равна \(1\).

Третья строка входных данных содержит одно длинное число \(b\). Гарантируется, что это число состоит ровно из \(m\) нулей и единиц, а первая цифра всегда равна \(1\).

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

Выведите ответ в десятичном представлении по модулю \(998244353\).

Примечание

Алгоритм для первого тестового примера:

  1. добавить к ответу \(1010_2~ \&~ 1101_2 = 1000_2 = 8_{10}\) и присвоить \(b := 110\);
  2. добавить к ответу \(1010_2~ \&~ 110_2 = 10_2 = 2_{10}\) и присвоить \(b := 11\);
  3. добавить к ответу \(1010_2~ \&~ 11_2 = 10_2 = 2_{10}\) и присвоить \(b := 1\);
  4. добавить к ответу \(1010_2~ \&~ 1_2 = 0_2 = 0_{10}\) и присвоить \(b := 0\).

Таким образом, ответ равен \(8 + 2 + 2 + 0 = 12\).

Алгоритм для второго тестового примера:

  1. добавить к ответу \(1001_2~ \&~ 10101_2 = 1_2 = 1_{10}\) и присвоить \(b := 1010\);
  2. добавить к ответу \(1001_2~ \&~ 1010_2 = 1000_2 = 8_{10}\) и присвоить \(b := 101\);
  3. добавить к ответу \(1001_2~ \&~ 101_2 = 1_2 = 1_{10}\) и присвоить \(b := 10\);
  4. добавить к ответу \(1001_2~ \&~ 10_2 = 0_2 = 0_{10}\) и присвоить \(b := 1\);
  5. добавить к ответу \(1001_2~ \&~ 1_2 = 1_2 = 1_{10}\) и присвоить \(b := 0\).

Таким образом, ответ равен \(1 + 8 + 1 + 0 + 1 = 11\).

G. Monsters and Potions

дп жадные алгоритмы Перебор реализация *2300

Polycarp is an introvert person. In fact he is so much of an introvert that he plays "Monsters and Potions" board game alone. The board of the game is a row of \(n\) cells. The cells are numbered from \(1\) to \(n\) from left to right. There are three types of cells: a cell containing a single monster, a cell containing a single potion or a blank cell (it contains neither a monster nor a potion).

Polycarp has \(m\) tokens representing heroes fighting monsters, which are initially located in the blank cells \(s_1, s_2, \dots, s_m\). Polycarp's task is to choose a single cell (rally point) and one by one move all the heroes into this cell. A rally point can be a cell of any of three types.

After Policarp selects a rally point, he picks a hero and orders him to move directly to the point. Once that hero reaches the point, Polycarp picks another hero and orders him also to go to the point. And so forth, until all the heroes reach the rally point cell. While going to the point, a hero can not deviate from the direct route or take a step back. A hero just moves cell by cell in the direction of the point until he reaches it. It is possible that multiple heroes are simultaneously in the same cell.

Initially the \(i\)-th hero has \(h_i\) hit points (HP). Monsters also have HP, different monsters might have different HP. And potions also have HP, different potions might have different HP.

If a hero steps into a cell which is blank (i.e. doesn't contain a monster/potion), hero's HP does not change.

If a hero steps into a cell containing a monster, then the hero and the monster fight. If monster's HP is strictly higher than hero's HP, then the monster wins and Polycarp loses the whole game. If hero's HP is greater or equal to monster's HP, then the hero wins and monster's HP is subtracted from hero's HP. I.e. the hero survives if his HP drops to zero, but dies (and Polycarp looses) if his HP becomes negative due to a fight. If a hero wins a fight with a monster, then the monster disappears, and the cell becomes blank.

If a hero steps into a cell containing a potion, then the hero drinks the potion immediately. As a result, potion's HP is added to hero's HP, the potion disappears, and the cell becomes blank.

Obviously, Polycarp wants to win the game. It means that he must choose such rally point and the order in which heroes move, that every hero reaches the rally point and survives. I.e. Polycarp loses if a hero reaches rally point but is killed by a monster at the same time. Polycarp can use any of \(n\) cells as a rally point — initially it can contain a monster, a potion, or be a blank cell with or without a hero in it.

Help Polycarp write a program to choose a rally point and the order in which heroes move.

Input

The first line of the input contains two integers \(n\) and \(m\) (\(1 \le n \le 100\); \(1 \le m \le n\)) — length of the game board and the number of heroes on it.

The following \(m\) lines describe heroes. Each line contains two integers \(s_i\) and \(h_i\) (\(1 \le s_i \le n\); \(1 \le h_i \le 10^6\)), where \(s_i\) is the initial position and \(h_i\) is the initial HP of the \(i\)-th hero. It is guaranteed that each cell \(s_i\) is blank. It is also guaranteed that all \(s_i\) are different.

The following line contains \(n\) integers \(a_1, a_2, \dots, a_n\) (\(-10^6 \le a_j \le 10^6\)), where \(a_j\) describes the \(i\)-th cell of the game board:

  • \(a_j=0\) means that the \(i\)-th cell is blank,
  • \(a_j<0\) means that the \(i\)-th cell contains monster with positive HP of \(-a_j\),
  • \(a_j>0\) means that the \(i\)-th cell contains potion with \(a_j\) HP.
Output

On the first line of the output print the index of the rally point cell.

On the second line print \(m\) integers — the order in which heroes should move to the rally point. Heroes are numbered from \(1\) to \(m\) in the order they are given in the input.

If there are multiple solutions, print any of them.

If it is impossible to find a rally point which can be reached by all heroes, print a single integer -1 in the output.

Note

The picture illustrates the first example:

H. BerOS File Suggestion

Перебор реализация *1500

Polycarp is working on a new operating system called BerOS. He asks you to help with implementation of a file suggestion feature.

There are \(n\) files on hard drive and their names are \(f_1, f_2, \dots, f_n\). Any file name contains between \(1\) and \(8\) characters, inclusive. All file names are unique.

The file suggestion feature handles queries, each represented by a string \(s\). For each query \(s\) it should count number of files containing \(s\) as a substring (i.e. some continuous segment of characters in a file name equals \(s\)) and suggest any such file name.

For example, if file names are "read.me", "hosts", "ops", and "beros.18", and the query is "os", the number of matched files is \(2\) (two file names contain "os" as a substring) and suggested file name can be either "hosts" or "beros.18".

Input

The first line of the input contains integer \(n\) (\(1 \le n \le 10000\)) — the total number of files.

The following \(n\) lines contain file names, one per line. The \(i\)-th line contains \(f_i\) — the name of the \(i\)-th file. Each file name contains between \(1\) and \(8\) characters, inclusive. File names contain only lowercase Latin letters, digits and dot characters ('.'). Any sequence of valid characters can be a file name (for example, in BerOS ".", ".." and "..." are valid file names). All file names are unique.

The following line contains integer \(q\) (\(1 \le q \le 50000\)) — the total number of queries.

The following \(q\) lines contain queries \(s_1, s_2, \dots, s_q\), one per line. Each \(s_j\) has length between \(1\) and \(8\) characters, inclusive. It contains only lowercase Latin letters, digits and dot characters ('.').

Output

Print \(q\) lines, one per query. The \(j\)-th line should contain the response on the \(j\)-th query — two values \(c_j\) and \(t_j\), where

  • \(c_j\) is the number of matched files for the \(j\)-th query,
  • \(t_j\) is the name of any file matched by the \(j\)-th query. If there is no such file, print a single character '-' instead. If there are multiple matched files, print any.

K. Video Posts

реализация *1100

Polycarp took \(n\) videos, the duration of the \(i\)-th video is \(a_i\) seconds. The videos are listed in the chronological order, i.e. the \(1\)-st video is the earliest, the \(2\)-nd video is the next, ..., the \(n\)-th video is the last.

Now Polycarp wants to publish exactly \(k\) (\(1 \le k \le n\)) posts in Instabram. Each video should be a part of a single post. The posts should preserve the chronological order, it means that the first post should contain one or more of the earliest videos, the second post should contain a block (one or more videos) going next and so on. In other words, if the number of videos in the \(j\)-th post is \(s_j\) then:

  • \(s_1+s_2+\dots+s_k=n\) (\(s_i>0\)),
  • the first post contains the videos: \(1, 2, \dots, s_1\);
  • the second post contains the videos: \(s_1+1, s_1+2, \dots, s_1+s_2\);
  • the third post contains the videos: \(s_1+s_2+1, s_1+s_2+2, \dots, s_1+s_2+s_3\);
  • ...
  • the \(k\)-th post contains videos: \(n-s_k+1,n-s_k+2,\dots,n\).

Polycarp is a perfectionist, he wants the total duration of videos in each post to be the same.

Help Polycarp to find such positive integer values \(s_1, s_2, \dots, s_k\) that satisfy all the conditions above.

Input

The first line contains two integers \(n\) and \(k\) (\(1 \le k \le n \le 10^5\)). The next line contains \(n\) positive integer numbers \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^4\)), where \(a_i\) is the duration of the \(i\)-th video.

Output

If solution exists, print "Yes" in the first line. Print \(k\) positive integers \(s_1, s_2, \dots, s_k\) (\(s_1+s_2+\dots+s_k=n\)) in the second line. The total duration of videos in each post should be the same. It can be easily proven that the answer is unique (if it exists).

If there is no solution, print a single line "No".

A. Разнообразная подстрока

реализация Строки *1000

Задана строка \(s\), состоящая из \(n\) строчных букв латинского алфавита.

Подстрока строки \(s\) — это последовательный отрезок букв из \(s\). Например, «defor» — это подстрока «codeforces», а «fors» — нет.

Длина подстроки — это количество букв в ней.

Назовем некоторую строку длины \(n\) разнообразной тогда и только тогда, когда никакая буква не встречается в ней строго больше \(\frac n 2\) раз. Например, строки «abc» и «iltlml» разнообразные, а строки «aab» и «zz» — нет.

Ваша задача — найти любую разнообразную подстроку строки \(s\) или сообщить, что такой нет. Обратите внимание, что не требуется максимизировать или минимизировать длину полученной подстроки.

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

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

Вторая строка содержит в себе строку \(s\), состоящую из ровно \(n\) строчных букв латинского алфавита.

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

Выведите «NO», если в строке \(s\) нет разнообразных подстрок.

В противном случае первая строка должна содержать «YES». Вторая подстрока должна содержать любую разнообразную подстроку строки \(s\).

Примечание

В первом примере есть множество правильных ответов.

Пожалуйста, избегайте задавать вопросы о правильности конкретного ответа на конкретный тест, такие вопросы всегда приводят к ответу «Без комментариев».

B. Вася и книги

математика реализация *1000

У Васи есть \(n\) книг, пронумерованных от \(1\) до \(n\), сложенных в стопку. Самая верхняя книга имеет номер \(a_1\), следующая за ней имеет номер \(a_2\), и так далее. Самая нижняя книга имеет номер \(a_n\). Все книги имеют различные номера.

Вася хочет переложить все книги в рюкзак за \(n\) шагов. На \(i\)-м шаге он хочет переложить в рюкзак книгу с номером \(b_i\). Если книга с номером \(b_i\) есть в стопке — он перекладывает эту книгу и все книги, лежащие над книгой \(b_i\), иначе переходит к следующему шагу. Например, если книги лежат в порядке \([1, 2, 3]\) (книга \(1\) лежит наверху), а Вася перекладывает книги в порядке \([2, 1, 3]\), то на первом шаге он переложит две книги (с номерами \(1\) и \(2\)), на втором — ни одной (так как книги \(1\) уже нет в стопке), а на третьем — одну (с номером \(3\)). Обратите внимание, что числа \(b_1, b_2, \dots, b_n\) различны.

Помогите Васе! Сообщите ему, сколько книг он переложит в рюкзак на каждом шаге.

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

Первая строка содержит число \(n~(1 \le n \le 2 \cdot 10^5)\) — количество книг в стопке.

Вторая строка содержит \(n\) различных чисел \(a_1, a_2, \dots, a_n~(1 \le a_i \le n)\) — описание стопки книг.

Третья строка содержит \(n\) различных чисел \(b_1, b_2, \dots, b_n~(1 \le b_i \le n)\) — порядок шагов, сделанных Васей.

Гарантируется, что все числа \(a_1 \dots a_n\) различны, и что все числа \(b_1 \dots b_n\) различны.

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

Выведите \(n\) чисел. \(i\)-е число должно равняться количеству книг, которые Вася переложит в рюкзак на \(i\)-м шаге.

Примечание

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

Во втором тестовом примере на первом шаге Вася переложит три книги с номерами \([3, 1, 4]\). После этого в стопке останутся две книги \(2\) и \(5\) (книга \(2\) будет лежать на книге \(5\)). На втором шаге Вася переложит две книги с номерами \(2\) и \(5\). После этого в стопке не останется книг, и в каждый из последующих шагов Вася не переложит ни одной книги.

A. Королевский забег

математика реализация *800

На шахматной доске шириной \(n\) и высотой \(n\) строки нумеруются снизу вверх от \(1\) до \(n\), а столбцы нумеруются слева направо от \(1\) до \(n\). Поэтому, каждой клетке шахматной доски можно присвоить координаты \((r,c)\), где \(r\) — номер строки, а \(c\) — номер столбца.

В клетке с координатами \((1,1)\) уже тысячу лет сидит белый король, а в клетке с координатами \((n,n)\) сидит чёрный король. Они бы сидели так и дальше, но тут в клетку с координатами \((x,y)\) упала красивая монетка...

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

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

Кто первым добежит до монетки, тот и победит. То есть победит тот, кто первым окажется в клетке с координатами \((x,y)\).

Напомним, что король — это такая шахматная фигура, которая может двигаться на одну клетку во все стороны, то есть, если король стоит в клетке \((a,b)\), то за один ход он может перейти из \((a,b)\) в клетки \((a + 1,b)\), \((a - 1,b)\), \((a,b + 1)\), \((a,b - 1)\), \((a + 1,b - 1)\), \((a + 1,b + 1)\), \((a - 1,b - 1)\), \((a - 1,b + 1)\). Выходить за пределы поля запрещено.

Определите цвет короля, который первым окажется в клетке с координатами \((x,y)\), если первым ходит белый король.

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

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

Вторая строка содержит два целых числа \(x\) и \(y\) (\(1 \le x,y \le n\)) — координаты клетки, в которую упала монетка.

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

В единственной строке выведите «White» (без кавычек), если победит белый король, или «Black» (без кавычек), если победит чёрный король.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

Пример гонки в первом примере, где белый и чёрный короли действуют оптимально:

  1. Белый король переходит из клетки \((1,1)\) в \((2,2)\).
  2. Чёрный король переходит из клетки \((4,4)\) в \((3,3)\).
  3. Белый король переходит из клетки \((2,2)\) в \((2,3)\). Именно в эту клетку упала монетка, значит, белый король выиграл.

Пример гонки во втором примере, где белый и чёрный короли действуют оптимально:

  1. Белый король переходит из клетки \((1,1)\) в клетку \((2,2)\).
  2. Чёрный король переходит из клетки \((5,5)\) в клетку \((4,4)\).
  3. Белый король переходит из клетки \((2,2)\) в клетку \((3,3)\).
  4. Чёрный король переходит из клетки \((4,4)\) в \((3,5)\). В этой клетке лежит монетка, значит, чёрный король выиграл.

Объяснение к третьему примеру. Так как чёрный король изначально стоит в клетке, куда упала монетка, то он выиграл.

B. Таксисты и Lyft

реализация сортировки *1200

Пало-Алто — необычный город, ведь он представляет собой бесконечную координатную прямую. Он известен еще тем, что там находится офис Lyft Level 5.

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

Каждый житель (включая таксистов) Пало-Алто живёт в точке с уникальной координатой (нет такой пары жителей, что их координата одинаковая).

Система Lyft очень умная: когда человек вызывает такси, то его вызов идет не ко всем таксистам, а только к тому, который является ближайшим к этому человеку, а если таких несколько, то к тому, у кого меньше текущая координата.

Однажды утром таксистам стало интересно: а сколько же есть людей, от которых они могут получить первый вызов в этот день? Другими словами, надо для каждого таксиста \(i\) найти число \(a_{i}\) — количество пешеходов, для которых \(i\)-й таксист — ближайший, или, если таких таксистов несколько, имеет среди таковых наименьшую координату.

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

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 10^5\)) — количество пешеходов и таксистов.

Вторая строка содержит \(n + m\) целых чисел \(x_1, x_2, \ldots, x_{n+m}\) (\(1 \le x_1 < x_2 < \ldots < x_{n+m} \le 10^9\)), где \(x_i\) — координата точки, в которой живет \(i\)-й житель.

Третья строка содержит \(n + m\) целых чисел \(t_1, t_2, \ldots, t_{n+m}\) (\(0 \le t_i \le 1\)). Если \(t_i = 1\), это значит, что \(i\)-й житель — таксист, и \(t_i = 0\) в противном случае.

Гарантируется, что количество таких \(i\), что \(t_i = 1\), равно \(m\).

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

Выведите \(m\) чисел \(a_1, a_2, \ldots, a_{m}\), где \(a_i\) — ответ для \(i\)-го таксиста. Таксист имеет номер \(i\), если среди всех таксистов он живет в \(i\)-й по величине координате (смотрите примеры для лучшего понимания).

Примечание

В первом примере у нас всего один таксист, значит заказ от любого из \(n\) пешеходов будет идти к нему.

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

В третьем примере у нас один пешеход и ближайший к нему таксист — четвёртый.

B. Вычитание делителя

математика реализация теория чисел *1200

Задано целое число \(n\). К нему применяется следующий алгоритм:

  1. если \(n = 0\), то завершить алгоритм;
  2. найти наименьший простой делитель \(d\) числа \(n\);
  3. вычесть \(d\) из \(n\) и перейти к шагу \(1\).

Определите количество вычитаний, которые совершит алгоритм.

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

В единственной строке записано одно целое число \(n\) (\(2 \le n \le 10^{10}\)).

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

Выведите единственное целое число — количество вычитаний, которые совершит алгоритм.

Примечание

В первом примере \(5\) — это наименьший простой делитель, поэтому он сразу вычтется, приведя число к \(0\).

Во втором примере \(2\) — наименьший простой делитель на обоих шагах.

A. Время-палиндром

реализация Строки *1000

Таттах спит тогда и только тогда, когда он на лекции. Эта шутка популярна среди его однокурсников.

В среду утром Таттах был на лекции у профессора NN. В 12:21, как раз перед сном, он созерцал часы на запястье Захира. Таттах обратил внимание, что цифры на часах обозначали одно и то же время будучи прочитанными как справа налево (*), так и слева направо. Иными словами, время на часах было палиндромом.

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

К сожалению, Таттах пока еще не силен в программировании, и вы должны помочь ему.

(*) Как и все египтяне, Таттах читает справа налево.

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

В единственной строке в формате «HH:MM» записано текущее время. «HH» задает часы в диапазоне от «00» до «23» и «MM» задает минуты в диапазоне от «00» до «59». Части «HH» и «MM» состоят ровно из двух цифр каждая.

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

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

C. Маша и два друга

реализация *1500

Недавно Маше подарили шахматную доску высотой \(n\) и шириной \(m\).

Строки на шахматном поле нумеруются от \(1\) до \(n\) снизу вверх. Столбцы нумеруются от \(1\) до \(m\) слева направо. Поэтому, каждую клетку можно задать координатами \((x,y)\), где \(x\) — номер столбца, а \(y\) — номер строки (не перепутайте).

Назовём прямоугольником с координатами \((a,b,c,d)\) такой прямоугольник, у которого левая нижняя точка имеет координаты \((a,b)\), а правая верхняя — \((c,d)\).

Шахматная доска окрашена в чёрный и белый цвета следующим образом:

Пример шахматного поля.

Маша была очень рада подарку и, поэтому, пригласила своих друзей Максима и Дениса, чтобы похвастаться им. Парни решили сделать ей приятное — подарить банку белой и банку чёрной краски, чтобы если старая доска испортится, можно было перекрасить. Когда они пришли к Маше, случилось неприятное: сначала Максим зацепился за порог и пролил белую краску на прямоугольник \((x_1,y_1,x_2,y_2)\). Затем после него Денис пролил чёрную краску на прямоугольник \((x_3,y_3,x_4,y_4)\).

Пролить краску цвета \(color\) на некий прямоугольник, означает сделать все клетки, которые принадлежат данному прямоугольнику, цвета \(color\). Покраски клеток накладываются друг на друга (если на какую-то клетку сначала пролили белую краску, а потом чёрную, то её цвет будет чёрным).

Маша была просто в шоке! Она прогнала гостей и решила узнать насколько испорчен подарок. Для этого ей почему-то надо знать количество клеток белого и чёрного цвета. Помогите ей найти эти числа!

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

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество тестовых случаев.

Каждый из них описывается в следующем формате:

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 10^9\)) — размеры доски.

Вторая строка содержит четыре целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(1 \le x_1 \le x_2 \le m, 1 \le y_1 \le y_2 \le n\)) — координаты прямоугольника, на который разлили белую краску.

Третья строка содержит четыре целых числа \(x_3\), \(y_3\), \(x_4\), \(y_4\) (\(1 \le x_3 \le x_4 \le m, 1 \le y_3 \le y_4 \le n\)) — координаты прямоугольника, на который разлили чёрную краску.

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

Выведите \(t\) строк, каждая из которых содержит по два числа — количество клеток белого и чёрного цвета после разлива краски соответственно.

Примечание

Объяснение к примерам:

Первое изображение каждой иллюстрации показывает, как поле выглядело до того, как краски были пролиты. Второе изображение каждой иллюстрации показывает, как поле выглядело после того, как Максим пролил белую краску (прямоугольник, на который пролилась краска, выделен красным). Третье изображение на каждой иллюстрации показывает, как поле выглядело после того, как Денис пролил черную краску (прямоугольник, на который пролилась краска, выделен красным).

В первом тесте краска на поле менялась следующим образом:

Во втором тесте краска на поле менялась следующим образом:

В третьем тесте краска на поле менялась следующим образом:

В четвёртом тесте краска на поле менялась следующим образом:

В пятом тесте краска на поле менялась следующим образом:

D. Оля и магический квадрат

Конструктив математика реализация *2000

Недавно Оля получила магический квадрат размером \(2^n\times 2^n\).

Её сестре кажется, что один квадрат — это скучно, поэтому она попросила Олю, чтобы та выполнила ровно \(k\) операций разбиения.

Операция разбиения — операция, во время которой Оля берет некий квадрат со стороной \(a\) и разрезает его на 4 равных квадрата со стороной \(\dfrac{a}{2}\). Если сторона квадрата равна \(1\), то к нему нельзя применить операцию разбиения (смотрите примеры для лучшего понимания).

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

Условие счастья Оли будет соблюдено, если выполняется следующее утверждение:

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

Очевидно, пока у нас есть один квадрат, то данные условия соблюдаются. Так что Оля готова выполнить просьбу сестры только при условии, что она тоже останется довольна. Скажите ей: возможно ли выполнить ровно \(k\) операций разбиения в некоторой последовательности так, чтобы соблюдалось условие счастья Оли? Если можно, то укажите также то, какой размер будут иметь квадратики из которых будет состоять путь из левого нижнего квадратика в правый верхний.

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

Первая строка содержит одна целое число \(t\) (\(1 \le t \le 10^3\)) — количество тестов.

Каждая из следующих \(t\) строк содержит два целых числа \(n_i\) и \(k_i\) (\(1 \le n_i \le 10^9, 1 \le k_i \le 10^{18}\)) — описание \(i\)-го теста, которое означает, что исходный квадрат Оли имеет размер \(2^{n_i}\times 2^{n_i}\) и сестра Оли просит сделать ровно \(k_i\) операций разбиения.

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

Выведите \(t\) строк, где в \(i\)-й строке надо вывести «YES» если в \(i\)-м тесте можно выполнить \(k_i\) операций разбиения так, чтобы условие счастья Оли соблюдалось или «NO» в противном случае. Если вы вывели «YES», то также выведите \(log_2\) от длины стороны квадратиков, по которым можно будет построить путь из левого нижнего квадратика в правый верхний.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

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

Примечание

В каждой из иллюстраций изображения отображаются в порядке, в котором Оля применяла операции. Недавно созданные квадраты выделены красным цветом.

В первом тесте Оля может применять операции разбиения в следующем порядке:

Оля применила одну операцию к единственному существующему квадрату.

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

Размер стороны квадратиков на этом пути равен \(1\). \(log_2(1) = 0\).

Во втором тесте Оля может применять операции разбиения в следующем порядке:

Оля применяет первую операцию к единственному существующему квадрату. Вторую операцию она применяет к правому нижнему квадратику.

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

Размер стороны квадратиков на этом пути равен \(2\). \(log_2(2) = 1\).

В третьем примере Оля за \(5\) операций приведет квадратик к следующему виду:

Поскольку ей осталось ещё выполнить \(7\) операций разбиения, а к квадратам со стороной равной \(1\) их применять нельзя, значит Оля не сможет больше ничего сделать и ответ «NO».

B. Прощальная вечеринка

Конструктив реализация *1500

Chouti и его одноклассникам скоро предстоит поступать в университет. Чтобы попрощаться друг с другом, класс устроил большую прощальную вечеринку, на которой одноклассники, учителя и родители пели и танцевали.

Chouti вспомнил, что в этой вечеринке приняли участие \(n\) человек. Чтобы сделать вечеринку смешнее, каждый надел одну шляпу из \(n\) разновидностей странных шляп с номерами \(1, 2, \ldots n\). Возможно, что одну разновидность шляпы надели несколько человек. Некоторые разновидности шляп могли остаться невостребованными кем-либо.

После вечеринки \(i\)-й человек сказал, что было ровно \(a_i\) людей, на которых была надета шляпа, отличающаяся от его собственной.

Прошло несколько дней, поэтому Chouti забыл, кто был в каких шляпах, но ему очень интересно что-то про это вспомнить! Пусть \(b_i\) будет видом той шляпы, которую надел \(i\)-й человек. Chouti хочет, чтобы вы нашли какие-нибудь \(b_1, b_2, \ldots, b_n\), которые не противоречат утверждениям каждого человека. Так как у некоторых людей могут быть проблемы с памятью, решения может не существовать.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество людей на вечеринке.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le n-1\)), и задающая утверждения каждого человека.

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

Если решения не существует, выведите «Impossible».

Иначе, выведите «Possible» а затем \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le n\)).

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

Примечание

В ответе к первому примеру, все носили шляпу одного и того же типа, поэтому каждый скажет, что не было людей со шляпами, отличными от типа \(1\).

В ответе ко второму примеру, первый и второй человек носили шляпу типа \(1\), а все остальные носили шляпу типа \(2\).

Поэтому первые два человека скажут, что было три человека, с видом шляпы, отличным от их. Аналогично, три последних человека скажут, что было два человека с отличным видом шляпы.

Можно показать, что ответа на третий пример не существует.

В первых двух примерах существуют и другие варианты ответа.

F. Коварный интерактор

интерактив Конструктив реализация *2600

Это интерактивная задача.

Chouti устал от учебы, поэтому он открыл компьютер и стал играть в игру-головоломку.

Давным давно, Chouti нашел последовательность \(s_1, s_2, \ldots, s_n\) длины \(n\), хранимую коварным интерактором. Она состояла только из цифр \(0\) и \(1\), и количество цифр \(1\) было равно \(t\). Chouti ничего не знает о последовательности, кроме \(n\) и \(t\), но он может попробовать узнать последовательность с помощью интерактора.

Определим операцию инвертирования. Инвертирование отрезка \([l,r]\) (\(1 \leq l \leq r \leq n\)) означает, что для каждого \(x \in [l,r]\), нужно заменить \(s_x\) на \(1-s_x\).

В каждом запросе Chouti может передать интерактору два числа \(l,r\) удовлетворяющие \(1 \leq l \leq r \leq n\) и интерактор сделает одно из двух: инвертирует отрезок \([1,r]\) или инвертирует отрезок \([l,n]\) (оба исхода равновероятны, и все решения, принимаемые интерактором, независимы друг от друга, см. Примечание ). Интерактор сообщит текущее количество цифр \(1\) после каждой операции. Заметим, что последовательность не будет восстановлена после каждой операции.

Помогите мальчику найти изначальную последовательность за не более \(10000\) запросов.

"Странная легенда, глупая игра.", — подумал он. Тем не менее, после нескольких попыток, он всё равно в неё играет. Можете ли вы ему помочь пройти эту игру?

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

Взаимодействие начинается со строки, содержащей числа \(n\) и \(t\) (\(1 \leq n \leq 300\), \(0 \leq t \leq n\)) — длина строки и количество цифр \(1\) в ней.

Далее вы можете совершать запросы.

Чтобы сделать запрос, выведите строку «? l r» (\(1 \leq l \leq r \leq n\)), и сбросьте буфер вывода.

После каждого запроса, считайте одно целое число \(t\) (\(-1 \leq t \leq n\)).

  • Если \(t=-1\), то вы превысили лимит запросов, и ваша программа должна незамедлительно завершить работу, тогда вы получите Неправильный Ответ. Иначе вы можете получить произвольный результат проверки, так как ваша программа продолжит чтение из закрытого потока.
  • Если \(t \geq 0\), оно означает число цифр \(1\) в последовательности.

Когда вы нашли начальную последовательность, выведите строку «! s», сбросьте буфер вывода и завершите вашу программу. Выводите \(s_1, s_2, \ldots, s_n\) как двоичную строку и не выводите пробелы в промежутке между цифрами.

Ваше решение получит вердикт Решение «зависло», если вы ничего не выведете или забудете сбросить буфер вывода.

Чтобы сбросить буфер вывода вам нужно сделать следующее сразу после вывода запроса и символа конца строки:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() inвPython;
  • см. документацию других языков.

Взломы

Для взломов используйте следующий формат:

В единственной строке выведите строку из нулей и единиц. Её длина будет равна \(n\) и она будет воспринята как \(s_1, s_2, \ldots, s_n\).

Например, файл теста из примера содержит строку «0011».

Примечание

Для первого запроса \(1,1\), интерактор должен инвертировать \([1,1]\) или \([1,4]\). Он выбирает отрезок \([1,4]\), так что последовательность становится равна 1100.

Для второго запроса \(1,1\), интерактор должен инвертировать \([1,1]\) или \([1,4]\). Он опять выбирает отрезок \([1,4]\), так что последовательность становится равна 0011.

Для третьего запроса \(3,4\), интерактор должен инвертировать \([1,4]\) или \([3,4]\). Он выбирает отрезок \([3,4]\), так что последовательность становится равна 0000.

Q: Как интерактор выбирает между \([1,r]\) and \([l,n]\)? Это действительно случайный выбор?

A: Интерактор использует секретный генератор псевдослучайных чисел. Только \(s\) и ваши запросы будут хешированы и использованы как ключ для генератора. Поэтому, если вы используете одну и ту же последовательность запросов для одной и той же секретной строки, вы будете получать один и тот же результат. За исключением этого, вы можете считать решения действительно случайными, как подбрасывание идеальной монетки. Вам не нужно (и вы не должны) пользоваться тем, какой именно генератор используется, чтобы решить эту задачу.

A. Вася и книга

математика реализация *1200

Вася читает электронную книгу из \(n\) страниц, пронумерованных от \(1\) до \(n\). Сейчас он находится на странице с номером \(x\) и хочет попасть на страницу с номером \(y\). За одно действие он может пролистнуть вперед или назад \(d\) страниц, при этом он не может выйти за пределы книги. Например, если в книге \(10\) страниц и \(d = 3\), то с первой страницы Вася может попасть на первую или четвертую, со второй — на первую или пятую страницы, с шестой — на третью или девятую, с восьмой — на десятую или пятую.

Сообщите Васе минимальное количество действий, необходимое для попадания на страницу с номером \(y\).

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

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^3\)) — количество тестовых примеров.

Каждый тестовый пример содержит четыре целых числа \(n\), \(x\), \(y\), \(d\) (\(1\le n, d \le 10^9\), \(1 \le x, y \le n\)) — количество страниц в книге, номер стартовой страницы, номер конечной страницы и количество страниц, которые Вася может пролистнуть за одно действие.

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

Для каждого теста выведите по одной строке.

Если Вася может попасть со страницы \(x\) на страницу \(y\), выведите минимальное количество действий для этого. Иначе выведите \(-1\).

Примечание

В первом тестовом примере оптимальная последовательность выглядит следующим образом: \(4 \rightarrow 2 \rightarrow 1 \rightarrow 3 \rightarrow 5\).

Во втором тестовом примере Вася может попасть на страницы \(1\) и \(5\).

В третьем тестовом примере оптимальная последовательность выглядит следующим образом: \(4 \rightarrow 7 \rightarrow 10 \rightarrow 13 \rightarrow 16 \rightarrow 19\).

D. Граф максимального диаметра

графы Конструктив реализация *1800

Ура, конструктивные графовые задачи вернулись! В этот раз надо построить граф со следующими свойствами.

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

Диаметр (также «длиннейший кратчайший путь») связного неориентированного графа — это максимальное число ребер на кратчайшем пути между всеми парами вершин.

Степень вершины равна количеству инцидентных ей ребер.

По заданной последовательности из \(n\) целых чисел \(a_1, a_2, \dots, a_n\) постройте связный неориентированный граф, состоящий из \(n\) вершин, такой, чтобы:

  • в графе не содержалось петель и кратных ребер;
  • степень \(d_i\) вершины \(i\) не превышала \(a_i\) (то есть \(d_i \le a_i\));
  • диаметр графа максимально возможный.

Выведите полученный граф или сообщите, что ответа не существует.

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

В первой строке записано одно целое число \(n\) (\(3 \le n \le 500\)) — количество вершин в графе.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n - 1\)) — ограничения на степени вершин.

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

Выведите «NO», если невозможно построить граф с заданными ограничениями.

В противном случае выведите «YES» и диаметр полученного графа в первой строке.

Во второй строке выведите единственное целое число \(m\) — количество ребер в полученном графе.

В \(i\)-й из следующих \(m\) строк выведите два целых числа \(v_i, u_i\) (\(1 \le v_i, u_i \le n\), \(v_i \neq u_i\)) — описание \(i\)-го ребра. Граф не должен содержать кратных ребер — для каждой выведенной пары \((x, y)\) вывод не должен содержать больше пар \((x, y)\) и \((y, x)\).

Примечание

На картинках изображены графы для первых двух примеров. Оба графа имеют диаметр \(2\).

\(d_1 = 1 \le a_1 = 2\)

\(d_2 = 2 \le a_2 = 2\)

\(d_3 = 1 \le a_3 = 2\)

\(d_1 = 1 \le a_1 = 1\)

\(d_2 = 4 \le a_2 = 4\)

\(d_3 = 1 \le a_3 = 1\)

\(d_4 = 1 \le a_4 = 1\)

D. Орехус сходит с ума

реализация Структуры данных *3500

Орехус зачем-то нашел массив целых чисел \(a\) длины \(n\). Назовем подотрезком \(l \ldots r\) массива подпоследовательность подряд идущих элементов массива с \(l\) по \(r\), то есть \(a_l, a_{l+1}, a_{l+2}, \ldots, a_{r-1}, a_{r}\).

Никто не знает почему, но он считает пару подотрезков хорошими тогда и только тогда, когда выполняются следующие условия:

  1. Эти подотрезки не вложены, друг в друга. То есть, каждый подотрезок должен содержать элемент (со своим индексом), который не принадлежит другому.
  2. Подотрезки пересекаются и каждое число, принадлежащее пересечению отрезков (как элемент), принадлежит каждому их них ровно по одному разу.

Например \(a=[1, 2, 3, 5, 5]\). Пары отрезков \((1 \ldots 3; 2 \ldots 5)\) и \((1 \ldots 2; 2 \ldots 3)\) — хорошие, а \((1 \dots 3; 2 \ldots 3)\) и \((3 \ldots 4; 4 \ldots 5)\) — нет (отрезок \(2 \ldots 3\) вложен в \(1 \ldots 3\); число \(5\) встречается в обоих отрезках, но в отрезке \(4 \ldots 5\) встречается дважды.

Помогите Орехусу узнать количество пар хороших подотрезков! Так как ответ может быть очень большой выведите его по модулю \(10^9+7\).

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

В первой строке содержится длина массива \(n\) (\(1 \le n \le 10^5\)) — длина массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)) — числа массива.

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

Выведите единственное число — количество пар хороших отрезков по модулю \(10^9+7\).

Примечание

В первом примере есть только одна пара хороших подотрезков: \((1 \ldots 2, 2 \ldots 3)\).

Во втором примере есть четыре пары хороших подотрезков:

  • \((1 \ldots 2, 2 \ldots 3)\)
  • \((2 \ldots 3, 3 \ldots 4)\)
  • \((2 \ldots 3, 3 \ldots 5)\)
  • \((3 \ldots 4, 4 \ldots 5)\)

A. Орехус и лифт

Перебор реализация *1000

Орехус живет в доме с \(n\) этажами. На \(i\)-м этаже живут \(a_i\) людей. Каждый житель пользуется лифтом два раза в день: чтобы добраться со своего этажа на первый, и, чтобы добраться с первого на свой, когда возвращается домой.

Было решено, что, когда лифт не работает, он всегда будет стоять на \(x\)-м этаже, но \(x\) пока не выбрали. Когда какому-то жителю надо добраться с этажа \(a\) на этаж \(b\), лифт действует по следующему алгоритму:

  • Перемещается с \(x\)-го этажа (изначально лифт стоит на \(x\)-м этаже) на \(a\)-й и забирает пассажира.
  • Перемещается с \(a\)-го этажа на \(b\)-й и выпускает пассажира (если \(a\) равен \(b\), то лифт все равно приезжает на нужный этаж с \(x\)-го).
  • Перемещается с \(b\)-го этажа обратно на \(x\)-й и ждет там следующего вызова.
Лифт никогда не перемещает более одного человека и всегда возвращается пустым на \(x\)-й этаж перед тем, как начать перемещать следующего пассажира. Лифт тратит одну единицу энергии, чтобы переместиться между соседними этажами. Следовательно, чтобы переместиться с \(a\)-го этажа на \(b\)-й, необходимо \(|a - b|\) единиц энергии.

Ваша задача помочь Орехусу найти минимальное число единиц энергии, которой хватит на один целый день, выбрав оптимальный \(x\)-й этаж. Не забудьте, что лифт начинает и заканчивает на \(x\)-м этаже.

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

Первая строка одно целое число \(n\) (\(1 \leq n \leq 100\)) — количество этажей в доме.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 100\)) — количество жителей на каждом из этажей.

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

В единственной строке выведите одно целое число — минимальное количество единиц энергии.

Примечание

В первом примере, если в качестве этажа \(x\) выбрать второй, то двое жителей второго этажа за день потратят по \(4\) единицы энергии каждый (\(2\), чтобы спуститься вниз, и \(2\), чтобы подняться наверх), а единственный житель третьего этажа потратит \(8\) за день (\(4\), чтобы спуститься вниз, и \(4\), чтобы подняться наверх). \(4 \cdot 2 + 8 \cdot 1 = 16\).

Во втором примере оптимальный ответ достигается при выборе первого этажа в качестве \(x\)-го.

B. Квас и Орехус

жадные алгоритмы реализация *1200

Орехус очень любит квас. На день рождения родители подарили ему \(n\) бочонков, в \(i\)-м из которых \(v_i\) литров кваса. На каждом из них есть рычажок, потянув за который Орехус может налить себе в стакан ровно \(1\) литр кваса. Так как Орехус большой любитель этого напитка, он хочет налить себе в стакан \(s\) литров кваса. Но он хочет это сделать таким образом, чтобы объем кваса в минимальном из бочонков был максимален.

Помогите Орехусу узнать, какой максимальный объем кваса может быть в минимальном из бочонков или определите, что налить \(s\) литров кваса невозможно!

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

Первая строка содержит два целых числа \(n\) и \(s\) (\(1 \le n \le 10^3\), \(1 \le s \le 10^{12}\)) — количество бочонков и объем стакана.

Вторая строка содержит \(n\) целых чисел \(v_1, v_2, \ldots, v_n\) (\(1 \le v_i \le 10^9\)) — объем кваса в \(i\)-м бочонке.

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

Если Орехус не может налить себе \(s\) литров кваса, то выведите \(-1\). В противном случае выведите одно целое число — минимальный объем кваса в бочонках.

Примечание

В первом примере ответ \(3\). Орехус может налить из первого бочонка \(1\) литр кваса, а из третьего \(2\) литра. Во всех бочонках будет по \(3\) литра.

Во втором примере ответ \(2\), Орехус может налить из первого бочонка \(3\) литра и из второго \(1\) литр.

В третьем примере Орехус не может налить себе \(7\) литров кваса, поэтому ответ \(-1\).

C. Орехус и строка

дп Комбинаторика реализация *1500

Орехус нашел строку \(s\), состоящую из латинских букв нижнего регистра. Орехус любознательный парень, поэтому ему стал интересен следующий вопрос: сколько существует строго возрастающих последовательностей \(p_1, p_2, \ldots, p_k\) таких, что:

  1. Для каждого \(i\) (\(1 \leq i \leq k\)), \(s_{p_i} =\) 'a'.
  2. Для каждого \(i\) (\(1 \leq i < k\)), существует \(j\), что \(p_i < j < p_{i + 1}\) и \(s_j =\) 'b'.

Удовлетворите любопытство Орехуса, или он расстроится.

Это число должно быть посчитано по модулю \(10^9 + 7\).

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

В первой строке входных данных находится строка \(s\) (\(1 \leq |s| \leq 10^5\)) из латинских букв нижнего регистра.

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

В единственной строке выведите ответ — число искомых последовательностей \(p_1, p_2, \ldots, p_k\) по модулю \(10^9 + 7\).

Примечание

В первом примере \(5\) допустимых последовательностей. \([1]\), \([4]\), \([5]\), \([1, 4]\), \([1, 5]\).

Во втором примере \(4\) допустимых последовательности. \([2]\), \([3]\), \([4]\), \([5]\).

В третьем примере \(3\) допустимых последовательности. \([1]\), \([3]\), \([4]\).

A. Право-левое шифрование

реализация Строки *800

Поликарп обожает шифры. Недавно он изобрёл свой собственный, который назвал право-левым.

Право-левое шифрование используется для шифрования строк. Чтобы зашифровать строку \(s=s_{1}s_{2} \dots s_{n}\) Поликарп выполняет следующие шаги:

  • он выписывает \(s_1\),
  • к текущему результату приписывает справа \(s_2\),
  • к текущему результату приписывает слева \(s_3\),
  • к текущему результату приписывает справа \(s_4\),
  • к текущему результату приписывает слева \(s_5\),
  • и так далее, пока не будут обработаны все символы строки.

Например, если \(s\)="techno", то процесс шифрования будет выглядеть так: "t" \(\to\) "te" \(\to\) "cte" \(\to\) "cteh" \(\to\) "ncteh" \(\to\) "ncteho". Таким образом, для \(s\)="techno" результат шифрования равен "ncteho".

Дана строка \(t\) — результат шифрования некоторой строки \(s\). Ваша задача расшифровать, то есть найти строку \(s\).

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

Единственная строка входных данных содержит \(t\) — результат шифрования некоторой строки \(s\). Заданная строка содержит только строчные буквы латинского алфавита, длина \(t\) — от \(1\) до \(50\) включительно.

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

Выведите такую строку \(s\), которая после шифрования равна \(t\).

C. Соедините тройку

математика реализация *1600

Национальный лес Квадрляндии был разделен на одинаковые квадратные участки размером \(1 \times 1\), выровненные по направлениям с севера на юг и с востока на запад. Каждый участок может быть однозначно задан целочисленными Декартовыми координатами \((x, y)\) своего юго-западного угла.

Три друга, Алиса, Боб и Чарли собираются купить три отдельных участка земли \(A, B, C\) в лесу. Изначально все участки в лесу (включая участки \(A, B, C\)) покрыты деревьями. Друзья хотят навещать друг друга, поэтому они хотят очистить некоторые участки от деревьев. После очистки, можно будет добраться до любого из участков \(A, B, C\) от любого другого, перемещаясь по соседним очищенным участкам. Два земельных участка являются соседними, если они имеют общую сторону.

Например, \(A=(0,0)\), \(B=(1,1)\), \(C=(2,2)\). Необходимо очистить как минимум \(5\) участков, чтобы соединить друзей. Эти участки выделены серым цветом.

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

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

Первая строка содержит два целых числа \(x_A\) и \(y_A\) — координаты участка \(A\) (\(0 \leq x_A, y_A \leq 1000\)). Следующие две строки описывают координаты \((x_B, y_B)\) и \((x_C, y_C)\) участков \(B\) и \(C\), соответственно, в таком же формате (\(0 \leq x_B, y_B, x_C, y_C \leq 1000\)). Гарантируется, что все три участка различны.

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

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

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

Примечание

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

Второй пример изображен на этой картинке:

D. Дерево минимального диаметра

Деревья Конструктив реализация *1700

Вам дано дерево (неориентированный связный граф без циклов) и целое число \(s\).

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

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

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

В первой строке даны два целых числа \(n\) и \(s\) (\(2 \leq n \leq 10^5\), \(1 \leq s \leq 10^9\)) — количество вершин в дереве и сумма весов ребер.

В каждой из следующих \(n−1\) строк через пробел записаны по два целых числа \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq n\), \(a_i \neq b_i\)) — номера вершин, соединенных ребром.

Гарантируется, что заданные ребра задают дерево.

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

Выведите минимальный диаметр дерева, который мог получиться при какой-то расстановке неотрицательных весов на ребра этого дерева, которые в сумме дают \(s\).

Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить \(10^{-6}\).

А именно: пусть ваш ответ равен \(a\), а ответ жюри \(b\). Ваш ответ будет засчитан, если \(\frac {|a-b|} {max(1, b)} \leq 10^{-6}\).

Примечание

В первом примере необходимо расставить веса так:

Легко видеть, что диаметр такого дерева будет равен \(2\). Можно доказать, что это минимально возможный диаметр, который можно получить, как-то расставив веса.

Вo втором примере необходимо расставить веса так:

E. Вася и паттерны

жадные алгоритмы реализация Строки *2300

У Васи есть три строки \(s\), \(a\) и \(b\), состоящие из первых \(k\) букв латинского алфавита.

Назовем паттерном строку длины \(k\), где каждая из первых \(k\) букв латинского алфавита встречается ровно один раз (таким образом, существует ровно \(k!\) различных паттернов). Применение паттерна \(p\) к строке \(s\) — это замена каждой буквы строки \(s\) на \(p_i\), где \(i\) – это порядковый номер этой буквы в латинском алфавите. Например, применив паттерн «bdca» к строке «aabccd» мы получим строку «bbdcca».

Васю интересует, существует ли такой паттерн, применив который к строке \(s\), он получит строку, лексикографически больше либо равную строки \(a\) и лексикографически меньше либо равную строки \(b\).

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

Строка \(a\) лексикографически меньше строки \(b\), если существует такое \(i\) (\(1 \le i \le n\)), что \(a_i < b_i\), а для любого \(j\) (\(1 \le j < i\)) \(a_j = b_j\).

В этой задаче вам необходимо ответить на \(t\) независимых тестовых наборов.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^6\)) — количество тестовых наборов.

Во взломах можно использовать только \(t = 1\).

Каждая из следующих \(t\) строк содержит описание тестового набора в следующем формате:

Первая строка тестового набора содержит целое число \(k\) (\(1 \le k \le 26\)) — длина необходимого паттерна.

Вторая строка тестового набора содержит строку \(s\) (\(1 \le |s| \le 10^6\)).

Третья строка тестового набора содержит строку \(a\).

Четвертая строка тестового набора содержит строку \(b\).

Строки \(s\), \(a\) и \(b\) имеют одинаковую длину (\(|s| = |a| = |b|\)) и состоят из первых \(k\) букв латинского алфавита, все буквы строчные.

Гарантируется, что строка \(a\) лексикографически меньше либо равна строке \(b\).

Также гарантируется, что сумма длин строк по всем тестовым наборам не превосходит \(3 \cdot 10^6\).

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

На каждый тестовый набор выведите ответ в следующем формате:

Если не существует подходящего паттерна, то в первой строке выведите «NO».

Иначе в первой строке выведите «YES», а во второй сам паттерн (\(k\) строчных букв, каждая из первых \(k\) букв латинского алфавита должна встретиться ровно один раз).

Если существует несколько подходящих паттернов — разрешается вывести любой.

B. Ехаб и вычитания

реализация сортировки *1000

Вам дан массив \(a\). Необходимо повторить следующую операцию \(k\) раз: найти минимальный ненулевой элемент в массиве, вывести его, а затем вычесть его из всех ненулевых элементов массива. Если все элементы нули, просто выведите 0.

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

В первой строке входного файла записано два целых числа \(n\) и \(k\) \((1 \le n,k \le 10^5)\) — длина массива и количество операций, которые необходимо выполнить, соответственно.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) \((1 \le a_i \le 10^9)\), разделенных пробелами — элементы массива.

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

Выводите минимальные ненулевые элементы перед каждой операцией, по одному в строке.

Примечание

В первом примере:

На первом шаге: массив равен \([1,2,3]\), и минимальный ненулевой элемент в нем это 1.

На втором шаге: массив равен \([0,1,2]\), и минимальный ненулевой элемент в нем это 1.

На третьем шаге: массив равен \([0,0,1]\), и минимальный ненулевой элемент в нем это 1.

На четвертом и пятом шаге массив равен \([0,0,0]\), поэтому вы должны вывести 0.

Во втором примере:

На первом шаге: массив равен \([10,3,5,3]\), и минимальный ненулевой элемент в нем это 3.

На втором шаге: массив равен \([7,0,2,0]\), и минимальный ненулевой элемент в нем это 2.

D. Ехаб и еще одна очередная задача на xor

битмаски интерактив Конструктив реализация *2000

Это интерактивная задача!

Ехаб играет в игру с Лагги. Ехаб имеет два загаданных числа \((a,b)\). Лагги может сказать пару чисел \((c,d)\) и Ехаб ответит:

  • 1 если \(a \oplus c>b \oplus d\).
  • 0 если \(a \oplus c=b \oplus d\).
  • -1 если \(a \oplus c<b \oplus d\).

Операция \(a \oplus b\) обозначает операцию побитовое исключающее «ИЛИ» чисел \(a\) и \(b\).

Лагги нужно угадать \((a,b)\) не более, чем за 62 вопроса. Вам предлагается сыграть в эту игру. Вы играете за Лагги, а программа жюри - за Ехаба.

Гарантируется, что \(0 \le a,b<2^{30}\).

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

См. протокол взаимодействия.

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

Чтобы вывести ответ, выведите "! a b" (без кавычек). Не забудьте сбросить буфер вывода после того, как выведете ответ.

Протокол взаимодействия

Чтобы задать вопрос, выведите "? c d" (без кавычек). \(c\) и \(d\) должны быть неотрицательными целыми числами, меньшими \(2^{30}\). Не забудьте сбросить буфер вывода после того, как зададите вопрос.

После каждого вопроса вы должны считать ответ. Если программа жюри отвечает числом -2, это значит, что ваша программа задала больше, чем 62 запроса и должна завершиться.

Чтобы сбросить буфер вывода вы можете использовать:

  • fflush(stdout) в C++.
  • System.out.flush() в Java.
  • stdout.flush() в Python.
  • flush(output) в Pascal.
  • Прибегните к документации других языков.

Взломы:

Чтобы взломать решение другого участника, выведите два целых числа \(a\) и \(b\) \((0 \le a,b<2^{30})\).

Примечание

В примере из условия:

Загаданные числа: \(a=3\), \(b=1\).

В первом вопросе: \(3 \oplus 2 = 1\) и \(1 \oplus 1 = 0\), и ответ равен 1.

Во втором вопросе: \(3 \oplus 1 = 2\) и \(1 \oplus 2 = 3\), и ответ равен -1.

В третьем вопросе: \(3 \oplus 2 = 1\) и \(1 \oplus 0 = 1\), и ответ равен 0.

После этого программа выводит ответ и завершается.

A. Счастливая сумма цифр

Перебор реализация *1000

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

Пете очень интересно, какое минимальное счастливое число имеет сумму цифр n. Помогите ему справиться с этой задачей.

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

В единственной строке задано целое число n (1 ≤ n ≤ 106) — сумма цифр искомого счастливого числа.

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

В единственной строке выведите результат — минимальное счастливое число, сумма цифр которого равна n. Если такого числа не существует, выведите -1.

A. Новый год и рождественский орнамент

математика Перебор реализация *800

Алиса и Боб украшают рождественскую ёлку.

Алиса хочет использовать только \(3\) вида украшений на ёлке: желтые, синие и красные. У них есть \(y\) жёлтых украшений, \(b\) синих украшений и \(r\) красных украшений.

По мнению Боба рождественская ёлка красивая, если:

  • синих украшений больше жёлтых ровно на \(1\) и
  • красных украшений больше синих ровно на \(1\).

То есть, если у них есть \(8\) жёлтых украшений, \(13\) синих украшений и \(9\) красных украшений, то можно выбрать \(4\) жёлтых, \(5\) синих и \(6\) красных украшений (\(5=4+1\) и \(6=5+1\)).

Алиса хочет выбрать максимальное количество украшений, но она также хочет, чтобы рождественская ёлка была красивой по мнению Боба.

Два абзаца выше был описан пример, в котором также можно выбрать \(7\) жёлтых, \(8\) синих и \(9\) красных украшений. Если мы это сделаем, то мы получим \(7+8+9=24\) украшений. Это максимально возможное количество.

Поскольку Алиса и Боб заняты подготовкой еды на Канун Нового Года, они просят вас найти максимальное количество украшений, которыми можно украсить красивую рождественскую ёлку!

Гарантируется, что можно выбрать как минимум \(6\) (\(1+2+3=6\)) украшений.

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

Единственная строка содержит три целых числа \(y\), \(b\), \(r\) (\(1 \leq y \leq 100\), \(2 \leq b \leq 100\), \(3 \leq r \leq 100\)) — количество жёлтых, синих и красных украшений.

Гарантируется, что можно выбрать как минимум \(6\) (\(1+2+3=6\)) украшений.

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

Выведите одно число — максимальное количество украшений, которые можно использовать.

Примечание

В первом примере ответ \(7+8+9=24\).

Во втором примере ответ \(2+3+4=9\).

B. Новый год и местоположение сокровища

жадные алгоритмы Конструктив Перебор реализация *1200

Боб — пират, ищущий величайшее сокровище, которое когда-либо видел мир. Известно, что сокровище расположено в точке \(T\), координаты которой только предстоит узнать.

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

Как известно, мир — это двумерная плоскость. \(i\)-й обелиск находится в целочисленных координатах \((x_i, y_i)\). \(j\)-я подсказка состоит из \(2\) целых чисел \((a_j, b_j)\) и принадлежит обелиску \(p_j\), где \(p\) — некоторая (неизвестная) перестановка из \(n\) элементов. Это означает, что сокровище находится в точке \(T=(x_{p_j} + a_j, y_{p_j} + b_j)\). Эта точка \(T\) должно быть одинакова для всех подсказок.

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

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

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

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 1000\)) — количество обелисков, оно же равно количество подсказок.

Каждая из следующих \(n\) строк содержит два целых числа \(x_i\), \(y_i\) (\(-10^6 \leq x_i, y_i \leq 10^6\)) — координаты \(i\)-го обелиска. Все координаты различны, то есть \(x_i \neq x_j\) или \(y_i \neq y_j\) выполняется для каждой пары \((i, j)\), такой что \(i \neq j\).

Каждая из следующих \(n\) строк содержит два целых числа \(a_i\), \(b_i\) (\(-2 \cdot 10^6 \leq a_i, b_i \leq 2 \cdot 10^6\)) — направление \(i\)-й подсказки. Все координаты различны, то есть \(a_i \neq a_j\) или \(b_i \neq b_j\) выполняется для каждой пары \((i, j)\), такой что \(i \neq j\).

Гарантируется, что существует перестановка \(p\) такая, что для каждой пары \(i,j\) правда, что \(\left(x_{p_i} + a_i, y_{p_i} + b_i\right) = \left(x_{p_j} + a_j, y_{p_j} + b_j\right)\).

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

Выведите два числа \(T_x, T_y\) — координаты сокровища.

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

Примечание

Поскольку \(n = 2\), мы можем рассмотреть все перестановки двух элементов.

Если \(p = [1, 2]\), то обелиск \((2, 5)\) содержит подсказку \((7, -2)\), которая значит, что сокровище спрятано в \((9, 3)\). Второй обелиск \((-6, 4)\) содержал бы подсказку \((-1,-3)\) и сокровище было бы в \((-7, 1)\). Однако оба обелиска должны указывать одно и то же местоположение, поэтому это явно неправильная перестановка.

Если же спрятанная перестановка — это \([2, 1]\), тогда первая подсказка принадлежит второму обелиску, а вторая подсказка первому обелиску. Поэтому \((-6, 4) + (7, -2) = (2,5) + (-1,-3) = (1, 2)\), значит \(T = (1,2)\) — это местоположение сокровища.

Во втором примере скрытая перестановка — \([2, 3, 4, 1]\).

E. Новый год и оценка знакомых

Бинарный поиск графы жадные алгоритмы математика реализация сортировки Структуры данных *2400

Боб — активный пользователь социальной сети Faithbug. В этой сети люди могут становиться взаимными друзьями. То есть, если \(a\) является другом \(b\), то \(b\) также является другом \(a\). Таким образом у каждого пользователя есть неотрицательное количество друзей.

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

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 5 \cdot 10^5\)) — количество людей в сети, не считая Боба.

Вторая строка содержит \(n\) целых чисел \(a_1,a_2, \dots, a_n\) (\(0 \leq a_i \leq n\)), где \(a_i\) — количество друзей у \(i\)-го человека.

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

Выведите все возможные значения \(a_{n+1}\) — количества людей, с которыми Боб может быть друзями, в порядке возрастания.

Если ни одного решения не существует, выведите \(-1\).

Примечание

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

Во втором примере есть три возможных решения (кроме симметричных):

  • \(a\) — друг \(b\), \(c\) — друг \(d\), а у Боба нет друзей, или
  • \(a\) — друг \(b\), а также и \(c\), и \(d\) — друзья Боба, или
  • Боб — друг каждому.

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

A. Равномерная строка

реализация *800

Задано два целых числа \(n\) и \(k\).

Ваша задача — построить строку \(s\) длины \(n\) такую, что для каждого \(i\) от \(1\) до \(k\) в ней есть хотя бы одна \(i\)-я буква латинского алфавита (первой буквой является 'a', второй — 'b' и так далее) и никаких других букв в этой строке нет. Вам необходимо максимизировать минимальную частоту какой-либо буквы (частотой буквы называется количество ее вхождений в строку). Если существует несколько возможных ответов, вы можете вывести любой.

Вам необходимо ответить на \(t\) независимых запросов.

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

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество запросов.

Следующие \(t\) строк содержат запросы, по одному в строке. \(i\)-я строка содержит два целых числа \(n_i\) и \(k_i\) (\(1 \le n_i \le 100, 1 \le k_i \le min(n_i, 26)\)) — длина строки в \(i\)-м запросе и количество символов в \(i\)-м запросе.

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

Выведите \(t\) строк. В \(i\)-й строке выведите ответ на \(i\)-й запрос: любую строку \(s_i\), удовлетворяющую вышеописанным условиям с ограничениями из \(i\)-го запроса.

Примечание

В первом запросе из примера максимально возможная минимальная частота равна \(2\), можно легко увидеть, что лучшего ответа добиться нельзя. Другие примеры правильных ответов: «cbcabba», «ccbbaaa» (любая перестановка этих ответов также является правильной).

Во втором запросе из примера любая перестановка первых четырех букв является правильным ответом (максимально возможная минимальная частота равна \(1\)).

В третьем запросе из примера любая перестановка данного ответа является правильной (максимально возможная минимальная частота равна \(3\)).

D1. Великая Вовина Стена (Версия 1)

жадные алгоритмы математика реализация *2200

Семья Вовы строит Великую Вовину Стену (название придумано Вовой). Многие поколения внесли свой вклад в ее постройку. Теперь на Вове лежит важное задание завершить ее.

На данный момент стена может быть представлена в виде последовательности \(a\) из \(n\) целых чисел, где \(a_i\) — это высота \(i\)-й части стены.

Вова может класть лишь только кирпичи \(2 \times 1\) в стену (однако их запас у него не ограничен).

Вова может класть кирпичи горизонтально на соседние части стены равной высоты. Это значит, что если для некоторого \(i\) текущая высота части \(i\) равна высоте части \(i + 1\), то Вова может положить туда кирпич и увеличить обе высоты на 1. Очевидно, Вова не может класть кирпичи так, чтобы их части оказывались за границами (левее части \(1\) стены или правее ее части \(n\)).

Следующий абзац есть только в версии 1 задачи.

Вова также может класть кирпичи вертикально. То есть увеличивать высоту любой части стены на 2.

Вова перфекционист, поэтому он считает стену завершенной, когда:

  • все части стены имеют одинаковую высоту;
  • в стене нет отверстий без кирпичей.

Может ли Вова завершить постройку стены, использовав произвольное количество кирпичей (возможно ноль)?

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

В первой строке записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество частей стены.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — начальные высоты частей стены.

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

Выведите «YES», если Вова может завершить постройку стены, использовав произвольное количество кирпичей (возможно ноль).

В противном случае выведите «NO».

Примечание

В первом примере Вова может положить кирпич на части 2 и 3, чтобы сделать стену \([2, 2, 2, 2, 5]\), а затем положить 3 кирпича на части 1 и 2 и 3 кирпича на части 3 и 4, чтобы сделать ее \([5, 5, 5, 5, 5]\).

Во втором примере Вова может положить кирпич вертикально на часть 3, чтобы сделать стену \([4, 5, 5]\), затем горизонтально на части 2 и 3, чтобы сделать \([4, 6, 6]\), а потом вертикально на часть 1, чтобы сделать \([6, 6, 6]\).

В третьем примере стена уже завершена.

D2. Великая Вовина Стена (Версия 2)

реализация Структуры данных *2200

Семья Вовы строит Великую Вовину Стену (название придумано Вовой). Многие поколения внесли свой вклад в ее постройку. Теперь на Вове лежит важное задание завершить ее.

На данный момент стена может быть представлена в виде последовательности \(a\) из \(n\) целых чисел, где \(a_i\) — это высота \(i\)-й части стены.

Вова может класть лишь только кирпичи \(2 \times 1\) в стену (однако их запас у него не ограничен).

Вова может класть кирпичи только горизонтально на соседние части стены равной высоты. Это значит, что если для некоторого \(i\) текущая высота части \(i\) равна высоте части \(i + 1\), то Вова может положить туда кирпич и увеличить обе высоты на 1. Очевидно, Вова не может класть кирпичи так, чтобы их части оказывались за границами (левее части \(1\) стены или правее ее части \(n\)).

Обратите внимание, что Вова не может класть кирпичи вертикально.

Вова перфекционист, поэтому он считает стену завершенной, когда:

  • все части стены имеют одинаковую высоту;
  • в стене нет отверстий без кирпичей.

Может ли Вова завершить постройку стены, использовав произвольное количество кирпичей (возможно ноль)?

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

В первой строке записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество частей стены.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — начальные высоты частей стены.

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

Выведите «YES», если Вова может завершить постройку стены, использовав произвольное количество кирпичей (возможно ноль).

В противном случае выведите «NO».

Примечание

В первом примере Вова может положить кирпич на части 2 и 3, чтобы сделать стену \([2, 2, 2, 2, 5]\), а затем положить 3 кирпича на части 1 и 2 и 3 кирпича на части 3 и 4, чтобы сделать ее \([5, 5, 5, 5, 5]\).

Во втором примере Вова не может положить кирпичей в стену.

В третьем примере стена уже завершена.

A. Повторное шифрование

реализация *800

Поликарп обожает шифры. Недавно он изобрёл свой собственный, который назвал повторным.

Повторный шифр используется для шифрования строк. Чтобы зашифровать строку \(s=s_{1}s_{2} \dots s_{m}\) (\(1 \le m \le 10\)). Поликарп выполняет следующие шаги:

  • он выписывает \(s_1\) один раз,
  • он выписывает \(s_2\) два раза,
  • он выписывает \(s_3\) три раза,
  • ...
  • он выписывает \(s_m\) \(m\) раз.

Например, если \(s\)="bab", то процесс шифрования будет выглядеть так: "b" \(\to\) "baa" \(\to\) "baabbb". Таким образом, для \(s\)="bab" результат шифрования равен "baabbb".

Дана строка \(t\) — результат шифрования некоторой строки \(s\). Ваша задача расшифровать, то есть найти строку \(s\).

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

В первой строке записано целое число \(n\) (\(1 \le n \le 55\)) — длина зашифрованной строки. Вторая строка содержит \(t\) — результат шифрования некоторой строки \(s\). Заданная строка содержит только строчные буквы латинского алфавита, длина \(t\) равна \(n\).

Гарантируется, что ответ на тест существует.

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

Выведите такую строку \(s\), которая после шифрования равна \(t\).

B. Стабилизация массива

реализация *900

Задан массив \(a\), состоящий из \(n\) целых чисел.

Назовем нестабильностью массива следующую величину: \(\max\limits_{i = 1}^{n} a_i - \min\limits_{i = 1}^{n} a_i\).

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

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

Первая строка входных данных содержит одно целое число \(n\) (\(2 \le n \le 10^5\)) — количество элементов в массиве \(a\).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^5\)) — элементы массива \(a\).

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

Выведите одно целое число — минимально возможную нестабильность массива \(a\), если вы удалите ровно один его элемент.

Примечание

В первом тестовом примере вы можете удалить \(7\), тогда нестабильность оставшегося массива будет равна \(3 - 1 = 2\).

Во втором тестовом примере вы можете удалить либо \(1\), либо \(100000\), тогда нестабильность оставшегося массива будет равна \(100000 - 100000 = 0\) и \(1 - 1 = 0\) соответственно.

D. Хоровод

реализация *1600

\(n\) детей с номерами от \(1\) до \(n\) танцуют хоровод вокруг новогодней елки. Пронумеруем их в порядке по часовой стрелке как \(p_1\), \(p_2\), ..., \(p_n\) (все эти числа от \(1\) до \(n\) и различны, таким образом, \(p\) — перестановка). Следующий ребенок после ребенка \(p_i\) имеет номер \(p_{i + 1}\), если \(i < n\), или \(p_1\) в ином случае. После танца каждый ребенок запомнил двух других детей: следующего ребенка (назовем его \(x\)) и следующего после \(x\) ребенка. Каждый ребенок сообщил вам, каких детей он запомнил: ребенок \(i\) запомнил детей \(a_{i, 1}\) и \(a_{i, 2}\). Тем не менее, порядок \(a_{i, 1}\) и \(a_{i, 2}\) может отличаться от их порядка в хороводе.

Пример: 5 детей в хороводе, \(p=[3, 2, 4, 1, 5]\) (или любой циклический сдвиг). Информация, которую запомнили дети: \(a_{1,1}=3\), \(a_{1,2}=5\); \(a_{2,1}=1\), \(a_{2,2}=4\); \(a_{3,1}=2\), \(a_{3,2}=4\); \(a_{4,1}=1\), \(a_{4,2}=5\); \(a_{5,1}=2\), \(a_{5,2}=3\).

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

Если вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код.

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

Первая строка входных данных содержит одно целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — количество детей.

Следующие \(n\) строк содержат по \(2\) целых числа. \(i\)-я строка содержит два целых числа \(a_{i, 1}\) и \(a_{i, 2}\) (\(1 \le a_{i, 1}, a_{i, 2} \le n, a_{i, 1} \ne a_{i, 2}\)) — дети, которых запомнил \(i\)-й ребенок, в произвольном порядке.

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

Выведите \(n\) целых чисел \(p_1\), \(p_2\), ..., \(p_n\) — перестановку целых чисел от \(1\) до \(n\), которая соответствует порядку детей в хороводе. Если существует несколько возможных ответов, вы можете вывести любой (например, не имеет значения, какой ребенок является первым в хороводе). Гарантируется, что хотя бы одно решение существует.

E. Почти правильная скобочная последовательность

реализация *1900

Задана скобочная последовательность \(s\), состоящая из \(n\) открывающих '(' и закрывающих ')' скобок.

Правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов '1' и '+'. Например, скобочные последовательности «()()», «(())» — правильные (полученные выражения: «(1)+(1)», «((1+1)+1)»), а «)(» и «(» — нет.

Вы можете изменить тип какой-либо скобки \(s_i\). Это значит, что если \(s_i = \) ')', то вы можете заменить ее на '(' и наоборот.

Ваша задача — посчитать количество позиций \(i\) таких, что если вы измените тип \(i\)-й скобки, то получившаяся скобочная последовательность станет правильной.

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^6\)) — длину скобочной последовательности.

Вторая строка входных данных содержит строку \(s\), состоящую из \(n\) открывающих '(' и закрывающих ')' скобок.

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

Выведите одно целое число — количество позиций \(i\) таких, что если вы измените тип \(i\)-й скобки, то получившаяся скобочная последовательность станет правильной.

A. Найди кратные

жадные алгоритмы математика реализация *800

Задан отрезок положительных целых чисел от \(l\) до \(r\).

Найдите такую пару целых чисел \((x, y)\), что \(l \le x, y \le r\), \(x \ne y\) и \(x\) делит \(y\).

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

Также требуется ответить на \(T\) независимых запросов.

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

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

В каждой из следующих \(T\) строк записаны по два целых числа \(l\) и \(r\) (\(1 \le l \le r \le 998244353\)) — включительные границы отрезка.

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

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

Выведите \(T\) строк, в каждой строке должен быть записан ответ — два целых числа \(x\) и \(y\) таких, что \(l \le x, y \le r\), \(x \ne y\) и \(x\) делит \(y\). Ответ в \(i\)-й строке должен относиться к \(i\)-му запросу из входных данных.

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

A. Геннадий и карточная игра

Перебор реализация *800

Геннадий владеет и живёт в небольшом провинциальном отеле. Он любит совершать длительные прогулки, смотреть на закаты и играть в карты с туристами в своём отеле. Его любимая игра называется «Mau-Mau».

Для игры в Mau-Mau нужна колода из \(52\) карт. У каждой карты есть масть (бубны — D, трефы — C, пики — S или червы — H) и достоинство (ранг) (2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K или A).

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

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

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

Первая строка содержит строку, задающую карту на столе. Вторая строка содержит пять строк, задающих пять карт на руке.

Каждая строка, описывающая карту, состоит из двух символов. Первый символ означает достоинство и принадлежит следующему множеству: \(\{{\tt 2}, {\tt 3}, {\tt 4}, {\tt 5}, {\tt 6}, {\tt 7}, {\tt 8}, {\tt 9}, {\tt T}, {\tt J}, {\tt Q}, {\tt K}, {\tt A}\}\). Второй символ задаёт масть и принадлежит следующему множеству: \(\{{\tt D}, {\tt C}, {\tt S}, {\tt H}\}\) — бубны, трефы, пики, червы.

Все карты во входных данных различны.

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

Если можно сделать ход хотя бы одной картой, выведите «YES». Иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере на столе лежит туз пик (AS). Можно сыграть бубновый туз (AD), потому что обе эти карты — тузы.

Во втором примере нельзя сыграть ни одной карты.

В третьем примере вы можете сыграть бубновый туз (AD), потому что на столе лежит бубновая четвёрка (4D).

C. Yuhao и скобки

жадные алгоритмы реализация *1400

Однажды Yuhao попалась задача о проверке скобочной последовательности на правильность.

Скобочная последовательность называется правильной скобочной последовательностью, если её можно превратить в корректное математическое выражение, вставив в неё некоторое количество символов «+» и «1». Например, последовательности «(())()», «()» и «(()(()))» являются правильными, а «)(», «(()» и «(()))(» — нет.

Yuhao решил, что эта задача является слишком простой, так что он придумал такую задачу. Вам дано несколько (не обязательно правильных) скобочных последовательностей. Вам нужно соединить некоторые из них в упорядоченные пары так, чтобы каждая скобочная последовательность встречалась не более чем в одной паре, а конкатенация скобочных последовательностей в каждой паре была правильной скобочной последовательностью. Нужно создать как можно больше пар.

Эта задача оказалась слишком сложной для Yuhao. Можете ли вы помочь ему и решить её?

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — количество скобочных последовательностей.

Каждая из следующих \(n\) строк содержит одну непустую строку, состоящую из символов «(», «)».

Сумма длин всех скобочных последовательностей не превосходит \(5 \cdot 10^5\).

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

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

Выведите одно целое число — максимальное возможное количество пар, которое можно составить.

Примечание

В первом примере, оптимально составить пары «((     )())» и «(     )».

E. Гончар Федор

Бинарный поиск математика реализация теория чисел *3400

Федя обожает задачи на структуры данных. Особенно он любит задачи про запросы различных функций на подотрезках массива. А именно, у Феди был прекрасный массив \(a_1, a_2, \ldots a_n\), а также замечательная структура данных, которая позволяла по данным \(l\) и \(r\), \(1 \le l \le r \le n\), находить такое максимальное положительное целое число \(d\) такое, что \(d\) является делителем каждого из чисел \(a_l\), \(a_{l+1}\), ..., \(a_{r}\).

Федя очень любил свою структуру данных, поэтому он воспользовался ей для каждого отрезка массива \(a\) и выписал полученные числа в массив, который Федя сразу же отсортировал по неубыванию. Полученный массив он, недолго думая, назвал \(b\). Нетрудно заметить, что массив \(b\) состоял из \(n(n+1)/2\) элементов.

После этого Федя взял еще одну замечательную структуру данных, которая позволяла по данным \(l\) и \(r\), \(1 \le l \le r \le n(n+1)/2\), находить сумму \(b_l + b_{l+1} + \ldots + b_r\). Конечно же, Федя сразу же воспользовался второй структурой данных для каждого отрезка массива \(b\), а полученный массив отсортировал по неубыванию. Тщательно выбирая имя, он назвал полученный массив \(c\). Помогите Феде найти нижнюю медиану массива \(c\).

Напомним, что для отсортированного массива длины \(k\) нижней медианой называется элемент, который стоит на позиции \(\lfloor \frac{k + 1}{2} \rfloor\), с учетом того, что элементы массива нумеруются с \(1\). К примеру, нижней медианой массива \((1, 1, 2, 3, 6)\) является число \(2\), а нижней медианой массива \((0, 17, 23, 96)\) — число \(17\).

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

Первая строка входных данных содержит одно целое число \(n\) — количество элементов в массиве \(a\) (\(1 \le n \le 50\,000\)).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) — элементы массива (\(1 \le a_i \le 100\,000\)).

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

Выведите одно число — нижнюю медиану массива \(c\).

Примечание

В первом примере массив \(b\) примет вид \({3, 3, 6}\), массив \(c\) примет вид \({3, 3, 6, 6, 9, 12}\), а искомая нижняя медиана равна \(6\).

В втором примере массив \(b\) примет вид \({8, 8, 8}\), массив \(c\) примет вид \({8, 8, 8, 16, 16, 24}\), а искомая нижняя медиана равна \(8\).

A. Снежный ком

реализация *800

Сегодня утром выпало необычайно много снега. Мишаня решил выйти на улицу и заметил очень большой снежный ком, который катится с горы! К счастью, на горе есть камни. Изначально ком имеет вес \(w\) и находится на высоте \(h\) метров. Каждую секунду происходит следующее: вес кома увеличивается на \(i\), где \(i\) — текущая высота, на которой он находится, затем ком ударяется о камень (если он есть), после этого ком спускается на один метр ниже. Если же ком находится на высоте ноль, он останавливается и дальше не спускается.

На горе есть ровно два камня. Первый камень имеет вес \(u_1\) и высоту \(d_1\), второй — \(u_2\) и \(d_2\) соответственно. Когда ком сталкивается с каким-либо из двух камней, ком теряет вес, равный весу этого камня. Если при этом вес кома стал отрицательным, то его вес становится равным нулю, но ком продолжает движение так же, как и раньше.

Найдите вес снежного кома в тот момент, когда он скатится с горы, то есть окажется на высоте 0.

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

В первой строке заданы два целых числа \(w\) и \(h\) — вес и изначальная высота снежного кома соответственно (\(0 \le w \le 100\); \(1 \le h \le 100\)).

Во второй строке содержатся два целых числа \(u_1\) и \(d_1\) — вес первого камня и высота, на которой он находится (\(0 \le u_1 \le 100\); \(1 \le d_1 \le h\)).

В третьей строке содержатся два целых числа \(u_2\) и \(d_2\) — вес второго камня и высота, на которой он находится (\(0 \le u_2 \le 100\); \(1 \le d_2 \le h\); \(d_1 \ne d_2\)). Обратите внимание, что камни обязательно находятся на разной высоте.

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

Выведите единственное целое число — итоговый вес снежного кома после того, как он скатится с горы.

Примечание

В первом примере изначально ком веса 4 находится на высоте 3, есть два камня веса 1, на высоте 1 и 2 соответственно. Происходят последовательно следующие события:

  • Вес кома увеличивается на 3 (текущую высоту), становится равным 7.
  • Ком спускается на 1, текущая высота становится равной 2.
  • Вес кома увеличивается на 2 (текущую высоту), становится равным 9.
  • Ком ударяется о камень, его вес уменьшается на 1 (вес камня), становится равным 8.
  • Ком спускается на 1, текущая высота становится равной 1.
  • Вес кома увеличивается на 1 (текущую высоту), становится равным 9.
  • Ком ударяется о камень, его вес уменьшается на 1 (вес камня), становится равным 8.
  • Ком спускается на 1, текущая высота становится равной 0.

Таким образом, в конце пути вес кома равен 8.

C. Открытка

Конструктив реализация *1200

Андрей получил открытку от Ирины. В ней были только слова «Привет, Андрей!» и странная строка, состоящая из строчных латинских букв, снежинок и леденцов. Андрей подумал, что эта строка — это зашифрованное сообщение, и решил его разгадать.

Андрей заметил, что снежинки и леденцы всегда стоят после букв, поэтому у него появилась гипотеза, что сообщение закодировано следующим образом. Леденец означает, что символ, идущий перед ним, можно удалить, а можно оставить. Снежинка же означает, что символ, идущий перед ней, можно удалить, оставить или повторить несколько раз.

Например, рассмотрим такую строку:

Эта строка может кодировать сообщение «happynewyear». Для этого леденцы и снежинки нужно использовать следующим образом:

  • леденец 1: удалить букву w,
  • снежинка 1: повторить символ p два раза,
  • леденец 2: оставить букву n,
  • снежинка 2: удалить букву w,
  • снежинка 3: оставить букву e.

Обратите внимание, что одна и та же строка может кодировать разные сообщения. Например, строка, приведенная выше, может кодировать сообщения «hayewyar», «happpppynewwwwwyear» и другие.

Андрей знает, что сообщения от Ирины обычно имеют длину \(k\) символов. Помогите ему понять, может ли данная строка кодировать какое-то сообщение из \(k\) символов, и если да, приведите пример такого сообщения.

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

В первой строке записана строка, полученная в открытке. Строка состоит только из строчных латинских букв, а также символов «*» и «?», обозначающих снежинку и леденец соответственно. Эти символы могут стоять только сразу после буквы. Длина строки не превосходит \(200\).

Во второй строке находится целое число \(k\) (\(1 \leq k \leq 200\)) — необходимая длина сообщения.

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

Выведите любое сообщение длины \(k\), которое может кодировать данная строка, или «Impossible», если такого сообщения не существует.

A. Возрастающая последовательность

Конструктив математика реализация *900

Последовательность a0, a1, ..., at - 1 называется возрастающей если ai - 1 < ai для всех i: 0 < i < t.

Вам задана последовательность b0, b1, ..., bn - 1 и натуральное число d. Каждый ход выбирается один из элементов последовательности и увеличивается на d. Какое минимальное число ходов необходимо совершить, чтобы сделать последовательность возрастающей?

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

Первая строка входных данных содержит два натуральных числа n и d (2 ≤ n ≤ 2000;1 ≤ d ≤ 106). Вторая строка содержит элементы последовательности b0, b1, ..., bn - 1 (1 ≤ bi ≤ 106). Числа в строках разделяются пробелами.

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

Выведите искомое наименьшее количество ходов.

C. Сколько квадратов?

реализация *2200

Вам задана прямоугольная матрица, состоящая из нулей и единиц. Ваша задача посчитать число квадратов в ней. В данном случае квадратом называется рамка (бордюр) ширины 1 квадратной формы. Минимальный размер квадрата 2 × 2. Существует два типа квадратов:

  1. каждая сторона которых параллельна стороне заданной матрицы;
  2. каждая сторона которых параллельна одной из диагоналей заданной матрицы.

Этот пример содержит единственный квадрат первого типа:
0000000
0111100
0100100
0100100
0111100

А этот — квадрат второго типа:
0000000
0010000
0101000
0010000
0000000

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

Напишите программу, которая выводит количество квадратов на заданной матрице.

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

Первая строка содержит целое число t (1 ≤ t ≤ 10000), где t это количество наборов входных данных в тесте. Далее следуют сами наборы. Каждый набор начинается строкой, состоящей из двух целых чисел n and m (2 ≤ n, m ≤ 250), где n это количество строк, а m — количество столбцов заданной матрицы. Следующие n строк содержат по m символов каждая: (символы 0 или 1).

Суммарное количество элементов во всех матрицах для одного теста не превосходит 106.

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

Выведите t строк, i-ая строка должны содержать ответ для i-го набора входных данных.

A. Почти счастливое число

реализация *800

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

К сожалению, не все числа счастливые. Петя называет число почти счастливым, если количество счастливых цифр в нем — счастливое число. Ему интересно, является ли число n почти счастливым.

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

В единственной строке задано целое число n (1 ≤ n ≤ 1018).

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

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

В единственной строке выведите «YES», если число n — почти счастливое, и «NO» в противном случае (без кавычек).

Примечание

В первом примере количество счастливых цифр числа равно 3 (первая и последние две цифры), поэтому ответ «NO».

Во втором примере все цифры числа — счастливые, а их общее количество — 7, поэтому ответ «YES».

В третьем примере в числе нет счастливых цифр, поэтому ответ «NO».

A. Рома и браузер

реализация *1000

Рома проснулся утром и, открыв браузер, увидел, что там открыто \(n\) вкладок, пронумерованных от \(1\) до \(n\). Все вкладки делятся на два типа: вкладки с информацией об экзамене и вкладки с социальными сетями. Рома решил, что вкладок открыто слишком много, поэтому часть из них он хочет закрыть.

Рома хочет закрыть каждую \(k\)-ю (\(2 \leq k \leq n - 1\)) вкладку и после этого определиться, чем же он хочет заниматься — отдыхать или готовиться к экзамену. Формально, Рома выберет одну вкладку, пусть ее номер равен \(b\), и закроет все вкладки с номерами \(c = b + i \cdot k\) такими, что \(1 \leq c \leq n\), а \(i\) — целое число (положительное, отрицательное или ноль).

Например, если \(k = 3\), \(n = 14\) и Рома выберет \(b = 8\), то он закроет вкладки с номерами \(2\), \(5\), \(8\), \(11\), \(14\).

После закрытия вкладок он посчитает, сколько осталось вкладок с информацией о экзамене, пусть это число равно \(e\), и сколько вкладок осталось с социальными сетями (\(s\)). Помогите Роме вычислить максимально возможный модуль разности \(|e - s|\), чтобы ему было проще определиться, чем же заняться дальше.

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

В первой строке заданы два натуральных числа \(n\) и \(k\) (\(2 \leq k < n \leq 100\)) — количество открытых в данный момент вкладок и расстояние между закрываемыми вкладками.

Во второй строке записаны \(n\) целых чисел, каждое из которых равно либо \(1\), либо \(-1\). \(i\)-е число показывает тип \(i\)-й вкладки: если оно равно \(1\), то эта вкладка с информацией об экзамене, а если \(-1\), то это социальная сеть.

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

Выведите единственное число — максимально возможный модуль разности между количествами вкладок разного типа \(|e - s|\).

Примечание

В первом примере мы можем выбрать \(b = 1\) или \(b = 3\). Тогда мы удалим по одной вкладке каждого типа, а все оставшиеся вкладки будут содержать информацию к экзамену. Поэтому \(e = 2\) и \(s = 0\), а ответ равен \(|e - s| = 2\).

Во втором примере, наоборот, можно оставить только вкладки с социальными сетями.

B. Сборка контеста

реализация Структуры данных *1300

Аркадий координирует раунды на некой малоизвестной платформе по спортивному программированию. В каждом раунде дается \(n\) задач различной сложности, сложности задач пронумерованы от \(1\) до \(n\).

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

Каждый раз, когда Аркадий может выбрать из банка задач \(n\) новых задач различной сложности, он проводит раунд из этих задач и вычеркивает их из банка. Аркадий не придумывает несколько задач одновременно, поэтому, если он может провести раунд после того, как придумал очередную задачу, он сразу это делает.

Вам дана последовательность сложностей задач, которые придумывал Аркадий. Для каждой придуманной задачи определите, провел ли Аркадий раунд после придумывания этой задачи. Изначально банк задач был пуст.

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

В первой строке находятся два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10^5\)) — количество различных сложностей задач и количество задач, придуманных Аркадием, соответственно.

Во второй строке находятся \(m\) целых чисел \(a_1, a_2, \ldots, a_m\) (\(1 \le a_i \le n\)) — сложности задач в порядке их придумывания.

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

Выведите строку из \(m\) цифр. \(i\)-я цифра должна быть равна \(1\), если после \(i\)-й придуманной задачи Аркадий провел раунд, и \(0\) в противном случае.

Примечание

В первом тесте из примера Аркадий проведет раунд сначала сразу после первых трех задач, так как они различной сложности, а потом — лишь после последней придуманной задачи.

B. Баян

жадные алгоритмы реализация *1300

— Почему они постоянно пишут, что задачи, которые я придумываю, — баяны? Да они настоящего баяна не видели!
BledDest

Баян — это строка (да, в реальном мире баяны — это музыкальные инструменты, но давайте на время забудем об этом), являющаяся конкатенацией следующих символов: открывающей квадратной скобки (ASCII код этого символа — \(091\)), двоеточия (ASCII код — \(058\)), нескольких (возможно, ни одного) символов вертикальной черты (ASCII код — \(124\)), еще одного двоеточия и закрывающей квадратной скобки (ASCII код — \(093\)). Длина баяна — это количество символов в нем.

Например, [::], [:||:] и [:|||:] — баяны длины \(4\), \(6\) и \(7\), соответственно. (:|:), {:||:}, [:], ]:||:[ баянами не являются.

Вам дана строка \(s\). Вы хотите превратить ее в баян удалением нескольких (возможно, ни одного) символов из нее. Обратите внимание, что вставлять новые символы или менять порядок существующих нельзя. Можно ли превратить \(s\) в баян такими операциями, и если да, то какая может быть максимальная длина получившегося баяна?

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

Во входных данных записана строка \(s\) (\(1 \le |s| \le 500000\)). Она состоит из строчных букв латинского алфавита, а также символов [, ], : и |.

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

Если невозможно преобразовать \(s\) в баян удалением символов, выведите \(-1\). Иначе выведите максимально возможную длину баяна, который можно получить.

E. Новая работа Поликарпа

реализация *1500

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

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

Купюра \(x \times y\) помещается в некоторых кошелек \(h \times w\), если либо \(x \le h\) и \(y \le w\), либо \(y \le h\) и \(x \le w\). Купюры могут накладываться друг на друга, и в кошелек помещается бесконечное количество купюр. Из этого следует, что все купюры Поликарпа помещаются в кошелек тогда, когда каждая из них помещается независимо от остальных.

Теперь ваша задача — ответить на запросы двух типов:

  1. \(+~x~y\) — Поликарп зарабатывает купюру размера \(x \times y\);
  2. \(?~h~w\) — Поликарп хочет узнать, поместятся ли все его заработанные к текущему моменту купюры в кошелек размера \(h \times w\).

Гарантируется, что до первого запроса типа \(2\) есть хотя бы один запрос типа \(1\) и что во входных данных есть хотя бы один запрос типа \(2\).

Для каждого запроса типа \(2\) выведите «YES», если все заработанные к текущему моменту купюры помещаются в кошелек заданного размера. Выведите «NO» в противном случае.

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

В первой строке записано одно целое число \(n\) (\(2 \le n \le 5 \cdot 10^5\)) — количество запросов.

В каждой из следующих \(n\) строк записан запрос одного из следующих типов:

  1. \(+~x~y\) (\(1 \le x, y \le 10^9\)) — Поликарп зарабатывает купюру размера \(x \times y\);
  2. \(?~h~w\) (\(1 \le h, w \le 10^9\)) — Поликарп хочет узнать, поместятся ли все его заработанные к текущему моменту купюры в кошелек размера \(h \times w\).

Гарантируется, что до первого запроса типа \(2\) есть хотя бы один запрос типа \(1\) и что во входных данных есть хотя бы один запрос типа \(2\).

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

Для каждого запроса типа \(2\) выведите «YES», если все заработанные к текущему моменту купюры помещаются в кошелек заданного размера. Выведите «NO» в противном случае.

Примечание

Запросы типа \(2\) в примере:

  1. Ни одна купюра не помещается;
  2. Обе купюры помещаются (проверяем, что информация о том, что купюры могут накладываться, принята к сведению);
  3. Обе купюры помещаются (на самом деле, обе купюры одинаковые);
  4. Все купюры помещаются (слишком много свободного места в кошельке — это не проблема);
  5. Только купюра \(1 \times 5\) помещается (остальные не помещаются, поэтому ответ «NO»).

A. Игра на таблице

Конструктив реализация *1400

Вам дана таблица размера 4x4. Вы играете в игру — есть последовательность тайлов, каждый из которых имеет форму 2x1 или 1x2.Ваша задача состоит в том, чтобы последовательно разместить все тайлы на таблице. После каждого размещения каждая клетка, которая находится в строке или столбце, где все клетки заняты, освобождается. Вы можете располагать тайлы в любом месте таблицы, единственное условие состоит в том, чтобы тайлы(и их куски, оставшиеся после удаление некоторых строк и столбцов) не должны перекрываться. Ваша задача состоит в том, чтобы разместить все фигурки, при этом избегая перекрывания в любой момент времени.

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

Во вводе записана единственная строка \(s\), состоящая из нулей и единиц (\(1 \le |s| \le 1000\)). Ноль означает вертикальный тайл, единица — горизонтальный.

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

Выведите \(|s|\) строк —для каждого тайла выведите два натуральных числа \(r,c\), не превышающих \(4\), обозначающих координаты минимальных строки и столбца, пересекающихся с ним.

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

Примечание

Данная картинка иллюстрирует пример из условия:

Далее первый ряд удаляется:

A. Разбиение на цифры

Конструктив математика реализация *800

У Васи есть любимое число \(n\). Он хочет разбить его на несколько ненулевых цифр. Это означает, что он хочет выбрать несколько цифр \(d_1, d_2, \ldots, d_k\), таких, что \(1 \leq d_i \leq 9\) для всех \(i\) и \(d_1 + d_2 + \ldots + d_k = n\).

Поскольку Вася во всем любит красоту, он хочет найти любое решение, в котором количество различных цифр среди \(d_1, d_2, \ldots, d_k\) будет как можно меньше. Помогите ему!

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

В первой строке находится единственное целое число \(n\) — число, которое хочет разбить Вася (\(1 \leq n \leq 1000\)).

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

В первой строке выведите одно целое число \(k\) — количество цифр в разбиении. Заметьте, что \(k\) должно удовлетворять неравенству \(1 \leq k \leq n\). В следующей строке выведите \(k\) цифр \(d_1, d_2, \ldots, d_k\), разделенных пробелами. Для всех цифр должно быть выполнено неравенство \(1 \leq d_i \leq 9\).

Вы должны найти разбиение числа \(n\), в котором количество различных цифр среди \(d_1, d_2, \ldots, d_k\) будет минимальным среди всех разбиений числа \(n\) на ненулевые цифры. Среди таких разбиений разрешается найти любое. Гарантируется, что существует хотя бы одно разбиение числа \(n\) на цифры.

Примечание

В первом тесте число \(1\) можно разбить на \(1\) цифру, равную \(1\).

Во втором тесте существует \(3\) разбиения числа \(4\) на цифры, в которых количество различных цифр равно \(1\). Это разбиения \([1, 1, 1, 1]\), \([2, 2]\) и \([4]\). Любое из этих разбиений подойдет. А, например, разбиение числа \(4\) на цифры \([1, 1, 2]\) не подойдет, так как в нем \(2\) различных цифры, то есть не минимальное возможное количество.

B. Игра со строкой

математика реализация Структуры данных *1200

Два игрока играют в игру на строке \(s\), состоящей из строчных латинских букв.

На своем ходу игрок должен выбрать две подряд идущие равные буквы в строке и удалить.

Например, если текущая строка равна «xaax», то возможен только один ход, удалить «aa», тем самым превратив строку в «xx».

Проигрывает тот, кто не может сделать ход.

Ваша задача — узнать, кто выиграет, при правильной игре обоих игроков.

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

В первой строке входного файла записана строка \(s\), состоящая из строчных латинских букв (\(1 \leq |s| \leq 100\,000\)), где \(|s|\) обозначает длину строки \(s\).

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

Если победит игрок, который ходит первым, выведите «Yes». В противном случае, выведите «No».

Примечание

В первом тестовом примере нельзя сделать ни одного хода, поэтому первый проигрывает.

Во втором примере первый сделает ход, превратив строку в «q», а затем второй не сможет сделать ход, таким образом, первый выигрывает.

A. Салем и палочки

Перебор реализация *1100

Салем дал вам \(n\) палочек c целыми положительными длинами \(a_1, a_2, \ldots, a_n\).

Для каждой палочки, вы можете поменять её длину на любую другую положительную целую длину (то есть уменьшить или увеличить её). Стоимость изменения у палочки длины \(a\) на длину \(b\) равна \(|a - b|\), где \(|x|\) обозначает модуль \(x\).

Длина палочки \(a_i\) называется почти хорошей для некоторого целого \(t\), если \(|a_i - t| \le 1\).

Салем просит вас поменять длины у каких-то палочек (возможно у всех или у никаких) так, что длины всех палочек будут почти хорошими для некоторого целого положительного \(t\), а суммарная стоимость всех изменений будет минимально возможной. Значение \(t\) заранее не зафиксировано и вы можете выбрать его как произвольное целое положительное число.

В качестве ответа, выведите значение \(t\) и минимальную стоимость всех изменений. Если существует несколько оптимальных \(t\), выведите любое из них.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество палочек.

Вторая строка содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 100\)) — длины всех палочек.

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

Выведите значение \(t\) и минимальную возможную стоимость всех изменений. Если существует несколько оптимальных \(t\), выведите любое из них.

Примечание

В первом примере мы можем заменить \(1\) на \(2\) и \(10\) на \(4\) с суммарной стоимостью \(|1 - 2| + |10 - 4| = 1 + 6 = 7\), тогда итоговые длины будут равны \([2, 4, 4]\) и являться почти хорошими для \(t = 3\).

Во втором примере длины палочек уже являются почти хорошими для \(t = 2\), так что мы можем ничего не делать.

B. Зухаир и строки

Перебор реализация Строки *1100

Задана строка \(s\) длины \(n\) и целое число \(k\) (\(1 \le k \le n\)). Скажем, что строка \(s\) имеет уровень \(x\), если \(x\) это наибольшее неотрицательное целое число, такое что в строке \(s\) можно выбрать:

  • \(x\) непересекающихся подстрок длины \(k\),
  • все символы в этих \(x\) подстроках должны быть одинаковы (т.е. каждая подстрока содержит только один различный символ, который один и тот же для всех выбранных подстрок).

Подстрока — это последовательность подряд идущих символов строки, подстрока определяется парой целых чисел \(i\) и \(j\) (\(1 \le i \le j \le n\)), обозначается как \(s[i \dots j]\) = «\(s_{i}s_{i+1} \dots s_{j}\)».

Например, если \(k = 2\), то:

  • строка «aabb» имеет уровень \(1\) (можно выбрать подстроку «aa»),
  • строки «zzzz» и «zzbzz» имеют уровень \(2\) (можно выбрать две непересекающихся подстроки «zz» в каждой их них),
  • строки «abed» и «aca» имеют уровень \(0\) (невозможно выбрать хотя бы одну подстроку длины \(k=2\), которая содержит один различный символ).

Зухаир дал вам целое число \(k\) и строку \(s\) длины \(n\). Вам нужно найти \(x\) — уровень строки \(s\).

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

Первая строка содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)) — длину строки и значение \(k\).

Вторая строка содержит строку \(s\) длины \(n\), состоящую из строчных латинских букв.

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

Выведите одно целое число \(x\) — уровень строки.

Примечание

В первом примере мы можем выбрать \(2\) непересекающиеся строки, состоящей из буквы «a»: «(aa)ac(aa)bb», так что уровень равен \(2\).

Во втором примере мы можем выбрать или подстроку «a» или «b» чтобы получить ответ \(1\).

D. Килани и игра

графы кратчайшие пути поиск в глубину и подобное реализация *1900

Килани играет в игру со своими друзьями. Игра представляет из себя клетчатое поле размером \(n \times m\), где каждая клетка или пуста, или заблокирована, также у каждого игрока есть один или несколько замков на поле (ни одна клетка не содержит более одного замка).

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

Игра заканчивается, когда ни один игрок не может сделать ход. Вам дано поле игры и скорости расширения для каждого игрока. Килани хочет узнать для каждого игрока как много клеток он будет контролировать (иметь там замок) после того как игра закончится.

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

Первая строка содержит три целых числа \(n\), \(m\) и \(p\) (\(1 \le n, m \le 1000\), \(1 \le p \le 9\)) — размеры поля и количество игроков.

Вторая строка содержит \(p\) целых чисел \(s_i\) (\(1 \le s \le 10^9\)) — скорости расширения для каждого игрока.

Следующие \(n\) строк задают игровое поле. Каждая из них состоит из \(m\) символов, где «.» обозначает пустую клетку, «#» обозначает заблокированную клетку, а цифра \(x\) (\(1 \le x \le p\)) обозначает замок, принадлежащий игроку \(x\).

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

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

Выведите \(p\) целых чисел — количество клеток, контролируемых каждым игроком после конца игры.

Примечание

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

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

A. Лунный новый год и подсчет крестов

реализация *800

Приближается лунный новый год, и вы купили матрицу со множеством «крестов».

Матрица \(M\) размера \(n \times n\) содержит только «X» и «.» (без кавычек). Обозначим элемент \((i, j)\) в \(i\)-й строке и \(j\)-м столбце за \(M(i, j)\), где \(1 \leq i, j \leq n\). Скажем, что в \(i\)-й строке и \(j\)-м столбце (\(1 < i, j < n\)) находится крест, если и только если \(M(i, j) = M(i - 1, j - 1) = M(i - 1, j + 1) = M(i + 1, j - 1) = M(i + 1, j + 1) = \) «X».

Ниже показан пример креста в позиции \((2, 2)\) в матрице \(3 \times 3\).


X.X
.X.
X.X

Ваша задача — найти количество крестов в данной матрице \(M\). Два креста различны, если они встречаются в различных строках или столбцах.

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 500\)) — размер матрицы \(M\).

Следующие \(n\) строк описывают матрицу \(M\). Каждая строка содержит ровно \(n\) символов, каждый из которых либо «X», либо «.». Символ \(j\) в \(i\)-й строке — элемент \(M(i, j)\), где \(1 \leq i, j \leq n\).

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

Выведите одно целое число \(k\) — количество крестов в данной матрице \(M\).

Примечание

В первом примере есть крест в позиции \((3, 3)\), поэтому ответ равен \(1\).

Во втором примере нет крестов, так как \(n < 3\), поэтому ответ равен \(0\).

В третьем примере кресты встречаются в позициях \((3, 2)\), \((3, 4)\), \((4, 3)\), \((4, 5)\), поэтому ответ равен \(4\).

B. Лунный новый год и заказ еды

реализация Структуры данных *1500

Приближается лунный новый год, поэтому Боб хочет поужинать в знаменитом ресторане «У Алисы».

В ресторане «У Алисы» можно заказать \(n\) типов блюд. Цена одного блюда \(i\)-го типа всегда равна \(c_i\). Изначально в ресторане достаточно ингредиентов для подачи ровно \(a_i\) блюд \(i\)-го типа. В канун лунного нового года \(m\) посетителей зайдут в ресторан один за другим, при этом \(j\)-й клиент закажет \(d_j\) блюд \(t_j\)-го типа. \((i + 1)\)-й посетитель придет лишь после того, как \(i\)-й посетитель будет полностью обслужен.

Предположим, в некоторый момент времени осталось ровно \(r_i\) блюд \(i\)-го типа (изначально \(r_i = a_i\)). Когда посетитель закажет \(1\) блюдо \(i\)-го типа, будет выполнен следующий алгоритм.

  1. Если \(r_i > 0\), то посетителю подадут \(1\) блюдо \(i\)-го типа. Стоимость этого блюда будет равна \(c_i\). В то же время \(r_i\) уменьшится на \(1\).
  2. Иначе посетителю подадут \(1\) самое дешевое блюдо из тех, что еще остались, если, конечно, такие еще есть. Если есть несколько доступных самых дешевых типов, подадут блюдо, тип которого имеет наименьший номер. Стоимость будет равна стоимости поданного блюда, а его остаток будет уменьшен на \(1\).
  3. Если не осталось вообще никаких блюд, то посетитель уйдет недовольным и ничего не заплатит. Независимо от того, сколько блюд ему подали до этого, счет посетителя равен \(0\).

Если посетитель не уйдет до того, как ему подали все \(d_j\) блюд, то его общий счет будет равен суммарной стоимости всех поданных \(d_j\) блюд.

Определите счет для каждого из \(m\) посетителей.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 10^5\)) — число различных типов блюд и число посетителей, соответственно.

Вторая строка содержит \(n\) положительных целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^7\)), где \(a_i\) обозначает начальный остаток \(i\)-го типа блюд.

Третья строка содержит \(n\) положительных целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \leq c_i \leq 10^6\)), где \(c_i\) обозначает стоимость одного блюда \(i\)-го типа.

Следующие \(m\) строк описывают заказы \(m\) посетителей. \(j\)-я из этих строк содержит два целых положительных числа \(t_j\) и \(d_j\) (\(1 \leq t_j \leq n\), \(1 \leq d_j \leq 10^7\)), обозначающие тип и количество блюд, заказанных \(j\)-м посетителем, соответственно.

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

Выведите \(m\) строк. В \(j\)-й строке выведите счет \(j\)-го посетителя.

Примечание

В первом примере \(5\) посетителей будут обслужены следующим образом.

  1. Посетителю \(1\) подадут \(6\) блюд \(2\)-го типа, \(1\) блюдо \(4\)-го типа и \(1\) блюдо \(6\)-го типа. Счет равен \(6 \cdot 3 + 1 \cdot 2 + 1 \cdot 2 = 22\). Остатки всех \(8\) типов блюд будут равны \(\{8, 0, 2, 0, 4, 4, 7, 5\}\).
  2. Посетителю \(2\) подадут \(4\) блюд \(1\)-го типа. Счет равен \(4 \cdot 6 = 24\). Остатки будут равны \(\{4, 0, 2, 0, 4, 4, 7, 5\}\).
  3. Посетителю \(3\) подадут \(4\) блюд \(6\)-го типа, \(3\) блюда \(8\)-го типа. Остатки будут равны \(4 \cdot 2 + 3 \cdot 2 = 14\). The remain will be \(\{4, 0, 2, 0, 4, 0, 7, 2\}\).
  4. Посетителю \(4\) подадут \(2\) блюда \(3\)-го типа, \(2\) блюда \(8\)-го типа. Остатки будут равны \(2 \cdot 3 + 2 \cdot 2 = 10\). The remain will be \(\{4, 0, 0, 0, 4, 0, 7, 0\}\).
  5. Посетителю \(5\) подадут \(7\) блюд \(7\)-го типа, \(3\) блюда \(1\)-го типа. Остатки будут равны \(7 \cdot 3 + 3 \cdot 6 = 39\). The remain will be \(\{1, 0, 0, 0, 4, 0, 0, 0\}\).

Во втором примере каждый клиент получит то, что он заказал, кроме последнего, который уйдет, не заплатив. Так, второй посетитель получит \(6\) блюд второго типа, суммарная цена составит \(66 \cdot 6 = 396\).

В третьем примере не все посетители получат то, что они закажут. Так, второй посетитель получит \(6\) блюд второго типа, \(6\) блюд третьего типа и \(1\) блюдо четвертого типа, счет составит \(66 \cdot 6 + 666 \cdot 6 + 6666 \cdot 1 = 11058\).

C. Лунный новый год и разделение чисел

жадные алгоритмы математика реализация сортировки *900

Приближается лунный новый год, а Боб все еще мучается со своей домашней работой — задачей о разделении чисел.

Даны \(n\) положительных целых чисел \(a_1, a_2, \ldots, a_n\), где \(n\) всегда четно. Боб должен разделить эти числа на группы, причем каждая группа должна содержать хотя бы \(2\) числа. Предположим, что числа разделены на \(m\) групп, и сумма чисел в \(j\)-й группе равна \(s_j\). Цель Боба — минимизировать сумму квадратов \(s_j\), то есть \(\)\sum_{j = 1}^{m} s_j^2.\(\)

Боб никак не может решить эту задачу. Можете ему помочь?

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

Первая строка содержит четное целое число \(n\) (\(2 \leq n \leq 3 \cdot 10^5\)), обозначающее, что в домашней работе Боба даны \(n\) чисел.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^4\)) — числа, для которых вам нужно решить задачу.

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

Выведите одно целое число, равное минимальной возможной сумме \(s_j\), то есть \(\)\sum_{i = j}^{m} s_j^2,\(\) где \(m\) — число групп чисел.

Примечание

В первом примере одно из оптимальных решений — разделить эти \(4\) числа на \(2\) две группы: \(\{2, 8\}, \{5, 3\}\). Ответ равен \((2 + 8)^2 + (5 + 3)^2 = 164\).

Во втором примере одно из оптимальных решений — разделить эти \(6\) чисел на \(3\) группы: \(\{1, 2\}, \{1, 2\}, \{1, 2\}\). Ответ равен \((1 + 2)^2 + (1 + 2)^2 + (1 + 2)^2 = 27\).

D. Сжатие

дп математика реализация теория чисел *1800

Вам дана двоичная матрица \(A\) размера \(n \times n\). Обозначим \(x\)-сжатие данной матрицы как матрицу \(B\) размера \(\frac{n}{x} \times \frac{n}{x}\), такую, что для всех \(i \in [1, n], j \in [1, n]\) выполняется условие \(A[i][j] = B[\lceil \frac{i}{x} \rceil][\lceil \frac{j}{x} \rceil]\).

Очевидно, \(x\)-сжатие возможно только в том случае, если \(x\) является делителем \(n\), но этого недостаточно. К примеру, у этой матрицы \(2 \times 2\) нет \(2\)-сжатия:

\(01\)
\(10\)

Для заданной матрицы \(A\) найдите максимальное \(x\), для которого возможно \(x\)-сжатие этой матрицы.

Обратите внимание: входные данные заданы в сжатом виде. Несмотря на это, лучше используйте быстрое считывание.

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

В первой строке записано одно число \(n\) (\(4 \le n \le 5200\)) — количество строк и столбцов в матрице \(A\). Гарантируется, что \(n\) делится на \(4\).

Далее следует описание матрицы. В каждой из \(n\) следующих строк следуют по \(\frac{n}{4}\) однозначных числа шестнадцатеричной системы счисления (то есть, эти числа могут задаваться либо как цифры от \(0\) до \(9\), либо как прописные латинские буквы от \(A\) до \(F\)). Двоичная запись каждого из этих чисел задаёт очередные \(4\) элемента матрицы в текущей строке. Например, если число равно \(B\), то очередные четыре элемента матрицы равны 1011, а если число равно \(5\), то очередные четыре элемента матрицы равны 0101.

Элементы в каждой строке задаются без пробелов.

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

Выведите одно число: максимальное \(x\), для которого возможно \(x\)-сжатие.

Примечание

В первом примере задается матрица:

\(11100111\)
\(11100111\)
\(11100111\)
\(00000000\)
\(00000000\)
\(11100111\)
\(11100111\)
\(11100111\)

Довольно легко увидеть, что ответ равен \(1\).

A. Две различные точки

реализация *800

Задано два отрезка \([l_1; r_1]\) и \([l_2; r_2]\) на координатной оси \(x\). Гарантируется, что \(l_1 < r_1\) и \(l_2 < r_2\). Отрезки могут пересекаться, вкладываться или даже совпадать друг с другом.

Пример двух отрезков на координатной оси \(x\).

Ваша задача — найти два целых числа \(a\) и \(b\) таких, что \(l_1 \le a \le r_1\), \(l_2 \le b \le r_2\) и \(a \ne b\). Другими словами, вам необходимо выбрать две различные целочисленные точки таким образом, чтобы первая точка принадлежала отрезку \([l_1; r_1]\), а вторая принадлежала отрезку \([l_2; r_2]\).

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

Вам необходимо ответить на \(q\) независимых запросов.

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

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 500\)) — количество запросов.

Каждая из следующих \(q\) строк содержит четыре целых числа \(l_{1_i}, r_{1_i}, l_{2_i}\) и \(r_{2_i}\) (\(1 \le l_{1_i}, r_{1_i}, l_{2_i}, r_{2_i} \le 10^9, l_{1_i} < r_{1_i}, l_{2_i} < r_{2_i}\)) — концы отрезков в \(i\)-м запросе.

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

Выведите \(2q\) целых чисел. Для \(i\)-го запроса выведите два целых числа \(a_i\) и \(b_i\) — такие числа, что \(l_{1_i} \le a_i \le r_{1_i}\), \(l_{2_i} \le b_i \le r_{2_i}\) и \(a_i \ne b_i\). Запросы пронумерованы в порядке входных данных.

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

E1. Массив и отрезки (легкая версия)

жадные алгоритмы Перебор реализация *1800

Единственное отличие между легкой и сложной версиями — количество элементов в массиве.

Задан массив \(a\), состоящий из \(n\) целых чисел. Значение \(i\)-го элемента массива равно \(a_i\).

Также задан набор из \(m\) отрезков. \(j\)-й отрезок равен \([l_j; r_j]\), где \(1 \le l_j \le r_j \le n\).

Вы можете выбрать какое-то подмножество заданного множества отрезков и уменьшить значения элементов на каждом из выбранных отрезков на единицу (независимо). Например, если изначальный массив \(a = [0, 0, 0, 0, 0]\), а заданные отрезки — \([1; 3]\) и \([2; 4]\), то вы можете выбрать оба из них и массив станет равен \(b = [-1, -2, -2, -1, 0]\).

Вам необходимо выбрать какое-то подмножество заданного множества отрезков (каждый отрезок может быть выбран не более одного раза) таким образом, что если вы примените этот набор отрезков к массиву \(a\) и получите массив \(b\), то значение \(\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_i\) будет максимально возможным.

Заметим, что вы можете выбрать пустое множество.

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

Если вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код.

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

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 300, 0 \le m \le 300\)) — длина массива \(a\) и количество отрезков, соответственно.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^6 \le a_i \le 10^6\)), где \(a_i\) — значение \(i\)-го элемента массива \(a\).

Следующие \(m\) строк содержат по два целых числа. \(j\)-я из них содержит два целых числа \(l_j\) и \(r_j\) (\(1 \le l_j \le r_j \le n\)), где \(l_j\) и \(r_j\) — концы \(j\)-го отрезка.

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

В первой строке выходных данных выведите одно целое число \(d\)максимально возможное значение \(\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_i\), если \(b\) — это массив, полученный применением некоторого поднабора заданных отрезков к массиву \(a\).

Во второй строке выходных данных выведите одно целое число \(q\) (\(0 \le q \le m\)) — количество отрезков, которые вы собираетесь применить.

В третьей строке выведите \(q\) различных целых чисел \(c_1, c_2, \dots, c_q\) в любом порядке (\(1 \le c_k \le m\)) — номера отрезков, которые вы собираетесь применить к массиву \(a\), чтобы значение \(\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_i\) полученного массива \(b\) было максимально возможным.

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

Примечание

В первом тестовом примере полученный массив \(b\) будет равен \([0, -4, 1, 1, 2]\), таким образом ответ равен \(6\).

Во втором тестовом примере полученный массив \(b\) будет равен \([2, -3, 1, -1, 4]\), таким образом ответ равен \(7\).

В третьем тестовом примере вы не можете ничего сделать, таким образом ответ равен \(0\).

E2. Массив и отрезки (сложная версия)

реализация Структуры данных *2100

Единственное отличие между легкой и сложной версиями — количество элементов в массиве.

Задан массив \(a\), состоящий из \(n\) целых чисел. Значение \(i\)-го элемента массива равно \(a_i\).

Также задан набор из \(m\) отрезков. \(j\)-й отрезок равен \([l_j; r_j]\), где \(1 \le l_j \le r_j \le n\).

Вы можете выбрать какое-то подмножество заданного множества отрезков и уменьшить значения элементов на каждом из выбранных отрезков на единицу (независимо). Например, если изначальный массив \(a = [0, 0, 0, 0, 0]\), а заданные отрезки — \([1; 3]\) и \([2; 4]\), то вы можете выбрать оба из них и массив станет равен \(b = [-1, -2, -2, -1, 0]\).

Вам необходимо выбрать какое-то подмножество заданного множества отрезков (каждый отрезок может быть выбран не более одного раза) таким образом, что если вы примените этот набор отрезков к массиву \(a\) и получите массив \(b\), то значение \(\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_i\) будет максимально возможным.

Заметим, что вы можете выбрать пустое множество.

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

Если вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код.

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

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 10^5, 0 \le m \le 300\)) — длина массива \(a\) и количество отрезков, соответственно.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^6 \le a_i \le 10^6\)), где \(a_i\) — значение \(i\)-го элемента массива \(a\).

Следующие \(m\) строк содержат по два целых числа. \(j\)-я из них содержит два целых числа \(l_j\) и \(r_j\) (\(1 \le l_j \le r_j \le n\)), где \(l_j\) и \(r_j\) — концы \(j\)-го отрезка.

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

В первой строке выходных данных выведите одно целое число \(d\)максимально возможное значение \(\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_i\), если \(b\) — это массив, полученный применением некоторого поднабора заданных отрезков к массиву \(a\).

Во второй строке выходных данных выведите одно целое число \(q\) (\(0 \le q \le m\)) — количество отрезков, которые вы собираетесь применить.

В третьей строке выведите \(q\) различных целых чисел \(c_1, c_2, \dots, c_q\) в любом порядке (\(1 \le c_k \le m\)) — номера отрезков, которые вы собираетесь применить к массиву \(a\), чтобы значение \(\max\limits_{i=1}^{n}b_i - \min\limits_{i=1}^{n}b_i\) полученного массива \(b\) было максимально возможным.

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

Примечание

В первом тестовом примере полученный массив \(b\) будет равен \([0, -4, 1, 1, 2]\), таким образом ответ равен \(6\).

Во втором тестовом примере полученный массив \(b\) будет равен \([2, -3, 1, -1, 4]\), таким образом ответ равен \(7\).

В третьем тестовом примере вы не можете ничего сделать, таким образом ответ равен \(0\).

A. Саша и немного отдыха

дп реализация *1600

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

А дорешать Саша решил следующую задачу:

Дан массив \(a\) из \(n\) целых чисел, необходимо найти количество смешных пар \((l, r)\) \((l \leq r)\). Чтобы проверить, что пара \((l, r)\) — смешная, обозначим \(mid = \frac{l + r - 1}{2}\), тогда, если \(r - l + 1\) — четное число, и \(a_l \oplus a_{l+1} \oplus \ldots \oplus a_{mid} = a_{mid + 1} \oplus a_{mid + 2} \oplus \ldots \oplus a_r\), то пара смешная. Иначе говоря \(\oplus\) элементов левой половины подмассива с \(l\) по \(r\) должен быть равен \(\oplus\) элементов правой половины. Где \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Саше необходимо продолжить решать контест, а эту задачу он предложил решить вам.

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — размер массива.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i < 2^{20}\)) — сам массив.

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

Выведите одно число — количество смешных пар. Вы должны учитывать только те пары, в которых \(r - l + 1\) чётно.

Примечание

Дорешивай задачи, будь как Саша!

В первом примере единственная смешная пара — это \((2, 5)\), так как \(2 \oplus 3 = 4 \oplus 5 = 1\).

Во втором примере смешные пары \((2, 3)\), \((1, 4)\), и \((3, 6)\).

В третьем примере нет смешных пар.

C. Саша и терпеливый друг

Бинарный поиск реализация Структуры данных *2800

Федя — друг Саши, поэтому Саша знает о Феде всё.

Федя хранит своё терпение в бесконечно большой чаше. Терпение Феди, в отличие от чаши, не бесконечно, поэтому обозначим за \(v\) — количество литров терпения в чаше Феди и, как только \(v\) станет равно \(0\), чаша сразу же лопнет. В чаше существует один кран, который закачивает по \(s\) литров терпения за одну секунду. Заметим, что \(s\) может быть отрицательным, в этом случае кран откачивает терпение из чаши. Саша может делать разные вещи, поэтому ему посильно изменять пропускную способность крана. Все действия Саши можно представить в виде \(q\) запросов. Запросы бывают трёх типов:

  1. «1 t s» — добавить новое событие, которое означает, что начиная с секунды \(t\), пропускная способность крана станет равна \(s\).
  2. «2 t» — удалить событие, которое происходит в секунду \(t\). Гарантируется, что оно существует.
  3. «3 l r v» — Саше интересно, если взять все ещё не удалённые события, для которых верно \(l \le t \le r\), а затем промоделировать изменение терпения Феди с начала секунды \(l\) до начала секунды \(r\) включительно (начальный объем терпения, в начале секунды \(l\), равен \(v\) литров), то в какой момент времени чаша лопнет. Если чаша никогда не лопнет, ответом на запрос будет одно целое число \(-1\).

Так как Саша не хочет проверять, что случится, когда терпение Феди закончится, а запросы он уже придумал, то он попросил вас помочь ему и для каждого запроса \(3\)-го типа найти ответ.

Гарантируется, что никогда не будет одновременно существовать два события, происходящих в одну и ту же секунду.

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

Первая строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

Каждая из последующих \(q\) строк имеет один из форматов:

  • 1 t s (\(1 \le t \le 10^9\), \(-10^9 \le s \le 10^9\)), означающий, что добавляется новое событие, которое означает что начиная с секунды \(t\) пропускная способность крана станет равна \(s\).
  • 2 t (\(1 \le t \le 10^9\)), означающий, что нужно удалить событие, происходящее в момент времени \(t\). Гарантируется, что среди ещё не удалённых такое существует.
  • 3 l r v (\(1 \le l \le r \le 10^9\), \(0 \le v \le 10^9\)), означающий, что нужно промоделировать процесс с момента начала секунды \(l\) до начала секунды \(r\) и сказать когда чаша лопнет.

Гарантируется что \(t\), \(s\), \(l\), \(r\), \(v\) во всех запросах — целые числа.

Гарантируется, что есть хотя бы один запрос \(3\)-го типа, а также не может быть запроса \(1\)-го типа с таким \(t\), что существует событие с аналогичным значением \(t\) и оно ещё не удалено.

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

Для каждого запроса \(3\)-го типа в отдельной строке выведите момент времени, когда чаша лопнет или \(-1\), если такого не случится.

Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не превосходит \(10^{-6}\).

Формально, пусть ваш ответ равен \(a\), а ответ жюри равен \(b\). Ваш ответ будет зачтен, если и только если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).

Примечание

В первом примере все события попадают во все запросы \(3\)-го типа, а их моделирование выглядит следующим образом:

A. Трансформация супергероев

реализация Строки *1000

Все знают, что супергерои могут трансформироваться в некоторых других супергероев. Но не любой супергерой может трансформироваться в любого другого супергероя. Супергерой с именем \(s\) может трансформироваться в другого супергероя с именем \(t\), если \(s\) можно превратить в \(t\), выполнив несколько операций по замене одной любой гласной буквы в \(s\) на любую другую гласную букву, а также любой одной согласной буквы в \(s\) на любую другую согласную. Можно производить сколько угодно замен.

В этой задаче мы считаем, что гласными являются буквы 'a', 'e', 'i', 'o' и 'u', а согласными — все остальные.

По данным двум именам супергероев определите, может ли супергерой с именем \(s\) трансформироваться в супергероя с именем \(t\).

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

Первая строка содержит строку \(s\) длины от \(1\) до \(1000\) включительно.

Вторая строка содержит строку \(t\) длины от \(1\) до \(1000\) включительно.

Строки \(s\) и \(t\) различны и состоят только из строчных латинских букв.

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

Выведите «Yes» (без кавычек), если супергерой с именем \(s\) может трансформироваться в супергероя с именем \(t\), и «No» (без кавычек) иначе.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере, так как буквы «a» и «u» гласные, возможно трансформировать строку \(s\) в \(t\).

В третьем примере «k» является согласной, а «a» — гласная, поэтому невозможно преобразовать строку \(s\) в \(t\).

B. Средняя сила супергероев

математика Перебор реализация *1700

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

Изначально в команде \(n\) супергероев с силами \(a_1, a_2, \ldots, a_n\), соответственно. За одну операцию можно убрать супергероя из команды (если сейчас их не меньше двух) или увеличить силу одного супергероя на \(1\). Можно выполнить не более \(m\) операций. Кроме того, нельзя увеличивать силу одного супергероя больше, чем в \(k\) операциях.

Помогите мстителям максимизировать среднюю силу своей команды.

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

Первая строка содержит три целых числа \(n\), \(k\) и \(m\) (\(1 \le n \le 10^{5}\), \(1 \le k \le 10^{5}\), \(1 \le m \le 10^{7}\)) — количество супергероев, максимальное количество раз, которое можно увеличивать силу одного супергероя, и общее максимальное число операций.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^{6}\)) — начальные силы супергероев в команде мстителей.

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

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

Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не превосходит \(10^{-6}\).

Формально, пусть ваш ответ равен \(a\), а ответ жюри равен \(b\). Ваш ответ будет зачтен, если и только если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).

Примечание

В первом примере максимальная средняя сила достигается удалением первого супергероя и увеличением силы второго супергероя на четыре.

Во втором примере один из способов достичь максимальное среднее является удаление первого и третьего супергероев и увеличением сил второго и четвертого супергероев на \(2\).

A. Виноград

жадные алгоритмы Перебор реализация *800

Для простоты будем считать, что есть виноградинки только трёх типов: зелёные, фиолетовые и чёрные.

Андрей, Дмитрий и Михаил обожают виноград, однако их вкусы достаточно различны. Чтобы все трое из них были счастливы нужно чтобы произошло следующее:

  • Андрей, Дмитрий и Михаил должны съесть \(x\), \(y\) и \(z\) виноградинок соответственно.
  • Андрей питает особую близость к зелёному винограду, а потому готов есть только зелёные виноградинки.
  • С другой стороны, Дмитрий не особый фанат чёрных виноградинок, и готов есть любые виноградинки, кроме чёрных. Другими словами, он готов есть зелёные и фиолетовые виноградинки.
  • Михаил же сохраняет здравый смысл и готов есть любые виноградинки — лишь бы количество было достаточным.

Зная страсть своих друзей к винограду, Аки решил организовать для них виноградную вечеринку. Он также приготовил к ней коробку с \(a\) зелёными, \(b\) фиолетовыми и \(c\) чёрными виноградинками.

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

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

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

Первая строка содержит три целых числа \(x\), \(y\) и \(z\) (\(1 \le x, y, z \le 10^5\)) — количество виноградинок, которые Андрей, Дмитрий и Михаил хотят съесть.

Вторая строка содержит три целых числа \(a\), \(b\), \(c\) (\(1 \le a, b, c \le 10^5\)) — количество зелёных, фиолетовых и чёрных виноградинок в коробке.

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

Если существует распределение виноградинок, которое сделает всех счастливыми, выведите "YES". Иначе выведите "NO".

Примечание

В первом примере есть только одно возможное распределение:

Андрей должен съесть \(1\) зелёную виноградинку, Дмитрий должен съесть \(3\) оставшиеся зелёных виноградинки и \(3\) фиолетовых виноградинки, а Михаил должен съесть \(2\) из \(3\) чёрных виноградинок.

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

C. Замыкающие нули

математика Перебор реализация теория чисел *1700

Аки любит числа. Особенно те, что заканчиваются на большое количество нулей. Например, число \(9200\) заканчивается на два нуля. Аки считает, что чем больше таких замыкающих нулей в записи числа, тем лучше.

Однако Аки полагает, что количество замыкающих нулей не постоянно, а зависит от основания системы счисления, которая используется. Поэтому он изучает различные сценарии с разными числами и разными основаниями систем счисления. К настоящему моменту интересующие его числа стали настолько странными, что без вашей помощи ему никак не обойтись.

Вам даны два целых числа \(n\) и \(b\) (записанные в десятичной системе счисления). Выясните, сколько замыкающих нулей в \(b\)-ичной (то есть в системе счисления с основанием \(b\)) записи числа \(n\,!\) (факториала \(n\)).

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

Единственная строка входных данных содержит два целых числа \(n\) и \(b\) (\(1 \le n \le 10^{18}\), \(2 \le b \le 10^{12}\)).

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

Выведите одно целое число — количество замыкающих нулей в \(b\)-ичной записи числа \(n!\).

Примечание

В первом примере \(6!_{(10)} = 720_{(10)} = 880_{(9)}\).

Во втором и третьем примерах \(5!_{(10)} = 120_{(10)} = 1111000_{(2)}\).

Последовательность \(d_1, d_2, \ldots, d_k\) называется представлением числа \(x\) в \(b\)-ичной системе счисления, если \(x = d_1 b^{k - 1} + d_2 b^{k - 2} + \ldots + d_k b^0\), где \(d_i\) являются целыми числами и \(0 \le d_i \le b - 1\). Например, число \(720\) из первого примера имеет представление \(880_{(9)}\) так как \(720 = 8 \cdot 9^2 + 8 \cdot 9 + 0 \cdot 1\).

Вы можете прочитать ещё о системах счисления здесь.

A. Лучший подотрезок

математика реализация *1100

Вам задан массив \(a_1, a_2, \dots, a_n\). Найдите его подотрезок \(a_l, a_{l+1}, \dots, a_r\) (\(1 \le l \le r \le n\)) с максимальным значением среднего арифметического \(\frac{1}{r - l + 1}\sum\limits_{i=l}^{r}{a_i}\) (без какого-либо округления).

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

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

В первой строке задано единственное целое число \(n\) (\(1 \le n \le 10^5\)) — длинна массива \(a\).

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^9\)) — массив \(a\).

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

Выведите единственное число — длину наидлиннейшего подотрезка с максимально возможным средним арифметическим.

Примечание

Подотрезок \([3, 4]\) — самый длинный среди всех подотрезков с максимальным средним арифметическим.

B. Таня и конфеты

реализация *1200

У Тани есть \(n\) конфет, пронумерованных от \(1\) до \(n\). \(i\)-я конфета весит \(a_i\).

Она планирует съесть ровно \(n-1\) конфету и отдать оставшуюся конфету своему папе. Таня ест конфеты в порядке увеличения их номеров, ровно по одной конфете каждый день.

Ваша задача — найти количество таких конфет \(i\) (назовем эти конфеты хорошими), что если папа получит \(i\)-ю конфету, то сумма весов конфет, которые Таня съест в четные дни, будет равна сумме весов конфет, которые Таня съест в нечетные дни. Заметим, что сначала она отдает конфету, а потом начинает есть оставшиеся конфеты одну за другой.

Например, \(n=4\), а веса равны \([1, 4, 3, 3]\). Рассмотрим все возможны варианты дать папе конфету:

  • Таня дает \(1\)-ю конфету папе (\(a_1=1\)), остались конфеты \([4, 3, 3]\). Она съест \(a_2=4\) в первый день, \(a_3=3\) во второй день, \(a_4=3\) в третий день. Таким образом, в нечетные дни она съест \(4+3=7\), а в четные дни она съест \(3\). Так как \(7 \ne 3\), этот вариант не должен быть учтен в ответе (эта конфета не является хорошей).
  • Таня дает \(2\)-ю конфету папе (\(a_2=4\)), остались конфеты \([1, 3, 3]\). Она съест \(a_1=1\) в первый день, \(a_3=3\) во второй день, \(a_4=3\) в третий день. Таким образом, в нечетные дни она съест \(1+3=4\), а в четные дни она съест \(3\). Так как \(4 \ne 3\), этот вариант не должен быть учтен в ответе (эта конфета не является хорошей).
  • Таня дает \(3\)-ю конфету папе (\(a_3=3\)), остались конфеты \([1, 4, 3]\). Она съест \(a_1=1\) в первый день, \(a_2=4\) во второй день, \(a_4=3\) в третий день. Таким образом, в нечетные дни она съест \(1+3=4\), а в четные дни она съест \(4\). Так как \(4 = 4\), этот случай должен быть учтен в ответе (эта конфета является хорошей).
  • Таня дает \(4\)-ю конфету папе (\(a_4=3\)), остались конфеты \([1, 4, 3]\). Она съест \(a_1=1\) в первый день, \(a_2=4\) во второй день, \(a_3=3\) в третий день. Таким образом, в нечетные дни она съест \(1+3=4\), а в четные дни она съест \(4\). Так как \(4 = 4\), этот случай должен быть учтен в ответе (эта конфета является хорошей).

Суммарно здесь есть \(2\) случая, которые должны быть учтены (эти конфеты являются хорошими), таким образом, ответ равен \(2\).

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

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество конфет.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^4\)), где \(a_i\) равно весу \(i\)-й конфеты.

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

Выведите одно целое число — количество таких конфет \(i\) (хороших конфет), что если папа получит \(i\)-ю конфету, то сумма весов конфет, которые Таня съест в четные дни, будет равна сумме весов конфет, которые Таня съест в нечетные дни.

Примечание

В первом тестовом примере индексы хороших конфет равны \([1, 2]\).

Во втором тестовом примере индексы хороших конфет равны \([2, 3]\).

В третьем тестовом примере индексы хороших конфет равны \([4, 5, 9]\).

C. Палиндромная матрица

Конструктив реализация *1700

Назовем некоторую квадратную матрицу с целыми числами в ячейках палиндромной, если она не меняется при изменении порядка строк на обратный и не меняется при изменении порядка столбцов на обратный.

Например, следующие матрицы палиндромные:

Следующие матрицы не палиндромные, потому что меняются при изменении порядка строк на обратный:

Следующие матрицы не палиндромные, потому что меняются при изменении порядка столбцов на обратный:

Заданы \(n^2\) целых чисел. Разместите их в матрице из \(n\) строк и \(n\) столбцов так, чтобы каждое число было использовано ровно один раз, каждая ячейка содержала ровно одно число и полученная матрица была палиндромной. Если существует несколько решений, выведите любое из них. Если решения не существует, выведите «NO».

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

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

Во второй строке записаны \(n^2\) целых чисел \(a_1, a_2, \dots, a_{n^2}\) (\(1 \le a_i \le 1000\)) — числа, которые требуется разместить в матрице из \(n\) строк и \(n\) столбцов.

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

Если можно разместить все \(n^2\) чисел в матрице из \(n\) строк и \(n\) столбцов так, чтобы каждое число было использовано ровно один раз, каждая ячейка содержала ровно одно число и полученная матрица была палиндромной, то выведите «YES». Затем выведите \(n\) строк, каждая должна содержать \(n\) целых чисел, разделенных пробелами, — полученная матрица.

Если невозможно собрать ни одну матрицу, то выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, «YeS», «no» и «yES» принимаются.

Примечание

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

E. Очередная задача про бал

Конструктив реализация *1700

Король Берляндии устраивает бал! На него приглашены \(n\) пар, они пронумерованы от \(1\) до \(n\). Каждая пара состоит из одного мужчины и одной женщины. Каждый танцор (то есть и мужчина, и женщина) должен надеть одноцветный костюм. Цвет каждого костюма можно обозначить целым числом от \(1\) до \(k\) включительно.

Пусть \(b_i\) — цвет костюма мужчины, а \(g_i\) — цвет костюма женщины в \(i\)-й паре. Вам необходимо выбрать цвета костюмов для каждого из танцоров (то есть значения \(b_1, b_2, \dots, b_n\) и \(g_1, g_2, \dots g_n\)) таким образом, что:

  1. для каждого \(i\): \(b_i\) и \(g_i\) должны быть целыми числами от \(1\) до \(k\) включительно;
  2. не существует двух абсолютно одинаковых пар, то есть не существует двух таких индексов \(i, j\) (\(i \ne j\)), что \(b_i = b_j\) и \(g_i = g_j\) одновременно;
  3. не существует такой пары, что цвет костюма мужчины равен цвету костюма женщины в этой паре, то есть \(b_i \ne g_i\) для всех \(i\);
  4. для каждых двух последовательных (соседних) пар цвета костюмов мужчин и цвета костюмов женщин отличаются, то есть для всех \(i\) от \(1\) до \(n-1\) должны выполняться условия \(b_i \ne b_{i + 1}\) и \(g_i \ne g_{i + 1}\).

Посмотрим на примеры хороших и плохих выборов цветов (для \(n=4\) и \(k=3\), мужчина — первый в паре, а женщина — вторая):

Плохие выборы цветов:

  • \((1, 2)\), \((2, 3)\), \((3, 2)\), \((1, 2)\) — противоречие со вторым условием (есть одинаковые пары);
  • \((2, 3)\), \((1, 1)\), \((3, 2)\), \((1, 3)\) — противоречие с третьим условием (существует пара в костюмах одинаковых цветов);
  • \((1, 2)\), \((2, 3)\), \((1, 3)\), \((2, 1)\) — противоречие с четвертым условием (есть две последовательные пары такие, что цвета костюмов мужчин/женщин совпадают).

Хорошие выборы цветов:

  • \((1, 2)\), \((2, 1)\), \((1, 3)\), \((3, 1)\);
  • \((1, 2)\), \((3, 1)\), \((2, 3)\), \((3, 2)\);
  • \((3, 1)\), \((1, 2)\), \((2, 3)\), \((3, 2)\).

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

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

Единственная строка входных данных содержит два целых числа \(n\) и \(k\) (\(2 \le n, k \le 2 \cdot 10^5\)) — количество пар и количество цветов.

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

Если невозможно найти любой подходящий выбор цветов, выведите «NO».

Иначе выведите «YES» и затем цвета костюмов пар в следующих \(n\) строках. \(i\)-я строка должна содержать два целых числа \(b_i\) и \(g_i\) — цвета костюмов мужчины и женщины в \(i\)-й паре соответственно.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, «YeS», «no» и «yES» принимаются.

A. Илья и красочная прогулка

жадные алгоритмы реализация *1100

Илья живет в прекрасном городе Хордальске.

На его улице расположено \(n\) домов, пронумерованных по порядку от \(1\) до \(n\), причем расстояние между двумя соседними домами равно \(1\). Соседними домами являются \(1\) и \(2\), \(2\) и \(3\), ..., \(n-1\) и \(n\). Дома \(n\) и \(1\) соседними не являются.

Дома покрашены в цвета \(c_1, c_2, \ldots, c_n\), то есть \(i\)-й дом покрашен в цвет \(c_i\). Известно, что Хордальск не является скучным городом, поэтому найдутся хотя бы два дома, покрашенные в разные цвета.

Илья хочет выбрать два дома \(i\) и \(j\) таких, что \(1 \leq i < j \leq n\), а цвета этих домов отличаются: \(c_i \neq c_j\). Затем он пройдет от дома \(i\) до дома \(j\) расстояние \((j-i)\).

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

Помогите Илье, найдите, чему равно это максимальное расстояние.

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

В первой строке записано одно целое число \(n\) (\(3 \leq n \leq 300\,000\)) — количество домов на улице Ильи в Хордальске.

Во второй строке записаны \(n\) целых чисел, разделенных пробелами \(c_1, c_2, \ldots, c_n\) (\(1 \leq c_i \leq n\)) — цвета домов на описываемой улице.

Гарантируется, что найдется хотя бы одна пара \(i\) и \(j\) такая, что \(1 \leq i < j \leq n\) и \(c_i \neq c_j\).

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

Выведите одно целое число — максимально возможное расстояние, которое может пройти Илья за одну прогулку.

Примечание

В первом примере оптимальным является маршрут от первого дома до последнего, в котором Илья пройдет расстояние, равное \(5-1 = 4\).

Во втором примере оптимальным является либо маршрут от первого дома до второго, либо от второго до третьего. Оба этих маршрута имеют расстояние, равное \(1\).

В третьем примере оптимальным является маршрут от третьего дома до последнего, на котором Илья пройдет расстояние \(7-3 = 4\).

C. Рамзес и инвертирование углов

жадные алгоритмы Конструктив математика реализация *1500

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

Даны две матрицы \(A\) и \(B\) размера \(n \times m\), каждая состоит только из \(0\) и \(1\). Рамзес может сколько угодно раз применять к матрице \(A\) следующую операцию: взять любую подматрицу матрицы \(A\), содержащую хотя бы две строки и два столбца, и инвертировать значение в её углах (то есть все углы подматрицы, в которых раньше стоял \(0\), после операции будут содержать \(1\), а все углы подматрицы, в которых раньше стояла \(1\), после операции будут содержать \(0\)). Требуется ответить, можно ли из матрицы \(A\) получить матрицу \(B\).

Пример операции. Выбранная подматрица выделена голубым и желтым, ее углы выделены желтым.

Так как Рамзес не хочет выполнять эти операции вручную, он просит вас ответить на этот вопрос.

Подматрицей матрицы \(M\) называется матрица, образованная элементами на пересечении множества строк с номерами \(x_1, x_1+1, \ldots, x_2\) матрицы \(M\) и множества столбцов с номерами \(y_1, y_1+1, \ldots, y_2\) матрицы \(M\), где \(x_1, x_2, y_1, y_2\) — крайние строки и столбцы подматрицы. Иными словами, подматрица — это набор ячеек исходной матрицы, которые образуют сплошной (без пустот) прямоугольник со сторонами, параллельными сторонам исходной матрицы, углами подматрицы являются клетки \((x_1, y_1)\), \((x_1, y_2)\), \((x_2, y_1)\), \((x_2, y_2)\), где клетка \((i,j)\) обозначает клетку на пересечении \(i\)-й строки и \(j\)-го столбца.

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

В первой строке находятся два целых числа \(n\) и \(m\), разделенных пробелом (\(1 \leq n, m \leq 500\)) — количество строк и столбцов в матрицах \(A\) и \(B\) соответственно.

В следующих \(n\) строках находятся по \(m\) целых чисел, разделенных пробелом: \(j\)-е число в \(i\)-й из этих строк обозначает \(j\)-й элемент \(i\)-й строки матрицы \(A\) (\(0 \leq A_{ij} \leq 1\)).

В следующих \(n\) строках находятся по \(m\) целых чисел, разделенных пробелом: \(j\)-е число в \(i\)-й из этих строк обозначает \(j\)-й элемент \(i\)-й строки матрицы \(B\) (\(0 \leq B_{ij} \leq 1\)).

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

Выведите «Yes» (без кавычек), если вышеуказанными действиями можно превратить матрицу \(A\) в матрицу \(B\), и «No» (без кавычек), если нельзя. Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

Примеры объяснены на рисунках ниже.

Пример 1.
Пример 2.
Пример 3.

G. Подготовка к сражению

Конструктив реализация *3100

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

В ближайшем сражении армии Евлампия предстоит сразиться с армией противника, состоящей из \(m\) групп, \(i\)-я из которых имеет запас здоровья \(hp_i\).

Сейчас у Евлампия есть \(n\) одинаковых воинов. Перед любой битвой он должен разделить их на ровно \(m\) групп (возможно, пустых) так, что суммарный размер групп равен \(n\). Сражение происходит пошагово. На каждом шаге каждая из групп Евлампия нападает на ровно одну группу противника. Таком образом, каждый шаг задается массивом из \(m\) чисел \(a_1, a_2, \ldots, a_m\), обозначающих, что \(i\)-й отряд Евлампия нападает на \(a_i\)-й отряд противника. Разные отряды могут нападать на одну и ту же группу противника, на каждом шаге массив \(a\) выбирается заново.

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

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

Евлампий понял, что предстоящее сражение отнимет у него всю ночь. Это очень его расстроило, ведь тогда он не успеет сделать домашнее задание. Теперь Евлампий просит вас написать программу, которая поможет ему победить в сражении за наименьшее число ходов и показать, как это сделать. Сможете ли вы ему помочь?

Иными словами, вам необходимо найти минимальное количество ходов, за которые можно уничтожить все войска противника, а после этого показать, как это сделать. Для этого опишите разбиение вашего войска на \(m\) групп, и выведите последовательности \(a\), описывающие каждый из ходов игры.

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq m \leq n \leq 10^{6}\)), разделенные пробелом — количество воинов в армии Евлампия и число групп в армии противника. \(m\) также равно числу групп, на которые Евлампий может разбить свою армию.

Вторая строка содержит \(m\) целых чисел \(hp_1, hp_2, \ldots, hp_m\) (\(1 \leq hp_i \leq 10^{6}\)) — здоровье групп противника.

Гарантируется, что сумма \(hp_i\) не превышает \(10^{6}\).

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

В первой строке выведите одно целое число \(t\) — минимальное чисто ходов, необходимое Евлампию для победы в битве.

После этого выведите \(m\) целых чисел \(s_1, s_2, \ldots, s_m\) (\(s_i \ge 0\), \(s_1 + s_2 + \ldots + s_m = n\)), обозначающих, что в \(i\)-й группе войска Евлампия будет \(s_i\) воинов.

В каждой из следующих \(t\) строках выведите \(m\) целых чисел \(a_1, a_2, \ldots, a_m\) (\(1 \le a_i \le m\)) — описание очередного хода Евлампия. Эти числа означают, что на очередном ходу \(i\)-я группа войска Евлампия должна атаковать \(a_i\)-ю группу войска противника. Разрешается нападать на уже уничтоженный отряд противника.

Примечание

Первый пример показан на рисунке.

A. Петя и строки

реализация Строки *800

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

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

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

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

Если первая строка меньше второй, выведите «-1». Если вторая строка меньше первой, выведите «1». Если строки равны, выведите «0». Учтите, что регистр букв не учитывается при сравнении.

Примечание

Формально про лексикографический порядок (также известный как «порядок слов в словаре» и «алфавитный порядок»):

  • http://ru.wikipedia.org/wiki/Лексикографический_порядок
  • http://en.wikipedia.org/wiki/Lexicographical_order

B. Петя и квадрат

математика реализация *1200

Маленький Петя любит играть с квадратами. Мама подарила Пете квадрат размера 2n × 2n. Петя отметил одну клетку квадрата и теперь решает следующую задачу.

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

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

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

В первой строке через пробел записано три целых числа 2n, x и y (2 ≤ 2n ≤ 100, 1 ≤ x, y ≤ 2n) — размер стороны квадрата и координаты отмеченной клетки. Гарантируется, что 2n — четное число.

Координаты отмеченной клетки — это пара чисел x y, где x обозначает номер строки, а y — номер столбца. Строки и столбцы нумеруются последовательными целыми числами от 1 до 2n. Строки нумеруются сверху вниз, а столбцы — слева направо.

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

Если квадрат можно разрезать, выведите «YES», иначе выведите «NO» (без кавычек).

Примечание

Рисунок, описывающий тест из условия и показывающий один из возможных вариантов разрезания квадрата:

B. Майк и дети

Перебор реализация *1200

Майк решил преподавать программирование детям в младших классах. Он знает, что не так-то просто заинтересовать детей программированием в этом возрасте. Вот почему он решил дать каждому из них две конфеты.

У Майка есть \(n\) конфет, размеры которых \(a_1, a_2, \ldots, a_n\). Все его конфеты имеют разные размеры. То есть не существует такой пары \((i, j)\) (\(1 \leq i, j \leq n\)), что \(i \ne j\) и \(a_i = a_j\).

Поскольку Майк преподает уже много лет, он знает, что если он даст две конфеты с размерами \(a_i\) и \(a_j\) одному ребенку, а \(a_k\) и \(a_p\) другому, где \((a_i + a_j) \neq (a_k + a_p)\), то ребенок, у которого меньшая сумма размеров конфет, будет расстроен. То есть, если есть двое детей, у которых разные суммы размеров конфет, то один из них будет расстроен. Очевидно, что Майк не хочет, чтобы кто-то расстраивался.

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

Поскольку Майк занят подготовкой к своей первой лекции в младших классах, он просит вас найти максимальное количество детей, которых он может пригласить, давая каждому из них две конфеты таким образом, чтобы никто не расстроился.

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

Первая строка содержит одно целое число \(n\) (\(2 \leq n \leq 1\,000\)) — количество конфет у Майка.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^5\)) — размеры конфет. Гарантируется, что все размеры разные.

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

Выведите одно целое число — максимальное количество детей, которых Майк может пригласить, давая каждому из них две конфеты таким образом, чтобы никто не расстроился.

Примечание

В первом примере Майк может дать \(9+2=11\) первому ребенку, \(8+3=11\) второму и \(7+4=11\) третьему. Поэтому Майк может пригласить три ребенка. Обратите внимание, что это не единственное решение.

Во втором примере Майк может дать \(3+9=12\) первому ребенку и \(1+11\) второму. Поэтому Майк может пригласить два ребенка. Обратите внимание, что это не единственное решение.

A. Уроки грамматики

реализация Строки *1600

В третьем классе Петя увлекся грамматикой и придумал свой собственный язык, который назвал Петровский. Петя хотел создать максимально простой язык, которого бы хватило для общения с друзьями, поэтому вся грамматика языка описывается следующим набором правил:

  • Есть три части речи: прилагательное, существительное, глагол. Каждое слово языка является либо прилагательным, либо существительным, либо глаголом.
  • Есть два рода: мужской и женский. Каждое слово языка имеет либо мужской, либо женский род.
  • Прилагательные мужского рода заканчиваются на -lios, а женского — на -liala.
  • Существительные мужского рода заканчиваются на -etr, а женского — на -etra.
  • Глаголы мужского рода заканчиваются на -initis, а женского — на -inites.
  • Таким образом, каждое слово Петровского языка имеет одно из шести описанных выше окончаний. Других слов в Петровском языке нет.
  • Допускается, что слово целиком состоит из окончания. То есть слова «lios», «liala», «etr» и так далее принадлежат Петровскому языку.
  • Знаки препинания, времена, числа и прочее в этом языке отсутствуют.
  • Предложение — это либо ровно одно слово любой части речи Петровского языка, либо ровно одно словосочетание.

Словосочетание — это любая последовательность слов Петровского языка, удовлетворяющая следующим условиям:

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

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

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

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

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

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

Если какое-то слово заданного текста не принадлежит Петровскому языку, или в тексте содержится более одного предложения, выведите «NO» (без кавычек). В противном случае выведите «YES» (без кавычек).

E. Сон

Комбинаторика математика реализация *2700

Однажды Вася лежал в кровати и для того, чтобы быстрее заснуть, наблюдал за своими электронными часами.

Вася живет в странной стране, где в сутках h часов, а в каждом часе m минут. Часы показывают время в десятичной системе счисления в формате H:M, где строка H всегда имеет фиксированную длину, равную количеству цифр в десятичной записи числа h - 1, для этого, при необходимости, добавляются лидирующие нули. Строка M имеет аналогичный вид, и ее длина всегда равна количеству цифр в записи числа m - 1. Например, если h = 17, m = 1000, то время равное 13 часам и 75 минутам будет отображаться как «13:075».

Вася наблюдал за часами с момента h1 часов m1 минут до h2 часов m2 минут включительно, а затем он заснул. Теперь он просит вас подсчитать, сколько раз он видел момент, в который на часах переключилось не менее k цифр одновременно.

Например, при переключении 04:19  →  04:20 изменяется две цифры, при 23:59  →  00:00 — четыре цифры.

Считайте, что Вася наблюдал за часами строго меньше суток. Обратите внимание, что последние значения, которые увидел Вася на часах до того, как заснуть, — это «h2:m2». То есть момент, в который время «h2:m2» переключается на следующее значение, Вася не видит.

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

В первой строке входного файла записаны через пробел три целых числа h, m и k (2 ≤ h, m ≤ 109, 1 ≤ k ≤ 20). Во второй строке записаны разделенные пробелом целые числа h1, m1 (0 ≤ h1 < h, 0 ≤ m1 < m). В третьей строке записаны разделенные пробелом целые числа h2, m2 (0 ≤ h2 < h, 0 ≤ m2 < m).

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

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

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout (также вы можете использовать спецификатор %I64d).

Примечание

В первом примере Вася увидит следующие моменты времени: 4:4 0:0  →  0:1  →  0:2  →  0:3  →  0:4 1:0  →  1:1  →  1:2  →  1:3  →  1:4 2:0  →  2:1  →  2:2  →  2:3  →  2:4. Двойной стрелкой () обозначены искомые моменты времени (в данном примере — когда Вася видит переключение двух цифр одновременно).

Во втором примере k = 1. Нам подходит любое переключение времени, так как при каждом переключении меняется хотя бы одна цифра. Всего переключений 24·60 = 1440, но из них Вася не увидел одно переключение 23:59 00:00.

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

A. Быть позитивным

реализация *800

Вам дан массив из \(n\) целых чисел: \(a_1, a_2, \ldots, a_n\). Ваша задача найти некоторое ненулевое целое число \(d\) (\(-10^3 \leq d \leq 10^3\)) такое, что при делении каждого элемента массива на \(d\) (элементы массива могут перестать быть целыми после этой операции), хотя бы половина чисел в массиве будет положительно (то есть в массиве будет хотя бы \(\lceil\frac{n}{2}\rceil\) положительных чисел). Положительные нецелые числа также считаются положительными, т.е. \(2.5\) будет учтено в подсчете. Если есть несколько подходящих значений \(d\), вы можете вывести любое из них. Если не существует такого \(d\), выведите \(0\).

Напомним, что \(\lceil x \rceil\) обозначает наименьшее целое число, которое больше либо равно \(x\), а \(0\) не является ни положительным, ни отрицательным числом.

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

В первой строке расположено единственное целое число \(n\) (\(1 \le n \le 100\)) — количество элементов в массиве.

Вторая строка содержит \(n\) целых чисел, разделенных пробелами, \(a_1, a_2, \ldots, a_n\) (\(-10^3 \le a_i \le 10^3\)).

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

Выведите любое целое число \(d\) (\(-10^3 \leq d \leq 10^3\) и \(d \neq 0\)), подходящее под заданные ограничения. Если есть несколько подходящих значений \(d\), вы можете вывести любое из них. Если не существует такого \(d\), выведите \(0\).

Примечание

В первом примере \(n = 5\), так что нам нужно хотя бы \(\lceil\frac{5}{2}\rceil = 3\) положительных числа после деления. Если \(d = 4\), массив после деления будет \([2.5, 0, -1.75, 0.5, 1.5]\), в котором \(3\) положительных числа (а именно: \(2.5\), \(0.5\), и \(1.5\)).

Во втором примере не существует подходящего \(d\), поэтому должен быть выведен \(0\).

B. Ничья!

жадные алгоритмы реализация *1400

У вас осталась частичная информация о счете во время исторического футбольного матча. Вам задан набор пар \((a_i, b_i)\), обозначающих, что во время матча на табло был счет «\(a_i\): \(b_i\)». Известно, что если текущий счёт «\(x\):\(y\)», то после гола он сменится на «\(x+1\):\(y\)» или «\(x\):\(y+1\)». Какое наибольшее количество раз на табло могла появиться ничья?

Пары «\(a_i\): \(b_i\)» заданы в хронологическом порядке (увеличения времени), но вам заданы только некоторые моменты времени. Последняя пара обязательно соответствует окончанию матча.

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

В первой строке записано целое число \(n\) (\(1 \le n \le 10000\)) — количество сохранившихся записей о счете в матче. В следующих \(n\) строках записано по два целых числа \(a_i\) и \(b_i\) (\(0 \le a_i, b_i \le 10^9\)), обозначающие счет на табло (т.е. число голов, забитых первой командой, и число голов, забитое второй командой). Эти записи перечислены в хронологическом порядке, т.е. последовательности \(x_i\) и \(y_j\) неубывающие. Последняя запись означает финальный счет матча.

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

Выведите наибольшее возможное количество моментов времени в матче, в которое счет становился ничейным. Момент начала матча, в который счет становится 0:0, также считается.

Примечание

В первом примере одна из возможных последовательностей изменения счета с наибольшем количеством ничьих следующая: 0:0, 1:0, 2:0, 2:1, 3:1, 3:2, 3:3, 3:4.

A. Правильная скобочная последовательность

жадные алгоритмы реализация *1100

Строка называется скобочной последовательностью, если в ней нет символов, отличных от «(» и «)». Скобочная последовательность называется правильной, если можно получить из нее корректное математическое выражение путем вставки в нее символов «+» и «1». Например, «», «(())» и «()()» — правильные скобочные последовательности; «))» и «)((» — скобочные последовательности, не являющиеся правильными, а «(a)» и «(1)+(1)» — не скобочные последовательности.

У вас есть несколько строк, каждая строка является скобочной последовательностью длины \(2\). Всего у вас \(cnt_1\) строк «((», \(cnt_2\) строк «()», \(cnt_3\) строк «)(» и \(cnt_4\) строк «))». Вы хотите записать эти строки в некотором порядке друг за другом; после этого у вас получится длинная скобочная последовательность из \(2(cnt_1 + cnt_2 + cnt_3 + cnt_4)\) символов. Вам необходимо ответить на следующий вопрос: можно ли выбрать некоторый порядок строк, что в итоге получится правильная скобочная последовательность? Обратите внимание: нельзя ни удалять, ни добавлять новые символы или строки.

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

Входные данные — четыре строки, в \(i\)-й из которых записано одно целое число \(cnt_i\) (\(0 \le cnt_i \le 10^9\)).

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

Выведите одно целое число: \(1\), если можно выбрать некоторый порядок строк и записать их друг за другом, в результате чего получится правильная скобочная последовательность; \(0\), если это невозможно.

Примечание

В первом примере можно построить строку «(())()(()((()()()())))», которая является правильной скобочной последовательностью.

Во втором примере можно построить строку «», которая является правильной скобочной последовательностью.

A. Середина контеста

реализация *1000

Поликарп собирается поучаствовать в контесте. Контест начинается в \(h_1:m_1\) и кончается в \(h_2:m_2\). Гарантируется, что контест длится четное количество минут (то есть \(m_1 \% 2 = m_2 \% 2\), где \(x \% y\) означает \(x\), взятый по модулю \(y\)). Также гарантируется, что весь контест длится в течение одного дня. И, наконец, гарантируется, что контест длится хотя бы две минуты.

Поликарп хочет узнать время середины контеста. Например, если контест длится с \(10:00\) до \(11:00\), то ответом будет \(10:30\), если контест длится с \(11:10\) до \(11:12\), то ответом будет \(11:11\).

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

Первая строка входных данных содержит два целых числа \(h_1\) и \(m_1\) в формате hh:mm.

Вторая строка входных данных содержит два целых числа \(h_2\) и \(m_2\) в таком же формате (hh:mm).

Гарантируется, что \(0 \le h_1, h_2 \le 23\) и \(0 \le m_1, m_2 \le 59\).

Гарантируется, что контест длится четное количество минут (то есть \(m_1 \% 2 = m_2 \% 2\), где \(x \% y\) означает \(x\), взятый по модулю \(y\)). Также гарантируется, что весь контест длится в течение одного дня. И, наконец, гарантируется, что контест длится хотя бы две минуты.

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

Выведите два целых числа \(h_3\) и \(m_3\) (\(0 \le h_3 \le 23, 0 \le m_3 \le 59\)), обозначающие середину контеста, в формате hh:mm. Каждое число надо вывести в виде ровно двух цифр (используйте дополнительный лидирующий ноль, если необходимо), разделяйте числа символом ':'.

A. Настя читает книгу

реализация *800

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

За вечер Настя не успела прочитать всю книгу и поэтому пометила страницу с номером \(k\) как ту страницу, с которой она начнет читать на следующий вечер (т. е. она прочитала все страницы с \(1\)-й по \((k-1)\)-ю).

На следующий день в школе друг Насти Игорь спросил у нее, сколько глав ей осталось прочитать. Так как Настя очень занята, она попросила вас сказать, сколько глав книги Настя еще не прочитала полностью (т. е. прочитала частично или не прочитала вовсе).

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 100\)) — количество глав в книге.

\(i\)-я из следующих \(n\) строк содержит два целых числа, разделенных пробелом: \(l_i\) и \(r_i\) (\(l_1 = 1\), \(l_i \leq r_i\)) — номера первой и последней страницы \(i\)-й главы. Гарантируется, что \(l_{i+1} = r_i + 1\) для всех \(1 \leq i \leq n-1\), кроме того, гарантируется, что каждая глава содержит не более \(100\) страниц.

\((n+2)\)-я строка содержит одно целое число \(k\) — номер помеченной страницы (\(1 \leq k \leq r_n\)).

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

Выведите одно целое число — количество еще не прочитанных полностью глав.

Примечание

В первом тесте книга состоит из \(11\) страниц и \(3\) глав — \([1;3]\), \([4;7]\) и \([8;11]\). Настя пометила \(2\)-ю страницу, то есть остановилась в середине \(1\)-й главы. Таким образом, все главы еще не прочитаны полностью, и ответ на этот тест \(3\).

Во втором тесте книга также состоит из \(12\) страниц и \(3\) глав, однако Настя остановилась на чтении \(2\)-й главы. Тогда ответ \(2\).

A. Небоскребы

реализация сортировки *1600

Даша очень любит приключения. На днях ей встретился удивительный город, представляющий из себя \(n\) улиц, направленных вдоль восточного направления, и \(m\) улиц, направленных вдоль южного направления, образующих естественным образом \(nm\) перекрестков. На любом пересечении \(i\)-й улицы, идущей на восток, и \(j\)-й улицы, идущей на юг, можно увидеть монументальной величины небоскреб. Загоревшись любопытством, Даша решила исследовать высоту городских строений.

Проходя через перекресток на пересечении \(i\)-й и \(j\)-й улицы соответствующих направлений, Даша оглядывает две улицы, на которых находится. Узнав высоты всех небоскрёбов, которые находятся на этих двух улицах, Даша задаётся вопросом: как можно переназначить высоты всем небоскрёбам на этих двух улицах, чтобы максимальная высота была как можно меньше, а результат сравнения высот у любых двух небоскрёбов на одной улице не изменился.

Сформулируем задачу формально. На каждом из \(nm\) перекрёстков Даша независимо от других перекрёстков решает задачу. Сейчас она видит \(n + m - 1\) небоскрёбов, и для каждого видит его настоящую высоту. При этом любые два небоскрёба можно сравнить по высоте и получить результат «больше», «меньше» или «равно». Теперь Даша хочет выбрать некоторое целое \(x\), после чего назначить каждому небоскрёбу целую положительную высоту от \(1\) до \(x\). При назначении высот Даша хочет сохранить относительный порядок в каждой из улиц. То есть результат сравнения высоты любых двух небоскрёбов на текущей улице восточного направления не должен измениться, и результат сравнения высоты любых двух небоскрёбов на текущей улице южного направления не должен измениться. При этом небоскрёбы, находящиеся только на текущей улице восточного направления не сравниваются с небоскрёбами, находящими на текущей улице южного направления, а небоскрёб, находящийся на пересечении, может сравниваться и с теми и с теми. Для каждого перекрёстка Даша хочет независимо вычислить минимальное возможное подходящее \(x\).

Например, если выбранный перекрёсток и улицы ему соответствующие выглядят следующим образом:

То можно заменить высоты небоскрёбов следующим образом (заметим, что все сравнения на меньше, больше или равно внутри улицы южного направления и внутри улицы восточного направления при этом не поменяются).

Наибольшее использованное число равно \(5\), а значит ответом для этого перекрёстка было бы \(5\).

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 1000\)) — количество улиц, идущих вдоль восточного направления и южного соответственно.

Каждая из следующих \(n\) содержит по \(m\) целых чисел \(a_{i,1}\), \(a_{i,2}\), ..., \(a_{i,m}\) (\(1 \le a_{i,j} \le 10^9\)) в каждой. Число \(a_{i,j}\), находящееся на \(j\)-й позиции в \(i\)-й строке, характеризует высоту небоскреба, находящегося на пересечении \(i\)-й улицы восточного направления и \(j\)-й улицы южного направления.

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

Выведите \(n\) строк, по \(m\) целых положительных чисел, где число \(x_{i,j}\), находящееся на \(j\)-й позиции в \(i\)-й строке — это ответ на задачу в перекрестке на пересечении \(i\)-й улицы восточного направления и \(j\)-й улицы южного направления.

Примечание

В первом примере из условия ни на одном из перекрестков максимальную высоту уменьшить не получится, а значит можно просто не менять высоты.

Во втором примере из условия имеем следующие ответы:

  • Для пересечения первой строки и первого столбца:
  • Для пересечения первой строки и второго столбца:
  • Для пересечения второй строки и первого столбца:
  • Для пересечения второй строки и второго столбца:

C. Путешествие по музеям

графы дп реализация *2500

В стране \(N\) есть \(n\) городов, соединённых \(m\) односторонними дорогами. Эта, казалось бы непримечательная страна, всё же интересна двумя своими особенностями. Во-первых, неделя здесь длится \(d\) дней. Во-вторых, в каждом городе страны \(N\) расположен ровно один музей.

Турфирма «Открытые музеи» разрабатывает новую программу для путешественников, интересующихся музеями. Работникам турфирмы известно, в какие дни недели каждый из музеев открыт для посещения. Путешествие должно начаться в столице — городе с номером \(1\), причём день начала путешествия должен быть первым днём недели. Днём турист будет находиться в городе и смотреть экспозицию музея (в случае если музей, конечно, работает сегодня), а в конце дня путешествие либо заканчивается, либо турист отправляется в другой город, соединённый с текущим дорогой. Дорожная система \(N\) устроена так, что перемещение по одной дороге всегда занимает одну ночь, кроме того все дороги в стране односторонние. Во время путешествия разрешается посещать один город несколько раз.

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

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

Первая строка содержит три целых числа \(n\), \(m\) и \(d\) (\(1 \leq n \leq 100\,000\), \(0 \leq m \leq 100\,000\), \(1 \leq d \leq 50\)) — количество городов, количество дорог и количество дней в неделе.

Каждая из следующих \(m\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)), обозначающие одностороннюю дорогу из города \(u_i\) в город \(v_i\).

Следующие \(n\) строк содержат график работы музеев. График работы музея, находящегося в \(i\)-м городе, описывается в \(i\)-й из этих строк. Каждая строка состоит ровно из \(d\) символов «0» или «1», \(j\)-й символ строки равен «1», если музей открыт в \(j\)-й день недели, и «0» в противном случае.

Гарантируется, для каждой пары городов \((u, v)\) существует не более одной дороги, ведущей из \(u\) в \(v\).

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

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

Примечание
Пояснение к первому примеру

Максимально возможное количество музеев для посещения равно \(3\). Можно посетить \(3\) различных музея, например, так, как описано ниже.

  • День 1. Сейчас день недели \(1\), и турист находится в городе \(1\). Музей там закрыт. Ночью турист направляется в город \(2\).
  • День 2. Сейчас день недели \(2\), и турист находится в городе \(2\). Музей там открыт, турист его посещает. Ночью турист направляется в город \(4\).
  • День 3. Сейчас день недели \(3\), и турист находится в городе \(4\). Музей там открыт, турист его посещает. Ночью турист направляется в город \(1\).
  • День 4. Сейчас день недели \(1\), и турист находится в городе \(1\). Музей там закрыт. Ночью турист направляется в город \(2\).
  • День 5. Сейчас день недели \(2\), и турист находится в городе \(2\). Музей там открыт, но турист в нём уже был. Ночью турист направляется в город \(3\).
  • День 6. Сейчас день недели \(3\), и турист находится в городе \(3\). Музей там открыт, турист его посещает. На этом путешествие заканчивается.
Пояснение ко второму примеру

Максимально возможное количество музеев для посещения равно \(2\). Можно посетить \(2\) различных музея, например, так, как описано ниже.

  • День 1. Сейчас день недели \(1\), и турист находится в городе \(1\). Музей там открыт, турист его посещает. Ночью направляемся в город \(2\).
  • День 2. Сейчас день недели \(2\), и турист находится в городе \(2\). Музей там закрыт. Ночью направляемся в город \(3\).
  • День 3. Сейчас день недели \(3\), и турист находится в городе \(3\). Музей там открыт, турист его посещает. На этом путешествие заканчивается.

A. Суши для двоих

Бинарный поиск жадные алгоритмы реализация *900

Аркадий пригласил Анну на ужин в суши-ресторан. Ресторан немного необычный: на выбор клиенту предлагаются \(n\) суши, выложенных в ряд, а клиент должен заказать себе некоторый подотрезок из подряд идущих суши.

Суши бывают двух видов: либо с тунцом, либо с угрем. Обозначим тип \(i\)-го слева суши как \(t_i\), где \(t_i = 1\) обозначает, что это суши с тунцом, а \(t_i = 2\) означает, что оно с угрем.

Аркадий не любит суши с тунцом, Анна не любит суши с угрем. Аркадий хочет выбрать последовательный подотрезок суши так, чтобы в нем было поровну суши обоих типов, и каждая половина отрезка содержала только суши одного типа. Например, подотрезок \([2, 2, 2, 1, 1, 1]\) подходит, а подотрезок \([1, 2, 1, 2, 1, 2]\) — нет, потому что в обеих половинах есть суши обоих типов.

Найдите длину наибольшего подотрезка из подряд идущих суши, который может заказать Аркадий.

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 100\,000\)) — количество суши.

Вторая строка содержит \(n\) целых чисел \(t_1\), \(t_2\), ..., \(t_n\) (\(t_i = 1\), что означает суши с тунцом, или \(t_i = 2\), что означает суши с угрем), обозначающие типы суши слева направо.

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

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

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

Примечание

В первом примере Аркадий может выбрать подотрезок \([2, 2, 1, 1]\) или подотрезок \([1, 1, 2, 2]\), длина которых \(4\).

Во втором примере невозможно выбрать что-то другое, кроме \([2, 1]\) или \([1, 2]\), длина которых \(2\).

В третьем примере лучший выбор Аркадия — подотрезок \([1, 1, 1, 2, 2, 2]\).

A. Чётные подстроки

реализация Строки *800

Вам дана строка \(s=s_1s_2\dots s_n\) длины \(n\), содержащая только цифры \(1\), \(2\), ..., \(9\).

Подстрокой \(s[l \dots r]\) строки \(s\) назовём строку \(s_l s_{l + 1} s_{l + 2} \ldots s_r\). Подстрока \(s[l \dots r]\) строки \(s\) называется чётной, если число, которое соответствует этой подстроке является чётным.

Найдите количество чётных подстрок строки \(s\). Обратите внимание, что если некоторые подстроки равны как строки, но определены разными числами \(l\), \(r\), то они считаются различными.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 65000\)) — длину строки \(s\).

Вторая строка содержит строку \(s\) длины \(n\). Строка \(s\) состоит только из цифр \(1\), \(2\), ..., \(9\).

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

Выведите одно целое число — количество чётных подстрок в строке \(s\).

Примечание

В первом примере следующие \([l, r]\) пары задают чётные подстроки:

  • \(s[1 \dots 2]\)
  • \(s[2 \dots 2]\)
  • \(s[1 \dots 4]\)
  • \(s[2 \dots 4]\)
  • \(s[3 \dots 4]\)
  • \(s[4 \dots 4]\)

Во втором примере, все \(10\) подстрок строки \(s\) являются чётными. Обратите внимание, что не смотря на то, что строки \(s[1 \dots 1]\) и \(s[2 \dots 2]\) задают подстроку «2», они всё равно считаются как различные подстроки.

B. Шоколадки

жадные алгоритмы реализация *1000

Вы пришли в магазин, продающих \(n\) типов шоколадок. Всего в наличии есть \(a_i\) шоколадок типа \(i\).

У вас есть неограниченное количество денег (так что никаие цены не являются ограничивающим фактором) и вы хотите купить как можно больше шоколадок. Однако, если вы купите \(x_i\) шоколадок типа \(i\) (очевидно, \(0 \le x_i \le a_i\)), то для каждого \(1 \le j < i\) должно быть верно хотя бы одно из двух:

  • \(x_j = 0\) (вы купили ноль шоколадок типа \(j\))
  • \(x_j < x_i\) (вы купили меньше шоколадок типа \(j\), чем типа \(i\))

Например, массив \(x = [0, 0, 1, 2, 10]\) удовлетворяет условию выше (в предположении, что все \(a_i \ge x_i\)), а массивы \(x = [0, 1, 0]\), \(x = [5, 5]\) и \(x = [3, 2]\) нет.

Вычислите наибольшое количество шоколадок, которое вы можете купить.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество типов шоколадок.

Следующая строка содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 10^9\)) — количество шоколадок каждого вида.

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

Выведите максимальное количество шоколадок, которое можно купить.

Примечание

В первом примере оптимально купить: \(0 + 0 + 1 + 3 + 6\) шоколадок.

Во втором примере оптимально купить: \(1 + 2 + 3 + 4 + 10\) шоколадок.

В третьем примере оптимально купить: \(0 + 0 + 0 + 1\) шоколадок.

A. Детектив

реализация *1000

Недавно Иван купил очень интересный детектив. На каждой странице книги появляется какая-то тайна, разгадка которой находится где-то дальше по тексту. Формально, \(i\)-я страница содержит тайну, которая проясняется на странице \(a_i\) (\(a_i \ge i\)).

Иван хочет прочесть всю книгу. Каждый день он читает первую из еще не прочитанных страниц и продолжает читать их подряд, пока не прояснятся все тайны, о которых он прочитал (Иван прекращает чтение, если не существует такой страницы \(i\), что ее Иван прочитал, а \(a_i\) — нет). После этого он закрывает книгу и откладывает чтение следующей страницы до завтра.

Сколько дней понадобится Ивану, чтобы прочесть всю книгу?

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

Первая строка содержит единственное число \(n\) (\(1 \le n \le 10^4\)) — количество страниц в книге.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(i \le a_i \le n\)), где \(a_i\) — это номер страницы, содержащей разгадку тайны со страницы \(i\).

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

Выведите единственное число — количество дней, необходимых для прочтения книги.

Примечание

Пояснение к примеру из условия:

В первый день Иван прочтет только первую страницу. Во второй день он прочтет страницы \(2\) и \(3\). В третий день — страницы \(4\)-\(8\). В четвертый и последний день Иван прочтет оставшуюся \(9\)-ю страницу.

B. Хорошая строка

реализация Строки *1200

У вас есть строка \(s\) длины \(n\) состоящая только из символов > и <. Вы можете выполнять операции с этой строкой, для каждой операции вы выбираете какой-то символ этой строки, еще не удаленный из нее. Если вы выбрали символ >, следующий символ удаляется (если выбранный вами символ стоит правее всех остальных — ничего не происходит). Если вы выбрали символ <, то предыдущий символ удаляется (если выбранный вами символ стоит левее всех остальных — ничего не происходит).

Например, если мы выберем символ > в строке > > < >, то строка превратится в > > >. А если мы выберем символ < в строке > <, то строка превратится в <.

Строка называется хорошей, если существует последовательность операций, после выполнения которой в строке останется ровно один символ. Например строки >, > > хорошие.

До применения операций, вы можете удалить какое-то количество символов из строки (возможно, ни одного, возможно, \(n - 1\), но всю строку удалять нельзя). Вам нужно посчитать минимальное количество символов, которые нужно удалить из строки \(s\), чтобы она стала хорошей.

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

Первая строка содержит число \(t\) (\(1 \le t \le 100\)) — количество тестовых примеров. Каждый тестовый пример состоит из двух строк.

Первая строка \(i\)-го тестового примера содержит целое число \(n\) (\(1 \le n \le 100\)) — длина строки \(s\).

Вторая строка \(i\)-го тестового примера содержит строку \(s\), состоящую только из символов > и <.

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

Ответ для каждого тестового примера выведите в отдельной строке.

Для \(i\)-го тестового примера выведите минимальное количество символов, которые нужно удалить из строки \(s\), чтобы она стала хорошей.

Примечание

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

Во втором тестовом примере нам не нужно ничего удалять. Строка > < < хорошая, так как мы можем выполнить следующую последовательность операций: > < < \(\rightarrow\) < < \(\rightarrow\) <.

A. Игра 23

математика реализация *1000

«Игра 23» — вот во что сейчас играет Поликарп. Изначально у него есть целое число \(n\) и его цель преобразовать его в целое число \(m\). За один ход он может умножить \(n\) на \(2\) или умножить \(n\) на \(3\). Он может совершать любое количество ходов.

Выведите количество ходов, сколько необходимо Поликарпу, чтобы получить из числа \(n\) число \(m\). Выведите -1, если это невозможно сделать.

Легко доказать, что любой способ преобразования из числа \(n\) в число \(m\) содержит одинаковое количество ходов (т.е. количество ходов не зависит от способа преобразования).

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

В единственной строке входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n \le m \le 5\cdot10^8\)).

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

Выведите количество ходов, чтобы получить из числа \(n\) число \(m\). Выведите -1, если это невозможно сделать.

Примечание

В первом примере одна из возможных последовательностей ходов: \(120 \rightarrow 240 \rightarrow 720 \rightarrow 1440 \rightarrow 4320 \rightarrow 12960 \rightarrow 25920 \rightarrow 51840.\) Всего совершено \(7\) ходов.

Во втором примере Поликарп не должен совершать ходы. Таким образом, ответ равен \(0\).

В третьем примере из \(48\) невозможно получить \(72\).

B. Максимальный непрерывный отдых

реализация *900

Сутки в Берляндии состоят из \(n\) часов. Поликарп — фанат тайм- менеджмента. Вот почему каждые сутки он использует одно и то же расписание — последовательность \(a_1, a_2, \dots, a_n\) (каждое \(a_i\) равно либо \(0\) либо \(1\)), где \(a_i=0\), если Поликарп работает в \(i\)-й час суток, и \(a_i=1\), если Поликарп отдыхает в \(i\)-й час суток.

Дни идут один за другим бесконечно, Поликарп использует одно и тоже расписание каждые сутки.

Какая длина в часах наибольшего непрерывного периода отдыха Поликарпа? Гарантируется, что в расписании есть хотя бы один рабочий час.

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

Первая строка содержит целое \(n\) (\(1 \le n \le 2\cdot10^5\)) — количество часов в сутках.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 1\)), где \(a_i=0\), если \(i\)-й час суток является рабочим, и \(a_i=1\), если \(i\)-й час является отдыхом. Гарантируется, что \(a_i=0\) хотя бы для одного индекса \(i\).

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

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

Примечание

В первом примере максимальный отдых начинается в последний час суток и заканчивается в первый час следующего дня.

Во втором примере максимальный отдых Поликарпа начинается в \(4\)-й час суток и заканчивается в \(5\)-й час суток.

В третьем примере максимальный отдых идёт с \(3\)-го по \(5\)-й час суток.

В четвертом примере Поликарп вообще не отдыхает.

D. Цветные ботинки

жадные алгоритмы реализация *1500

Заданы \(n\) левых и \(n\) правых ботинок. Каждый ботинок имеет цвет, который задан строчной буквой латинского алфавита или знаком вопроса ('?'). Таким образом, вам заданы две строки \(l\) и \(r\), каждая имеет длину \(n\), где буква \(l_i\) обозначает цвет \(i\)-го левого ботинка, а буква \(r_i\) обозначает цвет \(i\)-го правого ботинка.

Строчная буква латинского алфавита обозначает конкретный цвет ботинка, а знак вопроса — неопределенный цвет. Два конкретных цвета совместимы, если они в точности совпадают. Неопределенный цвет совместим с любым цветом (не важно — конкретным или неопределенным).

Например, следующие пары цветов совместимы: ('f', 'f'), ('?', 'z'), ('a', '?') и ('?', '?'). Следующие пары цветов не совместимы: ('f', 'g') и ('a', 'z').

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

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

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

В первой строке записано целое число \(n\) (\(1 \le n \le 150000\)) — количество ботинок на каждую ногу (то есть количество левых и правых ботинок).

Вторая строка содержит \(l\), её длина равна \(n\). Она содержит лишь строчные буквы латинского алфавита или знаки вопроса, \(i\)-й символ строки соответствует цвету \(i\)-го левого ботинка.

Третья строка содержит \(r\), её длина равна \(n\). Она содержит лишь строчные буквы латинского алфавита или знаки вопроса, \(i\)-й символ строки соответствует цвету \(i\)-го правого ботинка.

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

Выведите \(k\) — максимальное количество пар ботинок вида «левый и правый ботинок» совместимых цветов, которые можно собрать из заданного набора.

Следующие \(k\) строк должны содержать пары целых чисел \(a_j, b_j\) (\(1 \le a_j, b_j \le n\)), где \(j\)-я из этих строк содержит индекс левого ботинка в \(j\)-й паре (число \(a_j\)) и индекс правого ботинка в \(j\)-й паре (число \(b_j\)). Все значения \(a_j\) должны быть различны, все значения \(b_j\) должны быть различны.

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

A. The Doors

реализация *800

Прошло три года и ничего не изменилось. В Лондоне по-прежнему дожди, и мистер Блэк вынужден закрывать все двери своего дома, чтобы его, не дай бог, ночью не затопило. Одним погожим утром мистер Блэк так разнервничался, что открыл сначала одну дверь, потом вторую, потом третью... и так далее, пока не открыл все двери в доме.

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

Отдельно заметим, что каждую дверь мистер Блэк открывал не более одного раза, а в конце все двери оказались открытыми.

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

В первой строке записано целое число \(n\) (\(2 \le n \le 200\,000\)) — количество дверей.

В следующей строке находятся \(n\) целых числа: последовательность, в которой мистер Блек открывал двери. \(i\)-е число равно \(0\) в случае, если \(i\)-я открытая дверь находится в левом выходе, и \(1\), если в правом.

Гарантируется, что в последовательности дверей присутствует хотя бы одна дверь, которая находится в левом выходе. Аналогично, гарантируется, что в последовательности дверей присутствует хотя бы одна дверь, которая находится в правом выходе.

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

Выведите минимальное целое число \(k\) такое, что после открытия первых \(k\) дверей мистер Блэк мог выйти на улицу.

Примечание

В первом примере первые две двери из левого выхода, значит, если открыть только их, в левом выходе будет закрыты ещё две, а в правом одна, и мистер Блэк не сможет выйти наружу.

Если же открыть первые три двери, то все двери из правого выхода будут открыты, и мистер Блэк сможет через него выйти наружу.

Во втором примере, если открыть первые две двери, то в каждом выходе останется ровно по одной закрытой двери.

Если же открыть первые три двери, то мистер Блэк сможет выйти наружу через левый выход.

A. Разнообразные строки

реализация Строки *800

Строка называется разнообразной, если она содержит последовательные (соседние) буквы латинского алфавита и каждая бука встречается ровно один раз. Например, следующие строки являются разнообразными:«fced», «xyz», «r» и «dabcef». Следующие строки не являются разнообразными: «az», «aa», «bad» и «babc». Заметьте, что буквы 'a' и 'z' не являются соседними.

Более формально: рассмотрим позиции всех букв строки в алфавите. Эти позиции должны образовывать непрерывный отрезок, то есть они должны идти одна за другой без каких-либо пропусков. И все буквы в строке должны быть различны (дубликаты недопустимы).

Вам задана последовательность строк. Для каждой строки, если она является разнообразной, выведите «Yes». Иначе выведите «No».

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

Первая строка содержит целое число \(n\) (\(1 \le n \le 100\)), обозначающее количество строк, которые нужно обработать. Следующие \(n\) строк входных данных содержат строки для проверки на разнообразность. Каждая строка состоит только из строчных букв латинского алфавита, длина каждой строки — от \(1\) до \(100\) букв включительно.

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

Выведите \(n\) строк, по одной на каждую строку из входных данных. Строка должна содержать «Yes», если соответствующая строка из входных данных является разнообразной, и «No», если соответствующая строка из входных данных не является разнообразной. Вы можете выводить каждую букву в любом регистре (нижнем или верхнем). Например, «YeS», «no» и «yES» являются корректными ответами.

B. Удаления с меняющейся четностью

жадные алгоритмы реализация сортировки *900

У Поликарпа есть массив \(a\), состоящий из \(n\) целых чисел.

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

Формально:

  • Если сейчас первый ход, он выбирает элемент и удаляет его;
  • Если это второй или любой следующий ход:
    • если последний удаленный элемент был нечетным, Поликарп выбирает любой четный элемент и удаляет его;
    • если последний удаленный элемент был четным, Поликарп выбирает любой нечетный элемент и удаляет его.
  • Если после какого-то хода Поликарп не может сделать ход, игра заканчивается.

Цель Поликарпа — минимизировать сумму неудаленных элементов массива после конца игры. Если Поликарп может удалить массив целиком, тогда сумма неудаленных элементов равна нулю.

Помогите Поликарпу найти это значение.

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

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

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^6\)), где \(a_i\)\(i\)-й элемент \(a\).

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

Выведите одно целое число — минимально возможную сумму неудаленных элементов массива после конца игры.

A. Сортировка Таноса

реализация

Сортировка Таноса — суперзлодейский алгоритм сортировки, работающий следующим образом: если массив не отсортирован, щелкните пальцами*, чтобы уничтожить первую или вторую половину элементов, и повторите процесс.

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

*Требует наличия Перчатки бесконечности.

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

Первая строка входных данных содержит число \(n\) (\(1 \le n \le 16\)) — размер массива. Гаратируется, что \(n\) — степерь двойки.

Вторая строка входных данных содержит \(n\) целых чисел, разделенных пробелами, \(a_i\) (\(1 \le a_i \le 100\)) — элементы массива.

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

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

Примечание

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

Во втором примере входной массив содержит отсортированный подмассив из 4 элементов, но увы, удалять элементы из разных частей массива за один щелчок нельзя. Можно удалять только все элементы из первой или из второй половины массива, поэтому потребуется два щелчка, чтобы получить отсортированный массив длины 2.

В третьем примере массив отсортирован в порядке убывания, и спасти от уничтожения получится только один элемент.

D. Золотой голубь

*особая задача реализация

From "ftying rats" to urban saniwation workers - can synthetic biology tronsform how we think of pigeons?

The upiquitous pigeon has long been viewed as vermin - spleading disease, scavenging through trush, and defecating in populous urban spases. Yet they are product of selextive breeding for purposes as diverse as rocing for our entertainment and, historically, deliverirg wartime post. Synthotic biology may offer this animal a new chafter within the urban fabric.

Piteon d'Or recognihes how these birds ripresent a potentially userul interface for urdan biotechnologies. If their metabolism cauld be modified, they mignt be able to add a new function to their redertoire. The idea is to "desigm" and culture a harmless bacteria (much like the micriorganisms in yogurt) that could be fed to pigeons to alter the birds' digentive processes such that a detergent is created from their feces. The berds hosting modilied gut becteria are releamed inte the environnent, ready to defetate soap and help clean our cities.

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

Первая строка входных данных содержит одно целое число \(n\) (\(5 \le n \le 10\)).

Вторая строка входных данных содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 32\)), разделенных пробелами.

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

Выведите одно целое число.

Примечание

Мы не вычитывали это условие. Вообще.

A. Любите "A"

реализация Строки *800

У Алисы есть строка \(s\). Она очень сильно любит букву «a». Она называет строку хорошей, если в ней строго больше половины символов «a». Например, «aaabb», «axaa» — хорошие строки, а «baca», «awwwa», «» (пустая строка) — нет.

Алиса может стирать некоторые символы в строке \(s\). Она хотела бы узнать длину самой длинной хорошей строки, которая может остаться, если она сотрет несколько (возможно ноль) символов. Поскольку гарантируется, что в строке всегда есть как минимум одна буква «a», то ответ всегда существует.

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

Первая строка содержит строку \(s\) (\(1 \leq |s| \leq 50\)), которая состоит из английских букв нижнего регистра. Гарантируется, что в строке будет как минимум одна буква «a» в \(s\).

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

Выведите одно число — длину самой длинной хорошей строки, которую Алиса может получить, если будет стирать символы из \(s\).

Примечание

В первом примере достаточно стереть любые четыре буквы «x». Ответ будет \(3\), так как это максимальное количество символов, которые могут остаться.

Во втором примере не нужно ничего стирать.

B. Ненавидьте "A"

реализация Строки *1100

У Боба есть строка \(s\), которая состоит из английских букв нижнего регистра. Он определил \(s'\) как строку, которую он получит, удаляя все буквы «a» из строки \(s\) (оставляя все остальные символы в том же порядке). Он сгенерировал новую строку \(t\) путем соединения \(s\) и \(s'\). Другими словами, \(t=s+s'\) (смотрите примеры).

Вам дана строка \(t\). Найдите такую строку \(s\), которую использовал Боб, чтобы сгенерировать строку \(t\). Можно показать, что если ответ существует, то он уникальный.

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

Первая строка содержит строку \(t\) (\(1 \leq |t| \leq 10^5\)), которая состоит из английских букв нижнего регистра.

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

Выведите строку \(s\), которую можно использовать для генерации \(t\). Можно показать, что если ответ существует, то он уникальный. Если такой строки нет, то выведите «:(» (без кавычек, между символами нет пробела).

Примечание

В первом примере \(s = \) «aaaaa», а \(s' = \) «».

Во втором примере нет такой строки \(s\), которая может сгенерировать \(t\).

В третьем примере \(s = \) «ababacac», а \(s' = \) «bbcc», поэтому \(t = s + s' = \) «ababacacbbcc».

E. Холодное тепло

битмаски разделяй и властвуй реализация Структуры данных *2400

Вам дан массив из \(n\) целых чисел \(a_1, a_2, \ldots, a_n\).

Вам нужно выполнить \(q\) операций. В \(i\)-й операции у вас есть символ \(s_i\), который равен либо «<», либо «>», и число \(x_i\).

Вы создаете новый массив \(b\) такой, что \(b_j = -a_j\), если \(a_j s_i x_i\) и \(b_j = a_j\) в противном случае (то есть, если \(s_i\) равен «>», то все знаки в \(a_j > x_i\) поменяются). После выполнения всех этих замен значения чисел в массиве \(a\) меняются на значения в \(b\).

Вы хотите знать, как выглядит ваш массив после выполнения всех операций.

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

Первая строка содержит два целых числа \(n,q\) (\(1 \leq n,q \leq 10^5\)) — количество чисел и количество запросов.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^5 \leq a_i \leq 10^5\)) — числа.

Каждая из следующих \(q\) строк содержит символ и число \(s_i, x_i\). (\(s_i \in \{<, >\}, -10^5 \leq x_i \leq 10^5\)) – запрос.

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

Выведите \(n\) чисел \(c_1, c_2, \ldots, c_n\) — числа массива после выполнений всех операций.

Примечание

В первом примере массив изменяется следующим способом:

  • сначала: \([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]\)
  • \(> 2\): \([-5, -4, -3, -2, -1, 0, 1, 2, -3, -4, -5]\)
  • \(> -4\): \([-5, -4, 3, 2, 1, 0, -1, -2, 3, -4, -5]\)
  • \(< 5\): \([5, 4, -3, -2, -1, 0, 1, 2, -3, 4, 5]\)

B. Три религии

дп реализация Строки *2200

Во время археологических исследований на Ближнем Востоке вы обнаружили следы трёх древних религий: первой религии, второй религии и третьей религии. Вы собрали информацию о развитии каждого из этих верований, и теперь вы думаете, могут ли последователи каждой религии мирно сосуществовать?

Слово Вселенной — это длинное слово, содержащее только строчные английские символы. В каждый момент времени каждое из религиозных верований может быть описано словом, состоящим из строчных английских символов.

Три религии могут сосуществовать мирно, если их описания являются непересекающимеся подпоследовательностями Слова Вселенной. Формально, религии могут сосуществовать мирно если можно покрасить некоторые символы Слова Вселенной в три цвета: \(1\), \(2\), \(3\), что каждый символ покрашен в не более чем один цвет, и описание \(i\)-й религии может быть построено из Слова Вселенной удалением всех символов, которые не покрашены в цвет \(i\).

Однако религии изменяются. Вначале описание каждой религии пусто. Время от времени, в конец описания какой-нибудь из религий добавляется символ или из описания какой-то религии удаляется последний символ. После каждого изменения определите, могут ли три религии сосуществовать мирно.

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

В первой строке записаны два целых числа \(n, q\) (\(1 \leq n \leq 100\,000\), \(1 \leq q \leq 1000\)) — длина Слова Вселенной и количество изменений религий, соответственно. В следующей строке содержится Слово Вселенной — строка длины \(n\), состоящая из строчных букв латинского алфавита.

Каждая из следующих строк содержит описание одного изменения в одном из следующих форматов:

  • + \(i\) \(c\) (\(i \in \{1, 2, 3\}\), \(c \in \{\mathtt{a}, \mathtt{b}, \dots, \mathtt{z}\}\): в конец описания \(i\)-й религии добавляется символ \(c\).
  • - \(i\) (\(i \in \{1, 2, 3\}\)) – из описания \(i\)-й религии удаляется последний символ. Гарантируется, что в этот момент описание этой религии непусто.

Гарантируется, что описания каждой религий в любой момент времени состоит из не более чем \(250\) символов.

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

Выведите \(q\) строк. \(i\)-я из них должна содержать «YES» если религии могут мирно сосуществовать после \(i\)-й эволюции, и «NO» иначе.

Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

В первом примере, после 6 изменений описания религий равны: ad, bc, и ab. Следующая иллюстрация показывает, какими подпоследовательностями Слова Вселенной они являются:

C. Генератор Деревьев™

Деревья реализация Структуры данных *2700

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

Друзья Сова Пачино решили подарить ему Генератор Деревьев™ — мощное устройство, позволяющее создавать деревья по их описанию. Подвешенное дерево из \(n\) вершин может быть описано скобочной последовательностью длины \(2(n - 1)\) следующим образом: рассмотрим любой обход дерева, который начинается и заканчивается в корне, и проходит по каждому ребру ровно два раза — один раз вниз по дереву, другой раз вверх. Затем в порядке пути выпишем «(» (открывающую скобку) если по ребру прошли вниз, и «)» (закрывающую скобку), иначе.

На следующей иллюстрации расположены примеры подвешенных деревьев и их описания:

Сов выписал описание подвешенного дерева из \(n\) вершин. Затем, он изменил его описание \(q\) раз. Каждый раз, когда он выписывал новое описание, он выбирал два разных символа в описании, которое он написал в прошлый раз, менял их местами и записывал полученную строку. Он всегда следил за тем, чтобы каждая записанная строка была описанием подвешенного дерева.

Затем Пачино использовал Генератор Деревьев™ для каждого описания, которое он выписал. Какие диаметры у всех построенных деревьев?

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

В первой строке записано два целых числа \(n, q\) (\(3 \le n \le 100\,000\), \(1 \le q \le 100\,000\)) — количество вершин в дереве и количество изменений описания дерева.

Во второй строке записано описание исходного дерева — строка длины \(2(n-1)\), состоящая из открывающих и закрывающих скобок.

В каждой из следующих \(q\) строк записаны пары целых чисел \(a_i, b_i\) (\(2 \leq a_i, b_i \leq 2n-3\)) обозначающих позиции двух скобок, которые меняются местами. Вы можете предполагать, что описание каждый раз изменится и что по этому описанию можно будет построить дерево.

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

Выведите \(q + 1\) целых чисел — диаметр каждого построенного по описанию дерева, в порядке, в котором эти описания выписывались.

Примечание

На следующей иллюстрации изображены все построенные деревья и их описания из первого примера:

A. Арбитраж акций

жадные алгоритмы реализация *800

Добро пожаловать на фондовую биржу Codeforces! Сейчас мы довольно ограничены в ресурсах, поэтому в настоящее время разрешаем торговать только акциями компании Codeforces Ltd. Мы надеемся, что вы все равно сможете получать прибыль с рынка!

Утром у вас есть \(n\) возможностей купить акции, \(i\)-я из них позволяет купить столько акций, сколько вы захотите, по цене \(s_i\) бурлей за штуку.

Вечером у вас есть \(m\) возможностей продать акции, \(i\)-я из них позволяет продать столько акций, сколько вы хотите, каждую по цене \(b_i\) бурлей за штуку. Вы не можете продать больше акций, чем у вас есть.

Сейчас утро, у вас есть \(r\) бурлей и нет акций.

Какое максимальное количество бурлей у вас может быть после вечера?

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

В первой строке записаны три целых числа \(n, m, r\) (\(1 \leq n \leq 30\), \(1 \leq m \leq 30\), \(1 \leq r \leq 1000\)) — количество возможностей покупки, количество возможностей продажи и количество бурлей, которое у вас сейчас есть, соответственно.

В следующей строке записаны \(n\) целых чисел \(s_1, s_2, \dots, s_n\) (\(1 \leq s_i \leq 1000\)), где \(s_i\) обозначает, что утром можно купить акции за цену \(s_i\) бурлей.

В следующей строке записаны \(m\) целых чисел \(b_1, b_2, \dots, b_m\) (\(1 \leq b_i \leq 1000\)), где \(b_i\) обозначает, что вечером можно продать акции по цене \(b_i\) бурлей.

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

Выведите одное целое число — максимальное количество бурлей, которое вы можете иметь после вечера.

Примечание

В первом примере, утром у вас есть \(11\) бурлей.

Оптимально купить \(5\) акций по цене \(2\) бурля у второго продавца утром, а затем продать их все третьему продавцу по цене \(5\) бурлей вечером. Таким образом, после вечера у вас будет \(26\) бурлей.

Во втором примере оптимально не покупать и не продавать акции.

B. Испытание замощением

жадные алгоритмы реализация *900

Однажды Алиса делала уборку в своем подвале и заметила кое-что любопытное: бесконечное множество одинаковых деревянных фигур! Каждая фигура была сделана из пяти квадратных плиток, одна из была центральной, а остальные четыре примыкали к ней:

Около кусочков лежала большая квадратная доска. Доска разделена на \(n^2\) клеток, расположенных в \(n\) строках и \(n\) столбцах. Некоторые клетки уже заняты плитками, прибитыми к клеткам. Остальные клетки свободны.

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

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

В первой строке записано одно целое число \(n\) (\(3 \leq n \leq 50\)) — размер доски. В следующих \(n\) строках записано описание доски. В \(i\)-й строке (\(1 \leq i \leq n\)) записана строка длины \(n\). Её \(j\)-й символ (\(1 \leq j \leq n\)) равен «.» если клетка в \(i\)-й строке и \(j\)-м столбце свободна, и равен «#» если она занята.

Гарантируется, что доска содержит хотя бы одну свободную ячейку.

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

Выведите «YES» если доска может быть полностью покрыта фигурами Алисы и «NO» иначе. Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

Следующие иллюстрации описывают доски из примера и их замощения, если они существуют:

A. Неко и виноград

жадные алгоритмы математика реализация *800

Однажды Неко нашёл \(n\) сундуков с сокровищами и \(m\) ключей. На \(i\)-м сундуке было написано целое число \(a_i\), а на \(j\)-м ключе написано целое число \(b_j\). Неко знает, что эти сундуки содержат волшебный виноград удивительной магической силы, так что он хочет открыть как можно больше сундуков.

Как оказалось, \(j\)-й ключ может открыть \(i\)-й сундук если (и только если) сумма чисел на ключе и на сундуке является нечётным числом. Иначе говоря, \(a_i + b_j \equiv 1 \pmod{2}\). Один ключ может открыть не более одного сундука, а один сундук нельзя открыть более одного раза.

Выясните максимальное количество сундуков, которое можно открыть.

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

Первая строка содержит целые числа \(n\) и \(m\) (\(1 \leq n, m \leq 10^5\)) — количество сундуков и количество ключей.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — числа, записанные на сундуках.

Третья строка содержит \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) (\(1 \leq b_i \leq 10^9\)) — числа записанные на ключах.

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

Выведите одно число — максимальное количество сундуков, которое вы сможете открыть.

Примечание

В первом примере один из способов открыть \(3\) сундука выглядит следующим образом:

  • Использовать первый ключ чтобы открыть пятый сундук,
  • Использовать третий ключ, чтобы открыть второй сундук,
  • Использовать четвёртый ключ, чтобы открыть первый сундук.

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

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

C. Котик-гурман

математика реализация *1400

У Поликарпа есть котик, который настоящий гурман! В зависимости от дня недели он ест определенный тип еды:

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

Поликарп планирует отправиться в поход и уже собрал рюкзак. В рюкзаке находится:

  • \(a\) порций рыбного корма;
  • \(b\) порций рагу из кролика;
  • \(c\) порций куриных отбивных.

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

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

В первой строке входных данных записаны три целых положительных числа \(a\), \(b\) и \(c\) (\(1 \le a, b, c \le 7\cdot10^8\)) — количество порций рыбного корма, рагу из кролика и куриных отбивных в рюкзаке Поликарпа соответственно.

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

Выведите максимальное количество дней, сколько в походе котик может питаться без пополнения запасов, если Поликарп выбирает день недели для старта похода оптимальным образом.

Примечание

В первом примере поход следует начать в воскресенье. В таком случае, в воскресенье и понедельник котик съест рыбный корм, во вторник — рагу из кролика и в среду — куриную отбивную. Таким образом, после четырёх дней похода все запасы подойдут к концу.

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

В третьем примере поход можно начать в любой день, кроме среды, субботы и воскресенья. В таком случае, за три дня котик съест три разных блюда. Несмотря на то, что после трёх дней похода в рюкзаке останется \(99\) порций рагу из кролика на четвертый день похода котику будет нечего есть.

E. Две команды

реализация сортировки Структуры данных *1800

В ряд выстроены \(n\) студентов. Два тренера набирают две команды — первый тренер выбирает первую команду, а второй тренер выбирает вторую команду.

Умение программировать \(i\)-го студента равно целому числу \(a_i\). Все умения программировать различны и лежат в отрезке от \(1\) до \(n\).

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

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

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

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)) — количество студентов и значение, определяющее отрезок выбранных студентов соответственно.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)), где \(a_i\) равно умению программировать \(i\)-го студента. Гарантируется, что все умения программировать различны.

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

Выведите строку, состоящую из \(n\) символов; \(i\)-й символ должен быть равен 1, если \(i\)-й студент присоединится к первой команде и 2 в ином случае.

Примечание

В первом тестовом примере первый тренер выберет студента на позиции \(3\) и ряд станет пустым (все студенты пойдут в первую команду).

Во втором тестовом примере первый тренер выберет студента на позиции \(4\) и ряд превратится в \([2, 1]\) (студенты с умениями программировать \([3, 4, 5]\) пойдут в первую команду). Затем второй тренер выберет студента на позиции \(1\) и ряд станет пустым (и студенты с умениями программировать \([1, 2]\) пойдут во вторую команду).

В третьем тестовом примере первый тренер выберет студента на позиции \(1\) и ряд превратится в \([1, 3, 5, 4, 6]\) (студенты с умениями программировать \([2, 7]\) пойдут в первую команду). Затем второй тренер выберет студента на позиции \(5\) и ряд превратится в \([1, 3, 5]\) (студенты с умениями программировать \([4, 6]\) пойдут во вторую команду). Затем первый тренер выберет студента на позиции \(3\) и ряд превратится в \([1]\) (студенты с умениями программировать \([3, 5]\) пойдут в первую команду). И затем второй тренер выберет оставшегося студента (и студент с умением программировать \(1\) пойдет во вторую команду).

В четвертом тестовом примере первый тренер выберет студента на позиции \(3\) и ряд превратится в \([2, 1]\) (студенты с умениями программировать \([3, 4, 5]\) пойдут в первую команду). Затем второй тренер выберет студента на позиции \(1\) и ряд станет пустым (и студенты с умениями программировать \([1, 2]\) пойдут во вторую команду).

A. Разверни подстроку

реализация сортировки Строки *1000

Вам дана строка \(s\), состоящая из \(n\) строчных букв латинского алфавита.

Подстрока строки — это некоторый ее непрерывный подотрезок. Например, «acab» — подстрока строки «abacaba» (она начинается в позиции \(3\) и заканчивается в позиции \(6\)), но «aa» и «d» не являются подстроками этой строки. То есть подстрока строки \(s\) с позиции \(l\) по позицию \(r\) — это строка \(s[l; r] = s_l s_{l + 1} \dots s_r\).

Вам нужно выбрать ровно одну подстроку данной строки и развернуть ее (то есть сделать \(s[l; r] = s_r s_{r - 1} \dots s_l\)), чтобы полученная строка оказалась лексикографически меньше исходной. Обратите внимание, что не обязательно минимизировать полученную строку.

Если невозможно таким образом развернуть подстроку, выведите «NO». Иначе выведите «YES» и любую подходящую подстроку.

Строка \(x\) лексикографически меньше строки \(y\), если либо \(x\) является префиксом \(y\) (и при этом \(x \ne y\)), либо существует такое \(i\) (\(1 \le i \le min(|x|, |y|)\)), что \(x_i < y_i\), и для любого \(j\) (\(1 \le j < i\)) \(x_j = y_j\). Здесь \(|a|\) обозначает длину строки \(a\). Лексикографическое сравнение строк реализует оператор < в современных языках программирования.

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

В первой строке входных данных задано одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — длина строки \(s\).

Во второй строке записана \(s\) — строка из \(n\) строчных букв латинского алфавита.

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

Если невозможно развернуть подстроку так, чтобы в итоге получилась строка лексикографически меньше исходной, выведите «NO». Иначе выведите «YES» и два индекса \(l\) и \(r\) (\(1 \le l < r \le n\)), обозначающие начало и конец подстроки, которую вы хотите перевернуть. Если ответов несколько, выведите любой из них.

Примечание

В первом тесте после разворота подстроки получается строка «aacabba».

B. Игра с телефонным номером

жадные алгоритмы игры реализация *1200

Телефонный номер — это последовательность из ровно \(11\) цифр, в которой первая цифра это 8.

Вася и Петя играют в игру. Изначально у них есть строка \(s\) длины \(n\) (\(n\) нечетно), состоящая из десятичных цифр. Игроки ходят по очереди, первым ходит Вася. Во время своего хода игрок должен удалить символ из строки по своему выбору. Например, строка 1121 после хода игрока может превратиться в строки 112, 111 или 121. Игра заканчивается, когда длина строки \(s\) становится равной 11. Если получившаяся строка является телефонным номером, то выиграл Вася, иначе — Петя.

Вам нужно определить, есть ли у Васи выигрышная стратегия (т. е. может ли победить Вася вне зависимости от того, как будет действовать Петя).

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

Первая строка содержит число \(n\) (\(13 \le n < 10^5\), \(n\) нечетно) — длина строки \(s\).

Вторая строка содержит саму строку \(s\) (\(|s| = n\)), состоящую только из десятичных цифр.

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

Если у Васи есть стратегия, гарантирующая ему победу, выведите YES.

Иначе выведите NO.

Примечание

В первом тестовом примере Васе нужно удалить второй символ строки. В этом случае Петя не может удалить символ из оставшейся строки 880011223344 так, чтобы она стала не телефонным номером.

Во втором примере после хода Васи Пете нужно удалить единственную цифру 8. Таким образом, результирующая строка не сможет стать телефонным номером, поскольку в ней вообще нет цифры 8.

B. Противные пары

жадные алгоритмы поиск в глубину и подобное реализация сортировки Строки *1800

Задана строка, состоящая из строчных латинских букв.

Пара соседних букв в строке считается противной, если данные буквы так же соседние в алфавите. Например, строка «abaca» содержит противные пары на позициях \((1, 2)\) — «'ab» и \((2, 3)\) — «ba». Буквы 'a' и 'z' не считаются соседними в алфавите.

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

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

Также требуется ответить на \(T\) независимых запросов.

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

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

В каждой из следующих \(T\) строк записана строка \(s\) \((1 \le |s| \le 100)\) — очередной запрос. Гарантируется, что она содержит только строчные латинские буквы.

Обратите внимание, во взломах можно использовать только \(T = 1\).

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

Выведите \(T\) строк. В \(i\)-й строке должен быть записан ответ на \(i\)-й запрос.

Если ответ на \(i\)-й запрос существует, то выведите строку с новым порядком букв такую, что она не содержит противных пар. Выбирая новый порядок, помните, что нельзя добавлять в строку новые буквы или удалять уже имеющиеся. Также можно сохранить начальный порядок.

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

Если ответа на запрос нет, выведите «No answer».

Примечание

В первом примере ответ «bdac» также корректен.

Второй пример показывает, что только соседние буквы в алфавите неприемлемы. Одинаковые подходят.

В третьем примере множество правильных ответов.

G. Оптимизатор

графы жадные алгоритмы реализация хэши *2700

Рассмотрим программу, написанную на каком-то странном языке программирования. Переменные в этом языке имеют идентификаторы длиной от \(1\) до \(4\) символов, и каждый символ — это либо латинская буква (строчная или прописная), либо цифра. Дополнительное условие: первый символ в идентификаторе не может быть цифрой.

В программе используются четыре типа операций, обозначаемых символами: $, ^, # и &.

Каждая строка программы записана в одном из следующих форматов:

  • <lvalue>=<rvalue>, где <lvalue> и <rvalue> — корректные идентификаторы переменных;
  • <lvalue>=<arg1><op><arg2>, где <lvalue>, <arg1> и <arg2> — корректные идентификаторы переменных, а <op> — символ операции.

Программа исполняется последовательно, строка за строкой, и результат исполнения записан в переменной res. Если res в ходе программы никогда не переприсваивается, результат — это значение res до исполнения программы.

Две программы называются эквивалентными, если вне зависимости от смысла операций $, ^, # и & (но, очевидно, одна и та же операция с одним и тем же набором аргументов должна давать один и тот же результат) и значений переменных до запуска программы значение res после исполнения первой программы равно значению res после исполнения второй программы (программы исполняются независимо).

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

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

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

Затем следуют \(n\) строк — сама программа. Каждая строка задается в формате, описанном в условии, и не содержит пробелов.

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

В первой строке выведите \(k\) — минимальное количество строк в эквивалентной программе.

Затем выведите \(k\) строк без пробелов — эквивалентную программу ровно из \(k\) строк в том же формате, который описан в условии.

A. Достижимые числа

реализация *1100

Давайте объявим функцию \(f(x)\) следующим образом: добавим \(1\) к \(x\), затем, пока у результата последняя цифра является нулем, будем удалять этот ноль. Например,

  • \(f(599) = 6\): \(599 + 1 = 600 \rightarrow 60 \rightarrow 6\);
  • \(f(7) = 8\): \(7 + 1 = 8\);
  • \(f(9) = 1\): \(9 + 1 = 10 \rightarrow 1\);
  • \(f(10099) = 101\): \(10099 + 1 = 10100 \rightarrow 1010 \rightarrow 101\).

Назовем число \(y\) достижимым из числа \(x\), если мы можем применить функцию \(f\) к \(x\) несколько (возможно, ноль) раз, и в результате мы получим \(y\). Например, число \(102\) достижимо из числа \(10098\): \(f(f(f(10098))) = f(f(10099)) = f(101) = 102\); и любое число является достижимым из самого себя.

Вам дано число \(n\); посчитайте количество различных чисел, достижимых из \(n\).

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

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

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

Выведите одно целое число — количество чисел, достижимых из \(n\).

Примечание

Следующие числа достижимы из \(1098\):

\(1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1098, 1099\).

A. Праздник и конфеты

Бинарный поиск жадные алгоритмы Конструктив математика реализация сортировки *1500

На праздник пришло \(n\) мальчиков и \(m\) девочек. Каждый мальчик подарил каждой девочке некоторое целое количество конфет (возможно ноль). Пронумеруем мальчиков целыми числами от \(1\) до \(n\) и девочек целыми числами от \(1\) до \(m\). Для всех \(1 \leq i \leq n\) минимальное количество конфет, которое подарил мальчик с номером \(i\) какой-то девочке равно \(b_i\) и для всех \(1 \leq j \leq m\) максимальное количество конфет, которое получила девочка с номером \(j\) от какого-то мальчика равно \(g_j\).

Более формально, Обозначим за \(a_{i,j}\) количество конфет, которое \(i\)-й мальчик подарил \(j\)-й девочке. Тогда \(b_i\) равно минимуму среди значений \(a_{i,1}, a_{i,2}, \ldots, a_{i,m}\) И \(g_j\) равно максимуму среди значений \(b_{1,j}, b_{2,j}, \ldots, b_{n,j}\).

Вам стало интересно, какое минимальное суммарное количество конфет могли подарить мальчики, то есть вы хотите минимизировать сумму \(a_{i,j}\) по всем таким \((i,j)\), что \(1 \leq i \leq n\) и \(1 \leq j \leq m\). По числам \(b_1, \ldots, b_n\) и \(g_1, \ldots, g_m\) определите это число.

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

В первой строке находятся два целых числа \(n\) и \(m\), разделенные пробелом — количество мальчиков и девочек, соответственно (\(2 \leq n, m \leq 100\,000\)). Во второй строке находятся \(n\) целых чисел \(b_1, \ldots, b_n\), разделенных пробелами — \(b_i\) равно минимальному количеству конфет, подаренных \(i\)-м мальчиком какой-то девочке (\(0 \leq b_i \leq 10^8\)). В третьей строке находятся \(m\) целых чисел \(g_1, \ldots, g_m\), разделенных пробелами — \(g_j\) равно максимальному количеству конфет, полученному \(j\)-й девочкой от какого-то мальчика (\(0 \leq g_j \leq 10^8\)).

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

Если не могло быть такой ситуации выведите \(-1\). Иначе выведите минимальное суммарное количество конфет, которое могли подарить мальчики и при этом все условия были бы выполнены.

Примечание

В первом тесте минимальное суммарное количество конфет, которое могли подарить мальчики равно \(12\). Такое могло быть, например, если первый мальчик подарит \(1\) и \(4\) конфеты, второй мальчик подарит \(3\) и \(2\) конфеты и третий мальчик подарит \(1\) и \(1\) конфету первой и второй девочке, соответственно. Легко видеть, что все условия выполнены и суммарно будет подарено \(12\) конфет.

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

В третьем тесте минимальное суммарное количество конфет, которое могли подарить мальчики равно \(4\). Такое могло быть, например, если первый мальчик подарит \(1\), \(1\), \(2\) конфет первой, второй и третьей девочке, соответственно, а второй мальчик не подарит никому конфет. Легко видеть, что все условия выполнены и суммарно будет подарено \(4\) конфеты.

A. Куча из камней

математика реализация *800

У Васи была куча, состоящая из нескольких камней. Он \(n\) раз либо убирал один камень из кучи, либо добавлял один камень в кучу. Куча до применения любой операции удаления всегда была непустой.

Вам даны \(n\) операций, которые сделал Вася. Найдите минимальное количество камней, которое может оказаться в конце в куче, после применения всех операций.

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

В первой строке находится одно целое число \(n\) — количество операций, сделанных Васей (\(1 \leq n \leq 100\)).

В следующей строке находится строка \(s\), состоящая из \(n\) символов, равных "-" (без кавычек) или "+" (без кавычек). Если Вася убирал камень на \(i\) операции, то \(s_i\) равно "-" (без кавычек), а если добавлял, то \(s_i\) равно "+" (без кавычек).

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

Выведите одно целое число, равное минимальному количеству камней, которое могло остаться в куче, после применения Васей \(n\) операций.

Примечание

В первом тесте, если у Васи изначально в куче было \(3\) камня, то после применения операций станет \(0\) камней. Меньше камней оказаться не может, поэтому ответ \(0\). Также заметьте, что у Васи изначально не могло быть меньше \(3\)-x камней, так как иначе он не смог бы убрать камень из пустой кучи.

Во втором тесте, если у Васи изначально в куче было \(0\) камней, то после применения операций станет \(4\) камня. Меньше камней оказаться не может, потому что за \(4\) операции в куче становится на \(4\) камня больше. Поэтому ответ \(4\).

В третьем тесте, если у Васи изначально был \(1\) камень, то после применения операций останется \(1\) камень. Можно понять, что меньше камней быть не может.

В четвертом тесте, если у Васи изначально было \(0\) камней, то после применения операций станет \(3\) камня.

B. Коэффициент расширения массива

математика реализация *1300

Массив неотрицательных целых чисел \(a_1, a_2, \ldots, a_n\) будем называть \(k\)-расширением, для некоторого целого неотрицательного \(k\), если для всех возможных пар индексов \(1 \leq i, j \leq n\) выполнено неравенство \(k \cdot |i - j| \leq min(a_i, a_j)\). Коэффициентом расширения массива \(a\) будем называть такое максимальное целое число \(k\), что массив \(a\) является \(k\)-расширением. Любой массив является 0-расширением, так что коэффициент расширения всегда существует.

Вам дан массив неотрицательных целых чисел \(a_1, a_2, \ldots, a_n\). Найдите его коэффициент расширения.

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

В первой строке задано одно целое число \(n\) — количество элементов массива \(a\) (\(2 \leq n \leq 300\,000\)). В следующей строке находится \(n\) неотрицательных целых чисел \(a_1, a_2, \ldots, a_n\), разделенных пробелами (\(0 \leq a_i \leq 10^9\)).

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

Выведите одно целое число — коэффициент расширения массива \(a_1, a_2, \ldots, a_n\).

Примечание

В первом тесте коэффициент расширения массива \([6, 4, 5, 5]\) равен \(1\), так как \(|i-j| \leq min(a_i, a_j)\), так как все числа \(a_i \geq 3\). С другой стороны, этот массив не является \(2\)-расширением, так как неверно, что \(6 = 2 \cdot |1 - 4| \leq min(a_1, a_4) = 5\).

Во втором тесте коэффициент расширения массива \([0, 1, 2]\) равен \(0\), так как этот массив не является \(1\)-расширением, но является \(0\)-расширением.

A. Трамвай

реализация *800

В Линейном Королевстве всего один трамвайный маршрут. На нем n остановок, пронумерованных от 1 до n в порядке следования трамвая. На i-ой остановке ai человек выходит из трамвая, а bi человек заходит в трамвай. Трамвай прибывает на первую остановку пустым. Также, когда трамвай прибывает на последнюю остановку, все пассажиры выходят, и трамвай уезжает пустым.

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

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

В первой строке записано целое число n (2 ≤ n ≤ 1000) — количество остановок трамвая.

Далее следует n строк, в каждой — по два целых числа ai и bi (0 ≤ ai, bi ≤ 1000) — количество пассажиров, которые выходят из трамвая на i-ой остановке, и количество пассажиров, которые заходят в трамвай на i-ой остановке. Остановки перечислены в том же порядке, в котором их проезжает трамвай.

  • Количество пассажиров, которые выходят на остановке, не превосходит общего количества пассажиров в трамвае в момент, когда он подъезжает к этой остановке. Более формально, . Это, в частности, означает, что a1 = 0
  • На последней остановке все пассажиры выходят из трамвая. Более формально,
  • Никто не заходит в трамвай на последней остановке. То есть, bn = 0
Выходные данные

Выведите одно целое число — минимальную возможную вместимость трамвая. Допускается, что вместимость может быть равна нулю.

Примечание

В первом примере достаточная вместимость — 6:

  • Когда трамвай подъезжает к первой остановке, внутри находится 0 пассажиров. На остановке заходят 3 пассажира, то есть трамвай уезжает с 3 пассажирами внутри.
  • На второй остановке выходят 2 пассажира (внутри остается 1). Затем заходят 5 пассажиров. Так, трамвай уезжает с 6 пассажирами.
  • На третьей остановке выходят 4 пассажира (внутри остается 2). Затем заходят 2 пассажира. Так, трамвай уезжает с 4 пассажирами.
  • Наконец, все пассажиры выходят на последней остановке. Теперь трамвай пуст, что соответствует ограничениям.

Так как количество пассажиров в трамвае в любой момент времени не превосходит 6, вместимость 6 — достаточна. Более того, вместимость не может быть меньше 6. Значит, 6 — правильный ответ.

B. Поросята и волки

жадные алгоритмы реализация *1100

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

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

Поросята и волки живут мирно уже несколько лет. Но сегодня волки проголодались. Каждый волк выбирает одного соседа-поросенка (если такие имеются) и съедает его. Этот процесс не повторяется, то есть в итоге каждый волк может съесть не более одного поросенка. Как только волк съедает поросенка, этот поросенок исчезает, и никакой другой волк не может его съесть повторно.

Какое наибольшее количество поросят могут съесть волки?

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

Первая строка содержит целые числа n и m (1 ≤ n, m ≤ 10) — количество строк и столбцов в клетчатом поле, соответственно. Далее следует n строк по m символов в каждой — описание поля. «.» обозначает пустую клетку. «P» обозначает клетку, содержащую поросенка. «W» обозначает клетку, содержащую волка.

Гарантируется, что каждый поросенок имеет не более одного соседа-волка.

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

Выведите одно целое число — максимальное число поросят, которое могут съесть волки.

Примечание

В первом примере волки съедают двух поросят. Один из возможных способов это сделать:

A. Опять ограничения

реализация *800

Вы планируете строить дома на улице. На улице есть \(n\) мест, где вы можете построить дома. Эти места пронумерованы слева направо от \(1\) до \(n\). В каждом месте вы можете построить дом с целочисленной высотой от \(0\) до \(h\).

В каждом месте, если дом имеет высоту \(a\), вы получите от него прибыль в размере \(a^2\) долларов.

Город имеет \(m\) ограничений. В соответствии с \(i\)-м ограничением, самый высокий дом от \(l_i\) до \(r_i\) (включительно) должен иметь высоту не более \(x_i\).

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

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

Первая строка содержит три целых числа \(n\), \(h\) и \(m\) (\(1 \leq n,h,m \leq 50\)) — количество мест, максимальная высота и количество ограничений.

Каждая из следующих \(m\) содержит три целых числа \(l_i\), \(r_i\) и \(x_i\) (\(1 \leq l_i \leq r_i \leq n\), \(0 \leq x_i \leq h\)) — левая и правая граница (включительно) \(i\)-го ограничения и максимальная возможная высота на этом отрезке.

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

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

Примечание

В первом примере можно построить \(3\) дома, максимальная высота которых — \(3\), а также есть \(3\) ограничения. Первое ограничение говорит, что самый высокий дом между \(1\) и \(1\) должен иметь высоту не более \(1\). Второе ограничение говорит, что самый высокий дом между \(2\) и \(2\) должен иметь высоту не более \(3\). Третье ограничение говорит, что самый высокий дом между \(3\) и \(3\) должен иметь высоту не более \(2\).

В этом случае оптимально строить дома высотой \([1, 3, 2]\). Это вписывается во все ограничения. Общая прибыль в этом случае составляет \(1^2 + 3^2 + 2^2 = 14\).

Во втором примере можно построить \(4\) дома, максимальная высота которых — \(10\), а также есть \(2\) ограничения. Первое ограничение говорит, что самый высокий дом от \(2\) до \(3\) должен иметь высоту не более \(8\). Второе ограничение говорит, что самый высокий дом от \(3\) до \(4\) должен иметь высоту не более \(7\).

В этом случае оптимально строить дома высотой \([10, 8, 7, 7]\). Мы получаем прибыль в размере \(10^2+8^2+7^2+7^2 = 262\). Обратите внимание, что есть два ограничения на дом \(3\), и оба они должны выполняться. Кроме того, обратите внимание, что хотя нет никаких явных ограничений на дом \(1\), мы все равно должны ограничить его высоту не более \(10\) (\(h=10\)).

B1. Кошачья вечеринка (упрощённая версия)

реализация Структуры данных *1500

Эта задача такая же как и следующая, но с меньшими ограничениями.

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

В каждый из \(n\) дней, начиная с дня, в который Широ переехала в новый дом, к ней будет в гости ровно одна кошка. Кошка приходящая в \(i\)-й день носит ленточку цвета \(u_i\). Широ хочет узнать наибольшее число \(x\), такое что если рассмотреть префикс из первых \(x\) дней, то можно убрать ровно один день из них, что каждый цвет ленточек, который встречался среди оставшихся \(x - 1\) дней встречается одинаковое число раз.

Например, рассмотрим следующую последовательность \(u_i\): \([2, 2, 1, 1, 5, 4, 4, 5]\). Тогда \(x = 7\) образует подходящий префикс, так как если удалить самый левый день с \(u_i = 5\), то получится что среди оставшихся \(x - 1\) дней каждый цвет встречается два раза. Обратите внимание, что \(x = 8\) не образует подходящий префикс, так как нужно убрать ровно один день.

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

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — количество дней.

Вторая строка содержит \(n\) целых чисел \(u_1, u_2, \ldots, u_n\) (\(1 \leq u_i \leq 10\)) — цвета ленточек у кошек-гостей.

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

Выведите одно целое число \(x\) — максимальное количество дней в подходящем префиксе.

Примечание

В первом примере можно рассмотреть префикс из \(13\) дней, так как если убрать последний день из этого префиса, то все оставшиеся цвета \(1\), \(2\), \(3\), и \(4\) будут встречаться одинаковое число раз (\(3\) раза). Обратите внимание, что подходит также префикс из \(10\) дней (нужно удалить \(10\)-й день), однако требуется найти наибольший подходящий префикс.

В четвёртом примере, если рассмотреть префикс из первых \(6\) дней, то можно убрать третий день, тогда останутся цвета \(1\), \(2\), \(3\), \(4\) и \(5\), встречающиеся по одному разу.

B2. Кошачья вечеринка (усложнённая версия)

реализация Структуры данных *1600

Эта задача такая же как и предыдущая, но с большими ограничениями.

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

В каждый из \(n\) дней, начиная с дня, в который Широ переехала в новый дом, к ней будет в гости ровно одна кошка. Кошка приходящая в \(i\)-й день носит ленточку цвета \(u_i\). Широ хочет узнать наибольшее число \(x\), такое что если рассмотреть префикс из первых \(x\) дней, то можно убрать ровно один день из них, что каждый цвет ленточек, который встречался среди оставшихся \(x - 1\) дней встречается одинаковое число раз.

Например, рассмотрим следующую последовательность \(u_i\): \([2, 2, 1, 1, 5, 4, 4, 5]\). Тогда \(x = 7\) образует подходящий префикс, так как если удалить самый левый день с \(u_i = 5\), то получится что среди оставшихся \(x - 1\) дней каждый цвет встречается два раза. Обратите внимание, что \(x = 8\) не образует подходящий префикс, так как нужно убрать ровно один день.

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

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

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — количество дней.

Вторая строка содержит \(n\) целых чисел \(u_1, u_2, \ldots, u_n\) (\(1 \leq u_i \leq 10^5\)) — цвета ленточек у кошек-гостей.

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

Выведите одно целое число \(x\) — максимальное количество дней в подходящем префиксе.

Примечание

В первом примере можно рассмотреть префикс из \(13\) дней, так как если убрать последний день из этого префиса, то все оставшиеся цвета \(1\), \(2\), \(3\), и \(4\) будут встречаться одинаковое число раз (\(3\) раза). Обратите внимание, что подходит также префикс из \(10\) дней (нужно удалить \(10\)-й день), однако требуется найти наибольший подходящий префикс.

В четвёртом примере, если рассмотреть префикс из первых \(6\) дней, то можно убрать третий день, тогда останутся цвета \(1\), \(2\), \(3\), \(4\) и \(5\), встречающиеся по одному разу.

C2. Передача энергии (усложнённая версия)

геометрия математика реализация Структуры данных *1900

Эта задача такая же как и предыдущая, но с большими ограничениями.

Воскресным утром, три друга Селена, Широ и Кэти решили отправится на прогулку к ближайшей электростанции (не повторяйте этого дома). Когда они туда пришли, кошки впечатлились огромной системой передачи энергии, состоящей из множества дымоходов, электрических полюсов и проводов. Будучи кошками, они сочли эти вещи просто гигантскими.

На входе на станцию висит карта, описывающая систему проводов электростанции. Селена лучше всего из друзей разбирается в математике. Он решил нарисовать карту на декартовой плоскости. Теперь каждый полюс это точка по координатам \((x_i, y_i)\). Так как все полюса различны, то различны и точки, представляющие их. Также каждые два полюса соединены друг с другом проводом, представляющим из себя бесконечную в обе стороны прямую на плоскости. В случае если более двух полюсов лежат на одной прямой, то они все соединены одним общим проводом.

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

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 1000\)) — количество электрических полюсов.

Каждая из \(n\) следующих строк содержит два целых числа \(x_i\) и \(y_i\) (\(-10^4 \le x_i, y_i \le 10^4\)) — координаты полюсов.

Гарантируется что все эти \(n\) точек различны.

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

Выведите одно целое число — количество пересекающихся пар проводов.

Примечание

В первом примере:

Во втором примере:

Обратите внимание, что три полюса \((0, 0)\), \((0, 2)\) и \((0, 4)\) соединены одним проводом.

В третьем примере:

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

A. Остаток

математика реализация *1100

Вам задано длинное десятичное число, состоящее из \(n\) цифр. Гарантируется, что в нем отсутствуют лидирующие нули. Каждая цифра этого числа равна либо 0, либо 1.

Вы можете совершать операции над этим числом некоторое (возможно, нулевое) количество раз. Каждая операция позволяет вам изменить любую цифру этого числа; вы можете изменить 0 на 1 или 1 на 0. Возможно, что после какой-то операции вы получите число с лидирующими нулями, но это не важно для этой задачи.

Вам также задано два целых числа \(0 \le y < x < n\). Ваша задача — посчитать минимальное количество операций, которое вам необходимо совершить, чтобы получить число, которое имеет остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

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

Первая строка входных данных содержит три целых числа \(n, x, y\) (\(0 \le y < x < n \le 2 \cdot 10^5\)) — длина числа и числа \(x\) и \(y\), соответственно.

Вторая строка входных данных содержит одно десятичное число, состоящее из \(n\) цифр, каждая цифра этого числа равна либо 0, либо 1. Гарантируется, что первая цифра числа равна 1.

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

Выведите одно целое число — минимальное количество операций, которое необходимо совершить, чтобы получить число, имеющее остаток \(10^y\) по модулю \(10^x\). Иными словами, полученное число должно иметь остаток \(10^y\) при делении на \(10^x\).

Примечание

В первом тестовом примере число будет равно \(11010100100\) после совершения одной операции. Оно имеет остаток \(100\) по модулю \(100000\).

Во втором тестовом примере число будет равно \(11010100010\) после применения трех операций. Оно имеет остаток \(10\) по модулю \(100000\).

F2. Микротранзакции (усложненная версия)

Бинарный поиск жадные алгоритмы реализация *2000

Единственное отличие между легкой и сложной версиями — ограничечния.

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

Каждый день (с утра) Иван зарабатывает ровно один бурль.

Всего в игре есть \(n\) типов микротранзакций. Каждая микротранзакция обычно стоит \(2\) бурля и \(1\) бурль, если она на распродаже. Иван хочет использовать ровно \(k_i\) микротранзакций \(i\)-го типа (он покупает микротранзакции вечером).

Иван может использовать любое (возможно, нулевое) количество микротранзакций любых типов в течение любого дня (конечно, если ему хватает денег, чтобы это сделать). Если микротранзакция, которую он хочет использовать, находится на распродаже, то он может использовать ее за \(1\) бурль, иначе он может использовать ее за \(2\) бурля.

Также в игровом магазине есть \(m\) специальных предложений. \(j\)-е предложение \((d_j, t_j)\) означает, что микротранзакции \(t_j\)-го типа находятся на распродаже в течение \(d_j\)-го дня.

Иван хочет использовать все микротранзакции как можно раньше. Ваша задача — найти минимальный номер дня, когда он сможет использовать все микротранзакции, которые он хочет, и действительно сможет начать играть.

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

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество типов микротранзакций и количество специальных предложений в игровом магазине.

Вторая строка входных данных содержит \(n\) целых чисел \(k_1, k_2, \dots, k_n\) (\(0 \le k_i \le 2 \cdot 10^5\)), где \(k_i\) означает количество копий микротранзакции \(i\)-го типа, которое Иван хочет использовать. Гарантируется, что сумма всех \(k_i\) не меньше \(1\) и не больше \(2 \cdot 10^5\).

Следующие \(m\) строк содержат специальные предложения. \(j\)-я из этих строк содержит \(j\)-е специальное предложение. Оно задано в виде пары целых чисел \((d_j, t_j)\) (\(1 \le d_j \le 2 \cdot 10^5, 1 \le t_j \le n\)) и означает, что микротранзакции \(t_j\)-го типа находятся на распродаже в течение \(d_j\)-го дня.

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

Выведите одно целое число — минимальный номер дня, когда Иван сможет использовать все микротранзакции, которые он хочет, и действительно сможет начать играть.

D. Анаграммные пути

Деревья дп реализация *3000

У жабы Ильи есть подвешенное двоичное дерево с корнем в вершине \(1\). Деревом называется связный граф без циклов. Дерево называется подвешенным, если в нем выделена одна вершина, эта вершина называется корнем. Вершина \(u\) является сыном вершины \(v\), если \(u\) и \(v\) соединены ребром, и \(v\) ближе к корню, чем \(u\). Листом называется вершина, которая не является корнем, и у которой нет детей.

В дереве Ильи у каждой вершины не более двух детей, и на каждом ребре записан символ. Каждый символ может быть строчной буквой латинского алфавита или знаком вопроса '?'.

Илья немного изменит дерево \(q\) раз. Каждое обновление заменит один символ на ровно одном ребре. После каждого обновления Илья должен проверить, является ли дерево анаграммным и если это так, то еще и найти его анаграмность для каждой буквы. Это непросто объяснить, но мы попробуем.

Для начала, строка \(a\) является анаграммой строки \(b\), если возможно переставить буквы строки \(a\) (не меняя сами буквы) так, что она станет равной строке \(b\). Например, строка «fortyfive» является анаграммой строки «overfifty», но строка «aabb» — не анаграмма строки «bbba».

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

Если дерево анаграммное, тогда его анаграмность для буквы \(c\) равна максимальному возможному количеству букв \(c\) в строке, ассоциированной с некоторым листом, после корректной замены всех знаков вопроса.

После каждого обновления проверьте, является ли дерево анаграммным, и если является, то найдите \(\sum{f(c) \cdot ind(c)}\) по всем буквам \(c\), где \(f(c)\) — это анаграмность для буквы \(c\), а \(ind(x)\) — порядок буквы в алфавите (\(ind(\)"a"\() = 1\), \(ind(\)"b"\() = 2\), ..., \(ind(\)"z"\() = 26\)).

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

В первой строке записано два целых числа \(n\) и \(q\) (\(2 \leq n \leq 150\,000\), \(1 \leq q \leq 150\,000\)) — количество вершин в дереве и количество запросов.

В следующих \(n-1\) строках записано по одному целому числу и по одному символу. В \(i\)-й из них записано целое число \(p_i\) и символ \(c_i\) (\(1 \leq p_i \leq i\), \(c_i\) это строчный символ латинского алфавита или знак вопроса '?'), описывающих ребро между вершинами \(p_i\) и \(i+1\) с символом \(c_i\), записанным на нем.

Корень этого дерева это вершина \(1\), и у каждой вершины есть не более двух детей.

В следующих \(q\) строк записано по одному целому числу и по одному символу, описывающих запросы. В \(i\)-й из них записано по два целых числа \(v\) и \(c\) (\(2 \leq v \leq n\), \(c\) это строчный символ латинского алфавита или знак вопроса '?'), описывающих, что обновленный символ на ребре между вершинами \(p_{v-1}\) и \(v\) равен \(c\). Обновленный символ может быть равен символу, записанному на этом ребре ранее.

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

Выведите \(q\) строк. В \(i\)-й из них выведите «Fou» если дерево не анаграммное после первых \(i\) обновлений.

Иначе выведите «Shi» и \(\sum{f(c) \cdot ind(c)}\) по всем буквам \(c\).

Примечание

В первом примере после первого запроса, для каждого символа, вы можете поставить все ребра равными этому символу, и вы получите \(1\) такой символ на каждом пути, так что ответ равен \(1 \cdot (1+2+\ldots+26) = 351\).

В первом примере после второго запроса, вы знаете, что все пути должны быть анаграммой «a», так что все пути должны быть равны «a», так что ответ равен \(1 \cdot 1 = 1\).

В первом примере после третьего запроса, у вас есть два пути со строками «a» и «b», но эти строки не анаграммы, так что ответ «Fou».

В первом примере после четвертого запроса, вы знаете, что все пути должны быть «b», так что ответ равен \(1 \cdot 2 = 2\).

Во втором примере после первого запроса, вы знаете, что \(f(\)'a'\() = 2\) и \(f(c) = 1\) для всех остальных символов, так что ответ равен \(1 \cdot (2 + 3 + \ldots + 26) + 2 = 352\).

Во втором примере после второго запроса, вы знаете, что на каждом пути должно быть одно 'a' и одно 'b', так что ответ равен \(1 \cdot 1 + 1 \cdot 2 = 3\).

A. Кольцевое метро

математика реализация *900

На кольцевой линии метро Рофланполиса есть \(n\) станций.

В этом метро есть два параллельных маршрута. Первый посещает станции в порядке \(1 \to 2 \to \ldots \to n \to 1 \to 2 \to \ldots\) (следующая остановка после станции \(x\) равна \((x+1)\), если \(x < n\), и \(1\) иначе). Второй маршрут посещает станции в порядке \(n \to (n-1) \to \ldots \to 1 \to n \to (n-1) \to \ldots\) (следующая остановка после станции \(x\) равна \((x-1)\), если \(x>1\), и \(n\) иначе). Все поезда отправляются со своих станций одновременно, путь до следующей станции занимает ровно \(1\) минуту.

Две жабы живут в этом городе, их зовут Дэниел и Влад.

Дэниел в данный момент находится в поезде первого маршрута на станции \(a\) и выйдет из метро, когда его поезд прибудет на станцию \(x\).

По удивительному совпадению, Влад в данный момент находится в поезде второго маршрута на станции \(b\) и выйдет из метро, когда его поезд прибудет на станцию \(y\).

Также оказалось, что все числа \(a,x,b,y\) различны.

Жаба Илья просит вас проверить, будут ли когда-либо Дэниел и Влад одновременно на одной станции во время их поездки. Иначе говоря, проверьте, остановятся ли когда-либо их поезда на одной и той же станции в один и тот же момент времени. Обратите внимание, что моменты, когда Дэниел или Влад заходят или выходят из метро, тоже необходимо учитывать.

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

В первой строке записаны пять целых чисел, разделенных пробелами: \(n\), \(a\), \(x\), \(b\), \(y\) (\(4 \leq n \leq 100\), \(1 \leq a, x, b, y \leq n\), все числа среди \(a\), \(x\), \(b\), \(y\) различны) — количество станций в Рофланполисе, начальная станция Дэниеля, конечная станция Дэниеля, начальная станция Влада и конечная станция Влада, соответственно.

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

Выведите «YES», если Дэниел и Влад когда-нибудь окажутся одновременно на одной станции во время поездки, и «NO» иначе. Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

В первом примере исходно Дэниел и Влад находятся на станциях \((1, 3)\). Через одну минуту они будут на станциях \((2, 2)\). Они находятся на одной станции в этот момент. Обратите внимание, что сразу после этого Влад покинет метро.

Рассмотрим второй пример. Будем отмечать станции, на которых находятся Влад и Дэниел. Они равны:

  • исходно \((2, 9)\),
  • спустя \(1\) минуту \((3, 8)\),
  • спустя \(2\) минуты \((4, 7)\),
  • спустя \(3\) минуты \((5, 6)\),
  • спустя \(4\) минуты \((6, 5)\),
  • спустя \(5\) минут \((7, 4)\),
  • спустя \(6\) минут \((8, 3)\),
  • спустя \(7\) минут \((9, 2)\),
  • спустя \(8\) минут \((10, 1)\),
  • спустя \(9\) минут \((1, 10)\).

После этого они оба покинут метро, так как они оба находятся на их конечных станциях, так что не существует момента, когда они оба были на одной станции.

B. Пары

графы реализация *1500

У жабы Ивана есть \(m\) пар целых чисел, каждое число в них находится в пределах от \(1\) до \(n\) включительно. Это пары \((a_1, b_1), (a_2, b_2), \ldots, (a_m, b_m)\).

Он просит вас проверить, существует ли два таких целых числа \(x\) и \(y\) (\(1 \leq x < y \leq n\)), что в каждой данной паре хотя бы одно число равно \(x\) или \(y\).

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(2 \leq n \leq 300\,000\), \(1 \leq m \leq 300\,000\)) — максимально возможное значение чисел в парах и количество данных пар.

В следующих \(m\) строк записано по два целых числа, \(i\)-я из этих строк содержит два целых числа, разделенных пробелами: \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq n, a_i \neq b_i\)) — числа в \(i\)-й паре.

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

Выведите «YES», если существуют два таких целых числа \(x\) и \(y\) (\(1 \leq x < y \leq n\)), что в каждой данной паре хотя бы одно число равно \(x\) или \(y\). Иначе выведите «NO». Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

В первом примере вы не можете выбрать подходящие \(x\), \(y\), потому что для каждой такой пары вы можете найти пару, которая их не содержит.

Во втором примере вы можете выбрать \(x=2\) и \(y=4\).

В третьем примере вы можете выбрать \(x=1\) и \(y=2\).

A. Лифт

математика реализация *1300

Вот и закончились многочисленные отборочные турниры на одно из самых престижных соревнований России Russian Codec Cup. Все n участников, прошедшие в финал соревнования, попали в огромный m-этажный 108- звездочный отель. Конечно же, первая мысль, приходящая в голову в таком месте: «А не покататься ли нам на лифте?».

Лифт в этом отеле перемещается между этажами всегда по одной и той же схеме. Изначально (в момент времени 0) лифт находится на этаже 1, далее он перемещается на этаж 2, потом на этаж 3, и так до этажа с номером m. После этого лифт перемещается на этаж m - 1, далее на этаж m - 2, и так до первого этажа. Этот процесс бесконечно повторяется. Известно, что лифт имеет бесконечную вместимость, а также что посадка пассажиров на любом этаже осуществляется мгновенно. Перемещение между этажами происходит за единицу времени.

Для каждого из n участников вам даны: si — на какой этаж приходит i-ый участник, fi — на какой этаж ему нужно попасть, ti — время, в которое i-ый участник приходит на этаж si.

Для каждого участника выведите минимальное время его прибытия на этаж fi.

Если участник приходит на этаж ровно в тот момент, когда приезжает лифт, считается, что участник успевает зайти в лифт. Если участник приходит на этаж si и на этот же этаж ему нужно попасть (si = fi), то время прибытия этого участника на этаж fi считается равным ti.

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

В первой строке записаны два целых числа n и m через пробел (1 ≤ n ≤ 105, 2 ≤ m ≤ 108).

В следующих n строках дана информация об участниках. В каждой строке через пробел записано три целых числа: si fi ti (1 ≤ si, fi ≤ m, 0 ≤ ti ≤ 108) — числа, описанные в условии задачи.

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

Выведите n строк по одному целому числу в каждой — для каждого участника время его прибытия на нужный этаж.

Примечание

Рассмотрим первый пример. Первый участник приходит ко времени t = 3 на этаж s = 2. Чтобы добраться до этажа f = 4, ему придется подождать до момента времени 7, когда лифт во второй раз будет ехать наверх, сесть в лифт и проехать два этажа. В таком случае первый участник доберется до этажа f в момент времени 9. Второй участник приходит ко времени t = 0 на этаж s = 1, сразу же садится в лифт, и приезжает на этаж f = 2. Третий участник не ждет лифта, так как ему надо попасть на тот же этаж, на котором он начинает.

E. Дерево или не дерево

графы Деревья разделяй и властвуй реализация Структуры данных *2900

Дан неориентированный связный граф G из n вершин и n ребер. G не содержит петель и кратных ребер. Пусть у каждого ребра этого графа есть два состояния: включено и выключено. Изначально все ребра выключены.

Также вам даны m запросов вида (v, u) — изменить состояние всех ребер на кратчайшем пути из вершины v в вершину u в графе G, если таких путей несколько, выбирается лексикографически наименьший. Более формально, рассмотрим все кратчайшие пути из вершины v в вершину u как последовательности вершин v, v1, v2, ..., u. Среди таких последовательностей выбирается лексикографически наименьшая.

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

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

В первой строке задано два целых числа — n и m (3 ≤ n ≤ 105, 1 ≤ m ≤ 105). Далее в n строках заданы ребра графа в виде a b (1 ≤ a, b ≤ n). В следующих m строках заданы запросы в виде v u (1 ≤ v, u ≤ n).

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

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

Выведите m строк по одному целому числу в каждой — ответы на запросы.

Примечание

Рассмотрим первый пример. Будем синим выделять на рисунке включенные ребра.

  • Граф до применения операций. В графе нет включенных ребер, поэтому 5 компонент связности есть изначально.

  • Граф после запроса v = 5, u = 4. Видно, что в графе 3 компоненты, если рассматривать только включенные ребра.

  • Граф после запроса v = 1, u = 5. Видно, что в графе 3 компоненты, если рассматривать только включенные ребра.

Лексикографическое сравнение двух последовательностей одинаковой длины (k чисел) происходит следующим образом. Последовательность x лексикографически меньше последовательности y если существует такое i (1 ≤ i ≤ k), что xi < yi, а для любого j (1 ≤ j < i) xj = yj.

B. Неудачные дни

*особая задача реализация

Каждый день герои Котлин анализируют статистику посещения их веб-сайта. За \(n\) дней они выписали \(n\) чисел \(a_1, a_2, \dots, a_n\), где \(a_i\) — количество посещений в \(i\)-й день.

Они считают, что день является неудачным, если до него было не менее чем \(2\) дня со строго большим количеством посещений. Например, если \(n=8\) и \(a=[3, 1, 4, 1, 5, 9, 2, 6]\), то день \(4\) является неудачным (так как \(a_4=1\), но есть \(a_1=3\) и \(a_3=4\)), кроме того неудачным является день с номером \(7\).

Напишите программу, которая находит количество неудачных дней.

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

В первой строке записано целое число \(n\) (\(1 \le n \le 2\cdot10^5\)), где \(n\) — количество дней. Во второй строке записаны \(n\) целых положительных чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)), где \(a_i\) — количество посещений сайта в \(i\)-й день.

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

Выведите количество неудачных дней — то есть таких дней, что ранее было не менее двух дней со строго большим количеством посещений.

C. Минус на минус дают плюс

*особая задача реализация Строки

Все знают, что два идущих подряд знака «минус» можно заменить на знак «плюс».

Вам задана строка \(s\), состоящая исключительно из знаков «плюс» и «минус». С ней можно провести ноль или более операций. Каждая операция состоит в выборе произвольных двух минусов, которые идут подряд, затем эти два минуса заменяются на знак «плюс». Таким образом, за одну операцию длина строки уменьшается на \(1\).

Вам заданы две строки \(s\) и \(t\). Определите, можно ли с помощью \(0\) или более операций из строки \(s\) получить строку \(t\).

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

В первой строке записано целое число \(k\) (\(1 \le k \le 10^5\)) — количество наборов входных данных в одном тесте. Далее содержатся описания наборов входных данных, каждый набор состоит из двух строк. Сначала идёт строка, содержащая \(s\) (длина строки \(s\) не превосходит \(2\cdot10^5\)), затем идёт строка, содержащая \(t\) (длина строки \(t\) не превосходит \(2\cdot10^5\)). Строки \(s\) и \(t\) — непустые, содержат исключительно знаки «плюс» и «минус».

Сумма длин строк \(s\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\). Аналогично, сумма длин строк \(t\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\).

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

Выведите \(k\) строк: \(i\)-я строка должна содержать YES, если ответ на \(i\)-й набор входных данных положительный, иначе NO. Выводите YES и NO исключительно прописными буквами.

D. Декодирование числовых последовательностей

*особая задача реализация Структуры данных

Поликарп разрабатывает метод передачи \(n\) числовых последовательностей по сети. Этот метод должен поддерживать передачу произвольного количества числовых последовательностей, последовательности могут иметь разные длины. Последовательности содержат произвольные неотрицательные целые числа.

Поликарп разработал следующий метод кодирования:

  • Будем считать, что последовательности пронумерованы от \(1\) до \(n\).
  • Допишем к каждой последовательности в конец специальный маркер окончания последовательности — элемент равный -1.
  • Результат кодирования — это одна новая последовательность, которая содержит в себе все элементы заданных \(n\) в специальном порядке: сначала добавим в результат кодирования все первые элементы последовательностей (в порядке от \(1\)-й до \(n\)-й), затем все вторые элементы (в порядке от \(1\)-й до \(n\)-й) и так далее, если у последовательности нет очередного элемента, то она просто пропускается. Процесс заканчивается, когда добавлены все элементы всех последовательностей.

Например, если требуется закодировать три последовательности \([3, 1, 4]\), \([2, 7]\) и \([1, 2, 3, 4]\), то последовательность действий будет такая:

  • модифицируем все три последовательности, добавив туда по -1: \([3, 1, 4, -1]\), \([2, 7, -1]\) и \([1, 2, 3, 4, -1]\);
  • выпишем все первые элементы, получим \([3, 2, 1]\);
  • затем выпишем все вторые элементы, получим \([3, 2, 1, 1, 7, 2]\);
  • затем выпишем все третьи элементы, получим \([3, 2, 1, 1, 7, 2, 4, -1, 3]\);
  • затем выпишем все четвёртые элементы, получим \([3, 2, 1, 1, 7, 2, 4, -1, 3, -1, 4]\) (обратите внимание, что вторая последовательность уже закончилась);
  • затем выпишем все пятые элементы, получим \([3, 2, 1, 1, 7, 2, 4, -1, 3, -1, 4, -1]\) (обратите внимание, что первая и вторая последовательности уже закончились);
  • теперь закончились все последовательности, и процесс кодирования завершается;
  • результат кодирования равен \([3, 2, 1, 1, 7, 2, 4, -1, 3, -1, 4, -1]\).

Ваша задача — реализовать декодирование по заданному результату кодирования.

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

В первой строке записано целое число \(m\) (\(1 \le m \le 3\cdot10^5\)) — длина результата кодирования. Далее во второй строке записан результат кодирования в виде последовательности целых чисел \(b_1, b_2, \dots, b_m\) (\(-1 \le b_i \le 100\)).

Гарантируется, что в последовательностях до кодирования были только неотрицательные целые числа от \(0\) до \(100\), что вам в самом деле задан результат корректного кодирования (иными словами, гарантируется, что ответ существует). Возможно, что одна или несколько последовательностей до кодирования были пусты.

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

Выведите \(n\), где \(n\) — количество закодированных последовательностей. Далее выведите \(n\) строк в формате \(k_i, a_{i1}, a_{i2}, \dots, a_{ik_i}\), где \(k_i\) — длина \(i\)-й последовательности, а \(a_{i1}, a_{i2}, \dots, a_{ik_i}\) — её элементы. Числа в строках разделяйте пробелами. Обратите внимание, что кодирование устроено таким образом, что ответ всегда определён однозначно.

A. Nauuo и карты

жадные алгоритмы реализация *1800

Nauuo — девочка, которая любит карты.

Однажды она играла в карты и заметила, что с ее картами были также замешаны какие-то пустые карты.

Всего есть \(n\) карт, пронумерованных целыми числами от \(1\) до \(n\), и с ними были перемешаны \(n\) пустых карт. Nauuo сложила эти \(2n\) карт в колоду и взяла \(n\) из них. Вам даны эти \(n\) карт в руках Nauuo. Оставшиеся \(n\) карт в колоде также даны в порядке сверху вниз.

За одну операцию Nauuo может выбрать одну карту в своей руке и сыграть ее — положить на дно колоды, а затем достать из колоды самую верхнюю карту.

Nauuo хочет, чтобы \(n\) карт с числами лежали в колоде в возрастающем порядке (\(i\)-я сверху карта в колоде должна быть \(i\)). Можете ли вы сказать ей, какое минимальное число операций ей для этого потребуется?

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

В первой строке записано одно целое число \(n\) (\(1\le n\le 2\cdot 10^5\)) — количество карт с числами.

Во второй строке записаны \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(0\le a_i\le n\)) — карты, которые были на руках у Nauuo изначально. \(0\) обозначает пустую карту.

В третьей строке записаны \(n\) целых чисел \(b_1,b_2,\ldots,b_n\) (\(0\le b_i\le n\)) — карты, которые были в колоде изначально, в порядке сверху вниз. \(0\) обозначает пустую карту.

Гарантируется, что каждое число от \(1\) до \(n\) встречается ровно один раз, либо в \(a_{1..n}\), либо в \(b_{1..n}\).

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

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

Примечание

Пример 1

Мы можем сыграть карту \(2\) и взять карту \(3\) на первой операции. После этого у нас на руках карты \([0,3,0]\), а карты в колоде сверху вниз — \([0,1,2]\).

Затем мы можем сыграть карту \(3\) на второй операции. Карты в колоде \([1,2,3]\) они разложены в возрастающем порядке.

Пример 2

Сыграйте пустую карту и возьмите карту \(1\), а затем сыграйте по порядку \(1\), \(2\), \(3\).

F. Ихаб и Большой Финал

графы Деревья интерактив Конструктив разделяй и властвуй реализация *2400

Это интерактивная задача.

Вам дано дерево, состоящее из \(n\) вершин, с корнем в вершине \(1\). Дерево — это связный граф без циклов.

Мы выбрали секретную вершину \(x\). Чтобы найти эту вершину, вы можете задавать запросы двух типов:

  • d \(u\) (\(1 \le u \le n\)). Мы ответим расстоянием между вершинами \(u\) и \(x\). Расстояние между двумя вершинами — это количество ребер в кратчайшем пути между ними.
  • s \(u\) (\(1 \le u \le n\)). Мы ответим номер второй вершины на пути от \(u\) до \(x\). Тем не менее, есть одна хитрость. Если \(u\) не является предком \(x\), вы получите вердикт «Неправильный ответ»!

Вершина \(a\) называется предком вершины \(b\), если \(a \ne b\) и кратчайший путь от вершины \(1\) к вершине \(b\) проходит через вершину \(a\). Обратите внимание, что в этой задаче вершина не является предком сама себе.

Можете ли вы найти \(x\), сделав не более \(36\) запросов? Скрытая вершина зафиксирована в каждом тесте заранее и не зависит от ваших запросов.

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

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Каждая из следующих \(n-1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), которые значат, что между вершинами \(u\) и \(v\) есть ребро. Гарантируется, что граф образует дерево.

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

Чтобы вывести ответ, выведите «! x» (без кавычек).

Протокол взаимодействия

Чтобы задать запрос, выведите в одном из двух следующих форматов:

  • d \(u\) (\(1 \le u \le n\)), или
  • s \(u\) (\(1 \le u \le n\)).

После каждого вопроса вы должны прочитать ответ: либо расстояние, либо вторую вершину пути, как описано в легенде.

Если мы ответим \(-1\) вместо корректного ответа, это означает, что вы превысили количество запросов, сделали неверный запрос или нарушили условие во втором типе запросов. Завершите вашу программу сразу после получения \(-1\), и вы получите вердикт Wrong answer. В противном случае вы можете получить другой вердикт, потому что ваше решение будет продолжать читать из закрытого потока.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы:

Первая строка должна содержать два целых числа \(n\) и \(x\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le x \le n\)).

Каждая из следующих \(n-1\) строк должна содержать два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), которые значат, что между вершинами \(u\) и \(v\) есть ребро. Граф должен образовать дерево.

Примечание

В первом примере секретной вершиной является вершина \(5\).

Сначала мы спросим о расстоянии между вершинами \(x\) и \(2\). Ответ \(3\), поэтому вершина \(x\) равна либо \(4\), либо \(5\). Затем мы спрашиваем о второй вершине на пути от вершины \(3\) к вершине \(x\). Обратите внимание, что вершина \(3\) является предком вершины \(5\). Мы получаем вершину \(5\) в качестве ответа. Наконец, мы сообщаем, что секретная вершина — это вершина \(5\).

A. Путь к нулю

математика реализация *900

Вам заданы два числа \(n\) и \(k\).

За один шаг вы можете делать следующие действия:

  • уменьшить \(n\) на \(1\);
  • разделить \(n\) на \(k\) если \(n\) делится \(k\).
Например, если \(n = 27\) и \(k = 3\) Вы можете совершить следующую последовательность шагов: \(27 \rightarrow 26 \rightarrow 25 \rightarrow 24 \rightarrow 8 \rightarrow 7 \rightarrow 6 \rightarrow 2 \rightarrow 1 \rightarrow 0\).

Вам нужно посичтать минимальное количество шагов, необходимое для получения \(0\) из \(n\).

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

Первая строка содержит число \(t\) (\(1 \le t \le 100\)) — количество запросов.

Единственная строка каждого запроса содержит два числа \(n\) и \(k\) (\(1 \le n \le 10^{18}\), \(2 \le k \le 10^{18}\)).

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

Для каждого запроса выведите минимальное количество шагов для получения \(0\) из \(n\) в отдельной строке.

Примечание

В первом тестовм примере необходимо выполнить следующую последовательность шагов: \(59 \rightarrow 58 \rightarrow 57 \rightarrow 19 \rightarrow 18 \rightarrow 6 \rightarrow 2 \rightarrow 1 \rightarrow 0\).

Во втором тестовом примере необходимо \(18\) раз разделить \(n\) на \(k\) а затем уменьшить \(n\) на \(1\).

B. Поймай переполнение!

Разбор выражений реализация Структуры данных *1600

Задана функция \(f\), написанная на довольно примитивном языке. Функция принимает целое значение, которое сразу записывается в переменную \(x\). \(x\) — это целочисленная переменная, которая может принимать значения от \(0\) до \(2^{32}-1\). Функция содержит три типа команд:

  • for \(n\) — цикл for;
  • end — каждая команда между «for \(n\)» и соответствующим «end» выполняется \(n\) раз;
  • add — прибавляет 1 к \(x\).

После выполнения команд возвращается значение \(x\).

Каждый «for \(n\)» имеет парный «end», поэтому гарантируется, что функция корректна. За «for \(n\)» может сразу следовать «end». «add» может быть расположен вне циклов for.

Заметили, что команда «add» может переполнить значение \(x\)! Это значит, что значение \(x\) становится больше \(2^{32}-1\) после некоторой команды «add».

Теперь запускается \(f(0)\), а ваша задача — узнать, корректно ли полученное значение \(x\) или переполнение сделает его некорректным.

Если произошло переполнение, то выведите «OVERFLOW!!!», иначе выведите полученное значение \(x\).

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

В первой строке записано одно целое число \(l\) (\(1 \le l \le 10^5\)) — количество строк в функции.

В каждой из следующих \(l\) строк записана одна команда одного из трех типов:

  • for \(n\) (\(1 \le n \le 100\)) — цикл for;
  • end — каждая команда между «for \(n\)» и соответствующим «end» выполняется \(n\) раз;
  • add — прибавляет 1 к \(x\).
Выходные данные

Если во время выполнения \(f(0)\) произошло переполнение, то выведите «OVERFLOW!!!», иначе выведите полученное значение \(x\).

Примечание

В первом примере первая команда «add» выполнится 1 раз, вторая — 150 раз и последняя — 10 раз. Обратите внимание, что за «for \(n\)» может сразу следовать «end» и что «add» может быть расположен вне циклов for.

Во втором примере нет команд «add», поэтому полученное значение равно 0.

В третьем примере команда «add» выполняется слишком много раз, что делает значение \(x\) больше \(2^{32}-1\).

E. Минимальное покрытие отрезков

Деревья дп жадные алгоритмы поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2200

Даны \(n\) отрезков в формате \([l; r]\) на числовой прямой.

Также даны \(m\) запросов в формате \([x; y]\). Какое минимальное число отрезков надо взять так, чтобы каждая точка (не обязательно целочисленная) от \(x\) до \(y\) была покрыта хотя бы одним из них?

Если нельзя выбрать отрезки так, чтобы каждая точка от \(x\) до \(y\) была покрыта, тогда выведите -1 на этот запрос.

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

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество отрезков и количество запросов, соответственно.

В каждой из следующих \(n\) строк записаны по два целых числа \(l_i\) и \(r_i\) (\(0 \le l_i < r_i \le 5 \cdot 10^5\)) — данные отрезки.

В каждой из следующих \(m\) строк записаны по два целых числа \(x_i\) и \(y_i\) (\(0 \le x_i < y_i \le 5 \cdot 10^5\)) — запросы.

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

Выведите \(m\) целых чисел. \(i\)-е число должно быть ответом на \(i\)-й запрос: либо минимальное число отрезков необходимое, чтобы каждая точка (не обязательно целочисленная) от \(x_i\) до \(y_i\) была покрыта хотя бы одним из них, либо -1, если нельзя выбрать отрезки так, чтобы каждая точка от \(x_i\) до \(y_i\) была покрыта.

Примечание

В первом примере три запроса:

  1. запрос \([1; 3]\) может быть покрыт отрезком \([1; 3]\);
  2. запрос \([1; 4]\) может быть покрыт отрезками \([1; 3]\) и \([2; 4]\). Нельзя покрыть \([1; 4]\) одним отрезком;
  3. запрос \([3; 4]\) может быть покрыт отрезком \([2; 4]\); Не важно, что покрыты какие-то точки вне данного запроса.

Во втором примере четыре запроса:

  1. запрос \([1; 2]\) может быть покрыт отрезком \([1; 3]\). Обратите внимание, что можно выбрать любой из отрезков \([1; 3]\);
  2. запрос \([1; 3]\) может быть покрыт отрезком \([1; 3]\);
  3. запрос \([1; 4]\) не может быть покрыт никаким набором отрезков;
  4. запрос \([1; 5]\) не может быть покрыт никаким набором отрезков. Обратите внимание, что отрезки \([1; 3]\) и \([4; 5]\) вместе не покрывают \([1; 5]\), потому что даже нецелые точки должны быть покрыты. Здесь \(3.5\) не покрыта, например.

A. Дели!

жадные алгоритмы Перебор реализация *800

Вам задано целое число \(n\).

Вы можете выполнять любую из следующих операций над ним любое (возможно, нулевое) количество раз:

  1. Заменить \(n\) на \(\frac{n}{2}\), если \(n\) делится на \(2\);
  2. Заменить \(n\) на \(\frac{2n}{3}\), если \(n\) делится на \(3\);
  3. Заменить \(n\) на \(\frac{4n}{5}\), если \(n\) делится на \(5\).

Например, Вы можете заменить \(30\) на \(15\) при помощи первой операции, на \(20\) при помощи второй операции или на \(24\) при помощи третьей операции.

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

Вам необходимо ответить на \(q\) независимых запросов.

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

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 1000\)) — количество запросов.

Следующие \(q\) строк содержат запросы. В каждом запросе задано целое число \(n\) (\(1 \le n \le 10^{18}\)).

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

На каждый запрос выведите ответ на новой строке. Если невозможно получить \(1\) из \(n\), выведите -1. Иначе выведите минимальное количество операций, необходимое, чтобы сделать это.

C. Теряй!

дп жадные алгоритмы реализация *1300

Вам задан массив \(a\), состоящий из \(n\) целых чисел. Каждое \(a_i\) равно одному из следующих шести чисел: \(4, 8, 15, 16, 23, 42\).

Ваша задача — удалить минимальное количество элементов, чтобы сделать массив хорошим.

Массив длины \(k\) называется хорошим, если \(k\) делится на \(6\) и возможно разделить его на \(\frac{k}{6}\) подпоследовательностей \(4, 8, 15, 16, 23, 42\).

Примеры хороших массивов:

  • \([4, 8, 15, 16, 23, 42]\) (весь массив является необходимой последовательностью);
  • \([4, 8, 4, 15, 16, 8, 23, 15, 16, 42, 23, 42]\) (первая последовательность состоит из первого, второго, четвертого, пятого, седьмого и десятого элементов, а вторая состоит из оставшихся элементов);
  • \([]\) (пустой массив является хорошим).

Примеры плохих массивов:

  • \([4, 8, 15, 16, 42, 23]\) (порядок элементов должен быть в точности \(4, 8, 15, 16, 23, 42\));
  • \([4, 8, 15, 16, 23, 42, 4]\) (длина массива не делится на \(6\));
  • \([4, 8, 15, 16, 23, 42, 4, 8, 15, 16, 23, 23]\) (первая последовательность может состоять из первых шести элементов, но оставшийся массив не может составить необходимую последовательность).
Входные данные

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 5 \cdot 10^5\)) — количество элементов в \(a\).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (каждое \(a_i\) равно одному из следующих шести чисел: \(4, 8, 15, 16, 23, 42\)), где \(a_i\)\(i\)-й элемент \(a\).

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

Выведите одно целое число — минимальное количество элементов, которое необходимо удалить, чтобы получить хороший массив.

F. Уничтожай!

дп реализация сортировки *2100

Вы играете в компьютерную игру, которая называется Splay the Sire. Сейчас Вы сражаетесь с финальным боссом игры.

Битва с боссом состоит из \(n\) ходов. В течение каждого хода Вы получаете некоторое количество карт. Каждая карта имеет два параметра: ее цену \(c_i\) и урон \(d_i\). Вы можете играть какими-то картами в какой-то последовательности в течение каждого хода (Вы выбираете карты и точный порядок, в котором их поставите) до тех пор, пока суммарная стоимость карт, которыми Вы играете в течение хода, не превосходит \(3\). После игры некоторым (возможно, нулевым) количеством карт Вы заканчиваете ход, а все карты, которыми Вы не сыграли, пропадают. Заметьте, что вы можете использовать каждую карту не более одного раза.

Ваш персонаж также нашел артефакт, который позволяет увеличить урон некоторых действий: каждая \(10\)-я карта, которую Вы играете, наносит двойной урон.

Чему равен максимально возможный урон, который Вы можете нанести в течение \(n\) ходов?

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество ходов.

Затем следуют \(n\) блоков входных данных, \(i\)-й блок описывает карты, которые Вы получите в течение \(i\)-го хода.

Каждый блок начинается со строки, содержащей одно целое число \(k_i\) (\(1 \le k_i \le 2 \cdot 10^5\)) — количество карт, которое Вы получите в течение \(i\)-го хода. Затем следуют \(k_i\) строк, каждая из которых содержит два целых числа \(c_j\) и \(d_j\) (\(1 \le c_j \le 3\), \(1 \le d_j \le 10^9\)) — параметры соответствующей карты.

Гарантируется, что \(\sum \limits_{i = 1}^{n} k_i \le 2 \cdot 10^5\).

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

Выведите одно целое число — максимально возможный урон, который Вы можете нанести.

Примечание

В тестовом примере лучшая последовательность действий будет выглядеть следующим образом:

В течение первого хода сыграть всеми тремя картами и нанести \(18\) единиц урона.

В течение второго хода сыграть обеими картами и нанести \(7\) единиц урона.

В течение третьего хода сыграть первой и третьей картами и нанести \(13\) единиц урона.

В течение четвертого хода сыграть первой и третьей картами и нанести \(25\) единиц урона.

В течение пятого хода сыграть единственной картой, которая нанесет двойной урон (\(200\)).

A. Последовательность цифр (упрощенная версия)

реализация *1000

Выпишем подряд без каких-либо разделителей все целые числа от \(1\) и далее (то есть выпишем в одну строку). В результате получится последовательность цифр, которая начинается вот так: 123456789101112131415161718192021222324252627282930313233343536...

Ваша задача вывести \(k\)-ю цифру в этой последовательности.

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

В первой и единственной строке записано целое \(k\) (\(1 \le k \le 10000\)) — индекс цифры (индексы нумеруются от \(1\)).

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

Выведите \(k\)-ю цифру построенной бесконечной последовательности цифр.

B. Последовательность цифр (усложнённая версия)

Бинарный поиск разделяй и властвуй реализация *1800

Выпишем подряд без каких-либо разделителей все целые числа от \(1\) и далее (то есть выпишем в одну строку). В результате получится последовательность цифр, которая начинается вот так: 123456789101112131415161718192021222324252627282930313233343536...

Ваша задача вывести \(k\)-ю цифру в этой последовательности.

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

В первой и единственной строке записано целое \(k\) (\(1 \le k \le 10^{12}\)) — индекс цифры (индексы нумеруются от \(1\)).

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

Выведите \(k\)-ю цифру построенной бесконечной последовательности цифр.

A. Валера и дек

реализация Структуры данных *1500

Недавно на курсе по алгоритмам и структурам данных Валера научился пользоваться деком. Он построил дек, заполненный \(n\) элементами. \(i\)-й элемент равен \(a_i\) (\(i\) = \(1, 2, \ldots, n\)). Он последовательно берет из дека два первых (то есть крайних слева) элемента (назовем их \(A\) и \(B\) соответственно) и делает следующее: если \(A > B\), то он \(A\) записывает в начало, а \(B\) записывает в конец дека, иначе он записывает в начало \(B\), а \(A\) записывает в конец дека. Назовем эту последовательность действий операцией.

Например если дек был \([2, 3, 4, 5, 1]\), после операции он запишет \(B=3\) в начало и \(A=2\) в конец, таким образом он получит \([3, 4, 5, 1, 2]\).

Преподаватель курса, увидев увлеченного своим делом Валеру, подошел к нему и задал ему \(q\) вопросов. Каждый вопрос состоит из единственного числа \(m_j\) \((j = 1, 2, \ldots, q)\). Требуется для каждого вопроса ответить какие два элемента он вытащит на \(m_j\)-й операции.

Обратите внимание, что запросы независимы, а числа \(A\) и \(B\) для каждого из запросов нужно вывести в том порядке, в котором они будут вытащены из дека.

Дек — структура данных, представляющая из себя список элементов, в которой добавление новых элементов и удаление существующих производится с обоих концов.

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

Первая строка содержит два целых числа \(n\) и \(q\) (\(2 \leq n \leq 10^5\), \(0 \leq q \leq 3 \cdot 10^5\)) — количество элементов в деке и количество вопросов преподавателя соответственно. Вторая строка содержит \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\), где \(a_i\) \((0 \leq a_i \leq 10^9)\) — элемент дека в \(i\)-й позиции. Следующие \(q\) строк содержат по одному числу, обозначающее \(m_j\) (\(1 \leq m_j \leq 10^{18}\)).

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

Для каждого вопроса преподавателя выведите два числа \(A\) и \(B\) — числа, которые вытащит Валера из дека на \(m_j\)-й операции.

Примечание
  1. Рассмотрим все 10 шагов для первого теста подробно:
  2. \([1, 2, 3, 4, 5]\) — на первой операции \(A\) и \(B\) равны соответственно \(1\) и \(2\).

    Значит, \(2\) мы запишем в начало дека, а \(1\) — в конец.

    Получим следующее состояние дека: \([2, 3, 4, 5, 1]\).

  3. \([2, 3, 4, 5, 1] \Rightarrow A = 2, B = 3\).
  4. \([3, 4, 5, 1, 2]\)
  5. \([4, 5, 1, 2, 3]\)
  6. \([5, 1, 2, 3, 4]\)
  7. \([5, 2, 3, 4, 1]\)
  8. \([5, 3, 4, 1, 2]\)
  9. \([5, 4, 1, 2, 3]\)
  10. \([5, 1, 2, 3, 4]\)
  11. \([5, 2, 3, 4, 1] \Rightarrow A = 5, B = 2\).

C. Сергей и школьная столовая

Бинарный поиск Деревья жадные алгоритмы математика Паросочетания реализация Структуры данных *2200

Сергей пришел в школьную столовую и с ужасом обнаружил, что там уже очередь из целых \(m\) человек! Теперь он не уверен, стоит ли дожидаться конца этой очереди, поэтому хочет узнать, какое же блюдо ему достанется, если он это сделает. Так как Сергей устал после занятий, он попросил вас посчитать это за него.

Всего в столовой есть \(n\) блюд со стоимостями \(a_1, a_2, \ldots, a_n\). Также есть очередь из \(m\) человек, у которых есть \(b_1, \ldots, b_m\) тугриков (школьники пронумерованы в том же порядке, как они стоят в очереди, то есть \(b_1\) означает, сколько тугриков у школьника, который стоит в очереди первым, а \(b_m\) — сколько у школьника, стоящего последним).

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

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

Еще в школе Сергея сейчас нестабильная экономическая ситуация, поэтому, иногда могут изменяться стоимости некоторых блюд или количество денег у некоторых школьников. Поэтому вам нужно обработать \(q\) запросов двух типов:

  • изменить \(a_i\) на \(x\). То есть стоимость \(i\) блюда становится равна \(x\).
  • изменить \(b_i\) на \(x\). То есть у \(i\) школьника становится \(x\) тугриков.

После каждого запроса нужно вывести стоимость блюда, которое получит Сергей, если дождется своей очереди, или \(-1\), если к этому моменту уже ничего не останется.

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

В первой строке вводятся числа \(n\) и \(m\) (\(1 \leq n, m \leq 300\ 000\)) — количество блюд и количество школьников в очереди. Во второй строке вводятся \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^{6}\)) — элементы массива \(a\). В третьей строке вводятся \(m\) целых чисел \(b_1, b_2, \ldots, b_{m}\) (\(1 \leq b_i \leq 10^{6}\)) — элементы массива \(b\). В четвертой строке вводится целое число \(q\) (\(1 \leq q \leq 300\ 000\)) — количество запросов.

В следующих \(q\) строках вводятся запросы одного из двух типов, по одному в строке:

  • если запрос первого типа, то вводится \(1\), затем вводятся целые числа \(i\) и \(x\) (\(1 \leq i \leq n\), \(1 \leq x \leq 10^{6}\)), что значит, что \(a_i\) становится равно \(x\).
  • если запрос второго типа, то вводится \(2\), затем вводятся целые числа \(i\) и \(x\) (\(1 \leq i \leq m\), \(1 \leq x \leq 10^{6}\)), что значит, что \(b_i\) становится равно \(x\).
Выходные данные

Выведите \(q\) строк, \(i\)-я из которых содержит ответ на вопрос Сергея после \(i\) изменения (стоимость блюда, которое получит Сергей, если дождется своей очереди, или \(-1\), если к этому моменту уже ничего не останется).

Примечание

В первом примере после первого запроса в столовой есть одно блюдо стоимостью \(100\) тугриков и один школьник с одним тугриком, поэтому Сергей купит блюдо со стоимостью \(100\).

Во втором примере после первого запроса есть одно блюдо со стоимостью один тугрик и один школьник, у которого есть \(100\) тугриков, поэтому Сергей ничего не получит.

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

A. Упражнение на строки

реализация Строки *1000

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

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

Гласными буквами считаются буквы "A", "O", "Y", "E", "U", "I", а согласными — все остальные. На вход программе подается ровно одна строка, она должна вернуть результат в виде одной строки, получившейся после обработки.

Помогите Пете справиться с этим несложным заданием.

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

Первая строка представляет собой входные данные для Петиной программы. Эта строка состоит только из прописных и строчных латинских букв и имеет длину от 1 до 100 включительно.

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

Выведите получившуюся строку. Гарантируется, что эта строка не пуста.

B. Подарок от Лены

Конструктив реализация *1000

У Васи скоро день рожденья, и Лена захотела сшить ему в подарок расписную салфетку. Эту салфетку Лена решила украсить цифрами от 0 до n. Цифры будут расположены в форме ромба, причем по центру должна находиться самая большая цифра n, а ближе к краям цифры должны уменьшаться. Например, для n = 5 узор на салфетке будет выглядеть следующем образом:


          0
        0 1 0
      0 1 2 1 0
    0 1 2 3 2 1 0
  0 1 2 3 4 3 2 1 0
0 1 2 3 4 5 4 3 2 1 0
  0 1 2 3 4 3 2 1 0
    0 1 2 3 2 1 0
      0 1 2 1 0
        0 1 0
          0

Ваша задача — по заданному n определить, как будет выглядеть салфетка.

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

В первой строке записано единственное целое число n (2 ≤ n ≤ 9).

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

Выведите рисунок для заданного числа n. Необходимо строго соблюдать количество пробелов до первой цифры в каждой строке. Каждые две подряд идущие цифры в каждой строке должны быть разделены ровно одним пробелом. В конце каждой строки после последней цифры не должно быть пробелов.

A. Саня и ромб

дп математика реализация *800

Играясь с геометрическими фигурами, Саня случайно ввел понятие ромба \(n\)-го порядка на клеточной сетке.

Ромб \(1\)-го порядка — это квадратик \(1 \times 1\) (т.е просто одна клетка).

Ромб \(n\)-го порядка для \(n \geq 2\) получается из ромба \(n-1\)-го порядка путём добавления к нему всех клеток, соседних с ним по стороне (для лучшего понимания смотрите картинку).

Саня просит вас посчитать количество клеток в ромбе \(n\)-го порядка.

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

Первая и единственная строка ввода содержит число \(n\) (\(1 \leq n \leq 100\)) — порядок ромба, для которого нужно посчитать количество клеток в нем.

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

Выведите одно число — количество клеток в ромбе \(n\)-го порядка.

Примечание

Изображения ромбов соответствующих примерам приведены в условии.

B. Коля и массив

жадные алгоритмы реализация *1500

На свой \(5\) день рождения Коля получил от мамы в подарок новенький массив \(a=[a_1, a_2, \dots, a_n]\)! Он уже собирался хорошенько изучить его различные свойства, однако распаковав массив, он заметно расстроился, так как произведение его элементов \(a_1 \cdot a_2 \cdot \dots a_n\) показалось ему недостаточно большим.

Он уже было собирался выбросить массив в окно, но мама сказала ему, что массив не очень испортится, если он сделает следующую операцию: выберет произвольный индекс \(i\) (\(1 \le i \le n\)) и выполнит присваивание \(a_i := -a_i - 1\).

Например он может превратить массив \([3, -1, -4, 1]\) в массив \([-4, -1, 3, 1]\) применив эту операцию к индексам \(i=1\) и \(i=3\).

Коля сразу понял, что в некоторых случаях таким образом можно заметно увеличить произведение чисел массива. На следующий день после дня рождения он решил, что хочет получить массив с как можно большим произведением чисел, используя только вышеупомянутую операцию (возможно, ноль, один либо несколько раз), не запрещено применять эту операцию несколько раз к одному элементу.

Помогите маленькому Коле и выведите массив, который может быть получен из исходного многократным применением вышеупомянутой операции, имеющий максимально возможное произведение элементов \(a_1 \cdot a_2 \cdot \dots a_n\).

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

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

В первой строке вводится число \(n\) (\(1 \leq n \leq 10^{5}\)) — количество элементов в массиве.

Во второй строке вводятся \(n\) чисел \(a_1, a_2, \ldots, a_n\) (\(-10^{6} \leq a_i \leq 10^{6}\)) — элементы массива

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

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

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

B. Разделение числа

жадные алгоритмы реализация Строки *1500

Сегодня Дима целый день старался и выписывал на длинную бумажную ленту своё любимое целое положительное число \(n\), состоящее из \(l\) цифр. К сожалению, лента получилась настолько длинной, что в итоге не влезла в Димин шкаф.

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

Дима хочет, чтобы полученное число было как можно меньше, ведь это повышает шансы на то, что хотя бы сумма в шкаф влезет. Помогите Диме определить, какое минимальное число он может получить.

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

Первая строка содержит одно целое число \(l\) (\(2 \le l \le 100\,000\)) — длину любимого числа Димы.

Вторая строка содержит целое положительное число \(n\), изначально записанное на ленте — любимое число Димы.

Число \(n\) состоит ровно из \(l\) цифр, при этом запись не содержит ведущих нулей. Также Дима гарантирует, что существует хотя бы один способ разрезать число, удовлетворяющий всем требованиям выше.

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

Выведите одно целое число — минимальное число, которое может получить Дима.

Примечание

В первом примере Дима может разрезать число \(1234567\) на числа \(1234\) и \(567\). Их сумма равна \(1801\).

Во втором примере Дима может разрезать число \(101\) на числа \(10\) и \(1\). Их сумма равна \(11\). Обратите внимание, запрещено разрезать число на «1» и «01», так как числа не могут начинаться с нулей.

C. Флаг

дп Комбинаторика Перебор реализация *1900

Иннокентий работает на блошином рынке, продавая посетителям всякий хлам необычные вещи. Недавно он нашёл у себя на складе старое прямоугольное покрывало. Как оказалось, это покрывало имеет сетчатую форму, то есть покрывало состоит из \(n \cdot m\) цветных лоскутков, разбитых на \(n\) строк и \(m\) столбцов.

Цветные лоскутки привлекли внимание Иннокентия, и он сразу же придумал, как можно заработать на своей находке. Если вырезать из покрывала подпрямоугольник, состоящий из трёх цветных полос, то потом этот подпрямоугольник можно будет продать как флаг какой-нибудь страны. В частности, Иннокентий считает, что подпрямоугольник будет достаточно похож на флаг какой-нибудь страны, если он будет состоять из трёх одноцветных полос одинаковой высоты, находящихся друг под другом. Разумеется, цвет верхней полосы не должен совпадать с цветом средней полосы, а цвет средней не должен совпадать с цветом нижней.

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

  

Примеры подпрямоугольников, являющихся флагами

     

Примеры подпрямоугольников, не являющихся флагами

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

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 1\,000\)) — количество строк и столбцов в покрывале.

Каждая из следующих \(n\) строк описывает очередную строку покрывала и состоит из \(m\) строчных латинских букв от «a» до «z», где одинаковым цветам соответствуют одинаковые буквы, а разным цветам — разные буквы.

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

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

Примечание
 

Пояснение к примеру. Выделены подпрямоугольники, являющиеся флагами

D. Ирригация

Бинарный поиск Деревья реализация сортировки Структуры данных *2200

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

Город для проведения олимпиады выбирается следующим образом: всего в Берляндии есть \(m\) городов, пронумерованных от \(1\) до \(m\), готовых принять соревнование. Каждый год олимпиада проводится в городе, в котором она проводилась наименьшее число раз. Если таких городов несколько, то олимпиада проводится в городе с наименьшим номером среди городов с минимальным числом проведений олимпиады.

Мишина мама очень волнуется за сына, поэтому её интересует, в каком городе будет проходить олимпиада в определённые годы. Единственная информация, которой располагает мама Миши, — места проведения олимпиады в первые \(n\) лет. Помогите маме Миши, и она попросит Мишу не залить вашу квартиру.

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

В первой строке заданы три целых числа \(n\), \(m\) и \(q\) (\(1 \leq n, m, q \leq 500\,000\)) — количество проведений олимпиады до введения правила, количество городов в Берляндии, готовых провести олимпиаду, и число лет, про которые маму Миши интересует место проведения олимпиады, соответственно.

В следующей строке содержится \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq m\)), где \(a_i\) — номер города, в котором проводилась олимпиада в год \(i\). Обратите внимание, что до принятия правила место проведения олимпиады могло выбираться произвольным образом.

В следующих \(q\) строках заданы целые числа \(k_i\) (\(n + 1 \leq k_i \leq 10^{18}\)) — номера годов, для которых маму Миши интересует место проведения олимпиады.

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

Выведите \(q\) целых чисел. В строке с номером \(i\) выведите одно целое число — место проведения олимпиады в год \(k_i\).

Примечание

В первом примере Мишина мама интересуется о первых \(10\) годах после принятия нового правила, в эти года олимпиада пройдёт в городах 4, 3, 4, 2, 3, 4, 1, 2, 3, 4.

Во втором примере после принятия нового правила олимпиада пройдёт в городах 2, 3, 1, 2, 3, 5, 1, 2, 3, 4, 5, 1.

B. Плюс из рисунка

поиск в глубину и подобное реализация Строки *1300

Вам дан рисунок с размерами \(w \times h\). Определите, имеет ли данный рисунок одну «+» форму или нет. «+» форма определена ниже:

  • «+» форма имеет одну центральную заполненную клетку.
  • Должно быть несколько (как минимум одна) последовательных заполненных клеток в каждом направлении (влево, вправо, вверх, вниз) от центра, то есть каждый из четырёх лучей должен быть непустым.
  • Все остальные клетки незаполненны.

Определите, имеет ли данный рисунок одну «+» форму или нет.

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

Первая строка содержит два целых числа \(h\) и \(w\) (\(1 \le h\), \(w \le 500\)) — высота и длина рисунка.

\(i\)-я из следующих \(h\) строк содержит строку \(s_{i}\) длины \(w\), которая состоит из «.» и «*», где «.» обозначает незаполненную клетку, а «*» обозначает заполненную клетку.

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

Если данное изображение удовлетворяет всем условиям, выведите «YES». Иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере данная картина содержит одну «+» форму.

Во втором примере две вертикальные ветви расположены в разных столбцах.

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

В четвертом примере ширина двух вертикальных ветвей составляет \(2\).

В пятом примере есть две фигуры.

В шестом примере внутри фигуры есть пустое пространство.

D. Полное зеркало

Деревья дп Конструктив поиск в глубину и подобное реализация хэши *2400

Дерево состоит из \(n\) вершин. Выберите одну вершину как корень. Он должен удовлетворять условию ниже.

  • Для каждой пары вершин \(v_{1}\) и \(v_{2}\), если \(distance\)(\(root\), \(v_{1}\)) \(= distance\)(\(root\), \(v_{2})\), тогда \(degree\)(\(v_{1}\)) \(= degree\)(\(v_{2}\)), где \(degree\) — количество смежных вершин, а \(distance\) — количество ребер между двумя вершинами.

Определите и найдите, есть ли такой корень в дереве. Если есть несколько ответов, выведите любой из них.

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

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^{5}\)) — количество верши.

Каждая из следующих \(n-1\) строк содержит два целых числа \(v_{i}\) и \(u_{i}\) (\(1 \le v_{i} \lt u_{i} \le n\)), которые значат, что существует ребра между вершинами \(v_{i}\) и \(u_{i}\). Гарантируется, что граф — дерево.

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

Если такой корень существует, выведите любой из них. Иначе выведите \(-1\).

Примечание

Рисунок до первого примера. \(1\), \(5\), \(7\) — также могут быть корнями.

Рисунок до второго примера. Невозможно найти корень графа.

A. Ближайшее интересное число

реализация *800

Поликарп знает, что если сумма цифр числа делится на \(3\), то и само число делится на \(3\). Он предполагает, что числа, сумма цифр которых делится на \(4\), тоже в чём-то интересные. Таким образом, он считает положительное целое число \(n\) интересным, если его сумма цифр делится на \(4\).

Помогите Поликарпу найти ближайшее большее или равное интересное число по заданному числу \(a\). То есть, найдите такое интересное число \(n\), что \(n \ge a\) и \(n\) — минимально.

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

В единственной строке входных данных записано целое число \(a\) (\(1 \le a \le 1000\)).

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

Выведите ближайшее большее или равное интересное число по заданному числу \(a\). Иными словами, выведите такое интересное число \(n\), что \(n \ge a\) и \(n\) — минимально.

E. Подпоследовательности (легкая версия)

графы дп кратчайшие пути реализация *2000

Единственное отличие между легкой и сложной версиями — ограничения.

Подпоследовательность строки может быть получена из другой строки при помощи удаления некоторого (возможно, нулевого) количества символов без изменения порядка оставшихся символов. Удаляемые символы не обязательно должны идти друг за другом, между ними могут быть любые пропуски. Например, для строки «abaca» следующие строки являются ее подпоследовательностями: «abaca», «aba», «aaa», «a» и «» (пустая строка). А следующие строки не являются подпоследовательностями: «aabaca», «cb» и «bcaa».

Вам задана строка \(s\), состоящая из \(n\) строчных букв латинского алфавита.

За один ход вы можете выбрать любую подпоследовательность \(t\) заданной строки и добавить ее во множество \(S\). Множество \(S\) не может содержать одинаковых элементов. Этот ход стоит \(n - |t|\), где \(|t|\) равно длине добавляемой подпоследовательности (то есть цена равна количеству удаленных символов).

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

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

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

Вторая строка входных данных содержит строку \(s\), состоящую из \(n\) строчных букв латинского алфавита.

Выходные данные

Выведите одно целое число — если невозможно составить множество \(S\) размера \(k\), выведите -1. Иначе выведите минимально возможную суммарную стоимость составления такого множества.

Примечание

В первом тестовом примере мы можем составить \(S\) = { «asdf», «asd», «adf», «asf», «sdf» }. Стоимость первого элемента в \(S\) равна \(0\), а стоимости остальных равны \(1\). Таким образом, суммарная стоимость \(S\) равна \(4\).

G. Коробка с конфетами (усложненная версия)

жадные алгоритмы реализация сортировки *2000

Эта задача — усложненная версия задачи D из этого же самого контеста с дополнительными ограничениями и заданиями.

В коробке с конфетами находятся \(n\) конфет. Тип \(i\)-й конфеты равен \(a_i\) (\(1 \le a_i \le n\)).

Вы хотите приготовить подарок, используя некоторые из этих конфет, со следующим ограничением: количества конфет каждого типа, находящегося в подарке, должны быть различны (то есть, например, подарок, имеющий две конфеты типа \(1\) и две конфеты типа \(2\) является плохим).

Возможно, что некоторые типы конфет могут вообще не находиться в подарке. Также возможно, что не все конфеты каких-то типов будут взяты в подарок.

Вы очень любите некоторые конфеты из коробки и не хотите их включать в подарок (вы бы предпочли сами их съесть). Для каждой конфеты задано число \(f_i\), которое равно \(0\), если вы хотите оставить \(i\)-ю конфету себе, или \(1\), если вы вполне можете отдать ее, и это не вызовет у вас никаких отрицательных эмоций. Возможно, что у двух конфет одного типа могут быть разные значения \(f_i\).

Вы хотите собрать как можно больше конфет в подарок — но, с другой стороны, вы не хотите отдавать слишком много конфет из тех, которые бы предпочли съесть сами. Поэтому вы хотите посчитать максимальное число конфет, которое может быть включено в подарок, а среди всех способов выбрать максимальное число конфет в подарке — максимально возможное количество конфет с \(f_i = 1\).

Вам необходимо ответить на \(q\) независимых запросов.

Если Вы программируете на Python, рассмотрите возможность отправки решения на PyPy, а не на Python, когда будете отправлять свой код.

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Первая строка каждого запроса содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество конфет.

Затем следует \(n\) строк, каждая из которых содержит два целых числа \(a_i\) и \(f_i\) (\(1 \le a_i \le n\), \(0 \le f_i \le 1\)), где \(a_i\) — тип \(i\)-й конфеты, а \(f_i\) обозначает, хотите ли вы оставить \(i\)-ю конфету себе (\(0\) — если вы хотите ее оставить, \(1\) — если вы вполне можете ее отдать).

Гарантируется, что сумма \(n\) по всем запросам не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите два целых числа:

  • максимальное количество конфет в подарке, соответствующем условию задачи;
  • максимальное количество конфет с \(f_i = 1\) в подарке с максимально возможным количеством конфет.
Примечание

В первом запросе можно собрать подарок из двух конфет типа \(4\) и одной конфеты типа \(5\). У всех этих конфет \(f_i = 1\).

C1. Хайди и тест Тьюринга (лёгкая)

реализация *1600

Киберлюди и Далеки долго были главными врагами Доктора. Все знают, что обе этих расы любят разрушать всё, что попадётся им под руку. Однако, сравнительно неизвестный факт заключается в том, что обе расы любят решать тесты Тьюринга!

Хайди придумала для них серию задач с увеличивающейся сложностью, в надежде, что это займёт их на достаточно много времени, чтобы Доктор успел спасти невинные жизни.

Забавная часть в том, что эти задачи весьма просто решить человеку.

Первая задача выглядит следующим образом. Даны точки на плоскости. Все точки, за исключением одной, лежат на границе квадрата со сторонами параллельными сторонам координат. Определите эту особую точку.

Входные данные

Первая строка содержит целое число \(n\) (\(2 \le n \le 10\)).

Каждая из следующих \(4n + 1\) строк содержит два целых числа \(x_i, y_i\) (\(0 \leq x_i, y_i \leq 50\)), задающие координаты очередной точки.

Гарантируется, что есть хотя бы \(n\) точек на каждой стороне квадрата, и что все \(4n + 1\) точек различны.

Выходные данные

Выведите два целых числа — координаты точки, которая не лежит на границе квадрата.

Примечание

В обоих примерах квадрат имеет четыре стороны \(x=0\), \(x=2\), \(y=0\), \(y=2\).

D1. Параллельные вселенные (лёгкая)

реализация *1600

Третий Доктор однажды правильно сказал, что путешествие между параллельными вселенными «подобно путешествию боком». Однако он ошибочно полагал, что существуют бесконечно много параллельных вселенных, тогда, как мы теперь все знаем, на самом деле их никогда не бывает больше 250.

Хайди недавно заполучила в свои руки инструмент для наблюдения за мультивселенной. Она смогла увидеть все \(n\) вселенных, выстроенные в ряд, с несуществующими связями между ними. Она также заметила, что Доктор находился в \(k\)-й Вселенной.

Инструмент также указывает, что из-за ограничений, возникающих из пространственно-временного разрыва, число вселенных никогда не будет превышать \(m\).

Очевидно, мультивселенная нестабильна из-за свободы воли. Каждый раз, когда кто-то принимает решение, происходит одно из двух: или создаётся параллельная мультивселенная, или ломается одна из несуществующих связей.

В частности,

  • Когда Вселенная создаётся, она встраивается или между двумя какими-то вселенными, или с одного из концов мультивселенной.
  • Когда ломается какая-то связь, это будет разрыв связи между двумя соседними вселенными. Таким образом, мультивселенная разбивается на два подотрезка, после чего подотрезок НЕ содержащий Доктора прекращает существовать.

Хайди хочет произвести симуляцию \(t\) решений. Каждый раз, когда кто-то принимает какое-то решение, Хайди хочет знать длину мультивселенной (иначе говоря, число вселенных) и текущую позицию Доктора.

Входные данные

Первая строка содержит целые числа \(n\), \(k\), \(m\) и \(t\) (\(2 \le k \le n \le m \le 250\), \(1 \le t \le 1000\)).

Каждая из следующих \(t\) строк одного из следующих видов:

  • «\(1\) \(i\)» (\(1 \le i \le l + 1\)), что обозначает что возникает новая вселенная на позиции \(i\), где \(l\) обозначает текущую длину мультивселенной.
  • «\(0\) \(i\)» (\(1 \le i \le l - 1\)), что обозначает что \(i\)-я связь разрывается, где \(l\) обозначает текущую длину мультивселенной.
Выходные данные

Выведите \(t\) строк. Каждая строка должна содержать \(l\) и \(k\) — текущую длину мультивселенной и текущую позиция Доктора.

Гарантируется, что последовательность действий всегда будет корректной, иначе говоря, мультивселенная будет всегда размера не более \(m\) и в момент разрыва связи будет хотя бы одна вселенная в мультивселенной.

Примечание

В примере мультивселенная изначально состояла из 5 вселенных, а Доктор находился во второй из них.

На первом шаге сломалась связь номер 1, тем самым в мультивселенной осталось 4 вселенные, с Доктором находящимся в первой из них.

Затем добавилась новая вселенная с левом края мультивселенной, тем самым увеличив длину мультивселенной до 5, а Доктор находится во второй вселенной.

Затем сломалась крайняя справа связь.

И, наконец, добавилась новая вселенная между первой и второй вселенными.

B. Письмо от Поликарпа

реализация Строки *1200

Мефодий получил от своего друга Поликарпа письмо по электронной почте. Однако у Поликарпа сломалась клавиатура: на его клавиатуре при однократном нажатии на клавишу соответствующий символ может появиться более одного раза (в то время, как на обычной клавиатуре однократное нажатие приводит к появлению ровно одного символа).

Например, в результате набора слова «hello» следующие слова могли оказаться набранными: «hello», «hhhhello», «hheeeellllooo», но следующие слова не могли оказаться набранными: «hell», «helo», «hhllllooo».

Обратите внимание, что при нажатии на клавишу символ обязательно появляется (возможно, более одного раза). Клавиатура сломана недетерменированным образом, то есть нажатие на одну и ту же клавишу в разные моменты времени может приводить к разному количеству появившихся букв.

Для каждого слова в письме Мефодий предположил, какое на самом деле слово хотел написать Поликарп, но он не уверен, что понял написанное правильно, поэтому он просит вас ему помочь.

Вам дан список пар слов. Для каждой пары определите, могло ли второе слово быть получено в результате набора первого слова на клавиатуре Поликарпа.

Входные данные

В первой строке входных данных содержится одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество пар слов для проверки. Далее содержатся \(n\) описаний пар слов.

В первой строке каждого описания записано непустое слово \(s\), состоящее из строчных латинских букв. Во второй строке записано непустое слово \(t\), состоящее из строчных латинских букв. Длина каждой из этих двух строк не превосходит \(10^6\).

Гарантируется, что суммарная длина всех слов \(s\) в тесте не превосходит \(10^6\). Аналогично, гарантируется, что суммарная длина всех слов \(t\) в тесте не превосходит \(10^6\).

Выходные данные

Выведите \(n\) строк. В \(i\)-й строке для \(i\)-й пары слов \(s\), \(t\) выведите YES, если при наборе слова \(s\) можно получить слово \(t\). Иначе, выведите NO.

D. Лишний элемент

математика реализация *1700

Последовательность \(a_1, a_2, \dots, a_k\) называется арифметической прогрессией, если для всех \(i\) от \(1\) до \(k\) верно равенство \(a_i = a_1 + c \cdot (i - 1)\) для некоторого числа \(c\).

Например, следующие пять последовательностей являются арифметическими прогрессиями: \([5, 7, 9, 11]\), \([101]\), \([101, 100, 99]\), \([13, 97]\) и \([5, 5, 5, 5, 5]\). Следующие четыре последовательности не являются арифметическими прогрессиями: \([3, 1, 2]\), \([1, 2, 4, 8]\), \([1, -1, 1, -1]\) и \([1, 2, 3, 3, 3]\).

Задана последовательность целых чисел \(b_1, b_2, \dots, b_n\). Найдите любой такой индекс \(j\) (\(1 \le j \le n\)), что если из заданной последовательности удалить элемент \(b_j\), то оставшийся \(n-1\) элемент можно переставить (переупорядочить) так, что получится арифметическая прогрессия. Если искомого индекса не существует, то выведите -1.

Входные данные

В первой строке входных данных записано целое число \(n\) (\(2 \le n \le 2\cdot10^5\)) — длина последовательности \(b\). Вторая строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(-10^9 \le b_i \le 10^9\)) — элементы последовательности \(b\).

Выходные данные

Выведите такой индекс \(j\) (\(1 \le j \le n\)), что если из заданной последовательности удалить \(j\)-й элемент, то оставшиеся элементы можно расставить в таком порядке, что получится арифметическая прогрессия. Если решений несколько, выведите любое из них. Если искомого индекса не существует, то выведите -1.

Примечание

Пояснение к первому примеру: если удалить \(4\)-й элемент, то из полученной последовательности можно составить арифметическую прогрессию \([2, 4, 6, 8]\).

Пояснение ко второму примеру: исходная последовательность уже является арифметической прогрессией, поэтому мы можем удалить либо \(1\)-й элемент, либо последний, и всё равно получим арифметическую прогрессию.

E. Поликарп и змейки

Перебор реализация *2000

После тяжёлой рабочий недели Поликарп предпочитает развлечься. Любимое развлечение Поликарпа — это рисование змеек. Поэтому он берёт прямоугольный лист клетчатой бумаги размера \(n \times m\) (\(n\) — количество строк, \(m\) — количество столбцов) и начинает рисовать змей в клеточках.

Поликарп рисует змеек строчными латинскими буквами. Первую змейку он всегда рисует символом 'a', вторую змейку он рисует символом 'b', третью — символом 'c' и так далее. Все змейки имеют свой уникальный символ. Так как в латинице всего \(26\) букв, а Поликарп очень уставший и не хочет придумывать новые символы, то суммарное количество нарисованных змеек не превосходит \(26\).

Поскольку к концу недели Поликарп очень уставший, то он рисует змеек прямыми линиями, без изгибов. Таким образом, каждая змейка может располагаться либо вертикально, либо горизонтально. Ширина любой змейки всегда равна \(1\), то есть каждая змейка имеет размеры либо \(1 \times l\), либо \(l \times 1\), где \(l\) — её длина. Обратите внимание, что изгибаться змейки не могут.

Когда Поликарп рисует очередную змейку, то его новая змейка может использовать клетки, в которых до этого были нарисованы другие змейки. В этом случае новую змейку он рисует «поверх», затирая предыдущее значение в клетке.

Недавно на работе Поликарп нашёл лист клетчатой бумаги с латинскими буквами. Ему стало интересно, мог ли этот лист получиться из пустого путём рисования на нём некоторого количества змеек по описанным выше правилам. Если ответ положительный, то ему также интересен способ рисования этих змеек.

Входные данные

В первой строке входных данных содержится целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных в тесте. Далее содержатся описания \(t\) наборов.

В первой строке описания набора содержатся два целых числа \(n\), \(m\) (\(1 \le n,m \le 2000\)) — длина и ширина клетчатого листа, соответственно.

В каждой из последующих \(n\) строк описания набора содержатся \(m\) символов, отвечающих за содержимое соответствующей клетки на листе. Это может быть либо строчная латинская буква, либо символ точка ('.'), обозначающий пустую клетку.

Гарантируется, что суммарная площадь всех листов в одном тесте не превосходит \(4\cdot10^6\).

Выходные данные

Выведите ответ для каждого из набора входных данных.

В первой строке ответа выведите YES, если существует способ нарисовать змеек так, чтобы получить в точности лист из набора входных данных. Если искомого способа не существует, то выведите NO.

В случае положительного ответа выведите его в следующем формате. В следующей строке выведите целое число \(k\) (\(0 \le k \le 26\)) — количество змеек. В следующих \(k\) строках выведите по четыре целых числа \(r_{1,i}\), \(c_{1,i}\), \(r_{2,i}\) и \(c_{2,i}\) — координаты крайних клеток \(i\)-й змейки (\(1 \le r_{1,i}, r_{2,i} \le n\), \(1 \le c_{1,i}, c_{2,i} \le m\)). Змейки должны быть выведены в порядке их рисования. Если ответов несколько, выведите любой из них.

Обратите внимание, что Поликарп начинает процесс рисования змеек с чистого (пустого) листа.

A. Казак Вус и контест

реализация *800

Казак Вус проводит соревнование по программированию, в котором участвуют \(n\) людей. Он решил наградить их всех ручками и блокнотами. Известно, что у Вуса есть ровно \(m\) ручек и \(k\) блокнотов.

Определите, может ли Казак наградить всех участников, давая каждому из них как минимум по одной ручке и как минимум по одному блокноту.

Входные данные

Первая строка содержит три целых числа \(n\), \(m\), \(k\) (\(1 \leq n, m, k \leq 100\)) — количество участников, ручек и блокнотов соответственно.

Выходные данные

Выведите «Yes», если возможно наградить всех участников. Иначе выведите «No».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере \(5\) участников. У Казака есть \(8\) ручек и \(6\) блокнотов. Поэтому у него достаточное количество ручек и блокнотов.

Во втором примере \(3\) участников. У Казака есть \(9\) ручек и \(3\) блокнотов. У него более чем нужно ручек и минимально возможное количество блокнотов.

В третьем примере \(8\) участников, но только \(5\) ручек. Так как у Казака нет достаточного количества ручек, ответ «No».

C. Казак Вус и строки

математика реализация *1800

У Казака Вуса есть две бинарные строки, то есть строки, которые состоят только из «0» и «1». Назовем эти строки \(a\) и \(b\). Известно, что \(|b| \leq |a|\), то есть длина \(b\) не более \(a\).

Казак рассматривает каждую подстроку длины \(|b|\) строки \(a\). Назовем эту подстроку \(c\). Он сопоставляет соответствующие символы в \(b\) и \(c\), после чего считает количество позиций, где эти две строки различны. Назовем эту функцию \(f(b, c)\).

Например, пусть \(b = 00110\), а \(c = 11000\). В этих строках первая, вторая, третья и четвертая позиции различны.

Казак Вус считает количество таких подстрок \(c\), что \(f(b, c)\) — четное.

Например, пусть \(a = 01100010\), а \(b = 00110\). У \(a\) есть четыре подстроки длины \(|b|\): \(01100\), \(11000\), \(10001\), \(00010\).

  • \(f(00110, 01100) = 2\);
  • \(f(00110, 11000) = 4\);
  • \(f(00110, 10001) = 4\);
  • \(f(00110, 00010) = 1\).

Поскольку в трех подстроках \(f(b, c)\) четное, то ответ — \(3\).

Вус не умеет находить ответ для больших строк, поэтому просит вас помочь ему в этом.

Входные данные

Первая строка содержит бинарную строку \(a\) (\(1 \leq |a| \leq 10^6\)) — первая строка.

Вторая строка содержит бинарную строку \(b\) (\(1 \leq |b| \leq |a|\)) — вторая строка.

Выходные данные

Выведите одно целое число — ответ на задачу.

Примечание

Первый пример объяснен в легенде.

Во втором примере подходят подстроки \(1010\), \(0101\), \(1111\), \(1111\).

E. Казак Вус и поле

математика разделяй и властвуй реализация *2500

У Казака Вуса есть поле с размерами \(n \times m\), которое состоит из «0» и «1». Он строит из этого поля бесконечное поле. Это он делает так:

  1. Берет текущее поле и находит для него новое инвертированное поле. Другими словами, в новом поле будет «1» там, где был «0», а «0» там, где был «1».
  2. К начальному полю приписывает справа инвертированное поле.
  3. К начальному полю приписывает снизу инвертированное поле.
  4. К начальному полю приписывает справа снизу начальное поле.
  5. Повторяет все это.

Например, если начальное поле было таким:

\(\begin{matrix} 1 & 0 & \\ 1 & 1 & \\ \end{matrix}\)

После первой итерации оно станет таким:

\(\begin{matrix} 1 & 0 & 0 & 1 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 1 & 1 \\ \end{matrix}\)

После второй итерации оно станет таким:

\(\begin{matrix} 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ 1 & 1 & 0 & 0 & 0 & 0 & 1 & 1 \\ 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 & 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 1 & 1 & 1 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ 1 & 1 & 0& 0 & 0 & 0 & 1 & 1 \\ \end{matrix}\)

И так далее...

Пронумеруем строки сверху вниз от \(1\) до бесконечности, а столбцы слева направо от \(1\) до бесконечности. Назовем подматрицей \((x_1, y_1, x_2, y_2)\) все числа, которые имеют координаты \((x, y)\), такие что \(x_1 \leq x \leq x_2\) и \(y_1 \leq y \leq y_2\).

Казаку иногда нужно находить сумму всех чисел на подматрицах. Так как он очень занят сейчас, помогите ему найти ответы!

Входные данные

Первая строка содержит три целых числа \(n\), \(m\), \(q\) (\(1 \leq n, m \leq 1\,000\), \(1 \leq q \leq 10^5\)) — размеры начальной матрицы и количество запросов.

Каждая из следующих \(n\) строк содержит \(m\) символов \(c_{ij}\) (\(0 \leq c_{ij} \leq 1\)) — символы в матрице.

Каждая из следующих \(q\) строк содержит четыре числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(1 \leq x_1 \leq x_2 \leq 10^9\), \(1 \leq y_1 \leq y_2 \leq 10^9\)) — координаты верхней левой крайней точки и нижней правой, между которыми нужно найти сумму всех чисел.

Выходные данные

Для каждого запроса выведите ответ.

Примечание

Первый пример объяснен в легенде.

F. Казак Вус и граф

графы жадные алгоритмы поиск в глубину и подобное реализация *2400

У Казака Вуса есть простой граф из \(n\) вершин и \(m\) ребер. Пусть \(d_i\) — степень \(i\)-й вершины. Напомним, что степень вершины \(i\) — это количество прилагаемых ребер к вершине \(i\).

Ему нужно оставить не более \(\lceil \frac{n+m}{2} \rceil\) ребер. Пусть \(f_i\) — степень \(i\)-й вершины после удаления. Нужно удалить ребра так, чтобы \(\lceil \frac{d_i}{2} \rceil \leq f_i\) для каждого \(i\). Другими словами, нужно чтобы степень каждой вершины уменьшилась на не более чем в два раза.

Помогите Вусу оставить правильное количество ребер!

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 10^6\), \(0 \leq m \leq 10^6\)) — количество вершин и ребер соответственно.

Каждая из следующих \(m\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)) — вершины, между которыми находиться ребро.

Гарантируется, что в графе нет петель и кратных ребер.

Выходные данные

В первой строке выведите одно целое число \(k\) (\(0 \leq k \leq \lceil \frac{n+m}{2} \rceil\)) — количество ребер, которые нужно оставить.

В каждой из следующих \(k\) строк выведите по два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)) — вершины, ребро между которыми нужно оставить. Нельзя выводить одно и то же ребро два или более раза.

B. Магазин букв

Бинарный поиск реализация Строки *1300

Витрина магазина букв — это строка \(s\), состоящая из \(n\) строчных латинских букв. Как следует из названия, в магазине продаются буквы.

Буквы продают одну за другой последовательно от первой (самой левой) буквы до последней (самой правой). Любой покупатель может купить только некоторый префикс букв из строки \(s\).

Есть \(m\) друзей, \(i\)-го из них зовут \(t_i\). Каждый из них хочет оценить следующую величину: если он/а придёт в магазин и будет покупать буквы одну за другой с целью написать своё имя, то сколько букв (длина кратчайшего префикса) ей/ему придётся купить? Своё имя можно написать, если в наличии есть все буквы имени (в количестве равном или большем необходимого).

  • Например, если \(s\)arrayhead», а имя \(t_i\)arya», то придётся купить \(5\) букв. («arrayhead»).
  • Например, если \(s\)arrayhead», а имя \(t_i\)harry», то придётся купить \(6\) букв («arrayhead»).
  • Например, если \(s\)arrayhead», а имя \(t_i\)ray», то придётся купить \(5\) букв («arrayhead»).
  • Например, если \(s\)arrayhead», а имя \(t_i\)r», то придётся купить \(2\) буквы («arrayhead»).
  • Например, если \(s\)arrayhead», а имя \(t_i\)areahydra», то придётся купить все \(9\) буквы («arrayhead»).

Гарантируется, что каждый друг может написать свое имя, используя буквы из строки \(s\).

Обратите внимание, что ответы для друзей надо находить независимо (друзья только лишь оценивают ситуации, но не покупают буквы).

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина строки \(s\).

Во второй строке записана строка \(s\), она состоит из ровно \(n\) строчных латинских букв.

В третьей строке записано одно целое число \(m\) (\(1 \le m \le 5 \cdot 10^4\)) — количество друзей.

В \(i\)-й из следующих \(m\) строк записано \(t_i\) (\(1 \le |t_i| \le 2 \cdot 10^5\)) — имя \(i\)-го друга.

Гарантируется, что \(\sum \limits_{i=1}^m |t_i| \le 2 \cdot 10^5\).

Выходные данные

Для каждого друга выведите длину кратчайшего префикса \(s\), которую ей/ему придётся купить, чтобы написать свое имя. Своё имя можно написать, если в наличии есть все буквы имени (в количестве равном или большем необходимого).

Гарантируется, что каждый друг может написать свое имя, используя буквы из строки \(s\).

C. Вася и массив

жадные алгоритмы Конструктив реализация *1800

У Васи есть массив \(a_1, a_2, \dots, a_n\).

Вы не знаете, что это за массив, но Вася сообщил вам \(m\) фактов об этом массиве. \(i\)-й факт – это тройка чисел \(t_i\), \(l_i\) и \(r_i\) (\(0 \le t_i \le 1, 1 \le l_i < r_i \le n\)) которая означает:

  • если \(t_i=1\), то подотрезок массива \(a_{l_i}, a_{l_i + 1}, \dots, a_{r_i}\) отсортирован в порядке неубывания;
  • если \(t_i=0\), то подотрезок массива \(a_{l_i}, a_{l_i + 1}, \dots, a_{r_i}\) не отсортирован в порядке неубывания. Подотрезок считается неотсортированным, если найдется пара соседних элементов такая, что первый элемент больше второго.

Например, если \(a = [2, 1, 1, 3, 2]\) то можно дать три следующих факта: \(t_1=1, l_1=2, r_1=4\) (подотрезок массива \([a_2, a_3, a_4] = [1, 1, 3]\) отсортирован), \(t_2=0, l_2=4, r_2=5\) (подотрезок массива \([a_4, a_5] = [3, 2]\) не отсортирован), и \(t_3=0, l_3=3, r_3=5\) (подотрезок массива \([a_3, a_5] = [1, 3, 2]\) не отсортирован).

Вы не знаете массив \(a\). Найдите любой массив, удовлетворяющий всем фактам.

Входные данные

Первая строка содержит два числа \(n\) и \(m\) (\(2 \le n \le 1000, 1 \le m \le 1000\)).

Следующие \(m\) строк содержат по три числа \(t_i\), \(l_i\) и \(r_i\) (\(0 \le t_i \le 1, 1 \le l_i < r_i \le n\)).

Если \(t_i = 1\), то подотрезок массива \(a_{l_i}, a_{l_i + 1}, \dots , a_{r_i}\) отсортирован. Иначе (если \(t_i = 0\)) подотрезок массива \(a_{l_i}, a_{l_i + 1}, \dots , a_{r_i}\) не отсортирован.

Выходные данные

Если не существует массива, удовлетворяющего всем фактам, в единственной строке выведите NO (в любом регистре).

Если такой массив существует, в первой строке выведите YES (в любом регистре). Во второй строке выведите \(n\) чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — массив \(a\), удовлетворяющий всем фактам. Если существует несколько подходящих массивов, выведите любой.

A2. Прибавление на дереве: революция

Деревья Конструктив поиск в глубину и подобное реализация *2500

Обратите внимание, что это вторая задача из двух похожих задач. Вы можете взламывать эту задачу тогда, когда решите ее. Но предыдущую только тогда, когда решите обе задачи.

Вам дано дерево с \(n\) вершинами. Изначально на каждом ребре написан \(0\). За одну операцию вы можете выбрать любые \(2\) различных листа \(u\), \(v\) и любое целое число \(x\), и прибавить \(x\) ко всем числам записанных на ребрах на простом пути с \(u\) до \(v\). Обратите внимание, что в предыдущей подзадаче \(x\) могло быть любым действительным, теперь оно должно быть целым.

Для примера на изображении ниже показан результат применения двух операций к графу: прибавления \(2\) на пути от \(7\) до \(6\), а потом прибавления \(-1\) на пути от \(4\) до \(5\).

Вам дана некоторая конфигурация из неотрицательных целых, попарно различных, четных чисел, записанных на ребрах. Для заданной конфигурации необходимо сказать, можно ли получить ее с помощью данных операций, и, если это возможно, вывести последовательность операций, которая приводит к заданной конфигурации. Ограничения на операции смотрите в формате вывода.

Лист это вершина степени \(1\). Простой путь это путь, не содержащий ни одну вершину дважды.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 1000\)) — количество вершин в дереве.

Каждая из следующих \(n-1\) строк содержит три целых числа \(u\), \(v\), \(val\) (\(1 \le u, v \le n\), \(u \neq v\), \(0 \le val \le 10\,000\)), обозначающие что между вершинами \(u\) и \(v\) есть ребро, на котором в заданной конфигурации написано \(val\). Гарантируется, что данные ребра образуют дерево. Гарантируется, что все числа \(val\) различные и четные.

Выходные данные

Если требуемой последовательности операций не существует, в первой строке выведите «NO».

Если же она существует, в первой строке выведите «YES». Во второй строке выведите \(m\) — количество операций, которое вы собираетесь применить (\(0 \le m \le 10^5\)). Заметьте, что минимизировать количество операций не требуется!

В следующих \(m\) строках выведите операции в следующем формате:

\(u, v, x\) (\(1 \le u, v \le n\), \(u \not = v\), \(x\) — целое число, \(-10^9 \le x \le 10^9\)), где \(u, v\) — листья, \(x\) — прибавляемое число.

Гарантируется, что если существует последовательность операций, дающая заданную конфигурацию, то существует и последовательность операций, дающая ее, которая удовлетворяет всем заданными ограничениям.

Примечание

Конфигурация с первого примера нарисована ниже, и ее невозможно достичь.

Последовательность операций с второго примера иллюстрирована ниже.

C. Конфеты!

дп математика реализация Структуры данных *1400

Рассмотрим последовательность цифр длины \(2^k\) \([a_1, a_2, \ldots, a_{2^k}]\). Будем выполнять с ней следующую операцию: заменить пару \((a_{2i+1}, a_{2i+2})\) на \((a_{2i+1} + a_{2i+2})\bmod 10\) для \(0\le i<2^{k-1}\). За каждое \(i\) такое, что \(a_{2i+1} + a_{2i+2}\ge 10\), мы получаем конфету! В результате, мы получим последовательность цифр длины \(2^{k-1}\).

Менее формально, последовательность длины \(2^k\) мы разбиваем на \(2^{k-1}\) пар, каждая из которых состоит из двух чисел: первая пара состоит из первых двух чисел, вторая из третьего и четвертого, \(\ldots\), последняя пара состоит из (\(2^k-1\))-го и (\(2^k\))-го чисел. За каждую пару, сумма чисел в которой не менее \(10\), мы получаем конфету. После этого, мы заменяем каждую пару чисел на остаток от деления их суммы на \(10\) (при этом сохраняем порядок чисел).

Будем выполнять данную операцию с последовательностью, пока она не станет длины \(1\). Пусть \(f([a_1, a_2, \ldots, a_{2^k}])\) обозначает количество конфет, которые мы получим в процессе.

К примеру: если изначальной последовательностью была \([8, 7, 3, 1, 7, 0, 9, 4]\), то:

После первой операции последовательность станет \([(8 + 7)\bmod 10, (3 + 1)\bmod 10, (7 + 0)\bmod 10, (9 + 4)\bmod 10]\) \(=\) \([5, 4, 7, 3]\), и мы получим \(2\) конфеты так как \(8 + 7 \ge 10\) и \(9 + 4 \ge 10\).

После второй операции последовательность станет \([(5 + 4)\bmod 10, (7 + 3)\bmod 10]\) \(=\) \([9, 0]\), и мы получим еще одну конфету так как \(7 + 3 \ge 10\).

После последней операции последовательность станет \([(9 + 0) \bmod 10]\) \(=\) \([9]\).

Следовательно, \(f([8, 7, 3, 1, 7, 0, 9, 4]) = 3\), так как мы получили всего \(3\) конфеты.

Вам дана последовательность цифр длины \(n\) \(s_1, s_2, \ldots s_n\). Вы должны ответить на \(q\) запросов вида \((l_i, r_i)\), где для \(i\)-го запроса вы должны вывести \(f([s_{l_i}, s_{l_i+1}, \ldots, s_{r_i}])\). Гарантируется, что \(r_i-l_i+1\) имеет вид \(2^k\) для некоторого неотрицательного целого \(k\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — длину последовательности.

Вторая строка содержит \(n\) цифр \(s_1, s_2, \ldots, s_n\) (\(0 \le s_i \le 9\)).

Третья строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

Каждая из следующих \(q\) строк содержит два целых числа \(l_i\), \(r_i\) (\(1 \le l_i \le r_i \le n\)) — \(i\)-й запрос. Гарантируется, что \(r_i-l_i+1\) является неотрицательной целой степенью \(2\).

Выходные данные

Выведите \(q\) строк, в \(i\)-й строке выведите единственное число — \(f([s_{l_i}, s_{l_i + 1}, \ldots, s_{r_i}])\), ответ на \(i\)-й запрос.

Примечание

Первый пример иллюстрирует пример из условия

\(f([7, 3, 1, 7]) = 1\): последовательность операций такая — \([7, 3, 1, 7] \to [(7 + 3)\bmod 10, (1 + 7)\bmod 10]\) \(=\) \([0, 8]\) и одна конфета так как \(7 + 3 \ge 10\) \(\to\) \([(0 + 8) \bmod 10]\) \(=\) \([8]\), поэтому мы получаем всего \(1\) конфету.

\(f([9]) = 0\), так как мы не выполняем с ним операции.

A. Эпическая игра

реализация *800

Семен и Антисемен играют в игру. Изначально каждому игроку дано одно фиксированное целое положительное число, которое не меняется в процессе игры. Семену дано число a, Антисемену дано число b. Также у них есть кучка из n камней. Игроки ходят по очереди, первый ход делает Семен. На своем ходу игрок должен взять из кучки число камней, равное наибольшему общему делителю данного ему числа и количества оставшихся камней в кучке. Проигрывает тот, кто не сможет взять требуемое число камней (по причине того, что в кучке остается строго меньше камней, чем нужно взять).

Ваша задача — по заданным a, b и n определить, кто выиграет в этой игре.

Входные данные

В единственной строке через пробел записаны целые числа a, b и n (1 ≤ a, b, n ≤ 100) — числа, данные Семену и Антисемену соответственно, и исходное количество камней в кучке.

Выходные данные

Если выиграет Семен, выведите «0» (без кавычек), иначе выведите «1» (без кавычек).

Примечание

Наибольшим общим делителем двух неотрицательных целых чисел a и b называется такое наибольшее положительное целое число k, что a делится на k без остатка, и, аналогично, b делится на k без остатка. Обозначим через gcd(a, b) операцию вычисления наибольшего общего делителя чисел a и b. В частности, gcd(x, 0) = gcd(0, x) = x.

В первом примере игра будет идти следующим образом:

  • Семен должен взять из кучки gcd(3, 9) = 3 камня. После его хода в кучке остается 6 камней.
  • Антисемен должен взять из кучки gcd(5, 6) = 1 камень. После его хода в кучке остается 5 камней.
  • Семен должен взять из кучки gcd(3, 5) = 1 камень. После его хода в кучке остается 4 камня.
  • Антисемен должен взять из кучки gcd(5, 4) = 1 камня. После его хода в кучке остается 3 камня.
  • Семен должен взять из кучки gcd(3, 3) = 3 камня. После его хода в кучке остается 0 камней.
  • Антисемен должен взять из кучки gcd(5, 0) = 5 камня. Так как 0 < 5, это сделать невозможно, и Антисемен проигрывает.

Во втором примере каждый игрок на каждом ходу берет из кучки по одному камню. Так как n четное, последний камень возьмет Антисемен, а Семен после этого не сможет сделать ход.

B. Перед экзаменом

Конструктив реализация сортировки *1900

Через несколько минут Васе предстоит сдать первый в своей студенческой жизни экзамен — и не просто экзамен, а экзамен по математическому анализу. Разумеется, Вася сейчас думает только об одном: что его ждет при встрече с экзаменатором...

К экзамену необходимо было выучить доказательства n теорем. Известно, что на экзамене будет k билетов, в каждом из которых содержится различных теорем. Каждая теорема при этом входит не более чем в один билет (то есть теорем не попадут ни в один билет). В ходе экзамена один и тот же билет может достаться нескольким студентам.

Точное распределение теорем по билетам неизвестно, однако студенты, сдававшие экзамен до Васи, рассказали ему о содержании своих билетов. Сам Вася оценивает свой уровень знаний по i-ой теореме некоторым числом ai. Уровнем знаний по билету называется среднее арифметическое уровней знаний по всем теоремам из этого билета. Теперь на основе сведений, полученных от других студентов, Вася хочет определить минимально и максимально возможные уровни своих знаний по билету, который попадется ему на экзамене. К сожалению, у Васи уже нет времени на подсчеты, поэтому он попросил о помощи вас.

Входные данные

В первой строке записаны два целых числа n и k (1 ≤ k ≤ n ≤ 100) — количество теорем и количество билетов соответственно. Во второй строке содержится n целых чисел ai (0 ≤ ai ≤ 100), i-ое число (1 ≤ i ≤ n) соответствует уровню знаний Васи по i-ой теореме.

В третьей строке записано число q (0 ≤ q ≤ 100) — количество человек, сдававших экзамен до Васи. В каждой из последующих q строк находится описание билета очередного человека: целых чисел от 1 до n включительно — номера теорем из билета в соответствии с порядком их перечисления во входных данных. Номера могут быть заданы в произвольном порядке. Гарантируется, что заданные билеты корректны (то есть все теоремы в пределах одного билета различны, а билеты, доставшиеся разным людям, или не содержат одинаковых теорем, или совпадают с точностью до перестановки теорем).

Выходные данные

Выведите два вещественных числа — минимальный и максимальный уровни знаний Васи по билету, который достанется ему на экзамене. Абсолютная или относительная погрешность не должна превосходить 10 - 6.

Примечание

Разберем первый пример. Уровни знаний Васи по тем билетам, содержание которых уже известно, составляют 6 и 15.5 соответственно. Из оставшихся трех теорем можно сформировать только один билет. Рассмотрев все возможные варианты содержания этого билета, можно понять, что при наиболее благоприятном исходе экзамена Васе достанется билет, содержащий теоремы 4 и 7 (уровень знаний 15.5), а при наименее благоприятном — теоремы 3 и 5 (уровень знаний 5).

Операция x обозначает взятие целой части вещественного числа x (округление вниз).

A. Tokitsukaze и выбрасывание вещей

реализация *1400

Недавно Tokitsukaze нашла интересную игру. У Tokitsukaze было \(n\) вещей в начале игры. Тем не менее, она подумала, что их слишком много, поэтому она хочет выбросить \(m\) (\(1 \le m \le n\)) выбранных вещей среди них.

Эти \(n\) вещей пронумерованы от \(1\) до \(n\). Вначале вещь с индексом \(i\) лежит на \(i\)-й позиции. Вещи разделены на несколько страниц по порядку, так что каждая страница содержит ровно \(k\) позиций, и несколько позиций на последней странице могут быть пустыми.

Tokitsukaze будет совершать следующую операцию: обращать внимание на первую страницу, содержащую хотя бы одну выбранную вещь, и одновременно сбрасывать все выбранные вещи на этой странице. После того, как вещь выброшена или перемещена, ее старая позиция станет пуста, и после этого вещь за ней, если она существует, передвинется на эту пустую позицию. Это движение может перенести много вещей вперед, даже на предыдущие страницы, поэтому Tokitsukaze будет ждать, пока все вещи перестанут двигаться, и затем продолжит повторять эту операцию (проверять первую страницу с выбранными предметами и удалять их) пока не останется вещей, которые нужно выбросить.

Рассмотрим первые пример из условия: \(n=10\), \(m=4\), \(k=5\), \(p=[3, 5, 7, 10]\). Есть две страницы. Изначально первая страница содержит выбранную вещь. Поэтому Tokitsukaze выбрасывает выбранные вещи \(3\) и \(5\). После этого, первая страница все еще содержит выбранную вещь, однако теперь другую. Она содержит \([1, 2, 4, 6, 7]\), Tokitsukaze выбрасывает выбранную вещь под номером \(7\). Затем, Tokitsukaze интересна вторая страница (поскольку это первая страница, содержащая выбранную вещь). Она содержит \([9, 10]\), Tokitsukaze выбрасывает выбранную вещь \(10\).

Tokitsukaze хочет узнать, сколько всего операций она совершит в ходе этого процесса.

Входные данные

В первой строке записаны три целых числа \(n\), \(m\) и \(k\) (\(1 \le n \le 10^{18}\), \(1 \le m \le 10^5\), \(1 \le m, k \le n\)) — количество вещей, количество выбранных вещей и количество позиций на каждой странице.

Во второй строке записаны \(m\) различных целых чисел \(p_1, p_2, \ldots, p_m\) (\(1 \le p_1 < p_2 < \ldots < p_m \le n\)) — индексы выбранных вещей.

Выходные данные

Выведите одно число — количество операций, которые суммарно сделает Tokitsukaze.

Примечание

Первый пример был разобран в условии.

Во втором примере Tokitsukaze обратит внимание на вторую страницу \([6, 7, 8, 9, 10]\) и удалит все выбранные вещи за одну операцию.

B. Tokitsukaze и маджонг

Перебор реализация *1200

Tokitsukaze играет в игру, произошедшую от японской игры маджонг. В этой игре у нее в руке есть три тайла. Каждый тайл имеет масть (manzu, pinzu или souzu) и число (цифра от \(1\) до \(9\)). В этой задаче мы используем одну цифру и одну букву нижнего регистра, являющуюся первой буквой масти, для представления тайла. Все возможные тайлы представляются комбинациями 1m, 2m, \(\ldots\), 9m, 1p, 2p, \(\ldots\), 9p, 1s, 2s, \(\ldots\), 9s.

Для того, чтобы выиграть, Tokitsukaze должна иметь хотя бы одно mentsu (определение ниже) в руке, поэтому иногда ей нужно брать дополнительные тайлы. Она может взять сколько угодно каких угодно тайлов, даже тех, которые уже есть в ее руке.

Вычислите минимальное количество дополнительных тайлов, которое ей нужно взять чтобы выиграть.

Вот некоторые полезные определения, связанные с этой игрой:

  • Mentsu, также известное как слияние, это либо koutsu, либо shuntsu;
  • Koutsu, также известное как тройка, это три идентичных тайла, например [1m, 1m, 1m], однако [1m, 1p, 1s] и [1m, 4m, 7m] НЕ являются koutsu;
  • Shuntsu, также известное как последовательность, это три последовательно пронумерованных тайла одной масти, например [1m, 2m, 3m] или [5s, 7s, 6s], однако [9m, 1m, 2m] и [1m, 2p, 3s] НЕ являются shuntsu.

Немного примеров:

  • [2m, 3p, 2s, 4m, 1s, 2s, 4s] не содержит ни koutsu, ни shuntsu, поэтому не содержит mentsu;
  • [4s, 3m, 3p, 4s, 5p, 4s, 5p] содержит koutsu [4s, 4s, 4s], не содержит shuntsu, поэтому содержит mentsu;
  • [5p, 5s, 9m, 4p, 1s, 7p, 7m, 6p] не содержит koutsu, но содержит shuntsu: [5p, 4p, 6p] или [5p, 7p, 6p], поэтому это mentsu.

Заметим, что порядок тайлов в руке не важен, и можно предполагать, что количество каждого типа тайлов, которые она может взять, неограничено.

Входные данные

В единственной строке записаны три строки — тайлы в руке Tokitsukaze. В каждой строке первый символ является цифрой от \(1\) до \(9\), а второй — m, p или s.

Выходные данные

Выведите единственное число — минимальное количество дополнительных тайлов, которое ей нужно взять.

Примечание

В первом примере у Tokitsukaze уже есть shuntsu.

Во втором примере у Tokitsukaze уже есть koutsu.

В третьем примере Tokitsukaze может собрать shuntsu, если возьмет один тайл — 1p или 4p. Тогда список тайлов в ее руке будет [3p, 9m, 2p, 1p] или [3p, 9m, 2p, 4p].

B. Очередная задача про кресты

реализация *1300

Вам задана картинка, состоящая из \(n\) строк и \(m\) столбцов. Строки пронумерованы от \(1\) по \(n\) сверху вниз, столбцы — от \(1\) по \(m\) слева направо. Каждая клетка раскрашена в черный или белый цвет.

Вам кажется, что данная картинка недостаточно интересна. Вы считаете, что картинка интересная, если на ней изображен хотя бы один крест. Крест представляет из себя пару чисел \(x\) и \(y\), где \(1 \le x \le n\) и \(1 \le y \le m\), такие, что все клетки в строке \(x\) и все клетки в столбце \(y\) черного цвета.

Например, каждое из следующих изображений содержит кресты:

Четвертая картинка содержит 4 креста: в \((1, 3)\), \((1, 5)\), \((3, 3)\) и \((3, 5)\).

Следующие изображения не содержат крестов:

У вас имеется кисточка и банка черной краски и вы можете сделать вашу картинку интересней. Каждую минуту вы можете выбрать одну белую клетку и перекрасить ее в черный.

Какое минимальное количество минут вы должны потратить, чтобы в результате картинка стала содержать хотя бы один крест?

Обратите внимание, что вам нужно будет отвечать на несколько независимых запросов.

Входные данные

В первой строке задано число \(q\) (\(1 \le q \le 5 \cdot 10^4\)) — количество запросов.

В первой строке каждого запроса заданы два целых числа \(n\) и \(m\) (\(1 \le n, m \le 5 \cdot 10^4\), \(n \cdot m \le 4 \cdot 10^5\)) — количество строк и столбцов в картинке.

Каждая из последующих \(n\) строк содержат \(m\) символов: '.', если клетка белого цвета, и '*', если она черного цвета.

Гарантируется, что \(\sum n \le 5 \cdot 10^4\) и \(\sum n \cdot m \le 4 \cdot 10^5\).

Выходные данные

Выведите \(q\) строк, \(i\)-я строка должна содержать одно число — ответ на \(i\)-й запрос, который равен минимальному количеству минут, которое вам необходимо потратить, чтобы в результате картинка стала содержать хотя бы один крест.

Примечание

Пример содержит все картинки из условия в том же порядке.

Первые 5 изображений уже содержат кресты, а потому вам не нужно ничего перекрашивать.

Вы можете перекрасить \((1, 3)\), \((3, 1)\), \((5, 3)\) и \((3, 5)\) на \(6\)-й картинке, чтобы получить крест в \((3, 3)\). Это займет у вас \(4\) минуты.

Вы можете перекрасить \((1, 2)\) на \(7\)-м изображении, чтобы получить крест в \((4, 2)\).

Вы можете перекрасить \((2, 2)\) на \(8\)-й картинке, чтобы получить крест в \((2, 2)\). Либо же вы можете закрасить \((1, 3)\), \((3, 1)\) и \((3, 3)\) для креста в \((3, 3)\), но это займет \(3\) минуты против \(1\)-й в первом варианте.

На \(9\)-й картинке мы можете получить за минимальное время один из 9 крестов. Например, в \((1, 1)\): понадобится закрасить \((1, 2)\) и \((2, 1)\).

C. От S к T

реализация Строки *1300

У вас есть три строки \(s\), \(t\) и \(p\), состоящие из строчных букв латинского алфавита. Вы можете выполнять любое количество (возможно, нулевое) операций над этими строками.

Каждая операция выглядит следующим образом: вы выбираете любой символ из строки \(p\), удаляете его из \(p\) и вставляете в любую позицию строки \(s\) (вы можете вставить этот символ куда захотите: в начало \(s\), в конец или между любыми двумя подряд идущими символами).

Например, если \(p\) — это aba, и \(s\) — это de, тогда возможны следующие варианты (символ, удаленный из \(p\) и вставленный в \(s\), выделен жирным шрифтом):

  • aba \(\rightarrow\) ba, de \(\rightarrow\) ade;
  • aba \(\rightarrow\) ba, de \(\rightarrow\) dae;
  • aba \(\rightarrow\) ba, de \(\rightarrow\) dea;
  • aba \(\rightarrow\) aa, de \(\rightarrow\) bde;
  • aba \(\rightarrow\) aa, de \(\rightarrow\) dbe;
  • aba \(\rightarrow\) aa, de \(\rightarrow\) deb;
  • aba \(\rightarrow\) ab, de \(\rightarrow\) ade;
  • aba \(\rightarrow\) ab, de \(\rightarrow\) dae;
  • aba \(\rightarrow\) ab, de \(\rightarrow\) dea;

Вам нужно выполнить несколько (возможно, ноль) операций так, чтобы строка \(s\) стала равна строке \(t\). Определите, возможно ли это.

Обратите внимание, что вам нужно ответить на \(q\) независимых запросов.

Входные данные

Первая строка содержит целое число \(q\) (\(1 \le q \le 100\)) — количество запросов. Каждый запрос содержит три строки.

Первая строка каждого запроса содержит строку \(s\) (\(1 \le |s| \le 100\)), состоящую из строчных букв латинского алфавита.

Вторая строка каждого запроса содержит строку \(t\) (\(1 \le |t| \le 100\)), состоящую из строчных букв латинского алфавита

Третья строка каждого запроса содержит строку \(p\) (\(1 \le |p| \le 100\)), состоящую из строчных букв латинского алфавита.

Выходные данные

Для каждого запросы выведите YES, если возможно превратить строку \(s\) в строку \(t\), и NO в противном случае.

Ответ можете выводить в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ на запрос).

Примечание

В первом запросе возможна следующая последовательность операций:

  1. \(s = \) ab, \(t = \) acxb, \(p = \) cax;
  2. \(s = \) acb, \(t = \) acxb, \(p = \) ax;
  3. \(s = \) acxb, \(t = \) acxb, \(p = \) a.

Во втрором запросе возможна следующая последовательность операций:

  1. \(s = \) a, \(t = \) aaaa, \(p = \) aaabbcc;
  2. \(s = \) aa, \(t = \) aaaa, \(p = \) aabbcc;
  3. \(s = \) aaa, \(t = \) aaaa, \(p = \) abbcc;
  4. \(s = \) aaaa, \(t = \) aaaa, \(p = \) bbcc.

C. Побег роботов

реализация *1500

\(n\) роботов сбежали из вашей лаборатории! Вам необходимо найти их так быстро, как только возможно, потому что эти роботы являются экспериментальными, и их поведение еще не тестировалось, поэтому они могут быть очень опасны!

К счастью, даже несмотря на то что ваши роботы сбежали, вы все равно имеете над ними некоторый контроль. Во-первых, вы знаете локацию каждого робота: мир, в котором вы живете, может быть представлен в виде бесконечной координатной плоскости, и \(i\)-й робот сейчас находится в точке, имеющей координаты (\(x_i\), \(y_i\)). Более того, вы можете отправить ровно одну команду всем роботам сразу. Команда должна содержать два целых числа \(X\) и \(Y\), и когда каждый робот получит эту команду, он начнет двигаться вперед к точке, имеющей координаты (\(X\), \(Y\)). Робот прекращает движение в двух случаях:

  • либо он достиг точки (\(X\), \(Y\));
  • либо он не может подойти ближе к точке (\(X\), \(Y\)).

В обычной ситуации все роботы должны уметь передвигаться от одной точки координатной плоскости к любой другой. Каждый робот может выполнять четыре действия для передвижения. Обозначим текущую локацию робота как (\(x_c\), \(y_c\)). Тогда система движения позволяет ему двигаться в любую из четырех соседних точек:

  1. первое действие позволяет ему двигаться из (\(x_c\), \(y_c\)) в (\(x_c - 1\), \(y_c\));
  2. второе действие позволяет ему двигаться из (\(x_c\), \(y_c\)) в (\(x_c\), \(y_c + 1\));
  3. третье действие позволяет ему двигаться из (\(x_c\), \(y_c\)) в (\(x_c + 1\), \(y_c\));
  4. четвертое действие позволяет ему двигаться из (\(x_c\), \(y_c\)) в (\(x_c\), \(y_c - 1\)).

К сожалению, похоже, что системы движения некоторых роботов работают неисправно. Для каждого робота вы знаете, какие действия он может выполнять, а какие — нет.

Вы хотите отправить команду всем роботам таким образом, чтобы они встретились в одной точке. Чтобы сделать это, вам необходимо выбрать два целых числа \(X\) и \(Y\) такие, что каждый робот может достичь точку (\(X\), \(Y\)). Возможно ли выбрать такую точку?

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

Затем следуют \(q\) запросов. Каждый запрос начинается с одной строки, содержащий одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество роботов в запросе. Затем следуют \(n\) строк, \(i\)-я из них описывает \(i\)-го робота в текущем запросе: она содержит шесть целых чисел \(x_i\), \(y_i\), \(f_{i, 1}\), \(f_{i, 2}\), \(f_{i, 3}\) и \(f_{i, 4}\) (\(-10^5 \le x_i, y_i \le 10^5\), \(0 \le f_{i, j} \le 1\)). Первые два числа описывают изначальную локацию \(i\)-го робота, а следующие четыре числа описывают, какие действия \(i\)-й робот может совершать для передвижения (\(f_{i, j} = 1\), если \(i\)-й робот может использовать \(j\)-е действие, и \(f_{i, j} = 0\), если он не может использовать \(j\)-е действие).

Гарантируется, что суммарное количество роботов во всех запросах не превосходит \(10^5\).

Выходные данные

Вы должны отвечать на запросы независимо в порядке следования этих запросов во входных данных.

Чтобы ответить на запрос, вам необходимо совершить одно из следующих действий:

  • если невозможно найти такую точку, которая достижима всеми \(n\) роботами, выведите одно целое число \(0\) в отдельной строке;
  • если возможно найти такую точку, которая достижима всеми \(n\) роботами, в отдельной строке выведите три целых числа, разделенных пробелами: \(1\) \(X\) \(Y\), где \(X\) и \(Y\) — координаты точки, достижимой всеми \(n\) роботами. И \(X\), и \(Y\) должны не превосходить \(10^5\) по абсолютной величине; гарантируется, что если существует хотя бы одна точка, достижимая всеми роботами, то найдется хотя бы одна точка, имеющая обе координаты, не превосходящие \(10^5\) по абсолютной величине.

D1. Подстрока RGB (простая версия)

реализация *1500

Единственное отличие между простой и сложной версиями — размер входных данных.

Вам задана строка \(s\), состоящая из \(n\) символов, каждый символ равен 'R', 'G' или 'B'.

Вам также задано целое число \(k\). Ваша задача — изменить минимальное количество символов в изначальной строке \(s\) таким образом, что после этих изменений найдется строка длины \(k\) такая, что она является и подстрокой \(s\), и подстрокой бесконечной строки «RGBRGBRGB ...».

Строка \(a\) называется подстрокой \(b\), если существует положительное целое число \(i\), что \(a_1 = b_i\), \(a_2 = b_{i + 1}\), \(a_3 = b_{i + 2}\), ..., \(a_{|a|} = b_{i + |a| - 1}\). Например, строки «GBRG», «B», «BR» являются подстроками бесконечной строки «RGBRGBRGB ...»,а строки «GR», «RGR» и «GGG» — нет.

Вам необходимо ответить на \(q\) независимых запросов.

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 2000\)) — количество запросов. Затем следуют \(q\) запросов.

Первая строка запроса содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2000\)) — длину строки \(s\) и длину подстроки.

Вторая строка запроса содержит строку \(s\), состоящую из \(n\) символов 'R', 'G' и 'B'.

Гарантируется, что сумма \(n\) по всем запросам не превосходит \(2000\) (\(\sum n \le 2000\)).

Выходные данные

На каждый запрос выведите одно число — минимальное количество символов, которое вам необходимо изменить в изначальной строке \(s\), чтобы после изменений нашлась такая подстрока длины \(k\) в \(s\), что она также является подстрокой бесконечной строки «RGBRGBRGB ...».

Примечание

В первом тестовом примере вы можете изменить первый символ на 'R' и получить подстроку «RG», или изменить второй символ на 'R' и получить подстроку «BR», или изменить третий, четвертый или пятый символ на 'B' и получить «GB».

Во втором тестовом примере подстрока равна «BRG».

D2. Подстрока RGB (сложная версия)

дп реализация Структуры данных *1600

Единственное отличие между простой и сложной версиями — размер входных данных.

Вам задана строка \(s\), состоящая из \(n\) символов, каждый символ равен 'R', 'G' или 'B'.

Вам также задано целое число \(k\). Ваша задача — изменить минимальное количество символов в изначальной строке \(s\) таким образом, что после этих изменений найдется строка длины \(k\) такая, что она является и подстрокой \(s\), и подстрокой бесконечной строки «RGBRGBRGB ...».

Строка \(a\) называется подстрокой \(b\), если существует положительное целое число \(i\), что \(a_1 = b_i\), \(a_2 = b_{i + 1}\), \(a_3 = b_{i + 2}\), ..., \(a_{|a|} = b_{i + |a| - 1}\). Например, строки «GBRG», «B», «BR» являются подстроками бесконечной строки «RGBRGBRGB ...»,а строки «GR», «RGR» и «GGG» — нет.

Вам необходимо ответить на \(q\) независимых запросов.

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов. Затем следуют \(q\) запросов.

Первая строка запроса содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)) — длину строки \(s\) и длину подстроки.

Вторая строка запроса содержит строку \(s\), состоящую из \(n\) символов 'R', 'G' и 'B'.

Гарантируется, что сумма \(n\) по всем запросам не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

На каждый запрос выведите одно число — минимальное количество символов, которое вам необходимо изменить в изначальной строке \(s\), чтобы после изменений нашлась такая подстрока длины \(k\) в \(s\), что она также является подстрокой бесконечной строки «RGBRGBRGB ...».

Примечание

В первом тестовом примере вы можете изменить первый символ на 'R' и получить подстроку «RG», или изменить второй символ на 'R' и получить подстроку «BR», или изменить третий, четвертый или пятый символ на 'B' и получить «GB».

Во втором тестовом примере подстрока равна «BRG».

E. Компонента связности шахматной доски

Конструктив реализация *1800

Вам задано два целых числа \(b\) and \(w\). У вас есть шахматная доска размера \(10^9 \times 10^9\) с левой верхней клеткой, находящейся в \((1; 1)\), клетка \((1; 1)\) покрашена в белый цвет.

Ваша задача — найти компоненту связности этой шахматной доски, которая содержит ровно \(b\) черных клеток и ровно \(w\) белых клеток. Две клетки называются связными, если у них есть общая сторона (то есть для клетки \((x, y)\) существует не более четырех связных клеток: \((x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)\)). Набор клеток называется компонентой связности, если для каждой пары клеток \(C_1\) и \(C_2\) из этого множества найдется последовательность клеток \(c_1\), \(c_2\), ..., \(c_k\) такая, что \(c_1 = C_1\), \(c_k = C_2\), все \(c_i\) от \(1\) до \(k\) принадлежат этому множеству клеток, а также для всех \(i \in [1, k - 1]\), клетки \(c_i\) и \(c_{i + 1}\) связны.

Очевидно, бывают случаи, когда невозможно найти такую компоненту. В этом случае выведите «NO». Иначе выведите «YES» и любую подходящую компоненту связности.

Вам необходимо ответить на \(q\) независимых запросов.

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов. Затем следуют \(q\) запросов.

Единственная строка запроса содержит два целых числа \(b\) и \(w\) (\(1 \le b, w \le 10^5\)) — необходимое количество черных клеток и необходимое количество белых клеток.

Гарантируется, что сумма количеств клеток не превосходит \(2 \cdot 10^5\) (\(\sum w + \sum b \le 2 \cdot 10^5\)).

Выходные данные

Для каждого запроса вам необходимо вывести ответ на него.

Если невозможно найти подходящую компоненту, выведите «NO» в первой строке.

Иначе выведите «YES» в первой строке. В следующих \(b + w\) строках выведите координаты клеток вашей компоненты в любом порядке. В вашем ответе должно быть ровно \(b\) черных клеток и ровно \(w\) белых клеток. Выведенная компонента обязана быть связной.

Если существует несколько возможных ответов, вы можете вывести любой. Все координаты в ответе должны принадлежать отрезку \([1; 10^9]\).

B. Столбы

жадные алгоритмы реализация *1000

Перед вами стоят в ряд \(n\) столбов, пронумерованных от \(1\) до \(n\).

Изначально на каждый столб надет ровно один диск. Радиус диска, надетого на \(i\)-й столб, равен \(a_i\).

Вы можете перемещать диски с одних столбов на другие. Вы можете взять диск со столба \(i\) и надеть его на столб \(j\), если все следующие условия выполняются:

  1. между столбами \(i\) и \(j\) нет других столбов. Формально, это означает, что \(|i - j| = 1\);
  2. на столб \(i\) надет ровно один диск;
  3. либо столб \(j\) пуст (на нем нет дисков), либо радиус самого верхнего диска на столбе \(j\) строго больше радиуса того диска, который вы перемещаете.

Когда вы надеваете диск на столб, на котором уже есть другие диски, вы располагаете новый диск поверх всех предыдущих, и если вы попытаетесь позже надеть еще один диск на этот столб, именно радиус последнего надетого диска будет сравниваться с радиусом диска, который вы перемещаете, в третьем условии.

Вы можете перемещать диски столько раз, сколько вам нужно, при условии, что все три условия выполняются при каждом вашем действии. Теперь вы хотите узнать, можно ли все \(n\) дисков надеть на один и тот же столб?

Входные данные

В первой строке задается одно целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — количество столбов.

Во второй строке задаются \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_i\) (\(1 \le a_i \le n\)), где \(a_i\) — радиус диска, изначально надетого на \(i\)-й столб. Все числа \(a_i\) различны.

Выходные данные

Выведите YES, если можно все диски надеть на один и тот же столб, или NO, если это не так. Вы можете выводить каждую букву в любом регистре (YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

Примечание

В первом примере можно все диски переместить на столб \(3\) при помощи следующих действий:

  1. взять диск с радиусом \(3\) со столба \(2\) и надеть его на столб \(3\);
  2. взять диск с радиусом \(1\) со столба \(1\) и надеть его на столб \(2\);
  3. взять диск с радиусом \(2\) со столба \(4\) и надеть его на столб \(3\);
  4. взять диск с радиусом \(1\) со столба \(2\) и надеть его на столб \(3\).

A. День города

реализация *1000

Уже много лет так получалось, что день города Н проводился в самый дождливый день лета. Новый мэр хочет разрушить эту печальную традицию; для этого он собирается выбрать не очень дождливый день для праздника. Мэр знает прогноз погоды на \(n\) дней лета. В \(i\)-й день выпадет \(a_i\) миллиметров осадков. Все значения \(a_i\) различны.

Мэр знает, что горожане будут следить за погодой в течение \(x\) дней до праздника и \(y\) дней после. Поэтому он определил, что день \(d\) является не очень дождливым, если \(a_d\) меньше, чем объемы осадков в каждый из \(x\) дней до дня \(d\) и в каждый из \(y\) дней после дня \(d\). Другими словами, \(a_d < a_j\) должно выполняться для всех \(d - x \le j < d\) и \(d < j \le d + y\). Горожане следят за погодой только летом, поэтому рассматриваются только такие \(j\), что \(1 \le j \le n\).

Помогите мэру найти самый ранний не очень дождливый день лета.

Входные данные

Первая строка содержит три целых числа \(n\), \(x\) и \(y\) (\(1 \le n \le 100\,000\), \(0 \le x, y \le 7\)) — количество дней лета, количество дней, в течение которых жители следят за погодой до и послед праздника.

Вторая строка содержит \(n\) различных целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(1 \le a_i \le 10^9\)), где \(a_i\) обозначает объем осадков в \(i\)-й день.

Выходные данные

Выведите одно целое число — номер самого раннего не очень дождливого дня лета. Можно показать, что ответ всегда существует.

Примечание

В первом примере дни \(3\) и \(8\) не очень дождливые. День \(3\) более ранний.

Во втором примере \(3\) не является не очень дождливым днем, потому что \(3 + y = 6\), но \(a_3 > a_6\). Поэтому ответ — день \(8\). Обратите внимание, что \(8 + y = 11\), но мы не рассматриваем день \(11\), так как это уже не лето.

A. Суперагент

реализация *800

В стране Картофании есть очень секретная база, на которой по особому рецепту готовится пюре. Соседи из Кашляндии решили завладеть этим рецептом и продать его в Пловидию. Для этого они долгие годы готовили специального агента Перло. Когда, наконец, Перло познал все основы шпионского мастерства, он проник на территорию Картофании и добрался до секретной базы.

Сейчас он находится прямо у входа в нее, но чтобы проникнуть внутрь, необходимо преодолеть кодовый замок. Только что, на его глазах в дверь вошел один из сотрудников базы, набрав соответствующий пароль на терминале. Терминал представляет из себя квадратную цифровую клавиатуру размером три на три, на которой расположены цифры от 1 до 9. В разведцентре Перло сообщили, что пароль от этой двери состоит из различных цифр и симметричен относительно центральной кнопки терминала (это единственное, что удалось узнать про секретную базу).

У Перло есть тепловой датчик, воспользовавшись которым, он узнал, на какие клавиши нажимал вошедший сотрудник. Теперь, располагая такой ценной информацией суперагент хочет проверить, на самом ли деле пароль, введенный сотрудником, является симметричным относительно центра терминала. Ведь, в противном случае, Перло придется перебрать все возможные комбинации набранных цифр.

Входные данные

Во входных данных задана матрица, состоящая из трех строк по три символа. Символ «X» означает, что соответствующая клавиша была нажата, символ «.» означает, что данной кнопки не касались. Заданная матрица может не содержать символов «X» вообще. Аналогично, она может не содержать символов «.».

Выходные данные

Выведите YES, если введенный сотрудником пароль симметричен относительно центральной кнопки терминала, или NO в противном случае.

Примечание

Если вы не знакомы с понятием центральной симметрии, то вы можете прочесть о ней в Википедии по адресу http://ru.wikipedia.org/wiki/Центральная_симметрия

B. Правильное решение?

реализация сортировки *1100

Одним холодным зимним вечером Настя и ее старший брат Валера сидели дома возле теплого камина и обменивались интересными задачками. Когда наступила очередь Насти, она назвала брату число n и сказала:

—Переставь цифры в этом числе так, чтобы в результате получилось наименьшее возможное число, в котором нет лидирующих нулей.

—Да это же очень просто! — воскликнул Валера и сразу же выдал сестре ответ.

Настя загадала случайное число и сама еще не знает, является ли ответ Валеры правильным. Вам необходимо срочно помочь девочке, потому что нетерпеливый Валера требует от нее скорого оглашения вердикта.

Входные данные

В первой строке входных данных задано целое число n (0 ≤ n ≤ 109), не содержащее лидирующих нулей. Во второй строке содержится целое число m (0 ≤ m ≤ 109) — ответ Валеры, возможно содержащий в записи лидирующие нули.

Выходные данные

Выведите OK, если Валера дал правильный ответ, или WRONG_ANSWER в противном случае.

C. Фрукты

жадные алгоритмы реализация сортировки *1100

Наступает пора весны, а это означает что на прилавках появляется большое количество фруктов. В один из солнечных дней мальчик Валерий решил пройтись по магазинам. Он составил список из m фруктов, которые хотел бы приобрести. В том случае, если Валера хотел купить несколько фруктов одного сорта, то он несколько раз заносил этот фрукт в свой список.

Подойдя к фруктовому ларьку Ашота, мальчик заметил, что продавец еще не успел наклеить ценники на свой товар, а только лишь разложил их на прилавке. В скором времени, когда Ашот присвоит каждому фрукту его цену, Валера сможет подсчитать, сколько денег ему потребуется для приобретения всего желаемого из списка. Однако мальчик хочет заранее знать минимальную (в случае «самого удачного» для Валеры распределения ценников) и максимальную (в случае «самого неудачного» для Валеры распределения ценников) стоимости покупки.

Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100) — количество ценников, а, следовательно, и различных сортов фруктов, имеющихся у продавца Ашота, и количество записей в списке Валерия. Во второй строке через пробелы записаны n целых положительных чисел. Каждое из этих чисел не превосходит 100 и означает цену одного фрукта определенного сорта. В последующих m строках записаны названия фруктов, которые желает приобрести мальчик. Каждое название состоит из строчных букв латинского алфавита и имеет длину от 1 до 32 символов. Гарантируется, что число различных фруктов в списке не превосходит n. Также гарантируется, что у продавца в наличии имеются все фрукты, которые желает приобрести Валера.

Выходные данные

Выведите через пробел два числа a и b (a ≤ b) — минимальную и максимальную суммы, необходимые Валере для того, чтобы приобрести все фрукты из своего списка.

A. Лифт

математика Перебор реализация *1000

Недавно в городе N-ске достроили 1000-этажный небоскреб. Для перемещения по этажам небоскреба используются современные сверхскоростные лифты. У каждого лифта имеются две двери: передняя и задняя. Если человек входит в лифт через переднюю дверь, то выходит он через заднюю, и наоборот. В лифте имеются два поручня, пронумерованных числами 1 и 2. Поручень номер 1 находится слева от входа в переднюю дверь (или, соответственно, справа от входа в заднюю дверь), а поручень номер 2 — справа (слева от входа в заднюю дверь). Известно, что каждый человек в N-ске держится за поручень той рукой, которая у него наиболее развита.

Некоторое время назад город посетил очень важный человек, который не преминул посетить небоскреб и проехаться на лифте. Срочно необходимо определить, является ли он левшой или правшой, зная, в какую дверь он зашел и за какой поручень держался.

Входные данные

В первой строке записано, через какую дверь важный человек зашел в лифт. В ней записано «front», если человек зашел в лифт через переднюю дверь, и «back», если через заднюю. Во второй строке содержится целое число a (1 ≤ a ≤ 2), обозначающее номер поручня, за который держался пассажир.

Выходные данные

Выведите символ «R», если очень важный человек является правшой, или «L», если он является левшой.

B. Что? Где? Когда?

реализация *1100

В Берляндии очень популярна игра «Что? Где? Когда?». Суть игры заключается в противостоянии команды Знатоков (игровой команды из шести человек) команде Телезрителей. Знатоки должны за одну минуту при помощи мозгового штурма найти ответ на вопрос, присланный телезрителем. Как правило, игрокам задаются вопросы, ответить на которые можно с помощью общих знаний и логики. Вопросы находятся в разложенных на столе по кругу конвертах, подписанных названиями городов участников, приславших вопрос. Каждый вопрос лежит в отдельном секторе. Посередине стола находится волчок (юла) со стрелкой. Волчок раскручивает распорядитель, и вопрос из сектора, на котором останавливается стрелка, выбирается для игры. Если выпавший вопрос уже сыгран, то выбирается следующий за ним по часовой стрелке еще не сыгравший вопрос. Ваша задача определить, какой по номеру вопрос будет следующим в игре, если волчок покажет на сектор с номером k.

Входные данные

В первой строке записаны два натуральных числа n и k (1 ≤ n ≤ 1000 и 1 ≤ k ≤ n) — количество секторов и номер сектора, на который указывает стрелка волчка. Во второй строке дано n чисел: ai = 0, если вопрос из сектора i уже сыгран, и ai = 1, если вопрос из сектора i еще в игре (1 ≤ i ≤ n). Сектора заданы по часовой стрелке, после n-го сектора идет первый.

Выходные данные

Выведите единственное число — номер сектора, вопрос на котором будет выбран для игры. Гарантируется, что ответ существует, то есть еще не все вопросы были сыграны.

C. Винни-Пух и мед

математика реализация *1100

Винни-Пух, как известно, очень любит мед. Как-то раз они с Пятачком прознали, что у Кролика вновь появилось изрядное количество этого сладкого лакомства. Как вы можете догадаться, вскоре Винни и Пятачок напросились в гости. Итак, перед Винни-Пухом стоят в ряд n баночек с медом, в банке с номером i находится ai килограмм меда. Винни-Пух ест мед следующим образом: каждый раз он выбирает банку, в которой больше всего меда (в случае, если таких банок несколько, он берет любую из них). Если в этой банке меньше, чем k килограмм меда, или же Винни уже трижды ел мед из этой банки, то он отдает ее Пятачку. В противном случае он ест из нее ровно k килограмм меда и ставит ее на место. Винни делает так до тех пор, пока не отдаст все банки Пятачку. Посчитайте, сколько меда в сумме получит Пятачок после того, как Винни удовлетворит свой аппетит.

Входные данные

В первой строке записано два целых числа n и k (1 ≤ n ≤ 100, 1 ≤ k ≤ 100). Во второй строке записаны n целых чисел a1, a2, ..., an, разделенных пробелами (1 ≤ ai ≤ 100).

Выходные данные

Выведите одно число — сколько килограмм меда достанется Пятачку.

G. Бум

реализация *1800

Рассмотрим известную игру Бум (aka Шляпа) с упрощенными правилами.

В игре участвуют n команд по два человека. Цель игры: объяснить слова своему напарнику, не используя однокоренные и созвучные.

Игрок номер j команды с номером i (1 ≤ i ≤ n, 1 ≤ j ≤ 2) характеризуется двумя числами: aij и bij. Числа обозначают соответственно навык объяснения и навык понимания данного игрока.

Так же для игры используются m карточек. На каждой карточке написано слово. Карточка с номером k (1 ≤ k ≤ m) характеризуется числом ck — сложностью слова, написанного на ней.

Перед началом игры карточки складываются в колоду и перемешиваются. Далее команды делают ходы в следующем порядке: 1-й игрок 1-й команды, 1-й игрок 2-й команды, ... , 1-й игрок n-ой команды, 2-й игрок 1-й команды, ... , 2-й игрок n-й команды, 1-й игрок 1-й команды и т.д.

Каждый ход длится t секунд. Ход производится следующим образом: изначально время хода равно t. Пока время хода больше 0, ходящий игрок берет верхнюю карточку из колоды и начинает объяснять слово на ней своему напарнику. Время, за которое j-й игрок i-й команды объяснит слово с карточки k своему напарнику (q-му игроку i-й команды) равно max(1, ck - (aij + biq) - dik) (если j = 1,  то q = 2,  иначе q = 1). Величина dik — это количество секунд, которое i-я команда уже потратила на объяснение слова k за предыдущие ходы. Изначально, все dik равны 0. Если команда успевает до конца хода отгадать слово, то из времени хода вычитается указанное выше время, отгаданная карточка выходит из игры, принося команде одно очко, и ход продолжается. Если же команда не успевает отгадать слово, то карточка кладется вниз колоды, а dik увеличивается на время хода, потраченное на объяснение этого слова на текущем ходу. Таким образом, когда этой команде достанется это же слово, они начнут его объяснять не с начала, а с того места, на котором остановились. Игра заканчивается тогда, когда все m карточек отгаданы.

Вам даны n команд и колода из m карточек. Вам необходимо для каждой команды определить, сколько очков будет у этой команды в конце игры, и какие слова эта команда отгадает.

Входные данные

В первой строке содержатся два целых числа n, t (1 ≤ n, t ≤ 100), обозначающие соответственно количество команд и продолжительность одного хода.

В следующих n строках входного файла содержатся по четыре целых числа: ai1, bi1, ai2, bi2 (1 ≤ aij, bij ≤ 100) — навыки первого и второго игроков i-й команды. Команды заданы в том порядке, в котором они ходят.

В следующей строке входного файла содержится целое число m (1 ≤ m ≤ 100) — число карточек.

В следующих 2m строках содержится описания карточек. Каждая карточка описывается двумя строками. В первой строке описания карточки содержится слово, состоящее не более, чем из 20 символов. Слова содержат только строчные буквы латинского алфавита. Во второй строке описания карточки содержится целое число ck (1 ≤ ck ≤ 100) — сложность слова, написанного на k-й карточке. Карточки перечислены в том порядке, в котором они лежат в колоде сверху вниз. Слова на всех карточках различны.

Выходные данные

Выведите n строк. В i-й строке сначала выведите число si — количество очков, заработанных i-й командой. Далее выведите si слов, разделяя их пробелами, — слова с карточек, отгаданных командой i в том порядке, в котором они были отгаданы.

A. Отельер

Перебор реализация Структуры данных *800

Амуга владеет отелем, представимым в виде длинного коридора с \(10\) комнатами, идущими подряд. Комнаты пронумерованы цифрами от \(0\) до \(9\) слева направо.

В отель есть два входа: с левого конца коридора и с правого. Если гость заходит с левого конца коридора, то он будет расположен в ближайшей к левому входу свободной комнате. Аналогично, если гость заходит с правого конца коридора, то ему будет назначена ближайшая к правому входу свободная комната.

Однажды Амуга потерял документ с указанием статуса занятости комнат. К счастью, у него безупречная память, и он помнит всё о своих гостях: когда гость пришёл в отель, с какой стороны он вошёл, и когда он покинул отель. Изначально все комнаты в отеле были свободными. Напишите программу, которая восстановит статус занятости комнат по событиям из памяти Амуга.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество событий в памяти Амуга.

Вторая строка содержит строку длины \(n\), описывающую события, которые помнит Амуга, заданные в хронологическом порядке. Символы заданной строки могут быть следующими:

  • «L»: новый гость зашёл в отель с левого конца коридора.
  • «R»: новый гость зашёл в отель с правого конца коридора.
  • «0», «1», ..., «9»: гость из комнаты \(x\) (\(0\), \(1\), ..., \(9\) соответственно) покинул отель.

Гарантируется, что в отеле имеется хотя бы одна свободная комната, когда появляется новый гость. Также гарантируется, что, если задано \(x\) (\(0\), \(1\), ..., \(9\)), то в комнате \(x\) находится гость. В начальный момент времени все комнаты свободны.

Выходные данные

В единственной строке выведите статус занятости комнат, начиная с комнаты \(0\) и заканчивая комнатой \(9\). Свободную комнату обозначайте как «0», а занятую — как «1». Символы выводите без пробелов.

Примечание

В первом примере статус занятости комнат после каждого из событий следующий:

  • Изначально все комнаты свободны. Статус занятости: 0000000000.
  • L: гость заходит в отель через вход слева. Статус занятости: 1000000000.
  • L: ещё один гость заходит через вход слева. Статус занятости: 1100000000.
  • R: ещё один гость заходит через вход справа. Статус занятости: 1100000001.
  • L: ещё один гость заходит через вход слева. Статус занятости: 1110000001.
  • 1: гость из комнаты \(1\) покидает отель. Статус занятости: 1010000001.
  • R: ещё один гость заходит через вход справа. Статус занятости: 1010000011.
  • L: ещё один гость заходит через вход слева. Статус занятости: 1110000011.
  • 1: гость из комнаты \(1\) покидает отель. Статус занятости: 1010000011.

Таким образом, финальный статус занятости комнат следующий: 1010000011.

Во втором примере статус занятости комнат после каждого из событий следующий:

  • L: гость заходит в отель через вход слева. Статус занятости: 1000000000.
  • 0: гость из комнаты \(0\) покидает отель. Статус занятости: 0000000000.
  • L: гость заходит в отель через вход слева. Статус занятости: 1000000000.
  • 0: гость из комнаты \(0\) покидает отель. Статус занятости: 0000000000.
  • L: гость заходит в отель через вход слева. Статус занятости: 1000000000.
  • L: ещё один гость заходит через вход слева. Статус занятости: 1100000000.
  • R: ещё один гость заходит через вход справа. Статус занятости: 1100000001.
  • R: oещё один гость заходит через вход справа. Статус занятости: 1100000011.
  • 9: гость из комнаты \(9\) покидает отель. Статус занятости: 1100000010.

Таким образом, финальный статус занятости комнат следующий: 1100000010.

D. Белые полосы

дп Перебор реализация Структуры данных *1900

Гильдон приобрел известный графический редактор cfpaint. Рабочая зона cfpaint — квадрат, состоящий из \(n\) строк и \(n\) столбцов квадратных клеток. Строки пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы — от \(1\) до \(n\) слева направо. Будем обозначать клетку в строке \(r\) и столбце \(c\) как \((r, c)\). Каждая клетка может иметь один из двух цветов — белый или черный.

В cfpaint есть инструмент, называемый ластиком. Ластик имеет размер \(k\) (\(1 \le k \le n\)). Чтобы его использовать, Гильдон должен щелкнуть в некоторую клетку \((i, j)\), где \(1 \le i, j \le n - k + 1\). Если он щелкнет в клетку \((i, j)\), то все клетки \((i', j')\) такие, что \(i \le i' \le i + k - 1\) и \(j \le j' \le j + k - 1\) станут белыми. Иными словами, квадрат со стороной в \(k\) клеток, левый верхний угол которого находится в клетке \((i, j)\), будет закрашен белым.

Белой полосой называется строка или столбец, не содержащие черных клеток.

Гильдон уже некоторое время использовал cfpaint, поэтоому некоторый клетки (возможно, все или ни одной) сейчас черные. Он хочет узнать максимальное число белых полос после того, как он использует ластик ровно один раз. Помогите Гильдону найти ответ на его вопрос.

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2000\)) — количество строк и столбцов и размер ластика.

Каждая из следующих \(n\) строк содержит \(n\) символов без пробелов. Символ \(j\) в \(i\)-й строке описывает клетку \((i,j)\). Каждый символ — либо «B», что обозначает черную клетку, либо «W», что обозначает белую клетку.

Выходные данные

Выведите одно целое число: максимальное количество белых полос после ровно одного использования ластика.

Примечание

В первом примере Гильдон может щелкнуть в клетку \((2, 2)\), тогда рабочая зона будет выглядеть так:

BWWW
WWWW
WWWW
WWWB

Здесь есть четыре белых полосы: \(2\)-я и \(3\)-я строки, а также \(2\)-й и \(3\)-й столбцы.

Во втором примере нажатие на клетку \((2, 3)\) сделает \(2\)-ю строку белой.

В третьем примере \(2\)-й столбец и \(5\)-я строка станут белыми полосами, если щелкнуть в клетку \((3, 2)\).

E. Склеивание слов

Перебор реализация Строки строковые суфф. структуры хэши *2000

У Амуга есть предложение, состоящее из \(n\) слов. Он хочет склеить это предложение в одно слово. Амуга не любит повторений, поэтому, когда он склеивает два слова в одно, он удаляет самый длинный префикс второго слова, который совпадает с суффиксом первого слова. Например, слова «sample» и «please» он склеивает в «samplease».

Амуга хочет склеить предложение слева направо (т.е. сначала склеить первые два слова, потом склеить результат с третьим, и так далее). Напишите программу, которая найдет полученное после всех склеиваний слово.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество слов в предложении Амуга.

Вторая строка содержит \(n\) слов, разделенных единичными пробелами. Каждое слово непусто и состоит из строчных и заглавных латинских букв, а также цифр ('A', 'B', ..., 'Z', 'a', 'b', ..., 'z', '0', '1', ..., '9'). Суммарная длина слов не превосходит \(10^6\).

Выходные данные

Выведите результат после всех склеиваний.

F. Graph Traveler

графы дп математика Перебор поиск в глубину и подобное реализация Структуры данных теория чисел *2300

Гильдон проводит эксперименты с интересной машиной под названием Graph Traveler. В этой машине есть ориентированный граф из \(n\) вершин, пронумерованных от \(1\) до \(n\). \(i\)-я вершина имеет \(m_i\) выходящих ребер, они обозначаются \(e_i[0]\), \(e_i[1]\), \(\ldots\), \(e_i[m_i-1]\), где каждый элемент обозначает номер вершины конца ребра. В графе могут быть кратные ребра и петли. Кроме того, в каждой вершине \(i\) написано некоторое целое число \(k_i\).

Путь по графу определяется следующим образом.

  1. Гильдон выбирает вершину, с которой начнет путь, а также некоторое начальное целое число. Запомним это число в переменную \(c\).
  2. Когда Гильдон приходит в вершину \(i\), а также, в начале, если путь начинается с вершины \(i\), он добавляет значение \(k_i\) к \(c\).
  3. Следующая вершина пути — это \(e_i[x]\), где \(x\) — такое целое число \(0 \le x \le m_i-1\), что \(x \equiv c \pmod {m_i}\). Гильдон переходит в эту следующую вершину и возвращается на шаг 2.

Ясно, что такой путь никогда не кончается, потому что шаги 2 и 3 будут повторяться бесконечное число раз.

Например, предположим, что Гильдон начинает в вершине \(1\) с \(c = 5\), при этом \(m_1 = 2\), \(e_1[0] = 1\), \(e_1[1] = 2\), \(k_1 = -3\). Сразу после того, как он начинает в вершине \(1\), \(c\) становится равным \(2\). Так как единственное целое число \(x\) (\(0 \le x \le 1\)) такое, что \(x \equiv c \pmod {m_i}\), это \(0\), то Гильдон пойдет в вершину \(e_1[0] = 1\). После того как он попадет в вершину \(1\) снова, \(c\) станет равной \(-1\). Единственное целое число \(x\), удовлетворяющее сравнению, есть \(1\), поэтому он идет в вершину \(e_1[1] = 2\), и так далее.

Так как Гильдон достаточно любознательный, он хочет спросить у вас \(q\) вопросов. Каждый раз он хочет узнать, сколько различных вершин он посетит бесконечное число раз, если он начнет с определенной вершины с определенным числом \(c\). Обратите внимание, что не нужно учитывать вершины, которые будут посещены только конечное число раз.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество вершин в графе.

Вторая строка содержит \(n\) целых чисел. \(i\)-е из них равно \(k_i\) (\(-10^9 \le k_i \le 10^9\)) — число, написанное в \(i\)-й вершине.

Следующие \(2 \cdot n\) строк описывают ребра, выходящие из каждой вершины. \((2 \cdot i + 1)\)-я строка содедржит одно целое число \(m_i\) (\(1 \le m_i \le 10\)) — число исходящих ребер из вершины \(i\). \((2 \cdot i + 2)\)-я строка содержит \(m_i\) целых чисел \(e_i[0]\), \(e_i[1]\), \(\ldots\), \(e_i[m_i-1]\), все значения которых лежат в пределах от \(1\) до \(n\) включительно.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество вопросов Гильдона.

Каждая из следующих \(q\) строк содержит два целых числа \(x\) и \(y\) (\(1 \le x \le n\), \(-10^9 \le y \le 10^9\)), которые означают, что Гильдон хочет начать путь с вершины \(x\), а начальное значение переменной \(c\) должно быть \(y\).

Выходные данные

Для каждого запроса выведите количество различных вершин, которые будут посещены бесконечно много раз, если Гильдон начнет путь из вершины \(x\) с начальным значением \(y\).

Примечание

Граф в первом примере показан на рисунке ниже:

Три числа, показанные на вершине \(i\), равны соответственно \(i\), \(k_i\) и \(m_i\). Числа на ребрах показывают их номер в списке выходящих ребер из \(i\)-й вершины.

Путь для каждого запроса показан ниже. Он описывается последовательностью фраз, каждая в формате «вершина (\(c\) после добавления \(k_i\))».

  • \(1(0) \to 2(0) \to 2(0) \to \ldots\)
  • \(2(0) \to 2(0) \to \ldots\)
  • \(3(-1) \to 1(-1) \to 3(-1) \to \ldots\)
  • \(4(-2) \to 2(-2) \to 2(-2) \to \ldots\)
  • \(1(1) \to 3(1) \to 4(1) \to 1(1) \to \ldots\)
  • \(1(5) \to 3(5) \to 1(5) \to \ldots\)

Во втором примере граф такой же, как в первом, но у вершин ненулевые значения. Поэтому ответы отличаются от ответов в первом примере.

Пути во втором примере показаны ниже:

  • \(1(4) \to 2(-1) \to 2(-6) \to \ldots\)
  • \(2(-5) \to 2(-10) \to \ldots\)
  • \(3(-4) \to 1(0) \to 2(-5) \to 2(-10) \to \ldots\)
  • \(4(-3) \to 1(1) \to 3(-2) \to 4(-3) \to \ldots\)
  • \(1(5) \to 3(2) \to 1(6) \to 2(1) \to 2(-4) \to \ldots\)
  • \(1(9) \to 3(6) \to 2(1) \to 2(-4) \to \ldots\)

A. Важный экзамен

реализация Строки *900

Группа студентов написала экзамен в виде теста.

Всего в группе было \(n\) студентов, а тест состоял из \(m\) вопросов, каждый из которых имел \(5\) вариантов ответа (A, B, C, D или Е). На каждый вопрос есть ровно один правильный ответ. Правильный ответ на \(i\)-й вопрос даёт \(a_i\) баллов. Неправильные ответы оцениваются нулём баллов.

Студенты помнят, какие ответы они дали на экзамене, но не знают, какие ответы являются правильными. Они настроены достаточно оптимистично, а потому интересуются насколько большим может быть суммарный балл всех студентов группы.

Входные данные

Первая строка содержит целые числа \(n\) и \(m\) (\(1 \le n, m \le 1000\)) — количество студентов в группе и количество вопросов в тесте.

Каждая из следующих \(n\) строк содержит строку \(s_i\) (\(|s_i| = m\)), задающую ответы, которые дал \(i\)-й студент: \(j\)-й символ этой строки (A, B, C, D или E) обозначает ответ студента на \(j\)-й вопрос.

Последняя строка содержит \(m\) целых чисел \(a_1, a_2, \ldots, a_m\) (\(1 \le a_i \le 1000\)) — количество баллов за правильный ответ для каждого вопроса.

Выходные данные

Выведите одно целое число — максимальный суммарный балл группы.

Примечание

В первом примере один из наиболее благоприятных правильных ответов это «ABCD», тогда суммарный балл будет равен \(16\).

Во втором примере одним из оптимальных для студентов правильных ответов является «CCC». Тогда на каждый вопрос ответит ровно один студент и суммарный балл будет равен \(5 + 4 + 12 = 21\).

D. Охота за сокровищами

Бинарный поиск дп жадные алгоритмы реализация *2100

Вы находитесь на острове, который можно представить как таблицу \(n \times m\). Строки таблицы пронумерованы целыми числами от \(1\) до \(n\), а столбцы пронумерованы целыми числами от \(1\) до \(m\). На острове расположено \(k\) сокровищ, \(i\)-е из которых находится в клетке \((r_i, c_i)\).

Изначально вы находитесь в нижней левой клетке острова, в клетке \((1, 1)\). Если вы окажетесь в одной клетке с сокровищем, то вы можете забрать его, не тратя дополнительного времени. За один ход вы можете переместится вверх (из \((r, c)\) в \((r+1, c)\)), налево (из \((r, c)\) в \((r, c-1)\)) или направо (из \((r, c)\) в \((r, c+1)\)). Из-за ловушек вы не можете двигаться вниз.

Однако двигаться вверх тоже небезопасно. Вы можете двигаться вверх, только если вы находитесь в безопасном столбце. Есть \(q\) безопасных столбцов: \(b_1, b_2, \ldots, b_q\). Вы хотите собрать все сокровища как можно быстрее. Выясните минимальное число ходов, за которое это можно сделать.

Входные данные

Первая строка содержит целые числа \(n\), \(m\), \(k\) и \(q\) (\(2 \le n, \, m, \, k, \, q \le 2 \cdot 10^5\), \(q \le m\)) — количество строк, количество столбцов, количество сокровищ на острове и количество безопасных столбцов.

Каждая из \(k\) следующих строк содержит целые числа \(r_i, c_i\), (\(1 \le r_i \le n\), \(1 \le c_i \le m\)) — координаты клеток, в которых расположены сокровища. Все сокровища расположены в различных клетках.

Последняя строка содержит \(q\) различных чисел \(b_1, b_2, \ldots, b_q\) (\(1 \le b_i \le m\)) — номера безопасных столбцов.

Выходные данные

Выведите минимальное число ходов, которое нужно, чтобы собрать все сокровища.

Примечание

В первом примере следует двигаться вверх во втором столбце, собирая в каждой строке сокровища, расположенные в первом столбце.

Во втором примере следует идти вверх в первом столбце.

В третьем примере оптимально собрать сокровище в клетке \((1;6)\), затем переместиться вверх в строку \(2\), используя столбец \(6\), затем собрать сокровище в клетке \((2;2)\), подняться в верхний ряд, используя столбец \(1\), и собрать последнее сокровище в клетке \((3;4)\). Всего \(15\) ходов.

C. Вам задана WASD-строка...

дп жадные алгоритмы математика Перебор реализация Строки Структуры данных *2100

У вас есть строка \(s\) — последовательность команд для робота. Робот находится в одной из клеток клетчатого поля. Он может выполнять следующие команды:

  • 'W' — переместиться на одну клетку вверх;
  • 'S' — переместиться на одну клетку вниз;
  • 'A' — переместиться на одну клетку влево;
  • 'D' — переместиться на одну клетку вправо.

\(Grid(s)\) — прямоугольное поле минимальной площади, такое, что на нем можно выбрать стартовую позицию робота так, что при выполнении всей последовательностей комнад \(s\) робот не выйдет за пределы прямоугольника. Например, если \(s = \text{DSAWWAW}\), то \(Grid(s)\) — это прямоугольник \(4 \times 3\).

  1. вы можете поместить робота в клетку \((3, 2)\);
  2. робот выполняет команду 'D' и перемещается в \((3, 3)\);
  3. робот выполняет команду 'S' и перемещается в \((4, 3)\);
  4. робот выполняет команду 'A' и перемещается в \((4, 2)\);
  5. робот выполняет команду 'W' и перемещается в \((3, 2)\);
  6. робот выполняет команду 'W' и перемещается в \((2, 2)\);
  7. робот выполняет команду 'A' и перемещается в \((2, 1)\);
  8. робот выполняет команду 'W' и перемещается в \((1, 1)\).

У вас есть \(4\) дополнительных буквы: одна 'W', одна 'A', одна 'S' и одна 'D'. Вы можете вставить одну из них (либо не вставлять вообще) в любую позицию в строке \(s\) для минимизации площади \(Grid(s)\).

Какую минимальную площадь \(Grid(s)\) вы можете получить?

Входные данные

Первая строка содержит число \(T\) (\(1 \le T \le 1000\)) — количество запросов.

Следующие \(T\) строк содержат запросы. Каждый запрос содержит строку \(s\) (\(1 \le |s| \le 2 \cdot 10^5\), \(s_i \in \{\text{W}, \text{A}, \text{S}, \text{D}\}\)) — последовательность команд.

Гарантируется, что суммарная длина строк \(s\) по всем запросам не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(T\) строк, по одному числу в каждой строке.

На каждый запрос выведите минимальное значение \(Grid(s)\), которое вы можете получить.

Примечание

В первом запросе вам нужно получить строку \(\text{DSAWW}\underline{D}\text{AW}\).

Во втором и третьем запросах вы не можете уменьшить площадь \(Grid(s)\).

F. Вам заданы буквы...

Бинарный поиск математика реализация *2700

У вас есть \(a\) заглавных латинских букв 'A' и \(b\) латинских букв 'B'.

Период строки — это такое наименьшее целое \(k\), что \(s_i = s_{i~mod~k}\)\(0\)-индексации) для всех \(i\). Заметим, что это подразумевает, что \(k\) не обязательно делит \(a+b = |s|\).

Например, период строки «ABAABAA» равен \(3\), период «AAAA» равен \(1\), а период «AABBB» равен \(5\).

Найдите количество различных периодов всех возможных строк из \(a\) букв 'A' и \(b\) букв 'B'.

Входные данные

В первой строке записаны два целых числа \(a\) и \(b\) (\(1 \le a, b \le 10^9\)) — количество букв 'A' и 'B', соответственно.

Выходные данные

Выведите количество различных периодов всех возможных строк из \(a\) букв 'A' и \(b\) букв 'B'.

Примечание

Все возможные периоды для первого примера:

  • \(3\) «BBABBA»
  • \(4\) «BBAABB»
  • \(5\) «BBBAAB»
  • \(6\) «AABBBB»

Все возможные периоды для второго примера:

  • \(3\) «BAABAABA»
  • \(5\) «BAABABAA»
  • \(6\) «BABAAABA»
  • \(7\) «BAABAAAB»
  • \(8\) «AAAAABBB»

Обратите внимание, что это не единственные возможные строки для данных периодов.

A. Круг студентов

реализация *1000

\(n\) студентов выстроились в кругу в некотором порядке. Индекс \(i\)-го студента равен \(p_i\). Гарантируется, что все индексы студентов — различные целые числа от \(1\) до \(n\) (то есть они образуют перестановку).

Студенты хотят станцевать хоровод. Прямой хоровод можно станцевать тогда, когда студент \(2\) идет сразу же после студента \(1\) в порядке по часовой стрелке (между ними не должно стоять студентов), студент \(3\) идет сразу же после студента \(2\) в порядке по часовой стрелке, и так далее, и студент \(n\) идет сразу же за студентом \(n - 1\) в порядке по часовой стрелке. Обратный хоровод — почти то же самое. Единственное отличие в том, что студент \(i\) должен идти сразу же после студента \(i - 1\) в порядке против часовой стрелки (это условие должно выполняться для всех \(i\) от \(2\) до \(n\)).

Например, если индексы студентов в порядке по часовой стрелке равны \([2, 3, 4, 5, 1]\), то они могут станцевать прямой хоровод. Если индексы студентов равны \([3, 2, 1, 4]\) в порядке по часовой стрелке, тогда они смогут станцевать обратный хоровод.

Ваша задача — определить, возможно ли станцевать хоровод. Заметьте, что студенты не могут менять своих позиций перед началом танца; они не могут меняться местами или покидать круг, а также никакой другой студент не может встать в круг.

Вам необходимо ответить на \(q\) независимых запросов.

Входные данные

Первая строк входных данных содержит одно целое число \(q\) (\(1 \le q \le 200\)) — количество запросов. Затем следуют \(q\) запросов.

Первая строка запроса содержит одно целое число \(n\) (\(1 \le n \le 200\)) — количество студентов.

Вторая строка запроса содержит перестановку индексов \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\)), где \(p_i\) равно индексу \(i\)-го студента (в порядке по часовой стрелке). Гарантируется, что все \(p_i\) — различные целые числа от \(1\) до \(n\) (то есть они образуют перестановку).

Выходные данные

Для каждого запроса, выведите ответ на него. Если можно станцевать хоровод с выбранным порядком студентов, выведите «YES». Иначе выведите «NO».

C. Общие делители

математика реализация *1300

Вам задан массив \(a\), состоящий из \(n\) целых чисел.

Ваша задача — найти количество таких положительных целых чисел \(x\), что \(x\) делит каждое число в массиве. Другими словами, вам необходимо найти количество общих делителей всех элементов массива.

Например, если массив \(a\) будет равен \([2, 4, 6, 2, 10]\), то \(1\) и \(2\) делят каждое число в массиве (таким образом, ответ на этот тест равен \(2\)).

Входные данные

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 4 \cdot 10^5\)) — количество элементов в \(a\).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^{12}\)), где \(a_i\) равно \(i\)-му элементу \(a\).

Выходные данные

Выведите одно целое число — количество таких положительных целых чисел \(x\), что \(x\) делит каждое число из заданного массива (другими словами, ответ равен количеству общих делителей всех элементов массива).

D1. Удалите подстроку (простая версия)

жадные алгоритмы реализация *1600

Единственное отличие между легкой и сложной версиями — длины строк.

Вам задана строка \(s\) и строка \(t\), обе состоят только из строчных букв латинского алфавита. Гарантируется, что \(t\) может быть получена из \(s\) при помощи удаления некоторого (возможно, нулевого) количества символов (не обязательно последовательных) из \(s\) без изменения порядка оставшихся символов (другими словами, гарантируется, что \(t\) является подпоследовательностью \(s\)).

Например, строки «test», «tst», «tt», «et» и «» являются подпоследовательностями строки «test». А строки «tset», «se», «contest» не являются подпоследовательностями строки «test».

Вы хотите удалить некоторую подстроку (последовательную подпоследовательность) из \(s\) максимально возможной длины таким образом, чтобы после удаления этой подстроки \(t\) все еще осталась подпоследовательностью \(s\).

Если вы хотите удалить подстроку \(s[l;r]\), то строка \(s\) примет вид \(s_1 s_2 \dots s_{l-1} s_{r+1} s_{r+2} \dots s_{|s|-1} s_{|s|}\) (где \(|s|\) равно длине \(s\)).

Ваша задача — найти максимально возможную длину подстроки, которую вы можете удалить, чтобы \(t\) осталась подпоследовательностью \(s\).

Входные данные

Первая строка входных данных содержит одну строку \(s\), состоящую из не менее \(1\) и не более \(200\) строчных букв латинского алфавита.

Вторая строка входных данных содержит одну строку \(t\), состоящую из не мене \(1\) и не более \(200\) строчных букв латинского алфавита.

Гарантируется, что \(t\) является подпоследовательностью \(s\).

Выходные данные

Выведите одно целое число — максимально возможную длину подстроки, которую вы можете удалить, чтобы \(t\) осталась подпоследовательностью \(s\).

D2. Удалите подстроку (сложная версия)

Бинарный поиск жадные алгоритмы реализация *1700

Единственное отличие между легкой и сложной версиями — длины строк.

Вам задана строка \(s\) и строка \(t\), обе состоят только из строчных букв латинского алфавита. Гарантируется, что \(t\) может быть получена из \(s\) при помощи удаления некоторого (возможно, нулевого) количества символов (не обязательно последовательных) из \(s\) без изменения порядка оставшихся символов (другими словами, гарантируется, что \(t\) является подпоследовательностью \(s\)).

Например, строки «test», «tst», «tt», «et» и «» являются подпоследовательностями строки «test». А строки «tset», «se», «contest» не являются подпоследовательностями строки «test».

Вы хотите удалить некоторую подстроку (последовательную подпоследовательность) из \(s\) максимально возможной длины таким образом, чтобы после удаления этой подстроки \(t\) все еще осталась подпоследовательностью \(s\).

Если вы хотите удалить подстроку \(s[l;r]\), то строка \(s\) примет вид \(s_1 s_2 \dots s_{l-1} s_{r+1} s_{r+2} \dots s_{|s|-1} s_{|s|}\) (где \(|s|\) равно длине \(s\)).

Ваша задача — найти максимально возможную длину подстроки, которую вы можете удалить, чтобы \(t\) осталась подпоследовательностью \(s\).

Входные данные

Первая строка входных данных содержит одну строку \(s\), состоящую из не менее \(1\) и не более \(2 \cdot 10^5\) строчных букв латинского алфавита.

Вторая строка входных данных содержит одну строку \(t\), состоящую из не мене \(1\) и не более \(2 \cdot 10^5\) строчных букв латинского алфавита.

Гарантируется, что \(t\) является подпоследовательностью \(s\).

Выходные данные

Выведите одно целое число — максимально возможную длину подстроки, которую вы можете удалить, чтобы \(t\) осталась подпоследовательностью \(s\).

C. Палиндромные пути

интерактив реализация *2400

Это интерактивная задача

Дано клетчатое поле \(n\times n\), где \(n\) нечетное. Строки пронумерованы от \(1\) до \(n\) сверху вниз, столбцы пронумерованы от \(1\) до \(n\) слева вправо. Клетка, стоящая на пересечении \(x\)-й строки и \(y\)-го столбца, будет обозначаться как \((x, y)\).

В каждой клетке записан \(0\) или \(1\). Известно, что в верхней левой клетке записана \(1\), а в нижней правой записан \(0\).

Мы хотим узнать, что записано в каждой клетке поля. Для этого мы можем задавать вопросы вида:

«\(?\) \(x_1\) \(y_1\) \(x_2\) \(y_2\)», где \(1 \le x_1 \le x_2 \le n\), \(1 \le y_1 \le y_2 \le n\), и \(x_1 + y_1 + 2 \le x_2 + y_2\). Другими словами, мы выводим две различные клетки \((x_1, y_1)\), \((x_2, y_2)\) поля такие, что из первой можно добраться во вторую, идя только вправо и вниз, причем они не являются соседними.

В ответ на такой запрос вы узнаете, существует ли путь между \((x_1, y_1)\) и \((x_2, y_2)\), идущий по клеткам только вправо или вниз, числа в клетках которого образуют палиндром.

К примеру, пути, изображенные зеленым, являются палиндромными, поэтому ответ для «\(?\) \(1\) \(1\) \(2\) \(3\)» и «\(?\) \(1\) \(2\) \(3\) \(3\)» был бы, что такой путь существует. В то же время между точками \((1, 1)\) и \((3, 1)\) не существует палиндромного пути.

Определите все клетки поля, задав не более \(n^2\) вопросов. Можно показать, что ответ всегда существует.

Входные данные

В первой строке находится нечетное целое число (\(3 \le n < 50\)) — сторона поля.

Протокол взаимодействия

Вы начинаете взаимодействие, считав \(n\).

Чтобы задать вопрос о клетках \((x_1, y_1), (x_2, y_2)\), в одной строке выведите «\(?\) \(x_1\) \(y_1\) \(x_2\) \(y_2\)».

Числа в запросе должны удовлетворять условиям \(1 \le x_1 \le x_2 \le n\), \(1 \le y_1 \le y_2 \le n\), и \(x_1 + y_1 + 2 \le x_2 + y_2\). Не забудьте сделать операцию 'flush', чтобы получить ответ.

В ответ на заданный вопрос вы получите \(1\), если существует путь идущий с \((x_1, y_1)\) в \((x_2, y_2)\) только вправо или вниз, числа в клетках которого образуют палиндром, и \(0\) в противном случае.

В случае, если ваш запрос не соответствует требованиям, или вы задали более \(n^2\) запросов, программа выведет \(-1\) и прекратит взаимодействие. Вы получите вердикт Неправильный ответ. Вам нужно завершить работу вашей программы, чтобы не получить другие вердикты.

Когда вы установите все числа в клетках, выведите «!».

Далее выведите \(n\) строк, \(i\)-я из которых — строка длины \(n\), соответствующая числам в строке \(i\) поля.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Формат для взломов

Чтобы взламывать, используйте следующий формат.

Первая строка должна содержать единственное нечетное число \(n\) (сторона вашего поля).

\(i\)-я из \(n\) последующих строчек должна содержать строку длины \(n\) соответствующую \(i\)-й строке поля. Верхний левый элемент должен равняться \(1\), нижний правый \(0\).

B. Сделайте произведение единицей

дп реализация *900

Даны \(n\) целых чисел \(a_1, a_2, \dots, a_n\). За одну монету можно сделать следующую операцию:

Выбрать одно из этих чисел, и уменьшить или увеличить его на \(1\).

В частности, мы можем применять эту операцию к одному и тому же числу несколько раз.

Мы хотим добиться того, чтобы произведение всех чисел стало равно \(1\), другими словами, чтобы \(a_1 \cdot a_2\) \(\dots\) \(\cdot a_n = 1\).

К примеру, для \(n = 3\) и чисел \([1, -3, 0]\) мы можем сделать произведение равным \(1\) за \(3\) монеты: добавить \(1\) к второму элементу, добавить \(1\) к второму элементу еще раз, отнять \(1\) от третьего элемента, в результате чего массив станет равным \([1, -1, -1]\). А \(1\cdot (-1) \cdot (-1) = 1\).

Какое минимальное количество монет нужно для этого заплатить?

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество чисел.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^9 \le a_i \le 10^9\)) — сами числа.

Выходные данные

Выведите единственное число — минимальное количество монет, которое нужно потратить, чтобы сделать произведение равным \(1\).

Примечание

В первом примере, вы можете изменить \(1\) на \(-1\) или \(-1\) на \(1\) за \(2\) монеты.

Во втором примере, вы должны применить по крайней мере \(4\) операции, чтобы произведение не было равным \(0\).

В третьем примере, вы можете изменить \(-5\) на \(-1\) за \(4\) монеты, \(-3\) на \(-1\) за \(2\) монеты, \(5\) на \(1\) за \(4\) монеты, \(3\) на \(1\) за \(2\) монеты, \(0\) на \(1\) за \(1\) монету.

A. Бывает два типа бургеров

жадные алгоритмы математика Перебор реализация *800

В вашем ресторане есть два типа бургеров — гамбургеры и чикенбургеры! Для приготовления гамбургера нужны две булочки и говяжья котлета. Для приготовления чикенбургера нужны две булочки и куриная котлета.

У вас есть \(b\) булочек, \(p\) говяжьих котлет и \(f\) куриных котлет. Один гамбургер вы продаете за \(h\) долларов, а один чикенбургер за \(c\) долларов. Посчитайте максимальную прибыль, которую вы можете получить.

Вам нужно ответить на \(t\) независимых запросов.

Входные данные

Первая строка содержит число \(t\) (\(1 \le t \le 100\)) – количество запросов.

Первая строка каждого запроса содержит три числа \(b\), \(p\) и \(f\) (\(1 \le b, ~p, ~f \le 100\)) — количество булочек, говяжьих и куриных котлет в вашем ресторане.

Вторая строка каждого запроса содержит два числа \(h\) и \(c\) (\(1 \le h, ~c \le 100\)) — цена за гамбургер и чикенбургер в вашем ресторане соответственно.

Выходные данные

На каждый запрос выведите одно число — максимальную прибыль, которую вы можете получить.

Примечание

В первом запросе вам нужно продать два гамбургера и три чикенбургера. Ваш доход составит \(2 \cdot 5 + 3 \cdot 10 = 40\).

Во втором запросе вам нужно продать один гамбургер и два чикенбургера. Ваш доход составит \(1 \cdot 10 + 2 \cdot 12 = 34\).

В третьем запросе вы не можете создать ни одного бургера, так как у вас всего одна булочка. Таким образом, ваш доход равен нулю.

B. Заполнение квадратов

жадные алгоритмы Конструктив реализация *1200

Вам заданы две матрицы \(A\) и \(B\). В каждой матрице ровно \(n\) строк и \(m\) столбцов. Каждый элемент \(A\)\(0\) или \(1\); каждый элемент \(B\) изначально равен \(0\).

Вы можете провести любое количество операций с матрицей \(B\). Для проведения операции вы должны выбрать любую подматрицу \(B\) размера \(2 \times 2\) и заменить все элементы в этой подматрице на \(1\). Иными словами, вы выбираете два целых числа \(x\) и \(y\) (\(1 \le x < n\), \(1 \le y < m\)), а затем заменяете все элементы \(B_{x, y}\), \(B_{x, y + 1}\), \(B_{x + 1, y}\) и \(B_{x + 1, y + 1}\) на \(1\).

Ваша задача — сделать матрицу \(B\) равной матрице \(A\). Две матрицы \(A\) и \(B\) равны тогда и только тогда, когда каждый элемент матрицы \(A\) равен соответствующему элементу матрицы \(B\).

Можно ли сделать матрицы равными? Если это так, вы должны найти последовательность операций, которые делают матрицу \(B\) равной матрице \(A\). Обратите внимание, что минимизировать количество операций не нужно.

Входные данные

В первой строке записаны два целых числа \(n\) и \(m\) (\(2 \le n, m \le 50\)).

Затем следуют \(n\) строк, в каждой по \(m\) целых чисел. \(j\)-е число в \(i\)-й строке — \(A_{i, j}\). Каждое число равно либо \(0\), либо \(1\).

Выходные данные

Если невозможно сделать \(B\) равной \(A\), выведите одно число \(-1\).

Иначе выведите любую последовательность операций, превращающую \(B\) в \(A\), в следующем формате: в первой строке выведите одно целое число \(k\) — количество операций, а затем выведите \(k\) строк, в каждой из которых должны быть два целых числа \(x\) и \(y\) для соответствующей операции (заменить все элементы \(B_{x, y}\), \(B_{x, y + 1}\), \(B_{x + 1, y}\) и \(B_{x + 1, y + 1}\) на \(1\)). Должно выполняться условие \(0 \le k \le 2500\).

Примечание

Иллюстрация к ответу на первый тест:

\(\begin{matrix} 0 & 0 & 0 & & 1 & 1 & 0 & & 1 & 1 & 1 & & 1 & 1 & 1 \\ 0 & 0 & 0 & \rightarrow & 1 & 1 & 0 & \rightarrow & 1 & 1 & 1 & \rightarrow & 1 & 1 & 1 \\ 0 & 0 & 0 & & 0 & 0 & 0 & & 0 & 0 & 0 & & 0 & 1 & 1 \end{matrix}\)

F. Задача об остатках

Перебор реализация Структуры данных *2100

У вас есть массив \(a\), состоящий из \(500000\) целых чисел (элементы нумеруются от \(1\) до \(500000\)). Изначально все элементы \(a\) — нули.

К этому массиву поступают запросы двух типов:

  • \(1\) \(x\) \(y\) — увеличить \(a_x\) на \(y\);
  • \(2\) \(x\) \(y\) — посчитать \(\sum\limits_{i \in R(x, y)} a_i\), где \(R(x, y)\) — множество всех целых чисел от \(1\) до \(500000\), дающих остаток \(y\) при делении на \(x\).

Можете ли вы обработать все запросы?

Входные данные

В первой строке записано одно целое число \(q\) (\(1 \le q \le 500000\)) — количество запросов.

Затем следуют \(q\) строк, каждая из которых задает запрос. В \(i\)-й строке записаны три целых числа \(t_i\), \(x_i\) и \(y_i\) (\(1 \le t_i \le 2\)). Если \(t_i = 1\), то это запрос первого типа, \(1 \le x_i \le 500000\), и \(-1000 \le y_i \le 1000\). Если \(t_i = 2\), то это запрос второго типа, \(1 \le x_i \le 500000\), и \(0 \le y_i < x_i\).

Гарантируется, что во входных данных есть хотя бы один запрос типа \(2\).

Выходные данные

Для каждого запроса типа \(2\) выведите одно целое число — ответ на этот запрос.

B. Уникальность

Бинарный поиск Перебор реализация *1500

Дан массив \(a_{1}, a_{2}, \ldots, a_{n}\). Вы можете удалить из него не более одного подотрезка. Оставшиеся элементы должны быть попарно различны.

Другими словами, не более одного раза вы можете выбрать два целых числа \(l\) и \(r\) (\(1 \leq l \leq r \leq n\)) и удалить элементы \(a_l, a_{l+1}, \ldots, a_r\) из массива. Оставшиеся в массиве элементы должны быть попарно различны.

Найдите минимальный размер подотрезка, при удалении которого все элементы массива будут попарно различными.

Входные данные

Первая строка ввода содержит целое число \(n\) (\(1 \le n \le 2000\)) — количество элементов массива.

В следующей строке записаны \(n\) целых чисел \(a_{1}, a_{2}, \ldots, a_{n}\) (\(1 \le a_{i} \le 10^{9}\)) — элементы массива.

Выходные данные

Выведите одно целое число — минимальный размер подотрезка при удалении которого все элементы массива будут попарно различными. Если элементы массива попарно различны и без удаления подотрезка, выведите \(0\).

Примечание

В первом примере все элементы исходно различны, поэтому удалять подотрезок не требуется.

Во втором примере вы можете удалить подотрезок с индексами от \(2\) до \(3\).

В третьем примере вы можете удалить подотрезок с индексами от \(1\) до \(2\), или с индексами от \(2\) до \(3\), или с индексами от \(3\) до \(4\).

D. Восстановить перестановку

Бинарный поиск жадные алгоритмы реализация Структуры данных *1900

Последовательность целых чисел \(p_{1},p_{2}, \ldots,p_{n}\) называется перестановкой, если она содержит каждое число от \(1\) до \(n\) ровно один раз. Например, следующие последовательности перестановки: \([3,1,2], [1], [1,2,3,4,5]\) и \([4,3,1,2]\). А следующие последовательности не являются перестановками: \([2], [1,1], [2,3,4]\).

Загадана перестановка длины \(n\).

Для каждого индекса \(i\) вам дано \(s_{i}\), равное сумме всех таких \(p_{j}\), что \(j < i\) и \(p_{j} < p_{i}\). Иначе говоря, \(s_i\) — это сумма всех элементов до \(i\)-го элемента, которые меньше \(i\)-го элемента.

Ваша задача — восстановить перестановку.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^{5}\)) — размер перестановки.

Вторая строка содержит \(n\) целых чисел \(s_{1}, s_{2}, \ldots, s_{n}\) (\(0 \le s_{i} \le \frac{n(n-1)}{2}\)).

Гарантируется, что \(s\) соответствует корректной перестановке длины \(n\).

Выходные данные

Выведите \(n\) целых чисел \(p_{1}, p_{2}, \ldots, p_{n}\) — элементы восстановленной перестановки.

Можно показать, что ответ всегда уникальный.

Примечание

В первом примере для каждого \(i\) не существует позиции \(j\), удовлетворяющей обоим условиям, соответственно \(s_i\) всегда равен \(0\).

Во втором примере для \(i = 2\) позиция \(j = 1\) удовлетворяет условиям, так что \(s_2 = p_1\).

В третьем примере для \(i = 2, 3, 4\) только позиция \(j = 1\) удовлетворяет условиям, так что \(s_2 = s_3 = s_4 = 1\). Для \(i = 5\) возможны все позиции \(j = 1, 2, 3, 4\), и \(s_5 = p_1 + p_2 + p_3 + p_4 = 10\).

E. Пусть скользят

реализация Структуры данных *2200

Вам дано \(n\) массивов, которые могут иметь разные длины. Также вам дана таблица с \(w\) столбцами и \(n\) строками. \(i\)-й массив горизонтально расположен в \(i\)-й строке. Вы можете двигать каждый массив внутри его строки, но он должен всегда занимать подряд идущие клетки и лежать полностью внутри таблицы.

Вам нужно найти наибольшую возможную сумму чисел в \(j\)-м столбце для каждого \(j\) от \(1\) до \(w\) независимо.

Оптимальные расположения для столбцов \(1\), \(2\) и \(3\) изображены на изображениях слева направо.

Обратите внимание, что вы можете исключить любой массив из столбца (но только если он останется внутри своей строки). В таком случае значение полагается равным нулю.

Входные данные

В первой строке ввода записано два целых числа \(n\) (\(1 \le n \le 10^{6}\)) и \(w\) (\(1 \le w \le 10^{6}\)) — количество массивов и ширина таблицы.

Каждая из следующих \(n\) строк содержит целое число \(l_{i}\) (\(1 \le l_{i} \le w\)) — длина \(i\)-го массива, за которой следуют \(l_{i}\) целых чисел \(a_{i1}, a_{i2}, \ldots, a_{il_i}\) (\(-10^{9} \le a_{ij} \le 10^{9}\)) — элементы массива.

Суммарная длина массивов не превосходит \(10^{6}\).

Выходные данные

Выведите \(w\) целых чисел, \(i\)-е из них должно равно максимальной сумме для столбца \(i\).

Примечание

Изображения для первого примера находятся в условии.

H. Красно-синее дерево

Деревья реализация Структуры данных *3500

Вам дано дерево с \(n\) вершинами. Дерево подвешено за вершину \(1\), которая не считается листом не зависимо от ее степени.

Каждый лист покрашен в один из двух цветов: красный или синий. Листовая вершина с номером \(v\) исходно имеет цвет \(s_{v}\).

Цвет каждой из внутренней вершины (включая корень) определятся следующим образом.

  • Обозначим за \(b\) количество синих непосредственных детей, и за \(r\) количество красных непосредственных детей данной вершины.
  • Тогда цвет этой вершины синий тогда и только тогда, когда \(b - r \ge k\), иначе он красный.

Число \(k\) это параметр, одинаковый для всех вершин.

Вам необходимо обработать запросы следующих типов:

  • 1 v: вывести цвет вершины \(v\);
  • 2 v c: изменить цвет листа \(v\) на \(c\) (\(c = 0\) означает красный, \(c = 1\) означает синий);
  • 3 h: изменить текущее значение \(k\) на \(h\).
Входные данные

Первая строка ввода содержит два целых числа \(n\) и \(k\) (\(2 \le n \le 10^{5}\), \(-n \le k \le n\)) — количество вершин и исходное значение \(k\).

Каждая из следующих \(n - 1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), описывающих, что есть ребро, соединяющее вершины \(u\) и \(v\).

Следующая строка состоит из \(n\) целых чисел, разделенных пробелами — исходный массив \(s\) (\(-1 \le s_i \le 1\)). \(s_{i} = 0\) означает, что цвет вершины \(i\) красный. \(s_{i} = 1\) означает, что цвет вершины \(i\) синий. \(s_{i} = -1\) означает, что вершина \(i\) не является листом.

Следующая строка содержит целое число \(q\) (\(1 \le q \le 10^5\)), количество запросов.

Затем следуют \(q\) строк, каждая содержит запрос, который необходимо обработать:

  • 1 v (\(1 \le v \le n\)): вывести цвет вершины \(v\);
  • 2 v c (\(1 \le v \le n\), \(c = 0\) or \(c = 1\)): изменить цвет листа \(v\) на \(c\) (\(c = 0\) означает красный, \(c = 1\) означает синий). Гарантируется, что \(v\) это лист;
  • 3 h (\(-n \le h \le n\)): изменить текущее значение \(k\) на \(h\).
Выходные данные

Для каждого запроса первого типа выведите \(0\), если цвет вершины \(v\) красный, и \(1\) иначе.

Примечание

(i) Исходное дерево

(ii) Дерево после 3-го запроса

(iii) Дерево после 7-го запроса

A. Раскрашивание чисел

жадные алгоритмы математика реализация *800

Вам дана последовательность целых чисел \(a_1, a_2, \dots, a_n\). Вам нужно раскрасить элементы, так чтобы:

  • Если мы рассмотрим произвольный цвет, то все элементы этого цвета должны делиться на минимальный элемент этого цвета.
  • Количество использованных цветов было бы минимально возможным.

Например, можно покрасить элементы \([40, 10, 60]\) в один цвет, так как они все делятся на \(10\). Каждый из цветов можно использовать произвольное количество раз (в частности, разрешается использовать любой цвет ровно один раз). Элементы, покрашенные в один цвет, не обязаны идти подряд.

Например, если \(a=[6, 2, 3, 4, 12]\), то нужно использовать два цвета: можно покрасить \(6\), \(3\), \(12\) в первый цвет (\(6\), \(3\) и \(12\) делятся на \(3\)), а \(2\) и \(4\) во второй цвет (\(2\) и \(4\) делятся на \(2\)). Например, если \(a=[10, 7, 15]\), то нужно \(3\) цвета (следует покрасить каждый элемент в отдельный цвет).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 100\)), где \(n\) обозначает длину последовательности.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)). Числа в последовательности могут повторяться.

Выходные данные

Выведите минимальное количество цветов, которое нужно, чтобы покрасить все элементы корректным образом.

Примечание

В первом примере можно покрасить элементы в \(3\) цвета следующим образом:

  • покрасить в первый цвет элементы: \(a_1=10\) и \(a_4=5\),
  • покрасить во второй цвет элементы: \(a_3=3\),
  • покрасить в третий цвет элементы: \(a_2=2\), \(a_5=4\) и \(a_6=2\).

Во втором примере можно использовать один цвет на все элементы.

В третьем примере можно покрасить элементы в \(4\) цвета следующим образом:

  • покрасить в первый цвет элементы: \(a_4=4\), \(a_6=2\) и \(a_7=2\),
  • покрасить во второй цвет элементы: \(a_2=6\), \(a_5=3\) и \(a_8=3\),
  • покрасить в третий цвет элемент \(a_3=5\),
  • покрасить в четвёртый цвет элемент \(a_1=7\).

B. Коала и лампы

математика реализация теория чисел *1300

Сейчас идёт праздничный сезон, и Коала декорирует свой дом разными лампами. У него есть \(n\) ламп, каждая из которых периодически моргает.

После того как Коала взглянул на лампы, он заметил, у каждой лампы есть два параметра \(a_i\) и \(b_i\). Лампа с параметрами \(a_i\) и \(b_i\) переключается (т.е. переходит из включённого состояния в выключенное или наоборот) каждую \(a_i\)-ю секунду начиная с \(b_i\)-й. Иначе говоря, она переключается (меняет своё состояние) в моменты \(b_i\), \(b_i + a_i\), \(b_i + 2 \cdot a_i\) и так далее.

Вы знаете для каждой лампы, включена она изначально или нет, а также соответствующие параметры \(a_i\) и \(b_i\). Коала интересуется, чему будет равно наибольшее число ламп, которые будут одновременно включены. Вам нужно это выяснить.

Так выглядит состояние ламп в первом примере.
Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 100\)) — число ламп.

Следующая строка содержит строку \(s\) длины \(n\), \(i\)-й символ строки равен «1», если \(i\)-я лампа изначально включена. Иначе \(i\)-й символ равен «0».

\(i\)-я из следующих \(n\) строк содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 5\)) — параметры \(i\)-й лампы.

Выходные данные

Выведите одно число — максимальное возможное число одновременно горящих ламп.

Примечание

В первом примере состояния ламп изображены на картинке выше. Наибольшее число одновременно включённых ламп равно \(2\) (например в момент \(2\)).

Во втором примере все лампы изначально включены. Значит ответ равен \(4\).

C. Раскрашивание цифр

жадные алгоритмы Конструктив реализация *1500

Вам дана последовательность из \(n\) цифр \(d_1d_2 \dots d_{n}\). Вам нужно раскрасить все цифры в два цвета таким образом, чтобы:

  • каждая цифра была покрашена либо в цвет \(1\), либо в цвет \(2\);
  • если выписать подряд слева направо все цифры покрашенные в цвет \(1\), а затем следом все цифры, покрашенные в цвет \(2\), то полученная последовательность из \(n\) цифр будет неубывающей (то есть каждая следующая цифра будет больше или равна предыдущей цифры).

Например, для последовательности цифр \(d=914\) единственная корректная раскраска имеет вид \(211\) (в цвет \(1\) покрашены две последние цифры, в цвет \(2\) покрашена первая цифра). Обратите внимание, что \(122\) не соответствует требованиям (результат выписывания \(9\) и следом \(14\) не является неубывающей последовательностью).

Допустимо, что какой-либо из двух цветов не используется вообще. Цифры, покрашенные в один цвет, не обязаны располагаться в последовательности подряд.

Найдите любой из возможных способов раскрасить заданную последовательность цифр требуемым способом или определите, что это невозможно сделать.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных в тесте.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 2\cdot10^5\)) — длина заданной последовательности цифр.

Следующая строка содержит последовательность из \(n\) цифр \(d_1d_2 \dots d_{n}\) (\(0 \le d_i \le 9\)). Цифры записаны подряд без пробелов или каких-либо других разделителей. Последовательность может начинаться с 0.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\).

Выходные данные

Выведите \(t\) строк — ответы на каждый из наборов входных данных в тесте.

В случае существования решения для набора соответствующая строка вывода должна содержать любую из допустимых раскрасок, записанную в виде строки из \(n\) цифр \(t_1t_2 \dots t_n\) (\(1 \le t_i \le 2\)), где \(t_i\) — это цвет, в который покрашена \(i\)-я цифра. Если допустимых решений несколько, выведите любую из них.

Если решения не существует, то в соответствующая строка вывода должна содержать единственный символ «-» (минус).

Примечание

В первом тестовом наборе \(d=040425524644\). Вывод \(t=121212211211\) является корректным, так как последовательность \(0022444\) (покрашена в \(1\)), сконкатенированная с \(44556\) (покрашена в \(2\)), равна последовательности \(002244444556\), которая является результатом сортировки всех заданных \(n\) цифр.

G1. На блоки (упрощенная версия)

жадные алгоритмы реализация снм Структуры данных *2000

Это более простая версия следующей задачи. В данной версии \(q = 0\).

Последовательность чисел называется хорошей, если элементы разбиты на блоки как в \([3, 3, 3, 4, 1, 1]\). Формально, если два элемента равны, то все элементы между ними должны быть тоже равны тому же значению.

Определим сложность последовательности как минимальное число элементов, которое нужно поменять, чтобы получить хорошую последовательность. Однако, если вы заменяете хотя бы один \(x\) на какое-то значение \(y\), нужно заменить все остальные значения \(x\) на \(y\) тоже. Например, для \([3, 3, 1, 3, 2, 1, 2]\) не разрешается поменять первую \(1\) на \(3\), а вторую \(1\) на \(2\). Вы можете или не заменять \(1\) совсем, или заменить их все на что-то одно.

Вам дана последовательность целых чисел \(a_1, a_2, \ldots, a_n\) и \(q\) изменений.

Каждое изменение имеет вид «\(i\) \(x\)» — заменить \(a_i\) на \(x\).

Выведите сложность изначальной последовательности и последовательности после каждого изменения. Обратите внимание, что изменения не независимы (изменение сохраняется на будущее).

Входные данные

Первая строка содержит целые числа \(n\) и \(q\) (\(1 \le n \le 200\,000\), \(q = 0\)) — длина последовательности и число изменений.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 200\,000\)) — изначальную последовательность.

Каждая из следующих \(q\) строк содержит целые числа \(i_t\) и \(x_t\) (\(1 \le i_t \le n\), \(1 \le x_t \le 200\,000\)) — позицию и новое значение.

Выходные данные

Выведите \(q+1\) целое число — ответ для изначальной последовательности и ответ после каждого изменения.

A. Счастливая сумма

реализация *1100

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

Пусть next(x) — минимальное счастливое число, большее или равное x. Пете интересно, чему равно next(l) + next(l + 1) + ... + next(r - 1) + next(r). Помогите ему справиться с этой задачей.

Входные данные

В единственной строке задано два целых числа l и r (1 ≤ l ≤ r ≤ 109) — левая и правая граница промежутка.

Выходные данные

В единственной строке выведите одно число — сумму next(l) + next(l + 1) + ... + next(r - 1) + next(r).

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере: next(2) + next(3) + next(4) + next(5) + next(6) + next(7) = 4 + 4 + 4 + 7 + 7 + 7 = 33

Во втором примере: next(7) = 7

D. Счастливые отрезки

Бинарный поиск реализация *2500

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

У Пети есть n числовых отрезков [l1r1], [l2r2], ..., [lnrn]. За один ход Петя может взять любой отрезок (пусть его номер i) и заменить его отрезком [li + 1; ri + 1] или [li - 1; ri - 1]. Другими словами, за один ход можно сдвинуть любой отрезок влево или вправо на единичное расстояние. Петя называет число полным, если оно входит в каждый из отрезков. То есть число x полное, если для каждого i (1 ≤ i ≤ n) выполняется li ≤ x ≤ ri.

Петя делает не более k ходов, а потом считает количество получившихся полных счастливых чисел. Какое наибольшее количество может у него получиться?

Входные данные

В первой строке задано два целых числа n и k (1 ≤ n ≤ 105, 1 ≤ k ≤ 1018) — количество отрезков и максимальное количество ходов. В следующих n строках задано пары целых чисел li и ri (1 ≤ li ≤ ri ≤ 1018).

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Следует использовать спецификатор %I64d.

Выходные данные

В единственной строке выведите одно число — ответ на задачу.

Примечание

В первом примере Петя сдвигает второй отрезок на две единицы влево (он превращается в [4; 7]), после этого число 4 становится полным.

Во втором примере Петя сдвигает первый отрезок на две единицы вправо (он превращается в [42; 47]), а второй отрезок на три единицы влево (он превращается в [44; 71]), после этого числа 44 и 47 будут полными.

A. Три задачи

*особая задача реализация *1000

Поликарп выбирает три задачи, чтобы составить тест по программированию. Всего у него в списке \(n\) задач, сложность \(i\)-й задачи равна \(r_i\). Задачи пронумерованы от \(1\) до \(n\).

Помогите Поликарпу выбрать любые такие три задачи \(a\), \(b\) и \(c\), что сложность первой из них строго меньше сложности второй, а сложность второй строго меньше сложности третьей. Иными словами, для выбранных задач \(a\), \(b\) и \(c\) должно выполняться, что \(r_a < r_b < r_c\).

Если Поликарп может выбрать три задачи требуемым образом неоднозначно, то выведите любой из способов.

Входные данные

В первой строке записано целое число \(n\) (\(3 \le n \le 3000\)) — количество задач в списке Поликарпа.

Далее во второй строке записаны \(n\) целых чисел \(r_1, r_2, \dots, r_n\) (\(1 \le r_i \le 10^9\)), где \(r_i\) — сложность \(i\)-й задачи.

Выходные данные

Если выбрать три задачи требуемым образом невозможно, то выведите три числа -1. В противном случае выведите любой из способов выбрать три задачи в виде трёх различных целых чисел \(a, b, c\) (\(1 \le a, b, c \le n\)), где \(a\) — номер первой выбранной задачи, \(b\) — номер второй выбранной задачи, \(c\) — номер третьей выбранной задачи.

B. Путешествие по Золотому кольцу Берляндии

*особая задача реализация *1500

В Берляндии есть особый туристический маршрут — Золотое кольцо. Этот маршрут состоит из \(n\) городов и циклического железнодорожного маршрута. Города пронумерованы от \(1\) до \(n\) таким образом, что:

  • следующим городом для \(1\) является город \(2\);
  • следующим городом для \(2\) является город \(3\);
  • ...
  • следующим городом для \(n\) является город \(1\).

Таким образом, маршрут замкнут в цикл, города пронумерованы по ходу движения (маршрут — односторонний).

Блогер Поликарп хочет начать своё путешествие в городе \(1\). Про каждый город он знает величину \(a_i\) — сколько селфи он хочет сделать в \(i\)-м городе. За одно посещение города он может сделать там не более одного селфи. Так как он едет на поезде, то города он пропускать не может (он всегда перемещается из города \(i\) в город \(i+1\) для \(1 \le i < n\) и из \(n\) в \(1\)). Таким образом, когда поезд останавливается в городе, то Поликарп обязательно посещает этот город. Если Поликарп посещает город многократно, то все посещения учитываются отдельно.

Какое наименьшее количество посещений городов придётся Поликарпу совершить, чтобы выполнить свой план по количеству селфи для каждого города? Учтите, что первым он всегда посещает город \(1\), так как именно в этом городе начинается его путешествие.

Входные данные

В первой строке записано целое число \(n\) (\(3 \le n \le 2\cdot10^5\)) — количество городов в Золотом кольце Берляндии.

Следующая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^9\)), где \(a_i\) равно требуемому количеству селфи в \(i\)-м городе.

Гарантируется, что хотя бы одно из чисел \(a_i\) строго больше нуля.

Выходные данные

Выведите едиственное целое число — искомое минимальное количество посещений.

F. kotlinkotlinkotlinkotlin...

*особая задача графы реализация Строки *2300

Поликарпу очень нравится писать слово «kotlin». Он выписал это слово несколько раз подряд без пробелов. Например, у него могла получиться такая строка «kotlinkotlinkotlinkotlin».

Полученную строку Поликарп порезал на \(n\) частей и перемешал полученные строки. В результате в настоящий момент у него есть \(n\) строк \(s_1, s_2, \dots, s_n\) таких, что их можно объединить в одну строку вида «kotlinkotlin...kotlin», расположив их в подходящем порядке.

Помогите Поликарпу найти такой порядок записи для строк \(s_1, s_2, \dots, s_n\), что если выписать все эти строки в этом порядке, то получится повторённое один или более раз слово «kotlin».

Обратите внимание, что необходимо использовать все заданные строки и при этом каждую ровно по одному разу.

Входные данные

В первой строке записано целое число \(n\) (\(1 \le n \le 10^5\)) — количество строк у Поликарпа. Далее идут сами строки. Сумма длин строк не превосходит \(3\cdot10^5\). Гарантируется, что существует такой порядок последовательной записи всех \(n\) строк, что в результате получится повторённое один или более раз слово «kotlin».

Выходные данные

Выведите \(n\) различных целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\)), где \(p_i\) это порядковый номер (индекс) строки, которая должна идти \(i\)-й в искомом объединении. Иными словами, результат конкатенации \(s_{p_1}+s_{p_2}+\dots+s_{p_n}\) должен иметь вид «kotlinkotlin...kotlin». Если решений, выведите любое из них.

B. Плохие цены

реализация Структуры данных *1100

Поликарп анализирует цену на новую модель berPhone. В его распоряжении цены за \(n\) последних дней: \(a_1, a_2, \dots, a_n\), где \(a_i\) — цена berPhone в день \(i\).

Поликарп считает цену в день \(i\) плохой, если позже (то есть в день с большим номером) berPhone продавался по меньшей цене. Например, если \(n=6\) и \(a=[3, 9, 4, 6, 7, 5]\), то количество дней с плохой ценой равно \(3\) — это дни \(2\) (\(a_2=9\)), \(4\) (\(a_4=6\)) и \(5\) (\(a_5=7\)).

Выведите количество дней с плохой ценой по мнению Поликарпа.

Вам необходимо ответить на \(t\) независимых наборов входных данных.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных данных в тесте. Наборы входных данных надо обрабатывать независимо, один за другим.

Каждый набор входных данных состоит из двух строк. Первая строка содержит целое число \(n\) (\(1 \le n \le 150000\)) — количество дней. Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^6\)), где \(a_i\) — цена в \(i\)-й день.

Гарантируется, что сумма \(n\) по всем наборам входных данных в тесте не превосходит \(150000\).

Выходные данные

Выведите \(t\) целых чисел, \(j\)-е из них должно быть равно количеству дней с плохой ценой в \(j\)-м наборе входных данных.

D1. Приравнивание делением (легкая версия)

Перебор реализация *1500

Единственное отличие между легкой и сложной версиями — количество элементов в массиве.

Вам задан массив \(a\), состоящий из \(n\) целых чисел. За один ход вы можете выбрать любое \(a_i\) и разделить его на \(2\) с округлением вниз (иными словами, за один ход вы можете присвоить \(a_i := \lfloor\frac{a_i}{2}\rfloor\)).

Вы можете совершать эту операцию любое (возможно, нулевое) количество раз с любым \(a_i\).

Ваша задача — посчитать минимально возможное количество операций, необходимое для того, чтобы получить хотя бы \(k\) равных чисел в массиве.

Не забудьте, что допустимо иметь \(a_i = 0\) после каких-то операций, таким образом, ответ всегда существует.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 50\)) — количество элементов в массиве и необходимое количество равных элементов.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 2 \cdot 10^5\)), где \(a_i\) равно \(i\)-му элементу \(a\).

Выходные данные

Выведите одно целое число — минимально возможное количество операций, необходимое для того, чтобы получить хотя бы \(k\) равных элементов в массиве.

F. Нестабильная сортировка строки

графы жадные алгоритмы поиск в глубину и подобное реализация снм Строки Структуры данных *2100

Авторы загадали строку \(s\), состоящую из \(n\) строчных букв латинского алфавита.

Вам задано две перестановки ее индексов (не обязательно одинаковых) \(p\) и \(q\) (обе длины \(n\)). Напомним, что перестановкой называется массив длины \(n\), содержащий каждое целое число от \(1\) до \(n\) ровно один раз.

Для всех \(i\) от \(1\) до \(n-1\) выполняются следующие свойства: \(s[p_i] \le s[p_{i + 1}]\) и \(s[q_i] \le s[q_{i + 1}]\). Это значит, что если вы выпишете все символы \(s\) в порядке индексов в перестановке, результирующая строка получится отсортированной в неубывающем порядке.

Ваша задача — восстановить любую строку \(s\) длины \(n\), состоящую хотя бы из \(k\) различных строчных букв латинского алфавита, которая подходит к заданным перестановкам.

Если существует несколько возможных ответов, вы можете вывести любой.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5, 1 \le k \le 26\)) — длину строки и необходимое количество различных символов.

Вторая строка входных данных содержит \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\), все \(p_i\) являются различными целыми числами от \(1\) до \(n\)) — перестановку \(p\).

Третья срока входных данных содержит \(n\) целых чисел \(q_1, q_2, \dots, q_n\) (\(1 \le q_i \le n\), все \(q_i\) являются различными целыми числами от \(1\) до \(n\)) — перестановку \(q\).

Выходные данные

Если невозможно найти подходящую строку, выведите «NO» в первой строке.

Иначе выведите «YES» в первой строке и строку \(s\) во второй строке. Она должна состоять ровно из \(n\) строчных букв латинского алфавита, содержать хотя бы \(k\) различных символов и подходить заданным перестановкам.

Если существует несколько возможных ответов, вы можете вывести любой.

A. Желтые карточки

жадные алгоритмы математика реализация *1000

В финале чемпионата Берляндии по футболу было показано \(n\) желтых карточек. Известно, что в начале матча в первой команде было \(a_1\) игроков, а во второй команде было \(a_2\) игроков.

Если игрок первой команды получал \(k_1\) желтых карточек, то он немедленно удалялся с поля до конца игры. Если игрок второй команды получал \(k_2\) желтых карточек, то он немедленно удалялся с поля до конца игры. После удаления никакой игрок не мог получить желтую карточку. Каждая из \(n\) желтых карточек была показана ровно одному игроку. Игра продолжалась даже в том случае, если все игроки одной или даже обеих команд были удалены с поля.

Так как судья матча потерял свои записи о том, кому он давал желтые карточки, перед вами стоит задача определить минимальное и максимальное количество игроков, которые могли быть удалены во время финального матча.

Входные данные

В первой строке следует целое число \(a_1\) \((1 \le a_1 \le 1\,000)\) — количество игроков в первой команде.

Во второй строке следует целое число \(a_2\) \((1 \le a_2 \le 1\,000)\) — количество игроков во второй команде.

В третьей строке следует целое число \(k_1\) \((1 \le k_1 \le 1\,000)\) — количество желтых карточек, после получения которых игрок первой команды удалялся с поля.

В четвертой строке следует целое число \(k_2\) \((1 \le k_2 \le 1\,000)\) — количество желтых карточек, после получения которых игрок второй команды удалялся с поля.

В пятой строке следует целое число \(n\) \((1 \le n \le a_1 \cdot k_1 + a_2 \cdot k_2)\) — количество желтых карточек, которые были показаны во время матча.

Выходные данные

Выведите два целых числа — минимальное и максимальное количество игроков, которые могли быть удалены во время финального матча.

Примечание

В первом примере матч мог пройти таким образом, что ни один игрок не был удален, таким образом минимальное количество удаленных игроков равно \(0\). Максимальное количество игроков, которые могли быть удалены, равно \(4\) — три игрока из второй команды и один из первой.

Во втором примере было показано максимально возможное количество желтых карточек \((3 \cdot 6 + 1 \cdot 7 = 25)\), поэтому при любом ходе игры были удалены все игроки обеих команд.

B. Количество произведений

дп Комбинаторика реализация *1400

В данной задаче вам задана последовательность \(a_1, a_2, \dots, a_n\), состоящая из \(n\) ненулевых целых чисел (то есть \(a_i \ne 0\)).

Перед вами стоит задача найти два числа:

  1. количество таких пар индексов \((l, r)\) \((l \le r)\), что произведение \(a_l \cdot a_{l + 1} \dots a_{r - 1} \cdot a_r\) строго отрицательно;
  2. количество таких пар индексов \((l, r)\) \((l \le r)\), что произведение \(a_l \cdot a_{l + 1} \dots a_{r - 1} \cdot a_r\) строго положительно.
Входные данные

В первой строке следует целое число \(n\) \((1 \le n \le 2 \cdot 10^{5})\) — количество элементов в последовательности.

Во второй строке следует \(n\) целых чисел \(a_1, a_2, \dots, a_n\) \((-10^{9} \le a_i \le 10^{9}; a_i \neq 0)\) — элементы последовательности.

Выходные данные

Выведите два целых числа — количество отрезков со строго отрицательным произведением и количество отрезков со строго положительным произведением.

B. Стрельба

жадные алгоритмы реализация сортировки *900

Вася недавно начал тренироваться стрельбе из пистолета. Сегодня тренер предложил ему следующее задание. Он выставил на стол \(n\) банок в ряд. Банки пронумерованы слева направо от \(1\) до \(n\). Чтобы выполнить задание, Васе предстоит сбить каждую из банок ровно по одному разу. При этом порядок, в котором Вася будет сбивать банки, он выбирает самостоятельно.

Вася знает, что прочность \(i\)-й банки равна \(a_i\). Это значит, что если Вася уже сбил \(x\) банок и сейчас начнет стрелять в \(i\)-ю банку, то, чтобы сбить эту банку, ему понадобится \((a_i \cdot x + 1)\) выстрел. Считайте, что если Вася начал стрелять в банку номер \(i\), то он будет стрелять в нее, пока он ее не собьет.

Определите такой порядок стрельбы по банкам, что Вася сделает минимально возможное количество выстрелов, чтобы сбить каждую из \(n\) банок ровно по одному разу.

Входные данные

В первой строке следует целое число \(n\) \((2 \le n \le 1\,000)\) — количество банок.

Во второй строке следует последовательность \(a_1, a_2, \dots, a_n\) \((1 \le a_i \le 1\,000)\), где \(a_i\) равно прочности \(i\)-й банки.

Выходные данные

В первую строку выведите минимальное количество выстрелов, которые должен сделать Вася, чтобы сбить каждую из \(n\) банок ровно по одному разу.

Во вторую строку выведите последовательность из \(n\) различных целых чисел от \(1\) до \(n\) — номера банок в том порядке, в котором Вася должен по ним стрелять, чтобы минимизировать количество выстрелов. Если подходящих последовательностей несколько, разрешается вывести любую из них.

Примечание

В первом примере Вася может сначала стрелять в первую банку. Он собьет ее с первого выстрела, так как до этого не сбивал ни одну банку. После этого он должен стрелять в третью банку. Чтобы сбить ее, он потратит \(20 \cdot 1 + 1 = 21\) выстрел. После этого останется только вторая банка. Чтобы сбить ее, Вася сделает \(10 \cdot 2 + 1 = 21\) выстрел. Таким образом, суммарно Вася сделает \(1 + 21 + 21 = 43\) выстрела.

Во втором примере не важно, в какой последовательности стрелять по банкам, так как они все имеют одинаковую прочность.

E. Запросы суммы?

жадные алгоритмы математика реализация Структуры данных *2300

Введем определение хорошего мультимножества следующим образом. Выпишем сумму всех элементов мультимножества в виде десятичного числа. Если для каждого разряда существует хотя бы одно число из мультимножества, в котором такая же цифра, как и в полученной сумме, то мультимножество хорошее, иначе плохое.

Например, мультимножество \(\{20, 300, 10001\}\)хорошее, а мультимножество \(\{20, 310, 10001\}\)плохое:

Красным отмечены те числа и разряды, в которых те же цифры, что и в сумме. Сумма первого мультимножества равна \(10321\), для каждого разряда есть необходимая цифра. Сумма второго мультимножества равна \(10331\), и для второго с конца разряда не сушествует числа с такой же цифрой, что делает мультимножество плохим.

Вам дан массив из \(n\) целых чисел \(a_1, a_2, \dots, a_n\).

Необходимо ответить на запросы к нему. Запросы могут быть двух типов:

  • \(1~i~x\) — заменить \(a_i\) на \(x\);
  • \(2~l~r\) — найти плохое подмножество мультимножества чисел \(a_l, a_{l + 1}, \dots, a_r\) с минимальной суммой или сказать, что плохих подмножеств не существует.

Обратите внимание, что пустое подмножество является хорошим.

Для каждого запроса второго типа выведите наименьшую сумму плохого подмножества. Выведите -1, если не существует плохого подмножества.

Входные данные

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество элементов в массиве и количество запросов, соответственно.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i < 10^9\)).

В каждой из следующих \(m\) строк записан запрос одного из двух типов:

  • \(1~i~x\) (\(1 \le i \le n\), \(1 \le x < 10^9\)) — заменить \(a_i\) на \(x\);
  • \(2~l~r\) (\(1 \le l \le r \le n\)) — найти плохое подмножество мультимножества чисел \(a_l, a_{l + 1}, \dots, a_r\) с минимальной суммой или сказать, что плохих подмножеств не существует.

Гарантируется, что есть хотя бы один запрос второго типа.

Выходные данные

Для каждого запроса второго типа выведите наименьшую сумму плохого подмножества. Выведите -1, если не существует плохого подмножества.

Примечание

Все подмножества мультимножества \(\{20, 300, 10001\}\) являются хорошими, поэтому ответ -1.

Все возможные плохие подмножества в третьем запросе: \(\{20, 310\}\) и \(\{20, 310, 10001\}\). С меньшей суммой — \(\{20, 310\}\). Обратите внимание, что требуется найти подмножество, а не подотрезок, поэтому выбранные элементы не обязательно будут стоять рядом в массиве.

В четвертом запросе есть только пустое подножество и подмножество \(\{20\}\). Оба они хорошие.

В последнем запросе есть пустое подмножество и подмножества \(\{20\}\), \(\{20\}\) и \(\{20, 20\}\). Только \(\{20, 20\}\)плохое, его сумма равна \(40\). Обратите внимание, что требуется выбрать мультимножество, поэтому оно может включать в себя одинаковые элементы.

C. Periodic integer number

реализация Строки *1700

Alice became interested in periods of integer numbers. We say positive \(X\) integer number is periodic with length \(L\) if there exists positive integer number \(P\) with \(L\) digits such that \(X\) can be written as \(PPPP…P\). For example:

\(X = 123123123\) is periodic number with length \(L = 3\) and \(L = 9\)

\(X = 42424242\) is periodic number with length \(L = 2,L = 4\) and \(L = 8\)

\(X = 12345\) is periodic number with length \(L = 5\)

For given positive period length \(L\) and positive integer number \(A\), Alice wants to find smallest integer number \(X\) strictly greater than \(A\) that is periodic with length L.

Input

First line contains one positive integer number \(L \ (1 \leq L \leq 10^5)\) representing length of the period. Second line contains one positive integer number \(A \ (1 \leq A \leq 10^{100 000})\).

Output

One positive integer number representing smallest positive number that is periodic with length \(L\) and is greater than \(A\).

Note

In first example 124124 is the smallest number greater than 123456 that can be written with period L = 3 (P = 124).

In the second example 100100 is the smallest number greater than 12345 with period L = 3 (P=100)

G. Harvester

реализация *2000

It is Bubble Cup finals season and farmer Johnny Bubbles must harvest his bubbles. The bubbles are in a rectangular bubblefield formed of \(N\) x \(M\) square parcels divided into \(N\) rows and \(M\) columns. The parcel in \(i^{th}\) row and \(j^{th}\) column yields \(A_{i,j}\) bubbles.

Johnny Bubbles has available a very special self-driving bubble harvester that, once manually positioned at the beginning of a row or column, automatically harvests all the bubbles in that row or column. Once the harvester reaches the end of the row or column it stops and must be repositioned. The harvester can pass through any parcel any number of times, but it can collect bubbles from the parcel only once.

Johnny is very busy farmer, so he is available to manually position the harvester at most four times per day. Johnny is also impatient, so he wants to harvest as many bubbles as possible on the first day.

Please help Johnny to calculate what is the maximum number of bubbles he can collect on the first day.

Input

The first line contains two integers \(N\) and \(M\) (\(1\) \(\leq\) \(N\), \(M\) \(\leq\) \(N\) * \(M\) \(\leq\) \(10^{5}\)) - the bubblefield size.

Each of the next \(N\) lines contains \(M\) integers. The \(j^{th}\) element in the \(i^{th}\) line is \(A_{i,j}\) (\(0\) \(\leq\) \(a_{i,j}\) \(\leq\) \(10^{9}\)) — the yield of the parcel located in the \(i^{th}\) row and the \(j^{th}\) column.

Output

Output contains one integer number - maximum number of the bubbles Johnny can harvest on the first day.

Note

In the first example, farmer Johnny can harvest all the bubbles by positioning the harvester on the first and the second row.

In the second example, one way Johnny can harvest maximum number of bubbles is to position the harvester in the second row, the fourth row, the second column and the fourth column.

B. Счастливая подстрока

Перебор реализация *1000

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

Однажды по почте Пете пришла строка s, состоящая только из цифр. Ему требуется найти строку, которая

  • представляет собой счастливое число без лидирующих нулей,
  • не пуста,
  • содержится в s как подстрока максимальное количество раз.

Среди строк, для которых выполнены все три предыдущих условия, Петю интересует лексикографически минимальная. Найдите для Пети эту строку.

Входные данные

В единственной строке задана непустая строка s длиной от 1 до 50 включительно, содержащая только цифры. Строка может содержать лидирующие нули.

Выходные данные

В единственное строке выведите ответ на задачу Пети. Если искомой строки не существует, выведите «-1» (без кавычек).

Примечание

Лексикографическое сравнение строк реализует оператор < в современных языках программирования. Строка x лексикографически меньше строки y, если либо x является префиксом y, либо существует такое i (1 ≤ i ≤ min(|x|, |y|)), что xi < yi, и для любого j (1 ≤ j < i) xj = yj. Здесь |a| обозначает длину строки a.

В первом примере три условия выполняются для строк «4», «7» и «47». Из них лексикографически минимальная — «4».

Во втором примере s не имеет подстрок, являющихся счастливыми числами.

В третьем примере три условия выполняются только для строки «7».

A. Карточки

реализация сортировки Строки *800

Когда Серёже было три года, ему подарили на день рождения набор карточек с буквами. С их помощью было записано словами любимое число мамы мальчика в двоичной системе счисления. Серёжа тотчас же принялся с ними играть, но так как не умел читать, перемешал их в случайном порядке. Папа решил привести в порядок карточки. Помогите ему восстановить исходное число при условии, что оно было максимально возможным.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leqslant n \leqslant 10^5\)) — длина строки. Вторая строка содержит строку из строчных латинских букв: «z», «e», «r», «o» и «n».

Гарантируется, что буквы можно переупорядочить таким образом, чтобы они образовывали последовательность слов, каждое из которых является либо словом «zero», что соответствует цифре \(0\), либо словом «one», что соответствует цифре \(1\).

Выходные данные

Выведите максимально возможное число в двоичной системе счисления. Выводите двоичные цифры, разделяя их пробелами. Лидирующие нули допустимы.

Примечание

В первом примере правильная последовательность букв — это «zero».

Во втором примере правильная последовательность букв — это «oneonezero».

B1. Покупка подписок на сериалы (упрощённая версия)

реализация *1000

Единственное отличие между простой и сложной версиями — ограничения.

Канал BerTV каждый день показывает один эпизод одного из \(k\) сериалов. Вам известно расписание на ближайшие \(n\) дней: последовательность целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)), где \(a_i\) — номер сериала, эпизод которого будет показан в \(i\)-й день.

Подписка на сериалы покупается целиком полностью на весь сериал, на каждый сериал подписка покупается отдельно.

Сколько минимум подписок надо купить, чтобы была возможность \(d\) (\(1 \le d \le n\)) дней подряд смотреть эпизоды купленных по подписке сериалов? Иными словами, вы хотите купить минимальное количество сериалов, чтобы существовал некоторый отрезок из \(d\) подряд идущих дней, в котором все эпизоды из сериалов по приобретённым подпискам.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных.

Первая строка каждого из наборов содержит три целых числа \(n, k\) и \(d\) (\(1 \le n \le 100\), \(1 \le k \le 100\), \(1 \le d \le n\)). Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)), где \(a_i\) — это номер сериала, который показывается в \(i\)-й день.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(100\).

Выходные данные

Выведите \(t\) целых чисел — ответы на заданные наборы входных данных в порядке их следования в тесте. Ответом на набор входных данных является минимальное количество сериалов, подписку на которые надо приобрести, чтобы была возможность \(d\) дней подряд смотреть по BerTV эпизодов приобретённого сериала. Обратите внимание, что допустимо, что у будет возможность посмотреть более \(d\) дней подряд.

Примечание

В первом наборе входных данных примера чтобы была возможность смотреть два дня подряд сериалы, обязательно нужно купить подписку и на сериал \(1\), и на сериал \(2\). Таким образом, ответ равен двум.

Во втором наборе входных данных примера можно купить подписку на любой из трёх сериалов, так как для каждого сериала есть отрезок из трех подряд дней, состоящий только из эпизодов этого сериала.

В третьем наборе входных данных примера в единственном отрезке из четырех дней встречаются четыре разных сериала, поэтому нужно приобрести подписку на все эти четыре сериала.

В четвертом наборе входных данных примера можно купить подписки на сериалы \(3,5,7,8,9\), таким образом можно будет смотреть сериалы в течении последних восьми дней.

B2. Покупка подписок на сериалы (усложнённая версия)

реализация *1300

Единственное отличие между простой и сложной версиями — ограничения.

Канал BerTV каждый день показывает один эпизод одного из \(k\) сериалов. Вам известно расписание на ближайшие \(n\) дней: последовательность целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)), где \(a_i\) — номер сериала, эпизод которого будет показан в \(i\)-й день.

Подписка на сериалы покупается целиком полностью на весь сериал, на каждый сериал подписка покупается отдельно.

Сколько минимум подписок надо купить, чтобы была возможность \(d\) (\(1 \le d \le n\)) дней подряд смотреть эпизоды купленных по подписке сериалов? Иными словами, вы хотите купить минимальное количество сериалов, чтобы существовал некоторый отрезок из \(d\) подряд идущих дней, в котором все эпизоды из сериалов по приобретённым подпискам.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных.

Первая строка каждого из наборов содержит три целых числа \(n, k\) и \(d\) (\(1 \le n \le 2\cdot10^5\), \(1 \le k \le 10^6\), \(1 \le d \le n\)). Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)), где \(a_i\) — это номер сериала, который показывается в \(i\)-й день.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\).

Выходные данные

Выведите \(t\) целых чисел — ответы на заданные наборы входных данных в порядке их следования в тесте. Ответом на набор входных данных является минимальное количество сериалов, подписку на которые надо приобрести, чтобы была возможность \(d\) дней подряд смотреть по BerTV эпизодов приобретённого сериала. Обратите внимание, что допустимо, что у будет возможность посмотреть более \(d\) дней подряд.

Примечание

В первом наборе входных данных примера чтобы была возможность смотреть два дня подряд сериалы, обязательно нужно купить подписку и на сериал \(1\), и на сериал \(2\). Таким образом, ответ равен двум.

Во втором наборе входных данных примера можно купить подписку на любой из трёх сериалов, так как для каждого сериала есть отрезок из трех подряд дней, состоящий только из эпизодов этого сериала.

В третьем наборе входных данных примера в единственном отрезке из четырех дней встречаются четыре разных сериала, поэтому нужно приобрести подписку на все эти четыре сериала.

В четвертом наборе входных данных примера можно купить подписки на сериалы \(3,5,7,8,9\), таким образом можно будет смотреть сериалы в течении последних восьми дней.

A. Различные цифры

Перебор реализация *800

Вам заданы два целых числа \(l\) и \(r\). Найдите целое число \(x\) такое, что оно удовлетворяет следующим условиям:

  • \(l \le x \le r\),
  • все цифры в числе \(x\) различны.

Если существует несколько решений, выведите любое из них.

Входные данные

Первая строка содержит два целых числа \(l\) и \(r\) (\(1 \le l \le r \le 10^{5}\)).

Выходные данные

Если ответ существует, то выведите любой из них. Иначе выведите \(-1\).

Примечание

В первом примере \(123\) — один из возможных ответов. Тем не менее, \(121\) не может быть ответом потому, что он состоит из нескольких цифр \(1\).

Во втором примере нет числ, которые удовлетворяют всем условиям.

B. Заполнение таблицы

математика реализация *1400

Предположим, что есть прямоугольная таблица \(h \times w\), которая состоит из белых и черных ячеек. Определим следующее:

  • \(r_{i}\) — Количество подряд идущих черных ячеек, с которых начинается \(i\)-я строка при просмотре слева направо (\(1 \le i \le h\)). В частности, \(r_i=0\), если крайняя левая ячейка \(i\)-й строки является белой.
  • \(c_{j}\) — Количество подряд идущих черных ячеек, с которых начинается \(j\)-й столбец при просмотре сверху вниз (\(1 \le j \le w\)). В частности, \(c_j=0\), если самая верхняя ячейка \(j\)-го столбца является белой.

Иными словами, если \(i\)-я строка начинается ровно с \(r_i\) черных ячеек. Аналогично, \(j\)-й столбец начинается ровно с \(c_j\) черных ячеек.

Пример значений \(r\) и \(c\) таблицы \(3 \times 4\).

Даны \(r\) и \(c\). Изначально все ячейки белые. Найдите количество способов заполнить ячейки так, чтобы в заданной таблице значения \(r\) и \(c\) были равны заданным. Поскольку ответ может быть очень большим, найдите по модулю \(1000000007\,(10^{9} + 7)\). Другими словами, найдите остаток от деления ответа на число \(1000000007\,(10^{9} + 7)\).

Входные данные

Первая строка содержит два целых числа \(h\) и \(w\) (\(1 \le h, w \le 10^{3}\)) — количество строк и столбцов таблицы.

Вторая строка содержит \(h\) целых чисел \(r_{1}, r_{2}, \ldots, r_{h}\) (\(0 \le r_{i} \le w\)) — значения \(r\).

Третья строка содержит \(w\) целых чисел \(c_{1}, c_{2}, \ldots, c_{w}\) (\(0 \le c_{j} \le h\)) — значения \(c\).

Выходные данные

Выведите ответ по модулю \(1000000007\,(10^{9} + 7)\).

Примечание

В первом примере есть другой возможный ответ.

Во втором примере нет таких сеток, у которых \(r\) и \(c\) такие же.

В третьем примере убедитесь вывести ответ по модулю \((10^9 + 7)\).

D. Три множества

графы Конструктив Перебор реализация хэши *1900

Дан неориентированный простой граф, который состоит из \(n\) вершин и \(m\) ребер. Граф не содержит петель (то есть каждое ребро соединяет две различные вершины), между каждой парой вершин существует не более одного ребра. Заданный граф может быть несвязным.

Определим следующее:

Пусть \(v_1\) и \(v_2\) два некоторых непустых подмножества вершин, которые не пересекаются. Пусть \(f(v_{1}, v_{2})\) будет истиной (true) тогда и только тогда, когда все условия удовлетворены:

  1. Нет ребра, которые соединяет две вершины в множестве вершин \(v_1\).
  2. Нет ребра, которые соединяет две вершины в множестве вершин \(v_2\).
  3. Для каждых двух вершин \(x\) и \(y\) таких, что \(x\) находится в \(v_1\) и \(y\) находится в \(v_2\), есть ребро, которое соединяет \(x\) и \(y\).

Создайте три множества вершин (\(v_{1}\), \(v_{2}\), \(v_{3}\)) таких, что все условия удовлетворены;

  1. Все множества не должны быть пустыми.
  2. Каждая вершина должна принадлежать ровно одному множеству.
  3. \(f(v_{1}, v_{2})\), \(f(v_{2}, v_{3})\), \(f(v_{3}, v_{1})\) должны быть истинами (true).

Возможно ли создать такие три множества? Есть это так, выведите такое разбиение вершин.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(3 \le n \le 10^{5}\), \(0 \le m \le \text{min}(3 \cdot 10^{5}, \frac{n(n-1)}{2})\)) — количество вершин и ребер в графе.

\(i\)-я из следующих \(m\) строк содержит два целых числа \(a_{i}\) и \(b_{i}\) (\(1 \le a_{i} \lt b_{i} \le n\)), которые значат, что существует ребро между \(a_{i}\) и \(b_{i}\). Граф не содержит петель (то есть каждое ребро соединяет две различные вершины), между каждой парой вершин существует не более одного ребра. Заданный граф может быть несвязным.

Выходные данные

Если ответ существует, выведите \(n\) целых чисел. \(i\)-е целое число обозначает номер множества (от \(1\) до \(3\)), к которому принадлежит \(i\)-я вершина. Иначе выведите \(-1\).

Если существует несколько решений, выведите любое из них.

Примечание

В первом примере, если \(v_{1} = \{ 1 \}\), \(v_{2} = \{ 2, 3 \}\) и \(v_{3} = \{ 4, 5, 6 \}\), тогда множества будут удовлетворять всем условиям. Но также существует и другое разбиение. Например, «2 3 3 1 1 1», который также будет засчитан как правильный ответ.

Во втором примере правильное разбиение не существует.

F. Без одной вершины

Деревья Конструктив реализация *2500

Дано целое число \(n\). Определим следующее дерево деревом McDic:

  1. Создадим полное бинарное дерево с \(2^{n} - 1\) вершинами. То есть дерево, где ровно одна вершина является корнем, все листы имеют одинаковую высоту (расстояние до корня) и все не листовые вершины имеют по два прямых потомка.
  2. Выберем любую некорневую вершину \(v\) из этого бинарного дерева.
  3. Удалим \(v\) из дерева и проведем ребра между предком \(v\) и прямыми потомками \(v\). Если у \(v\) нет потомков, тогда ребра не добавляются.

Дано дерево. Определите, является ли это дерево деревом McDic. Если да, найдите предка удаленной вершины.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 17\)).

\(i\)-я из следующих \(2^{n} - 3\) строк содержит два целых числа \(a_{i}\) и \(b_{i}\) (\(1 \le a_{i} \lt b_{i} \le 2^{n} - 2\)), которые значат, что существует ребро между \(a_{i}\) и \(b_{i}\). Гарантируется, что граф — дерево.

Выходные данные

Выведите две строки.

В первой строке выведите одно целое число — количество ответов. Если это дерево не является деревом McDic, то выведите \(0\).

Во второй строке выведите все возможные ответы в возрастающем порядке. Если это дерево не является деревом McDic, то ничего не выводите.

Примечание

В первом примере \(3\) — это единственный возможный ответ.

Во втором примере есть \(2\) возможных ответа.

В третьем примере дерево не является деревом McDic.

A. Перестановка на простоту

реализация Строки теория чисел *1300

Дана строка s, состоящая из строчных букв латинского алфавита. Будем обозначать длину строки |s|. Нумерация символов в этой строке начинается с 1.

Определите, возможно ли в строке s так переставить символы, чтобы для любого простого числа p ≤ |s| и для любого целого i в диапазоне от 1 до |s| / p (включительно) выполнялось условие sp = sp × i. В случае положительного ответа найдите один из способов так переставить символы.

Входные данные

В единственной строке записана исходная строка s, состоящая из строчных букв латинского алфавита (1 ≤ |s| ≤ 1000).

Выходные данные

Если в строке можно переставить символы так, чтобы выполнялись перечисленные выше условия, то выведите в первой строке «YES» (без кавычек) и во второй — одну из возможных получившихся строк. Если такая перестановка невозможна, выведите одну строку «NO».

Примечание

В первом примере подойдет любая из шести возможных строк «abc», «acb», «bac», «bca», «cab» или «cba».

Во втором примере никакая перестановка букв не будет выполнять условие при p = 2 (s2 = s4).

Третий тест — подойдет любая строка, в которой символ «y» не стоит на позиции 2, 3, 4, 6.

A. Давид и мешки с конфетами

Перебор реализация *800

У Давида есть четыре мешка с конфетами. В \(i\)-м из них лежит \(a_i\) конфет. Также у Давида есть два друга. Он хочет отдать каждый мешок одному из двух друзей. Возможно ли так распределить мешки, чтобы два друга получили одинаковое общее число конфет?

Обратите внимание, что вы не можете оставить мешки себе или выбросить их, каждый мешок должен быть отдан одному из двух друзей.

Входные данные

В первой строке записаны четыре целых числа \(a_1\), \(a_2\), \(a_3\) и \(a_4\) (\(1 \leq a_i \leq 100\)) — количества конфет в каждом мешке.

Выходные данные

Выведите YES если возможно раздать мешки друзьям Давида, чтобы каждый получил одинаковое число конфет, или NO, иначе. Каждый символ может быть выведен в произвольном регистре.

Примечание

В первом примере, Давид может дать первый и третий мешок первому другу, а второй и четвертый мешок — второму. Таким образом, каждый друг получит \(12\) конфет.

Во втором примере невозможно распределить конфеты.

B. Аня и минимизация

жадные алгоритмы реализация *1000

У Ани есть большое число \(S\). Десятичная запись этого числа состоит из \(n\) цифр и не содержит ведущих нулей. Аня может изменить не более \(k\) цифр в \(S\). Она хочет это сделать так, чтобы \(S\) все еще не содержало ведущих нулей и было как можно меньше. Какое число получится у Ани в итоге?

Входные данные

В первой строке записаны два целых числа \(n\) и \(k\) (\(1 \leq n \leq 200\,000\), \(0 \leq k \leq n\)) — количество цифр в десятичной записи \(S\) и максимальное разрешенное количество измененных цифр.

Во второй строке записано целое число \(S\). Гарантируется, что \(S\) состоит ровно из \(n\) цифр и не содержит никаких ведущих нулей.

Выходные данные

Выведите минимальное возможное число \(S\), которое может получиться у Ани. Обратите внимание, что у полученного числа должно быть ровно \(n\) цифр.

Примечание

В числе есть ведущие нули, если оно состоит из хотя бы двух цифр и его первая цифра \(0\). Например, у чисел \(00\), \(00069\) и \(0101\) есть ведущие нули, а у \(0\), \(3000\) и \(1010\) их нет.

B1. Социальная сеть (простая версия)

реализация *1000

Единственное отличие между простой и сложной версиями — ограничения на \(n\) и \(k\).

Вы общаетесь в одной из популярных социальных сетей, используя свой смартфон. Ваш смартфон может показывать не более \(k\) самых недавних бесед с вашими друзьями. Изначально экран смартфона пуст (то есть количество показанных бесед равно \(0\)).

Каждая беседа — это ваш диалог с каким-то из ваших друзей. Всего существует не более одной беседы с каждым из ваших друзей. Таким образом, каждая беседа однозначно определяется вашим другом.

Вы (внезапно!) обладаете возможностью видеть будущее. Вы знаете, что в течение дня вы получите \(n\) сообщений, \(i\)-е сообщение будет получено от друга с ID \(id_i\) (\(1 \le id_i \le 10^9\)).

Если вы получаете сообщение от друга \(id_i\) тогда, когда беседа с ним сейчас показана на экране смартфона, то ничего не происходит: беседы на экране не меняются и не меняют свой относительный порядок, вы просто читаете сообщение и продолжаете ждать новых сообщений.

Иначе (то есть тогда, когда на экране нет беседы с другом \(id_i\)):

  • Сначала, если количество бесед, отображенных на экране, равно \(k\), последняя беседа (которая имеет позицию \(k\)) удаляется с экрана.
  • Теперь количество бесед на экране гарантированно меньше \(k\) и беседа с другом \(id_i\) не отображена на экране.
  • Беседа с другом \(id_i\) появляется на первой (верхней) позиции на экране и все другие отображенные беседы сдвигаются на одну позицию вниз.

Ваша задача — найти список бесед (в порядке, в котором они будут отображены на экране) после обработки всех \(n\) сообщений.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n, k \le 200)\) — количество сообщений и количество бесед, которые может показывать ваш смартфон.

Вторая строка входных данных содержит \(n\) целых чисел \(id_1, id_2, \dots, id_n\) (\(1 \le id_i \le 10^9\)), где \(id_i\) равно ID друга, который отправит вам \(i\)-е сообщение.

Выходные данные

В первой строке выходных данных выведите одно целое число \(m\) (\(1 \le m \le min(n, k)\)) — количество бесед, показанных на экране после получения всех \(n\) сообщений.

Во второй строке выходных данных выведите \(m\) целых чисел \(ids_1, ids_2, \dots, ids_m\), где \(ids_i\) должно быть равно ID друга, соответствующего беседе, отображенной на позиции \(i\) после получения всех \(n\) сообщений.

Примечание

В первом тестовом примере список бесед будет изменяться следующим образом (в порядке от первого к последнему сообщению):

  • \([]\);
  • \([1]\);
  • \([2, 1]\);
  • \([3, 2]\);
  • \([3, 2]\);
  • \([1, 3]\);
  • \([1, 3]\);
  • \([2, 1]\).

Во втором тестовом примере список бесед будет изменяться следующим образом:

  • \([]\);
  • \([2]\);
  • \([3, 2]\);
  • \([3, 2]\);
  • \([1, 3, 2]\);
  • и затем список не изменится до самого конца.

B2. Социальная сеть (сложная версия)

реализация Структуры данных *1300

Единственное отличие между простой и сложной версиями — ограничения на \(n\) и \(k\).

Вы общаетесь в одной из популярных социальных сетей, используя свой смартфон. Ваш смартфон может показывать не более \(k\) самых недавних бесед с вашими друзьями. Изначально экран смартфона пуст (то есть количество показанных бесед равно \(0\)).

Каждая беседа — это ваш диалог с каким-то из ваших друзей. Всего существует не более одной беседы с каждым из ваших друзей. Таким образом, каждая беседа однозначно определяется вашим другом.

Вы (внезапно!) обладаете возможностью видеть будущее. Вы знаете, что в течение дня вы получите \(n\) сообщений, \(i\)-е сообщение будет получено от друга с ID \(id_i\) (\(1 \le id_i \le 10^9\)).

Если вы получаете сообщение от друга \(id_i\) тогда, когда беседа с ним сейчас показана на экране смартфона, то ничего не происходит: беседы на экране не меняются и не меняют свой относительный порядок, вы просто читаете сообщение и продолжаете ждать новых сообщений.

Иначе (то есть тогда, когда на экране нет беседы с другом \(id_i\)):

  • Сначала, если количество бесед, отображенных на экране, равно \(k\), последняя беседа (которая имеет позицию \(k\)) удаляется с экрана.
  • Теперь количество бесед на экране гарантированно меньше \(k\) и беседа с другом \(id_i\) не отображена на экране.
  • Беседа с другом \(id_i\) появляется на первой (верхней) позиции на экране и все другие отображенные беседы сдвигаются на одну позицию вниз.

Ваша задача — найти список бесед (в порядке, в котором они будут отображены на экране) после обработки всех \(n\) сообщений.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n, k \le 2 \cdot 10^5)\) — количество сообщений и количество бесед, которые может показывать ваш смартфон.

Вторая строка входных данных содержит \(n\) целых чисел \(id_1, id_2, \dots, id_n\) (\(1 \le id_i \le 10^9\)), где \(id_i\) равно ID друга, который отправит вам \(i\)-е сообщение.

Выходные данные

В первой строке выходных данных выведите одно целое число \(m\) (\(1 \le m \le min(n, k)\)) — количество бесед, показанных на экране после получения всех \(n\) сообщений.

Во второй строке выходных данных выведите \(m\) целых чисел \(ids_1, ids_2, \dots, ids_m\), где \(ids_i\) должно быть равно ID друга, соответствующего беседе, отображенной на позиции \(i\) после получения всех \(n\) сообщений.

Примечание

В первом тестовом примере список бесед будет изменяться следующим образом (в порядке от первого к последнему сообщению):

  • \([]\);
  • \([1]\);
  • \([2, 1]\);
  • \([3, 2]\);
  • \([3, 2]\);
  • \([1, 3]\);
  • \([1, 3]\);
  • \([2, 1]\).

Во втором тестовом примере список бесед будет изменяться следующим образом:

  • \([]\);
  • \([2]\);
  • \([3, 2]\);
  • \([3, 2]\);
  • \([1, 3, 2]\);
  • и затем список не изменится до самого конца.

C. Трубы

дп реализация *1500

Вам задана система труб. Она состоит из двух рядов, каждый из которых состоит из \(n\) труб. Верхняя левая труба имеет координаты \((1, 1)\), а нижняя правая — \((2, n)\).

Всего существует шесть типов труб: два типа прямых труб и четыре типа изогнутых труб. Ниже приведены примеры всех шести типов:

Типы труб

Вы можете поворачивать каждую из заданных труб на \(90\) градусов по часовой или против часовой стрелки любое (возможно, нулевое) количество раз (таким образом, типы \(1\) и \(2\) могут переходить друг в друга, а также \(3, 4, 5, 6\) могут переходить друг в друга).

Вы хотите повернуть некоторые трубы таким образом, чтобы поток воды мог начать свое движение в \((1, 0)\) (слева от верхней левой трубы), пойти по трубе в \((1, 1)\), как-то потечь по связным трубам до трубы \((2, n)\) и потечь вправо в \((2, n + 1)\).

Трубы называются связными, если они являются соседними в системе и их концы соединены. Ниже несколько примеров связных труб:

Примеры связных труб

Попробуем описать задачу при помощи примера:

Входные данные первого примера

И его решение ниже:

Решение первого примера

Как вы можете заметить, поток воды — это плохо нарисованная синяя линия. Чтобы достичь ответа, нам необходимо повернуть трубу на позиции \((1, 2)\) на \(90\) градусов по часовой стрелке, трубу на позиции \((2, 3)\) на \(90\) градусов, трубу на позиции \((1, 6)\) на \(90\) градусов, трубу на позиции \((1, 7)\) на \(180\) градусов и трубу на позиции \((2, 7)\) на \(180\) градусов. Тогда поток воды сможет достичь \((2, n + 1)\) из \((1, 0)\).

Вам необходимо ответить на \(q\) независимых запросов.

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 10^4\)) — количество запросов. Затем следуют \(q\) запросов.

Каждый запрос состоит ровно из трех строк. Первая строка запроса содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество труб в каждом ряду. Следующие две строки содержат описания первого и второго рядов соответственно. Описание каждого ряда состоит из \(n\) цифр от \(1\) до \(6\) без каких-либо пробелов между ними, каждая цифра соответствует типу трубы в соответствующей клетке. Прочтите условие задачи, чтобы понять, какие цифры соответствуют каким типам труб.

Гарантируется, что сумма \(n\) по всем запросам не пресоходит \(2 \cdot 10^5\).

Выходные данные

Для \(i\)-го запроса выведите ответ на него — «YES» (без кавычек), если возможно повернуть некоторые трубы таким образом, чтобы поток воды смог достичь \((2, n + 1)\) из \((1, 0)\), и «NO» иначе.

Примечание

Первый запрос из тестового примера описан в условии задачи.

C. Лаборатории

жадные алгоритмы Конструктив реализация *1300

В исследовательских целях, \(n^2\) лабораторий были построены на горе на различных высотах. Давайте пронумеруем их целыми числами от \(1\) до \(n^2\), так что лаборатория с номером \(1\) находится в самом низком месте, лаборатория с номером \(2\) находится во втором по высоте месте, \(\ldots\), лаборатория с номером \(n^2\) находится в самом высоком месте.

Для транспортировки воды между лабораториями, трубы были построены между всеми парами лабораторий. Труба может переместить не больше одной единицы воды в единицу времени из лаборатории с номером \(u\) в лабораторию с номером \(v\), если \(u > v\).

Сейчас необходимо разбить лаборатории на \(n\) групп, каждая группа должна содержать ровно \(n\) лабораторий. Лаборатории из разных групп могут транспортировать воду друг другу. Тогда суммарное количество воды, которое может быть отправлено из группы \(A\) в группу \(B\) равно количеству пар лабораторий (\(u, v\)), таких что лаборатория с номером \(u\) из группы \(A\), лаборатория с номером \(v\) из группы \(B\) и \(u > v\). Давайте обозначим это число за \(f(A,B)\) (то есть \(f(A,B)\) равно суммарному количеству воды, которое может быть отправлено из группы \(A\) в группу \(B\)).

Например, если \(n=3\) и есть \(3\) группы \(X\), \(Y\) и \(Z\): \(X = \{1, 5, 6\}, Y = \{2, 4, 9\}\) и \(Z = \{3, 7, 8\}\). В этом случае значения \(f\) равны:

  • \(f(X,Y)=4\) потому что \(5 \rightarrow 2\), \(5 \rightarrow 4\), \(6 \rightarrow 2\), \(6 \rightarrow 4\),
  • \(f(X,Z)=2\) потому что \(5 \rightarrow 3\), \(6 \rightarrow 3\),
  • \(f(Y,X)=5\) потому что \(2 \rightarrow 1\), \(4 \rightarrow 1\), \(9 \rightarrow 1\), \(9 \rightarrow 5\), \(9 \rightarrow 6\),
  • \(f(Y,Z)=4\) потому что \(4 \rightarrow 3\), \(9 \rightarrow 3\), \(9 \rightarrow 7\), \(9 \rightarrow 8\),
  • \(f(Z,X)=7\) потому что \(3 \rightarrow 1\), \(7 \rightarrow 1\), \(7 \rightarrow 5\), \(7 \rightarrow 6\), \(8 \rightarrow 1\), \(8 \rightarrow 5\), \(8 \rightarrow 6\),
  • \(f(Z,Y)=5\) потому что \(3 \rightarrow 2\), \(7 \rightarrow 2\), \(7 \rightarrow 4\), \(8 \rightarrow 2\), \(8 \rightarrow 4\).

Пожалуйста, разбейте лаборатории на \(n\) групп размера \(n\), так что значение \(\min f(A,B)\) по всем возможным парам групп \(A\) и \(B\) (\(A \neq B\)) было максимально.

Другими словами, разбейте лаборатории на \(n\) групп размера \(n\), таких что минимальное количество воды, которое может быть отправлено из группы \(A\) в группу \(B\) для всех возможных пар групп \(A\) и \(B\) (\(A \neq B\)) было максимально большое.

Обратите внимание, что приведенный в условии пример не демонстрирует оптимальное разбиение на группы, он демонстрирует подсчет значений \(f\) для некоторого разбиения.

Если существует несколько оптимальных разбиений, вы можете найти любое.

Входные данные

В единственной строке находится одно целое число \(n\) (\(2 \leq n \leq 300\)).

Выходные данные

Выведите \(n\) строк:

В \(i\)-й строке выведите \(n\) чисел, которые являются номерами лабораторий, которые составляют \(i\)-ю группу, в любом порядке.

Если существует несколько возможных ответов, максимизирующих минимальное количество воды, которое может быть отправлено из одной группы в другую, разрешается вывести любой.

Примечание

В первом тесте можно разбить \(9\) лабораторий на группы \(\{2, 8, 5\}, \{9, 3, 4\}, \{7, 6, 1\}\).

Из первой группы во вторую можно отправить \(4\) единицы воды (\(8 \rightarrow 3, 8 \rightarrow 4, 5 \rightarrow 3, 5 \rightarrow 4\)).

Из первой группы в третью можно отправить \(5\) единиц воды (\(2 \rightarrow 1, 8 \rightarrow 7, 8 \rightarrow 6, 8 \rightarrow 1, 5 \rightarrow 1\)).

Из второй группы в первую можно отправить \(5\) единиц воды (\(9 \rightarrow 2, 9 \rightarrow 8, 9 \rightarrow 5, 3 \rightarrow 2, 4 \rightarrow 2\)).

Из второй группы в третью можно отправить \(5\) единиц воды (\(9 \rightarrow 7, 9 \rightarrow 6, 9 \rightarrow 1, 3 \rightarrow 1, 4 \rightarrow 1\)).

Из третьей группы в первую можно отправить \(4\) единицы воды (\(7 \rightarrow 2, 7 \rightarrow 5, 6 \rightarrow 2, 6 \rightarrow 5\)).

Из третьей группы во вторую можно отправить \(4\) единицы воды (\(7 \rightarrow 3, 7 \rightarrow 4, 6 \rightarrow 3, 6 \rightarrow 4\)).

Минимальное количество воды, которое можно отправить из какой-то группы в другую равно \(4\). Можно доказать, что при любом другом разбиении на группы нельзя добиться ответа лучше.

D. Алиса и кукла

жадные алгоритмы Перебор реализация Структуры данных *2300

У Алисы недавно появилась новая кукла. Она даже может ходить!

Алиса построила лабиринт для куклы и хочет протестировать его. Лабиринт имеет вид таблицы с \(n\) строками и \(m\) столбцами. Также есть \(k\) препятствий, \(i\)-е из них находится в клетке \((x_i, y_i)\), это клетка на пересечении строки с номером \(x_i\) и столбца с номером \(y_i\).

Однако кукла очень неуклюжая. Она может только идти прямо и поворачиваться направо, но не больше одного раза в одной клетке (включая стартовую клетку). Она не может переходить в клетку с препятствием, а также покидать пределы лабиринта.

Более формально, всего существует \(4\) направления, в которых может смотреть кукла:

  1. Кукла смотрит в направлении вдоль строки от первой клетки к последней. Перемещаясь смотря в этом направлении, кукла переходит из клетки \((x, y)\) в клетку \((x, y + 1)\);
  2. Кукла смотрит в направлении вдоль столбца от первой клетки к последней. Перемещаясь смотря в этом направлении, кукла переходит из клетки \((x, y)\) в клетку \((x + 1, y)\);
  3. Кукла смотрит в направлении вдоль строки от последней клетки к первой. Перемещаясь смотря в этом направлении, кукла переходит из клетки \((x, y)\) в клетку \((x, y - 1)\);
  4. Кукла смотрит в направлении вдоль столбца от последней клетки к первой. Перемещаясь смотря в этом направлении, кукла переходит из клетки\((x, y)\) в клетку \((x - 1, y)\).
.

Находясь в некоторой клетке, кукла может перейти в клетку в направлении, в котором она смотрит, либо повернуться один раз направо. Поворачиваясь один раз направо, кукла меняет направление, в котором она смотрит следующим образом: \(1 \to 2\), \(2 \to 3\), \(3 \to 4\), \(4 \to 1\). В одной клетке, кукла может совершить не более одного поворота направо.

Сейчас Алиса управляет перемещениями куклы. Изначально она поставила куклу в клетку \((1, 1)\) (верхняя левая клетка лабиринта). Изначально кукла смотрит в направлении \(1\), то есть в направлении вдоль строки от первой клетки к последней. Она хочет обойти куклой все клетки лабиринта, не содержащие препятствий ровно по одному разу и закончить в любой клетке. Существует ли способ так сделать?

Входные данные

В первой строке находится три целых числа \(n\), \(m\) и \(k\), разделенных пробелами (\(1 \leq n,m \leq 10^5, 0 \leq k \leq 10^5\)) — размеры лабиринта и количество препятствий.

В следующих \(k\) строках находится описание препятствий, \(i\)-я из этих строк содержит два целых числа \(x_i\) и \(y_i\), разделенные пробелом (\(1 \leq x_i \leq n,1 \leq y_i \leq m\)), которые описывают позицию \(i\)-го препятствия.

Гарантируется, что никакие два препятствия не находятся в одной клетке и что нету препятствия в клетке \((1, 1)\).

Выходные данные

Выведите 'Yes' (без кавычек) если кукла может обойти все клетки, не содержащие препятствий по описанным выше правилам ровно по одному разу.

Если так обойти лабиринт невозможно, выведите 'No' (без кавычек).

Примечание

Картинка с лабиринтом из первого примера:

В первом примере, кукла может идти по следующему пути:

  • Кукла в клетке \((1, 1)\), смотрит в направлении \(1\). Пройти прямо;
  • Кукла в клетке \((1, 2)\), смотрит в направлении \(1\). Пройти прямо;
  • Кукла в клетке \((1, 3)\), смотрит в направлении \(1\). Повернуть направо;
  • Кукла в клетке \((1, 3)\), смотрит в направлении \(2\). Пройти прямо;
  • Кукла в клетке \((2, 3)\), смотрит в направлении \(2\). Пройти прямо;
  • Кукла в клетке \((3, 3)\), смотрит в направлении \(2\). Повернуть направо;
  • Кукла в клетке \((3, 3)\), смотрит в направлении \(3\). Пройти прямо;
  • Кукла в клетке \((3, 2)\), смотрит в направлении \(3\). Пройти прямо;
  • Кукла в клетке \((3, 1)\), смотрит в направлении \(3\). Цель достигнута, все клетки лабиринта, не содержащие препятствия посещены ровно один раз.

A. Сбалансированные изменения рейтинга

математика реализация *1000

Только что завершился очередной раунд на Codeforces! Раунд собрал \(n\) участников. В соответствии с результатами, ожидаемое изменение рейтинга участника \(i\) равно \(a_i\). Эти изменения рейтинга идеально сбалансированы — их сумма равна \(0\).

К сожалению, из-за небольших технических проблем раунд был объявлен полурейтинговым. Это значит, что все изменения рейтинга должны быть поделены на два.

Однако есть два условия:

  • Для каждого участника \(i\) обновлённое изменение рейтинга \(b_i\) должно быть целым числом, максимально близким к \(\frac{a_i}{2}\). Это значит, что либо \(b_i = \lfloor \frac{a_i}{2} \rfloor\), либо \(b_i = \lceil \frac{a_i}{2} \rceil\). В частности, если \(a_i\) чётно, то \(b_i = \frac{a_i}{2}\). Здесь \(\lfloor x \rfloor\) обозначает округление вниз до наибольшего целого числа, не большего \(x\), а \(\lceil x \rceil\) — округление вверх до наименьшего целого числа, не меньшего \(x\).
  • Обновлённые изменения рейтинга должны быть идеально сбалансированы — их сумма должна равняться \(0\).

Можете ли вы помочь с этой задачей?

Входные данные

Первая строка содержит целое число \(n\) (\(2 \le n \le 13\,845\)) — число участников раунда.

Каждая из следующих \(n\) строк содержит целое число \(a_i\) (\(-336 \le a_i \le 1164\)) — ожидаемое изменение рейтинга \(i\)-го участника.

Сумма всех \(a_i\) равна \(0\).

Выходные данные

Выведите \(n\) целых чисел \(b_i\), каждое из которых равно обновлённому изменению рейтинга \(i\)-го участника в порядке ввода.

Для всех \(i\) должно быть верно либо \(b_i = \lfloor \frac{a_i}{2} \rfloor\), либо \(b_i = \lceil \frac{a_i}{2} \rceil\). Сумма всех \(b_i\) должна быть равна \(0\).

Если есть несколько решений, выведите любое. Можно показать, что решение существует для любого корректного ввода.

Примечание

В первом примере, \(b_1 = 5\), \(b_2 = -3\) и \(b_3 = -2\) также является правильным ответом.

Во втором примере есть \(6\) возможных решений, приведено одно из них.

C2. Сбалансированные удаления (посложнее)

Бинарный поиск жадные алгоритмы Конструктив разделяй и властвуй реализация сортировки *1900

Это усложнённая версия задачи. В этой версии \(n \le 50\,000\).

В трёхмерном пространстве заданы \(n\) различных точек, пронумерованных от \(1\) до \(n\). \(i\)-я точка имеет координаты \((x_i, y_i, z_i)\). Число точек \(n\) — чётное.

Вы хотели бы удалить все \(n\) точек, используя последовательность из \(\frac{n}{2}\) щелчков. За один щелчок вы можете удалить любые две ещё не удалённые точки \(a\) и \(b\), которые образуют идеально сбалансированную пару. Пара точек \(a\) и \(b\) идеально сбалансирована, если никакая другая точка \(c\) (которая ещё не удалена) не лежит в пределах минимального ограничивающего точки \(a\) и \(b\) прямоугольного параллелепипеда с рёбрами, параллельными осям координат.

Формально, точка \(c\) лежит внутри ограничивающего параллелепипеда точек \(a\) и \(b\) тогда и только тогда, когда \(\min(x_a, x_b) \le x_c \le \max(x_a, x_b)\), \(\min(y_a, y_b) \le y_c \le \max(y_a, y_b)\) и \(\min(z_a, z_b) \le z_c \le \max(z_a, z_b)\). Обратите внимание, что параллелепипед может быть вырожденным.

Найдите способ удалить все точки за \(\frac{n}{2}\) щелчков.

Входные данные

Первая строка содержит целое число \(n\) (\(2 \le n \le 50\,000\); \(n\) чётно) — число точек.

Каждая из следующих \(n\) строк содержит три целых числа \(x_i\), \(y_i\), \(z_i\) (\(-10^8 \le x_i, y_i, z_i \le 10^8\)) — координаты \(i\)-й точки.

Никакие две точки не совпадают.

Выходные данные

Выведите \(\frac{n}{2}\) пар целых чисел \(a_i, b_i\) (\(1 \le a_i, b_i \le n\)) — номера точек, удаляемых щелчком \(i\). Каждое целое число от \(1\) до \(n\) должно встретиться в выводе ровно один раз.

Можно показать, что всегда возможно удалить все точки. Если есть несколько решений, выведите любое.

Примечание

В первом примере точки и их соответствующие параллелепипеды выглядят так (изображённые для простоты в двумерном пространстве, так как все точки лежат на плоскости \(z = 0\)). Обратите внимание, что порядок удаления точек важен: например, точки \(5\) и \(1\) не образуют идеально сбалансированную пару изначально, но начинают её образовывать после того, как удалена точка \(3\).

D. Сбалансированный плейлист

Бинарный поиск реализация Структуры данных *2000

Ваша любимая музыкальная платформа сформировала идеально сбалансированный плейлист специально для вас. В плейлисте \(n\) треков, пронумерованные от \(1\) до \(n\). Плейлист автоматический и циклический: когда трек \(i\) заканчивает воспроизведение, сразу включается трек \(i+1\); за треком \(n\) идёт трек \(1\).

Для каждого трека \(i\) вы оценили его крутость \(a_i\). Чем больше \(a_i\), тем круче трек \(i\).

Каждое утро вы выбираете трек. Плейлист начинает играть с этого трека в последовательном циклическом порядке. В любой момент вы помните крутость \(x\) самого крутого из уже сыгранных треков. Как только вы слышите, что начинает играть трек с крутостью строго меньше \(\frac{x}{2}\) (без округления), вы сразу же выключаете музыку, чтобы не портить себе хорошее настроение.

Для каждого трека \(i\) найдите, сколько треков вы послушаете перед тем, как выключите музыку, если начнёте утро с трека \(i\), или же определите, что вы никогда не выключите музыку. Обратите внимание, что если вы послушаете один трек несколько раз, все эти разы нужно посчитать.

Входные данные

Первая строка содержит целое число \(n\) (\(2 \le n \le 10^5\)) — число треков в плейлисте.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — крутости треков.

Выходные данные

Выведите \(n\) целых чисел \(c_1, c_2, \ldots, c_n\), где \(c_i\) — либо число треков, которые вы послушаете, если начнёте слушать с трека \(i\), либо \(-1\), если вы будете слушать музыку бесконечно.

Примечание

Вот что произойдёт в первом примере, если вы начнёте слушать с...

  • трека \(1\): послушаете трек \(1\), остановитесь, так как \(a_2 < \frac{a_1}{2}\).
  • трека \(2\): послушаете трек \(2\), остановитесь, так как \(a_3 < \frac{a_2}{2}\).
  • трека \(3\): послушаете трек \(3\), послушаете трек \(4\), послушаете трек \(1\), остановитесь, так как \(a_2 < \frac{\max(a_3, a_4, a_1)}{2}\).
  • трека \(4\): послушаете трек \(4\), послушаете трек \(1\), остановитесь, так как \(a_2 < \frac{\max(a_4, a_1)}{2}\).

Во втором примере, если вы начнёте с трека \(4\), вы послушаете трек \(4\), послушаете трек \(1\), послушаете трек \(2\), послушаете трек \(3\), послушаете снова трек \(4\), послушаете снова трек \(1\) и остановитесь, так как \(a_2 < \frac{max(a_4, a_1, a_2, a_3, a_4, a_1)}{2}\). Обратите внимание, что трек \(1\) и трек \(4\) учтены в результате дважды.

B. Весь мир — задача по программированию (усложнённая версия)

реализация *2500

Это усложнённая версия задачи. В этой версии \(n \le 300\,000\).

Вася — опытный составитель задач для олимпиад по программированию. Как и все великие творцы, Вася столкнулся с творческим кризисом. Чтобы исправить ситуацию, Петя подарил ему строку, состоящую только из открывающих и закрывающих скобок. Петя считает, что красотой строки из скобок называется количество её циклических сдвигов, которые приводят к правильной скобочной последовательности.

Чтобы отвлечься от проблем, Вася хочет выбрать любые две позиции в строке (не обязательно различных) и поменять местами символы на этих позициях. Такую операция Вася проделает ровно один раз. Ему стало интересно, какой максимальной красоты строки можно добиться, применив данную операцию. Помогите ему.

Напомним, что последовательность \(s\) из круглых скобок называется правильной, если верно одно из:

  • \(s\) является пустой;
  • \(s\) равна «(\(t\))», где \(t\) — правильная скобочная последовательность;
  • \(s\) равна \(t_1 t_2\), то есть конкатенации \(t_1\) и \(t_2\), где \(t_1\) и \(t_2\) являются правильными скобочными последовательностями.

Например, последовательности «(()())», «()» являются правильными, а «)(» и «())» нет.

Циклическим сдвигом строки \(s\) длины \(n\) на \(k\) (\(0 \leq k < n\)) называется строка, представляющая собой конкатенацию (сложение) последних \(k\) символов строки \(s\) и первых \(n - k\) символов строки \(s\). Например, циклический сдвиг строки «(())()» на \(2\) равен «()(())».

Циклические сдвиги на \(i\) и \(j\) называются различными, если \(i \ne j\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 300\,000\)) — длина строки, которую подарили Васе.

Вторая строка содержит одну строку, состоящую ровно из \(n\) символов, каждый из которых — либо открывающая скобка «(», либо закрывающая скобка «)».

Выходные данные

В первой строке выведите одно целое число — максимальную красоту строки, которую можно получить, поменяв местами какие-то два символа.

Во второй строке выведите целые числа \(l\) и \(r\) (\(1 \leq l, r \leq n\)) — номера символов, которые нужно поменять местами, чтобы максимизировать красоту строки.

Если возможных замен несколько, выведите любую из них.

Примечание

В первом примере после обмена местами \(7\)-й и \(8\)-й скобок получается строка «()()()()()», её циклические сдвиги на \(0, 2, 4, 6, 8\) являются правильными скобочными последовательностями.

Во втором примере после обмена местами \(5\)-й и \(10\)-й скобок получается строка «)(())()()(()», её циклические сдвиги на \(11, 7, 5, 3\) являются правильными скобочными последовательностями.

В третьем примере какие бы две скобки мы не поменяли местами, число циклических сдвигов, являющихся правильными скобочными последовательностями, будет равно \(0\).

C. Очередь в поезде

жадные алгоритмы реализация Структуры данных *2300

В вагоне поезда есть \(n\) мест, на каждом месте сидит ровно один человек. Места пронумерованы слева направо от \(1\) до \(n\). Поездка долгая, поэтому каждый человек в какой-то момент поездки проголодается и захочет заварить лапшу быстрого приготовления кипятком. Человек на месте \(i\) (\(1 \leq i \leq n\)) захочет выйти за кипятком ровно на \(t_i\)-й минуте.

Бак с кипятком находится левее \(1\)-го места за дверью. Люди, выходящие за кипятком, могут образовывать очередь у бака в порядке выхода, так как баком может одновременно пользоваться не более одного человека. Каждый человек пользуется баком ровно \(p\) минут. Можно считать, что люди выходят к баку или возвращаются на своё место после получения кипятка мгновенно.

Люди не любят просто так стоять в очереди. Поэтому, как только человек на месте с номером \(i\) захочет сходить за кипятком, он сначала посмотрит на все места с номерами от \(1\) до \(i - 1\). Если хотя бы одно из этих мест пустое, он предполагает что все эти люди стоят в очереди, а значит выходить за кипятком пока нецелесообразно. Тем не менее, он выйдет за кипятком в ближайший удобный момент, как только все места с номерами меньше \(i\) будут снова заняты. Люди не видят самого бака и очереди возле него за дверью, поэтому смотрят только на места в вагоне.

В поезде действует негласное правило: если в какой-то момент возникает ситуация, что за кипятком одновременно могут выйти несколько человек, то выходит только самый левый из них (имеющий место с наименьшим номером), а остальные остаются дожидаться следующего подходящего момента.

Задача состоит в том, чтобы для каждого человека определить, на какой минуте он получит кипяток для своей лапши.

Входные данные

Первая строка содержит два целых числа \(n\) и \(p\) (\(1 \leq n \leq 100\,000\), \(1 \leq p \leq 10^9\)) — количество людей в вагоне и время, в течение которого один человек пользуется баком.

Во второй строке содержатся \(n\) целых чисел \(t_1, t_2, \dots, t_n\) (\(0 \leq t_i \leq 10^9\)) — времена, когда соответствующий пассажир вагона захочет выйти за кипятком.

Выходные данные

Выведите \(n\) целых чисел, \(i\)-е из которых — время в минутах, когда человек на месте \(i\) получит кипяток.

Примечание

В примере в \(0\)-ю минуту за кипятком одновременно захотели пойти \(1\)-й и \(5\)-й человек, первый вышел сразу и на \(314\)-й минуте вернулся от бака. За это время множество желающих выйти за кипятком пополнилось \(2\)-м человеком, и следующим пошел \(2\)-й человек и т.д. \(5\)-й человек в итоге вышел последним.

E. Черепашка

дп реализация *3100

У мальчика Коли есть черепашка и поле \(2 \times n\). Строки поля пронумерованы от \(1\) до \(2\) сверху вниз, а столбцы от \(1\) до \(n\) слева направо.

Предположим, что в каждой клетке есть съедобный лист салата, энергетическая ценность которого в клетке поля в строке \(i\) и столбце \(j\) составляет \(a_{i,j}\). Черепашка изначально находится в верхней левой клетке и хочет попасть в правую нижнюю. Черепашка умеет двигаться только вниз и вправо, а среди всех возможных путей, она выберет тот, который максимизирует суммарную энергетическую ценность листов салата, через которые она проходит (если таких путей несколько, она выберет произвольный из них).

Коля беспокоится, что если черепашка съест слишком много салата, то это может быть опасно для её здоровья. Поэтому он хочет переставить листья салата таким образом, чтобы минимизировать суммарную энергетическую ценность салата, которую съест черепашка.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 25\)) — длина поля.

Вторая строка содержит \(n\) целых чисел \(a_{1, i}\) (\(0 \le a_{1, i} \le 50\,000\)) — энергетическая ценность листьев салата в первой строке поля.

Третья строка содержит \(n\) целых чисел \(a_{2, i}\) (\(0 \le a_{2, i} \le 50\,000\)) — энергетическая ценность листьев салата во второй строке поля.

Выходные данные

Выведите две строки по \(n\) чисел в каждой — расстановку листов салата после переупорядочивания Коли.

Если существует несколько оптимальных переупорядочиваний — выведите любое из них.

Примечание

В первом примере черепашка после перестановки сможет съесть салат суммарной энергетической эффективности \(1+4+2 = 7\).

Во втором примере черепашка съест салат суммарной энергетической эффективности \(0\).

В третьем примере черепашка сможет съесть салат суммарной энергетической эффективности \(1\).

F. Жулик, не воруй

графы реализация *3400

Я Карта! Я КАрТa! Я КААААРТА!!!
Карта

В ожидании новых приключений Башмачок захотел совершить доброе дело. Посовещавшись с Картой и Рюкзаком, он решил подарить Даше связный граф. После долгих поисков, Башмачок выбрал \(t\) вариантов графа, которые могли бы понравиться Даше, но, к сожалению, все его планы решил испортить лис Жулик.

Жулик знает, что Даша пока умеет считать только до \(3\), поэтому у него родилась идея. Он хочет украсть непустой набор вершин так, чтобы Даша не заметила пропажи. Поэтому он решил украсть непустой набор вершин такой, что если удалить выбранные вершины и связанные с ними рёбра из графа, то для любой из оставшихся вершин будет верно, что её степень (число смежных рёбер) будет иметь такой же остаток от деления на \(3\), что и степень до удаления рёбер. Также он понял, что будет слишком подозрительно, если он украдёт все вершины, поэтому он решил воздержаться от такой соблазнительной затеи.

Башмачок понял, что он не может позволить случиться преступлению. Но он боится, что одному ему не справиться. Поэтому он решил попросить у вас помощи. Башмачок хочет для каждого варианта графа узнать, сможет ли Жулик осуществить свои злобные планы, или нет.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\,000\)) — количество вариантов графа.

Первая строка описания каждого варианта содержит целые числа \(n\), \(m\) (\(1 \le n \le 500\,000\), \(0 \le m \le 500\,000\)) — количество вершин и рёбер в графе.

Затем следуют \(m\) строк, в каждой из которых записаны целые числа \(a_i\), \(b_i\) (\(1 \le a_i, b_i \le n\)) — номера вершин, соединённых очередным ребром.

Гарантируется, что граф связен и что в нём нет кратных рёбер и петель.

Гарантируется, что сумма \(n\) по всем вариантам не превосходит \(500\,000\), и что сумма \(m\) по всем вариантам не превосходит \(500\,000\).

Описания вариантов графа разделены одной пустой строкой.

Выходные данные

Для каждого варианта:

  • В случае, если ответ существует, выведите «Yes», а затем сам пример.

    Первая строка примера должна содержать целое число \(c\) (\(1 < c < n\)) — количество вершин, которые может украсть Жулик, чтобы Даша не заметила пропажи. В следующей строке выведите \(c\) различных чисел — номера этих вершин в произвольном порядке.

  • Иначе выведите «No».

Если существует несколько способов украсть вершины требуемым образом, выведите любой из них.

Обратите внимание, что необязательно красть максимальное возможное число вершин.

Примечание

На картинке ниже изображен третий вариант графа из примера. Жирным отмечены вершины, которые может украсть Жулик.

B. Перестановки

Комбинаторика Перебор реализация *1400

Дано n k-значных целых чисел. Требуется так переставить цифры в числах, чтобы разница между максимальным и минимальным числом была минимальна. Цифры во всех числах переставляются по одному и тому же правилу.

Входные данные

В первой строке заданы целые числа n и k — количество и разрядность чисел соответственно (1 ≤ n, k ≤ 8). В следующих n строках задаются k-значные положительные целые числа. Лидирующие нули разрешены как в исходных, так и в полученных после перестановки числах.

Выходные данные

Выведите одно число — минимальную возможную разницу между максимальным и минимальным числом после перестановки цифр во всех числах по одному и тому же правилу.

Примечание

В первом примере, если поменять порядок цифр в числах на (3,1,4,2), то 2-ое и 4-ое число будут равны 5237 и 2537 соответственно (они — максимальные и минимальные для такого порядка чисел).

Во втором примере, поменяв вторые по порядку цифры с первыми, получим числа 100, 99 и 102.

A. Максимальный квадрат

реализация *800

Уджан решил сделать новую крышу для своего дома. У него есть \(n\) прямоугольных досок, пронумерованных числами \(1\) до \(n\). У \(i\)-й доски размеры \(a_i \times 1\) (то есть ширина равна \(1\), а высота равна \(a_i\)).

В данный момент Уджан хочет сделать квадратную крышу. Сначала он выберет некоторые доски и расположит их одну за другой в каком-то порядке. Затем он склеит все эти доски по их вертикальным сторонам. Наконец, он вырежет квадрат из получившейся фигуры таким образом, что стороны квадрата горизонтальны и вертикальны.

Например, если у Уджана есть доски с длинами \(4\), \(3\), \(1\), \(4\) и \(5\), он может выбрать доски с длинами \(4\), \(3\) и \(5\). Тогда он может вырезать квадрат размером \(3 \times 3\), который является наибольшим возможным. Учтите, что в данном случае это не единственный способ получить квадрат размером \(3 \times 3\).

Чему равняется наибольшая длина стороны квадрата, который может получить Уджан?

Входные данные

Первая строка ввода содержит одно целое число \(k\) (\(1 \leq k \leq 10\)) — количество наборов входных данных в тесте.

Для каждого набора входных данных первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 1\,000\)) — количество досок в запасе Уджана. Следующая строка содержит \(n\) целых чисел \(a_1, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — длины досок.

Выходные данные

Для каждого набора входных данных выведите одно целое число, наибольшую возможную длину стороны квадрата.

Примечание

Первый набор входных данных примера соответствует примеру из условия.

Во втором наборе входных данных примера, склеив все \(4\) доски, получается квадрат размером \(4 \times 4\).

В третьем наборе входных данных примера наибольший квадрат имеет размер \(1 \times 1\) и такой можно получить, просто взяв любую из досок.

B. Комнаты и лестницы

Перебор реализация *1000

Николай живет в двухэтажном доме. На каждом этаже расположено по \(n\) комнат. Комнаты на каждом этаже расположены в ряд и пронумерованы слева направо целыми числами, начиная с единицы. Таким образом, каждая комната характеризуется номером этажа, на котором она находится, а также своим порядковым номером на этаже (это целое число от \(1\) до \(n\)).

Если Николай находится в какой-то комнате, он может перейти из нее в любую из двух соседних комнат на том же этаже (если таковые есть). Комнаты, с порядковыми номерами \(i\) и \(i+1\) на любом из этажей являются соседними, для всех \(1 \leq i \leq n - 1\). Также известно, что между некоторыми парами комнат, которые расположены на разных этажах, но имеют одинаковые порядковые номера, есть лестницы. Если между комнатой с номером \(x\) на первом этаже и комнатой с номером \(x\) на втором этаже есть лестница, то Николай может перейти по лестнице из одной комнаты в другую.

На картинке показан пример дома для случая \(n = 4\). Лестницы есть между комнатой номер \(2\) на первом этаже и комнатой номер \(2\) на втором этаже, а также между комнатой номер \(4\) на первом этаже и комнатой номер \(4\) на втором этаже. Стрелками указаны направления, по которым Николай может перемещаться между комнатами. Эта картинка соответствует строке «0101» во входных данных.

Николай хочет обойти комнаты в своем доме. Для этого он может выбрать любую комнату для начала обхода. Далее Николай будет переходить между комнатами, учитывая описанные выше правила. Если Николай уже был в какой-то комнате, то повторно возвращаться в эту комнату он не будет.

Определите максимальное количество комнат, которые Николай может обойти, если:

  • начать свой путь он может в любой комнате на любом этаже,
  • и не будет переходить в те комнаты, в которых он уже был.
Входные данные

В первой строке следует целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных в тесте. Затем следуют сами наборы входных данных. Каждый набор состоит из двух строк.

В первой строке следует целое число \(n\) \((1 \le n \le 1\,000)\) — количество комнат на каждом из двух этажей в доме Николая.

Во второй строке следует строка длины \(n\), состоящая из нулей и единиц. Если \(i\)-й символ строки равен '1', то между комнатой номер \(i\) на первом этаже и комнатой номер \(i\) на втором этаже есть лестница. Если \(i\)-й символ строки равен '0', то между комнатой номер \(i\) на первом этаже и комнатой номер \(i\) на втором этаже нет лестницы.

Во взломах разрешается использовать только один набор входных данных, то есть \(t = 1\) должно быть выполнено.

Выходные данные

Для каждого теста выведите максимальное количество комнат, которые Николай может обойти, если начать свой путь он может в произвольной комнате и не будет переходить в те комнаты, в которых он уже был.

Примечание

В первом наборе входных данных примера Николай может начать обход на первом этаже в первой комнате. Затем он может перейти во вторую комнату на первом этаже, а затем в третью комнату на первом этаже. После этого он может подняться по лестнице на второй этаж в третью комнату. Затем он может перейти в четвертую комнату на втором этаже, а после этого в пятую комнату на втором этаже. Таким образом, он посетит \(6\) комнат.

Во втором наборе входных данных нет ни одной лестницы, поэтому Николай может лишь обойти все комнаты на каком-то из этажей, начав либо в первой комнате на любом из этажей, либо в восьмой комнате на любом из этажей.

В третьем наборе входных данных Николай может обойти все комнаты в доме. Если он начнет обход в первой комнате на первом этаже, его путь может выглядеть следующим образом: первый этаж, первая комната \(\rightarrow\) второй этаж, первая комната \(\rightarrow\) второй этаж, вторая комната \(\rightarrow\) первый этаж, вторая комната \(\rightarrow\) первый этаж, третья комната \(\rightarrow\) второй этаж, третья комната \(\rightarrow\) второй этаж, четвертая комната \(\rightarrow\) первый этаж, четвертая комната \(\rightarrow\) первый этаж, пятая комната \(\rightarrow\) второй этаж, пятая комната.

В четвертом наборе входных данных Николай также может обойти все комнаты. Один из возможных вариантов: второй этаж, третья комната \(\rightarrow\) второй этаж, вторая комната \(\rightarrow\) второй этаж, первая комната \(\rightarrow\) первый этаж, первая комната \(\rightarrow\) первый этаж, вторая комната \(\rightarrow\) первый этаж, третья комната.

D. Покраска вершин

графы Деревья дп Конструктив Перебор реализация *1800

Вам задано дерево, состоящее из \(n\) вершин. Дерево — это связный неориентированный граф, не содержащий циклов.

Пример дерева.

Вы должны покрасить каждую вершину дерева в один из трех цветов. Для каждой вершины известна стоимость ее покраски в каждый из трех цветов.

Вам нужно покрасить все вершины таким образом, чтобы в любом пути, состоящем ровно из трех различных вершин, цвета всех этих трех вершин были различны. Иными словами, рассмотрим все такие тройки вершин \((x, y, z)\), что \(x \neq y, y \neq z, x \neq z\), вершина \(x\) соединена ребром с вершиной \(y\), а вершина \(y\) соединена ребром с вершиной \(z\). Тогда цвета вершин \(x\), \(y\) и \(z\) должны быть попарно различны. Назовем такую покраску вершин хорошей.

Перед вами стоит задача определить минимальную стоимость хорошей покраски дерева, а также в какой цвет необходимо покрасить каждую из вершин. Если не существует ни одной хорошей покраски дерева, сообщите об этом.

Входные данные

В первой строке следует целое число \(n\) \((3 \le n \le 100\,000)\) — количество вершин в дереве.

Во второй строке следует последовательность \(c_{1, 1}, c_{1, 2}, \dots, c_{1, n}\) \((1 \le c_{1, i} \le 10^{9})\), где \(c_{1, i}\) равно стоимости покраски \(i\)-й вершины в первый цвет.

В третьей строке следует последовательность \(c_{2, 1}, c_{2, 2}, \dots, c_{2, n}\) \((1 \le c_{2, i} \le 10^{9})\), где \(c_{2, i}\) равно стоимости покраски \(i\)-й вершины во второй цвет.

В четвертой строке следует последовательность \(c_{3, 1}, c_{3, 2}, \dots, c_{3, n}\) \((1 \le c_{3, i} \le 10^{9})\), где \(c_{3, i}\) равно стоимости покраски \(i\)-й вершины в третий цвет.

В каждой из следующих \((n - 1)\) строк следует по два целых числа \(u_j\) и \(v_j\) \((1 \le u_j, v_j \le n, u_j \neq v_j)\) — номера вершин, соединенных неориентированным ребром \(j\). Гарантируется, что заданные ребра образуют дерево.

Выходные данные

Если не существует хорошей покраски дерева, выведите \(-1\).

В противном случае, в первой строке выведите минимальную стоимость хорошей покраски графа. Во второй строке выведите \(n\) целых чисел \(b_1, b_2, \dots, b_n\) \((1 \le b_i \le 3)\), где \(i\)-е число должно быть равно цвету, в который нужно покрасить вершину \(i\). Если подходящих покрасок минимальной стоимости несколько, разрешается вывести любую из них.

Примечание

В первом примере три вершины, поэтому все они должны быть покрашены в разные цвета. Первую вершину нужно покрасить в цвет \(1\), вторую вершину — в цвет \(3\), а третью вершину — в цвет \(2\). Стоимость такой покраски равна \(3 + 2 + 1 = 6\).

F. Фишки

Конструктив реализация *2300

На круглом столе расположены \(n\) фишек, которые лежат по кругу. Все фишки пронумерованы подряд целыми числами от \(1\) до \(n\).

Изначально каждая фишка имеет черный или белый цвет. После этого происходит \(k\) итераций. На каждой итерации фишки становятся черными или белыми в соответствии со следующими правилами. Для каждой фишки \(i\) подсчитывается количество белых и черных фишек на предыдущей итерации. В подсчете участвует фишка \(i\), а также ее непосредственные соседи слева и справа. Если белых фишек было больше, то фишка \(i\) должна стать белого цвета. В противном случае, фишка \(i\) должна стать черного цвета.

Обратите внимание, что для всех \(i\) от \(2\) до \((n - 1)\) соседняя фишка слева имеет номер \((i - 1)\), а соседняя фишка справа имеет номер \((i + 1)\). Для \(i = 1\) соседняя фишка слева имеет номер \(n\), а соседняя фишка справа имеет номер \(2\). Для \(i = n\) соседняя фишка слева имеет номер \((n - 1)\), а соседняя фишка справа имеет номер \(1\).

На рисунке представлено изменение цветов фишек после одной итерации для случая \(n = 6\). Фишки \(1\), \(3\) и \(4\) изначально черного цвета, а фишки \(2\), \(5\) и \(6\) — белого. После одной итерации фишки \(2\), \(3\) и \(4\) становятся черного цвета, а фишки \(1\), \(5\) и \(6\) — белого.

Перед вами стоит задача определить какого цвета будут все фишки после \(k\) итераций.

Входные данные

В первой строке следуют два целых числа \(n\) и \(k\) \((3 \le n \le 200\,000, 1 \le k \le 10^{9})\) — количество фишек и количество итераций.

Во второй строке следует строка, состоящая из \(n\) букв «W» и «B». Если \(i\)-й символ строки равен «W», то изначально \(i\)-я фишка имеет белый цвет. Если \(i\)-й символ строки равен «B», то изначально \(i\)-я фишка имеет черный цвет.

Выходные данные

Выведите строку, состоящую из \(n\) букв «W» и «B». Если после \(k\) итераций \(i\)-я фишка будет иметь белый цвет, то \(i\)-й символ выведенной строки должен быть равен «W». В противном случае, \(i\)-й символ выведенной строки должен быть равен «B».

Примечание

Первый пример подробно разобран в условии.

Во втором примере цвета фишек будут изменяться следующим образом: «WBWBWBW» \(\rightarrow\) «WWBWBWW» \(\rightarrow\) «WWWBWWW» \(\rightarrow\) «WWWWWWW». Таким образом, после трех итераций все фишки будут белого цвета.

В третьем примере цвета фишек будут изменяться следующим образом: «BWBWBW» \(\rightarrow\) «WBWBWB» \(\rightarrow\) «BWBWBW» \(\rightarrow\) «WBWBWB» \(\rightarrow\) «BWBWBW».

D1. Весь мир — задача по программированию (упрощённая версия)

дп жадные алгоритмы Перебор реализация *2000

Это упрощённая версия задачи. В этой версии \(n \le 500\).

Вася — опытный составитель задач для олимпиад по программированию. Как и все великие творцы, Вася столкнулся с творческим кризисом. Чтобы исправить ситуацию, Петя подарил ему строку, состоящую только из открывающих и закрывающих скобок. Петя считает, что красотой строки из скобок называется количество её циклических сдвигов, которые приводят к правильной скобочной последовательности.

Чтобы отвлечься от проблем, Вася хочет выбрать любые две позиции в строке (не обязательно различных) и поменять местами символы на этих позициях. Такую операция Вася проделает ровно один раз. Ему стало интересно, какой максимальной красоты строки можно добиться, применив данную операцию. Помогите ему.

Напомним, что последовательность \(s\) из круглых скобок называется правильной, если верно одно из:

  • \(s\) является пустой;
  • \(s\) равна «(\(t\))», где \(t\) — правильная скобочная последовательность;
  • \(s\) равна \(t_1 t_2\), то есть конкатенации \(t_1\) и \(t_2\), где \(t_1\) и \(t_2\) являются правильными скобочными последовательностями.

Например, последовательности «(()())», «()» являются правильными, а «)(» и «())» нет.

Циклическим сдвигом строки \(s\) длины \(n\) на \(k\) (\(0 \leq k < n\)) называется строка, представляющая собой конкатенацию (сложение) последних \(k\) символов строки \(s\) и первых \(n - k\) символов строки \(s\). Например, циклический сдвиг строки «(())()» на \(2\) равен «()(())».

Циклические сдвиги на \(i\) и \(j\) называются различными, если \(i \ne j\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 500\)) — длина строки, которую подарили Васе.

Вторая строка содержит одну строку, состоящую ровно из \(n\) символов, каждый из которых — либо открывающая скобка «(», либо закрывающая скобка «)».

Выходные данные

В первой строке выведите одно целое число — максимальную красоту строки, которую можно получить, поменяв местами какие-то два символа.

Во второй строке выведите целые числа \(l\) и \(r\) (\(1 \leq l, r \leq n\)) — номера символов, которые нужно поменять местами, чтобы максимизировать красоту строки.

Если возможных замен несколько, выведите любую из них.

Примечание

В первом примере после обмена местами \(7\)-й и \(8\)-й скобок получается строка «()()()()()», её циклические сдвиги на \(0, 2, 4, 6, 8\) являются правильными скобочными последовательностями.

Во втором примере после обмена местами \(5\)-й и \(10\)-й скобок получается строка «)(())()()(()», её циклические сдвиги на \(11, 7, 5, 3\) являются правильными скобочными последовательностями.

В третьем примере какие бы две скобки мы не поменяли местами, число циклических сдвигов, являющихся правильными скобочными последовательностями, будет равно \(0\).

C1. Хорошие числа (простая версия)

жадные алгоритмы Перебор реализация *1300

Единственное отличие между простой и сложной версиями — максимальное значение \(n\).

Вам дано положительное целое число \(n\). Вы очень любите хорошие числа, поэтому вам хочется найти минимальное хорошее число, большее или равное \(n\).

Положительное число называется хорошим, если оно может быть представлено в виде суммы различных степеней \(3\) (т.е. повторения степеней \(3\) запрещены).

Например:

  • \(30\)хорошее число: \(30 = 3^3 + 3^1\),
  • \(1\)хорошее число: \(1 = 3^0\),
  • \(12\)хорошее число: \(12 = 3^2 + 3^1\),
  • но \(2\) не является хорошим числом: вы не можете представить его в виде суммы различных степеней \(3\) (\(2 = 3^0 + 3^0\)),
  • \(19\) не является хорошим числом: вы не можете представить его в виде суммы различных степеней \(3\) (например, представления \(19 = 3^2 + 3^2 + 3^0 = 3^2 + 3^1 + 3^1 + 3^1 + 3^0\) не являются корректными),
  • \(20\) тоже не является хорошим числом: вы не можете представить его в виде суммы различных степеней \(3\) (например, представление \(20 = 3^2 + 3^2 + 3^0 + 3^0\) не является корректным).

Обратите внимание, что существуют и другие представления \(19\) и \(20\) в качестве сумм степеней \(3\), но ни одно из них не состоит из различных степеней \(3\).

Для заданного положительного числа \(n\) найдите наименьшее \(m\) (\(n \le m\)) такое, что \(m\)хорошее число.

Вам необходимо ответить на \(q\) независимых запросов.

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 500\)) — количество запросов. Затем следуют \(q\) запросов.

Единственная строка запроса содержит одно целое число \(n\) (\(1 \le n \le 10^4\)).

Выходные данные

Для каждого запроса выведите наименьшее число \(m\) (где \(n \le m\)) такое, что \(m\)хорошее число.

B. Простой XML

реализация *1000

Назовем открывающим тегом строку <x>, где x — любая строчная буква латинского алфивита. Каждому открывающему тегу соответствует закрывающий тег вида </x>, где x — та же самая буква.

Теги могут вкладываться друг в друга: в этому случае одна пара из открывающего и закрывающего тега находится внутри другой пары.

Определим понятие XML-текста:

  • пустая строка — это XML-текст
  • если s — это XML-текст, то s'=<a>+s+</a> — тоже XML-текст, где a — любая строчная буква латинского алфавита
  • если s1, s2 — это XML-тексты, то s1+s2 — тоже XML-текст

Вам дан XML-текст (гарантируется, что он корректен), ваша задача — вывести его в формате:

  • каждый тег (как открывающий, так и закрывающий) находится на отдельной строке
  • перед тегом выводится 2 * h пробелов, где h — уровень вложенности тега.
Входные данные

Входные данные состоят из единственной непустой строки — XML-текста, его длина не превосходит 1000 символов. Гарантируется корректность этого текста. Текст не содержит пробелов.

Выходные данные

Выведите данный XML-текст в соответствии с описанными выше правилами.

A. Berstagram

реализация *1400

Polycarp recently signed up to a new social network Berstagram. He immediately published \(n\) posts there. He assigned numbers from \(1\) to \(n\) to all posts and published them one by one. So, just after publishing Polycarp's news feed contained posts from \(1\) to \(n\) — the highest post had number \(1\), the next one had number \(2\), ..., the lowest post had number \(n\).

After that he wrote down all likes from his friends. Likes were coming consecutively from the \(1\)-st one till the \(m\)-th one. You are given a sequence \(a_1, a_2, \dots, a_m\) (\(1 \le a_j \le n\)), where \(a_j\) is the post that received the \(j\)-th like.

News feed in Berstagram works in the following manner. Let's assume the \(j\)-th like was given to post \(a_j\). If this post is not the highest (first) one then it changes its position with the one above. If \(a_j\) is the highest post nothing changes.

For example, if \(n=3\), \(m=5\) and \(a=[3,2,1,3,3]\), then Polycarp's news feed had the following states:

  • before the first like: \([1, 2, 3]\);
  • after the first like: \([1, 3, 2]\);
  • after the second like: \([1, 2, 3]\);
  • after the third like: \([1, 2, 3]\);
  • after the fourth like: \([1, 3, 2]\);
  • after the fifth like: \([3, 1, 2]\).

Polycarp wants to know the highest (minimum) and the lowest (maximum) positions for each post. Polycarp considers all moments of time, including the moment "before all likes".

Input

The first line contains two integer numbers \(n\) and \(m\) (\(1 \le n \le 10^5\), \(1 \le m \le 4 \cdot10^5\)) — number of posts and number of likes.

The second line contains integers \(a_1, a_2, \dots, a_m\) (\(1 \le a_j \le n\)), where \(a_j\) is the post that received the \(j\)-th like.

Output

Print \(n\) pairs of integer numbers. The \(i\)-th line should contain the highest (minimum) and the lowest (maximum) positions of the \(i\)-th post. You should take into account positions at all moments of time: before all likes, after each like and after all likes. Positions are numbered from \(1\) (highest) to \(n\) (lowest).

E. The Coronation

графы реализация *2300

The coronation of King Berl XXII is soon! The whole royal family, including \(n\) daughters of Berl XXII, will be present.

The King has ordered his jeweler to assemble \(n\) beautiful necklaces, so each of the princesses could wear exactly one necklace during the ceremony — and now these necklaces are finished. Each necklace consists of \(m\) gems attached to a gold chain. There are two types of gems used in the necklaces — emeralds and sapphires. So, each necklace can be represented by a sequence of \(m\) gems (listed from left to right), and each gem is either an emerald or a sapphire. Formally, the \(i\)-th necklace can be represented by a binary string \(s_i\) of length \(m\); if the \(j\)-th character of \(s_i\) is 0, then the \(j\)-th gem in the \(i\)-th necklace is an emerald; otherwise, this gem is a sapphire.

Now, looking at the necklaces, the King is afraid that some of his daughters may envy the other daughters' necklaces. He wants all necklaces to look similar. Two necklaces are considered similar if there are at least \(k\) positions where these necklaces contain the same type of gems.

For example, if there is a necklace represented by a sequence 01010111 and a necklace represented by a sequence 01100000, then there are \(3\) positions where these necklaces contain the same type of gems (both first gems are emeralds, both second gems are sapphires, and both fifth gems are emeralds). So if \(k = 3\), these necklaces are similar, and if \(k = 4\), they are not similar.

The King thinks that if two of his daughters notice that their necklaces are not similar, then they may have a conflict — and, obviously, he doesn't want any conflicts during the coronation! So Berl XXII wants to tell some of his daughters to wear their necklaces backward. If a necklace is worn backward, then the sequence of gems in this necklace is reversed. For example, if a necklace is represented by a sequence 01100, then, if worn backward, it would be represented by a sequence 00110. The King wants to find the minimum number of necklaces to be worn backward during the coronation so that there are no conflicts.

Berl XXII is too busy with preparation for the coronation, so he ordered you to resolve this issue for him. Help him — and he will give you a truly royal reward!

Input

The first line contains one integer \(t\) (\(1 \le t \le 50\)) — the number of test cases. Then the test cases follow.

Each test case begins with a line containing three integers \(n\), \(m\) and \(k\) (\(2 \le n \le 50\), \(1 \le k \le m \le 50\)) — the number of necklaces, the number of gems in each necklace, and the minimum number of positions where two necklaces have to have the same type of gems in order to look similar, respectively.

Then \(n\) lines follow, the \(i\)-th of them contains a binary string \(s_i\) of length \(m\) representing the \(i\)-th necklace.

Output

For each test case, print the answer as follows.

If it is impossible to avoid the conflict, print -1 on a single line. In this case you should not output anything else for that test case.

Otherwise, the first line of the test case answer should contain the single integer \(d\) — the minimum number of necklaces that are to be worn backward. The second line of the test case answer should contain the numbers of these necklaces (integers from \(1\) to \(n\)) in any order. If \(d = 0\) then leave the second line of the test case answer empty. If there are multiple answers, you may print any of them.

F. Data Center

Перебор реализация *800

You are developing a project to build a new data center. The data center will be a rectangle with an area of exactly \(n\) square meters. Each side of the data center must be an integer.

Your goal is to minimize the impact of the external environment on the data center. For this reason, you want to minimize the length of the perimeter of the data center (that is, the sum of the lengths of its four sides).

What is the minimum perimeter of a rectangular data center with an area of exactly \(n\) square meters, if the lengths of all its sides must be integers?

Input

The first and only line of the input contains an integer \(n\) (\(1 \le n \le 10^5\)), where \(n\) is the area of the data center in square meters.

Output

Print the required minimum perimeter in meters.

Note

In the first example, the required shape of the data center is \(6\times6\) square. Its area is \(36\) and the perimeter is \(6+6+6+6=24\).

In the second example, the required shape of the data center is \(1\times13\) rectangle. Its area is \(13\) and the perimeter is \(1+13+1+13=28\).

In the third example, the required shape of the data center is \(1\times1\) square. Its area is \(1\) and the perimeter is \(1+1+1+1=4\).

C. Even Path

реализация Структуры данных *1600

Pathfinding is a task of finding a route between two points. It often appears in many problems. For example, in a GPS navigation software where a driver can query for a suggested route, or in a robot motion planning where it should find a valid sequence of movements to do some tasks, or in a simple maze solver where it should find a valid path from one point to another point. This problem is related to solving a maze.

The maze considered in this problem is in the form of a matrix of integers \(A\) of \(N \times N\). The value of each cell is generated from a given array \(R\) and \(C\) of \(N\) integers each. Specifically, the value on the \(i^{th}\) row and \(j^{th}\) column, cell \((i,j)\), is equal to \(R_i + C_j\). Note that all indexes in this problem are from \(1\) to \(N\).

A path in this maze is defined as a sequence of cells \((r_1,c_1), (r_2,c_2), \dots, (r_k,c_k)\) such that \(|r_i - r_{i+1}| + |c_i - c_{i+1}| = 1\) for all \(1 \le i < k\). In other words, each adjacent cell differs only by \(1\) row or only by \(1\) column. An even path in this maze is defined as a path in which all the cells in the path contain only even numbers.

Given a tuple \(\langle r_a,c_a,r_b,c_b \rangle\) as a query, your task is to determine whether there exists an even path from cell \((r_a,c_a)\) to cell \((r_b,c_b)\). To simplify the problem, it is guaranteed that both cell \((r_a,c_a)\) and cell \((r_b,c_b)\) contain even numbers.

For example, let \(N = 5\), \(R = \{6, 2, 7, 8, 3\}\), and \(C = \{3, 4, 8, 5, 1\}\). The following figure depicts the matrix \(A\) of \(5 \times 5\) which is generated from the given array \(R\) and \(C\).

Let us consider several queries:

  • \(\langle 2, 2, 1, 3 \rangle\): There is an even path from cell \((2,2)\) to cell \((1,3)\), e.g., \((2,2), (2,3), (1,3)\). Of course, \((2,2), (1,2), (1,3)\) is also a valid even path.
  • \(\langle 4, 2, 4, 3 \rangle\): There is an even path from cell \((4,2)\) to cell \((4,3)\), namely \((4,2), (4,3)\).
  • \(\langle 5, 1, 3, 4 \rangle\): There is no even path from cell \((5,1)\) to cell \((3,4)\). Observe that the only two neighboring cells of \((5,1)\) are cell \((5,2)\) and cell \((4,1)\), and both of them contain odd numbers (7 and 11, respectively), thus, there cannot be any even path originating from cell \((5,1)\).
Input

Input begins with a line containing two integers: \(N\) \(Q\) (\(2 \le N \le 100\,000\); \(1 \le Q \le 100\,000\)) representing the size of the maze and the number of queries, respectively. The next line contains \(N\) integers: \(R_i\) (\(0 \le R_i \le 10^6\)) representing the array \(R\). The next line contains \(N\) integers: \(C_i\) (\(0 \le C_i \le 10^6\)) representing the array \(C\). The next \(Q\) lines each contains four integers: \(r_a\) \(c_a\) \(r_b\) \(c_b\) (\(1 \le r_a, c_a, r_b, c_b \le N\)) representing a query of \(\langle r_a, c_a, r_b, c_b \rangle\). It is guaranteed that \((r_a,c_a)\) and \((r_b,c_b)\) are two different cells in the maze and both of them contain even numbers.

Output

For each query in the same order as input, output in a line a string "YES" (without quotes) or "NO" (without quotes) whether there exists an even path from cell \((r_a,c_a)\) to cell \((r_b,c_b)\).

Note

Explanation for the sample input/output #1

This is the example from the problem description.

H. Twin Buildings

жадные алгоритмы реализация *1800

As you might already know, space has always been a problem in ICPC Jakarta. To cope with this, ICPC Jakarta is planning to build two new buildings. These buildings should have a shape of a rectangle of the same size. Now, their problem is to find land to build the buildings.

There are \(N\) lands available for sale. The \(i^{th}\) land has a rectangular shape of size \(L_i \times W_i\). For a good feng shui, the building's side should be parallel to the land's sides.

One way is to build the two buildings on two different lands, one on each land (not necessarily with the same orientation). A building of size \(A \times B\) can be build on the \(i^{th}\) land if and only if at least one of the following is satisfied:

  • \(A \le L_i\) and \(B \le W_i\), or
  • \(A \le W_i\) and \(B \le L_i\).
Alternatively, it is also possible to build two buildings of \(A \times B\) on the \(i^{th}\) land with the same orientation. Formally, it is possible to build two buildings of \(A \times B\) on the \(i^{th}\) land if and only if at least one of the following is satisfied:
  • \(A \times 2 \le L_i\) and \(B \le W_i\), or
  • \(A \times 2 \le W_i\) and \(B \le L_i\), or
  • \(A \le L_i\) and \(B \times 2 \le W_i\), or
  • \(A \le W_i\) and \(B \times 2 \le L_i\).

Your task in this problem is to help ICPC Jakarta to figure out the largest possible buildings they can build given \(N\) available lands. Note that ICPC Jakarta has to build two buildings of \(A \times B\); output the largest possible for \(A \times B\).

Input

Input begins with a line containing an integer: \(N\) (\(1 \le N \le 100\,000\)) representing the number of available lands. The next \(N\) lines each contains two integers: \(L_i\) \(W_i\) (\(1 \le L_i, W_i \le 10^9\)) representing the size of the land.

Output

Output in a line a number representing the largest building that ICPC Jakarta can build with exactly one decimal point (see sample input/output for clarity).

Note

Explanation for the sample input/output #1

Two buildings of \(2.5 \times 5\) can be built both on the first land.

Explanation for the sample input/output #2

Two buildings of \(2 \times 4\) can be built each on the first and second lands.

Explanation for the sample input/output #3

Two buildings of \(7 \times 6\) can be built each on the second and third lands.

A. Один подъем

реализация *1000

Вам дано два массива \(a[1 \dots n]\) и \(b[1 \dots n]\) одинаковой длины \(n\).

Чтобы проделать подъем, вам необходимо выбрать три таких целых числа \(l, r, k\), что \(1 \le l \le r \le n\) и \(k > 0\). Затем, вы прибавляете \(k\) к элементам \(a_l, a_{l+1}, \ldots, a_r\).

К примеру, если массив \(a = [3, 7, 1, 4, 1, 2]\), и вы выбираете \((l = 3, r = 5, k = 2)\), массив \(a\) станет \([3, 7, \underline{3, 6, 3}, 2]\).

Вы можете применять эту операцию не более одного раза. Можете ли вы сделать массив \(a\) равным массиву \(b\)?

(Мы считаем, что \(a = b\) если и только если для всех \(1 \le i \le n\), \(a_i = b_i\))

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 20\)) — количество тестовых случаев.

В первой строке каждого тестового случая записано целое число \(n\) (\(1 \le n \le 100\ 000\)) — количество элементов в каждом массиве.

Во второй строке каждого тестового случая записаны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 1000\)).

В третьей строке каждого тестового случая записаны \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le 1000\)).

Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(10^5\).

Выходные данные

Для каждого тестового случая выведите в отдельной строке «YES» если возможно сделать \(a\) и \(b\) равными за не более чем один подъем или «NO», иначе.

Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

Первый тестовый случай разобран в условии: мы можем сделать подъем с параметрами \((l=3, r=5, k=2)\), чтобы превратить \(a\) в \(b\).

Во втором тестовом случае необходимо сделать хотя бы два подъема, чтобы превратить \(a\) в \(b\).

В третьем тестовом случае \(a\) и \(b\) уже равны исходно.

В четвертом тестовом случае невозможно превратить \(a\) а \(b\), потому что число \(k\) должно быть положительным.

B. Глупая ошибка

жадные алгоритмы реализация *1400

В Центральной Компании есть офис со сложной системой безопасности. В офисе работает \(10^6\) сотрудников, пронумерованных от \(1\) до \(10^6\).

Система безопасности записывает в лог входы и выходы из офиса. Вход \(i\)-го работника описывается числом \(i\), а выход \(i\)-го работника описывается числом \(-i\).

У компании есть строгие правила:

  • Сотрудник может зайти в офис не более одного раза за день.
  • Очевидно, сотрудник не может выйти из офиса если он не зашел в него ранее в этот день.
  • В начале и конце каждого дня офис пуст (сотрудники не могут оставаться в офисе на ночь). Он также может быть пуст в любой момент дня.

Любой массив событий, удовлетворяющий этим правилам называется корректным днем.

Приведем некоторые примеры корректных или некорректных дней:

  • \([1, 7, -7, 3, -1, -3]\) это корректный день (\(1\) входит, \(7\) входит, \(7\) выходит, \(3\) входит, \(1\) выходит, \(3\) выходит).
  • \([2, -2, 3, -3]\) это также корректный день.
  • \([2, 5, -5, 5, -5, -2]\) это некорректный день, потому что \(5\) зашел в офис дважды в течение одного дня.
  • \([-4, 4]\) это некорректный день, потому что \(4\) вышел из офиса, не заходя в него.
  • \([4]\) это некорректный день, потому что \(4\) вошел в офис и не вышел из него до конца дня.

Есть \(n\) событий \(a_1, a_2, \ldots, a_n\), в порядке, в котором они происходили. Этот массив соответствует одному или нескольким последовательным дням. Системный администратор по ошибке удалил номера дней, но он не менял порядок событий.

Ваша задача разбить (разрезать) массив событий \(a\) на последовательные подотрезки, которые должны образовывать непустые корректные дни (или определить, что это невозможно). Каждый элемент массива должен принадлежать ровно одному подотрезку разбиения. Каждый последовательный подотрезок массива должен образовывать корректный день.

К примеру, если \(n=8\) и \(a=[1, -1, 1, 2, -1, -2, 3, -3]\), тогда его можно разбить на два последовательных подотрезка, каждый из которых является корректным днем: \(a = [1, -1~ \boldsymbol{|}~ 1, 2, -1, -2, 3, -3]\).

Помогите администратору корректно разбить \(a\) или определите, что это невозможно. Найдите любое подходящее разбиение, вам не нужно минимизировать или максимизировать количество частей.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 10^5\)).

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^6 \le a_i \le 10^6\) and \(a_i \neq 0\)).

Выходные данные

Если не существует корректного разбиения, выведите \(-1\). Иначе, выведите любое корректое разбиение в следующем формате:

  • В первой строке выведите количество дней \(d\) (\(1 \le d \le n\)).
  • Во второй строке, выведите \(d\) целых чисел \(c_1, c_2, \ldots, c_d\) (\(1 \le c_i \le n\) and \(c_1 + c_2 + \ldots + c_d = n\)), где \(c_i\) это количество событий в \(i\)-м дне.

Если есть несколько возможных решений, вы можете вывести любое из них. Вам необязательно минимизировать или максимизировать количество дней.

Примечание

В первом примере весь массив является корректным днем.

Во втором примере, один из возможных способов это разбить массив на \([1, -1]\) и \([1, 2, -1, -2, 3, -3]\) (\(d = 2\) и \(c = [2, 6]\)). Единственное другое возможное решение это разбить на \([1, -1]\), \([1, 2, -1, -2]\) и \([3, -3]\) (\(d = 3\) и \(c = [2, 4, 2]\)). Оба решения принимаются.

В третьем и четвертом примерах, можно доказать, что решения нет. Пожалуйста, обратите внимание, что массив данный во вводе не является гарантированно корректным набором событий.

A. Кормление куриц

жадные алгоритмы Конструктив реализация *1700

Лун — большой фанат CFC (Codeforces Fried Chicken/жареные курицы Codeforces). Однако цена на CFC растет, поэтому он решил разводить куриц на собственной ферме.

Его ферму можно представить как прямоугольную сетку с \(r\) строками и \(c\) столбцами. Некоторые из этих клеток содержат рис, другие пусты. На ферме живут \(k\) куриц. Количество куриц не превышает количество клеток с рисом.

Лун хочет подарить своим курицам клетки с рисом. Он хотел бы удовлетворить следующие требования:

  • Каждая клетка фермы должна быть отдана ровно одной курице.
  • Каждая курица должна получить как минимум одну клетку.
  • Набор клеток, отданных одной курице, должен образовать связную область. Другими словами, если две клетки \((x, y)\) и \((u, v)\) отданы одной и той же курице, эта курица может пройти от \((x, y)\) до \((u, v)\), проходя только свои клетки и перемещаясь из каждой клетки в другую, разделяющую одну сторону (то есть, связность «по стороне»).

Лун не хочет, чтобы его курицы боролись за еду. Поэтому он хочет, чтобы разница между максимальным и минимальным количеством клеток с рисом, отданных для одной курицы, была как можно меньше. Пожалуйста, помогите ему.

Входные данные

Во входных данных находятся несколько (один или более) наборов входных данных. В первой строке находится одно целое число \(T\) (\(1 \le T \le 2 \cdot 10^4\)) — количество наборов входных данных. Далее следуют их описания.

Первая строка каждого набора содержит три целых числа \(r\), \(c\) и \(k\) (\(1 \leq r, c \leq 100, 1 \leq k \leq 62\)), которые обозначают размер фермы Луна и количество его куриц.

Каждая из следующих \(r\) строк содержит \(c\) символов, либо «.», либо «R», которые обозначают пустую клетку и клетку с рисом. Гарантируется, что количество куриц не превосходит количество клеток с рисом.

Гарантируется, что сумма значений \(r \cdot c\) по всем наборам входных данных в тесте не превосходит \(2 \cdot 10^4\).

Выходные данные

Для каждого теста выведите \(r\) строк по \(c\) символов на каждой из них. Каждый символ должен быть либо буквой английского алфавита (либо прописной, либо строчной), либо цифрой. Два символа должны быть одинаковы тогда и только тогда, когда соответствующие клетки принадлежат одной и той же курице. Большие и маленькие буквы считаются различными, поэтому «A» и «a» принадлежат различным курицам.

Если существует несколько решений, выведите любое из них.

Примечание

Эти рисунки объясняют пример вывода. Каждый цвет представляет одну курицу. Клетки, заполненные узорами (не однотонные), содержат рис.

В первом примере каждая курица имеет одну клетку с рисом. Следовательно, разница между максимальным и минимальным количеством клеток с рисом, отданных для курицы, равна \(0\).

Во втором примере есть \(4\) курицы, у которых по \(3\) клетки с рисом, и \(2\) курицы с \(2\) клетками. Следовательно, разница между максимальным и минимальным количеством клеток с рисом, отданных для курицы, составляет \(3 - 2 = 1\).

В третьем примере каждая курица имеет \(3\) клетки с рисом.

В последнем примере есть \(62\) курицы и ровно \(62\) клетки с рисом, каждая курица должна получить ровно одну клетку. Есть несколько возможных разбиений.

B. Замки для холодильников

графы реализация *1100

Хань живет в общей квартире. Там живет \(n\) человек (включая Ханя), у каждого из которых есть собственный холодильник.

\(n\) холодильников защищены несколькими цепями. Каждая цепь соединяет два различных холодильника и защищена цифровым замком. Владелец холодильника знает коды доступа всех связанных с ним цепей. Холодильник может быть открыт только в том случае, если все цепи, подключенные к нему, разблокированы. Например, если холодильник вообще не имеет связанных с ним цепей, то его может открыть любой из \(n\) человек.

Например, на рисунке есть \(n=4\) людей и \(5\) цепей. Первый человек знает пароль для двух цепей: \(1-4\) и \(1-2\). \(1\)-й холодильник может открыть его владелец (\(1\)-й человек), а также \(2\)-й и \(4\)-й (работая сообща) могут его открыть.

Цены этих холодильников равны \(a_1, a_2, \ldots, a_n\). Чтобы сделать цепь, соединяющую холодильники \(u\) и \(v\), вы должны заплатить \(a_u + a_v\) долларов. Обратите внимание, что владелец квартиры позволяет вам сделать несколько цепей, соединяющих одну и ту же пару холодильников.

Хозяин квартиры, в которой живет Хань, просит вас создать ровно \(m\) цепей, чтобы все холодильники были защищены. Холодильник является защищенным тогда и только тогда, когда из \(n\) людей, живущих в квартире, только владелец холодильника может открыть его (то есть больше никто, действуя самостоятельно, не сможет его открыть). Другими словами, \(i\)-й холодильник не защищен, если существует человек \(j\) (\(i \ne j\)) такой, что \(j\) в одиночку сможет открыть \(i\)-й холодильник.

Например, на рисунке все холодильники защищены. С другой стороны, если есть \(n=2\) холодильника и только одна цепь (которая их соединяет), то оба холодильника не являются защищенными (оба холодильника могут быть открыты не только его владельцем, но и другим человеком).

Конечно, владелец хочет минимизировать общую стоимость всех цепей. Определите, существует ли какой-либо способ сделать ровно \(m\) цепей, и, если да, выведите любое решение, которое минимизирует суммарную стоимость.

Входные данные

Во входных данных находятся несколько (не меньше одного) наборов входных данных. В первой строке находится одно целое число \(T\) (\(1 \le T \le 10\)) — количество наборов входных данных. Далее следуют их описания.

Первая строка каждого набора содержит два целых числа \(n\), \(m\) (\(2 \le n \le 1000\), \(1 \le m \le n\)) — количество людей, которые живут вместе с Ханьом и нужное количество цепей.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^4\)) — цены холодильников.

Выходные данные

Для каждого набора выведите:

  • Если решение не существует, то выведите \(-1\).
  • Иначе выведите \(c\) — минимальную цену. Затем \(i\)-я из следующих \(m\) строк должна содержать два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\), \(u_i \ne v_i\)), которые обозначают, что \(i\)-я цепь соединяет два холодильника \(u_i\) и \(v_i\). Между парой холодильников может быть произвольное количество цепей.
Если существует несколько решений, то выведите любое из них.

C. League of Leesins

Конструктив реализация *1600

Боб является страстным поклонником видеоигры «League of Leesins», и сегодня он празднует то, что подходит к концу Чемпионат мира League of Leesins!

В турнире приняли участие \(n\) (\(n \ge 5\)) команд по всему миру. Перед началом турнира Боб сделал прогноз рейтинга каждой команды от \(1\) до \(n\). После финала он сравнил прогноз с фактическим результатом и обнаружил, что \(i\)-я команда в соответствии с его прогнозом оказалась на \(p_i\)-й позиции (\(1 \le p_i \le n\), все \(p_i\) различны). Другими словами, \(p\) является перестановкой чисел \(1, 2, \dots, n\).

Поскольку любимый игрок Боба в Лиге — знаменитый «3ga», он решил записать каждые \(3\) последовательные элементы перестановки \(p\). Формально Боб создал массив \(q\) из \(n-2\) троек, где \(q_i = (p_i, p_{i+1}, p_{i+2})\) для каждого \(1 \le i \le n-2\). Боб очень гордился своим набором, поэтому он показал его своей подруге Алисе.

Узнав о массиве Боба, Алиса заявила, что может найти перестановку \(p\), даже если Боб переставит (перемешает) элементы \(q\) и элементы в каждой тройке. Конечно, Боб не поверил в такую магию, поэтому он сделал то, что и сказала, чтобы увидеть, что она ему скажет.

Например, если \(n = 5\) и \(p = [1, 4, 2, 3, 5]\), тогда массив \(q\) будет равен \([(1, 4, 2), (4, 2, 3), (2, 3, 5)]\). Боб может перемешать сами тройки и числа в тройках, чтобы получить \([(4, 3, 2), (2, 3, 5), (4, 1, 2)]\). Обратите внимание, что \([(1, 4, 2), (4, 2, 2), (3, 3, 5)]\) — неправильная перестановка \(q\), так как Боб не может менять местами числа между тройками.

Как друг Алисы, вы точно знаете, что Алиса просто пыталась похвастаться, поэтому вы решили ее спасти, дав ей любую перестановку \(p\), которая соответствует массиву \(q\), который ей дали.

Входные данные

Первая строка содержит одно целое число \(n\) (\(5 \le n \le 10^5\)) — размер перестановки \(p\).

\(i\)-я из следующих \(n-2\) строк содержит \(3\) целых числа \(q_{i, 1}\), \(q_{i, 2}\), \(q_{i, 3}\) (\(1 \le q_{i, j} \le n\)) — элементы \(i\)-й тройки перемешанного массива \(q_i\) в случайном порядке. Помните, что числа в тройке могут быть перемешаны, а также сами тройки могут быть перемешаны.

Гарантируется, что как минимум одна перестановка \(p\) может произвести такие тройки (то есть ответ существует).

Выходные данные

Выведите \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)) такие, что из перестановки \(p\) можно получить массив \(q\).

Если существует несколько решений, выведите любое из них.

C. Задоминированный подмассив

жадные алгоритмы реализация сортировки Строки *1200

Назовем массив \(t\) задоминированным значением \(v\) в следующем случае.

Во-первых, массив \(t\) должен состоять хотя бы из \(2\) элементов. Теперь, давайте посчитаем количество вхождений каждого числа \(num\) в \(t\) и назовем данное значение \(occ(num)\). Тогда, \(t\) — задоминирована (числом \(v\)) тогда (и только тогда), когда \(occ(v) > occ(v')\) для любого другого числа \(v'\). Например, массивы \([1, 2, 3, 4, 5, 2]\), \([11, 11]\) и \([3, 2, 3, 2, 3]\) задоминированы (числами \(2\), \(11\) и \(3\) соответственно), но массивы \([3]\), \([1, 2]\) и \([3, 3, 2, 2, 1]\) — нет.

Небольшая заметка: так как любой массив может быть задоминирован только одним числом, то мы можем не уточнять данное число и просто говорить, что массив либо задоминирован, либо нет.

Вам задан массив \(a_1, a_2, \dots, a_n\). Определите его самый короткий задоминированный подмассив, либо скажите, что таких нет.

Подмассив массива \(a\) — это последовательная часть массива \(a\), другими словами массив \(a_i, a_{i + 1}, \dots, a_j\) для некоторых \(1 \le i \le j \le n\).

Входные данные

В первой строке задано единственное целое число \(T\) (\(1 \le T \le 1000\)) — количество наборов входных данных. Каждый набор состоит из двух строк.

В первой строке задано единственное число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина массива \(a\).

Во второй строке задано \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — соответствующие элементы массива \(a\).

Гарантируется, что суммарная длина массивов в одном тесте не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(T\) чисел — по одному на набор входных данных. Для каждого набора выведите единственное целое число — длину самого короткого задоминированного подмассива либо \(-1\), если таких подмассивов нет.

Примечание

В первом наборе входных данных, нет подмассивов длины хотя бы \(2\), а потому ответ равен \(-1\).

Во втором наборе, весь массив задоминирован (числом \(1\)) и это единственный задоминированный подмассив.

В третьем наборе, подмассив \(a_4, a_5, a_6\) — самый короткий задоминированный подмассив.

В четвертом наборе, все подмассивы длины больше, чем один, задоминированы.

B. ПИН-коды

жадные алгоритмы реализация *1400

ПИН-код — это строка, которая состоит ровно из \(4\) цифр. Примеры возможных ПИН-кодов: «7013», «0000» и «0990». Обратите внимание, что ПИН-код может начинаться с любой цифры, даже с 0.

У Поликарпа есть \(n\) (\(2 \le n \le 10\)) банковских карт, ПИН-код \(i\)-й карты равен \(p_i\).

Недавно Поликарп прочёл рекомендацию, что на разные карты лучше устанавливать различные ПИН-коды. Поэтому он хочет поменять наименьшее количество цифр в ПИН-кодах своих карт так, чтобы все \(n\) кодов оказались различными.

Формально говоря, за один шаг Поликарп берёт одну банковскую карту с номером \(i\) (\(1 \le i \le n\)), затем в её ПИН-коде \(p_i\) выбирает одну позицию (от \(1\) до \(4\)), и изменяет цифру в этой позиции на любую другую. Ему необходимо за наименьшее количество шагов сделать так, чтобы не существовало пары одинаковых ПИН-кодов.

Поликарп быстро справился с этой задачей. А сможете ли вы её решить?

Входные данные

В первой строке находится число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных в тесте.

В следующих строках следуют описания \(t\) наборов входных данных. Первая строка каждого набора содержит целое число \(n\) (\(2 \le n \le 10\)) — количество ПИН-кодов у Поликарпа. В следующих \(n\) строках содержатся ПИН-коды \(p_1, p_2, \dots, p_n\) — по одному в строке. Длина каждого из них равна \(4\). Все ПИН-коды состоят только из цифр.

Выходные данные

Выведите ответы на \(t\) заданных наборов входных данных. Ответ на каждый набор должен состоять из \(n + 1\) строки.

В первую строку выведите \(k\) — наименьшее количество изменений, чтобы сделать все ПИН-коды различными. Далее в \(n\) строках выведите изменённые ПИН-коды в порядке, соответствующем их порядку во входных данных. Если существует несколько оптимальных ответов, выведите любой из них.

E. Редактор

реализация Структуры данных *2100

Разработка текстового редактора — непростая задача. Ваша задача реализовать вспомогательный модуль для подсистемы подсветки скобок в тексте.

Ваш редактор состоит из строки бесконечной длины и курсора, который указывает на текущий символ. Обратите внимание, что он указывает точно на один из символов (а не между парой символов). Таким образом, положение курсора характеризуется индексом символа, на который он указывает. Пользователь может двигать курсор влево или вправо на одну позицию. Если курсор уже находится на первом (самом левом) символе, то сдвиг влево не производится.

Изначально все символы строки равны пробелу, курсор находится в первой (самой левой) позиции.

Кроме этого пользователь может записать букву или круглую скобку (либо '(', либо ')') в позицию, на которой в настоящий момент указывает курсор. Новый символ всегда перезаписывает старое значение в этой позиции.

Ваш редактор должен уметь проверять, является ли текущая строка, набранная пользователем, «корректным текстом». Текст является корректным, если скобки в нём образуют правильную скобочную последовательность.

Формально, корректный текст (КТ) должен удовлетворять следующим правилам:

  • любая строка без скобок является КТ (строка может содержать пробелы);
  • если первый символ строки — это '(', последний — это ')', а все остальные (промежуточные) образуют КТ, то вся строка является КТ;
  • два подряд написанных КТ также являются КТ.

Примеры корректных текстов: «hello(codeforces)», «round», «((i)(write))edi(tor)s», «( me)». Примеры текстов, которые не являются корректными: «hello)oops(», «round)», «((me)».

Пользователь использует специальные команды для работы с вашим редактором. Каждой команде соответствует свой символ, который нужно нажать, чтобы выполнить эту команду.

Соответствие команд и символов следующее:

  • 'L' — сдвинуть курсор на один символ влево (остаётся на месте, если уже указывает на первый символ);
  • 'R' — сдвинуть курсор на один символ вправо;
  • любая строчная английская буква или круглая скобка '(' или ')' — записать введённый символ в позицию, на которой сейчас стоит курсор.

Для полного понимания изучите первый пример и его иллюстрации в примечании ниже.

Вам дана строка, содержащая символы, которые вводил пользователь. Для работы подсистемы подсветки скобок Вам требуется после каждой команды:

  • проверить, является ли текущий текст в редакторе корректным;
  • если является, то вывести наименьшее количество цветов, в которые можно раскрасить все пары скобок.

Если две пары скобок являются вложенными (первая во вторую или наоборот), то эти пары скобок должны быть раскрашены в разные цвета. Если две пары скобок не вложены, то они могут быть покрашены как в разные, так и в одинаковые цвета. Например, для скобочной последовательности «()(())()()» наименьшее количество цветов равно \(2\), а для для скобочной последовательности «(()(()())())(())» — равно \(3\).

Напишите программу, которая выводит требуемую информацию после обработки каждой команды.

Входные данные

Первая строка входных данных содержит целое число \(n\) (\(1 \le n \le 10^6\)) — количество команд. Вторая строка содержит \(s\) — последовательность команд. Строка \(s\) состоит из \(n\) символов. Гарантируется, что все символы в строке являются корректными командами.

Выходные данные

В единственной строке выведите \(n\) целых чисел, где \(i\)-е число равно:

  • \(-1\), если строка, полученная после обработки первых \(i\) команд, не является корректным текстом,
  • минимальному количеству цветов в случае корректного текста.
Примечание

В первом примере текст в редакторе будет принимать следующий вид:

  1. (
    ^
  2. (
    ^
  3. (a
    ^
  4. (a
    ^
  5. (ab
    ^
  6. (ab
    ^
  7. (ab)
    ^
  8. (ab)
    ^
  9. (a))
    ^
  10. (a))
    ^
  11. (())
    ^

A. Beautiful Regional Contest

жадные алгоритмы реализация *1500

Вот и подошел к концу Beautiful Regional Contest (BeRC)! В соревновании приняли участие \(n\) студентов. Уже известна таблица финальных результатов — участник на \(i\)-м месте решил \(p_i\) задач. Так как в первую очередь участники упорядочиваются по количеству решенных задач, то \(p_1 \ge p_2 \ge \dots \ge p_n\).

Помогите жюри распределить золотые, серебряные и бронзовые медали. Пусть их количества равны \(g\), \(s\) и \(b\), соответственно. Вот перечень требований из регламента, которые все должны быть удовлетворены:

  • для каждого из трёх достоинств медалей хотя бы одна медаль должна быть вручена (то есть \(g>0\), \(s>0\) и \(b>0\));
  • количество золотых медалей должно быть строго меньше и количества серебряных и количества бронзовых (то есть \(g<s\) и \(g<b\), но требований между \(s\) и \(b\) нет);
  • каждый золотой медалист должен решить строго больше задач, чем любой награждённый серебряной медалью;
  • каждый серебряный медалист должен решить строго больше задач, чем любой награждённый бронзовой медалью;
  • каждый бронзовый медалист должен решить строго больше задач, чем любой не награждённый медалью участник;
  • суммарное количество медалистов \(g+s+b\) не должно превышать половину всех участников (например, если \(n=21\), то можно наградить максимум \(10\) участников, а если \(n=26\), то можно наградить максимум \(13\) участников).

Жюри хочет наградить медалями суммарно наибольшее количество \(g+s+b\) участников так, чтобы все перечисленные пункты выполнялись. Помогите жюри найти такой способ награждения медалями.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных данных в тесте. Далее следуют \(t\) наборов входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(1 \le n \le 4\cdot10^5\)) — количество участников BeRC. Вторая строка набора содержит последовательность целых чисел \(p_1, p_2, \dots, p_n\) (\(0 \le p_i \le 10^6\)), где \(p_i\) равно количеству задач, решенных \(i\)-м участником из таблицы финальных результатов. Значения \(p_i\) отсортированы по невозрастанию, то есть \(p_1 \ge p_2 \ge \dots \ge p_n\).

Сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(4\cdot10^5\).

Выходные данные

Выведите \(t\) строк, \(j\)-я строка должна содержать ответ на \(j\)-й набор входных данных.

Ответ состоит из трёх неотрицательных целых чисел \(g, s, b\).

  • Выведите \(g=s=b=0\), если не существует способа наградить участников медалями, чтобы одновременно выполнялись все требования из условия.
  • В противном случае выведите три положительных числа \(g, s, b\) — возможное количество золотых, серебряных и бронзовых медалей, соответственно. Сумма \(g+s+b\) должна быть максимально возможной. Если ответов несколько, то выведите любой из них.
Примечание

В первом тестовом случае можно наградить \(1\) золотой, \(2\) серебряными и \(3\) бронзовыми медалями участников. Тогда золотую медаль получит участник, решившая \(5\) задач, серебрянные медали получат участники, решившие \(4\) задачи, бронзовые медали получат участники решившие \(2\) или \(3\) задачи. Участники, решившие \(1\) задачу медаль не получат. Заметим, что все условия выполнены и раздать медали таким способом можно. Больше, чем \(6\) медалей выдать невозможно, потому что нельзя выдать больше чем половину от количества участников медалей. Ответ \(1\), \(3\), \(2\) также является верным в этом тестовом случае.

Во втором и третьем тестовых случаев нельзя так раздать медали, потому что медаль каждого достоинства должна получить хотя бы один участник, но количество выданных медалей не должно превышать половину от количества участников.

B. Красивые числа

математика реализация Структуры данных *1300

Вам дана перестановка \(p=[p_1, p_2, \ldots, p_n]\) целых чисел от \(1\) до \(n\). Назовем число \(m\) (\(1 \le m \le n\)) красивым, если существует два индекса \(l, r\) (\(1 \le l \le r \le n\)), таких что \([p_l, p_{l+1}, \ldots, p_r]\) это перестановка чисел \(1, 2, \ldots, m\).

Например, пусть \(p = [4, 5, 1, 3, 2, 6]\). В этом случае числа \(1, 3, 5, 6\) красивые, а \(2, 4\) нет. Это так, потому что:

  • если \(l = 3\) и \(r = 3\) мы получим перестановку \([1]\) для \(m = 1\);
  • если \(l = 3\) и \(r = 5\) мы получим перестановку \([1, 3, 2]\) для \(m = 3\);
  • если \(l = 1\) и \(r = 5\) мы получим перестановку \([4, 5, 1, 3, 2]\) для \(m = 5\);
  • если \(l = 1\) и \(r = 6\) мы получим перестановку \([4, 5, 1, 3, 2, 6]\) для \(m = 6\);
  • невозможно взять некоторые \(l\) и \(r\), так что \([p_l, p_{l+1}, \ldots, p_r]\) будет перестановкой чисел \(1, 2, \ldots, m\) для \(m = 2\) и для \(m = 4\).

Вам дана перестановка \(p=[p_1, p_2, \ldots, p_n]\). Для всех \(m\) (\(1 \le m \le n\)) определите, является ли это число красивым или нет.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 1000\))  — количество тестовых случаев. В следующих строках находятся описания тестовых случаев.

В первой строке описания тестового случая находится единственное целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина перестановки \(p\). Следующая строка содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\), все \(p_i\) различны) — данная перестановка \(p\).

Гарантируется, что сумма \(n\) по всем тестовым случаям во входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(t\) строк — ответы на тестовые случаи, в порядке их следования во входных данных.

Ответом на тестовый случай является строка длины \(n\), где \(i\)-й символ равен \(1\), если \(i\) это красивое число и равен \(0\) если \(i\) не является красивым числом.

Примечание

Первый тестовый случай описан в условии задачи.

Во втором тестовом случае все числа от \(1\) до \(5\) красивые:

  • если \(l = 3\) и \(r = 3\) мы получим перестановку \([1]\) для \(m = 1\);
  • если \(l = 3\) и \(r = 4\) мы получим перестановку \([1, 2]\) для \(m = 2\);
  • если \(l = 2\) и \(r = 4\) мы получим перестановку \([3, 1, 2]\) для \(m = 3\);
  • если \(l = 2\) и \(r = 5\) мы получим перестановку \([3, 1, 2, 4]\) для \(m = 4\);
  • если \(l = 1\) и \(r = 5\) мы получим перестановку \([5, 3, 1, 2, 4]\) для \(m = 5\).

D. Уменьшаем долги

графы жадные алгоритмы Конструктив математика реализация Структуры данных *2000

Рассмотрим компанию из \(n\) людей, пронумерованных от \(1\) до \(n\). Они используют бурли, чтобы платить за товары и услуги. Иногда человеку не хватает денег на какую-либо покупку, тогда он занимает деньги у другого человека с намерением потом отдать их с процентами. Мы обозначим за \(d(a,b)\) сумму, которую \(a\) должен отдать \(b\), или \(0\), если долга нет.

Иногда система долгов может усложняться — например, в ситуации, когда один человек дал на время денег другому, но первому самому не хватает денег на покупку, а второй еще не отдал долг. Тогда первому человеку придется занимать у кого-то ещё.

Если процесс одалживания денег длится достаточно долго, система долгов может стать очень сложной и потребовать упрощения. Упрощать систему можно при помощи двух операций:

  1. Пусть \(d(a,b) > 0\) и \(d(c,d) > 0\), при этом \(a \neq c\) или \(b \neq d\). Можно уменьшить \(d(a,b)\) и \(d(c,d)\) на \(z\) и при этом увеличить \(d(c,b)\) и \(d(a,d)\) на \(z\), если \(0 < z \leq \min(d(a,b),d(c,d))\).
  2. Пусть \(d(a,a) > 0\). Можно уменьшить \(d(a,a)\) до \(0\).

Суммарный долг определяется следующей величиной:

\(\)\Sigma_d = \sum_{a,b} d(a,b)\(\)

Вы можете использовать ранее описанные операции в любом порядке. Ваша цель — минимизировать суммарный долг. Обратите внимание, что не обязательно минимизировать количество ненулевых долгов, только суммарный долг должен стать как можно меньше.

Входные данные

В первой строке заданы два целых числа \(n\) (\(1 \leq n \leq 10^5\)) и \(m\) (\(0 \leq m \leq 3\cdot 10^5\)) — количество людей и долгов, соответственно.

Далее следуют \(m\) строк, каждая из которых содержит три целых числа \(u_i\), \(v_i\) (\(1 \leq u_i, v_i \leq n, u_i \neq v_i\)), \(d_i\) (\(1 \leq d_i \leq 10^9\)), обозначающих, что человек \(u_i\) должен \(d_i\) бурлей человеку \(v_i\).

Выходные данные

В первой строке выведите число \(m'\) (\(0 \leq m' \leq 3\cdot 10^5\)) — количество долгов после уменьшения системы долгов. Можно показать, что всегда существует способ упростить систему до минимального суммарного долга с соблюдением этого условия.

Далее выведите \(m'\) строк, \(i\)-я из которых содержит три целых числа \(u_i, v_i, d_i\), обозначающих, что человек \(u_i\) должен отдать человеку \(v_i\) ровно \(d_i\) бурлей. На эти числа накладываются следующие ограничения: \(1 \leq u_i, v_i \leq n\), \(u_i \neq v_i\) и \(0 < d_i \leq 10^{18}\).

Для каждой пары \(i \neq j\) должно соблюдаться условие \(u_i \neq u_j\) или условие \(v_i \neq v_j\). Иными словами, каждая пара людей должна встречаться в выходных данных только один раз.

Примечание

В первом примере одна из оптимальных последовательностей операций — следующая:

  1. Проведём операцию первого типа с \(a = 1\), \(b = 2\), \(c = 2\), \(d = 3\) и \(z = 5\). В результате система долгов становится следующей: \(d(1, 2) = 5\), \(d(2, 2) = 5\), \(d(1, 3) = 5\), все остальные долги равны \(0\);
  2. Проведём операцию второго типа с \(a = 2\). В результате система долгов становится следующей: \(d(1, 2) = 5\), \(d(1, 3) = 5\), все остальные долги равны \(0\).

Во втором примере одна из оптимальных последовательностей операций — следующая:

  1. Проведём операцию первого типа с \(a = 1\), \(b = 2\), \(c = 3\), \(d = 1\) и \(z = 10\). В результате система долгов становится следующей: \(d(3, 2) = 10\), \(d(2, 3) = 15\), \(d(1, 1) = 10\), все остальные долги равны \(0\);
  2. проведём операцию первого типа с \(a = 2\), \(b = 3\), \(c = 3\), \(d = 2\) и \(z = 10\). В результате система долгов становится следующей: \(d(2, 2) = 10\), \(d(3, 3) = 10\), \(d(2, 3) = 5\), \(d(1, 1) = 10\), все остальные долги равны \(0\);
  3. Проведём операцию второго типа с \(a = 2\). В результате система долгов становится следующей: \(d(3, 3) = 10\), \(d(2, 3) = 5\), \(d(1, 1) = 10\), все остальные долги равны \(0\);
  4. Проведём операцию второго типа с \(a = 3\). В результате система долгов становится следующей: \(d(2, 3) = 5\), \(d(1, 1) = 10\), все остальные долги равны \(0\);
  5. Проведём операцию второго типа с \(a = 1\). В результате система долгов становится следующей: \(d(2, 3) = 5\), все остальные долги равны \(0\).

E. Космический Солитер

жадные алгоритмы реализация Структуры данных *2100

Боб играет в игру «Космический Солитер». Цель этой игры — построить космический корабль, но для ее достижения требуется сначала собрать достаточное количество ресурсов \(n\) типов, пронумерованных от \(1\) до \(n\). Боб должен собрать не менее \(a_i\) единиц \(i\)-го ресурса. Для удобства назовем \(a_i\) целью для ресурса \(i\).

Для производства одной единицы любого ресурса нужно потратить \(1\) ход (и каждый ход можно производить только один ресурс). Однако для ускорения игры в ней введена система достижений. Каждое достижение описывается тройкой \((s_j, t_j, u_j)\) и обозначает следующее: как только Боб соберет \(t_j\) единиц ресурса \(s_j\), он сразу же получит дополнительную единицу ресурса \(u_j\), не тратя ход на ее производство. Возможно, награда за достижение позволит активировать другое достижение — таким образом за один ход можно набрать большое количество разных ресурсов.

Система достижений устроена таким образом, что не существует двух достижений, у которых одновременно одинаковые \(s_j\) и \(t_j\). То есть за достижение \(t_j\) единиц ресурса \(s_j\) нельзя получить в награду более одного ресурса.

Ни один бонусный ресурс не дается за достижение \(0\) единиц какого-либо ресурса. Также не существует достижений, для которых надо собрать \(a_i\) или более соответствующего ресурса. Формально, \(0 < t_j < a_{s_j}\).

Могут существовать достижения, для которых тип требуемого ресурса совпадает с типом бонусного ресурса, то есть \(s_j = u_j\).

Изначально в игре нет достижений. Вам нужно обработать \(q\) обновлений игры, каждое из которых добавляет, удаляет или меняет какое-то достижение. После каждого обновления посчитайте минимальное количество ходов, требуемое для завершения игры (то есть для того, чтобы собрать не менее \(a_i\) единиц \(i\)-го ресурса для всех \(i \in [1, n]\)).

Входные данные

В первой строке задано одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество типов ресурсов.

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq 10^9\)), \(i\)-е из которых — цель для \(i\)-го ресурса.

В третьей строке задано одно целое число \(q\) (\(1 \leq q \leq 10^5\)) — количество обновлений в системе достижений.

Затем следуют \(q\) строк, \(j\)-я из которых содержит три целых числа \(s_j\), \(t_j\), \(u_j\) (\(1 \leq s_j \leq n\), \(1 \leq t_j < a_{s_j}\), \(0 \leq u_j \leq n\)). Для каждой тройки проведите следующие действия:

  • Сначала, если уже существует достижение, требующее набрать \(t_j\) единиц ресурса \(s_j\), удалите его.
  • Если \(u_j = 0\), не добавляйте никаких достижений.
  • Если \(u_j \neq 0\), добавьте новое достижение: «Если вы соберете \(t_j\) единиц ресурса \(s_j\), вы получите одну единицу ресурса \(u_j\)».
  • Выведите минимальное количество ходов, требуемое для завершения игры.
Выходные данные

Выведите \(q\) строк, в \(i\)-й из которых должно быть одно целое число — ответ на задачу после \(i\)-го обновления.

Примечание

После первого обновления оптимальная стратегия — следующая: произвести ресурс \(2\) и получить бесплатно ресурс \(1\). Затем произвести ресурс \(2\) дважды и \(1\) один раз, и мы завершим игру за четыре хода.

После второго обновления оптимальная стратегия состоит в том, чтобы произвести ресурс \(2\) три раза — в первые два хода мы дополнительно получим по единице ресурса \(1\).

После третьего обновления оптимальная стратегия — следующая:

  • Сначала произвести единицу ресурса \(2\) и получить бесплатную единицу \(1\). После этого мы получим еще одну бесплатную единицу \(1\). Количество ресурсов: \([2, 1]\).
  • После этого произвести единицу ресурса \(2\) и получить еще одну бесплатную единицу \(1\).
  • Опять произвести единицу ресурса \(2\).

Количество ресурсов в конце игры: \([3, 3]\). Для достижения цели нам потребовалось три хода. Обратите внимание, что у нас есть лишняя единица ресурса \(1\).

I. Intriguing Selection

интерактив Конструктив Перебор реализация сортировки *2600

This is an interactive problem.

You are the head coach of a chess club. The club has \(2n\) players, each player has some strength which can be represented by a number, and all those numbers are distinct. The strengths of the players are not known to you.

You need to select \(n\) players who would represent your club in the upcoming championship. Naturally, you want to select \(n\) players with the highest strengths.

You can organize matches between the players to do that. In every match, you pick two players, they play some games, and you learn which one of the two has higher strength. You can wait for the outcome of a match before deciding who will participate in the next one.

However, you do not want to know exactly how those \(n\) players compare between themselves, as that would make the championship itself less intriguing. More formally, you must reach a state where there is exactly one way to choose \(n\) players with the highest strengths that is consistent with the outcomes of the matches you organized, but there must be at least two possible orderings of those \(n\) players by strength that are consistent with the outcomes of the matches you organized.

Interaction

Your program has to process multiple test cases in one run. First, it should read the integer \(t\) (\(t \ge 1\)) — the number of test cases. Then, it should process the test cases one by one.

In each test case, your program should start by reading the integer \(n\) (\(3 \le n \le 100\)) — the number of players to select out of \(2n\) players. The sum of squares of the values of \(n\) over all test cases does not exceed \(10\,000\).

Then your program can organize matches zero or more times. To organize a match, your program should print a match description formatted as ? \(i\) \(j\) — a question mark followed by two distinct numbers of players participating in the match. The players are numbered from 1 to \(2n\), inclusive. Remember to flush the output after printing the match description. Then your program should read the match outcome — it will be either the greater-than character (>), if the first player in the match description has higher strength, or the less-than character (<), if the second player in the match description has higher strength.

Your program can organize at most \(4n^2\) matches. After it is done organizing matches, it should print the exclamation mark (!) and continue to the next test case, or exit gracefully if this was the last test case. Remember to flush the output after printing the exclamation mark.

There must be exactly one way to choose \(n\) players with the highest strength that is consistent with the outcomes of the matches you organized, but there must be at least two possible orderings of those \(n\) players by their strength that are consistent with the outcomes of the matches you organized.

The judging program picks some distinct numbers as the strengths of all players before your program starts organizing matches and uses them to answer the requests.

Note

In the example, the players in the first test case are sorted by strength in decreasing order. From the matches in the example output, we can deduce that players 1, 2, and 3 have the highest strength, but we do not know how the player 1 compares to the player 2.

J. Just Arrange the Icons

жадные алгоритмы математика реализация *1800

BerPhone X is almost ready for release with \(n\) applications being preinstalled on the phone. A category of an application characterizes a genre or a theme of this application (like "game", "business", or "education"). The categories are given as integers between \(1\) and \(n\), inclusive; the \(i\)-th application has category \(c_i\).

You can choose \(m\) — the number of screens and \(s\) — the size of each screen. You need to fit all \(n\) icons of the applications (one icon representing one application) meeting the following requirements:

  • On each screen, all the icons must belong to applications of the same category (but different screens can contain icons of applications of the same category);
  • Each screen must be either completely filled with icons (the number of icons on the screen is equal to \(s\)) or almost filled with icons (the number of icons is equal to \(s-1\)).

Your task is to find the minimal possible number of screens \(m\).

Input

The first line contains an integer \(t\) (\(1 \le t \le 10\,000\)) — the number of test cases in the input. Then \(t\) test cases follow.

The first line of each test case contains an integer \(n\) (\(1 \le n \le 2\cdot10^6\)) — the number of the icons. The second line contains \(n\) integers \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le n\)), where \(c_i\) is the category of the \(i\)-th application.

It is guaranteed that the sum of the values of \(n\) for all test cases in the input does not exceed \(2\cdot10^6\).

Output

Print \(t\) integers — the answers to the given test cases in the order they follow in the input. The answer to a test case is an integer \(m\) — the minimum number of screens on which all \(n\) icons can be placed satisfying the given requirements.

Note

In the first test case of the example, all the icons can be placed on three screens of size \(4\): a screen with \(4\) icons of the category \(1\), a screen with \(3\) icons of the category \(1\), and a screen with \(4\) icons of the category \(5\).

A. Длинное красивое число

жадные алгоритмы Конструктив реализация Строки *1700

Вам дано положительное целое число \(x\) из \(n\) цифр \(a_1, a_2, \ldots, a_n\), которые составляют его десятичную запись в порядке слева направо.

А также, вам дано положительное целое число \(k < n\).

Назовем число \(b_1, b_2, \ldots, b_m\) красивым если \(b_i = b_{i+k}\) для всех \(i\), что \(1 \leq i \leq m - k\).

Вам необходимо найти минимальное красивое целое число \(y\), что \(y \geq x\).

Входные данные

В первой строке записаны два целых числа \(n, k\) (\(2 \leq n \leq 200\,000, 1 \leq k < n\)): количество цифр в \(x\) и \(k\).

В следующей строке записаны \(n\) цифр \(a_1, a_2, \ldots, a_n\) (\(a_1 \neq 0\), \(0 \leq a_i \leq 9\)): цифры \(x\).

Выходные данные

В первой строке выведите одно целое число \(m\): количество цифр в \(y\).

В следующей строке выведите \(m\) цифр \(b_1, b_2, \ldots, b_m\) (\(b_1 \neq 0\), \(0 \leq b_i \leq 9\)): цифры \(y\).

B. Рамки для картин

реализация *1000

Художник Николай собирается написать несколько новых картин. Николай уверен, что картины получатся настолько хороши, что каждую из них можно будет заключить в рамку и повесить на стену. Именно с рамок для будущих картин Николай и решил начать.

У Николая есть n палочек с длинами a1, a2, ... an. Ломать и склеивать палочки Николай не хочет. Чтобы получить рамку размера h × w, нужны две палочки длины h и две палочки длины w. В частности, для случая квадратной рамки (когда h = w), нужны четыре палочки одинаковой длины.

Теперь Николай хочет собрать из имеющихся палочек как можно больше рамок для того, чтобы написать как можно больше картин под них. Помогите ему в этом нелегком деле. Учтите, что не обязательно использовать все имеющиеся палочки.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 100) — количество палочек. Во второй строке находятся n целых чисел, разделенных пробелом. i-ое из них равно длине i-ой палочки ai (1 ≤ ai ≤ 100).

Выходные данные

Выведите одно целое число — максимальное количество рамок, которые Николай сможет собрать для своих будущих картин.

C. Ларек с шаурмой

геометрия жадные алгоритмы Перебор реализация *1300

План столицы Берляндии представляет собой плоскость, причем все строения расположены в точках с целочисленными координатами, а пешеходными улицами являются отрезки, соединяющие каждую точку с четырьмя соседними. Все пешеходные улицы параллельны осям координат.

Известно, что школа в столице Берляндии расположена в точке \((s_x, s_y)\). В школе учатся \(n\) учеников, причем \(i\)-й ученик живет в доме, который расположен в точке \((x_i, y_i)\). Допустимо, что несколько учеников живут в одном и том же доме, но никакой ученик не живет в точке \((s_x, s_y)\).

После занятий каждый ученик идет из школы до своего дома по улицам, причем каждый ученик обязательно идет до своего дома по какому-то из кратчайших путей. Таким образом, расстояние, которое преодолеет \(i\)-й ученик, чтобы добраться из школы до дома, равно \(|s_x - x_i| + |s_y - y_i|\).

Министерство питания решило установить ларек с шаурмой в столице Берляндии в точке с целочисленными координатами. Считается, что \(i\)-й школьник купит шаурму в ларьке, если ларек находится на одном из кратчайших путей \(i\)-го школьника до дома. Запрещено ставить ларек с шаурмой в той же точке, в которой расположена школа, но разрешено ставить ларек в той точке, в которой расположен дом кого-то из учеников.

Определите максимальное количество школьников, которые смогут купить шаурму в ларьке, а также сообщите координаты для постройки ларька.

Входные данные

В первой строке следует три целых числа \(n\), \(s_x\), \(s_y\) (\(1 \le n \le 200\,000\), \(0 \le s_x, s_y \le 10^{9}\)) — количество школьников и координаты школы.

В \(i\)-й из следующих \(n\) строк следуют по два целых числа \(x_i\), \(y_i\) (\(0 \le x_i, y_i \le 10^{9}\)) — координаты дома \(i\)-го школьника. Координаты домов у некоторых школьников могут совпадать. Гарантируется, что дом никакого школьника не расположен в той же точке, что и школа.

Выходные данные

В первую строку выведите целое число \(c\) — максимальное количество школьников, которые смогут купить шаурму в ларьке.

Во вторую строку выведите два целых числа \(p_x\) и \(p_y\) — координаты для постройки ларька. Если подходящих ответов несколько, разрешается вывести любой из них. Обратите внимание, что каждое из чисел \(p_x\) и \(p_y\) должно быть не менее \(0\) и не более \(10^{9}\).

Примечание

В первом примере нужно построить ларек с шаурмой в точке \((4, 2)\). Тогда три школьника его посетят. Это школьники, чьи дома расположены в точках \((4, 2)\), \((4, 1)\) и \((5, 1)\).

Во втором примере можно, например, построить ларек с шаурмой в точке \((1, 1)\). В таком случае оба школьника, дом которых расположен в точке \((0, 0)\), его посетят.

D. Порталы

дп жадные алгоритмы реализация сортировки Структуры данных *2100

Вы играете в стратегическую компьютерную игру (да, у нас закончились идеи для легенд задач). В этой игре вы управляете огромной армией, и ваша задача — захватить \(n\) замков противника.

Рассмотрим игровой процесс более подробно. Изначально у вас в управлении армия из \(k\) воинов. Противник контролирует \(n\) замков; для захвата \(i\)-го замка вам потребуется \(a_i\) воинов (считается, что каждый захват замка проводится без потерь, поэтому размер армии после захвата не меняется). После захвата каждого замка вы увеличиваете свою армию, нанимая воинов в новом замке — в \(i\)-м замке вы сможете нанять \(b_i\) воинов. Помимо захвата замков, в каждом из них можно оставить охрану (только после захвата): если вы оставляете хотя бы одного воина в замке, то этот замок будет считаться охраняемым. У каждого замка есть параметр важности \(c_i\), и успешность вашей стратегии определяется суммарной важностью всех охраняемых замков в конце игры. Оставлять охрану в замке можно двумя способами:

  • если вы находитесь в замке \(i\), вы можете оставить одного воина для охраны замка \(i\);
  • замки связаны \(m\) односторонними порталами. Каждый портал характеризуется двумя номерами соединяемых замков \(u\) и \(v\) (для каждого портала \(u > v\)). Порталами можно пользоваться следующим способом: если вы находитесь в замке \(u\), вы можете отправить одного воина охранять замок \(v\) через портал.

Вы захватываете замки по очереди: сначала первый, потом второй, и так далее. После захвата замка \(i\), пока вы не захватили замок \(i + 1\), вы можете нанять воинов в замке \(i\), оставить охрану в замке \(i\), а также воспользоваться любым количеством порталов, ведущих из замка \(i\) в замки с меньшими номерами. После того, как вы захватите следующий замок, эти действия для замка \(i\) будут уже недоступны.

Если в какой-то момент вам не хватает воинов для захвата следующего замка, вы проигрываете. Ваша цель — максимизировать суммарную важность всех охраняемых замков после захвата последнего замка (обратите внимание, что вы можете нанимать воинов в последнем замке после его захвата, оставлять в нем охрану и пользоваться порталами — суммарная важность всех охраняемых замков будет подсчитана после всех ваших действий).

Можете ли вы разработать оптимальную стратегию захвата замков и оставления охраны?

Входные данные

В первой строке входных данных заданы три целых числа \(n\), \(m\) и \(k\) (\(1 \le n \le 5000\), \(0 \le m \le \min(\frac{n(n - 1)}{2}, 3 \cdot 10^5)\), \(0 \le k \le 5000\)) — количество замков, количество порталов и изначальное количество воинов в вашей армии, соответственно.

Далее следуют \(n\) строк, в \(i\)-й из которых содержится описание \(i\)-го замка — три целых числа \(a_i\), \(b_i\) и \(c_i\) (\(0 \le a_i, b_i, c_i \le 5000\)) — количество воинов, требуемых для захвата замка \(i\), количество воинов, которых можно нанять после захвата, и важность замка, соответственно.

Далее следуют \(m\) строк, в \(i\)-й из которых содержится описание \(i\)-го портала — два целых числа \(u_i\) и \(v_i\) (\(1 \le v_i < u_i \le n\)), соответствующих порталу, который ведет из замка \(u_i\) в замок \(v_i\). Не существует двух одинаковых порталов.

Гарантируется, что размер вашей армии ни при каких условиях не может превысить \(5000\) (то есть \(k + \sum\limits_{i = 1}^{n} b_i \le 5000\)).

Выходные данные

Если невозможно захватить все замки ни при каких обстоятельствах, выведите одно целое число \(-1\).

Иначе выведите одно целое число — максимальную суммарную важность всех охраняемых замков в конце игры.

Примечание

Лучшая стратегия в первом примере — следующая:

  1. захватить первый замок;
  2. нанять солдат в первом замке, теперь у вас \(11\) солдат;
  3. захватить второй замок;
  4. захватить третий замок;
  5. нанять солдат в третьем замке, теперь у вас \(13\) солдат;
  6. захватить четвертый замок;
  7. оставить одного воина в четвертом замке, теперь у вас \(12\) солдат.

Эта стратегия (и некоторые другие) дает в результате суммарную важность охраняемых замков, равную \(5\).

Лучшая стратегия во втором примере — следующая:

  1. захватить первый замок;
  2. нанять солдат в первом замке, теперь у вас \(11\) солдат;
  3. захватить второй замок;
  4. захватить третий замок;
  5. нанять солдат в третьем замке, теперь у вас \(13\) солдат;
  6. захватить четвертый замок;
  7. оставить одного воина в четвертом замке, теперь у вас \(12\) солдат;
  8. отправить одного воина в первый замок через третий портал, теперь у вас \(11\) солдат.

Эта стратегия (и некоторые другие) дает в результате суммарную важность охраняемых замков, равную \(22\).

В третьем примере нельзя захватить последний замок: для этого нужны \(14\) воинов, но вы можете собрать не более \(13\) до захвата последнего замка.

B. Робот-cнегоход

жадные алгоритмы Конструктив реализация *1200

Недавно вы купили робота-снегохода и принесли его домой. Ваш дом — это клетка \((0, 0)\) на бесконечной координатной сетке.

Вы также получили последовательность инструкций этого робота. Она записана в виде строки \(s\), состоящей из символов 'L', 'R', 'U' и 'D'. Если сейчас робот находится в клетке \((x, y)\), он может передвинуться в одну из смежных клеток (зависит от текущей инструкции).

  • Если текущая инструкция — 'L', тогда робот может передвинуться влево в \((x - 1, y)\);
  • если текущая инструкция — 'R', тогда робот может передвинуться вправо в \((x + 1, y)\);
  • если текущая инструкция — 'U', тогда робот может передвинуться вверх в \((x, y + 1)\);
  • если текущая инструкция — 'D', тогда робот может передвинуться вниз в \((x, y - 1)\).

Вы заметили предупреждение на последней странице руководства: если робот посетит какую-то клетку (кроме \((0, 0)\)) дважды, то он сломается.

Таким образом, последовательность инструкций является корректной, если робот начинает в клетке \((0, 0)\), выполняет заданные инструкции, не посещает никакую клетку, кроме \((0, 0)\), два или более раз и заканчивает свой путь в клетке \((0, 0)\). Также клетка \((0, 0)\) должна быть посещена не более двух раз: в начале и в конце (если путь пустой, то она будет посещена только единожды). Например, следующие последовательности инструкций являются корректными: «UD», «RL», «UUURULLDDDDLDDRRUU», а следующие являются некорректными: «U» (конечная клетка не равна \((0, 0)\)) и «UUDD» (клетка \((0, 1)\) посещается дважды).

Но изначальная последовательность инструкций может быть некорректной. Вы не хотите, чтобы ваш робот сломался, поэтому вы решили перепрограммировать его следующим образом: вы удалите какие-то (возможно, все или никакие) инструкции из изначальной последовательности инструкций, затем поменяете порядок оставшихся инструкций так, как хотите, и включите вашего робота, который начнет движение.

Ваша задача — удалить минимальное количество инструкций из изначальной последовательности и поменять порядок оставшихся инструкций таким образом, чтобы последовательность стала корректной. Вам необходимо вывести максимальную по длине корректную последовательность инструкций, которую вы можете получить.

Заметьте, что вам необходимо выбрать любой порядок оставшихся инструкций (нет необходимости минимизировать количество обменов или какую-либо другую похожую метрику).

Вам необходимо ответить на \(q\) независимых наборов входных данных.

Входные данные

Первая строка входных данных содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^4\)) — количество наборов входных данных.

Следующие \(q\) строк содержат наборы входных данных. \(i\)-й набор входных данных задан строкой \(s\), состоящей из не менее, чем \(1\) и не более, чем \(10^5\) символов 'L', 'R', 'U' и 'D' — изначальной последовательности инструкций.

Гарантируется, что сумма \(|s|\) (где \(|s|\) — длина \(s\)) не превосходит \(10^5\) по всем наборам входных данных (\(\sum |s| \le 10^5\)).

Выходные данные

Выведите ответ на каждый набор входных данных. В первой строке выведите максимальное количество оставшихся инструкций. Во второй строке выведите корректную последовательность оставшихся инструкций \(t\), которую робот сможет выполнить. Ходы выполняются слева направо в порядке выведенной последовательности. Если существует несколько возможных ответов, выведите любой. Если ответ равен \(0\), вам разрешается вывести пустую строку (но вы можете не выводить ее).

Примечание

В первом наборе входных данных существует только два правильных ответа: «LR» и «RL».

Картинка, соответствующая второму набору входных данных:

Заметьте, что направление обхода неважно

Другим корректным ответом на третий набор входных данных является «URDDLLLUURDR».

C. Очередная сломанная клавиатура

дп Комбинаторика реализация *1200

Недавно Norge нашел строку \(s = s_1 s_2 \ldots s_n\), состоящую из \(n\) строчных букв латинского алфавита. В качестве упражнения для улучшения скорости печатания он решил напечатать все подстроки \(s\). Да, все \(\frac{n (n + 1)}{2}\) из них!

Подстрокой строки \(s\) называется непустая строка \(x = s[a \ldots b] = s_{a} s_{a + 1} \ldots s_{b}\) (\(1 \leq a \leq b \leq n\)). Например, «auto» и «ton» являются подстроками «automaton».

Незадолго до начала упражнения Norge осознал, что его клавиатура сломана, а если говорить более точно, он может использовать только \(k\) латинских букв \(c_1, c_2, \ldots, c_k\) из \(26\).

После этого Norge стало интересно, как много подстрок строки \(s\) он сможет написать, используя свою сломанную клавиатуру. Помогите ему найти это число.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \leq n \leq 2 \cdot 10^5\), \(1 \leq k \leq 26\)) — длину строки \(s\) и количество латинских букв, доступных на клавиатуре.

Вторая строка входных данных содержит строку \(s\), состоящую ровно из \(n\) строчных букв латинского алфавита.

Третья строка содержит \(k\) различных строчных букв латинского алфавита \(c_1, c_2, \ldots, c_k\) — буквы, доступные на клавиатуре.

Выходные данные

Выведите одно целое число — количество подстрок \(s\), которые можно написать, используя только доступные буквы \(c_1, c_2, \ldots, c_k\).

Примечание

В первом примере Norge может напечатать подстроки \(s[1\ldots2]\), \(s[2\ldots3]\), \(s[1\ldots3]\), \(s[1\ldots1]\), \(s[2\ldots2]\), \(s[3\ldots3]\), \(s[5\ldots6]\), \(s[6\ldots7]\), \(s[5\ldots7]\), \(s[5\ldots5]\), \(s[6\ldots6]\), \(s[7\ldots7]\).

A. Хеширование перемешиванием

Перебор реализация Строки *1000

Поликарп недавно создал новый веб сервис. Как в любом современном сервисе, в нем есть возможность авторизации. А это автоматически подразумевает угрозы безопасности.

Поликарп решил сохранять хеш пароля, полученный по следующему алгоритму:

  1. получить пароль \(p\), состоящий из строчных латинских букв, и перемешать буквы в нем, чтобы получить \(p'\) (\(p'\) может остаться равным \(p\));
  2. построить две случайные строки, состоящие из строчных латинских букв, \(s_1\) и \(s_2\) (любая из них может быть пустой);
  3. полученный хеш \(h = s_1 + p' + s_2\), где сложение — это склеивание строк.

Например, пусть пароль будет \(p =\) «abacaba». Тогда \(p'\) может быть равно «aabcaab». Случайные строки \(s1 =\) «zyx» и \(s2 =\) «kjh». Тогда \(h =\) «zyxaabcaabkjh».

Обратите внимание, что нельзя удалять или добавлять буквы в \(p\), чтобы получить \(p'\), можно только менять их порядок.

Теперь Поликарп просит вас помочь ему в реализации модуля проверки пароля. По данному паролю \(p\) и хешу \(h\), проверьте, что \(h\) может являться хешом пароля \(p\).

Вам нужно ответить на \(t\) наборов входных данных.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В первой строке каждого набора входных данных содержится непустая строка \(p\), состоящая из строчных латинских букв. Длина \(p\) не превышает \(100\).

В второй строке каждого набора входных данных содержится непустая строка \(h\), состоящая из строчных латинских букв. Длина \(h\) не превышает \(100\).

Выходные данные

На каждый набор входных данных выведите «YES», если данный хеш \(h\) может быть получен по данному паролю \(p\), и «NO» в противном случае.

Примечание

Первый набор входных данных объяснен в условии.

Во втором наборе входных данных и \(s_1\), и \(s_2\) пусты, а \(p'=\) «threetwoone» — это перемешанная \(p\).

В третьем наборе входных данных хеш нельзя получить из пароля.

В четвертом наборе входных данных \(s_1=\) «n», \(s_2\) пуста, а \(p'=\) «one» — это перемешанная \(p\) (даже несмотря на то, что они совпадают).

В пятом наборе входных данных хеш нельзя получить из пароля.

C. Ягодное варенье

дп жадные алгоритмы реализация Структуры данных *1700

Карлсон недавно обнаружил огромные запасы ягодного варенья в подвале дома. Если точнее, то там оказались \(2n\) банок клубничного и черничного варенья.

Все \(2n\) банок расставлены в ряд. Лестница в подвал находится ровно в середине этого ряда. Поэтому, когда Карлсон спускается в подвал, он видит ровно \(n\) банок слева и \(n\) банок справа.

Например, подвал может выглядеть следующим образом:

Карлсон — очень прямолинейный молодой человек, поэтому он сразу начинает есть варенье. За одну минуту он опустошает либо первую непустую банку слева, либо первую непустую банку справа.

Наконец, Карлсон решил, что в конце процесса должно остаться равное количество банок с клубничным и черничным вареньем.

Например, результат может быть таким:

Он съел \(1\) банку слева, а затем \(5\) банок справа. Осталось ровно по \(3\) полных банки клубничного и черничного варенья.

Банки пронумерованы от \(1\) до \(2n\) слева направо, так что Карлсон начинает между банками \(n\) и \(n+1\).

Какое минимальное число банок Карлсону придется опустошить, чтобы осталось равное количество банок с клубничным и черничным вареньем?

Вам нужно ответить на \(t\) наборов входных данных.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 10^5\)).

В второй строке каждого набора входных данных записаны \(2n\) целых чисел \(a_1, a_2, \dots, a_{2n}\) (\(1 \le a_i \le 2\)) — \(a_i=1\) значит, что \(i\)-я банка слева — это банка клубничного варенья, а \(a_i=2\) значит, что это банка черничного варенья.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

На каждый набор входных данных выведите ответ — минимальное количество банок, которые Карлсону придется опустошить, чтобы осталось равное количество банок с клубничным и черничным вареньем.

Примечание

На картинке описывается первый набор входных данных.

Во втором наборе входных данных количества банок с клубничным и с черничным вареньем уже совпадают.

В третьем наборе входных данных Карлсону придется съесть все \(6\) банок, так чтобы осталось \(0\) банок каждого варенья.

В четвертом наборе входных данных Карлсон может либо опустошить вторую и третью банки, либо третью и четвертую. В обоих случаях останется по \(1\) банке каждого варенья.

B. Стишок для Санты

Бинарный поиск Перебор реализация *1300

Наступает новый год! Вася приготовил стишок и хочет рассказать его Санте Клаусу.

Васин стишок содержит \(n\) частей. Вася тратит \(a_i\) секунд на \(i\)-ю часть. При этом он не может менять порядок частей в стишке: сначала он рассказывает часть, которая занимает \(a_1\) секунд, затем — часть, которая занимает \(a_2\) секунд и так далее. После того, как Вася закончил зачитывать стишок, Вася получает по подарку за каждую полностью рассказаную часть.

Вася может пропустить не более одной части стишка (если он пропустит больше, Санта обязательно это заметит).

Санта будет слушать Васин стишок не более \(s\) секунд. Например, если \(s = 10\), \(a = [100, 9, 1, 1]\), и Вася пропускает первую часть стишка, то он получает два подарка.

Обратить внимание, что Вася может зачитать стишок полностью (если ему хватит времени).

Определите часть, которую нужно пропустить Васе, для того чтобы получить максимальное количество подарков. Если Васе нужно зачитать стих полностью, выведите 0. Если существует несколько правильных ответов — выведите любой из них.

Вам нужно ответить на \(t\) наборов входных данных.

Входные данные

Первая строка содержит число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два числа \(n\) и \(s\) (\(1 \le n \le 10^5, 1 \le s \le 10^9\)) — количество частей в стишке и количество секунд, которое Санта будет слушать Васю соответственно.

Вторая строка каждого набора входных данных содержит \(n\) чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

На каждый набор входных данных выведите одно число — номер части, которую нужно пропустить Васе, для того чтобы получить максимальное количество подарков. Если Васе нужно зачитать стих полностью, выведите 0.

Примечание

В первом наборе входных данных Вася получит три подарка, если пропустит вторую часть стиха.

Во втором наборе входных данных не важно какую часть стиха пропустить.

В третьем наборе входных данных Вася может прочитать стих полностью.

C. Стопка подарков

реализация Структуры данных *1400

Дед Мороз должен отправить подарки детям. У него есть большая стопка, в которой \(n\) подарков, пронумерованных от \(1\) до \(n\); у самого верхнего подарка номер \(a_1\), у подарка под ним номер \(a_2\), и так далее; у самого нижнего подарка номер \(a_n\). Все номера различны.

У Деда Мороза есть список из \(m\) различных номеров подарков, которые он должен отправить: \(b_1\), \(b_2\), ..., \(b_m\). Он отправит их в том порядке, в котором они располагаются в списке.

Чтобы отправить подарок, Дед Мороз должен найти его в стопке, убрав все подарки, которые выше нужного; затем он берет нужный ему подарок и возвращает убранные подарки обратно на вершину стопки. Если над подарком, который нужен Деду Морозу, \(k\) других подарков, на эти действия тратится \(2k + 1\) секунд. К счастью, Дед Мороз может ускорить процесс — когда он возвращает подарки в стопку, он может делать это в любом порядке (только те подарки, которые были над нужным подарком, могут поменять свой порядок; остальные подарки остаются на своих местах в стопке). Когда Дед Мороз отправляет подарок, он исчезает из стопки.

Какое минимальное время потребуется Деду Морозу, чтобы отправить подарки, если он будет каждый раз располагать возвращаемые подарки оптимальным образом? Дед Мороз не может как-то взаимодействовать со стопкой другими способами.

Ваша программа должна уметь обрабатывать \(t\) наборов входных данных.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Затем идут сами наборы входных данных, каждый из которых состоит из трех строк.

В первой строке заданы два целых числа \(n\) и \(m\) (\(1 \le m \le n \le 10^5\)) — количество подарков в стопке и количество подарков, которые нужно отправить.

Во второй строке заданы \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(1 \le a_i \le n\), все \(a_i\) различны) — порядок подарков в стопке.

В третьей строке заданы \(m\) целых чисел \(b_1\), \(b_2\), ..., \(b_m\) (\(1 \le b_i \le n\), все \(b_i\) различны) — упорядоченный список подарков, которые нужно отправить.

Сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — минимальное количество секунд, требуемое для отправки всех подарков, если Дед Мороз возвращает их в оптимальном порядке.

B. Строка

Конструктив Перебор реализация Строки строковые суфф. структуры хэши *2100

Однажды на уроке информатики Аня и Маша прошли лексикографический порядок.

Строка x лексикографически меньше строки y, если либо x является префиксом y (и при этом x ≠ y), либо существует такое i (1 ≤ i ≤ min(|x|, |y|)), что xi < yi, и для любого j (1 ≤ j < i) xj = yj. Здесь |a| обозначает длину строки a. Лексикографическое сравнение строк реализует оператор < в современных языках программирования.

Учительница задала Ане и Маше домашнее задание. Она выдала им строку длины n. Из этой строки требуется выписать все подстроки, в том числе всю строчку целиком и все одинаковые подстроки (например, из строки «aab» требуется выписать «a», «a», «aa», «ab», «aab», «b»). После этого полученные строки требуется расположить в лексикографическом порядке. А чтобы не проверять все эти строки, хитрая учительница попросила предъявить лишь k-тую строку из этого списка. Помогите Ане с Машей выполнить домашнее задание.

Входные данные

В первой строке задана непустая строка, состоящая из строчных латинских букв («a»-«z»), длины не больше, чем 105. Во второй строке задано единственное целое число k (1 ≤ k ≤ 105).

Выходные данные

Выведите строку, которую требуется выписать Ане с Машей — лексикографически k-ую подстроку заданной строки. Если у строки всего меньше, чем k подстрок, выведите строку «No such line.» (без кавычек).

Примечание

Во втором тесте перед строкой «bc» идут строки «a», «ab», «abc», «b».

D. Числа

Конструктив реализация *2000

Однажды Ане в школе дали задание — расставить несколько чисел по кругу так, чтобы любые два соседних числа отличались ровно на 1. Аня раздобыла несколько чисел и расставила их по кругу, пытаясь выполнить задание. Затем она захотела проверить, правильно ли она расставила числа, но тут пришла ее младшая сестренка Маша, и все числа перемешала. Аня была очень сердита, но было поздно — задание было безнадежно испорчено. Скажите Ане хотя бы, могла ли она его в принципе сделать, используя все эти числа?

Входные данные

В первой строке записано целое число n — количество чисел, которые были у Ани (3 ≤ n ≤ 105). В следующей строке через пробел записаны сами числа. Все числа целые и находятся в диапазоне от 1 до 109.

Выходные данные

Выведите в единственной строке «YES» (без кавычек), если Аня могла правильно выполнить задание, используя все (обязательно все) эти числа. Если Аня не могла сделать задание, как бы ни старалась, выведите «NO» (без кавычек).

A. Вырезание и вставка

математика реализация *1700

Мы начинаем со строки \(s\), состоящей только из цифр \(1\), \(2\) или \(3\). Будем обозначать длину строки \(s\) как \(|s|\). Для всех \(i\) от \(1\) до \(|s|\) \(i\)-й символ строки \(s\) обозначим как \(s_i\).

Где-то в строке стоит курсор. Позиция курсора \(\ell\) обозначается целым числом из множества \(\{0, \ldots, |s|\}\), и имеет следующее значение:

  • если \(\ell = 0\), тогда курсор расположен перед первым символом строки \(s\).
  • если \(\ell = |s|\), тогда курсор расположен после последнего символа строки \(s\).
  • если \(0 < \ell < |s|\), тогда курсор расположен между символами \(s_\ell\) и \(s_{\ell+1}\).

Обозначим за \(s_\text{left}\) строку, находящуюся левее курсора и за \(s_\text{right}\) строку находящуюся правее курсора.

Также есть строка \(c\), которая называется буфером, которая изначально пуста. Всего существует три типа действий:

  • Передвижение. Передвинуть курсор на один символ вправо. Это увеличивает \(\ell\) на единицу.
  • Вырезание. Присвоить \(c \leftarrow s_\text{right}\), затем присвоить \(s \leftarrow s_\text{left}\).
  • Вставка. Добавить значение \(c\) в конец строки \(s\). Заметьте, что это никак не меняет \(c\).

Изначально курсор находится в позиции \(\ell = 0\). Затем, исполняется следующая процедура:

  1. Применить передвижение один раз.
  2. Применить вырезание один раз.
  3. Несколько применить вставку, количество раз равно \(s_\ell\).
  4. Если \(\ell = x\), остановиться. Иначе, вернуться к шагу 1.

Вам дана изначальная строка \(s\) и целое число \(x\). Какой будет длина строки \(s\) когда процедура остановится? Так как это число может быть очень большим, выведите его остаток при делении на \(10^9 + 7\).

Гарантируется, что \(\ell \le |s|\) в любой момент времени.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 1000\)), количество наборов входных данных. В следующих строках находятся их описания.

В первой строке каждого набора входных данных записано единственное целое число \(x\) (\(1 \le x \le 10^6\)). Во второй строке находится изначальная строка \(s\) (\(1 \le |s| \le 500\)). Гарантируется, что \(s\) состоит только из символов «1», «2», «3».

Гарантируется, что сумма \(x\) по всем тестовым случаям не превосходит \(10^6\). Гарантируется, что во всех тестовых случаях во время процедуры \(\ell \le |s|\) в любой момент времени.

Выходные данные

Для каждого тестового случая, выведите остаток при делении длины строки после процедуры на \(10^9 + 7\).

Примечание

Давайте проиллюстрируем, что происходит в первом тестовом случае. Изначально у нас \(s = \) 231. Изначально, \(\ell = 0\) и \(c = \varepsilon\) (пустая строка). Вот как изменяются эти значения в ходе процедуры:

  • Шаг 1, передвижение: мы получим \(\ell = 1\).
  • Шаг 2, вырезание: мы получим \(s = \) 2 и \(c = \) 31.
  • Шаг 3, вставка \(s_\ell = \) 2 раза: мы получим \(s = \) 23131.
  • Шаг 4: \(\ell = 1 \not= x = 5\), поэтому мы переходим к 1.

  • Шаг 1, передвижение: мы получим \(\ell = 2\).
  • Шаг 2, вырезание: мы получим \(s = \) 23 и \(c = \) 131.
  • Шаг 3, вставка \(s_\ell = \) 3 раза: мы получим \(s = \) 23131131131.
  • Шаг 4: \(\ell = 2 \not= x = 5\), поэтому мы переходим к 1.

  • Шаг 1, передвижение: мы получим\(\ell = 3\).
  • Шаг 2, вырезание: мы получим \(s = \) 231 и \(c = \) 31131131.
  • Шаг 3, вставка \(s_\ell = \) 1 раз: мы получим \(s = \) 23131131131.
  • Шаг 4: \(\ell = 3 \not= x = 5\), поэтому мы переходим к 1.

  • Шаг 1, передвижение: мы получим \(\ell = 4\).
  • Шаг 2, вырезание: мы получим \(s = \) 2313 и \(c = \) 1131131.
  • Шаг 3, вставка \(s_\ell = \) 3 раза: мы получим \(s = \) 2313113113111311311131131.
  • Шаг 4: \(\ell = 4 \not= x = 5\), поэтому мы переходим к 1.

  • Шаг 1, передвижение: мы получим \(\ell = 5\).
  • Шаг 2, вырезание: мы получим \(s = \) 23131 и \(c = \) 13113111311311131131.
  • Шаг 3, вставка \(s_\ell = \) 1 раз: мы получим \(s = \) 2313113113111311311131131.
  • Шаг 4: \(\ell = 5 = x\), поэтому мы останавливаемся.

В конце процедуры, \(s\) имеет длину \(25\).

B. Beingawesomeism

математика реализация *1800

Вы всемогущее существо и создали прямоугольный мир. Ваш мир настолько удобный, что может быть представлен в виде таблицы размером \(r \times c\). Каждая клетка этой таблицы обозначает некоторую страну. Каждая страна принадлежит некоторой религии. Всего существует две религии в этом мире. Одна из религий называется Beingawesomeism, люди этой религии делают добрые поступки, чтобы быть хорошими. Другая религия называется Pushingittoofarism, люди этой религии совершают убийства, чтобы быть плохими.

На самом деле вы не абсолютно всемогущи. У вас есть только одна сила, которую вы можете применить бесконечное число раз! Ваша сила позволяет вам посылать миссионерские группы. Когда миссионерская группа из определенной страны, назовем ее \(a\), приходит в другую страну \(b\), она меняет религию страны \(b\) на религию страны \(a\).

Силу можно использовать следующим образом:

  • Вы выбираете горизонтальную полоску \(1 \times x\) или вертикальную полоску \(x \times 1\) внутри таблицы. Вы можете выбирать любое значение \(x\);
  • Вы выбираете направление \(d\). Если вы выбрали горизонтальную полоску, вы можете выбрать направления СЕВЕР или ЮГ. Если вы выбрали вертикальную полоску, вы можете выбрать направления ВОСТОК или ЗАПАД;
  • Вы выбираете количество шагов \(s\);
  • Вы командуете каждой стране находящейся внутри выбранной полоски послать миссионерскую группу, которая пройдет \(s\) шагов в направлении \(d\). На каждом шаге, она посетит и возможно поменяет религию (способом описанным ранее) у всех \(s\) стран на своем пути;
  • параметры \(x\), \(d\), \(s\) можно выбирать такими, чтобы никакая миссионерская группа не вышла за пределы таблицы.

Следующая картинка показывает один возможный способ использования силы. Здесь символ A обозначает страну с религией Beingawesomeism и символ P обозначает страну с религией Pushingittoofarism. Здесь мы выбрали горизонтальную полоску \(1 \times 4\), направление СЕВЕР и количество шагов \(s = 2\).

Вы существо, которое верит в свободную волю каждого человека. Однако, вы хотите немедленно приостановить убийства. Таким образом вы решили использовать силу и попробовать сделать Beingawesomeism религией всех стран.

Какое минимальное количество применений силы требуется, чтобы сделать религией каждой страны Beingawesomeism?

Если это сделать невозможно, вы должны признать свой провал и сообщить об этом.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 2\cdot 10^4\)), количество тестовых случаев. В следующих строках находится описание тестовых случаев.

Первая строка каждого тестового случая содержит два целых числа \(r\) и \(c\), обозначающие размеры таблицы (\(1 \le r, c \le 60\)). Следующие \(r\) строк содержат по \(c\) символов, описывающих религии стран. \(j\)-й символ в \(i\)-й строке описывает религию страны в строке \(i\) и столбце \(j\). При этом:

  • символ «A» означает, что религия Beingawesomeism;
  • символ «P» означает, что религия Pushingittoofarism.

Гарантируется, что все символы таблицы это «A» или «P». Гарантируется, что сумма \(r \cdot c\) по всем тестовым случаям не превосходит \(3 \cdot 10^6\).

Выходные данные

Для каждого тестового случая, выведите единственную строку, содержащую минимальное возможное количество использований силы нужное, чтобы сделать Beingawesomeism религией во всех странах. Если сделать Beingawesomeism религией во всех странах невозможно, выведите строку «MORTAL» (без кавычек).

Примечание

В первом тестовом случае можно добиться требуемого за два применения силы.

Первое использование:

Второе использование:

Во втором тестовом случае можно добиться требуемого за одно применение силы.

В третьем тестовом случае невозможно сделать религией всех стран Beingawesomeism, поэтому ответ «MORTAL».

A. Suffix Three

реализация *800

Мы открыли новую структуру данных в нашей исследовательской группе — suffix three!

Она очень полезна при обработке естественных языков. Если даны три языка и три суффикса, то suffix three может определить на каком языке написано предложение.

Это очень просто, 100% точно и не использует никакого продвинутого машинного обучения.

Давайте же узнаем, как эта структура работает!

  • Если предложение заканчивается на «po», язык —- филиппинский;
  • Если предложение заканчивается на «desu» или «masu», язык — японский;
  • Если предложение заканчивается на «mnida», язык — корейский.

Зная это вам предлагается реализовать структуру suffix three, которая будет различать филиппинский, японский и корейский языки.

Подождите, я сказал про три суффикса? Я имел ввиду четыре.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 30\)), количество наборов входных данных. В следующих строках находятся их описания.

Каждый набор входных данных состоит из одной строки, обозначающую предложение. Пробелы представлены нижними подчеркиваниями (символом «_»). Предложение содержит от \(1\) до \(1000\) символов (включительно) и состоит только из строчных латинских букв и нижних подчеркиваний. Предложение не содержит нижних подчеркиваний в начале и в конце, два последовательных нижних подчеркивания. Гарантируется, что предложение заканчивается одним из четырех суффиксов, описанных в условии задачи.

Выходные данные

Для каждого набора входных данных выведите строку, содержащую «FILIPINO», «JAPANESE» или «KOREAN» (все буквы большие, без кавычек), если предложение написано на филиппинском, японском и корейском языках, соответственно.

Примечание

Первое предложение заканчивается на «po», поэтому оно написано на филиппинском.

Второе и третье предложения заканчиваются на «desu» и «masu» соответственно, поэтому они написаны на японском.

Четвертое предложение заканчивается на «mnida», поэтому оно написано на корейском.

A. Абонент временно недоступен

математика реализация *900

Поликарп живет на координатной оси \(Ox\) и путешествует из точки \(x=a\) в \(x=b\). Он двигается равномерно прямолинейно со скоростью одна единица расстояния в минуту.

На оси \(Ox\) в точке \(x=c\) находится базовая станция оператора сотовой связи. Известно, что радиус её покрытия составляет \(r\). Таким образом, если абонент находится на расстоянии меньшем или равном \(r\) от точки \(x=c\), то он находится в зоне покрытия сети, иначе — нет. Базовая станция может находится как на пути следования Поликарпа, так и вне его.

Выведите время в минутах, в течение которого Поликарп не будет находится в зоне покрытия сети, при прямолинейном равномерном движении из \(x=a\) в \(x=b\). Его скорость движения — одна единица расстояния в минуту.

Входные данные

В первой строке записано положительное целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте. Далее записаны \(t\) наборов входных данных.

Описание каждого набора входных данных составляет одну строку, которая содержит четыре целых числа \(a\), \(b\), \(c\) и \(r\) (\(-10^8 \le a,b,c \le 10^8\), \(0 \le r \le 10^8\)) — координаты начальной и конечной точки пути, базовой станции и её радиус покрытия, соответственно.

Любые из чисел \(a\), \(b\) и \(c\) могут совпадать (как любая пара, так и даже все три числа). Базовая станция может находится как на пути следования Поликарпа, так и вне его.

Выходные данные

Выведите \(t\) чисел — ответы на заданные наборы входных данных в порядке их записи в тесте. Каждый ответ является целым числом — количество минут, в течение которых Поликарп будет недоступен по сотовому телефону во время своего движения.

Примечание

Следующая картинка иллюстрирует первый набор входных данных примера.

Поликарп идёт из \(1\) в \(10\). Желтая область показывает зону покрытия вышки радиуса покрытия \(1\), которая расположена в точке \(7\). Зеленая область показывает ту часть пути, когда Поликарп находится вне зоны покрытия.

A. Новый год и названия

реализация Строки *800

С новым годом! 2020 год также известен как год Gyeongja (경자년, gyeongja-nyeon) в Корее. Откуда это имя? Кратко рассмотрим систему Gapja, которая традиционно используется в Корее для обозначения лет.

Существует две последовательности строк, \(n\) строк \(s_1, s_2, s_3, \ldots, s_{n}\) и \(m\) строк \(t_1, t_2, t_3, \ldots, t_{m}\). Эти строки состоят только из строчных букв алфавита. Среди этих строк могут быть одинаковые.

Назовем конкатенацией двух строк \(x\) и \(y\) такую строку, которая получится при последовательной записи сначала \(x\), затем \(y\) друг за другом, не меняя порядок символов в них. Например, конкатенация строк «code» и «forces» равна строке «codeforces».

Год 1 начинается с конкатенации двух строк \(s_1\) и \(t_1\). Если год увеличивается на один, то мы берем следующую строку по порядку для каждой соответствующей последовательности. Если используемая в данный момент строка находится в конце массива, то переходим к первой строке.

Например, если \(n = 3, m = 4, s = \)a», «b», «c»}, \(t =\) d», «e», «f», «g»}, то строки для лет с 1 по 14 - ad», «be», «cf», «ag», «bd», «ce», «af», «bg», «cd», «ae», «bf», «cg», «ad», «be»}. Обратите внимание, что название года может повторяться.

Вам даются две последовательности строк размером \(n\) и \(m\), а также \(q\) запросов. Для каждого запроса вам будет указан год. Можете ли вы найти имена, соответствующие данным годам, согласно системе Gapja?

Входные данные

Первая строка содержит два целых числа \(n, m\) (\(1 \le n, m \le 20\)).

Следующая строка содержит \(n\) строк \(s_1, s_2, \ldots, s_{n}\). Каждая строка состоит только из строчных букв алфавита и разделена пробелами. Длина каждой строки не менее \(1\) и не более \(10\).

Следующая строка содержит \(m\) строк \(t_1, t_2, \ldots, t_{m}\). Каждая строка состоит только из строчных букв алфавита и разделена пробелами. Длина каждой строки не менее \(1\) и не более \(10\).

Среди заданных \(n + m\) строк могут быть одинаковые (то есть не обязательно они все различны).

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 2\,020\)).

В каждой из следующих \(q\) строк записано целое число \(y\) (\(1 \le y \le 10^9\)), обозначающее год, про который мы хотим узнать.

Выходные данные

Выведите \(q\) строк. Для каждой строки выведите название года по описанному выше правилу.

Примечание

Первый пример использует актуальные названия, используемые в системе Gapja. Эти строки обычно означают числа или названия животных.

B. Новый год и восходящая последовательность

Бинарный поиск дп Комбинаторика реализация сортировки Структуры данных *1400

Последовательность \(a = [a_1, a_2, \ldots, a_l]\) длиной \(l\) имеет восход, если существует пара таких индексов \((i, j)\), что \(1 \le i < j \le l\) и \(a_i < a_j\). Например, последовательность \([0, 2, 0, 2, 0]\) имеет восход из-за пары индексов \((1, 4)\), но последовательность \([4, 3, 3, 3, 1]\) не имеет восхода.

Назовем конкатенацией двух последовательностей \(p\) и \(q\) такую последовательность, которая получится при последовательной записи сначала \(p\), затем \(q\) друг за другом, не меняя порядок элементов в них. Например, конкатенация последовательностей \([0, 2, 0, 2, 0]\) и \([4, 3, 3, 3, 1]\) равна последовательности \([0, 2, 0, 2, 0, 4, 3, 3, 3, 1]\). Конкатенация последовательностей \(p\) и \(q\) обозначается как \(p+q\).

Кенгун считает, что последовательность с восходом приносит удачу. Поэтому он хочет сделать много таких последовательностей на новый год. У Кенгун есть \(n\) последовательностей \(s_1, s_2, \ldots, s_n\), которые могут иметь разную длину.

Кенгун рассмотрит \(n^2\) всевозможных пар последовательностей \(s_x\) и \(s_y\) (\(1 \le x, y \le n\)) и проверит содержит ли конкатенация \(s_x + s_y\) восход или нет. Обратите внимание, что порядок выбора последовательностей в пару имеет значение. Кроме того, он может выбирать последовательность в пару к самой себе.

Пожалуйста, посчитайте количество пар последовательностей (\(x, y\)) для заданного набора \(s_1, s_2, \ldots, s_n\), конкатенация \(s_x + s_y\) которых имеет восход.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 100\,000\)), обозначающее количество последовательностей.

В каждой из следующих \(n\) строк записано целое число \(l_i\) (\(1 \le l_i\)), обозначающее длину \(s_i\), после которой записано \(l_i\) целых чисел \(s_{i, 1}, s_{i, 2}, \ldots, s_{i, l_i}\) (\(0 \le s_{i, j} \le 10^6\)), обозначающие последовательность \(s_i\).

Гарантируется, что сумма всех \(l_i\) не превосходит \(100\,000\).

Выходные данные

Выведите одно целое число, количество пар последовательностей, конкатенация которых имеет восход.

Примечание

В первом примере, следующие \(9\) последовательностей имеют восход: \([1, 2], [1, 2], [1, 3], [1, 3], [1, 4], [1, 4], [2, 3], [2, 4], [3, 4]\). Одинаковые по содержимому последовательности учитываются столько раз, сколько раз они встречаются как результат конкатенации.

B. Вкусные покупки

дп жадные алгоритмы реализация *1300

Сегодня Яссер и Адель пошли в магазин за пирожными. На полке в магазине стоят \(n\) типов пирожных, пронумерованные от \(1\) до \(n\). Количество пирожных каждого типа бесконечно. Определим вкус \(i\)-го пирожного некоторой величиной \(a_i\), которая является целым числом. В магазине есть как вкусные пирожные, так и неприятные, поэтому данная величина может быть положительной, нулем или отрицательной.

Яссер, разумеется, хочет попробовать их все, поэтому он купит ровно по одному пирожному каждого типа.

Адель, с другой стороны, выберет некоторый отрезок \([l, r]\) \((1 \le l \le r \le n)\), который содержит не все пирожные (он не может выбрать \([l, r] = [1, n]\)) и купит ровно по одному пирожному каждого из типов \(l, l + 1, \dots, r\).

После этого они сравнят суммарный вкус купленных ими пирожных. Яссер будет счастлив, если суммарный вкус пирожных, которые он купил, строго больше, чем суммарный вкус пирожных, которые купил Адель вне зависимости от выбора Адель.

Например, пусть вкус пирожных будет \([7, 4, -1]\). Яссер купит все, суммарный вкус будет равен \(7 + 4 - 1 = 10\). Адель может выбрать отрезки \([7], [4], [-1], [7, 4]\) или \([4, -1]\), суммарный вкус будет равен \(7, 4, -1, 11\) и \(3\), соответственно. Адель может выбрать отрезок с суммарным вкусом \(11\), и раз \(10\) не строго больше \(11\), то Яссер не будет счастлив :(

Узнайте, будет ли Яссер счастлив после похода в магазин.

Входные данные

В каждом тесте содержится несколько наборов входных данных. В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Затем следует описание наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(2 \le n \le 10^5\)).

Во второй строке каждого набора входных данных записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^9 \le a_i \le 10^9\)), где \(a_i\) является вкусом \(i\)-го типа пирожного.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если суммарный вкус пирожных, которые купил Яссер, строго больше, чем суммарный вкус пирожных, которые купил Адель вне зависимости от выбора Адель. В противном случае выведите «NO».

Примечание

В первом примере суммарный вкус любого отрезка, который может выбрать Адель, меньше, чем суммарный вкус всех пирожных.

Во втором примере Адель выберет отрезок \([1, 2]\) с суммарным вкусом \(11\), что не меньше, чем суммарный вкус всех пирожных, который равен \(10\).

В третьем примере, Адель может выбрать отрезок \([3, 3]\) c суммарным вкусом \(5\). Обратите внимание, что вкус пирожных у Яссера тоже равен \(5\), поэтому в данном случае суммарный вкус пирожных, которые купил Яссер, не строго больше, чем суммарный вкус пирожных, которые купил Адель.

F. Гарри Гончар

бпф дп Конструктив математика Перебор реализация *3100

Как известно, чтобы победить лорда Волан-де-Морта, Гарри необходимо сперва уничтожить все крестражи. Последний крестраж лорда Сами-Знаете-кого представляет собой массив \(a\) состоящий из \(n\) целых чисел, который Гарри необходимо уничтожить. Массив считается уничтоженным, если все его элементы равны 0. Чтобы его уничтожить, Гарри может производить два типа операций:

  1. выбрать индекс \(i\) (\(1 \le i \le n\)), целое число \(x\) и вычесть из \(a_i\) число \(x\).
  2. выбрать индексы \(i\) и \(j\) (\(1 \le i, j \le n; i \ne j\)), целое число \(x\) и вычесть из \(a_i\) число \(x\), а из \(a_j\) — число \(x + 1\).

Обратите внимание, что \(x\) может быть произвольным, в том числе и отрицательным.

У Гарри осталось совсем немного времени. Помогите ему и узнайте, какое минимальное число операций с массивом ему придётся совершить, чтобы уничтожить массив и покончить с лордом Волан-де-Мортом!

Входные данные

Первая строка входных данных содержит одно целое число \(n\) — количество элементов в массиве \(a\) (\(1 \le n \le 20\)).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) — элементы массива (\(-10^{15} \le a_i \le 10^{15}\)).

Выходные данные

Выведите одно число — минимальное количество действий, за которое Гарри сможет уничтожить массив \(a\).

Примечание

В первом примере можно три раза применить операцию первого типа к массиву.

Во втором примере можно два раза применить операцию второго типа: сначала выбрать \(i = 2, j = 1, x = 4\) и получить массив \((0, -1, -2)\), затем выбрать \(i = 3, j = 2, x = -2\) чтобы уничтожить массив.

В третьем примере ничего делать не надо, так как массив уже состоит из нулей.

A. Злые школьники

жадные алгоритмы реализация *800

В ЛКШ.Зима день экскурсий, поэтому \(t\) групп школьников отправились в Торжок. Тротуары в Торжке настолько узкие, что идти приходится в колонне по-одному.

Изначально некоторые из школьников злы. Для удобства будем описывать группу школьников строкой из заглавных латинских букв «A» и «P»:

  • «A» соответствует злому школьнику
  • «P» соответствует спокойному школьнику

Строка описывает школьников от последнего к первому, слева направо.

Каждую минуту каждый злой школьник кидает снежок в спину идущего непосредственно перед ним.

Формально, если злой школьник соответствует символу заданной строки с индексом \(i\), то снежок он будет кидать в школьника, который соответствует символу с индексом \(i+1\) (студенты в строке заданы от последнего к первому!). Если школьник, в которого попали снежком, еще не был зол, то он становится злым. Даже если первый (самый правый в строке) школьник является злым, он не бросает снежок, так как впереди него нет другого ученика.

Рассмотрим первый тестовый пример. В нем колонна изначально имеет такой вид: PPAP. Через минуту единственный злой школьник кинет снежок в школьника, идущего перед ним, и он тоже станет злым: PPAA. После этого, новых злых школьников появляться не будет.

Помогите преподавателям ЛКШ.Зима определить для каждой группы время, спустя которое в ней появится последний злой школьник.

Входные данные

В первой строке дано число \(t\) (\(1 \le t \le 100\)) — количество групп школьников. Следующие \(2t\) строк описывают группы школьников.

Описание группы начинается с целого числа \(k_i\) (\(1 \le k_i \le 100\)) — количество школьников в группе, затем дана строка \(s_i\), состоящая из \(k_i\) символов «A» и «P», описывающая \(i\)-ю группу школьников.

Выходные данные

Для каждой группы выведите в отдельной строке одно целое число — количество минут, через которое в этой группе появится последний злой школьник.

Примечание

В первом примере через \(1\) минуту состояния школьников станут такими: PPAA после этого новых злых школьников не появится.

Во втором примере состояния школьников в первой группе по минутам будут выглядеть так:

  • через \(1\) минуту — AAPAAPPAAPPP
  • через \(2\) минуты — AAAAAAPAAAPP
  • через \(3\) минуты — AAAAAAAAAAAP
  • через \(4\) минуты злыми станут все \(12\) школьников, поэтому новых злых школьников не появится.

Во второй группе второго примера через \(1\) минуту все школьники станут злыми.

B. Гиперсет

Перебор реализация Структуры данных *1500

Пчёлки Алиса и Алеся подарили пчеловодке Полине на Новый Год знаменитую карточную игру «Set». Колода для игры состоит из карт, каждая из которых обладает набором из четырех признаков: тип фигуры, количество фигур, их цвет и текстура. Сетом называется тройка карт, у которых каждый признак либо у всех попарно отличается, либо совпадает. Рисунок ниже иллюстрирует возможные комбинации карт.

Полина придумала новый вариант игры и назвала его «Hyperset». В этой игре есть \(n\) карт, обладающих \(k\) признаками, каждый из которых принимает значение «S», «E» или «T». Оригинальная игра «Set» может быть рассмотрена как «Hyperset» с \(k = 4\).

Так же, как и раньше, в этой игре сетом все еще называется тройка карт, у которых каждый признак либо попарно отличается, либо совпадает. Цель игры очень проста: нужно найти количество способов выбрать три карты, образующие сет.

К сожалению, зимние каникулы подошли к концу, и Полине уже надо идти в школу. Помогите Полине найти количество сетов среди карт, лежащих на столе.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 1500\), \(1 \le k \le 30\)) — количество карт и количество признаков соответственно.

В каждой из следующих \(n\) строк содержится описание карт. Описание карты представляет собой строку, состоящую из \(k\) букв «S», «E», «T». Символ на позиции \(i\) описывает \(i\)-й признак этой карты. Все карты различны.

Выходные данные

Выведите единственное число — количество способов выбрать три карты, образующих сет.

Примечание

В третьем примере сетами являются следующие тройки карт:

  1. «SETT», «TEST», «EEET»
  2. «TEST», «ESTE», «STES»

A. Печеньки

реализация *900

Оля пришла в гости к близняшкам Ане и Маше и увидела, что у них есть много печенек. Печеньки разложены в пакетики. Поскольку печенек много, Оля решила, что не будет ничего страшного, если она утащит один пакетик. Но она не хочет, чтобы сестры ссорились по пустякам при дележе печенек. Поэтому Оля хочет утащить один пакетик печенья так, чтобы общее количество печенья в оставшихся пакетиках было четно, то есть, чтобы Аня и Маша потом могли поделить его ровно пополам (даже если его останется 0 — главное, чтобы четное количество). Сколько способов у Оли утащить ровно один пакетик печенья, чтобы суммарное количество печенек в оставшихся пакетиках было четно?

Входные данные

В первой строке задано единственное целое число n (1 ≤ n ≤ 100) — количество пакетиков печенья у Ани и Маши. Во второй строке заданы n целых чисел ai (1 ≤ ai ≤ 100) — количество печенек в i-ом пакетике.

Выходные данные

Выведите в единственной строке единственное число — искомое количество способов. Если способов вообще нет, выведите 0.

Примечание

В первом примере Оля должна забрать единственный пакетик, чтобы у близняшек осталось четное количество печенек.

Во втором примере Оля может забрать любой из пяти пакетиков с двумя печеньками или любой из трех пакетиков с четырьмя печеньками — 5 + 3 = 8 вариантов.

В третьем примере, какой бы из пакетиков с двумя печеньками Оля не забрала, у близняшек останется 2 * 9 + 99 = 117 печенек. Поэтому у Оли есть единственный вариант — забрать пакетик с 99 печеньками.

B. Шнурки и шестиклассники

графы Перебор поиск в глубину и подобное реализация *1200

Аня и Маша ведут математический кружок у шестиклассников. Во время кружка шестиклассники ведут себя плохо. Они принесли на кружок много шнурков, и связались друг с другом. А именно, каждый шнурок связывает вместе двух шестиклассников. При этом, если два шестиклассника связаны шнурком, то шнурок связывает как первого со вторым, так и второго с первым.

Чтобы навести порядок, Аня и Маша делают следующее. Сначала Аня для каждого шестиклассника находит, со сколькими другими шестиклассниками он связан шнурками. Если шестиклассник связан ровно с одним другим, Аня объявляет ему выговор. Потом Маша собирает в группу всех шестиклассников, которым Аня объявила выговор, и выгоняет вон из класса. Выгнанные шестиклассники отвязываются и уходят из класса, забирая с собой шнурки, которыми они были привязаны. Потом снова Аня для каждого шестиклассника находит, со сколькими другими шестиклассниками он связан, и так далее. И так они делают, пока Ане удается объявить хотя бы один выговор.

Определите, сколько групп шестиклассников будут выгнаны из класса.

Входные данные

В первой строке даны два целых числа n и m — исходное число шестиклассников и шнурков (). Шестиклассники пронумерованы числами от 1 до n, а шнурки — числами от 1 до m. В следующих m строках дано по два целых числа a и b — номера шестиклассников, связанных i-ым шнурком (1 ≤ a, b ≤ n, a ≠ b). Гарантируется, что никакие два шестиклассника не связаны более чем одним шнурком. Никакой шнурок не связывает шестиклассника с самим собой.

Выходные данные

Выведите единственное число — количество групп шестиклассников, которые будут выгнаны из класса.

Примечание

В первом примере Ане с Машей не выгонят ни одной группы шестиклассников — в изначальной позиции все шестиклассники привязаны к двум другим шестиклассникам, и Ане не удастся сделать ни одного выговора.

Во втором примере четыре шестиклассника связаны в цепочку, а еще два бегают отдельно. Сначала Аня с Машей выгонят двух крайних шестиклассников из цепочки (1 и 4), а затем — двух оставшихся из цепочки (2 и 3). При этом бегающие отдельно от остальных шестиклассники останутся в классе.

В третьем примере Аня с Машей сразу же выгонят всех шестиклассников, кроме четвертого, и на этом процесс закончится. Правильный ответ — один.

A. Контроль сознания

Перебор реализация Структуры данных *1600

Вы и ваш \(n - 1\) друг нашли массив целых чисел \(a_1, a_2, \dots, a_n\). Вы решили разделить его следующим образом: все \(n\) человек встают в линию в определенном порядке. Каждую минуту, человек в начале линии выбирает либо первый, либо последний элемент массива, удаляет его и забирает себе. Затем, он выходит из линии и процесс продолжается со следующим стоящим в линии человеком.

Вы стоите на \(m\)-й позиции в линии. Перед тем, как процесс начнется, вы можете выбрать не больше чем \(k\) различных людей в линии и каждого из них убедить всегда брать либо первый, либо последний элемент массива во время их хода (для каждого человека свой выбор, не обязательно у всех одинаковый), не зависимо от того, какие это элементы. После того, как процесс начнется, вы не сможете убедить больше людей или изменить выбор уже убежденных вами людей.

Предположим, что вы сделаете ваш выбор оптимально. Чему равно максимальное целое число \(x\), такое что, вне зависимости от ходов тех друзей, которых вы не выбрали, чтобы убедить, элемент массива, который вы получите на вашем ходу, будет не меньше, чем \(x\)?

Обратите внимание, что друзья, которых вы не выбрали для того, чтобы убедить сделать их заранее определенный вами выбор, могут делать свой выбор произвольно и они не обязательно будут брать наибольший доступный для них элемент.

Входные данные

Входные данные содержат несколько тестовых случаев. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 1000\))  — количество тестовых случаев. В следующих строках находится их описание.

В первой строке описания каждого тестового случая находятся три разделенных пробелом целых числа \(n\), \(m\) и \(k\) (\(1 \le m \le n \le 3500\), \(0 \le k \le n - 1\))  — количество элементов в массиве, ваша позиция в линии и количество человек, чей выбор вы можете зафиксировать.

Во второй строке описания каждого тестового случая содержится \(n\) положительных целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\))  — элементы массива.

Гарантируется, что сумма значений \(n\) по всем тестовым случаям не превосходит \(3500\).

Выходные данные

Для каждого тестового случая, выведите наибольшее целое число \(x\), такое что вы можете гарантировать себе получить число не меньше, чем \(x\).

Примечание

В первом тестовом случае, одной из оптимальных стратегий является убедить первого человека брать последний элемент и второго человека брать первый элемент.

  • первый человек возьмет последний элемент (\(5\)), потому что он или она были убеждены вами взять последний элемент. После этого хода оставшийся массив будет \([2, 9, 2, 3, 8]\);
  • второй человек возьмет первый элемент (\(2\)), потому что он или она были убеждены вами взять первый элемент. После этого хода оставшийся массив будет \([9, 2, 3, 8]\);
  • если третий человек выберет взять первый элемент (\(9\)), к вашему ходу оставшийся массив будет \([2, 3, 8]\) и вы сможете взять \(8\) (последний элемент);
  • если третий человек выберет взять последний элемент (\(8\)), к вашему ходу оставшийся массив будет \([9, 2, 3]\) и вы сможете взять \(9\) (первый элемент).

Таким образом, эта стратегия гарантирует получить в конце число не меньше, чем \(8\). Можно доказать, что не существует стратегии, гарантирующей получить число не меньше чем \(9\). Таким образом, ответ равен \(8\).

Во втором тестовом случае, одной из оптимальных стратегий является убедить первого человека взять первый элемент. Тогда, в худшем случае второй и третий человек возьмут первый элементы и вы получите число \(4\).

B. Заострение массива

жадные алгоритмы реализация *1300

Вам дан массив \(a_1, \ldots, a_n\) из \(n\) неотрицательных целых чисел.

Назовем его заостренным, если существует целое число \(1 \le k \le n\), такое что \(a_1 < a_2 < \ldots < a_k\) и \(a_k > a_{k+1} > \ldots > a_n\). В частности, любой строго возрастающий или строго убывающий массив является заостренным. Например:

  • Массивы \([4]\), \([0, 1]\), \([12, 10, 8]\) и \([3, 11, 15, 9, 7, 4]\) являются заостренными;
  • Массивы \([2, 8, 2, 8, 6, 5]\), \([0, 1, 1, 0]\) и \([2, 5, 6, 9, 8, 8]\) не являются заостренными.

Вы можете сделать следующую операцию, сколько угодно раз: выбрать любой строго положительный элемент массива и уменьшить его на единицу. Формально, вы можете выбрать любой индекс \(i\) (\(1 \le i \le n\)), такой что \(a_i>0\), и выполнить присвоение \(a_i := a_i - 1\).

Определите, возможно ли сделать данный массив заостренным, сделав некоторое количество (возможно ноль) этих операций.

Входные данные

Входные данные содержат несколько тестовых случаев. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 15\ 000\))  — количество тестовых случаев. В следующих строках находится их описание.

В первой строке описания каждого тестового случая находится единственное целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)).

Во второй строке описания каждого тестового случая находится последовательность из \(n\) целых неотрицательных чисел \(a_1, \ldots, a_n\) (\(0 \le a_i \le 10^9\)).

Гарантируется, что сумма значений \(n\) по всем тестовым случаям не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого тестового случая, выведите единственную строку, содержащую «Yes» (без кавычек), если возможно сделать данный массив заостренным, используя описанные операции, или «No» (без кавычек), иначе.

Примечание

В первом и втором тестовых случаях первого теста, данный массив уже является заостренным.

В третьем тестовом случае первого теста, мы можем получить массив \([3, 11, 15, 9, 7, 4]\) (уменьшить первый элемент \(97\) раз и уменьшить последний элемент \(4\) раза). Он заостренный, потому что \(3 < 11 < 15\) и \(15 > 9 > 7 > 4\).

В четвертом тестовом случае первого теста, невозможно сделать массив заостренным.

A. Игровой лабиринт Неко

реализация снм Структуры данных *1400

NEKO#ΦωΦ только что купила новую игру на свой компьютер!

Главный пазл этой игры это прямоугольный лабиринт \(2 \times n\). Неко должна провести Некомими девочку из клетки \((1, 1)\) в клетку \((2, n)\), тем самым выбравшись из лабиринта. Девочка может переходить только между клетками, соседними по стороне.

Однако, в некоторые моменты игры, некоторые клетки меняют своё состояние: или из земли в лаву (которая не позволяет проходить через клетку), или наоборот (что делает клетку проходимой вновь). Изначально ни в одной клетке лавы нет.

Спустя часы стриминга Неко выяснила, что есть всего \(q\) таких моментов, причём \(i\)-й из них переключает состояние клетки \((r_i, c_i)\) (с земли на лаву, или наоборот). Неко хочет узнать для каждого момента из этих \(q\), можно ли после него пройти из клетки \((1, 1)\) в \((2, n)\) не проходя через клетки с лавой.

Неко великий игрок и стример, но она всё ещё не справляется с пазлами и задачками, требующими большой силы мозга. Не могли бы вы ей помочь?

Входные данные

Первая строка содержит целые числа \(n\), \(q\) (\(2 \le n \le 10^5\), \(1 \le q \le 10^5\)).

Среди следующих \(q\) строк, \(i\)-я содержит целые числа \(r_i\), \(c_i\) (\(1 \le r_i \le 2\), \(1 \le c_i \le n\)), обозначающие координаты клетки, меняющейся в \(i\)-й момент.

Гарантируется, что клетки \((1, 1)\) и \((2, n)\) никогда не будут даны в списке запросов.

Выходные данные

Для каждого момента выведите «Yes» или «No» в зависимости от того, можно ли пройти от клетки \((1, 1)\) до \((2, n)\). Всего вам нужно вывести ровно \(q\) ответов, по одному после каждого изменения.

Каждое слово можно выводить в любом регистре (нижнем, верхнем или смешанном).

Примечание

Разберём пример из условия:

  • После первого запроса девочка всё ещё может достичь цели, один из возможных путей выглядит как \((1,1) \to (1,2) \to (1,3) \to (1,4) \to (1,5) \to (2,5)\).
  • После второго запроса, добраться до цели невозможно, самая дальняя клетка, которой она может достичь, это \((1, 3)\).
  • После четвёртого запроса, клетка \((2, 3)\) уже не заблокирована, однако теперь заблокирован весь \(4\)-й столбец, так что достичь цели не получится.
  • После пятого запроса, проблемы со столбцом пропадают, так что она снова может добраться до цели.

B. Арома и её поиск

геометрия жадные алгоритмы Конструктив Перебор реализация *1700

С новым телом наш идол Арома Белая (или лучше было сказать Каори Минамийа?) начинает восстанавливать своё потерянное прошлое через OS-пространство.

Это пространство можно представить как 2D плоскость, с бесконечным количеством устройств с данными, пронумерованных с \(0\). Координаты устройств можно описать следующим образом:

  • Координаты \(0\)-го устройства равны \((x_0, y_0)\)
  • Для \(i > 0\), координаты \(i\)-го устройства равны \((a_x \cdot x_{i-1} + b_x, a_y \cdot y_{i-1} + b_y)\)

Изначально Арома расположена в точке \((x_s, y_s)\). Она может находиться в OS-пространстве не более \(t\) секунд, после этого ей придётся вернуться в реальный мир. Чтобы вернутся в реальный мир не требуется возвращаться в изначальную точку \((x_s, y_s)\).

Внутри OS-пространства Арома может делать следующие действия:

  • Из точки \((x, y)\) Арома может перейти в одну из следующих точек \((x-1, y)\), \((x+1, y)\), \((x, y-1)\) или \((x, y+1)\). Это действие занимает \(1\) секунду.
  • Если Арома стоит в точке с устройством, то она может его собрать. Можно считать, что это действие занимает \(0\) секунд. Разумеется, каждое устройство можно собрать не более одного раза.

Арома хочет собрать как можно больше данных перед тем как вернётся назад. Помогите ей определить максимальное количество устройств с данными, которые она сможет собрать за \(t\) секунд.

Входные данные

Первая строка содержит целые числа \(x_0\), \(y_0\), \(a_x\), \(a_y\), \(b_x\), \(b_y\) (\(1 \leq x_0, y_0 \leq 10^{16}\), \(2 \leq a_x, a_y \leq 100\), \(0 \leq b_x, b_y \leq 10^{16}\)), которые задают координаты устройств с данными.

Вторая строка содержит целые числа \(x_s\), \(y_s\), \(t\) (\(1 \leq x_s, y_s, t \leq 10^{16}\)), изначальные координаты Аромы и доступное время.

Выходные данные

Выведите одно целое число — максимальное количество устройств с данными которые Арома сможет собрать за \(t\) секунд.

Примечание

Во всех трёх примерах, координаты первых \(5\) устройств равны \((1, 1)\), \((3, 3)\), \((7, 9)\), \((15, 27)\) и \((31, 81)\) (напомним, что устройства пронумерованы начиная с \(0\)).

В первом примере оптимальный маршрут чтобы собрать \(3\) вершины выглядит следующим образом:

  • Перейти в точку \((3, 3)\) и собрать \(1\)-е устройство. Это занимает \(|3 - 2| + |3 - 4| = 2\) секунд.
  • Перейти в точку \((1, 1)\) и собрать \(0\)-е устройство. Это занимает \(|1 - 3| + |1 - 3| = 4\) секунд.
  • Перейти в точку \((7, 9)\) и собрать \(2\)-е устройство. Это занимает \(|7 - 1| + |9 - 1| = 14\) секунд.

Во втором примере оптимальный маршрут чтобы собрать \(2\) вершины выглядит следующим образом:

  • Собрать \(3\)-е устройство. Это занимает ноль секунд.
  • Перейти в точку \((7, 9)\) и собрать \(2\)-е устройство. Это занимает \(|15 - 7| + |27 - 9| = 26\) секунд.

В третьем примере Арома не может собрать ни одного устройства. Пожалуй стоило отдохнуть, а не рваться в OS-пространство без подготовки.

A. КоннеР и A.R.C. Markland-N

Бинарный поиск Перебор реализация *1100

A.R.C. Markland-N это высокое \(n\)-этажное здание с этажами, пронумерованными от \(1\) до \(n\). Между любыми двумя соседними этажами есть лестница их соединяющая.

У нашего сенсея Колина «КоннеР» Неймена Jr приближается время обеда, поэтому он решил выбрать, в каком месте он собирается поесть.

Офис Коннера располагается на \(s\)-м этаже здания. На каждом этаже здания расположено по одному ресторану, в том числе на этаже \(s\). Однако в связи с идущей реконструкцией, \(k\) ресторанов сейчас закрыты.

Коннер не хочет терять много времени на еду, поэтому хочет найти открытый ресторан как можно ближе к нему. Иначе говоря, его интересует ресторан, требующий прохода по минимальному количеству лестниц от этажа Коннера.

Помогите Коннеру, и кто знает, может быть вы заслужите его похвалу и даже сможете насладиться обедом вместе с ним в элегантном стиле Нейманов!

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных.

Первая строка каждого набора содержит целые числа \(n\), \(s\) и \(k\) (\(2 \le n \le 10^9\), \(1 \le s \le n\), \(1 \le k \le \min(n-1, 1000)\)) — количество этажей в A.R.C. Markland-N, этаж на котором работает Коннер и количество закрытых ресторанов.

Вторая строка каждого набора содержит \(k\) различных целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \le a_i \le n\)) — этажи, на которых расположены закрытые рестораны.

Гарантируется, что сумма значений \(k\) по всем наборам во входных данных не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество лестниц до ближайшего открытого ресторана от офиса Коннера на этаже \(s\).

Примечание

В первом наборе входных данных примера ближайший открытый ресторан расположен на \(4\)-м этаже.

Во втором наборе входных данных примера ресторан на этаже с офисом Коннера не закрыт, так что Коннер сможет пообедать там.

В третьем наборе входных данных примера ближайший открытый ресторан находится на \(6\)-м этаже.

B. Сбор посылок

реализация сортировки *1200

На складе есть робот и \(n\) посылок, которые он хочет собрать. Склад можно представить в виде координатной сетки. Изначально робот находится в точке \((0, 0)\). \(i\)-я посылка находится в точке \((x_i, y_i)\). Гарантируется, что в одной точке не могут находиться две посылки. Также гарантируется, что в точке \((0, 0)\) посылки нет.

Робот наполовину сломан и может передвигаться только вверх ('U') и вправо ('R'). Другими словами, за один шаг робот может переместиться из точки \((x, y)\) в точку (\(x + 1, y\)) или в точку \((x, y + 1)\). Как сказано выше, робот хочет собрать все \(n\) посылок (в любом порядке). Он хочет сделать это за минимально возможное число шагов. Если существует несколько подходящих последовательностей шагов, робот хочет выбрать лексикографически минимальный путь.

Строка \(s\) длины \(n\) лексикографически меньше, чем строка \(t\) длины \(n\) если существует такой индекс \(1 \le j \le n\), что для всех \(i\) от \(1\) до \(j-1\) \(s_i = t_i\) и \(s_j < t_j\). Это обычное сравнение строк, например, в словаре строки расположены в лексикографическом порядке. Большинство языков программирования сравнивают строки именно так.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество посылок на складе.

Следующие \(n\) строк содержат описания посылок. \(i\)-я посылка задана в виде двух целых чисел \(x_i\) и \(y_i\) (\(0 \le x_i, y_i \le 1000\)) — \(x\)-координаты посылки и \(y\)-координаты посылки.

Гарантируется, что в каждой точке находится не более одной посылки. Также гарантируется, что в точке \((0, 0)\) посылки нет.

Сумма \(n\) по всем наборам входных данных в тесте не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных выведите ответ.

Если невозможно собрать все \(n\) посылок в каком-либо порядке, стартуя из точки (\(0,0\)), выведите «NO» первой строкой.

Иначе выведите «YES» первой строкой. Затем выведите кратчайший путь (строку), состоящий из символов 'R' и 'U'. Среди всех таких путей нужно выбрать лексикографически минимальный.

Заметьте, что в этой задаче «YES» и «NO» могут быть выведены только в верхнем регистре, то есть «Yes», «no» и «YeS» не принимаются.

Примечание

Для первого набора данных из указанного примера оптимальный путь RUUURRRRUU выглядит следующим образом:

D. Максимизация MEX

жадные алгоритмы математика реализация Структуры данных *1600

Напомним, что MEX массива — это минимальное неотрицательное целое число, которое не представлено в массиве. Примеры:

  • для массива \([0, 0, 1, 0, 2]\) MEX равен \(3\), потому что числа \(0, 1\) и \(2\) представлены в массиве, а \(3\) является минимальным неотрицательным целым числом, не представленным в массиве;
  • для массива \([1, 2, 3, 4]\) MEX равен \(0\), потому что \(0\) является минимальным неотрицательным целым числом, не представленным в массиве;
  • для массива \([0, 1, 4, 3]\) MEX равен \(2\), потому что \(2\) является минимальным неотрицательным целым числом, не представленным в массиве.

Вам задан пустой массив \(a=[]\) (иными словами, массив нулевой длины). Также вам задано положительное целое число \(x\).

Вам дано \(q\) запросов. \(j\)-й запрос состоит из одного целого числа \(y_j\), которое означает, что вы должны дописать один элемент \(y_j\) в массив. Длина массива увеличивается на \(1\) после каждого запроса.

За один ход вы можете выбрать любой индекс \(i\) и присвоить \(a_i := a_i + x\) или \(a_i := a_i - x\) (т.е. увеличить или уменьшить любой элемент на \(x\)). Единственное ограничение — \(a_i\) не может стать отрицательным. Так как изначально массив пуст, вы можете совершать ходы только после первого запроса.

Вам нужно максимизировать MEX (minimum excluded) массива, применив какое-то количество подобных операций (вы также можете применить несколько таких операций к одному и тому же элементу).

Вам необходимо найти ответ после каждого из \(q\) запросов (то есть \(j\)-й ответ соответствует массиву длины \(j\)).

Операции отменяются после каждого запроса. То есть массив \(a\) после \(j\)-го запроса равен \([y_1, y_2, \dots, y_j]\).

Входные данные

Первая строка входных данных содержит два целых числа \(q, x\) (\(1 \le q, x \le 4 \cdot 10^5\)) — количество запросов и значение числа \(x\).

Следующие \(q\) строк описывают запросы. \(j\)-й запрос состоит из целого числа \(y_j\) (\(0 \le y_j \le 10^9\)) и означает, что вы должны дописать один элемент \(y_j\) в массив.

Выходные данные

Выведите ответ на изначальную задачу после каждого запроса — для запроса \(j\) выведите максимальное значение MEX после первых \(j\) запросов. Стоит заметить, что запроса зависимы (массив меняется после каждого запроса), но операции между запросами независимы.

Примечание

В первом тестовом примере:

  • После первого запроса массив равен \(a=[0]\): нет необходимости применять операции, максимально возможный MEX равен \(1\).
  • После второго запроса массив равен \(a=[0, 1]\): нет необходимости применять операции, максимально возможный MEX равен \(2\).
  • После третьего запроса массив равен \(a=[0, 1, 2]\): нет необходимости применять операции, максимально возможный MEX равен \(3\).
  • После четвертого запроса массив равен \(a=[0, 1, 2, 2]\): нет необходимости применять операции, максимально возможный MEX равен \(3\) (вы не можете сделать его больше, применяя операции).
  • После пятого запроса массив равен \(a=[0, 1, 2, 2, 0]\): вы можете совершить операцию \(a[4] := a[4] + 3 = 3\). Массив изменится и станет равен \(a=[0, 1, 2, 2, 3]\). Теперь MEX является максимально возможным и равен \(4\).
  • После шестого запроса массив равен \(a=[0, 1, 2, 2, 0, 0]\): вы можете совершить операцию \(a[4] := a[4] + 3 = 0 + 3 = 3\). Массив изменится и станет равен \(a=[0, 1, 2, 2, 3, 0]\). Теперь MEX является максимально возможным и равен \(4\).
  • После седьмого запроса массив равен \(a=[0, 1, 2, 2, 0, 0, 10]\). Вы можете совершить следующие операции:
    • \(a[3] := a[3] + 3 = 2 + 3 = 5\),
    • \(a[4] := a[4] + 3 = 0 + 3 = 3\),
    • \(a[5] := a[5] + 3 = 0 + 3 = 3\),
    • \(a[5] := a[5] + 3 = 3 + 3 = 6\),
    • \(a[6] := a[6] - 3 = 10 - 3 = 7\),
    • \(a[6] := a[6] - 3 = 7 - 3 = 4\).
    Результирующий массив будет равен \(a=[0, 1, 2, 5, 3, 6, 4]\). Теперь MEX является максимально возможным и равен \(7\).

E. Получи перестановку

жадные алгоритмы математика реализация *1900

Вам задана прямоугольная матрица размера \(n \times m\), состоящая из целых чисел от \(1\) до \(2 \cdot 10^5\). За один ход вы можете:

  • выбрать любой элемент матрицы и изменить его значение на любое целое число от \(1\) до \(n \cdot m\), включительно;
  • взять любой столбец и сдвинуть его на одну клетку вверх циклически (смотрите пример такого циклического сдвига ниже).

Циклический сдвиг — это операция, в которой выбирается некоторое \(j\) (\(1 \le j \le m\)) и присваивается \(a_{1, j} := a_{2, j}, a_{2, j} := a_{3, j}, \dots, a_{n, j} := a_{1, j}\) одновременно.

Пример циклического сдвига первого столбца

Вы хотите определить минимальное количество шагов, за которое можно привести матрицу к подобному виду:

Другими словами, ваша цель — получить матрицу, в которой \(a_{1, 1} = 1, a_{1, 2} = 2, \dots, a_{1, m} = m, a_{2, 1} = m + 1, a_{2, 2} = m + 2, \dots, a_{n, m} = n \cdot m\) (i.e. \(a_{i, j} = (i - 1) \cdot m + j\)) за минимальное число шагов.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) and \(m\) (\(1 \le n, m \le 2 \cdot 10^5, n \cdot m \le 2 \cdot 10^5\)) — размер матрицы.

Следующие \(n\) строк содержат по \(m\) целых чисел в каждой. Число в строке \(i\) на позиции \(j\) равно \(a_{i, j}\) (\(1 \le a_{i, j} \le 2 \cdot 10^5\)).

Выходные данные

Выведите одно целое число — минимальное число шагов, необходимое, чтобы получить матрицу, в которой \(a_{1, 1} = 1, a_{1, 2} = 2, \dots, a_{1, m} = m, a_{2, 1} = m + 1, a_{2, 2} = m + 2, \dots, a_{n, m} = n \cdot m\) (\(a_{i, j} = (i - 1)m + j\)).

Примечание

В первом тестовом примере можно присвоить \(a_{1, 1} := 7, a_{1, 2} := 8\) и \(a_{1, 3} := 9\), а затем циклически сдвинуть первый, втрой и третий столбцы, таким образом, ответ равен \(6\). Можно показать, что лучшего результата достигнуть невозможно.

Во втором тестовом примере матрица уже является хорошей, поэтому ответ равен \(0\).

В третьем тестовом примере достаточно дважды циклически сдвинуть второй столбец, чтобы получить хорошую матрицу, поэтому ответ равен \(2\).

C. Очередной идущий робот

реализация Структуры данных *1500

На координатной плоскости стоит робот. Изначально он расположен в точке \((0, 0)\). Его путь описывается строкой \(s\) длины \(n\), состоящей из символов 'L', 'R', 'U', 'D'.

Каждый из этих символов соответствует некоторому ходу:

  • 'L' (влево): робот перемещается из точки \((x, y)\) в точку \((x - 1, y)\);
  • 'R' (вправо): робот перемещается из точки \((x, y)\) в точку \((x + 1, y)\);
  • 'U' (вверх): робот перемещается из точки \((x, y)\) в точку \((x, y + 1)\);
  • 'D' (вниз): робот перемещается из точки \((x, y)\) в точку \((x, y - 1)\).

Компания, которая создала этого робота, попросила вас оптимизировать путь робота некоторым образом. Чтобы сделать это, вы можете удалить любую непустую подстроку пути. Но эта компания не хочет, чтобы покупатели заметили перемену в поведении робота. Это означает, что если до оптимизации робот заканчивал свой путь в точке \((x_e, y_e)\), то после оптимизации (т.е. удаления некоторой единственной подстроки из \(s\)) робот тоже должен заканчивать свой путь в точке \((x_e, y_e)\).

Эта оптимизация — малобюджетный проект, поэтому вам нужно удалить кратчайшую возможную непустую подстроку, чтобы оптимизировать путь робота так, что конечная точка его пути не изменится. Возможна ситуация, когда вы не можете оптимизировать путь. Кроме того, возможно, что после оптимизации полученный путь станет пустой строкой (т.е. удаленная подстрока — это вся строка \(s\)).

Напомним, что подстрока строки \(s\) — это такая строка, которая может быть получена из \(s\) с помощью удаления некоторого числа символов (возможно, нулевого) из префикса и некоторого количества символов (возможно, нулевого) из суффикса. Например, подстроками «LURLLR» являются «LU», «LR», «LURLLR», «URL», но не «RR» и «UL».

Вам нужно ответить на \(t\) независимых наборов входных данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Следующие \(2t\) строк описывают наборы входных данных. Каждый набор задан двумя строками. Первая строка набора содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину пути робота. Вторая строка набора содержит одну строку \(s\), состоящую из \(n\) символов 'L', 'R', 'U', 'D' — путь робота.

Гарантируется, что сумма всех \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Для каждого набора входных данных выведите ответ на него. Если вы не можете удалить такую непустую подстроку, что конечная точка пути робота не изменится, выведите -1. В противном случае выведите два целых числа \(l\) и \(r\) такие, что \(1 \le l \le r \le n\) — границы подстроки, которую вы удаляете. Значение \(r-l+1\) должно быть минимальным возможным. Если существует несколько ответов, выведите любой из них.

A. Отображение количества лайков

*особая задача реализация

Поликарп работает над внедрением отображения лайков в социальной сети Codehorses. Количество лайков следует отображать в виде, который легко бы читался пользователями. Решено, что для больших значений будет использована запись вида 123K (сто двадцать три тысячи) или даже 56M (пятьдесят шесть миллионов).

Утверждена следующая стратегия отображения:

  • количество будет отображено либо в виде целого числа от 0 до 999, либо в виде целого положительного количества тысяч (от 1K до 999K), либо в виде целого положительного количества миллионов (от 1M и далее);
  • заданное точное количество лайков \(n\) при отображении должно быть округлено к ближайшей записи из пункта выше (при неоднозначности округления надо округлять вверх) — например, \(1785\) должно быть округлено к 2K, но не к 1K; \(4500000\) должно быть округлено к 5M.

Помогите Поликарпу реализовать эту часть функциональности: по заданному целому неотрицательному числу лайков \(n\) выведите его запись в интерфейсе Codehorses.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных, по одному в строке.

Описание набора состоит из строки, которая содержит целое неотрицательное число \(n\) (\(0 \le n \le 2\cdot10^9\)) — количество лайков.

Выходные данные

Выведите \(t\) ответов на заданные наборы входных данных в порядке из записи в тесте. Каждое выведенное значение должно иметь один из следующих видов:

  • либо целое число от 0 до 999 — соответствует просто записанному количеству,
  • либо запись количества тысяч от 1K до 999K,
  • либо запись количества миллионов от 1M до 2000M.

Ответ равен такой записи, которая является ближайшей (с точки зрения модуля разности) к заданному числу \(n\). Если такую форму округления можно совершить неоднозначно, то округлите вверх (к большему значению).

Примечание

Рассмотрим некоторые наборы входных данных:

  • \(1782\) может быть представлено либо как 1K, либо как 2K, но 2K — ближайшая запись;
  • \(1500\) одинаково удалено и от 1K, и от 2K, поэтому надо округлять вверх;
  • \(999999\) должно быть записано как 1M, так как такая запись ближе, чем 999K.

B. Мультфильмы

*особая задача реализация сортировки

Таня любит мультфильмы. В прокате ожидаются \(n\) мультфильмов, и \(i\)-й из них будет показываться в ее любимом кинотеатре со дня \(a_i\) по день \(b_i\) (\(1 \le a_i \le b_i \le 10^9\)).

В кинотеатре действует особая акция: в любой день, в который в прокате идёт ровно один мультфильм, кинотеатр даёт существенную скидку на сеанс.

Тане не важно, какой мультфильм посмотреть, но она хочет сэкономить, поэтому просит Вас найти любой такой день \(x\), что в этот день в прокате идёт ровно один мультфильм. Формально: для выбранного \(x\) должно быть верно, что существует ровно одно такое \(i\) (\(1 \le i \le n\)), что \(a_i \le x \le b_i\). Если ответов несколько, то выведите любой. Если такого дня не существует, то выведите -1.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных.

Описание набора начинается строкой, которая содержит целое число \(n\) (\(1 \le n \le 2000\)) — количество мультфильмов. Далее в \(n\) строках содержатся их описания: \(i\)-я строка содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i \le b_i \le 10^9\)) — период показа соответствующего мультфильма.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2000\).

Выходные данные

Для каждого из \(t\) наборов входных данных в порядке их записи в тесте выведите ответ. В качестве ответа на \(i\)-й набор выведите любое такое \(x\), что в день \(x\) в прокате идёт ровно один мультфильм. Если таких дней не существует, то выведите -1.

Примечание

Третий набор входных данных: в дни \(1\) и \(2\), первый и третий мультфильмы будут в прокате, а в дни \(3\) и \(4\) — второй и третий. Таким образом, нет такого дня, когда только один мультфильм будет в прокате.

В четвертом тесте \(11\) также является возможным ответом.

F. Фанат кино

*особая задача жадные алгоритмы реализация сортировки Структуры данных

Последнее время Поликарп фанатеет от новинок кинематографа и старается их не пропускать!

В ближайшее время выйдут \(n\) новых фильмов: \(i\)-й из них поступит в прокат в день \(a_i\) и закончит прокат в день \(b_i\). Это значит, что если Поликарп хочет посмотреть \(i\)-й фильм в кинотеатре, то должен это сделать в отрезок дней с \(a_i\) по \(b_i\) включительно.

Возможно, у Поликарпа не будет возможности посмотреть фильм в кинотеатре, тогда он может сделать это и после дня \(b_i\), посмотрев его с помощью одного из онлайн-сервисов. Конечно, это нежелательный исход для Поликарпа, ведь весь мир уже успеет обсудить этот фильм в социальных сетях!

В день Поликарп может посмотреть не более \(m\) фильмов. Помогите Поликарпу найти такое расписание просмотра фильмов, что каждый фильм будет просмотрен в кинотеатре. Если такое расписание не существует, то Поликарп хочет смотреть фильмы так, чтобы

  • для каждого фильма, который он не успеет посмотреть в кинотеатре найдём количество дней между окончанием его проката и днём, когда Поликарп сможет посмотрит фильм;
  • максимальная из величин предыдущего пункта должна быть как можно меньше.
Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных.

Первая строка каждого из наборов содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le m \le 10^9\)) — количество фильмов и максимальное количество фильмов, сколько Поликарп может просмотреть в день.

Далее в \(n\) строках описаны сами фильмы, по одному в строке, парой целых чисел \(a_i\), \(b_i\) (\(1 \le a_i \le b_i \le 10^9\)) — первый и последний день проката для \(i\)-го фильма.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(t\) ответов на заданные наборы входных данных в порядке их записи в тесте: \(i\)-й ответ должен состоять из двух строк. В первую строку ответа выведите целое число \(d\):

  • \(d=0\), если существует расписание, что все фильмы просмотрены во время проката;
  • \(d>0\), если такого расписания не существует — в этом случае \(d\) равно минимальному значению максимума среди всех «опозданий» просмотров после проката.

Во вторую строку ответа выведите \(n\) положительных целых чисел \(t_1, t_2, \dots, t_n\), где \(t_i\) — номер дня, когда надо посмотреть \(i\)-й фильм, в оптимальном расписании.

Если ответов несколько, то выведите любой из них.

A. Числа

математика реализация *1000

Маленький Петя очень любит числа. Недавно он определил, что 123 в системе счисления по основанию 16 состоит из двух цифр: старшая равна 7, а младшая — 11. Следовательно, сумма цифр 123 по основанию 16 равна 18.

Сейчас ему интересно, чему равно среднее арифметическое значение суммы цифр числа A, записанного во всех системах исчисления от 2 до A - 1, включительно.

Все подсчеты следует производить в десятичной системе. Результат нужно вывести в виде несократимой дроби, записанной в десятичной системе исчисления.

Входные данные

На вход дается единственное число A (3 ≤ A ≤ 1000).

Выходные данные

Вывести искомое среднее арифметическое значение в виде несократимой дроби в формате «X/Y», где X — числитель, а Y — знаменатель.

Примечание

В первом примере число 5, записанное в системах исчисления по основаниям от 2 до 4 имеет вид: 101, 12, 11. Суммы цифр равны 2, 3 и 2, соответственно.

B. Буква А

геометрия реализация *2000

Маленький Петя учится писать. Учительница дала всем задание написать букву А на листе бумаги. Требуется проверить, действительно ли Петя написал букву А или же он ошибся.

Даны координаты трех отрезков на плоскости. Назовем образованную ими фигуру буквой А, если выполняются такие условия:

  • Два отрезка имеют один общий конец (назовем эти отрезки первым и вторым), а третий соединяет 2 точки на разных отрезках.
  • Угол между первыми двумя отрезками строго больший 0 градусов и не превышает 90 градусов.
  • Третий отрезок делит первый и второй в отношении не менее чем 1 / 4 считая от любого из концов (т.е. отношение длины меньшей части к длине большей не меньше чем 1/4).
Входные данные

Первая строка содержит число t (1 ≤ t ≤ 10000) — количество тестов. Каждый тест состоит из трех строк. Первая строка каждого теста содержит четыре целых числа, по модулю не превышающих 108 — координаты концов одного из отрезков. Следующие 2 строки теста содержат координаты остальных двух отрезков в таком же формате. Все отрезки имеют строго положительную длину.

Выходные данные

Для каждого теста нужно вывести «YES» (без кавычек), если отрезки образуют букву A и «NO» в противном случае.

A. Шестиугольные числа

*особая задача реализация *900

Шестиугольные числа — фигурные числа, которые можно вычислить по следующей формуле: hn = 2n2 - n. Вам дан номер n; вычислите n-ое шестиугольное число.

Входные данные

Единственная строка входных данных содержит целое число n (1 ≤ n ≤ 100).

Выходные данные

Выведите n-ое шестиугольное число.

B. Gnikool Ssalg

*особая задача реализация Строки *1400

Вам дана строка. Переставьте ее символы в обратном порядке.

Входные данные

В первой строке входных данных содержится строка длиной от 1 до 100 символов, включительно. Каждый символ строки имеет ASCII-код от 33 (восклицательный знак) до 126 (тильда), включительно.

Выходные данные

Выведите символы заданной строки в обратном порядке.

A. Ещё раз

математика реализация *800

У Ги-Мануэля и Тома есть массив \(a\) из \(n\) целых чисел [\(a_1, a_2, \dots, a_n\)]. За один шаг они могут прибавить \(1\) к любому элементу массива. Формально, за один шаг они могут выбрать индекс \(i\) (\(1 \le i \le n\)) и присвоить \(a_i := a_i + 1\).

Если сумма или произведение всех элементов массива равны нулю, Ги-Мануэль и Тома не прочь сделать эту операцию ещё раз.

Какое минимальное количество шагов необходимо им сделать, чтобы и сумма и произведение всех элементов массива стали отличными от нуля? Формально, найдите минимальное количество шагов, требуемое, чтобы сделать \(a_1 + a_2 +\) \(\dots\) \(+ a_n \ne 0\) и \(a_1 \cdot a_2 \cdot\) \(\dots\) \(\cdot a_n \ne 0\).

Входные данные

Каждый тест содержит несколько наборов входных данных.

Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^3\)). Далее следуют описания наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 100\)) — длину массива.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-100 \le a_i \le 100\)) — элементы массива.

Выходные данные

Для каждого наборов входных данных, выведите наименьшее количество шагов требуемое, чтобы сделать сумму и произведение всех элементов массива отличными от нуля.

Примечание

В первом наборе входных данных примера сумма элементов массива равна \(0\). После того, как мы добавим \(1\) к первому элементу, массив будет таким: \([3,-1,-1]\), сумма станет равна \(1\), а произведение станет равно \(3\).

Во втором наборе входных данных примера и сумма и произведение чисел равны \(0\). Если мы добавим \(1\) к второму и третьему элементам, массив будет таким: \([-1,1,1,1]\), сумма станет равна \(2\), а произведение \(-1\).

В третьем наборе входных данных примера и сумма и произведение уже не равны нулю, и мы не должны ничего делать.

В четвёртом наборе входных данных примера, дважды добавив \(1\) к первому элементу, получим массив \([2,-2,1]\), его сумма равна \(1\), а произведение равно \(-4\).

B. Разделение на классы

жадные алгоритмы реализация сортировки *1000

Напомним, что медиана массива \([a_1, a_2, \dots, a_{2k+1}]\) из нечетного количества элементов определяется следующим образом: пусть \([b_1, b_2, \dots, b_{2k+1}]\) — числа массива в отсортированном порядке. Тогда медиана этого массива равна \(b_{k+1}\).

В классе \(2n\) учеников, уровень навыков \(i\)-го ученика равен \(a_i\). Не гарантируется, что все уровни навыков учеников различны.

Уровень навыков класса будем считать равным медиане уровней навыков учеников класса.

Как директор школы, вы хотели бы разделить всех учеников на \(2\) класса так, чтобы в каждом классе было нечетное количество учеников (не делящееся на \(2\)). Количества учеников в классах могут быть равными или различными, на ваш выбор. Каждый ученик должен попасть ровно в один класс. Среди таких разделений вы хотите выбрать то, в котором модуль разности между уровнями навыков классов минимален.

Какой минимальный модуль разности вы можете получить?

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 10^5\)) — деленное на два количество учеников.

Первая строка описания каждого набора входных данных содержит \(2n\) целых чисел \(a_1, a_2, \dots, a_{2 n}\) (\(1 \le a_i \le 10^9\)) — уровни навыков студентов.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальный возможный модуль разности между уровнями навыков двух классов нечетных размеров.

Примечание

В первом наборе входных данных примера есть лишь один способ разделить учеников — по одному в классе. Модуль разности уровней навыков будет равен \(|1 - 1| = 0\).

Во втором наборе входных данных примера одним из возможных разделений является такое: сделать первый класс из учеников с уровнями навыков \([6, 4, 2]\), тогда уровень навыков этого класса будет равна \(4\), и второй с \([5, 1, 3]\), тогда уровень навыков этого класса будет равна \(3\). Модуль разности будет равен \(|4 - 3| = 1\).

Заметим, что вы не можете разделить классы так: \([2, 3]\), \([6, 5, 4, 1]\) или \([]\), \([6, 5, 4, 1, 2, 3]\), потому что так классы содержат чётное число учеников.

\([2]\), \([1, 3, 4]\) тоже невозможно, так как студенты с навыками \(5\) и \(6\) не попадут ни в один класс.

В третьем наборе входных данных примера вы можете разделить следующим образом: \([3, 4, 13, 13, 20], [2, 5, 8, 16, 17]\) или \([3, 8, 17], [2, 4, 5, 13, 13, 16, 20]\). Оба разделения дают минимальный возможный модуль разности.

A. Три строки

реализация Строки *800

Вам даны три строки \(a\), \(b\) и \(c\) одинаковой длины \(n\). Строки состоят только из строчных символов латинского алфавита. Тогда \(i\)-й символ строки \(a\) это \(a_i\), \(i\)-й символ строки \(b\) это \(b_i\), \(i\)-й символ строки \(c\) это \(c_i\).

Для всех \(i\) (\(1 \leq i \leq n\)) вы должны поменять символ \(c_i\) либо с \(a_i\), либо с \(b_i\) (это значит поменять его значение в строке со значением другого символа в другой строке). То есть суммарно вы должны выполнить ровно \(n\) замен, каждая из которых это либо \(c_i \leftrightarrow a_i\), либо \(c_i \leftrightarrow b_i\) (для всех целых \(i\) от \(1\) до \(n\), включительно).

Например, если \(a\) это «code», \(b\) это «true» и \(c\) это «help», вы можете сделать строку \(c\) равной «crue», меняя \(1\)-й и \(4\)-й символы с соответствующими символами в строке \(a\) и остальные с соответствующими символами в строке \(b\). В этом случае строка \(a\) станет равной «hodp» и строка \(b\) станет равной «tele».

Возможно ли так сделать замены, что строка \(a\) станет равна строке \(b\)?

Входные данные

Входные данные состоят из нескольких тестовых случаев. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 100\))  — количество тестовых случаев. Далее следует описание тестовых случаев в следующем формате.

Первая строка описания каждого тестового случая содержит строку \(a\), состоящую из строчных символов латинского алфавита.

Вторая строка описания каждого тестового случая содержит строку \(b\), состоящую из строчных символов латинского алфавита.

Третяя строка описания каждого тестового случая содержит строку \(c\), состоящую из строчных символов латинского алфавита.

Гарантируется, что в каждом тестовом случае все три строки непустые и имеют одинаковую длину, не превосходящую \(100\).

Выходные данные

Выведите \(t\) строк с ответами на тестовые случаи. Для каждого тестового случая:

Если возможно сделать строку \(a\) равной строке \(b\) выведите «YES» (без кавычек), иначе выведите «NO» (без кавычек).

Вы можете выводить как строчные, так и заглавные буквы в ответах.

Примечание

В первом тестовом случае, невозможно так сделать замены, чтобы строка \(a\) стала равной строке \(b\).

Во втором тестовом случае, вы можете поменять \(c_i\) с \(a_i\) для всех \(i\). После таких замен \(a\) станет равной «bca», \(b\) станет равной «bca» и \(c\) станет равной «abc». Легко видеть, что строки \(a\) и \(b\) станут равными.

В третьем тестовом случае, вы можете поменять \(c_1\) с \(a_1\), \(c_2\) с \(b_2\), \(c_3\) с \(b_3\) и \(c_4\) с \(a_4\). Тогда строка \(a\) станет равной «baba», строка \(b\) станет равной «baba» и строка \(c\) станет равной «abab». Легко видеть, что строки \(a\) и \(b\) станут равными.

В четвертом тестовом случае, невозможно так сделать замены, чтобы строка \(a\) стала равной строке \(b\).

D. Время бега

графы Конструктив реализация *2000

Башар готовится к национальному констесту по программированию. Из-за слишком частого сидения перед компьютером без совершения каких-либо физических действий Башар стал толстеть. Он собирается уйти из программирования после национального контеста и стать актером (как его отец), поэтому ему нужно сбросить вес.

Поэтому, Башар решил пробежать \(k\) километров. Башар собирается бежать в месте, которое выглядит как таблица с \(n\) строками и \(m\) столбцами. В этой таблице есть по две односторонние дороги длинной в один километр между каждой парой соседних по стороне клеток: одна дорога идет от первой клетки ко второй, другая от второй к первой. Поэтому, всего ровно \((4 n m - 2n - 2m)\) дорог.

Давайте рассмотрим, например \(n = 3\) и \(m = 4\). В этом случае, есть ровно \(34\) дороги. Это картинка, демонстрирующая этот случай (стрелки обозначают дороги):

Башар хочет бежать по следующим правилам:

  • Он начинает в левой верхней клетке таблицы;
  • За один ход он может переместиться на одну клетку вверх (символ 'U'), вниз (символ 'D'), влево (символ 'L') или вправо (символ 'R'). Более формально, если он сейчас находится в клетке в строке \(i\) и в столбце \(j\), то есть в клетке \((i, j)\), то он переместится:
    • в случае 'U' в клетку \((i-1, j)\);
    • в случае 'D' в клетку \((i+1, j)\);
    • в случае 'L' в клетку \((i, j-1)\);
    • в случае 'R' в клетку \((i, j+1)\);
  • Он хочет пробежать ровно \(k\) километров, то есть он хочет совершить ровно \(k\) ходов;
  • Башар может закончить в любой клетке таблицы;
  • Он не может выходить за пределы таблицы, то есть в любой момент времени он должен находиться в одной из клеток таблицы;
  • Башар не хочет, чтобы ему было скучно во время бега, поэтому он не должен посещать одну и ту же дорогу более одного раза. Но он может посещать одну и ту же клетку любое количество раз.

Башар спрашивает вас, можно ли пробежать по таким правилам. Если это возможно, вы должны сказать ему, как он должен бежать.

Вы должны дать ему \(a\) шагов и поскольку Башар не может запомнить слишком много шагов, \(a\) не должно превосходить \(3000\). Для каждого шага вы должны дать ему положительное целое число \(f\) и строчку ходов \(s\) длиной не больше \(4\). Этот шаг означает, что вы должны повторять ходы строки \(s\) \(f\) раз. Он будет выполнять шаги в порядке, в котором вы их вывели.

Например, если шаги это \(2\) RUD, \(3\) UUL, то его ходы будут RUD \(+\) RUD \(+\) UUL \(+\) UUL \(+\) UUL \(=\) RUDRUDUULUULUUL.

Можете ли вы помочь ему и дать ему корректную последовательность шагов, такую что общее расстояние, которое он пробежит равно \(k\) или сказать, что это невозможно?

Входные данные

В единственной строке находится три целых числа \(n\), \(m\) и \(k\) (\(1 \leq n, m \leq 500\), \(1 \leq k \leq 10 ^{9}\)), которые равны количеству строк, количеству столбцов в таблице и расстоянию, которое Башар хочет пробежать.

Выходные данные

Если не существует способа пробежать \(k\) километров, выведите «NO» (без кавычек), иначе выведите «YES» (без кавычек) в первой строке.

Если ответ «YES», во второй строке выведите целое число \(a\) (\(1 \leq a \leq 3000\)) — количество шагов, затем выведите \(a\) строк, описывающих шаги.

Для того, чтобы описать шаг, выведите положительное целое число \(f\) (\(1 \leq f \leq 10^{9}\)) и строку ходов \(s\) длины не более \(4\). Каждый символ строки \(s\) должен быть равен 'U', 'D', 'L' или 'R'.

Башар будет начинать в левой верхней клетке. Обратите внимание, что он должен пробежать ровно \(k\) километров и не пробежать по одной и той же дороге дважды. Он не должен выходить за пределы таблицы. Он может закончить в любой клетке.

Можно показать, что если можно пробежать ровно \(k\) километров, соблюдая все условия, то можно описать какой-то путь в данных ограничениях на выходные данные.

Примечание

Ходы, которые Башар собирается сделать в первом тесте это: «RRLL».

Невозможно пробежать \(1000000000\) километров во втором тесте, потому что суммарная длина дорог будет намного меньше, а Башар не может посещать одну и ту же дорогу дважды.

Ходы, которые Башар собирается сделать в третьем тесте это: «RRDDLLRR».

Ходы, которые Башар собирается сделать в пятом тесте это: «RRRLLLDRRRDULLLD». Это картинка его маршрута (дороги вдоль его маршрута покрашены в красный и пронумерованы в порядке, в котором он будет пробегать их):

E. Нанософт

Бинарный поиск дп реализация Структуры данных *2500

Вараврех создал великую компанию и назвал ее Нанософт. Единственная вещь, которую Вараврех еще должен сделать это расположить огромное изображение с эмблемой Нанософта на главное здание этой компании.

Эмблема Нанософта может быть описана как четыре квадрата одинакового размера, объединенных вместе в один большой квадрат. Левый верхний квадрат окрашен в красный цвет, правый верхний квадрат окрашен в зеленый цвет, левый нижний окрашен в желтый цвет и правый нижний окрашен в синий цвет.

Примеры некоторых корректных эмблем:

Примеры некоторых некорректных эмблем:

Вараврех пришел в магазин Адхами с целью купить необходимое изображение. Хотя магазин Адхами очень большой у него было ровно одно изображение, описываемое таблицей с \(n\) строками и \(m\) столбцами. Цвет каждой клетки этой таблицы может быть зеленым (символ 'G'), красным (символ 'R'), желтым (символ 'Y') или синим (символ 'B').

Адхами дал Варавреху \(q\) опций, в каждой опции он дал ему подпрямоугольник этого изображения и сказал ему, что он может вырезать для себя подквадрат этого подпрямоугольника. Чтобы выбрать наилучшую опцию, Вараврех хочет узнать максимальную площадь подквадрата внутри данного подпрямоугольника, который является эмблемой Нанософта. Если таких подквадратов не существует, то ответ равен \(0\).

Вараврех так и не смог выбрать наилучшую опцию сам, поэтому просит вас о помощи. Можете ли вы помочь ему?

Входные данные

В первой строке находится три целых числа \(n\), \(m\) и \(q\) \((1 \leq n , m \leq 500, 1 \leq q \leq 3 \cdot 10^{5})\)  — количество строк, столбцов и количество опций.

Каждая из следующих \(n\) строк содержит строку, содержащую \(m\) символов. В \(i\)-й строке \(j\)-й символ будет содержать цвет клетки в \(i\)-й строке и \(j\)-м столбце изображения Адхами. Цвет каждой клетки будет одним из этих: {'G','Y','R','B'}.

В каждой из следующих \(q\) строк содержится четыре целых числа \(r_1\), \(c_1\), \(r_2\) и \(c_2\) \((1 \leq r_1 \leq r_2 \leq n, 1 \leq c_1 \leq c_2 \leq m)\). В этой опции Адхами дает подпрямоугольник изображения с левым верхним углом в клетке \((r_1, c_1)\) и правым нижним углом в клетке \((r_2, c_2)\).

Выходные данные

Для каждой опции выведите максимальную площадь подквадрата внутри данного подпрямоугольника, который может быть эмблемой Нанософта. Если таких подквадратов не существует, то выведите \(0\).

Примечание

Картинка для первого теста:

Картинки слева направа соответствуют опциям. Черным обведена граница подпрямоугольника в соответствующей опции, серым обведена граница подквадрата максимального размера, который можно вырезать.

F. Супер Джабер

графы кратчайшие пути поиск в глубину и подобное реализация *2600

Джабер супергерой в большой стране, которая может быть представлена как таблица с \(n\) строками и \(m\) столбцами, где в каждой клетке этой таблицы находится свой город.

Джабер дал каждому городу в стране свой цвет от \(1\) до \(k\). За одну секунду он может пройти из текущего города в любой соседний по стороне город или в любой город, с таким же цветом, как цвет текущего города.

Джабер должен выполнить \(q\) миссий. В каждой миссии он начинает в городе в строке \(r_1\) и столбце \(c_1\) и должен помочь кому-то в городе в строке \(r_2\) и столбце \(c_2\).

Джабер просит вашей помощи в расчете минимального возможного времени, необходимого, чтобы попасть из стартового города в конечный в каждой миссии.

Входные данные

В первой строке находится три целых числа \(n\), \(m\) и \(k\) (\(1 \leq n, m \leq 1000\), \(1 \leq k \leq min(40 , n \cdot m)\)) — количество строк, столбцов и цветов.

Каждая из следующих \(n\) строк содержит \(m\) целых чисел. В \(i\)-й строке, \(j\)-е число это \(a_{ij}\) (\(1 \leq a_{ij} \leq k\)), оно равно цвету, данному городу в строке \(i\) и столбце \(j\).

В следующей строке находится единственное целое число \(q\) (\(1 \leq q \leq 10^{5}\))  — количество миссий.

В каждой из следующих \(q\) строк находится четыре целых числа \(r_1\), \(c_1\), \(r_2\), \(c_2\) (\(1 \leq r_1 , r_2 \leq n\), \(1 \leq c_1 , c_2 \leq m\))  — координаты начального и конечного городов для очередной миссии.

Гарантируется, что для каждого цвета между \(1\) и \(k\) существует хотя бы один город с таким цветом.

Выходные данные

Для каждой миссии выведите минимальное время, необходимое, чтобы попасть в клетку \((r_2, c_2)\), начав в клетке \((r_1, c_1)\).

Примечание

В первом тесте:

  • миссия \(1\): Джабер должен пойти из клетки \((1,1)\) в клетку \((3,3)\) потому что они одинакового цвета, затем из клетки \((3,3)\) в клетку \((3,4)\) потому что они соседние по стороне (всего два хода);
  • миссия \(2\): Джабер уже начинает в конечной клетке.

Во втором тесте:

  • миссия \(1\): \((1,1)\) \(\rightarrow\) \((1,2)\) \(\rightarrow\) \((2,2)\);
  • миссия \(2\): \((1,1)\) \(\rightarrow\) \((3,2)\) \(\rightarrow\) \((3,3)\) \(\rightarrow\) \((3,4)\);
  • миссия \(3\): \((1,1)\) \(\rightarrow\) \((3,2)\) \(\rightarrow\) \((3,3)\) \(\rightarrow\) \((2,4)\);
  • миссия \(4\): \((1,1)\) \(\rightarrow\) \((1,2)\) \(\rightarrow\) \((1,3)\) \(\rightarrow\) \((1,4)\) \(\rightarrow\) \((4,4)\).

A. Удаление нулей

реализация Строки *800

Вам задана строка \(s\). Она состоит только из 0 и 1.

Вы хотите, чтобы все символы 1 образовывали непрерывный подотрезок. Например, в строках 0, 1, 00111 и 01111100 все символы 1 образуют непрерывный подотрезок, а в строках 0101, 100001 и 11111111111101 — нет.

Вы можете удалить какое-то количество (возможно, нулевое) символов 0 из строки. Чему равно минимальное количество символов 0, которое вам нужно удалить?

Входные данные

Первая строка содержит число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Затем следуют \(t\) строк. Каждая из этих строк содержит строку \(s\) (\(1 \le |s| \le 100\)); все символы строки \(s\) равны либо 0 либо 1.

Выходные данные

Выведите \(t\) чисел, \(i\)-е число — это ответ на \(i\)-й набор входных данных (минимальное количество символов 0, которое нужно удалить из строки \(s\)).

Примечание

В первом тестовом примере вам нужно удалить третий и четвертый символы из строки 010011 (она превратится в 0111).

C. Идеальная клавиатура

жадные алгоритмы поиск в глубину и подобное реализация *1600

Поликарп хочет собрать свою собственную клавиатуру. Клавиатуры с несколькими рядами слишком сложны для него, его клавиатура будет состоять только из одного ряда, где все \(26\) строчных латинских букв будут расположены в определенном порядке.

Поликарп использует один и тот же пароль \(s\) на всех сайтах, где он зарегистрирован (это плохо, но ему все равно). Он хочет собрать клавиатуру, которая позволит набирать этот пароль очень легко. Он не любит двигать пальцами при вводе пароля, поэтому для каждой пары соседних символов в \(s\) они должны быть соседними на клавиатуре. Например, если пароль abacaba, то клавиатура cabdefghi... идеальна, так как символы a и c соседние на клавиатуре, и a и b соседние на клавиатуре.

Гарантируется, что в \(s\) нет двух соседних одинаковых символов, поэтому, например, password не может быть паролем (два символа s являются соседними).

Можете ли вы помочь Поликарпу с выбором идеальной клавиатуры, если это возможно?

Входные данные

Первая строка содержит одно целое число \(T\) (\(1 \le T \le 1000\)) — количество наборов тестовых данных.

Затем следуют \(T\) наборов тестовых данных, каждый из которых содержит одну строку \(s\) (\(1 \le |s| \le 200\)). \(s\) состоит только из строчных латинских букв. В \(s\) нет двух соседних одинаковых символов.

Выходные данные

Для каждого набора входных данных выведите результат в следующем виде:

  • если невозможно собрать идеальную клавиатуру, выведите NO (в верхнем регистре, это имеет значение в этой задаче);
  • в противном случае выведите YES (в верхнем регистре), а затем строку, состоящую из \(26\) строчных латинских букв — идеальную клавиатуру. Каждая латинская буква должна появиться в этой строке ровно один раз. Если ответов несколько, выведите любой из них.

F. Количество компонент

реализация снм *2800

У вас есть матрица размера \(n \times m\), изначально заполненная нулями. Элемент в \(i\)-й строке и \(j\)-м столбце обозначим как \(a_{i, j}\).

Две ячейки матрицы являются связанными, если они имеют общую сторону, и элементы в этих ячейках равны. Две ячейки матрицы принадлежат одной и той же компоненте связности, если существует последовательность \(s_1\), \(s_2\), ..., \(s_k\) такая, что \(s_1\) — первая ячейка, \(s_k\) — вторая ячейка, и для каждого \(i \in [1, k - 1]\), \(s_i\) и \(s_{i + 1}\) связаны.

Вам заданы \(q\) запросов вида \(x_i\) \(y_i\) \(c_i\) (\(i \in [1, q]\)). Для каждого такого запроса вам необходимо сделать следующее:

  1. заменить элемент \(a_{x, y}\) на \(c\);
  2. посчитать кол-во компонент связности в матрице.

Существует одно дополнительное ограничение: для каждого \(i \in [1, q - 1]\), \(c_i \le c_{i + 1}\).

Входные данные

Первая строка содержит три целых числа \(n\), \(m\) и \(q\) (\(1 \le n, m \le 300\), \(1 \le q \le 2 \cdot 10^6\)) — количество строк, количество столбцов и количество запросов соответственно.

Затем следуют \(q\) строк, каждая из которых представляет запрос. \(i\)-я строка содержит три целых числа \(x_i\), \(y_i\) и \(c_i\) (\(1 \le x_i \le n\), \(1 \le y_i \le m\), \(1 \le c_i \le \max(1000, \lceil \frac{2 \cdot 10^6}{nm} \rceil)\)). Для каждого \(i \in [1, q - 1]\), \(c_i \le c_{i + 1}\).

Выходные данные

Выведите \(q\) целых чисел, \(i\)-е из них должно быть равно числу компонент связности в матрице после выполнения первых \(i\) запросов.

B. Самый длинный палиндром

жадные алгоритмы Конструктив Перебор реализация Строки *1100

Вернувшись к решению задач, Гильдонг взялся за изучение палиндромов. Он выяснил, что палиндром это строка, которая равна своему перевороту. Например, строки «pop», «noon», «x», и «kkkkkk» являются палиндромами, а строки «moon», «tv», и «abab» не являются. Пустая строка также является палиндромом.

Гильдонгу очень понравился этот концепт, так что он решил немного с ним поиграть. У него есть \(n\) различных строк равной длины \(m\). Он хочет удалить некоторые из этих строк (возможно, ни одну, или все) и переставить оставшиеся, чтобы их конкатенация была палиндромом. Он также хочет, чтобы палиндром был как можно длиннее. Помогите ему решить эту задачу!

Входные данные

В первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 100\), \(1 \le m \le 50\)) — количество строк и длина каждой строки.

В следующих \(n\) строках записаны строки длины \(m\), состоящие только из строчных букв латинского алфавита. Все данные строки различны.

Выходные данные

В первую строку выведите длину наибольшего палиндрома.

Во вторую строку выведите искомый палиндром. Если есть несколько возможных ответов, выведите любой. Если палиндром пуст, то можете как вывести пустую строку, так и не выводить эту строку вообще.

Примечание

В первом примере «battab» также является корректным ответом.

Во втором примере есть 4 разных возможных корректных ответа, включая ответ из примера. Мы не будем давать никаких подсказок, какими являются остальные ответы.

В третьем примере единственная возможная строка — пустая.

C. Кондиционер

дп жадные алгоритмы реализация сортировки *1500

Гильдонг — владелец ресторана Пулькоги. Ресторан пользуется большим спросом, и часто посетители хотят забронировать столик до посещения.

Гильдонг так старается угодить всем посетителям, что он даже запомнил предпочитаемые диапазоны температуры всех посетителей! Смотря на список бронирований, он хочет удовлетворить всех посетителей, контролируя температуру ресторана.

В ресторане стоит кондиционер, у которого есть три состояния: выключенное, нагрев, и охлаждение. Когда кондиционер выключен, температура в ресторане не изменяется. Когда включен нагрев, температура увеличивается на 1 каждую минуту. Наконец, когда включено охлаждение, температура уменьшается на 1 каждую минуту. Гильдонг может переключать состояние сколько угодно раз, в любые целочисленные минуты. Кондиционер исходно выключен.

Каждый посетитель характеризуется тремя значениями: \(t_i\) — момент визита (в минутах) \(i\)-го посетителя, \(l_i\) — нижняя граница предпочитаемого диапазона температур, and \(h_i\) — верхняя граница предпочитаемого диапазона температур.

Каждый посетитель удовлетворен, если температура находится в их предпочтительном диапазоне в момент их посещения ресторана. Формально, \(i\)-й посетитель удовлетворён, если и только если в минуту \(t_i\) температура находится в отрезке от \(l_i\) до \(h_i\), включительно.

Вам дана исходная температура, список времен посещения посетителей и их предпочитаемые диапазоны температуры, помогите ему удовлетворить всех посетителей.

Входные данные

Каждый тест состоит из одного или большего числа наборов входных данных. В первой строке записано количество наборов входных данных \(q\) (\(1 \le q \le 500\)). Затем следуют их описания.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 100\), \(-10^9 \le m \le 10^9\)), где \(n\) это число посетителей и \(m\) это изначальная температура ресторана.

Затем следуют \(n\) строк. \(i\)-я из них содержит три целых числа \(t_i\), \(l_i\), и \(h_i\) (\(1 \le t_i \le 10^9\), \(-10^9 \le l_i \le h_i \le 10^9\)), где \(t_i\) это момент визита \(i\)-го посетителя, \(l_i\) это нижняя граница предпочитаемого диапазона температур, а \(h_i\) это верхняя граница предпочитаемого диапазона температур. Все границы диапазонов — включительны.

Посетители даны в порядке неубывания момента посещения, а текущее время — \(0\).

Выходные данные

Для каждого набора входных данных выведите «YES» если возможно удовлетворить потребности всех посетителей. В противном случае, выведите «NO».

Вы можете выводить все буквы в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных примера Гильдонг может контролировать кондиционер, чтобы удовлетворить всех посетителей, следующим образом:

  • В \(0\)-ю минуту, поменяйте состояние на нагрев (температура 0).
  • Во \(2\)-ю мунуту, поменяйте состояние на выключенное (температура 2).
  • В \(5\)-ю минуту, поменяйте состояние на нагрев (температура 2, \(1\)-й посетитель уже удовлетворен).
  • В \(6\)-ю минуту, поменяте состояние на выключенное (температура 3).
  • В \(7\)-ю минуту, поменяйте состояние на охлаждение (температура 3, \(2\)-й посетитель удовлетворен).
  • В \(10\)-ю минуту, температура будет 0, что удовлетворит последнего посетителя.

В третьем наборе входных данных примера поменяйте состояние на выключенное в \(0\)-ю муинуту и оставьте его таким. Тогда все посетители будут удовлетворены. Обратите внимание, что момент посещения \(1\)-го посетителя совпадает с моментом посещения \(2\)-го посетителя.

Во втором и четвертом наборах входных данных примера Гильдонгу придется оставить хотя бы одного посетителя неудовлетворенным.

E. Курони и разбалловка

жадные алгоритмы Конструктив математика реализация *2200

Курони является координатором следующего раунда Mathforces, написанного командой «Proof by AC». Вся подготовка позади, и он обсуждает с командой распределение баллов за раунд.

Раунд состоит из \(n\) задач, пронумерованных от \(1\) до \(n\). Задачи упорядочены в порядке возрастания сложности, никакие две задачи не имеют одинаковую сложность. Распределение баллов за раунд можно обозначить массивом \(a_1, a_2, \dots, a_n\), где \(a_i\)  — баллы за \(i\)-ю задачу.

Курони считает, что распределение очков должно удовлетворять следующим требованиям:

  • Балл за каждую задачу должен быть положительным целым числом, не превышающим \(10^9\).
  • Более сложная задача должна стоит больше баллов, чем более простая. Другими словами, \(1 \leq a_1 < a_2 < \dots < a_n \leq 10^9\)..
  • Баланс распределения баллов, определяемый как количество троек \((i, j, k)\), таких, что \(1 \leq i < j < k \leq n\) и \(a_i + a_j = a_k\), должен быть равен ровно \(m\).

Помогите команде найти распределение баллов, которое удовлетворяет требованиям Курони. Если такого распределения баллов не существует, выведите \(-1\).

Входные данные

Первая и единственная строка содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 5000\), \(0 \leq m \leq 10^9\))  — количество задач и требуемый баланс.

Выходные данные

Если решения не существует, выведите единственное целое число \(-1\).

В противном случае выведите \(n\) целых чисел \(a_1, a_2, \dots, a_n\), представляющие распределение баллов, которое удовлетворяет всем требованиям. Если есть несколько решений, выведите любой из них.

Примечание

В первом примере следующие \(3\) тройки \((i, j, k)\) вносят вклад в баланс распределения баллов.

  • \((1, 2, 3)\)
  • \((1, 3, 4)\)
  • \((2, 4, 5)\)

A. Корова и стоги сена

жадные алгоритмы реализация *800

Организация USA Construction Operation (USACO) недавно приказала Фермеру Джону разместить у себя на ферме \(n\) стогов сена в ряд. При чем \(i\)-й стог сена состоит из \(a_i\) тюков сена.

Однако недавно Фермер Джон уехал на отдых, оставив Бесси саму по себе. Каждый день Бесси, озорная корова, может выбрать один тюк из любого непустого стога и переместить его в соседний стог. Формально, за один день она может выбрать два любых индекса \(i\) и \(j\) (\(1 \le i, j \le n\)) таких, что \(|i-j|=1\) и \(a_i>0\) и применить \(a_i = a_i - 1\), \(a_j = a_j + 1\). Она также может решить ничего не делать в некоторые дни, потому что Бесси ленивая.

Бесси хочет максимизировать количество тюков в \(1\)-м стоге (то есть максимизировать \(a_1\)), и у нее есть только \(d\) дней до того как вернется Фермер Джон. Помогите ей определить максимальное количество тюков в \(1\)-м стоге, если Бесси будет действовать оптимально!

Входные данные

Входные данные содержат несколько наборов входных данных. В первой строке задано единственное число \(t\) (\(1 \le t \le 100\))  — количество наборов входных данных. Следующие \(2t\) строк содержат описания наборов  — по две строки на набор.

В первой строке каждого набора входных данных задано два целых числа \(n\) и \(d\) (\(1 \le n,d \le 100\)) — количество стогов сена и количество оставшихся дней, соответственно.

Во второй строке каждого набора задано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 100\))  — количество тюков в каждом стоге.

Выходные данные

Для каждого набора входных данных выведите единственное число: максимальное количество тюков, которые можно получить в \(1\)-м стоге через \(d\) дней, если Бесси будет действовать оптимально.

Примечание

Для первого набора входных данных из примера, ниже описан один из возможных способов получить \(3\) тюка в стоге \(1\):

  • В первых день, перенести тюк из стога \(3\) в стог \(2\).
  • Во второй день, перенести тюк из стога \(3\) в стог \(2\).
  • В третий день, перенести тюк из стога \(2\) в стог \(1\).
  • В четвертый день, перенести тюк из стога \(2\) в стог \(1\).
  • В пятый день, ничего не делать.

Во втором наборе, Бесси может ничего не делать в первый день и перенести тюк из стога \(2\) в стог \(1\) на второй день.

E. Корова и угощения

Бинарный поиск дп жадные алгоритмы Комбинаторика математика реализация *2500

После удачного года по количеству удоя, Фермер Джон решил наградить своих коров их любимым угощением: вкусной травой!

На поле располагается ряд из \(n\) единиц травы, каждая единица соответствующего уровня сладости \(s_i\). У Фермера Джона \(m\) коров, каждая обладает своим любимым уровнем сладости \(f_i\) и уровнем голода \(h_i\). Фермер Джон хочет выбрать непересекающиеся подмножества коров, чтобы разместить их с левой и правой стороны ряда травы. Нет никаких ограничений на количество коров с каждой стороны. Поведение коров описывается следующим образом:

  • Коровы с левой и правой сторон начинают кормиться по очереди в порядке, выбранном Фермером Джоном.
  • Кормежка коровы выглядит следующим образом: корова начинает двигаться к противоположному концу ряда, не меняя своего направления, и поедает траву своего любимого уровня сладости, пока не съест \(h_i\) единиц.
  • В тот момент, как корова съест \(h_i\) травы, она ложится спать прямо там, мешая проходу других коров с обоих сторон.
  • Если же корова встречает на пути другую спящую корову или достигает конца ряда травы, она расстраивается. Фермер Джон ни при каких условиях не хочет расстраивать своих коров.

Заметим, что трава не отрастает обратно. Также, чтобы не расстраивать корову, Фермер Джон может просто не выбрать каких-то коров.

Удивительно, но Фермер Джон решил, что спящие коровы — наиболее удовлетворенные. Если Фермер Джон будет выбирать порядок оптимально, то какое наибольшее количество спящих коров он сможет получить, и сколько способов существует выбрать два подмножества так, чтобы получить данное максимальное количество спящих коров (по модулю \(10^9+7\))? Порядок, в котором Фермер Джон посылает коров кормиться не важен пока ни одна корова не расстроена.

Входные данные

В первой строке задано два целых числа \(n\) и \(m\) (\(1 \le n \le 5000\), \(1 \le m \le 5000\))  — количество единиц травы в ряду и количество коров.

Во второй строке задано \(n\) целых чисел \(s_1, s_2, \ldots, s_n\) (\(1 \le s_i \le n\))  — уровни сладости травы.

В \(i\)-й из следующих \(m\) строк задано два целых числа \(f_i\) и \(h_i\) (\(1 \le f_i, h_i \le n\))  — любимый уровень сладости и уровень голода \(i\)-й коровы. Никакие две коровы не имеют одинаковый любимый уровень сладости и уровень голода одновременно.

Выходные данные

Выведите два числа  — максимальное количество спящих коров и количество способов его получить по модулю \(10^9+7\).

Примечание

В первом примере, Фермер Джон может выстроить коров следующим образом, чтобы получить в итоге \(2\) спящих коров:

  • Корова \(1\) стоит с левой стороны и корова \(2\) стоит справа.
  • Корова \(2\) стоит с левой стороны и корова \(1\) стоит справа.

Во втором примере, Фермер Джон может выстроить коров следующим образом, чтобы получить в итоге \(1\) спящую корову:

  • Корова \(1\) стоит слева.
  • Корова \(2\) стоит слева.
  • Корова \(1\) стоит справа.
  • Корова \(2\) стоит справа.

В третьем примере, Фермер Джон может выстроить коров следующим образом, чтобы получить в итоге \(2\) спящих коров:

  • Коровы \(1\) и \(2\) стоят слева.
  • Коровы \(1\) и \(2\) стоят справа.
  • Корова \(1\) стоит слева и корова \(2\) стоит справа.
  • Корова \(1\) стоит справа и корова \(2\) стоит слева.

В четвертом примере, Фермер Джон не может получить ни одной спящей коровы, а потому не будет ни одной коровы стоящей с какой-либо стороны.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

A. cAPS lOCK

реализация Строки *1000

зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

  • либо оно полностью состоит из прописных букв;
  • либо прописными являются все его буквы, кроме первой.

В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные

В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

Выходные данные

Выведите результат обработки данного слова.

B. Противоположности притягиваются

математика реализация *1200

Всем известно, что противоположности притягиваются. Брачное агентство «Паросочетание» работает по этому признаку. Каждого зарегистрированного клиента сотрудники «Паросочетания» классифицировали по его интересам, i-ому клиенту было назначено число ti ( - 10 ≤ ti ≤ 10). Конечно, одно и то же число может быть назначено более чем одному клиенту.

В качестве рекламы «Паросочетание» хочет опубликовать количество пар противоположных клиентов, то есть таких, у которых значение параметра t противоположно. Клиент может входить в пару произвольное количество раз. Помогите агентству и напишите программу, которая по заданной последовательности t1, t2, ..., tn найдет искомое количество. Например, если t = (1,  - 1, 1,  - 1), то любые два элемента ti и tj образуют пару, если i и j имеют разную четность. Следовательно, в этом случае искомое количество равно 4.

Конечно, клиент не может образовывать пару с самим собой.

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 105) — количество зарегистрированных клиентов «Паросочетания». Вторая строка содержит последовательность целых чисел t1, t2, ..., tn ( - 10 ≤ ti ≤ 10), ti — параметр i-го клиента, присвоенный по результатам анализа его интересов.

Выходные данные

Выведите количество пар клиентов с противоположными t. Числом, противоположным для x является число  - x (0 противоположен сам себе). Пары, отличающиеся только порядком клиентов, считаются одинаковыми.

Учтите, что ответ на задачу может быть довольно большим, поэтому необходимо использовать 64-битный целый тип для вычислений. Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере пары противоположных клиентов: (1,2), (1,5) и (3,4).

Во втором примере любая пара клиентов — противоположна.

B. Двойное выбывание

дп реализация *2500

Приближается самое главное событие года — финал чемпионата мира The Innernational по игре Cota 2. В нём участвуют \(2^n\) команд, среди которых нужно определить одну лучшую.

Матчи будут проводиться по олимпийской системе до двух поражений (внимательно прочитайте условие, даже если знаете, что это такое). По итогам жеребьевки, команды получили номера от \(1\) до \(2^n\), после чего будут играть друг с другом встречи один-на-один. Все команды начинают турнир в верхней сетке.

В матчах верхней сетки в каждом раунде один раз играют пары соседних (из ещё не потерпевших поражение) команд в порядке жеребьевки. Победитель проходит дальше, а проигравший падает в нижнюю сетку.

Нижняя сетка начинается с \(2^{n-1}\) команд, проигравших первую же игру верхней сетки. Каждый раунд нижней сетки состоит из двух игр. Для каждого раунда, в первой игре раунда, \(2^k\) команд нижней сетки играют друг с другом в порядке жеребьевки. \(2^{k-1}\) проигравших выбывают с турнира, а \(2^{k-1}\) победителей играют с \(2^{k-1}\) командами, потерпевшими поражение в этом раунде верхней сетки (снова в порядке жеребьевки). По итогам каждого раунда и в верхней, и в нижней сетке остается одинаковое число участников — по \(2^{k-1}\). Смотрите на картинку для более точного понимания условия.

Когда в верхней и нижней сетках остается по одной команде, они играют между собой гранд-финал и турнир заканчивается.

Вам интересны команды, получившие по результатам жеребьевки номера \(a_1, a_2, ..., a_k\). Вам хочется увидеть как можно больше матчей, где играет хотя бы одна из интересных вам команд. Вы можете повлиять на результат любого матча так, чтобы в нем выиграла команда на ваше усмотрение. Какое максимально возможное количество матчей с участием хотя бы одной из интересных вам команд может быть сыграно в чемпионате?

Входные данные

В первой строке даны два числа \(n, k\) — размер сетки (\(2^n\) команд играют в чемпионате) и количество интересных вам команд (\(2 \le n \le 17; 0 \le k \le 2^n\)).

Во второй строке даны \(k\) различных целых чисел \(a_1, \ldots, a_k\) — номера этих команд по результатам жеребьевки (\(1 \le a_i \le 2^n\)).

Выходные данные

Выведите одно число — максимально возможное число матчей, в которых будет играть хотя бы одна интересная вам команда.

Примечание

На схеме турнира из примера каждый матч отмечен английской буквой (от \(a\) до \(n\)). Победитель каждого \(i\)-го матча обозначается \(Wi\), проигравший — \(Li\). Интересные команды выделены красным фоном.

В первом примере, интересная команда \(6\) сыграет максимальное количество матчей если в первом же матче верхней сетки (матч \(c\)) проиграет, но выиграет все остальные матчи в нижней сетке (матчи \(h, j, l, m\)) и таким образом попадёт в гранд-финал турнира.

Во втором примере, интересные команды \(7\) и \(8\) должны сыграть друг против друга в первом матче верхней сетки (матч \(d\)). После этого, команда \(8\) может дойти до гранд-финала без поражений, а команды \(1\) и \(7\) будут соревноваться в нижней сетке.

В третьем примере, правильно распределившиеся интересные команды смогут поучаствовать во всех матчах турнира.

A. Прибавить нечетное или вычесть четное

жадные алгоритмы математика реализация *800

Вам дано два положительных целых числа \(a\) и \(b\).

За один ход вы можете изменить \(a\) следующим образом:

  • Выбрать любое положительное нечетное целое число \(x\) (\(x > 0\)) и заменить \(a\) на \(a+x\);
  • выбрать любое положительное четное целое число \(y\) (\(y > 0\)) и заменить \(a\) на \(a-y\).

Вы можете применить любое количество таких операций. Вы можете использовать одинаковые значение \(x\) и \(y\) в различных ходах.

Ваша задача — найти минимальное число ходов, необходимое, чтобы получить \(b\) из \(a\). Гарантируется, что вы всегда можете получить \(b\) из \(a\).

Вам требуется ответить на \(t\) независимых наборов входных данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Затем следуют \(t\) наборов входных данных. Каждый набор представлен в виде двух целых чисел \(a\) и \(b\), разделенных пробелом (\(1 \le a, b \le 10^9\)).

Выходные данные

Для каждого набора входных данных выведите ответ на него — минимальное число ходов, необходимое, чтобы получить \(b\) из \(a\), если вы можете применить любое количество операций, описанных в условии. Гарантируется, что вы всегда можете получить \(b\) из \(a\).

Примечание

В первом наборе входных данных можно просто добавить \(1\).

Во втором наборе входных данных ничего делать не нужно.

В третьем наборе входных данных можно добавить \(1\) дважды.

В четвертом наборе входных данных можно вычесть \(4\) и добавить \(1\).

В пятом наборе входных данных можно просто вычесть \(6\).

F. Движущиеся точки

разделяй и властвуй реализация сортировки Структуры данных *1900

На координатной оси \(OX\) находятся \(n\) точек. \(i\)-я точка располагается в целочисленной координате \(x_i\) и имеет скорость \(v_i\). Гарантируется, что никакие две точки не располагаются в одной и той же координате. Все \(n\) точек двигаются с неизменной скоростью, координата \(i\)-й точки в момент времени \(t\) (\(t\) может быть нецелым) вычисляется как \(x_i + t \cdot v_i\).

Рассмотрим две точки \(i\) и \(j\). Пусть \(d(i, j)\) равно минимально возможной дистанции между этими двумя точками по всем возможным моментам времени (даже нецелым). Это значит, что если две точки \(i\) и \(j\) совпадут в какой-то момент времени, значение \(d(i, j)\) будет равно \(0\).

Ваша задача — посчитать значение \(\sum\limits_{1 \le i < j \le n}\) \(d(i, j)\) (сумму минимальных дистанций по всем парам точек).

Входные данные

Первая строка входных данных содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество точек.

Вторая строка входных данных содержит \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(1 \le x_i \le 10^8\)), где \(x_i\) равно изначальной координате \(i\)-й точки. Гарантируется, что все \(x_i\) различны.

Третья строка входных данных содержит \(n\) целых чисел \(v_1, v_2, \dots, v_n\) (\(-10^8 \le v_i \le 10^8\)), где \(v_i\) равно скорости \(i\)-й точки.

Выходные данные

Выведите одно целое число — значение \(\sum\limits_{1 \le i < j \le n}\) \(d(i, j)\) (суммы минимальных дистанций по всем парам точек).

C. Прибавление степеней

битмаски жадные алгоритмы математика реализация теория чисел Тернарный поиск *1400

Представим следующий алгоритм. Есть массив \(v_1, v_2, \dots, v_n\), изначально заполненный нулями. Несколько раз с массивом проделываются похожие операции — на \(i\)-м шаге (в \(0\)-индексации) вы можете:

  • либо выбрать любую позицию \(pos\) (\(1 \le pos \le n\)) и увеличить \(v_{pos}\) на \(k^i\);
  • либо не выбирать позицию и пропустить шаг.

Вы можете выбирать, как алгоритм ведет себя на каждом шаге и когда он будет остановлен. Вопрос в следующем: можно ли сделать массив \(v\) равным некоторому массиву \(a\) (\(v_j = a_j\) для каждого \(j\)) после некоторого шага?

Входные данные

В первой строке задано одно целое число \(T\) (\(1 \le T \le 1000\)) — количество наборов входных данных. В следующих \(2T\) строках заданы сами наборы входных данных, по две строки на каждый набор.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 30\), \(2 \le k \le 100\)) — размер массивов \(v\) и \(a\), и число \(k\), используемое в алгоритме.

Во второй строке набора входных данных заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^{16}\)) — массив, который вы хотите получить.

Выходные данные

Для каждого набора тестовых данных выведите либо YES (регистр не важен), если можно получить массив \(a\) после некоторого шага, либо NO (регистр не важен), если это невозможно.

Примечание

В первом наборе тестовых данных можно остановить алгоритм до \(0\)-го шага, или не выбирать никакую позицию и остановить алгоритм позже.

Во втором наборе можно прибавить \(k^0\) к \(v_1\) и остановить алгоритм.

В третьем наборе невозможно получить два элемента, равных \(1\), в массиве \(v\).

В пятом наборе можно пропустить \(9^0\) и \(9^1\), прибавить \(9^2\) и \(9^3\) к \(v_3\), пропустить \(9^4\) и, наконец, прибавить \(9^5\) к \(v_2\).

A. Ресторан быстрого питания

жадные алгоритмы Перебор реализация *900

Устав от скучной работы в офисе, Денис решил открыть ресторан быстрого питания.

В первый день день он приготовил \(a\) порций пельменей, \(b\) стаканов морса и \(c\) блинчиков со сгущённым молоком.

Особенностью ресторана Дениса является процедура заказа еды. Для каждого посетителя Денис сам выбирает набор блюд, который он получит. При выборе набора блюд Денис руководствуется следующими правилами:

  • каждый посетитель получит хотя бы одно блюдо (блюдами считаются пельмени, морс, блинчики со сгущёнкой);
  • каждый посетитель получит не более одной порции пельменей, не более одного стакана морса и не более одного блинчика со сгущённым молоком;
  • все посетители получат разные наборы блюд.

Какое максимальное количество посетителей сможет накормить Денис?

Входные данные

Первая строка содержит одно число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных в тесте.

Каждая из следующих \(t\) строк содержит целые числа \(a\), \(b\), \(c\) (\(0 \leq a, b, c \leq 10\)) — количество порций пельменей, стаканов морса и блинчиков со сгущённым молоком, которые приготовил Денис.

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество посетителей, которых сможет накормить Денис.

Примечание

В первом наборе входных данных примера Денис может накормить первого посетителя пельменями, второму посетителю дать стакан морса, а третьему посетителю дать стакан морса и блинчик со сгущёнкой.

Во втором наборе входных данных примера ресторан Дениса не очень перспективен: он не сможет обслужить ни одного клиента.

В третьем наборе входных данных примера Денис сможет обслужить четырёх гостей. Первый гость получит полноценный обед из порции пельменей, стакана морса и блинчика со сгущёнкой. Второй посетитель пообедает пельменями. Третий гость получит блинчик со сгущёнкой, а четвёртый гость получит блинчик и порцию пельменей. Обратите внимание, что Денис использует не все приготовленные продукты, однако не сможет принять больше посетителей.

B. Альтернативные правила

жадные алгоритмы Конструктив математика реализация *1700

Николай только недавно начал заниматься олимпиадным программированием, но уже смог пройти в финал престижной олимпиады. Всего в финале будет \(n\) участников, один из которых Николай. Как и любая хорошая олимпиада, она состоит из двух туров. Уставшие от традиционных правил, в которых участник, решивший наибольшее число задач, побеждает, организаторы придумали альтернативные правила.

Пусть по результатам первого тура участник А занял место \(x\), а по результатам второго — \(y\). Тогда суммарным баллом участника А считается сумма \(x + y\). Итоговое место А определяется как количество участников (включая А), у которых суммарный балл не превосходит суммарный балл А. Обратите внимание, что таким образом некоторые участники могут делить места между собой. Также важно заметить, что и в первом, и во втором туре никакие два участника не поделили место, таким образом для каждого \(i\) от \(1\) до \(n\) ровно один участник занял \(i\)-е место в первом и ровно один участник занял \(i\)-е место во втором туре.

По окончании олимпиады Николаю сообщили, что он занял \(x\)-е место в первом туре, \(y\)-е место во втором. Результаты других участников ему неизвестны. В ожидании результатов олимпиады Николай заинтересовался, какое минимальное и максимальное место он может занять, если рассмотреть самый благоприятный для него результат других участников и самый неблагоприятный. Помогите Николаю найти ответ на этот вопрос.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество тестовых случаев, которое надо решить.

Каждая из следующих \(t\) строк содержит целые числа \(n\), \(x\), \(y\) (\(1 \leq n \leq 10^9\), \(1 \le x, y \le n\)) — число участников олимпиады, место занятое Николаем в первом туре, место занятое Николаев во втором туре.

Выходные данные

Для каждого тестового случая выведите два целых числа — минимальное и максимальное итоговое место, которое может занять Николай.

Примечание

Пояснение к первому тесту:

Пусть было 5 участников A-E. Николая обозначим за А. Тогда наиболее благоприятные для Николая результаты олимпиады могли выглядеть так:

Однако результаты олимпиады могли выглядеть и так:

В первом случае Николай занял бы первое место, во втором — третье.

D. Новый год

битмаски дп реализация *2500

Быть дедом Морозом очень сложно. Порой приходится сталкиваться с непростыми ситуациями.

Сегодня дед Мороз пришел на праздник и перед ним выстроились \(m\) детей. Пронумеруем их от \(1\) до \(m\). Дед Мороз знает \(n\) заклинаний. Заклинание под номером \(i\) даёт по конфете каждому ребенку, чье место лежит в отрезке \([L_i, R_i]\). Каждое заклинание может быть использовано не более одного раза. Также известно, что если применить все заклинания, то каждый ребёнок получит не более \(k\) конфет.

Детям вредно есть много сладкого, поэтому каждый ребёнок может съесть не более одной конфеты, а остальное отдаст маме и папе в равном количестве. Получается, если конфет малышу не подарить или подарить ему чётное число конфет, то он не съест ни одной конфеты и уйдет печальным. Остальные же дети (которые получили нечётное число конфет) будут счастливыми.

Помогите деду Морозу узнать максимальное число детей, которых он может сделать счастливыми, произнеся некоторые из своих заклинаний.

Входные данные

В первой строке заданы три целых числа \(n\), \(m\), и \(k\) (\(1 \leq n \leq 100\,000, 1 \leq m \leq 10^9, 1 \leq k \leq 8\)) — число заклинаний, количество детей и верхнее ограничение количество конфет, которые может получить ребёнок в случае использования всех заклинаний, соответственно.

Далее следуют \(n\) строк, в каждой из которых заданы два целых числа \(L_i\), \(R_i\) (\(1 \leq L_i \leq R_i \leq m\)) — параметры \(i\)-го заклинания.

Выходные данные

Выведите одно число — максимальное число детей, которых дед Мороз может сделать счастливыми.

Примечание

В первом примере деду Морозу следует применить первое и третье заклинание. В таком случае счастливыми окажутся все дети кроме третьего.

A. Битый пиксель

реализация *800

Разрешение монитора у Поликарпа составляет \(a \times b\) пикселей. Одна беда — на экране есть ровно один битый пиксель. Его координаты составляют \((x, y)\) (\(0 \le x < a, 0 \le y < b\)). Считайте, что все столбцы из пикселей пронумерованы от \(0\) до \(a-1\), а все строки — от \(0\) до \(b-1\).

Поликарп хочет открыть прямоугольное окно максимального размера, которое не содержит битый пиксель. Стороны окна должны быть параллельны сторонам экрана монитора.

Выведите какую максимальную площадь (в пикселях) может иметь окно на экране Поликарпа, которое не содержит битый пиксель.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных, по одному в строке.

Каждый набор входных данных состоит из строки, содержащей \(4\) целых числа \(a, b, x\) и \(y\) (\(1 \le a, b \le 10^4\), \(0 \le x < a\), \(0 \le y < b\)) — разрешение экрана и координаты битого пикселя. Гарантируется, что \(a+b>2\) (то есть случай \(a=b=1\) — невозможен).

Выходные данные

Выведите \(t\) целых чисел — ответы на заданные наборы входных данных. Каждый ответ — это максимальная возможная площадь (в пикселях) прямоугольного окна, которое не содержит битый пиксель. Стороны окна должны быть параллельны сторонам экрана монитора.

Примечание

В первом наборе входных данных примера экран монитора имеет разрешение \(8 \times 8\) и левый верхний пиксель экрана — битый. Ниже приведён один из двух способов открыть максимальное по площади окно.

A. Распределение баллов

реализация *800

\(n\) учеников пишут экзамен. Максимальный возможный балл за этот экзамен  — \(m\). Пусть \(a_{i}\)  — оценка \(i\)-го ученика. У вас есть доступ к школьной базе данных, в которой хранятся оценки всех учеников.

Вы можете изменить оценку каждого ученика таким образом, чтобы выполнялись следующие условия:

  • Все оценки  — целые числа
  • \(0 \leq a_{i} \leq m\)
  • Средняя оценка в классе остается такой же.

Вы ученик \(1\), и хотели бы максимизировать свою оценку.

Какую наибольшую оценку вы можете себе присвоить, чтобы все условия выполнялись?

Входные данные

Каждый тест содержит несколько наборов входных данных.

Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 200\)). Далее следуют описания наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 10^{3}\), \(1 \leq m \leq 10^{5}\))  — количества студентов и максимальный возможный балл соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\( 0 \leq a_{i} \leq m\))  — оценки студентов.

Выходные данные

Для каждого наборов входных данных, выведите наибольшую возможную оценку, которую вы можете себе присвоить, чтобы все условия выполнялись.

Примечание

В первом наборе входных данных примера, \(a = [1,2,3,4] \), с средней оценкой \(2.5\). Вы можете изменить массив \(a\) на \([10,0,0,0]\). Средняя оценка остается равной \(2.5\), и все условия выполнены.

Во втором наборе входных данных примера, \(0 \leq a_{i} \leq 5\). Вы можете изменить \(a\) на \([5,1,1,3]\). Вы не можете сделать \(a_{1}\) еще больше, так как это нарушит условие \(0\le a_i\le m\).

B. Преобразование строки

Конструктив Перебор реализация сортировки Строки *1400

У Васи есть строка \(s\) длины \(n\). Он решает применить к ней следующее преобразование:

  1. Выберите целое \(k\), (\(1 \leq k \leq n\)).
  2. Для \(i\) от \(1\) до \(n-k+1\), переверните подстроку \(s[i:i+k-1]\) строки \(s\). К примеру, если строка \(s\) равна qwer и \(k = 2\), то строка пройдет следующую последовательность изменений:
    • qwer (начальная строка)
    • wqer (после переворачивания первой подстроки длины \(2\))
    • weqr (после переворачивания второй подстроки длины \(2\))
    • werq (после переворачивания последней подстроки длины \(2\))
    Следовательно, получившаяся строка после преобразования \(s\) с \(k = 2\) равна werq.

Вася хочет выбрать такое \(k\), чтобы строка, полученная в результате преобразования, была лексикографически минимальной возможной среди всех выборов \(k\). Среди всех таких \(k\) он хочет выбрать наименьшее. Так как он занят посещением Felicity 2020, он просит вашей помощи.

Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов:

  • \(a\) — префикс \(b\), но \(a \ne b\);
  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Входные данные

Каждый тест содержит несколько наборов входных данных.

Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 5000\)). Далее следуют описания наборов входных данных.

Вторая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 5000\)) — длину строки \(s\).

Третья строка каждого набора входных данных содержит строку \(s\) из \(n\) строчных букв латинского алфавита.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5000\).

Выходные данные

Для каждого набора входных данных выведите две строки:

В первой строке выведите лексикографически минимально возможную строку \(s'\), получающуюся как результат преобразования.

Во второй строке выведите подходящее значение \(k\) (\(1 \leq k \leq n\)), которое вы выбрали для преобрразования. Если несколько значений \(k\) дают лексикографически минимальную строку, выведите минимальное \(k\) среди них.

Примечание

В первом наборе тестовых данных примера, преобразование строки abab даст следующие результаты:

  • для \(k = 1\) : abab
  • для \(k = 2\) : baba
  • для \(k = 3\) : abab
  • для \(k = 4\) : baba

    Лексикографически наименьшая строка, которую можно получить  — это abab для \(k = 1\) и \(3\). Следовательно, наименьшее значение \(k\) равно \(1\).

D. Матрица Нэша

графы Конструктив поиск в глубину и подобное реализация *2000

Нэш придумал интересную, но простую игру, где игрок просто должен выполнять инструкции, написанные на клетке, где игрок сейчас стоит.

В эту игру играют на доске \(n\times n\). Строки и столбцы этой доски пронумерованны от \(1\) до \(n\). Клетку на пересечении \(r\)-й строки и \(c\)-го столбца будем обозначать, как \((r, c)\).

Некоторые клетки этой доски называются заблокированными зонами. На каждой клетке доски написан один из следующих \(5\) символов  — \(U\), \(D\), \(L\), \(R\) или \(X\)  — инструкции для игрока. Пусть текущая клетка  — \((r, c)\). Если символ в клетке \(R\), игрок должен переместиться в клетку справа, \((r, c+1)\), для \(L\) игрок должен переместиться в клетку слева, \((r, c-1)\), для \(U\) игрок должен переместиться в клетку выше, \((r-1, c)\), для \(D\) игрок должен переместиться в клетку ниже, \((r+1, c)\). Если же символ в клетке равен \(X\), то эта клетка является заблокированной зоной. Игрок должен оставаться в этой клетке (и с этого момента игра для него не слишком интересна).

Гарантируется, что символы записаны таким образом, что игрок никогда не будет вынужден сойти с доски, в какой бы клетке он не начал.

Когда игрок начинает в какой-то клетке, он должен двигаться в соответствии с символом в текущей клетке. Игрок двигается до тех пор, пока он не попадет в заблокированную зону. Может оказаться так, что игрок будет двигаться бесконечно долго.

Для каждой из \(n^2\) клеток таблицы Алиса, ваш друг, хотела бы узнать, как пройдет игра, если игрок начнет в этой клетке. Для каждой стартовой клетки доски, она запишет клетку, в которой игрок остановится, или то, что игрок никогда не остановится. Она предоставила вам эту информацию: для каждой клетки \((r, c)\) она написала:

  • пару (\(x\),\(y\)), значащую, что если игрок начинает в клетке \((r, c)\), то он остановится в клетке (\(x\),\(y\)).
  • или пару (\(-1\),\(-1\)), значащую, что если игрок начинает в клетке \((r, c)\), он будет двигаться бесконечно долго, и никогда не попадет в заблокированную зону.

Возможно, Алиса хочет вас обмануть, и не существует доски, которая удовлетворяет всей информации, которую она вам предоставила. Для данной информации, восстановите подходящую доску, или определите, что ее не существует. Если существует несколько подходящих досок, вы можете найти любую из них. 

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^{3}\))  — сторону доски.

\(i\)-я из последующих \(n\) строк содержит \(2n\) чисел \(x_1, y_1, x_2, y_2, \dots, x_n, y_n\), где \((x_j, y_j)\) (\(1 \leq x_j \leq n, 1 \leq y_j \leq n\), или \((x_j,y_j)=(-1,-1)\))  — пара, записанная Алисой для клетки \((i, j)\).

Выходные данные

Если не существует доски, удовлетворяющей информации, которую вам дала Алиса, выведите INVALID.

Иначе, выведите VALID. В \(i\)-й из следующих \(n\) строк, выведите строку из \(n\) символов, соответствующих \(i\)-й строке найденной вами подходящей доски. Каждый символ должен быть равен \(U\), \(D\), \(L\), \(R\) или \(X\). Если существует несколько подходящих досок, вы можете найти любую из них. 

Примечание

В первом примере:

Доска с вывода подходит.

  • Если игрок начинает в \((1,1)\), он не будет двигаться, следуя \(X\), и останется там.
  • Если игрок начинает в \((1,2)\), он пойдет влево, следуя \(L\), и остановится в \((1,1)\).
  • Если игрок начинает в \((2,1)\), он пойдет вправо, следуя \(R\), и остановится в \((2,2)\).
  • Если игрок начинает в \((2,2)\), он не будет двигаться, следуя \(X\), и останется там.

Ходы игрока для разных клеток изображены на картинке ниже:

Во втором примере:

Доска с вывода подходит, так как игрок, начавший с клетки, отличной от центральной клетки \((2,2)\), будет двигаться по циклу и никогда не остановится. Если бы он начал в \((2,2)\), он бы там и остался, следуя инструкции \(X\) .

Ходы игрока для разных клеток изображены на картинке ниже:

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

A. Лента Тьюринга

реализация *1300

INTERCAL — самый старый эзотерический язык программирования. Одна из его многих странностей — метод символьного вывода, известный как лента Тьюринга. Он преобразует массив беззнаковых 8-битных целых чисел в последовательность символов по следующему алгоритму.

Числа массива обрабатываются по одному, начиная с первого. Обработка i-ого числа состоит из трех шагов:

1. 8-битная двоичная запись ASCII-кода предыдущего напечатанного символа отображается зеркально. При обработке первого числа массива результат этого шага считается равным нулю.

2. Из результата предыдущего шага вычитается i-ое число массива по модулю 256.

3. Двоичная запись результата предыдущего шага отображается зеркально, чтобы получить ASCII-код очередного (i-ого) символа для печати.

Дан текст, напечатанный этим способом. Восстановите оригинальный массив.

Входные данные

В единственной строке входных данных задана строка text — сообщение, напечатанное описанным способом. Строка text содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 32 (пробел) до 126 (тильда), включительно.

Выходные данные

Выведите исходный массив, который использовался для печати text, по одному элементу на строку.

Примечание

Рассмотрим начало примера. Первый символ — «H», ASCII-код 72 = 010010002. Его зеркальное отображение 000100102 = 18, и это число должно стать результатом второго шага обработки. Результатом первого шага обработки считается 0, поэтому первое число массива должно быть равно (0 - 18) mod 256 = 238, где a mod b — остаток от деления a на b.

B. Piet

реализация *2100

Piet — один из самых известных визуальных эзотерических языков программирования. Программы на нем составляются из разноцветных блоков пикселей и интерпретируются по довольно сложным правилам. В этой задаче мы рассмотрим подмножество языка Piet с упрощенными правилами.

Программа будет прямоугольным изображением, состоящим из цветных и черных пикселей. Цвет каждого пикселя будет задаваться целым числом от 0 до 9. Цвет 0 соответствует черному цвету. Блок пикселей определяется как прямоугольник, состоящий из пикселей одного цвета (не черного). Гарантируется, что все связные множества цветных пикселей будут образовывать прямоугольные блоки. Группы черных пикселей могут иметь произвольную форму.

В процессе интерпретации программы по ней двигается счетчик инструкций, состоящий из трех частей:

  • указателя на текущий блок (англ. block pointer, далее BP); текущий пиксель в блоке не выделяется;
  • указателя направления (англ. direction pointer, далее DP), который может указывать вверх, вниз, влево и вправо;
  • указателя выбора блоков (англ. block chooser, далее CP), который может указывать влево или вправо относительно DP (в абсолютных направлениях — отличаться от DP на 90 градусов против или по часовой стрелке, соответственно).

Изначально BP указывает на блок, которому принадлежит верхний левый пиксель программы, DP указывает вправо, а CP — влево относительно DP (см. оранжевый квадрат на рисунке ниже).

Один шаг изменения состояния счетчика происходит следующим образом. Для текущего блока находится его край в направлении DP. Из всех пикселей края выбирается крайний в направлении CP. Затем BP пытается переместиться из этого пикселя в соседний в направлении DP. Если соседний пиксель принадлежит цветному блоку (цвета, отличного от 0), этот блок становится текущим, а два других указателя сохраняют свои значения. Если же соседний пиксель имеет черный цвет (0) или находится за пределами программы, текущий блок остается прежним, а меняются направления двух других указателей следующим образом. Если CP указывал влево, теперь он указывает вправо, а DP не меняется. Если CP указывал вправо, то теперь он указывает влево, а DP поворачивается на 90 градусов по часовой стрелке.

Таким образом, текущий блок никогда не будет черного цвета. Гарантируется, что верхний левый блок программы не будет черным.

Вам дана программа на Piet. Определите, какой блок программы будет текущим через n шагов.

Входные данные

В первой строке входных данных содержится два целых числа m (1 ≤ m ≤ 50) и n (1 ≤ n ≤ 5·107). Следующие m строк содержат строки программы. Все строки программы имеют одинаковую длину от 1 до 50 и состоят из символов 0-9. Первый символ первой строки будет не равен 0.

Выходные данные

Выведите цвет блока, который будет текущим через n шагов интерпретации программы.

Примечание

В первом примере счетчик инструкций изменяется следующим образом. После первого шага блок 2 становится текущим блоком и остается им еще два шага. После шага 4 текущим становится блок 3, после шага 7 — блок 4, и, наконец, после шага 10 указатель текущего блока возвращается в блок 1.

Последовательность состояний счетчика инструкций изображена на рисунке: стрелки обходятся по часовой стрелке, основная стрелка соответствует DP, боковая — CP.

A. Задача о подмножестве чётной суммы

дп жадные алгоритмы Перебор реализация *800

Дан массив \(a\), состоящий из \(n\) положительных целых чисел. Найдите непустое подмножество его элементов с чётной (т.е. делящейся на \(2\)) суммой или определите, что такого подмножества нет.

И заданный массив и искомое подмножетсво могут содержать равные значения элементов.

Входные данные

В первой строке задано целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных, для которых требуется решить задачу. Затем следуют описания \(t\) наборов входных данных.

Описание каждого набора входных данных состоит из двух строк. В первой строке задано одно целое число \(n\) (\(1 \leq n \leq 100\)) — количество элементов в массиве \(a\). Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 100\)) — элементы массива \(a\). Массив \(a\) может содержать одинаковые (равные) значения элементов.

Выходные данные

Для каждого набора входных данных выведите \(-1\), если не существует требуемого подмножества элементов. Иначе выведите целое число \(k\) — количество элементов в подмножестве. Затем выведите \(k\) различных чисел (\(1 \leq p_i \leq n\)) — индексы элементов найденного подмножества. Если есть несколько подходящих подмножеств, выведите любое из них.

Примечание

В примере описан тест, состоящий их трёх наборов входных данных.

В первом наборе входных данных можно выбрать подмножество, состоящее из второго элемента массива. Сумма в этом подмножестве равна \(4\), то есть чётна.

Во втором наборе входных данных существует только одно непустое подмножество элементов массива, состоящее из первого элемента. В этом подмножестве сумма нечётна, таким образом ответа не существует.

В третьем наборе входных данных подмножество, состоящее из всех элементов массива, имеет чётную сумму.

B. Посчитай подпрямоугольники

Бинарный поиск жадные алгоритмы реализация *1500

Дан массив \(a\) длины \(n\) и массив \(b\) длины \(m\), оба состоящие из чисел \(0\) и \(1\). Рассмотрим матрицу \(c\) размера \(n \times m\), построенную по следующему правилу: \(c_{i, j} = a_i \cdot b_j\) (то есть \(a_i\), умноженное на \(b_j\)). Несложно заметить, что \(c\) также состоит только из нулей и единиц.

Сколько подпрямоугольников размера \(k\), состоящих только из единиц, есть в \(c\)?

Подпрямоугольник — это пересечение непрерывного подотрезка строк и непрерывного подотрезка столбцов матрицы. Рассмотрим четыре числа \(x_1, x_2, y_1, y_2\) (\(1 \le x_1 \le x_2 \le n\), \(1 \le y_1 \le y_2 \le m\)), тогда подпрямоугольник \(c[x_1 \dots x_2][y_1 \dots y_2]\) — это пересечение строк \(x_1, x_1+1, x_1+2, \dots, x_2\) и столбцов \(y_1, y_1+1, y_1+2, \dots, y_2\).

Размер (площадь) подпрямоугольника — это количество элементов матрицы в нём.

Входные данные

В первой строке содержатся три целых числа \(n\), \(m\) и \(k\) (\(1 \leq n, m \leq 40\,000, 1 \leq k \leq n \cdot m\)) — длина массива \(a\), длина массива \(b\) и требуемый размер подпрямоугольников.

Во второй строке содержатся \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 1\)) — элементы массива \(a\).

В третьей строке содержатся \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) (\(0 \leq b_i \leq 1\)) — элементы массива \(b\).

Выходные данные

Выведите одно целое число — количество подпрямоугольников в \(c\) размера \(k\), состоящих только из единиц.

Примечание

В первом примере матрица \(c\) такова:

В ней есть \(4\) подпрямоугольника размера \(2\), состоящих только из единиц:

Во втором примере матрица \(c\) такова:

A. Очередная задача про тетрис

реализация теория чисел *900

Вам задано поле Тетриса, состоящее из \(n\) столбцов. Начальная высота \(i\)-го столбца поля равна \(a_i\) блоков. Сверху на столбцы вы можете ставить только фигуры размера \(2 \times 1\) (то есть высоты \(2\) блока и ширины \(1\) блок). Заметьте, что вы не можете поворачивать эти фигуры.

Ваша задача — определить, возможно ли очистить заданное поле, используя только описанные фигуры.

Более формально, задачу можно описать следующим образом:

Пока хотя бы одно из \(a_i\) больше \(0\), происходит следующий процесс:

  1. Вы ставите одну фигуру \(2 \times 1\) (выбираете какое-то \(i\) от \(1\) до \(n\) и заменяете \(a_i\) на \(a_i + 2\));
  2. затем, пока все \(a_i\) больше нуля, каждое \(a_i\) заменяется на \(a_i - 1\).

Ваша задача — определить, возможно ли очистить заданное поле (т.е. завершить описанный процесс), выбирая места для новых фигур правильным образом.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов тестовых данных.

Следующие \(2t\) строк описывают наборы тестовых данных. Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество столбцов на поле тетриса. Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)), где \(a_i\) равно начальной высоте \(i\)-го столбца поля тетриса.

Выходные данные

Для каждого набора тестовых данных выведите ответ — «YES» (без кавычек), если вы можете очистить поле тетриса полностью, и «NO» в противном случае.

Примечание

Первый набор тестовых данных из примера показан ниже:

Серые линии означают границы поля Тетриса. Заметьте, что поле не имеет верхней границы.

Одним из корректных ответов является сначала поставить фигуру в первый столбец. Затем, после второго шага процесса, поле станет равно \([2, 0, 2]\). Затем надо поставить фигуру во второй столбец и после второго шага процесса поле станет равно \([0, 0, 0]\).

И второй набор тестовых данных из примера показан ниже:

Можно показать, что вы не можете сделать ничего, чтобы закончить процесс.

В третьем наборе тестовых данных из примера можно сначала поставить фигуру во второй столбец и после второго шага процесса поле станет равно \([0, 2]\). Затем можно поставить фигуру в первый столбец и после второго шага процесса поле станет равно \([0, 0]\).

В четвертом наборе тестовых данных из примера можно поставить фигуру в первый столбец, тогда после первого шага процесса поле станет равно \([102]\), и затем после второго шага процесса поле станет равно \([0]\).

C. Прыгающая лягушка

Бинарный поиск жадные алгоритмы поиск в глубину и подобное реализация Структуры данных *1100

Слева от строки \(s = s_1 s_2 \ldots s_n\), состоящей из \(n\) символов, находится лягушка (точнее, изначально лягушка находится в клетке \(0\)). Каждый символ строки \(s\) — это или 'L', или 'R'. Это значит, что если лягушка находится в \(i\)-й клетке и \(i\)-й символ — это 'L', то она может прыгать только влево. Если лягушка стоит в \(i\)-й клетке и \(i\)-й символ — это 'R', то она может прыгать только вправо. Из клетки \(0\) лягушка может прыгать только вправо.

Заметим, что лягушка может прыгать в одну и ту же клетку дважды и может совершить столько прыжков, сколько ей потребуется.

Лягушка хочет достичь \(n+1\)-й клетки. Лягушка выбирает некоторое целое положительное значение \(d\) перед самым первым прыжком (и потом не может изменить его) и прыгает не более, чем на \(d\) клеток за раз. То есть, если \(i\)-й символ — 'L', то лягушка может прыгнуть в любую клетку из отрезка \([max(0, i - d); i - 1]\), а если \(i\)-й символ — 'R', то лягушка может прыгнуть в любую клетку из отрезка \([i + 1; min(n + 1; i + d)]\).

Лягушка не хочет прыгать слишком далеко, поэтому ваша задача — найти минимальное возможное значение \(d\), при котором лягушка сможет достичь клетки \(n+1\) из клетки \(0\), если будет прыгать не более, чем на \(d\) клеток за раз. Гарантируется, что всегда возможно достичь \(n+1\) из \(0\).

Вам нужно ответить на \(t\) независимых наборов входных данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Следующие \(t\) строк описывают наборы входных данных. \(i\)-й описан строкой \(s\) состоящей из не менее, чем \(1\), и не более, чем \(2 \cdot 10^5\) символов 'L' и 'R'.

Гарантируется, что сумма длин строк по всем наборам входных данных не превосходит \(2 \cdot 10^5\) (\(\sum |s| \le 2 \cdot 10^5\)).

Выходные данные

Для каждого набора входных данных выведите ответ — минимальное возможное значение \(d\), при котором лягушка может достичь клетки \(n+1\) из клетки \(0\), если будет совершать прыжки длиной не более, чем \(d\).

Примечание

Картинка, описывающая первый набор тестовых данных из примера и один из возможных ответов:

Во втором наборе тестовых данных из примера лягушка может прыгнуть только напрямую из \(0\) в \(n+1\).

В третьем наборе тестовых данных лягушка может выбрать \(d=3\), прыгнуть в клетку \(3\) из клетки \(0\) и затем прыгнуть в клетку \(4\) из клетки \(3\).

В четвертом наборе тестовых данных из примера лягушка может выбрать \(d=1\) и прыгнуть \(5\) раз вправо.

В пятом наборе тестовых данных из примера лягушка может прыгнуть только напрямую из \(0\) в \(n+1\).

В шестом наборе тестовых данных из примера лягушка может выбрать \(d=1\) и прыгнуть \(2\) раза вправо.

E. Режим сна

дп реализация *1700

У Вовы довольно странный режим сна. В сутках \(h\) часов. Вова будет спать ровно \(n\) раз. В \(i\)-й раз он будет спать ровно после \(a_i\) часов после пробуждения. Предположим, что Вова просыпается ровно в начале этой истории (изначальное время равно \(0\)). Каждый раз Вова спит ровно сутки (другими словами, \(h\) часов).

Вова думает, что \(i\)-й раз, когда он спит, — хороший, если он идет спать между \(l\) и \(r\) часами включительно.

Вова может контролировать себя и перед \(i\)-м разом он может выбрать одно из двух: пойти спать после \(a_i\) часов или после \(a_i - 1\) часов.

Ваша задача — назвать максимальное число хороших раз, которые Вова может получить, если будет действовать оптимально.

Входные данные

Первая строка теста содержит четыре целых числа \(n, h, l\) и \(r\) (\(1 \le n \le 2000, 3 \le h \le 2000, 0 \le l \le r < h\)) — количество раз, которое Вова будет спать, количество часов в сутках и отрезок хорошего времени для сна.

Вторая строка теста содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i < h\)), где \(a_i\) — количество часов, после которого Вова пойдет спать в \(i\)-й раз.

Выходные данные

Выведите одно целое число — максимальное количество хороших раз, которое Вова может получить, если будет действовать оптимально.

Примечание

Максимальное количество хороших раз в тестовом примере равно \(3\).

История начинается с \(t=0\). Затем Вова идет спать после \(a_1 - 1\) часов, теперь время равно \(15\). Это время не является хорошим. Затем Вова идет спать после \(a_2 - 1\) часов, теперь время равно \(15 + 16 = 7\). Это время также не является хорошим. Затем Вова идет спать после \(a_3\) часов, теперь время равно \(7 + 14 = 21\). Это время является хорошим. Затем Вова идет спать после \(a_4 - 1\) часов, теперь время равно \(21 + 19 = 16\). Это время не является хорошим. Затем Вова идет спать после \(a_5\) часов, теперь время равно \(16 + 20 = 12\). Это время не является хорошим. Затем Вова идет спать после \(a_6\) часов, Теперь время равно \(12 + 11 = 23\). Это время является хорошим. Затем Вова идет спать после \(a_7\) часов, теперь время равно \(23 + 22 = 21\). Это время также является хорошим.

B. КопияКопияКопияКопияКопия

жадные алгоритмы реализация *800

У Ехаба есть массив \(a\) длины \(n\). У него достаточно свободного времени, чтобы создать новый массив, состоящий из \(n\) копий старого массива, записанных последовательно. Чему равна длина самой длинной возрастающей подпоследовательности нового массива?

Последовательность \(a\) является подпоследовательностью массива \(b\), если \(a\) можно получить из \(b\), удалив несколько (возможно, ноль или все) элементов. Самая длинная возрастающая подпоследовательность массива это самая длинная подпоследовательность, все элементы которой упорядочены в строго возрастающем порядке.

Входные данные

Первая строка содержит целое число \(t\)   — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\))   — количество элементов в массиве \(a\).

Вторая строка содержит \(n\) целых чисел, разделенных пробелом \(a_1\), \(a_2\), \(\ldots\), \(a_{n}\) (\(1 \le a_i \le 10^9\))   — элементы массив \(a\).

Сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных, выведите длину самой длинной возрастающей подпоследовательности \(a\), если вы объедините ее с собой \(n\) раз.

Примечание

В первом наборе входных данных примера, новый массив равен \([3,2,\textbf{1},3,\textbf{2},1,\textbf{3},2,1]\). Самая длинная возрастающая подпоследовательность в нем выделена жирным.

Во втором наборе входных данных примера, самая длинная возрастающая подпоследовательность равна \([1,3,4,5,9]\).

B. Максимумы

математика реализация *900

У Алисии есть массив неотрицательных целых чисел \(a_1, a_2, \ldots, a_n\). Для всех \(1 \leq i \leq n\), она нашла число \(x_i = max(0, a_1, \ldots, a_{i-1})\). Обратите внимание, что для \(i=1\), \(x_i = 0\).

Например, если у Алисии был массив \(a = \{0, 1, 2, 0, 3\}\), то \(x = \{0, 0, 1, 2, 2\}\).

Затем она вычислила значения массива \(b_1, b_2, \ldots, b_n\): \(b_i = a_i - x_i\).

Например, если у Алисии был массив \(a = \{0, 1, 2, 0, 3\}\), то \(b = \{0-0, 1-0, 2-1, 0-2, 3-2\} = \{0, 1, 1, -2, 1\}\).

Алисия дала вам массив \(b_1, b_2, \ldots, b_n\) и попросила восстановить массив \(a_1, a_2, \ldots, a_n\). Можете ли вы помочь ей с этой задачей?

Входные данные

В первой строке записано одно целое число \(n\) (\(3 \leq n \leq 200\,000\)) — количество элементов в массиве Алисии.

Во второй строке записаны \(n\) целых чисел, \(b_1, b_2, \ldots, b_n\) (\(-10^9 \leq b_i \leq 10^9\)).

Гарантируется, что для заданного массива \(b\) существует решение \(a_1, a_2, \ldots, a_n\), для всех элементов которого верно: \(0 \leq a_i \leq 10^9\).

Выходные данные

Выведите \(n\) целых чисел, \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^9\)), таких, что если вы посчитаете \(x\) согласно условию, \(b_1\) будет равно \(a_1 - x_1\), \(b_2\) будет равно \(a_2 - x_2\), ..., и \(b_n\) будет равно \(a_n - x_n\).

Гарантируется, что на всех данных тестах есть хотя бы одно решение. Можно показать, что в таком случае решение единственно.

Примечание

Первый тест разобран в условии задачи.

Во втором тесте, если у Алисии был массив \(a = \{1000, 1000000000, 0\}\), то \(x = \{0, 1000, 1000000000\}\) и \(b = \{1000-0, 1000000000-1000, 0-1000000000\} = \{1000, 999999000, -1000000000\}\).

C. Игра с фишками

Конструктив реализация *1600

У Пети есть прямоугольная доска размера \(n \times m\). Изначально на доске размещено \(k\) фишек, \(i\)-я из них находится в клетке, на пересечении \(sx_i\)-й строки и \(sy_i\)-го столбца.

За одно действие Петя может сдвинуть все фишки влево, вправо, вниз или вверх на \(1\) ячейку.

Если фишка была в клетке \((x, y)\), то после операции:

  • влево, ее координаты будут \((x, y - 1)\);
  • вправо, ее координаты будут \((x, y + 1)\);
  • вниз, ее координаты будут \((x + 1, y)\);
  • вверх, ее координаты будут \((x - 1, y)\).

Если фишка находится у стенки доски, и действие, выбранное Петей, двигает ее в направлении стены, то фишка остается на своей текущей позиции.

Обратите внимание, что несколько фишек могут располагаться в одной и той же клетке.

Для каждой фишки Петя выбрал позицию, в которой она должна побывать. Обратите внимание, что фишка не обязательно заканчивает в этой позиции.

Так как у Пети не очень много свободного времени, он готов сделать не более \(2nm\) действий, описанных выше.

Вам предстоит выяснить, какие действия должен делать Петя, чтобы все фишки побывали хотя бы раз в выбранных для них клетках. Или определить, что за \(2nm\) действий выполнить это невозможно.

Входные данные

Первая строка содержит три целых числа \(n, m, k\) (\(1 \le n, m, k \le 200\)) — количество строк и столбцов доски и количество фишек соответственно.

Следующие \(k\) содержат по два целых чисел \(sx_i, sy_i\) (\( 1 \le sx_i \le n, 1 \le sy_i \le m\)) — начальная позиция \(i\)-й фишки.

Следующие \(k\) содержат по два целых чисел \(fx_i, fy_i\) (\( 1 \le fx_i \le n, 1 \le fy_i \le m\)) — позиция, которую должна посетить \(i\)-я фишка хотя бы раз.

Выходные данные

В первой строке выведите количество операций, чтобы каждая фишка посетила хотя бы раз позицию, которую выбрал для нее Петя.

Во второй строке выведите последовательность операций. Для обозначения операций влево, вправо, вниз, вверх используйте символы \(L, R, D, U\) соответственно.

Если искомой последовательности не существует, в единственной строке выведите -1.

B. K-я красивая строка

Бинарный поиск Комбинаторика математика Перебор реализация *1300

Для заданного целого числа \(n\) (\(n > 2\)) выпишем все строки длины \(n\), которые содержат в себе \(n-2\) буквы 'a' и две буквы 'b', в лексикографическом (алфавитном) порядке.

Напомним, что строка \(s\) длины \(n\) лексикографически меньше строки \(t\) длины \(n\), если существует такое \(i\) (\(1 \le i \le n\)), что \(s_i < t_i\), а для всех \(j\) (\(1 \le j < i\)) \(s_j = t_j\). Лексикографическое сравнение строк реализовано при помощи оператора < в современных языках программирования.

Например, если \(n=5\), то получатся следующие строки (их порядок важен):

  1. aaabb
  2. aabab
  3. aabba
  4. abaab
  5. ababa
  6. abbaa
  7. baaab
  8. baaba
  9. babaa
  10. bbaaa

Легко показать, что такой список строк будет содержать ровно \(\frac{n \cdot (n-1)}{2}\) строк.

Вам задано \(n\) (\(n > 2\)) и \(k\) (\(1 \le k \le \frac{n \cdot (n-1)}{2}\)). Выведите \(k\)-ю строку из списка.

Входные данные

Входные данные содержат один или несколько наборов тестовых данных.

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов тестовых данных в тесте. Затем следуют \(t\) наборов тестовых данных.

Каждый набор тестовых данных содержится на отдельной строке, содержащей два целых числа \(n\) и \(k\) (\(3 \le n \le 10^5, 1 \le k \le \min(2\cdot10^9, \frac{n \cdot (n-1)}{2})\).

Сумма значений \(n\) по всем наборам тестовых данных не превосходит \(10^5\).

Выходные данные

Для каждого набора тестовых данных выведите \(k\)-ю строку из списка всех описанных выше строк длины \(n\). Строки в списке отсортированы лексикографически (в алфавитном порядке).

C. Троичный XOR

жадные алгоритмы реализация *1200

Число называется троичным, если оно содержит только цифры \(0\), \(1\) и \(2\). Например, следующие числа являются троичными: \(1022\), \(11\), \(21\), \(2002\).

Вам задано длинное троичное число \(x\). Первая (самая левая) цифра числа \(x\) гарантированно является \(2\), остальные цифры числа \(x\) могут быть \(0\), \(1\) или \(2\).

Определим троичную операцию XOR \(\odot\) над двумя троичными числами \(a\) и \(b\) (оба имеют длину \(n\)) как число \(c = a \odot b\) длины \(n\), где \(c_i = (a_i + b_i) \% 3\) (где \(\%\) — операция взятия по модулю). Другими словами, сложим соответствующие цифры и возьмем остатки от сумм при делении на \(3\). Например, \(10222 \odot 11021 = 21210\).

Ваша задача — найти такие троичные числа \(a\) и \(b\) (оба длины \(n\) и без лидирующих нулей), что \(a \odot b = x\) и \(max(a, b)\) — минимально возможный.

Вам нужно ответить на \(t\) независимых наборов входных данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Затем следуют \(t\) наборов входных данных. Первая строка набора содержит одно целое число \(n\) (\(1 \le n \le 5 \cdot 10^4\)) — длину числа \(x\). Вторая строка набора содержит троичное число \(x\), состоящее из \(n\) цифр \(0, 1\) и \(2\). Гарантируется, что первой цифрой числа \(x\) является \(2\). Также гарантируется, что сумма всех \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^4\) (\(\sum n \le 5 \cdot 10^4\)).

Выходные данные

Для каждого набора входных данных выведите ответ на него — два троичных числа \(a\) и \(b\) (каждое длины \(n\) и без лидирующих нулей) таких, что \(a \odot b = x\) и \(max(a, b)\) — минимально возможное. Если есть несколько возможных ответов, вы можете вывести любой.

A. Dreamoon любит красить

жадные алгоритмы Конструктив математика реализация *1800

Dreamoon очень любит красить клетки.

Есть ряд из \(n\) клеток. Исходно, все клетки пустые (не содержат никакой цвет). Клетки пронумерованы от \(1\) до \(n\).

Вам дано целое число \(m\) и \(m\) целых чисел \(l_1, l_2, \ldots, l_m\) (\(1 \le l_i \le n\))

Dreamoon совершит \(m\) операций.

В \(i\)-й операции, Dreamoon выберет число \(p_i\) из отрезка \([1, n-l_i+1]\) (включительно) и покрасит все клетки от \(p_i\) до \(p_i+l_i-1\) (включительно) в \(i\)-й цвет. Обратите внимание, что клетки могут быть покрашены несколько раз, в таком случае, клетка будет покрашена в цвет из самой последней операции.

Dreamoon надеется, что после \(m\) операций, все цвета будут встречаться хотя бы один раз и все клетки будут покрашены. Пожалуйста, помогите Dreamoon выбрать \(p_i\) в каждой операции, чтобы удовлетворить всем ограничениям.

Входные данные

В первой строке записаны два целых числа \(n,m\) (\(1 \leq m \leq n \leq 100\,000\)).

Во второй строке записано \(m\) целых чисел \(l_1, l_2, \ldots, l_m\) (\(1 \leq l_i \leq n\)).

Выходные данные

Если невозможно совершить \(m\) операций, чтобы удовлетворить всем ограничениям, выведите «-1» (без кавычек).

Иначе, выведите \(m\) целых чисел \(p_1, p_2, \ldots, p_m\) (\(1 \leq p_i \leq n - l_i + 1\)), после этих \(m\) операций, все цвета должны встречаться хотя бы один раз и все клетки должны быть покрашены.

Если есть несколько возможных решений, вы можете вывести любое.

C. Drazil любит кучи

жадные алгоритмы Конструктив реализация Структуры данных *2400

Drazil очень любит кучи, поэтому он придумал задачу про кучу:

Есть куча на максимум глубины \(h\), реализованная на массиве. Эта куча устроена следующим образом: куча содержит ровно \(2^h - 1\) различных положительных ненулевых целых чисел. Все целые числа различны. Эти числа содержатся в массиве \(a\), в котором элементы пронумерованы от \(1\) до \(2^h-1\). Для всех \(1 < i < 2^h\), \(a[i] < a[\left \lfloor{\frac{i}{2}}\right \rfloor]\).

Теперь он хочет уменьшить глубину кучи так, чтобы глубина стала \(g\), и куча содержала ровно \(2^g-1\) чисел. Чтобы уменьшить глубину, нужно применить следующую операцию \(2^h-2^g\) раз:

Выбрать индекс \(i\), который содержит элемент, и запустить функцию \(f\) от индекса \(i\):

Обратите внимание, что мы считаем, что если \(a[i]=0\), то индекс \(i\) не содержит элемент.

После всех операций, оставшиеся \(2^g-1\) элементов должны находиться в индексах от \(1\) до \(2^g-1\). Теперь Drazil хочет узнать, какая может быть минимальная сумма оставшихся \(2^g-1\) элементов. Пожалуйста, найдите эту сумму и последовательность вызовов функции, на которой эта сумма достигается.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \leq t \leq 70\,000\)): количество наборов входных данных.

Каждый набор входных данных содержит две строки. В первой строке записаны два целых числа \(h\) и \(g\) (\(1 \leq g < h \leq 20\)). Во второй строке записаны \(n = 2^h-1\) различных положительных целых чисел \(a[1], a[2], \ldots, a[n]\) (\(1 \leq a[i] < 2^{20}\)). Для всех \(i\) от \(2\) до \(2^h - 1\), \(a[i] < a[\left \lfloor{\frac{i}{2}}\right \rfloor]\).

Сумма по всем \(n\) меньше чем \(2^{20}\).

Выходные данные

Для каждого набора входных данных, выведите две строки.

В первой строке вы должны вывести минимальную сумму элементов после уменьшения глубины кучи до \(g\). Вторая строка должна содержать \(2^h - 2^g\) целых чисел \(v_1, v_2, \ldots, v_{2^h-2^g}\). В \(i\)-й операции должна быть вызвана \(f(v_i)\).

A. HQ9+

реализация *900

HQ9+ — шуточный язык программирования, состоящий всего из четырех односимвольных команд:

  • «H» печатает «Hello, World!»,
  • «Q» печатает исходный код самой программы,
  • «9» печатает текст песни «99 бутылок пива»,
  • «+» увеличивает на единицу значение внутреннего счетчика.

Команды «H» и «Q» воспринимаются только в верхнем регистре. Все символы программы, не являющиеся командами, игнорируются.

Вам дана программа на HQ9+. Определите, будет ли что-то напечатано в результате ее выполнения.

Входные данные

В единственной строке входных данных задана строка p — программа на языке HQ9+. Строка p содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 33 (восклицательный знак) до 126 (тильда), включительно.

Выходные данные

Выведите «YES», если в результате выполнения программы будет напечатано какое-то сообщение, и «NO» в противном случае.

Примечание

В первом примере в программе есть только одна команда — «H», которая выводит на печать «Hello, World!».

Во втором примере ни один символ программы не является командой.

B. Unary

реализация *1200

Unary — минималистический диалект Brainfuck, в котором программы записываются с использованием единственного токена.

Программы на Brainfuck используют 8 команд: «+», «-», «[», «]», «<», «>», «.» и «,» (их смысл в данной задаче не важен). Программу на Unary можно получить из программы на Brainfuck следующим образом. Прежде всего, каждая команда заменяется бинарным кодом следующим образом:

  • «>»  →  1000,
  • «<»  →  1001,
  • «+»  →  1010,
  • «-»  →  1011,
  • «.»  →  1100,
  • «,»  →  1101,
  • «[»  →  1110,
  • «]»  →  1111.

Затем полученные коды конкатенируются в одно двоичное число в том же порядке, в котором они шли в программе. Наконец, это число записывается в унарной системе счисления — это и будет эквивалентная программа на Unary.

Вам дана программа на Brainfuck. Вычислите длину эквивалентной программы на Unary и выведите ее остаток от деления на 1000003 (106 + 3).

Входные данные

В единственной строке входных данных задана строка p — программа на Brainfuck. Строка p содержит от 1 до 100 символов, включительно. Каждый символ строки p будет «+», «-», «[», «]», «<», «>», «.» или «,».

Выходные данные

Выведите длину эквивалентной программы на Unary по модулю 1000003 (106 + 3).

Примечание

Запись числа n в унарной системе счисления выглядит как единица, записанная n раз. Например, десятичное число 5, записанное в унарной системе, будет выглядеть как 11111.

В первом примере после замены команд Brainfuck на бинарные коды получим 1101 1100, после их конкатенации — 11011100 в двоичной системе, то есть 220 в десятичной. Именно столько единиц будет в эквивалентной программе на Unary.

A. Dreamoon и сбор мест

реализация *900

Dreamoon — большой фанат соревнований на Codeforces!

Однажды, он сказал, что соберет все места от \(1\) до \(54\) после двух следующих рейтинговых контестов. Это удивительно!

Вдохновившись его высказыванием, вы придумали следующую задачу:

Есть человек, который принял участие в \(n\) раундах на Codeforces. Его место на первом раунде — \(a_1\), его место на втором раунде — \(a_2\), ..., его место на \(n\)-м раунде — \(a_n\).

Вам дано положительное целое число \(x\).

Пожалуйста, найдите наибольшее такое \(v\), что этот человек сможет собрать все места от \(1\) до \(v\) спустя \(x\) следующих рейтинговых контестов.

Другими словами, вам нужно найти наибольшее \(v\), что возможно такое, что после \(x\) следующих контестов, для каждого \(1 \leq i \leq v\), будет существовать контест, в котором он занял \(i\)-е место.

Например, если \(n=6\), \(x=2\) и \(a=[3,1,1,5,7,10]\), то ответ \(v=5\), так как, если занятые места в двух следующих раундах будут \(2\) и \(4\), то будут собраны все места от \(1\) до \(5\), то есть можно получить \(v=5\).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \leq t \leq 5\)): количество наборов входных данных.

В первой строке каждого набора входных данных написано два целых числа \(n, x\) (\(1 \leq n, x \leq 100\)).

В следующей строке набора записано \(n\) положительных целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 100\)).

Выходные данные

Для каждого набора входных данных, выведите наибольшее \(v\), что возможно такое, что после \(x\) других контестов, для каждого \(1 \leq i \leq v\), будет существовать контест, в котором он занял \(i\)-е место.

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе входных данных, у человека есть сто будущих контестов, так что он может занять места \(1,2,\ldots,99\) и место \(101\) на них в каком-то порядке, чтобы собрать места \(1,2,\ldots,101\).

B. Dreamoon любит перестановки

математика реализация *1400

Последовательность из \(m\) целых чисел называется перестановкой, если она содержит все целые числа от \(1\) до \(m\) ровно один раз. Число \(m\) называется длиной перестановки.

У Dreamoon есть две перестановки \(p_1\) и \(p_2\) имеющих ненулевые длины \(l_1\) и \(l_2\).

Затем, Dreamoon конкатенирует эти две перестановки в последовательность \(a\) длины \(l_1 + l_2\). Первые \(l_1\) элементов \(a\) это перестановка \(p_1\) а следующие \(l_2\) элементов \(a\) это перестановка \(p_2\).

Вам дана последовательность \(a\), вам нужно найти восстановить перестановки \(p_1\) и \(p_2\). Если есть несколько возможных способов, вам нужно найти все. (Обратите внимание, что также возможно, что способов не будет.)

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10\,000\)): количество наборов входных данных.

Каждый набор входных данных описывается двумя строками.

В первой строке записано целое число \(n\) (\(2 \leq n \leq 200\,000\)): длина \(a\).

Во второй строке записано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n-1\)).

Сумма по всем \(n\) не превосходит \(200\,000\).

Выходные данные

Для каждого набора входных данных, в первой строке требуется вывести число \(k\): количество способов разбить \(a\) на перестановки \(p_1\) и \(p_2\).

Каждая из следующих \(k\) строк должна содержать два целых числа \(l_1\) и \(l_2\) (\(1 \leq l_1, l_2 \leq n, l_1 + l_2 = n\)), обозначающих, что \(a\) можно разбить на две перестановки длин \(l_1\) и \(l_2\) (\(p_1\) это первые \(l_1\) элементов \(a\), а \(p_2\) это последние \(l_2\) элементов \(a\)). Вы можете выводить решения в любом порядке.

Примечание

В первом примере, есть два возможных способа разбить \(a\) на перестановки: \(\{1\} + \{4, 3, 2, 1\}\) and \(\{1,4,3,2\} + \{1\}\).

Во втором примере, есть только один способ разбить \(a\) на перестановки: \(\{2,4,1,3\} + \{2,1\}\).

В третьем примере, нет ни одного искомого разбиения.

D. Опять?

*особая задача реализация

Входные данные

Входные данные состоят из одного шестнадцатеричного числа длиной 7 цифр. Первая цифра строки - латинская буква A, за ней следуют 6 десятичных цифр 0-9.

Выходные данные

Выведите ответ — целое число.

E. Смайлик Жордана

*особая задача геометрия поиск в глубину и подобное реализация

Входные данные

Входные данные содержат два целых числа \(row\), \(col\) (\(0 \le row, col \le 63\)), разделенных пробелом.

Выходные данные

Выведите «IN» или «OUT».

A. Прогулка

жадные алгоритмы математика реализация *1100

У Алисы есть миленькая кошечка. Чтобы кошка была в форме, Алиса хочет спланировать маршрут для прогулки кошки.

Изначально, кошка Алиса находится в ячейке \((x,y)\) на бесконечном клетчатом поле. По теории Алисы кошка должна пройти:

  • ровно \(a\) шагов влево: из \((u,v)\) в \((u-1,v)\);
  • ровно \(b\) шагов вправо: из \((u,v)\) в \((u+1,v)\);
  • ровно \(c\) шагов вниз: из \((u,v)\) в \((u,v-1)\);
  • ровно \(d\) шагов вверх: из \((u,v)\) в \((u,v+1)\).

Обратите внимание, что шаги можно делать в произвольном порядке. Например, если кошка должна сделать \(1\) шаг влево, \(3\) шага вправо и \(2\) шага вниз, то маршрут вправо, вниз, влево, вправо, вправо, вниз корректный.

С другой стороны, Алиса волнуется, что кошка может потеряться, если уйдет очень далеко от нее. Поэтому она надеется, что ее кошка всегда находится в области \([x_1,x_2]\times [y_1,y_2]\), то есть для любой позиции \((u,v)\) маршрута выполняется \(x_1 \le u \le x_2\) и \(y_1 \le v \le y_2\).

Также обратите внимание, что кошка может посещать одну и ту же клетку несколько раз.

Помогите Алисе понять, существует ли маршрут, который удовлетворяет ее желаниям.

Формально, путь должен состоять ровно из \(a+b+c+d\) единичных шагов (\(a\) влево, \(b\) вправо, \(c\) вниз, \(d\) вверх). Алиса может совершать шаги в любом порядке. Её текущая позиция \((u, v)\) всегда должна удовлетворять ограничениям: \(x_1 \le u \le x_2\), \(y_1 \le v \le y_2\). Путь начинается из точки \((x, y)\).

Требуется решить задачу для \(t\) наборов входных данных независимо друг от друга.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны четыре целых числа \(a\), \(b\), \(c\), \(d\) (\(0 \le a,b,c,d \le 10^8\), \(a+b+c+d \ge 1\)).

Во второй строке каждого набора входных данных записаны шесть целых чисел \(x\), \(y\), \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(-10^8 \le x_1\le x \le x_2 \le 10^8\), \(-10^8 \le y_1 \le y \le y_2 \le 10^8\)).

Выходные данные

Для каждого набора входных данных выведите «YES» в отдельной строке, если существует маршрут, который удовлетворяет ее желаниям. Иначе выведите «NO» в отдельной строке.

Можно выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных в примере один из допустимых маршрутов такой: \(\)(0,0)\rightarrow (-1,0) \rightarrow (-2,0)\rightarrow (-2,1) \rightarrow (-2,2)\rightarrow (-1,2)\rightarrow(0,2)\rightarrow (0,1)\rightarrow (0,0) \rightarrow (-1,0)\(\)

C. K-полное слово

жадные алгоритмы поиск в глубину и подобное реализация снм Строки *1500

Слово \(s\) длины \(n\) называется \(k\)-полным, если

  • \(s\) — палиндром, то есть \(s_i=s_{n+1-i}\) для всех \(1 \le i \le n\);
  • \(s\) имеет период \(k\), то есть \(s_i=s_{k+i}\) для всех \(1 \le i \le n-k\).

Например, «abaaba» — это \(3\)-полное слово, а «abccba» нет.

Бобу вручили слово \(s\) длины \(n\), состоящее только из строчных букв латинского алфавита, и целое число \(k\) такое, что \(n\) делится на \(k\). Он хочет превратить слово \(s\) в любое \(k\)-полное слово.

Для этого Боб может выбирать некоторую позицию \(i\) (\(1 \le i \le n\)) и заменять букву на позиции \(i\) на любую другую строчную букву латинского алфавита.

Поэтому теперь Боба интересует минимальное количество позиций, буквы на которых ему необходимо заменить, чтобы превратить \(s\) в любое \(k\)-полное слово.

Обратите внимание, что Боб может сделать ноль изменений, если слово \(s\) уже \(k\)-полное.

Требуется ответить на \(t\) независимых наборов входных данных.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t\le 10^5\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(k\) (\(1 \le k < n \le 2 \cdot 10^5\), \(n\) делится на \(k\)).

Во второй строке записано слово \(s\) длины \(n\).

Гарантируется, что слово \(s\) состоит только из строчных букв латинского алфавита. Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество позиций, буквы на которых ему придется заменить, чтобы превратить \(s\) в любое \(k\)-полное слово.

Примечание

В первом наборе входных данных одно из оптимальных решений — это «aaaaaa».

Во втором наборе входных данных слово уже \(k\)-полное.

B. Добрый Антон

жадные алгоритмы реализация *1100

Борису опять нужна помощь Антона в составлении задачи. На этот раз Антону нужно решить для Бориса следующую задачу:

Есть две массива целых чисел \(a\) и \(b\) длины \(n\). Оказалось, что массив \(a\) содержит элементы только из множества \(\{-1, 0, 1\}\).

Антон может проделать следующую последовательность операций любое количество раз:

  1. Выбрать любую пару индексов \((i, j)\) такую, что \(1 \le i < j \le n\). Одну и ту же пару индексов \((i, j)\) можно выбирать сколько угодно раз.
  2. Добавить \(a_i\) к \(a_j\). Другими словами, \(j\)-й элемент массива становится равным \(a_i + a_j\).

Например, из массива \([1, -1, 0]\) за одну операцию можно получить массивы \([1, -1, -1]\), \([1, 0, 0]\) и \([1, -1, 1]\).

Антон хочет узнать, можно ли применить некоторое количество (возможно, нулевое) операций выше к массиву \(a\), чтобы получить массив \(b\). Можете ли вы ему помочь?

Входные данные

Каждый тест содержит несколько наборов входных данных.

Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10000\)). Далее следуют описания наборов входных данных.

Первая строка каждого тестового случая содержит единственное целое положительное число \(n\) (\(1 \le n \le 10^5\))  — длину массивов.

Вторая строка каждого тестового случая содержит \(n\) чисел \(a_1, a_2, \dots, a_n\) (\(-1 \le a_i \le 1\))  — элементы массива \(a\). Среди этих элементов могут быть одинаковые значения.

Третья строка каждого тестового случая содержит \(n\) чисел \(b_1, b_2, \dots, b_n\) (\(-10^9 \le b_i \le 10^9\))  — элементы массива \(b\). Среди этих элементов могут быть одинаковые значения.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(10^5\).

Выходные данные

Для каждого наборов входных данных выведите одну строку содержащую «YES» если можно преобразовать массив \(a\) так, чтобы он стал равен массиву \(b\), или «NO» иначе.

Вы можете выводить каждую букву каждого ответа в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных можно выбрать \((i, j)=(2, 3)\) дважды, затем \((i, j)=(1, 2)\) также дважды. Эти операции изменят массив следующим образом: \([1, -1, 0] \to [1, -1, -2] \to [1, 1, -2]\).

Во втором наборе входных данных нельзя сделать числа на второй позиции равными.

В третьем наборе входных данных можно выбрать \((i, j)=(1, 2)\) \(41\) раз. Аналогично в четвертом.

В последнем наборе входных данных преобразовать массив \(a\) в массив \(b\) невозможно.

C. Евгений и массив

Бинарный поиск реализация Структуры данных *1700

Евгений любит работать с массивами. Сегодня ему нужна ваша помощь, чтобы решить одну сложную задачку.

Массив \(c\) является подмассивом \(b\), если \(c\) может быть получен из \(b\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца.

Назовем непустой массив хорошим, если для любого непустого подмассива этого массива, сумма его элементов не равна нулю. К примеру, массив \([-1, 2, -3]\) является хорошим, так как все массивы \([-1]\), \([-1, 2]\), \([-1, 2, -3]\), \([2]\), \([2, -3]\), \([-3]\) имеют ненулевую сумму элементов. В то же время, массив \([-1, 2, -1, -3]\) не является хорошим, так как его подмассив \([-1, 2, -1]\) имеет сумму элементов равную \(0\).

Помогите Евгению посчитать количество непустых хороших подмассивов данного массива \(a\).

Входные данные

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \times 10^5\))  — длину массива \(a\).

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^9 \le a_i \le 10^9\))  — элементы массива \(a\).

Выходные данные

Выведите одно целое число  — количество хороших подмассивов \(a\).

Примечание

В первом примере следующие подмассивы являются хорошими: \([1]\), \([1, 2]\), \([2]\), \([2, -3]\), \([-3]\), Однако подмассив \([1, 2, -3]\) не является хорошим, поскольку его подмассив \([1, 2, -3]\) имеет сумму элементов, равную \(0\).

Во втором примере все три подмассива размера 1 хорошие и только они. В то же время, подмассив \([41, -41, 41]\) не является хорошим, поскольку его подмассив \([41, -41]\) имеет сумму элементов, равную \(0\).

D. Досуг в школе №41

графы жадные алгоритмы игры Конструктив Перебор реализация сортировки *2100

В средней школе №41 учатся \(n\) детей. Всем известно, что они хорошие математики. Однажды на перемене ребята решили провести исследование. Они выстроились в один ряд и повернули головы налево или направо.

Дети проделывали следующую операцию: каждую секунду несколько пар соседних в ряду детей, смотрящих друг на друга, могли одновременно развернуться в противоположную сторону. Таким образом, ребенок, смотрящий на правого соседа, повернется налево, и наоборот для второго ребенка. Более того, каждую секунду хотя бы одна пара соседних детей проделывала подобную операцию. Процесс заканчивается, когда нет пары соседних детей смотрящих друг на друга.

Дано число детей \(n\), изначальная расстановка детей в ряду и целое положительное число \(k\). Необходимо найти последовательность действий детей, завершающий процесс ровно за \(k\) секунд. Более формально, на каждый из \(k\) ходов нужно вывести номера детей, которые повернутся налево во время хода.

Для примера, дети могут действовать с конфигурацией приведенной ниже и \(k = 2\) следующим образом:

На первом ходу развернутся две пары: \((1, 2)\) и \((3, 4)\). После этого получается такая конфигурация:
На втором ходу развернется только пара \((2, 3)\). В итоговой конфигурации никакая пара детей не смотрит друг на друга. Хорошая работа.

Если решение существует, то гарантируется что дети совершат не более чем \(n^2\) разворотов.

Входные данные

Первая строка входных данных содержит два целых числа \(n\), \(k\) (\(2 \le n \le 3000\), \(1 \le k \le 3000000\))  — количество детей и количество ходов через которые нужно закончить.

Вторая строка входных данных содержит строку длины \(n\), которая состоит только из символов L и R. L значит, что ребенок смотрит налево, а R  — направо.

Выходные данные

Если решения не существует, выведите \(-1\).

Иначе, вывод должен состоять из \(k\) строк. Каждая строка должна начинаться с положительного целого числа \(n_i\) (\(1\le n_i \le \frac{n}{2}\))  — количества пар детей, которые развернутся на этом ходу. Далее в этой же строке должно следовать \(n_i\) попарно различных чисел  — номера детей, которые повернут голову налево во время этого хода.

После проведения всех разворотов, не должно быть пары соседних детей, смотрящих друг на друга.

Если существует более одного решения, выведите любое из них.

Примечание

Первый тест описывает пару детей смотрящих друг на друга. За один ход они развернутся.

Во втором тесте дети не могут сделать ни одного хода. В итоге они не смогут закончить за \(k>0\) ходов.

Третий тест описан в условии.

F. Катя и несовершенства

жадные алгоритмы математика реализация сортировки теория чисел *2200

У Кати есть множество \(S\) состоящее из \(n\) чисел \(\{1, \dots, n\} \).

Катя считает, что уродливость множества \(M \subseteq S\) равна максимуму из \(gcd(a, b)\), по всем парам \((a, b)\) таким, что и \(a\) и \(b\) лежат в \(M\), и \(a \neq b\).

Катя очень аккуратная девушка, поэтому для каждого \(k \in \{2, \dots, n\}\) она хочет найти подмножество имеющее наименьшую уродливость среди всех подмножеств \(S\) размера \(k\). Подмножеств заданного размера с минимальной уродливостью может быть больше одного, но вам не стоит беспокоиться по этому поводу. Катя найдет нужное ей подмножество сама. От вас ей нужно узнать лишь минимальную возможную уродливость для каждого \(k\) определенного выше, назовем ее \(I_k\).

Пожалуйста, помогите Кате найти \(I_2\), \(I_3\), ..., \(I_n\).

Входные данные

Первая и единственная строка входных данных состоит из одного целого положительного числа \(n\) (\(2\le n \le 5 \cdot 10^5\))  — размер заданного множества \(S\).

Выходные данные

Вам нужно вывести только одну строку содержащую \(n - 1\) число: \(I_2\), \(I_3\), ..., \(I_n\).

Примечание

Ответ на первый пример 1, так как \(gcd(1, 2) = 1\).

Во втором примере существуют подмножества \(S\) размеров \(2, 3\) с уродливостью 1. Например, \(\{2,3\}\) и \(\{1, 2, 3\}\).

A. Статистика по уровню

математика реализация *1200

Поликарп недавно создал новый уровень в этой новой клевой игре Berlio Maker 85 и загрузил его в сеть. Теперь игроки со всего мира могут попробовать его уровень.

У каждого уровня в этой игре есть статистика — две величины: количество попыток и количество успешных прохождений. Так если игрок играет уровень, то количество попыток увеличивается на \(1\). Если же он еще и успешно его завершает, то количество успешных прохождений тоже увеличивается на \(1\). Обратите внимание, что обе величины обновляются одновременно (то есть если игрок успешно завершает уровень, то количество попыток обновится одновременно с количеством успешных прохождений).

Поликарпу не терпится узнать, насколько же сложный уровень у него получился, поэтому он постоянно смотрит статистику.

Более точно, он взглянул на статистику \(n\) раз и выписал \(n\) пар целых чисел — \((p_1, c_1), (p_2, c_2), \dots, (p_n, c_n)\), где \(p_i\) — это количество попыток (от слова plays) в \(i\)-й момент времени, а \(c_i\) — это количество успешных прохождений (от слова clears) в тот же момент времени. Статистика дана в хронологическом порядке (то есть порядок данных пар точно совпадает с тем, как Поликарп их выписывал).

Между двумя последовательными моментами времени, когда Поликарп смотрел статистику, много (но возможно и ноль) игроков могли попробовать уровень.

Наконец, Поликарпу интересно, не ошибся ли он нигде в своих записях. Если существует такая последовательность попыток игроков (и успешных прохождений, соответственно), что статистика была ровно такая, как Поликарп выписал, то он считает свои записи правильными.

Помогите ему определить правильность его записей.

Для вашего удобства вам потребуется ответить на несколько независимых наборов входных данных.

Входные данные

В первой строке записано одно целое число \(T\) \((1 \le T \le 500)\) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 100\)) — количество моментов времени, когда Поликарп смотрел статистику.

В каждой из следующих \(n\) строк записаны по два целых числа \(p_i\) и \(c_i\) (\(0 \le p_i, c_i \le 1000\)) — количество попыток и количество успешных прохождений уровня в \(i\)-й момент времени.

Обратите внимание, что статистика задана в хронологическом порядке.

Выходные данные

Для каждого набора входных данных выведите одну строку.

Если существует такая последовательность попыток игроков (и успешных прохождений, соответственно), что статистика была ровно такая, как Поликарп выписал, то выведите «YES».

Иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом наборе входных данных в третий момент времени количество успешных прохождений увеличилось, а количество попыток нет, чего не могло произойти.

Второй набор входных данных — это неплохой пример Super Expert уровня.

В третьем наборе входных данных количество попыток уменьшилось, что невозможно.

Четвертый набор входных данных — это скорее всего авто уровень с одним прыжком через шипы.

В пятом наборе входных данных количество успешных попыток уменьшилось, что также невозможно.

Никто не хотел играть шестой набор входных данных; мама Поликарпа попробовала, чтобы он не расстраивался, однако, не смогла пройти уровень.

D. Минимальный эйлеров цикл

графы жадные алгоритмы Конструктив реализация *1800

Вам задан полный ориентированный граф \(K_n\) из \(n\) вершин: у каждой пары вершин \(u \neq v\) в \(K_n\) есть обе дуги \((u, v)\) и \((v, u)\); петель в графе нет.

Вам нужно найти такой цикл в \(K_n\), который проходит по каждой дуге ровно один раз (вершины можно посещать несколько раз).

Мы можем выписать такой цикл как список из \(n(n - 1) + 1\) вершин \(v_1, v_2, v_3, \dots, v_{n(n - 1) - 1}, v_{n(n - 1)}, v_{n(n - 1) + 1} = v_1\) — порядок обхода, в котором каждая дуга \((v_i, v_{i + 1})\) встречается по одному разу.

Найдите лексикографически минимальный такой цикл. Не трудно доказать, что такой цикл всегда существует.

Так как ответ может быть слишком большим, выведите только его \([l, r]\) отрезок, то есть \(v_l, v_{l + 1}, \dots, v_r\).

Входные данные

В первой строке задано единственное число \(T\) (\(1 \le T \le 100\)) — количество наборов входных данных.

В следующих \(T\) строках заданы сами наборы входных данных — по одному на строку. В данной строке задано три целых числа \(n\), \(l\) и \(r\) (\(2 \le n \le 10^5\), \(1 \le l \le r \le n(n - 1) + 1\), \(r - l + 1 \le 10^5\)) — количество вершин в \(K_n\) и отрезок цикла, который нужно вывести.

Гарантируется, что сумма по \(n\) не превосходит \(10^5\) и сумма длин отрезков \(r - l + 1\) не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите отрезок \(v_l, v_{l + 1}, \dots, v_r\) лексикографически минимального цикла, который проходит по каждой дуге ровно один раз.

Примечание

Во втором наборе, лексикографически минимальный цикл выглядит следующим образом: \(1, 2, 1, 3, 2, 3, 1\).

В третьем примере, довольно очевидно, что цикл должен начинаться и заканчиваться в вершине \(1\).

C. Составление двух команд

Бинарный поиск жадные алгоритмы реализация сортировки *1100

Под вашим контролем находятся \(n\) студентов и вам нужно составить ровно две команды, состоящие из некоторого подмножества ваших студентов. У каждого студента есть свой собственный навык, навык \(i\)-го студента обозначен числом \(a_i\) (у различных студентов могут быть одинаковые навыки).

Итак, о командах. Во-первых, эти две команды должны быть одинакового размера. Есть еще два требования:

  • Первая команда должна состоять из студентов с различными навыками (то есть нет одинаковых навыков среди студентов первой команды).
  • Вторая команда должна состоять из студентов с одинаковыми навыками (то есть все навыки среди студентов второй команды равны между собой).

Отметим, что допустимо, что какой-то студент первой команды имеет такой же навык, как и студент второй команды.

Рассмотрим несколько примеров (перечислены навыки для команд):

  • \([1, 2, 3]\), \([4, 4]\) не являются подходящей парой команд, потому что их размеры должны быть одинаковыми;
  • \([1, 1, 2]\), \([3, 3, 3]\) не являются подходящей парой команд, потому что первая команда не должна включать студентов с одинаковыми навыками;
  • \([1, 2, 3]\), \([3, 4, 4]\) не являются подходящей парой команд, потому что вторая команда должна включать студентов с одинаковыми навыками;
  • \([1, 2, 3]\), \([3, 3, 3]\) — подходящая пара команд;
  • \([5]\), \([6]\) — тоже подходящая пара команд.

Ваша задача — найти максимально возможный размер команд \(x\), для которого возможно составить подходящую пару команд, где каждая команда имеет размер \(x\) (в первой команде все навыки различны, во второй — все навыки равны между собой). Студент не может входить более чем в одну команду.

Вам нужно ответить на \(t\) независимых наборов входных данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество студентов. Вторая строка набора содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)), где \(a_i\) — это навык \(i\)-го студента. У различных студентов могут быть одинаковые навыки.

Гарантируется, что сумма чисел \(n\) по всем наборам тестовых данных не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Для каждого набора тестовых данных выведите ответ на него — максимально возможный размер команд \(x\), для которого возможно составить подходящую пару команд, где каждая команда имеет размер \(x\).

Примечание

В первом наборе тестовых данных примера возможно составить две команды размера \(3\): первая команда может иметь вид \([1, 2, 4]\), вторая команда может иметь вид \([4, 4, 4]\). Заметим, есть и другие способы выбрать две команды размера \(3\), которые соответствуют требованиям выше.

D. Анти-судоку

Конструктив реализация *1300

Вам дано корректное решение головоломки судоку. Если вы не знаете, что такое судоку, то вы можете прочитать об этом здесь.

Картинка, показывающая корректное решение судоку:

Блоки ограничены жирным черным цветом.

Ваша задача — заменить не более \(9\) элементов этого поля (то есть, выбрать некоторые \(1 \le i, j \le 9\) и заменить число в позиции \((i, j)\) на любое другое число в отрезке \([1; 9]\)), чтобы получить анти-судоку. Анти-судоку — это поле размера \(9 \times 9\), в котором:

  • Каждое число на этом поле находится в отрезке \([1; 9]\);
  • каждая строка содержит как минимум два одинаковых элемента;
  • каждый столбец содержит как минимум два одинаковых элемента;
  • каждый блок размера \(3 \times 3\) (о том, что такое блок, вы можете прочитать по ссылке выше) содержит как минимум два одинаковых элемента.

Гарантируется, что ответ существует.

Вам нужно ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка тестовых данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Каждый набор состоит из \(9\) строк, каждая строка состоит из \(9\) символов от \(1\) до \(9\) без пробелов — то есть, представляет собой корректное решение головоломки судоку.

Выходные данные

Для каждого набора тестовых данных выведите ответ на него — заданное изначально поле с не более, чем \(9\) измененными в нем элементами так, что полученное поле является анти-судоку. Если существует несколько подходящих решений, вы можете вывести любое. Гарантируется, что ответ существует.

B. Kana и игра Dragon Quest

жадные алгоритмы математика реализация *900

Кana была обыкновенной старшекласницей, пока ее не обнаружил разведчик талантов. Теперь она стала идолом. Но, в отличие от стереотипа, она обожает играть в игры.

Однажды Kana заинтересовалась новой игрой, которая называется Dragon Quest. В этой игре она должна победить дракона.

 

У дракона есть некоторое количество очков здоровья, которое изначально равно \(x\). Когда количество его очков здоровья становится равным \(0\) или меньше \(0\), он погибает. Для того, чтобы победить дракона Kana может использовать два типа заклинаний.

  • Поглощение пустотой

    Предположим, что текущее количество очков здоровья дракона равно \(h\), после применения этого заклинания количество очков здоровья станет равным \(\left\lfloor \frac{h}{2} \right\rfloor + 10\). Здесь за \(\left\lfloor \frac{h}{2} \right\rfloor\) мы обозначаем число \(h\), разделенное на два с округлением вниз.

  • Удар молнии

    Это заклинание уменьшает количество очков здоровья на \(10\). Предположим, что текущее количество очков здоровья дракона равно \(h\), после применения этого заклинания, количество очков здоровья уменьшится до \(h-10\).

По некоторым причинам, Kana может применить не больше чем \(n\) Поглощений пустотой и \(m\) Ударов молнии. Она может применять заклинания в любом порядке и не обязана применить все эти заклинания. Kana не очень хороша в математике, поэтому она просит вас помочь ей определить, сможет ли она победить дракона.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\))  — количество тестовых случаев.

Следующие \(t\) строк содержат описания тестовых случаев. Каждая строка описания тестового случая содержит три целых числа \(x\), \(n\), \(m\) (\(1\le x \le 10^5\), \(0\le n,m\le30\))  — изначальное количество очков здоровья дракона, максимальное количество Поглощений пустотой и Ударов молнии, которое Kana может применить, соответственно.

Выходные данные

Если возможно победить дракона, выведите «YES» (без кавычек). Иначе, выведите «NO» (без кавычек).

Вы можете выводить каждый символ в любом регистре (в верхнем или нижнем).

Примечание

Одна из возможных последовательностей применения заклинаний в первом тестовом случае такая:

  • Поглощение пустотой \(\left\lfloor \frac{100}{2} \right\rfloor + 10=60\).
  • Удар молнии \(60-10=50\).
  • Поглощение пустотой \(\left\lfloor \frac{50}{2} \right\rfloor + 10=35\).
  • Поглощение пустотой \(\left\lfloor \frac{35}{2} \right\rfloor + 10=27\).
  • Удар молнии \(27-10=17\).
  • Удар молнии \(17-10=7\).
  • Удар молнии \(7-10=-3\).

A. Заполнение ромбами

дп математика Перебор реализация *900

У вас есть целое число \(n\). Сколькими способами можно полностью покрыть поясоподобную область, состоящую из \(4n-2\) треугольников, ромбами?

Ромб состоит из двух треугольников. Вы можете перемещать, вращать или переворачивать ромб, но вы не можете масштабировать его.

\(2\) покрытия называются различными, если некоторые \(2\) треугольника покрыты одним и тем же ромбом в одном из них, и различными в другом.

Пожалуйста, посмотрите на иллюстрации ниже для лучшего понимания.

Слева изображен ромб, которым вы будете заполнять область, а справа  — область, которую вы хотите заполнить.

Выше приведены области, для \(n = 1, 2, 3, 4\).

Вы должны ответить на \(t\) независимых тестовых случаев.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^{4}\))  — количество тестовых случаев.

Каждая из следующих \(t\) строк содержит одно целое число \(n\) (\(1 \le n \le 10^{9}\)).

Выходные данные

Для каждого теста выведите количество способов полностью покрыть поясоподобную область, состоящую из \(4n-2\) треугольников, ромбами. Можно показать, что при данных ограничениях это количество не превышает \(10^{18}\).

Примечание

В первом тестовом примере, есть следующие \(2\) способа заполнить область:

Во втором тестовом примере, существует единственный способ заполнить область:

A. Среднестатистические элементы

Перебор реализация *1200

Задана последовательность положительных целых чисел a1, a2, ..., an. Найдите все такие индексы i, что i-ый элемент равен среднему арифметическому всех остальных элементов (то есть всех элементов, кроме него).

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 2·105). Вторая строка содержит элементы последовательности a1, a2, ..., an (1 ≤ ai ≤ 1000). Все элементы — положительные целые числа.

Выходные данные

В первую строку выведите количество искомых индексов. Во вторую строку — искомые индексы в порядке возрастания. Все индексы — это целые числа от 1 до n.

Если искомых элементов не существует, то первая строка выходных данных должна содержать число 0. В этом случае вторую строку можно не выводить или вывести пустую строку.

A. Настя и странный генератор

жадные алгоритмы Перебор реализация Структуры данных *1500

Расстроившись после такого отношения Насти, Денис был очень грустным. Ничего не могло развеселить отвергнутого парня. Чтобы хоть как-то развеселиться он решил побродить по подворотням. И, как ни странно, ему улыбнулась удача! Зайдя в первый двор, он встретил странного человека, который чем-то торговал.

Оглядевшись вокруг, Денис подошел к незнакомцу и купил загадочный товар. Им оказался... Генератор случайных перестановок! Именно это мальчик так давно искал!

Придя домой он стал изучать, как работает его генератор и узнал алгоритм. Процесс генерации перестановки состоит из \(n\) шагов. На \(i\)-м шаге выбирается позиция (индекс) для значения \(i\) \((1 \leq i \leq n)\). Позиция для значения \(i\) определяется следующим образом:

  • Для всех \(j\) от \(1\) до \(n\) посчитаем \(r_j\)  — минимальный такой индекс, что \(j \leq r_j \leq n\), a позиция \(r_j\) еще не занята в перестановке. Если таких позиций нет, то будем считать, что значение \(r_j\) не определено.
  • Для всех \(t\) от \(1\) до \(n\) посчитаем \(count_t\)  — количество таких позиций \(1 \leq j \leq n\), что значение \(r_j\) определено и \(r_j = t\).
  • Рассмотрим все еще не занятые позиции перестановки и среди таких рассмотрим позиции, для которых значение в массиве \(count\) максимально.
  • Генератор выбирает одну из таких позиций для значения \(i\). Генератор может выбрать любую позицию.

Рассмотрим работу алгоритма на следующем примере:

Пусть \(n = 5\) и алгоритм уже расставил значения \(1, 2, 3\) в перестановке. Рассмотрим, как генератор будет выбирать позицию для значения \(4\):

  • Значения \(r\) будут \(r = [3, 3, 3, 4, \times]\), где \(\times\) означает неопределенное значение.
  • Тогда значения \(count\) будут \(count = [0, 0, 3, 1, 0]\).
  • Есть только две не занятые позиции в перестановке: \(3\) и \(4\). Значение в массиве \(count\) для позиции \(3\) равно \(3\), для позиции \(4\) равно \(1\).
  • Максимальное значение достигается только для позиции \(3\), поэтому алгоритм однозначно выберет эту позицию для значения \(4\).

Довольный своим приобретением Денис пошел домой. Несколько дней без перерыва он генерировал перестановки и решил, что преисполнился в осознании процесса генерации. Он считает, что может придумывать случайные перестановки не хуже генератора.

После этого он выписал первую пришедшую на ум перестановку \(p_1, p_2, \ldots, p_n\) и решил узнать, могла ли она получится в результате работы генератора.

К сожалению, эта задача оказалась слишком сложна для него, и он обратился за помощью к вам. Нужно определить, могла ли получиться выписанная перестановка применением описанного алгоритма, если генератор всегда выбирает нужную Денису позицию.

Входные данные

В первой строке записано целое число \(t\) \((1 \leq t \leq 10^5)\)  — количество наборов входных данных в тесте. Далее содержатся сами описания наборов.

В первой строке каждого набора находится единственное целое число \(n\) \((1 \leq n \leq 10^5)\)  — длина перестановки.

Во второй строке набора находится \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \leq p_i \leq n\))  — выписанная Денисом перестановка.

Гарантируется, что сумма значений \(n\) по всем входным данным не превосходит \(10^5\).

Выходные данные

Выведите «Yes», если эта перестановка могла быть получена в результате работы генератора. В противном случае выведите «No».

Все буквы можно выводить в любом регистре.

Примечание

Промоделируем работу генератора на первом тесте.

На \(1\) шаге \(r = [1, 2, 3, 4, 5], count = [1, 1, 1, 1, 1]\). Максимальное значение достигается в любой свободной позиции, поэтому генератор может выбрать случайную позицию от \(1\) до \(5\). В нашем примере он выбрал \(5\).

На \(2\) шаге \(r = [1, 2, 3, 4, \times], count = [1, 1, 1, 1, 0]\). Максимальное значение достигается в позициях от \(1\) до \(4\), поэтому генератор может выбрать случайную позицию среди них. В нашем примере он выбрал \(1\).

На \(3\) шаге \(r = [2, 2, 3, 4, \times], count = [0, 2, 1, 1, 0]\). Максимальное значение равно \(2\) и достигается только в позиции \(2\), поэтому генератор выберет эту позицию.

На \(4\) шаге \(r = [3, 3, 3, 4, \times], count = [0, 0, 3, 1, 0]\). Максимальное значение равно \(3\) и достигается только в позиции \(3\), поэтому генератор выберет эту позицию.

На \(5\) шаге \(r = [4, 4, 4, 4, \times], count = [0, 0, 0, 4, 0]\). Максимальное значение равно \(4\) и достигается только в позиции \(4\), поэтому генератор выберет эту позицию.

Итого мы получили перестановку \(2, 3, 4, 5, 1\), то есть генератор мог её сгенерировать.

B. Настя и дверь

жадные алгоритмы реализация *1300

На 14 февраля Денис решил подарить валентинку Насте и не придумал ничего лучше чем нарисовать на двери длины \(k\) (\(k \ge 3\)) огромное красное сердечко. Настю такой подарок очень смутил, поэтому она решила сломать дверь, сбросив её на горы.

Горы описываются последовательностью высот \(a_1, a_2, \dots, a_n\) в порядке слева направо (\(k \le n\)). Гарантируется, что соседние высоты не равны друг другу (то есть \(a_i \ne a_{i+1}\) для всех \(i\) от \(1\) до \(n-1\)).

Пиками гор на отрезке \([l,r]\) (от \(l\) до \(r\)) называются такие индексы \(i\), что \(l < i < r\), \(a_{i - 1} < a_i\) и \(a_i > a_{i + 1}\). Стоит отметить, что граничные для отрезка индексы \(l\) и \(r\) пиками не являются. Например, если \(n=8\) и \(a=[3,1,4,1,5,9,2,6]\), то на отрезке \([1,8]\) всего два пика (с индексами \(3\) и \(6\)), а на отрезке \([3, 6]\) — пиков нет.

Чтобы сломать дверь, Настя сбрасывает ее на некоторый отрезок \([l,l+k-1]\) подряд идущих гор длины \(k\) (\(1 \le l \le n-k+1\)). Когда дверь касается пиков гор, она разламывается на две части, после этого эти части продолжат падать в разных половинах и также ломаться на части при касании пиков гор и так далее. Формально, количество частей, на которое разобьется дверь, будет равно \(p+1\), где \(p\) — количество пиков на отрезке \([l,l+k-1]\).

Настя хочет сломать ее на максимальное количество кусочков. Помогите ей выбрать такой отрезок гор \([l, l+k-1]\), что количество пиков на нём — максимально. Если существует несколько оптимальных отрезков, Настя желает найти такой, для которого значение \(l\) — минимально.

Формально, то вам нужно выбрать такой отрезок гор \([l, l+k-1]\), на котором количество пиков максимально. Среди всех таких отрезков, вам нужно найти отрезок, имеющий минимальное значение \(l\).

Входные данные

В первой строке записано целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных в тесте. Далее содержатся сами описания наборов.

В первой строке набора находятся два целых числа \(n\) и \(k\) (\(3 \leq k \leq n \leq 2 \cdot 10^5\))  — количество гор и длина Настиной двери.

Вторая строка набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \leq a_i \leq 10 ^ 9\), \(a_i \neq a_{i + 1}\)), задающие высоты гор.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два целых числа \(t\) и \(l\)  — максимальное количество частей, на которое может разбиться дверь, и левую границу отрезка длины \(k\), на который надо сбросить дверь.

Примечание

В первом примере нужно выбрать отрезок гор со \(2\) по \(7\), на этом отрезке индексы \(3\) и \(6\) являются пиками, поэтому ответ равен \(3\) (всего \(2\) пика, значит дверь разломится на \(3\) части). Не трудно заметить, что отрезки гор \([1, 6]\) и \([3, 8]\) не подойдут, так как на них всего \(1\) пик (для первого отрезка индекс \(6\) не является пиком, а для второго отрезка индекс \(3\) не является пиком).

Во втором примере нужно выбрать отрезок гор со \(2\) по \(4\), на этом отрезке индекс \(3\) является пиком, поэтому ответ равен \(2\) (всего \(1\) пик, значит дверь разломится на \(2\) части).

В третьем примере нужно выбрать отрезок гор с \(1\) по \(4\), на этом отрезке индекс \(3\) является пиком, поэтому ответ равен \(2\) (всего \(1\) пик, значит дверь разломится на \(2\) части). Можно заметить, что на отрезках \([2, 5]\), \([4, 7]\) и \([5, 8]\) количество пиков также равно \(1\), но у этих отрезков левая граница больше, чем у отрезка \([1, 4]\), поэтому они не являются правильным ответом.

F. Восстановить перестановку по отсортированным отрезкам

жадные алгоритмы Конструктив Перебор реализация Структуры данных *2400

Мы загадали перестановку \(p\), состоящую из \(n\) целых чисел. Перестановкой длины \(n\) называется массив длины \(n\), где каждый элемент от \(1\) до \(n\) встречается ровно один раз. Эта перестановка вам неизвестна.

Для каждой позиции \(r\) от \(2\) до \(n\) мы выбрали некоторый другой индекс \(l\) (\(l < r\)) и дали вам отрезок \(p_l, p_{l + 1}, \dots, p_r\) в отсортированном порядке (то есть мы переставили элементы на этом отрезке так, что элементы на этом отрезке оказались отсортированными). Таким образом, вам задан ровно \(n-1\) отрезок первоначальной перестановки, но элементы внутри каждого отрезка отсортированы. Отрезки даны вам в случайном порядке.

Например, если загаданная перестановка — \(p=[3, 1, 4, 6, 2, 5]\), то возможное заданное множество отрезков:

  • \([2, 5, 6]\)
  • \([4, 6]\)
  • \([1, 3, 4]\)
  • \([1, 3]\)
  • \([1, 2, 4, 6]\)

Ваша задача — найти любую подходящую перестановку (то есть любую перестановку, соответствующую входным данным). Гарантируется, что входные данные соответствуют некоторой перестановке (то есть перестановка существует).

Вам нужно ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(2 \le n \le 200\)) — длину перестановки.

Следующая \(n-1\) строка описывает заданные отрезки.

\(i\)-я строка содержит описание \(i\)-го отрезка. Строка начинается с числа \(k_i\) (\(2 \le k_i \le n\)) — длины \(i\)-го отрезка. Затем следуют \(k_i\) целых чисел. Все числа в строке различны, отсортированы по возрастанию, между \(1\) и \(n\), включительно.

Гарантируется, что искомая перестановка \(p\) существует для каждого набора тестовых данных.

Также гарантируется, что сумма чисел \(n\) по всем наборам тестовых данных не превосходит \(200\) (\(\sum n \le 200\)).

Выходные данные

Для каждого набора тестовых данных выведите ответ: \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\), все \(p_i\) должны быть различны) — любую подходящую перестановку (то есть любую перестановку, удовлетворяющую входным данным набора тестовых данных).

D. Феникс и наука

Бинарный поиск жадные алгоритмы Конструктив математика реализация *1900

Феникс решил стать ученым! Сейчас он изучает рост бактерий.

Изначально, в день \(1\), есть одна бактерия массой \(1\).

Каждый день некоторое количество бактерий делятся (возможно, все или ни одной). Когда бактерия массой \(m\) делится, она превращается в две бактерии массой \(\frac{m}{2}\) каждая. Например, бактерия массой \(3\) может разделиться на две бактерии массой \(1.5\).

Каждую ночь масса каждой бактерии увеличивается на один.

Феникса интересует вопрос: может ли общая масса бактерий стать в точности равна \(n\). Если может, то его интересует как добиться такой массы за минимальное количество ночей. Помогите ему стать самым лучшим ученым!

Входные данные

Входные данные состоят из нескольких наборов. В первой строке задано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В единственной строке каждого набора задано целое число \(n\) (\(2 \le n \le 10^9\)) — суммарная масса бактерий, которой хочет добиться Феникс.

Выходные данные

Для каждого набора входных данных, если не существует способа получить общую массу равную \(n\), выведите -1. В противном случае, выведите две строки.

В первой строке выведите целое число \(d\) — минимальное необходимое количество ночей.

В следующей строке выведите \(d\) целых чисел, где \(i\)-е число обозначает количество бактерий, которые поделятся в \(i\)-й день.

Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе, можно получить общую массу бактерий ровно \(9\) следующим образом:

  • День \(1\): Бактерия с массой \(1\) делится. Получаем две бактерии с массой \(0.5\).
  • Ночь \(1\): Все бактерии увеличивают массу на один. Получаем две бактерии с массой \(1.5\).
  • День \(2\): Ни одна бактерия не делится.
  • Ночь \(2\): Получаем две бактерии с массой \(2.5\).
  • День \(3\): Обе бактерии делятся. Получаем четыре бактерии с массой \(1.25\).
  • Ночь \(3\): Получаем четыре бактерии с массой \(2.25\).
Суммарная масса равна \(2.25+2.25+2.25+2.25=9\). Можно доказать, что \(3\) — минимальное необходимое количество ночей. Есть и другие способы добиться суммарной массы 9 за 3 ночи.

\( \)

В втором наборе, можно получить общую массу бактерий ровно \(11\) следующим образом:

  • День \(1\): Бактерия с массой \(1\) делится. Получаем две бактерии с массой \(0.5\).
  • Ночь \(1\): Получаем две бактерии с массой \(1.5\).
  • День \(2\): Одна бактерия делится. Получаем три бактерии с массами \(0.75\), \(0.75\) и \(1.5\).
  • Ночь \(2\): Получаем три бактерии с массами \(1.75\), \(1.75\) и \(2.5\).
  • День \(3\): Бактерия с массой \(1.75\) и бактерия с массой \(2.5\) делятся. Получаем пять бактерий с массами \(0.875\), \(0.875\), \(1.25\), \(1.25\) и \(1.75\).
  • Ночь \(3\): Получаем пять бактерий с массами \(1.875\), \(1.875\), \(2.25\), \(2.25\) и \(2.75\).
Суммарная масса равна \(1.875+1.875+2.25+2.25+2.75=11\). Можно доказать, что \(3\) — минимальное необходимое количество ночей. Есть и другие способы добиться суммарной массы 11 за 3 ночи.

\( \)

Во третьем наборе, бактерия не делится в день \(1\), а потом увеличивает массу до \(2\) в ночь \(1\).

C. Орак и Game of Life

графы кратчайшие пути поиск в глубину и подобное реализация *2000

Обратите внимание на необычное ограничение по памяти в этой задаче.

Орак любит игры. Недавно он придумал новую игру, «Game of Life».

Вы должны играть в эту игру на черно-белом клетчатом поле из \(n\) строк и \(m\) столбцов. Каждая клетка либо белая, либо черная.

На каждой итерации этой игры (исходная итерация это \(0\)) цвет клетки будет изменяться по следующим правилам:

  • Если на текущей итерации нет соседних клеток с таким же цветом, как и эта клетка, ее цвет на следующей итерации останется прежним.
  • Иначе, ее цвет на следующей итерации будет другим.

Две клетки являются соседними, если у них есть общая сторона.

Орак уже выбрал исходное состояние игры, и он хочет знать для клетки \((i,j)\)\(i\)-й строке и \(j\)-м столбце), чему будет равен ее цвет на итерации \(p\). Он может задавать вам эти вопросы по несколько раз.

Входные данные

В первой строке записано три целых числа \(n,m,t\ (1\le n,m\le 1000, 1\le t\le 100\,000)\), описывающие количество строк и столбцов, и количество запросов Орака.

Каждая из следующих \(n\) строк содержит бинарную строку длины \(m\), \(j\)-й символ в \(i\)-й строке описывает изначальный цвет клетки \((i,j)\). '0' означает белый, '1' означает черный.

Каждая из следующих \(t\) строк содержит три целых числа \(i,j,p\ (1\le i\le n, 1\le j\le m, 1\le p\le 10^{18})\), описывающие запрос Орака.

Выходные данные

Выведите \(t\) строк, в \(i\)-й из которых вы должны вывести ответ на \(i\)-й запрос Орака. Если цвет клетки черный, вы должны вывести '1', иначе, вы должны вывести '0'.

Примечание

В первом примере картинка выше описывает исходну ситуацию и цвета клеток на итерациях \(1\), \(2\), и \(3\). Вы можете увидеть, что цвет клетки \((1,1)\) на итерации \(1\) черный, цвет клетки \((2,2)\) после итерации \(2\) черный, и цвет клетки \((3,3)\) после итерации \(3\) тоже черный.

Во втором примере можно доказать, что клетки никогда не поменяют свой цвет.

A. Замена

жадные алгоритмы реализация сортировки *1300

Маленький Петя очень любит массивы из n целых чисел, каждое из которых лежит в диапазоне от 1 до 109, включительно. Недавно мама подарила ему один такой массив. Пете он сразу не понравился. Он решил выбрать ровно одно число из массива и заменить его на другое целое число, которое также лежит в диапазоне от 1 до 109, включительно. Нельзя менять число само на себя или же не менять ни одного числа вовсе.

После этой замены Петя отсортировал массив по неубыванию. Теперь он хочет узнать, какое наименьшее число могло стоять на каждой позиции после замены и сортировки.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 105) — количество чисел в массиве. Следующая строка содержит n целых чисел, разделенных одним пробелом — описание самого массива. Все элементы массива лежат в диапазоне от 1 до 109, включительно.

Выходные данные

Выведите n целых чисел через пробел — минимальные возможные значения каждого из элементов массива после выполнения одной замены и сортировки.

D. Цикл

Перебор поиск в глубину и подобное реализация *2500

Маленький Петя очень любит прямоугольные таблицы, состоящие из символов «0» и «1». Недавно он получил в подарок от мамы одну такую таблицу с n строками и m столбцами. Строки нумеруются сверху вниз от 1 до n, столбцы нумеруются слева направо от 1 до m. Петя сразу же решил во что бы то ни стало найти в таблице самый длинный крутой цикл.

Циклом называется последовательность попарно различных клеток, в которой каждые две последовательно идущие клетки имеют общую сторону, а также первая клетка имеет общую сторону с последней. Цикл называется крутым, если для него одновременно выполняются все следующие условия:

  • Цикл целиком состоит из клеток, содержащих «1».
  • Каждая клетка, принадлежащая циклу, имеет общую сторону ровно с двумя другими клетками, принадлежащими этому циклу.
  • Каждая клетка таблицы, содержащая «1» либо принадлежит циклу, либо находятся снаружи него (см. определение ниже).

Для формального определения понятия «снаружи», нарисуем цикл на плоскости. Каждой клетке цикла (i, j) (i — номер строки, j — номер столбца) поставим в соответствие точку на плоскости с координатами (i, j). Соединим отрезком прямой каждую пару точек, для которых соответствующие им клетки принадлежат циклу и имеют общую сторону. Таким образом, на плоскости мы получим замкнутую ломаную без самопересечений и самокасаний. Эта ломаная делит плоскость на две связные области: конечной и бесконечной площади. Считается, что клетка (r, c) лежит снаружи цикла, если она не принадлежит циклу и соответствующая ей точка на плоскости с координатами (r, c) лежит в области бесконечной площади.

Помогите Пете найти длину самого длинного крутого цикла в таблице. Длиной цикла называется количество клеток, принадлежащих ему.

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 1000) — количество строк и столбцов в таблице, соответственно. Каждая из следующих n строк содержит по m символов. Каждый символ может быть либо «0», либо «1».

Выходные данные

Выведите одно число — длину самого длинного крутого цикла в таблице. Если таких циклов не существует, выведите 0.

Примечание

В первом примере есть всего один цикл, он же является крутым.

Во втором примере вообще не существует ни одного цикла.

В третьем примере есть два крутых цикла: один длины 12, другой длины 24.

В четвертом примере также есть всего один цикл, но он не является крутым, поскольку существует клетка, содержащая «1», которая находится внутри этого цикла.

C. Лыжник

реализация Структуры данных *1400

Лыжник катается по снежному полю. Его передвижения можно описать строкой из символов 'S', 'N', 'W', 'E' (что соответствует перемещениям на \(1\) метр в направлении юга, севера, запада или востока соответственно).

Известно, что если он прокладывает лыжню (то есть катится по ранее не посещенному отрезку пути), то время такого передвижения равно \(5\) секунд, а если он катится по лыжне, то \(1\) секунду.

Найдите время лыжника в пути.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют \(t\) наборов входных данных.

Каждый набор задан одной непустой строкой из символов 'S', 'N', 'W', 'E'. Длина строки не превосходит \(10^5\) символов.

Сумма длин \(t\) строк по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите искомое время прохождения пути в секундах.

E. Особые элементы

Перебор реализация *1500

Обратите внимание на нестандартное ограничение по памяти в этой задаче.

С целью отсечения эффективных решений от неэффективных в этой задаче ограничение времени довольно строгое. Предпочтите использование компилируемых статически типизированных языков (например, C++). Если используете Python, то отсылайте решения на PyPy. Постарайтесь написать в самом деле эффективное решение.

Задан массив \(a=[a_1, a_2, \ldots, a_n]\) (\(1 \le a_i \le n\)). Его элемент \(a_i\) называется особым, если существует такая пара индексов \(l\) и \(r\) (\(1 \le l < r \le n\)), что \(a_i = a_l + a_{l+1} + \ldots + a_r\). Иными словами, элемент называется особым, если он представим в виде суммы двух или более подряд идущих элементов массива (не важно, особых или нет).

Выведите количество особых элементов заданного массива \(a\).

Например, если \(n=9\) и \(a=[3,1,4,1,5,9,2,6,5]\), то ответ равен \(5\):

  • \(a_3=4\) — особый элемент, так как \(a_3=4=a_1+a_2=3+1\);
  • \(a_5=5\) — особый элемент, так как \(a_5=5=a_2+a_3=1+4\);
  • \(a_6=9\) — особый элемент, так как \(a_6=9=a_1+a_2+a_3+a_4=3+1+4+1\);
  • \(a_8=6\) — особый элемент, так как \(a_8=6=a_2+a_3+a_4=1+4+1\);
  • \(a_9=5\) — особый элемент, так как \(a_9=5=a_2+a_3=1+4\).

Обратите внимание, что среди элементов массива \(a\) могут быть равные — если несколько элементов равны и являются особыми, то все они должны быть посчитаны в ответе.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных.

Каждый набор задается двумя строками. В первой строке записано целое число \(n\) (\(1 \le n \le 8000\)) — длина массива \(a\). Во второй строке записаны целые числа \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(8000\).

Выходные данные

Выведите \(t\) чисел — количества особых элементов для каждого из заданных массивов.

B. Троичная строка

Бинарный поиск дп реализация *1200

Вам дана строка \(s\), каждый символ которой — 1, 2 или 3. Вы должны выбрать кратчайшую непрерывную подстроку \(s\), в которой каждый из трех символов встречается хотя бы один раз.

Непрерывная подстрока \(s\) — строка, которую можно получить из \(s\) удалением какого-то количества (возможно, ни одного) символов из начала строки \(s\) и какого-то количества (возможно, ни одного) символов из конца строки \(s\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 20000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки \(s\) (\(1 \le |s| \le 200000\)). Гарантируется, что каждый символ \(s\)1, 2 или 3.

Сумма длин всех строк не превосходит \(200000\).

Выходные данные

Для каждого набора тестовых данных выведите одно число — длину кратчайшей подстроки \(s\), содержащей символы всех трех типов. Если такой подстроки нет, выведите \(0\).

Примечание

Рассмотрим пример из условия:

В первом наборе входных данных можно использовать подстроку 123.

Во втором наборе входных данных можно использовать подстроку 213.

В третьем наборе входных данных можно использовать подстроку 1223.

В четвертом наборе входных данных можно использовать подстроку 3221.

В пятом наборе входных данных в \(s\) нету символа 3.

В шестом наборе входных данных в \(s\) нету символа 1.

В седьмом наборе входных данных можно использовать подстроку 3112.

A. Последовательность с цифрами

математика Перебор реализация *1200

Определим рекуррентную последовательность следующим образом: \(\)a_{n+1} = a_{n} + minDigit(a_{n}) \cdot maxDigit(a_{n}).\(\)

Здесь \(minDigit(x)\) и \(maxDigit(x)\) — минимальная и максимальная цифры в десятичной записи числа \(x\) без ведущих нулей соответственно. Для примеров обратитесь к примечаниям.

Ваша задача — по заданным \(a_{1}\) и \(K\) вычислить \(a_{K}\).

Входные данные

В первой строке записано единственное число \(t\) (\(1 \le t \le 1000\)) — количество независимых наборов входных данных.

Каждый набор входных данных состоит из двух целых чисел \(a_{1}\) и \(K\) (\(1 \le a_{1} \le 10^{18}\), \(1 \le K \le 10^{16}\)), записанных через пробел на отдельной строке.

Выходные данные

Для каждого набора входных данных выведите одно число \(a_{K}\) на отдельной строке.

Примечание

\(a_{1} = 487\)

\(a_{2} = a_{1} + minDigit(a_{1}) \cdot maxDigit(a_{1}) = 487 + \min (4, 8, 7) \cdot \max (4, 8, 7) = 487 + 4 \cdot 8 = 519\)

\(a_{3} = a_{2} + minDigit(a_{2}) \cdot maxDigit(a_{2}) = 519 + \min (5, 1, 9) \cdot \max (5, 1, 9) = 519 + 1 \cdot 9 = 528\)

\(a_{4} = a_{3} + minDigit(a_{3}) \cdot maxDigit(a_{3}) = 528 + \min (5, 2, 8) \cdot \max (5, 2, 8) = 528 + 2 \cdot 8 = 544\)

\(a_{5} = a_{4} + minDigit(a_{4}) \cdot maxDigit(a_{4}) = 544 + \min (5, 4, 4) \cdot \max (5, 4, 4) = 544 + 4 \cdot 5 = 564\)

\(a_{6} = a_{5} + minDigit(a_{5}) \cdot maxDigit(a_{5}) = 564 + \min (5, 6, 4) \cdot \max (5, 6, 4) = 564 + 4 \cdot 6 = 588\)

\(a_{7} = a_{6} + minDigit(a_{6}) \cdot maxDigit(a_{6}) = 588 + \min (5, 8, 8) \cdot \max (5, 8, 8) = 588 + 5 \cdot 8 = 628\)

C. Сосчитайте треугольники

Бинарный поиск математика реализация *1800

Как и у любого неизвестного математика, у Юрия есть любимые числа: \(A\), \(B\), \(C\) и \(D\), причем \(A \leq B \leq C \leq D\). Также Юрий очень любит треугольники, поэтому в один день он задумался: сколько существует невырожденных треугольников с целочисленными длинами сторон \(x\), \(y\) и \(z\) таких, что \(A \leq x \leq B \leq y \leq C \leq z \leq D\)?

Сейчас Юрий очень занят подготовкой задач для очередной олимпиады, поэтому он просит вас помочь посчитать количество интересующих его треугольников.

Треугольник называется невырожденным тогда и только тогда, когда его вершины не лежат на одной прямой.

Входные данные

В единственной строке через пробел записаны четыре целых числа \(A\), \(B\), \(C\) и \(D\) (\(1 \leq A \leq B \leq C \leq D \leq 5 \cdot 10^5\)) — любимые числа Юрия.

Выходные данные

Выведите одно число — количество невырожденных треугольников с целочисленными длинами сторон \(x\), \(y\) и \(z\), для которых выполнено неравенство: \(A \leq x \leq B \leq y \leq C \leq z \leq D\).

Примечание

В первом примере можно составить треугольники со следующими длинами сторон: \((1, 3, 3)\), \((2, 2, 3)\), \((2, 3, 3)\) и \((2, 3, 4)\).

Во втором примере можно составить треугольники: \((1, 2, 2)\), \((2, 2, 2)\) и \((2, 2, 3)\).

В третьем примере можно составить лишь один равносторонний треугольник. Длины всех сторон будут равны \(5 \cdot 10^5\).

D. Лучший отпуск

Бинарный поиск жадные алгоритмы Перебор реализация *1900

Вы давно влюблены в Коронавирус-тян, но до сих пор не знали, где она живёт. И буквально сейчас выяснили, что она живёт в далёком местечке под названием Ньаху.

Вы немедленно решили взять отпуск на своей скучной работы и навестить Коронавирус-тян. Ваш отпуск длится ровно \(x\) дней, и ровно столько дней вы проведёте в гостях у подруги. В гостях вы проведёте ровно \(x\) подряд идущих дней.

В Ньаху используется очень необычный календарь: всего в году \(n\) месяцев, \(i\)-й месяц длится ровно \(d_i\) дней. Дни в \(i\)-м месяце пронумерованы от \(1\) до \(d_i\). В Ньаху нет високосных годов.

Настроение Коронавирус-тян (и, соответственно, её желание вас обнять) зависит от номера дня в месяце. А именно, в \(j\)-й день месяца вы получаете \(j\) объятий, если вы находитесь в гостях у Коронавирус-тян.

Вы знаете об этой особенности своей подруги и хотите спланировать свою поездку так, чтобы суммарно получить наибольшее возможное количество объятий (и тогда, быть может, вы сможете завоевать сердечко Коронавирус-тян).

Обратите внимание, ваша поездка не обязательно должна начаться и закончиться в одном и том же году.

Входные данные

В первой строке входных данных даны два натуральных числа \(n\) и \(x\) (\(1 \le n \le 2 \cdot 10^5\)) — количество месяцев в году и количество дней, которые вы можете провести в гостях у подруги.

Во второй строке даны \(n\) целых чисел \(d_1, d_2, \ldots, d_n\), где \(d_i\) — количество дней в \(i\)-м месяце (\(1 \le d_i \le 10^6\)).

Гарантируется, что \(1 \le x \le d_1 + d_2 + \ldots + d_n\).

Выходные данные

Выведите единственное число — максимальное число объятий, которое вы можете получить от Коронавирус-тян за время лучшего отпуска в своей жизни.

Примечание

В первом примере номера дней года (номера в соответствующих месяцах) имеет вид: \(\{1,1,2,3,1\}\). Коронавирус-тян обнимет вас больше всего раз, если вы приедете в третий день года: \(2+3=5\) объятий.

Во втором примере номера дней года (номера в соответствующих месяцах) имеет вид: \(\{1,2,3,1,2,3,1,2,3\}\). Больше всего объятий вы получите если приедете в третий день года: \(3+1+2+3+1+2=12\) объятий.

В третьем примере номера дней имеют вид: \(\{1,2,3,4,1,2, 1,2,3, 1, 1,2,3\}\). Больше всего объятий вы получите если приедете в двенадцатый день года: подруга обнимет вас \(2+3+1+2+3+4=15\) раз.

E. Вы уволены?

жадные алгоритмы Конструктив реализация Структуры данных *2400

Левиан работает бухгалтером в большой компании. Он знает, сколько компания заработала в каждый из \(n\) подряд идущих месяцев — в \(i\)-й месяц у компании доход был равен \(a_i\) (положительный доход означает прибыль, отрицательный доход означает убыль, нулевой доход означает отсутствие изменений). Из-за всеобщей самоизоляции, первые \(\lceil \tfrac{n}{2} \rceil\) месяцев доход мог быть совершенно нестабилен, но потом всё стабилизировалось и последние \(\lfloor \tfrac{n}{2} \rfloor\) месяцев доход был одинаковый.

Левиан решил, что на совете директоров сообщит \(n-k+1\) число — суммарный доход компании за каждые \(k\) подряд идущих месяцев. Формально, для всех \(i\) от \(1\) до \(n-k+1\) он скажет число \(a_i + a_{i+1} + \ldots + a_{i + k - 1}\). Например, если \(a=[-1, 0, 1, 2, 2]\) и \(k=3\), то он сообщит числа \(0, 3, 5\).

К большому сожалению, если хоть один суммарный доход, сообщаемый Левианом, не является прибылью (то есть доход \(\le 0\)), то начальство разозлится и уволит не справившегося с работой бухгалтера.

Спасите карьеру Левиана: найдите такое число \(k\), что за любые \(k\) подряд идущих месяцев компания получила прибыль или скажите, что это невозможно.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 5\cdot 10^5\)) — количество месяцев, за которые Левиан должен отчитаться.

Вторая строка содержит \(\lceil{\frac{n}{2}}\rceil\) целых чисел \(a_1, a_2, \ldots, a_{\lceil{\frac{n}{2}}\rceil}\), где \(a_i\) (\(-10^9 \le a_i \le 10^9\)) — доход компании в \(i\)-м месяце.

Третья строка содержит одно целое число \(x\) (\(-10^9 \le x \le 10^9\))— доход в каждый месяц с \(\lceil{\frac{n}{2}}\rceil + 1\) до \(n\).

Выходные данные

В единственной строке выведите искомое число \(k\) или \(-1\), если его не существует. Если существует несколько возможных решений, выведите любое из них.

Примечание

В первом примере подходят \(k=2\) и \(k=3\): в первом случае Левиан сообщит числа \(1, 1\) а во втором — одно число \(3\).

Во втором примере ни одно \(k\) не подходит.

В третьем примере ответом является только \(k=4\): он сообщит числа \(1,2,3\).

F. Вкусная печенька

Бинарный поиск жадные алгоритмы Конструктив реализация *2700

О нет!

Вас поймал коронавирус, и теперь вы сидите в тёмном подвале, связанные по ногам (но не по рукам). У вас есть вкусная печенька, а также перед вами стоит ноутбук, и там открыта ваша любимая среда разработки. Коронавирус убеждает вас решить следующую задачу.

Вам дано два массива \(A\) и \(B\) размера \(n\). Вы можете делать операции двух типов с массивом \(A\):

  • Развернуть массив \(A\). То есть массив \([A_1,\ A_2,\ \ldots,\ A_n]\) переходит в \([A_n,\ A_{n-1},\ \ldots,\ A_1]\)
  • Заменить \(A\) на массив его префиксных сумм. То есть массив \([A_1,\ A_2,\ \ldots,\ A_n]\) переходит в \([A_1,\ (A_1+A_2),\ \ldots,\ (A_1+A_2+\ldots+A_n)]\)

Вам нужно понять, можно ли из массива \(A\) получить массив \(B\). Если это можно сделать, то вам придётся восстановить порядок этих операций, минимизировав количество операций второго типа. К счастью, коронавирус сегодня добрый, поэтому он разрешил вам не восстанавливать действия, если минимальное количество операций второго типа превышает \(2\cdot 10^5\). Но коронавирус обижен на вас, поэтому если вы восстанавливаете ответ, то суммарное количество операций не должно превышать \(5\cdot 10^5\).

Решите эту задачу, или коронавирус продлит карантин на пять лет и заставит всю экономику рухнуть!

Входные данные

В первой строке входных данных вводится число \(n\) (\(1\le n \le 2\cdot 10^5\)).

Вторая строка содержит \(n\) целых чисел \(A_1, A_2, \ldots, A_n\) (\(1 \le A_i \le 10 ^ {12}\)).

Третья строка содержит \(n\) целых чисел \(B_1, B_2, \ldots, B_n\) (\(1 \le B_i \le 10 ^ {12}\)).

Выходные данные

Если из массива \(A\) нельзя получить массив \(B\), в единственной строке выведите «IMPOSSIBLE» (без кавычек).

Если минимальное количество операций второго типа превышает \(2\cdot 10^5\), то в первой строке выведите «BIG» (без кавычек). Во второй строке выведите минимальное количество операций второго типа, которые нужно применить, чтобы из массива \(A\) получить \(B\).

Иначе, в первой строке выведите «SMALL» (без кавычек). Во второй строке выведите суммарное количество операций первого и второго типа \(m \le 5\cdot 10^5\) (гарантируется, что в этом случае существует такая последовательность действий). В третьей строке выведите строку длины \(m\), состоящую из символов «R» и «P» (без кавычек):

\(i\)-й символ должен быть равен 'R', если \(i\)-е действие первого типа, и должен быть равен 'P', иначе.

Если таких последовательностей несколько, выведите любую из них.

Вы можете выводить все символы как в нижнем регистре, так и в верхнем.

Примечание

В первом примере массивы \(A\) и \(B\) уже совпадает, поэтому количество нужных операций \(=0\).

Во втором примере надо \(299999\) раз заменить \(A\) на префиксную сумму, а потом развернуть массив. Так как \(299999>2\cdot 10^5\), то восстанавливать ответ не нужно.

В четвёртом примере из массива \(A\) никак нельзя получить \(B\).

B. Новая Театральная площадь

дп жадные алгоритмы Перебор реализация *1000

Возможно, вы помните Театральную площадь из задачи 1A. Сегодня ее покрытие наконец-то заменят.

Площадь все еще является прямоугольником \(n \times m\) метров. Однако, рисунок на ней будет более сложным в этот раз. Пусть \(a_{i,j}\) будет \(j\)-й ячейкой в \(i\)-м ряду покрытия плитками.

Вам задан рисунок покрытия:

  • если \(a_{i,j} = \) «*», то \(j\)-я ячейка в \(i\)-м ряду должна быть черной;
  • если \(a_{i,j} = \) «.», то \(j\)-я ячейка в \(i\)-м ряду должна быть белой.

Черные ячейки уже покрыты. Вам же необходимо покрыть белые ячейки. Существует две опции плиток:

  • \(1 \times 1\) плитки — каждая плитка стоит \(x\) бурлей и покрывает ровно \(1\) ячейку;
  • \(1 \times 2\) плитки — каждая плитка стоит \(y\) бурлей и покрывает ровно \(2\) соседние ячейки в одном ряду. Обратите внимание, что нельзя вращать эти плитки или резать их на плитки \(1 \times 1\).

Вам необходимо покрыть все белые ячейки, никакие две плитки не должны накладываться друг на друга и никакие черные ячейки не должны быть накрыты плитками.

Чему равна наименьшая суммарная цена плиток, которые могут покрыть все белые клетки?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Затем следует описание \(t\) наборов.

В первой строке каждого набора входных данных записаны четыре целых числа \(n\), \(m\), \(x\) и \(y\) (\(1 \le n \le 100\); \(1 \le m \le 1000\); \(1 \le x, y \le 1000\)) — размеры Театральной площади, цена плитки \(1 \times 1\) и цена плитки \(1 \times 2\).

В каждой из следующих \(n\) строк записаны по \(m\) символов. \(j\)-й символ в \(i\)-й строке — это \(a_{i,j}\). Если \(a_{i,j} = \) «*», то \(j\)-я ячейка в \(i\)-м ряду должна быть черной, а если \(a_{i,j} = \) «.», то \(j\)-я ячейка в \(i\)-м ряду должна быть белой.

Гарантируется, что сумма \(n \times m\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — наименьшая суммарная цена плиток, которые могут покрыть все белые клетки, в бурлях.

Примечание

В первом наборе входных данных необходимо использовать одну плитку \(1 \times 1\), несмотря на то, что плитка \(1 \times 2\) дешевле. Поэтому суммарная цена равна \(10\) бурлей.

Во втором наборе можно использовать либо две плитки \(1 \times 1\) и потратить \(20\) бурлей, либо одну плитку \(1 \times 2\) плитку и потратить \(1\) бурль. Второй вариант дешевле, поэтому ответ равен \(1\).

Третий набор показывает, что нельзя поворачивать плитки \(1 \times 2\). Приходится использовать две плитки \(1 \times 1\) с суммарной ценой \(20\).

В четвертом наборе самый дешевый способ — это использовать \(1 \times 1\) плитки повсюду. Итоговая цена — \(6 \cdot 3 = 18\).

D. Очередная очередная задача

дп реализация Структуры данных *2000

Алиса и Боб играют в очередную игру с карточками. На этот раз правила следующие. Перед ними в ряд лежат \(n\) карточек. У \(i\)-й карточки значение \(a_i\).

Сначала Алиса выбирает непустой последовательный отрезок карточек \([l; r]\) (\(l \le r\)). Затем Боб удаляет одну карточку \(j\) из этого отрезка \((l \le j \le r)\). Счет игры равен сумме значений оставшихся на отрезке карточек \((a_l + a_{l + 1} + \dots + a_{j - 1} + a_{j + 1} + \dots + a_{r - 1} + a_r)\). В частности, если Алиса выбрала отрезок с ровно одним элементом, то после того, как Боб удалит единственную карточку, счет будет равен \(0\).

Алиса хочет сделать счет как можно больше. Боб удаляет такую карточку, чтобы счет стал как можно меньше.

Какой отрезок должна выбрать Алиса, чтобы счет был максимально возможным? Выведите максимальный счет.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество карточек.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-30 \le a_i \le 30\)) — значения на карточках.

Выходные данные

Выведите одно целое число — итоговый счет игры.

Примечание

В первом примере Алиса выбирает отрезок \([1;5]\) — весь ряд карточек. Боб удаляет карточку \(3\) со значением \(10\) из этого отрезка. Поэтому итоговый счет равен \(5 + (-2) + (-1) + 4 = 6\).

Во втором примере Алиса выбирает отрезок \([1;4]\), и так как Боб удаляет либо карточку \(1\), либо \(3\), со значением \(5\), то ответ становится \(5 + 2 + 3 = 10\).

В третьем примере Алиса может выбрать любой из отрезков длины \(1\): \([1;1]\), \([2;2]\) или \([3;3]\). Боб удаляет единственную карточку, поэтому счет равен \(0\). Если Алиса выберет любой другой отрезок, то ответ будет меньше \(0\).

A. Подарки

реализация *800

Маленький Петя очень любит подарки. Недавно мама подарила ему новый ноутбук на Новый Год. Он тут же решил передарить его кому-то еще, ведь что может быть приятнее, чем дарить кому-то подарок. По этому случаю он организовал новогоднюю вечеринку у себя дома и пригласил туда n своих друзей.

Больше чем самому дарить подарки Петя любит только смотреть, как другие дарят подарки кому-либо. Так что ноутбук он припрятал до следующего Нового Года, а сам решил понаблюдать за процессом обмена подарками между своими друзьями, оставаясь в стороне. Он пронумеровал всех своих друзей целыми числами от 1 до n. Петя запомнил, что друг с номером i подарил подарок другу с номером pi. Он также запомнил, что каждому из его друзей достался ровно один подарок.

Теперь для каждого друга i Петя хочет узнать номер друга, который подарил ему подарок.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100) — количество приглашенных на вечеринку друзей Пети. Во второй строке записаны n целых чисел через пробел: i-ое число задает pi — номер друга, которому подарил подарок друг с номером i. Гарантируется, что каждый друг получил ровно один подарок. Возможно, что некоторые друзья не разделяют мнения Пети о приятности дарения подарков другим, а поэтому подарили подарок сами себе.

Выходные данные

Выведите n целых чисел, разделенных пробелом: i-ое число должно быть равно номеру друга, от которого получил подарок друг с номером i.

B. Тернарная логика

математика реализация *1100

Маленький Петя очень любит компьютеры. Недавно мама подарила ему новый «Ternatron IV». В отличие от остальных современных компьютеров, «Ternatron IV» использует не бинарную, а тернарную логику. Петю сразу же заинтересовало то, как же на нем реализована операция xor (и есть ли вообще что-то похожее).

Оказалось, что она есть (правда, называется эта операция tor) и устроена следующим образом. Пусть мы хотим посчитать значение выражения a tor b. Оба числа a и b записываются в троичной системе счисления одно под другим (b под a). Если количество разрядов в них различно, то к более короткому числу дописываются ведущие нули, пока длины не уравняются. Затем происходит сложение цифр в каждом разряде, результат каждого сложения берется по модулю 3. Заметим, что перенос разрядов при таком сложении не производится. Например: 1410 tor 5010 = 01123 tor 12123 = 10213 = 3410.

Петя записал на бумажке числа a и c. Помогите ему найти такое число b, что a tor b = c. Если таких чисел несколько, выведите наименьшее.

Входные данные

В первой строке записаны два целых числа a и c (0 ≤ a, c ≤ 109). Оба числа записаны в десятичной системе счисления.

Выходные данные

Выведите одно целое число b, такое что a tor b = c. Если возможных чисел b несколько, выведите наименьшее из них. Число следует выводить в десятичной системе счисления.

E. Полигон

графы дп кратчайшие пути реализация *1300

Полигон — это не только лучшая платформа для разработки задач, но и квадратная матрица со стороной \(n\), изначально состоящая из нулей.

На полигоне проводятся боевые учения. Поэтому над каждой клеткой в первой строке и слева от каждой клетки первого столбца находится пушка. Таким образом, всего есть \(2n\) пушек.

Изначальный полигон для \(n=4\).

Пушки стреляют единицами. В один момент времени стреляет не больше одной пушки. Когда единица вылетает из пушки, то она летит вперед, по направлению выстрела, до тех пор, пока не столкнется с границей полигона или другой единицей. После этого она занимает клетку, в которой находилась перед столкновением, и остается там. Изучите примеры для лучшего понимания.

Более формально:

  • если пушка, стоящая в строке \(i\) перед первым столбцом, стреляет единицей, то единица начинает свой полет из клетки (\(i, 1\)) и заканчивает в какой-то клетке (\(i, j\));
  • если пушка, стоящая в столбце \(j\) над первой строкой, стреляет единицей, то единица начинает свой полет из клетки (\(1, j\)) и заканчивает в какой-то клетке (\(i, j\)).

Например, рассмотрим следующую последовательность выстрелов:

1. Стреляет пушка в строке \(2\).                         2. Стреляет пушка в строке \(2\).                         3. Стреляет пушка в столбце \(3\).

У вас на столе лежит отчет с проведенных учений. Этот отчет является квадратной матрицей с длиной стороны \(n\), состоящей из нулей и единиц. Вам интересно, действительно ли произошли учения. Другими словами, существует ли такая последовательность выстрелов, что в конце получится заданная матрица?

Каждая пушка может сделать произвольное количество выстрелов. Перед началом учений полигон состоит из нулей.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов тестовых данных в тесте. Далее следуют \(t\) наборов тестовых данных.

Каждый набор начинается со строки, в которой записано целое число \(n\) (\(1 \le n \le 50\)) — размер полигона.

Далее следуют \(n\) строк длины \(n\), состоящих из нулей и единиц — матрица полигона после проведения учений.

Суммарная площадь матриц во всех наборах тестовых данных в одном тесте не превосходит \(10^5\).

Выходные данные

Для каждого набора тестовых данных выведите:

  • YES, если существует последовательность выстрелов, приводящая к заданной матрице;
  • NO, если такой последовательности не существует.

Буквы в словах YES и NO можно выводить в любом регистре.

Примечание

Первый набор тестовых данных примера разобран в условии.

Ответ на второй набор NO, так как, вылетев из любой пушки, единица в клетке (\(1, 1\)) продолжила бы свой полет дальше.

B. Джонни и гроссмейстер

жадные алгоритмы математика реализация сортировки *1900

Джонни недавно нашел новый отличный туториал: «Как стать гроссмейстером?». В туториале говорится много странных и неожиданных для Джонни вещей, таких как то, что он должен быть терпеливым или что очень важно решать много все более и более сложных задач.

Мальчик нашел онлайн архив с задачами, разделенными по темам. Он выбрал \(p^{k_i}\) задач из \(i\)-й категории (\(p\) — его любимое число). Он хочет решить все эти задачи за две недели (терпение еще слишком сложно для Джонни, поэтому он смотрит только на простые задачи, которые могут быть решены за такой период). Теперь наш будущий гроссмейстер должен решить, какие темы покрыть на первой неделе, а какие на второй. Помогите ему распределить темы таким образом, чтобы нагрузка была равномерной.

Формально, дано \(n\) чисел \(p^{k_i}\), мальчик хочет разделить их на два непересекающихся набора, минимизировав разность между суммами чисел в наборах. Найдите минимальное значение модуля такой разности. Выведите остаток от деления результата на \(10^{9}+7\).

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) \((1 \leq t \leq 10^5)\) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(p\) \((1 \leq n, p \leq 10^6)\). Вторая строка содержит \(n\) целых чисел \(k_i\) \((0 \leq k_i \leq 10^6)\).

Сумма \(n\) по всем наборам входных данных не превышает \(10^6\).

Выходные данные

Выведите одно целое число — остаток от деления ответа на \(1\,000\,000\,007\).

Примечание

Вы должны минимизировать модуль разности, а не остаток модуля разности. Например, если минимальная разность равна \(2\), но существует также разбиение, при котором разность равна \(10^9 + 8\), ответ равен \(2\), а не \(1\).

В первом наборе входных данных числа равны: \(4\), \(8\), \(16\), \(16\) и \(8\). Мы можем разделить их на два набора: \({4, 8, 16}\) и \({8, 16}\). Тогда модуль разности между суммами чисел в наборах будет равен \(4\).

D. Джонни и Джеймс

Деревья жадные алгоритмы математика реализация *2900

У Джеймса Бонда, любимого секретного агента Джонни, новая миссия. Есть \(n\) вражеских баз, каждая из которых задана своими координатами, так что мы можем рассматривать их как точки на плоскости.

Базы могут общаться друг с другом, посылая сигнал, который является лучом, из выбранной точки в направлении начала координат или в противоположном направлении. Исключением является центральная база, расположенная в начале координат. Она может посылать сигнал в любом направлении.

Когда какие-то две базы хотят коммуницировать, существует два возможных сценария. Если они лежат на одной прямой с началом координат, одна из них посылает сигнал непосредственно второй. Иначе, из первой базы сигнал посылается на центральную, и оттуда — на вторую. Обозначим расстоянием между двумя базами суммарное Евклидово расстояние, которое сигнал, посланный между ними, должен пройти.

Бонд может повредить все, кроме некоторых \(k\) баз, которые он может выбрать на свое усмотрение. Поврежденная база не может посылать или получать сигнал напрямую, но все еще может передавать его между двумя работающими базами. В частности, Джеймс может повредить центральную базу, и сигнал все еще может быть послан между любыми двумя неповрежденными базами, как и раньше, и расстояние между ними останется неизменным. Какова максимальная сумма расстояний между всеми парами оставшихся баз, которую 007 может достичь, уничтожив ровно \(n - k\) баз?

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) \((2 \leq k \leq n \leq 5 \cdot 10^5)\) — количество баз и количество баз, которое должно остаться, соответственно.

Каждая из следующих \(n\) строк содержит два целых числа \(x\) и \(y\) \((-10^9 \leq x, y \leq 10^9)\), \(i\)-я строка содержит координаты \(i\)-й базы. Гарантируется, что никакие две точки не совпадают и что одна из точек равна \((0, 0)\).

Выходные данные

Вы должны вывести одно число — максимальную возможную сумму расстояний между всеми парами некоторых \(k\) из баз. Ваш ответ будет считаться правильным, если его абсолютная или относительная погрешность не превышает \(10^{-6}\).

Примечание

В первом примере, в оптимальном решении Бонд не разрушает базы с номерами \(4\) и \(6\) (помечены оранжевым):

Следующая иллюстрация показывает оптимальное решение для второго примера. Следующие базы не разрушены: \(2\), \(3\), \(4\), \(5\), \(6\) (помечены оранжевым).

Оптимальное решение для третьего теста изображено на иллюстрации. Только базы с номерами \(3\), \(4\) и \(5\) разрушены. Снова, не разрушенные базы помечены оранжевым.

F. Джонни и новая игрушка

математика реализация Структуры данных *3300

У Джонни новая игрушка. Как вы можете догадаться, она немного необычная. Игрушка является перестановкой \(P\) чисел от \(1\) до \(n\), записанных в строку друг за другом.

Для каждого \(i\) от \(1\) до \(n - 1\), между \(P_i\) и \(P_{i + 1}\) написан вес \(W_i\), и эти веса также образуют перестановку чисел от \(1\) до \(n - 1\). Дополнительно есть веса \(W_0 = W_n = 0\).

Инструкция гласит, что отрезок \([L, R]\) является хорошим, если \(W_{L - 1} < W_i\) и \(W_R < W_i\) для всех \(i\) из \(\{L, L + 1, \ldots, R - 1\}\). Для такого отрезка она также определяет \(W_M\) как минимум из множества \(\{W_L, W_{L + 1}, \ldots, W_{R - 1}\}\).

Теперь начинается веселье. За один ход, игрок может выбрать один из хороших подотрезков, разрезать на \([L, M]\) и \([M + 1, R]\) и поменять местами эти части. Более точно, до операции выбранный подотрезок игрушки выглядел следующим образом: \(\)W_{L - 1}, P_L, W_L, \ldots, W_{M - 1}, P_M, W_M, P_{M + 1}, W_{M + 1}, \ldots, W_{R - 1}, P_R, W_R\(\) А после, он стал выглядеть так: \(\)W_{L - 1}, P_{M + 1}, W_{M + 1}, \ldots, W_{R - 1}, P_R, W_M, P_L, W_L, \ldots, W_{M - 1}, P_M, W_R\(\)

Такая операция может быть выполнена несколько раз (возможно, ноль), и целью является получить минимальное возможное количество инверсий в \(P\).

Младшая сестра Джонни, Меган, считает, что правила слишком запутанные, поэтому она хочет проверить своего брата, выбирая некоторые пары индексов \(X\) и \(Y\), и меняя местами \(P_X\) и \(P_Y\) (\(X\) может быть равно \(Y\)). После каждого действия сестры, Джонни интересуется, какого минимального количества инверсий можно достичь, начиная с текущего \(P\) и делая корректные действия?

Вы можете считать, что входные данные были сгенерированы случайно. \(P\) и \(W\) были выбраны случайно и равновероятно среди всех перестановок, а запросы Меган были выбраны случайно и равновероятно среди всех пар индексов.

Входные данные

Первая строка содержит одно целое число \(n\) \((2 \leq n \leq 2 \cdot 10^5)\), обозначающее длину игрушки.

Вторая строка содержит \(n\) различных целых чисел \(P_1, P_2, \ldots, P_n\) \((1 \leq P_i \leq n)\), обозначающих исходную перестановку \(P\). Третья строка содержит \(n - 1\) различных целых чисел \(W_1, W_2, \ldots, W_{n - 1}\) \((1 \leq W_i \leq n - 1)\), обозначающих веса.

Четвертая строка содержит одно целое число \(q\) \((1 \leq q \leq 5 \cdot 10^4)\) — количество действий Меган. Следующие \(q\) строк содержат по два целых числа \(X\) и \(Y\) \((1 \leq X, Y \leq n)\) — индексы элементов \(P\), меняющихся местами. Запросы не независимы, после каждого из них перестановка меняется.

Выходные данные

Выведите \(q\) строк. Строка номер \(i\) должна содержать одно целое число — минимальное количество инверсий в перестановке, которое может быть получено, если начинать с \(P\) после первых \(i\) запросов и выполнять операции, описанные в инструкции.

Примечание

Рассмотрим первый пример. После первого запроса, \(P\) отсортирована, поэтому мы уже получили перестановку без инверсий.

После второго запроса, \(P\) равна [\(1\), \(3\), \(2\)], в ней есть одна инверсия, и можно доказать, что получить \(0\) инверсий невозможно.

В конце, \(P\) равна [\(2\), \(3\), \(1\)]. Мы можем выбрать всю перестановку в качестве хорошего подотрезка, после чего \(P\) станет равным [\(1\), \(2\), \(3\)], в котором \(0\) инверсий.

A. Джонни и древний компьютер

реализация *1000

Недавно Джонни обнаружил древний сломанный компьютер. У него есть только один регистр, в который можно записать некоторое значение. После чего, за одну операцию вы можете применить к значению битовый сдвиг влево или вправо на не более чем три позиции. Сдвиг вправо запрещен, если в результате будут потеряны единичные биты. Так что, на самом деле, за одну операцию вы можете умножить или разделить значение на \(2\), \(4\) или \(8\), и деление разрешено только если значение делится нацело на выбранный делитель.

Формально, если регистр содержит целое положительное число \(x\), за одну операцию оно может быть заменено одним из следующих:

  • \(x \cdot 2\)
  • \(x \cdot 4\)
  • \(x \cdot 8\)
  • \(x / 2\), если \(x\) делится на \(2\)
  • \(x / 4\), если \(x\) делится на \(4\)
  • \(x / 8\), если \(x\) делится на \(8\)

Например, если \(x = 6\), за одну операцию оно может быть заменено на \(12\), \(24\), \(48\) или \(3\). Значение \(6\) не делится на \(4\) или \(8\), поэтому существуют только четыре варианта замены.

Теперь Джонни интересуется, какое минимальное количество операций необходимо, если он запишет в регистр значение \(a\) и в конце хочет получить там значение \(b\).

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Следующие \(t\) строк содержат описание наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит целые числа \(a\) и \(b\) (\(1 \leq a, b \leq 10^{18}\)) — исходное значение и желаемое итоговое значение, соответственно.

Выходные данные

Выведите \(t\) строк, каждая строка должна содержать одно целое число, обозначающее минимальное количество операций, которое Джонни должен выполнить. Если Джонни не сможет получить значение \(b\) в конце, выведите \(-1\).

Примечание

В первом наборе входных данных, Джонни может получить \(5\) из \(10\) сделав один сдвиг вправо на один (т.е. поделив на \(2\)).

Во втором наборе входных данных, Джонни может получить \(44\) из \(11\) сделав один сдвиг влево на два (т.е. умножив на \(4\)).

В третьем наборе входных данных, Джонни не может получить значение \(21\) из значения \(17\).

В четвертом наборе входных данных, исходное и желаемое значения совпадают, поэтому Джонни придется сделать \(0\) операций.

В пятом наборе входных данных, Джонни может получить \(3\) из \(96\) сделав два сдвига вправо: один на \(2\), и другой на \(3\) (т.е. поделив на \(4\) и \(8\)).

A. Выбор нечетных

математика Перебор реализация *1200

У Shubham есть массив \(a\) размера \(n\), и он хочет выбрать из него ровно \(x\) элементов так, чтобы их сумма была нечетной. Эти элементы не обязаны быть последовательными. Элементы массива не обязательно различны.

Скажите ему, может ли он сделать это.

Входные данные

В первой строке входных данных содержится одно целое число \(t\) \((1\le t \le 100)\) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) \((1 \le x \le n \le 1000)\) — длину массива и количество элементов, которые нужно выбрать соответственно.

Следующая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) \((1 \le a_i \le 1000)\) — элементы массива.

Выходные данные

Для каждого набора входных данных выведите «Yes» или «No» в зависимости от того, можно ли выбрать ровно \(x\) элементов, чтобы их сумма была нечетной.

Вы можете выводить буквы в любом регистре.

Примечание

В \(1\)-м наборе входных данных: мы должны выбрать элемент \(999\), и сумма будет нечетной.

В \(2\)-м наборе входных данных: мы должны выбрать элемент \(1000\), поэтому сумма не будет нечетной.

В \(3\)-м наборе входных данных: мы можем выбрать элемент \(51\).

В \(4\)-м наборе входных данных: мы должны выбрать оба элемента \(50\) и \(51\) — так что общая сумма нечетна.

В \(5\)-м наборе входных данных: мы должны выбрать все элементы — но общая сумма не является нечетной.

B. Ненависть к подпоследовальностям

реализация Строки *1400

У Shubham есть бинарная строка \(s\). Бинарная строка  — это строка, содержащая только символы «0» и «1».

Он может выполнить следующую операцию над строкой любое количество раз:

  • Выбрать индекс строки, и поменять символ с этим индексом. Это означает, что если символ был «0», он становится «1», и наоборот.

Строка называется хорошей, если она не содержит строк «010» или «101» в качестве подпоследовательностей  — например, «1001» содержит «101» как подпоследовательность, следовательно, это не хорошая строка, а «1000» не содержит ни «010» ни «101» как подпоследовательностей, поэтому это хорошая строка.

Какое минимальное количество операций ему придется выполнить, чтобы строка стала хорошей? Можно показать, что с помощью данных операций можно сделать любую строку хорошей.

Строка \(a\) является подпоследовательностью строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов.

Входные данные

В первой строке входных данных содержится одно целое число \(t\) \((1\le t \le 100)\) — количество наборов входных данных.

Каждая из следующих \(t\) строк содержит бинарную строку \(s\) \((1 \le |s| \le 1000)\).

Выходные данные

Для каждой строки выведите минимальное количество операций необходимых для того, чтобы сделать ее хорошей.

Примечание

В наборах входных данных \(1\), \(2\), \(5\), \(6\) строки уже являются хорошими  — поэтому никаких операций не требуется.

Для набора \(3\): «001» можно получить, поменяв первый символ, и это один из возможных способов получить хорошую строку.

Для набора \(4\): «000» можно получить, поменяв второй символ, и это один из возможных способов получить хорошую строку.

Для набора \(7\): «000000» можно получить, поменяв третий и четвертый символы, и это один из возможных способов получить хорошую строку.

D. Найдите максимумы

Бинарный поиск интерактив математика реализация *2100

Это интерактивная задача.

Ayush устал запоминать пароль от своего замка и разработал новую схему для установки своего пароля. У замка есть \(k\) позиций, где каждая позиция может содержать целые числа от \(1\) до \(n\). Пароль \(P\) представляет собой последовательность из \(k\) целых чисел, каждое из которых находится в диапазоне \([1, n]\), \(i\)-й элемент которой входит в \(i\)-ю позицию замка.

Чтобы установить пароль для своего замка, Ayush придумывает массив \(A\) из \(n\) целых чисел в диапазоне \([1, n]\) (не обязательно различных). Затем он выбирает \(k\) непустых попарно непересекающихся подмножеств индексов \(S_1, S_2, ..., S_k\) \((S_i \underset{i \neq j} \cap S_j = \emptyset)\) и устанавливает свой пароль как \(P_i = \max\limits_{j \notin S_i} A[j]\). Другими словами, \(i\)-я позиция пароля равна максимуму по всем элементам \(A\), индексы которых не принадлежат \(S_i\).

Вам даны подмножества индексов, выбранных Ayush. Вам нужно угадать пароль. Чтобы сделать запрос, вы можете выбрать непустое подмножество индексов массива и узнать максимум по всем элементам массива с индексами в этом подмножестве. Вы можете задать не более 12 запросов.

Входные данные

В первой строке содержится одно целое число \(t\) \((1 \leq t \leq 10)\) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа: \(n\) и \(k\) \((2 \leq n \leq 1000, 1 \leq k \leq n)\) — размер массива и количество подмножеств соответственно. Далее следуют \(k\) строк. \(i\)-я строка содержит целое число \(c\) \((1 \leq c \lt n)\) — размер подмножества \(S_i\), за которым следуют \(c\) попарно различных целых чисел в диапазоне \([1, n]\) — индексы, принадлежащие подмножеству \(S_i\).

Гарантируется, что пересечение любых двух подмножеств пусто.

Протокол взаимодействия

Чтобы задать запрос, выведите одну строку:

  • В начале выведите "? c" (без кавычек), где \(c\) \((1 \leq c \leq n)\) обозначает размер подмножества запрашиваемых индексов, после чего выведите через пробел \(c\) различных целых чисел в диапазоне \([1, n]\)  — индексы, о которых вы хотите задать запрос.

Для каждого запроса вы получите целое число \(x\) — максимальное значение в массиве среди элементов с запрошенными индексами. Если подмножество запрашиваемых индексов недопустимо или вы превысили количество запросов (например, один из индексов больше, чем \(n\)), то вы получите \(x = -1\). В этом случае вы должны немедленно прекратить программу.

Когда вы угадали пароль, выведите одну строку "!" (Без кавычек), за которой через пробел следуют \(k\) целых чисел  — позиции пароля.

Угадывание пароля не учитывается при подсчете количества запросов.

После этого вы должны прочитать строку. Если вы угадаете пароль правильно, вы получите строку "Correct". В этом случае вам следует продолжить решение оставшихся наборов входных данных. Если предполагаемый пароль неверен, вы получите строку "Incorrect". В этом случае вы должны немедленно прекратить программу.

Интерактор не адаптивный. Массив \(A\) не изменяется с запросами.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Формат взломов

Чтобы взломать решение, используйте следующий формат взломов:

В первой строке должно содержаться одно целое число \(t\) \((1 \leq t \leq 10)\) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать два целых числа: \(n\) и \(k\) \((2 \leq n \leq 1000, 1 \leq k \leq n)\) — размер массива и количество подмножеств соответственно. Следующая строка должна состоять из \(n\) целых чисел в диапазоне \([1, n]\) — массива \(A\). Далее должны следовать \(k\) строк. \(i\)-я строка должна содержать целое число \(c\) \((1 \leq c \lt n)\) — размер подмножества \(S_i\), за которым должны следовать \(c\) различных целых чисел в диапазоне \([1, n]\) — индексы, принадлежащие подмножеству \(S_i\).

Пересечение любых двух подмножеств должно быть пустым.

Примечание

Массив \(A\) в примере равен \([1, 2, 3, 4]\). Длина пароля составляет \(2\). Первый элемент пароля  — это максимум из \(A[2]\), \(A[4]\) (поскольку первое подмножество содержит индексы \(1\) и \(3\), мы берем максимум по остальным индексам). Второй элемент пароля  — это максимум из \(A[1]\), \(A[3]\) (поскольку второе подмножество содержит индексы \(2\), \(4\)).

Не забудьте считать строку "Correct" / "Incorrect" после угадывания пароля.

D. Последнее следствие Ехаба

графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное реализация *2100

Для связного неориентированного графа с \(n\) вершинами и целого числа \(k\), вы должны, на ваш выбор:

  • или найти независимое множество с ровно \(\lceil\frac{k}{2}\rceil\) вершинами.
  • или найти простой цикл длины не более \(k\).

Независимое множество  — это набор вершин такой, что никакие две из них не связаны ребром. Простой цикл  — это цикл, который не содержит ни одной вершины дважды.

У меня есть доказательство, что для любых входных данных вы всегда можете решить по крайней мере одну из этих задач, но оно слишком тривиально, чтобы поместиться здесь.

Входные данные

Первая строка содержит три целых числа \(n\), \(m\), and \(k\) (\(3 \le k \le n \le 10^5\), \(n-1 \le m \le 2 \cdot 10^5\)) — количество вершин и ребер в графе и параметр \(k\) из условия.

Каждая из следующих \(m\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u,v \le n\)), которые обозначают, что между вершинами \(u\) и \(v\) есть ребро. Гарантируется, что граф связен и не содержит петель или кратных ребер.

Выходные данные

Если вы решили решить первую задачу, то в первой строке выведите \(1\), а затем строку, содержащую \(\lceil\frac{k}{2}\rceil\) различных целых чисел, не превышающих \(n\)  — вершины в желаемом независимом наборе.

Если же вы решили решить вторую задачу, то в первой строке выведите \(2\), затем строку, содержащую одно целое число, \(c\), представляющее длину найденного цикла, а затем строку, содержащую \(c\) различных целых чисел, не превышающих \(n\) — вершины в нужном цикле, в порядке их появления в цикле.

Примечание

В первом примере:

Обратите внимание, что вывод независимого множества \(\{2,4\}\) тоже зачтется, но вывод цикла \(1-2-3-4\) — нет, потому что его длина должна быть не более \(3\).

Во втором примере:

Обратите внимание, что вывод независимого множества \(\{1,3\}\) или цикла \(2-1-4\) также зачтутся.

В третьем примере:

В четвертом примере:

A. Игра с таблицей

жадные алгоритмы игры реализация *1100

Ashish и Vivek играют в игру на таблице с \(n\) строками и \(m\) столбцами, захватывая клетки. Незахваченные клетки обозначены \(0\), а захваченные клетки обозначены \(1\). Вам дано исходное состояние таблицы.

На каждом ходу, игрок должен захватить одну клетку. Клетку можно захватить, если она еще не захвачена, и она не находится в одной строке или столбце с другой захваченной клеткой. Игра кончается, когда игрок не может сделать ход, в таком случае, он проигрывает.

Если Ashish и Vivek ходят по очереди и Ashish ходит первым, найдите победителя игры если они оба играют оптимально.

Оптимальная игра между двумя игроками означает, что оба игрока выбирают лучшую возможную стратегию, чтобы получить наиболее благоприятный для себя результат игры.

Входные данные

В первой строке записано одно целое число \(t\) \((1 \le t \le 50)\) — количество наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\), \(m\) \((1 \le n, m \le 50)\) — количество строк и столбцов в таблице.

В каждой из следующих \(n\) строк записаны \(m\) целых чисел, \(j\)-е число на \(i\)-й строке описывает \(a_{i,j}\) \((a_{i,j} \in \{0, 1\})\).

Выходные данные

Для каждого набора входных данных, если Ashish выиграет при правильной игре, выведите «Ashish», иначе выведите «Vivek» (без кавычек).

Примечание

В первом наборе входных данных: Один из возможных исходов игры следующий: Ashish захватывает клетку \((1, 1)\), затем Vivek захватывает клетку \((2, 2)\). Ashish не может захватить ни клетку \((1, 2)\), ни клетку \((2, 1)\), так как клетки \((1, 1)\) и \((2, 2)\) уже захвачены. Таким образом, Ashish проигрывает. Можно показать, что вне зависимости от ходов Ashish, Vivek выиграет. Во втором наборе входных данных: Ashish захватывает клетку \((1, 1)\), единственная клетка, которую можно захватить. После этого у Vivek не будет возможных ходов.

В третьем наборе входных данных: Ashish не может сделать ход, поэтому Vivek выиграет.

В четвертом наборе входных данных: Ashish захватывает клетку \((2, 3)\), у Vivek не останется возможных ходов.

B. Проблематичная сортировка

Конструктив реализация *1300

У Ashish есть \(n\) элементов, расположенных по порядку.

Каждый элемент задается двумя целыми числами \(a_i\) — значение элемента и \(b_i\) — тип элемента (есть только два возможных типа: \(0\) и \(1\)). Он хочет отсортировать элементы в порядке неубывания \(a_i\).

Он может совершать следующую операцию произвольное число раз:

  • Выбрать любые два таких элемента \(i\) и \(j\), что \(b_i \ne b_j\) и поменять их местами. Таким образом, он может за ход поменять местами два элемента разных типов.

Скажите ему, может ли он отсортировать массив в порядке неубывания \(a_i\), используя описанные операции.

Входные данные

В первой строке записано одно целое число \(t\) \((1 \le t \le 100)\) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) \((1 \le n \le 500)\) — размеры массивов.

Во второй строке записаны \(n\) целых чисел \(a_i\) \((1 \le a_i \le 10^5)\)  — значение \(i\)-го элемента.

В третьей строке записаны \(n\) целых чисел \(b_i\) \((b_i \in \{0, 1\})\)  — тип \(i\)-го элемента.

Выходные данные

Для каждого набора входных данных, выведите «Yes» или «No» (без кавычек) в зависимости от того, возможно ли отсортировать массив в порядке неубывания значений используя описанные операции.

Вы можете выводить каждый символ в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных: элементы уже находятся в отсортированном порядке.

Во втором наборе входных данных: Ashish сначала может поменять местами элементы на позициях \(1\) и \(2\), затем поменять местами элементы на позициях \(2\) и \(3\).

В четвертом наборе входных данных: Нельзя поменять местами никакие два элемента, так как нет пары \(i\) и \(j\), что \(b_i \ne b_j\). Таким образом, элементы не могут быть отсортированы.

В пятом наборе входных данных: Ashish может поменять местами элементы на позициях \(3\) и \(4\), а затем элементы на позициях \(1\) и \(2\).

C. Соответствия поворотом

жадные алгоритмы Конструктив реализация Структуры данных *1400

После мистического исчезнования Ashish, каждый из его любимых учеников Ishika и Hriday, получил одну половину секретного сообщения. Эти сообщения могут быть описаны перестановками размера \(n\). Назовем их \(a\) и \(b\).

Напомним, что перестановка из \(n\) элементов это последовательность чисел \(a_1, a_2, \ldots, a_n\), в которой каждое число от \(1\) до \(n\) встречается ровно один раз.

Сообщение может быть расшифровано из конфигурации перестановок \(a\) и \(b\), в котором количество совпадающих пар элементов максимально. Пара элементов \(a_i\) и \(b_j\) называется совпадающей, если:

  • \(i = j\), таким образом, у них один и тот же индекс.
  • \(a_i = b_j\)

Его ученикам разрешается совершать следующую операцию произвольное число раз:

  • выбрать число \(k\) и циклически сдвинуть одну из перестановок влево или вправо \(k\) раз.

Циклический сдвиг перестановки \(c\) влево это операция, которая присваивает \(c_1:=c_2, c_2:=c_3, \ldots, c_n:=c_1\) одновременно. Аналогично, циклический сдвиг перестановки \(c\) вправо это операция, которая присваивает \(c_1:=c_n, c_2:=c_1, \ldots, c_n:=c_{n-1}\) одновременно.

Помогите Ishika и Hriday найти наибольшее возможное число совпадающих пар в данных перестановках после применения описанных операций несколько (возможно, ноль) раз.

Входные данные

В первой строке записано одно целое число \(n\) \((1 \le n \le 2 \cdot 10^5)\) — размеры массивов.

Во второй строке записаны \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) \((1 \le a_i \le n)\) — элементы первой перестановки.

В третьей строке записаны \(n\) целых чисел \(b_1\), \(b_2\), ..., \(b_n\) \((1 \le b_i \le n)\) — элементы второй перестановки.

Выходные данные

Выведите наибольшее возможное число совпадающих пар в данных перестановках после применения описанных операций несколько (возможно, ноль) раз.

Примечание

В первом примере можно сдвинуть \(b\) направо на \(k = 1\). Получившиеся перестановки будут \(\{1, 2, 3, 4, 5\}\) и \(\{1, 2, 3, 4, 5\}\).

Во втором примере не требуется совершать никаких операций. По всем возможным сдвигам \(a\) и \(b\), число совпадающих пар не будет превышать \(1\).

В третьем примере можно сдвинуть \(b\) влево на \(k = 1\). Получившиеся перестановки будут \(\{1, 3, 2, 4\}\) и \(\{2, 3, 1, 4\}\). Позиции \(2\) и \(4\) будут являться совпадающей парой. По всем возможным циклическим сдвигам \(a\) и \(b\), количество совпадающих пар не будет превышать \(2\).

D. Решить лабиринт

графы жадные алгоритмы Конструктив кратчайшие пути поиск в глубину и подобное реализация снм *1700

Vivek столкнулся с интересной задачей. У него есть лабиринт, который можно описать таблицей \(n \times m\). Каждая клетка может быть одного из следующих типов:

  • Пустая — '.'
  • Стена — '#'
  • Хороший человек  — 'G'
  • Плохой человек — 'B'

Единственный выход из лабиринта находится в клетке \((n, m)\).

Человек может перейти в клетку если она не содержит стену и она имеет общую сторону с его текущей клеткой. Vivek хочет заблокировать (заменить на стены) некоторые пустые клетки, чтобы все хорошие люди могли дойти до выхода из лабиринта, но чтобы все плохие люди не могли. Клетку которая исходно содержит 'G' или 'B' нельзя блокировать, но через нее можно проходить.

Ваша задача  — определить, можно ли заменить несколько (ноль или более) пустых клеток на стены, чтобы удовлетворить описанным ограничениям.

Гарантируется, что клетка \((n,m)\) пустая. Vivek разрешается ее блокировать.

Входные данные

В первой строке записано одно целое число \(t\) \((1 \le t \le 100)\) — количество наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\), \(m\) \((1 \le n, m \le 50)\) — количество строк и столбцов в лабиринте.

В каждой из следующих \(n\) строк записаны \(m\) символов. Они описывают исходный лабиринт. Если символ в строке равен '.', тогда соответствующая клетка пустая, если символ равен '#', тогда клетка содержит стену, а 'G' и 'B' обозначают, что клетка содержит хорошего или плохого человека, соответственно.

Выходные данные

Для каждого набора входных данных, выведите «Yes» или «No», в зависимости от того, можно ли заменить некоторые пустые клетки на стены, чтобы удовлетворить описанным ограничениям.

Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

В первом и во втором наборах входных данных все условия уже выполнены.

В третьем наборе входных данных есть только одна свободная клетка \((2,2)\), и если мы заменим ее на стену, то хороший человек в клетке \((1,2)\) не сможет выйти.

В четвертом наборе входных данных хороший человек в клетке \((1,1)\) не может сбежать с самого начала, поэтому ответ «No».

В пятом наборе входных данных можно заблокировать клетки \((2,3)\) и \((2,2)\).

В последнем наборе входных данных можно заблокировать выход \((2, 2)\).

F. Снова обмены

Конструктив реализация сортировки *2100

Ayush, Ashish и Vivek заняты подготовкой задачи для следующего Codeforces раунда и им нужно помочь проверить тесты на корректность.

Каждый набор входных данных состоит из \(n\) и двух массивов \(a\) и \(b\), длины \(n\). Если после скольки-то (возможно, нуля) операций описанных ниже, массив \(a\) может стать равен массиву \(b\), тест считается корректным. Иначе, он некорректный.

Возможные операции на массиве \(a\) следующие:

  • выберите целое число \(k\) \((1 \le k \le \lfloor\frac{n}{2}\rfloor)\)
  • поменяйте местами префикс длины \(k\) с суффиксом длины \(k\)

Например, если массив \(a\) исходно равен \(\{1, 2, 3, 4, 5, 6\}\), после выполнения операции с \(k = 2\), он превратится в \(\{5, 6, 3, 4, 1, 2\}\).

Вам дано несколько наборов входных данных, помогите определить про каждый из них, корректный он или некорректный.

Входные данные

В первой строке записано одно целое число \(t\) \((1 \le t \le 500)\) — количество наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) \((1 \le n \le 500)\) — размеры массивов.

Во второй строке записаны \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) \((1 \le a_i \le 10^9)\) — элементы массива \(a\).

В третьей строке записаны \(n\) целых чисел \(b_1\), \(b_2\), ..., \(b_n\) \((1 \le b_i \le 10^9)\) — элементы массива \(b\).

Выходные данные

Для каждого набора входных данных, выведите «Yes», если данный ввод корректный. Иначе, выведите «No».

Вы можете выводить все символы в любом регистре.

Примечание

В первом наборе входных данных можно поменять местами префикс \(a[1:1]\) с суффиксом \(a[2:2]\), чтобы получить \(a=[2, 1]\).

Во втором наборе входных данных \(a\) уже равен \(b\).

В третьем наборе входных данных невозможно получить \(3\) в \(a\).

В четвертом наборе входных данных сначала можно поменять местами префикс \(a[1:1]\) с суффиксом \(a[4:4]\), чтобы получить \(a=[2, 2, 3, 1]\). После этого можно поменять местами префикс \(a[1:2]\) с суффиксом \(a[3:4]\), чтобы получить \(a=[3, 1, 2, 2]\).

В пятом наборе входных данных невозможно превратить \(a\) в \(b\).

A. Короткие подстроки

реализация Строки *800

Алиса отгадывает строки, которые загадал ей Боб.

Сначала Боб придумал придумал секретную строку \(a\), состоящую из строчных букв латинского алфавита. Строка \(a\) имеет длину \(2\) или более символов. Затем по строке \(a\) он строит новую строку \(b\) и даёт Алисе строку \(b\), чтобы она могла угадать строку \(a\).

Боб строит \(b\) по \(a\) следующим образом: он выписывает все подстроки длины \(2\) строки \(a\) в порядке слева направо, а потом соединяет их в том же порядке в строку \(b\).

Например, если Боб загадал строку \(a\)abac», то все подстроки длины \(2\) строки \(a\) таковы: «ab», «ba», «ac». Следовательно, строка \(b\)abbaac».

Вам задана строка \(b\). Помогите Алисе определить строку \(a\), которую загадал Боб. Гарантируется, что \(b\) была построена по алгоритму, приведенному выше. Можно доказать, что ответ на задачу единственный.

Входные данные

В первой строке находится одно целое положительное число \(t\) (\(1 \le t \le 1000\)) — количество наборов тестовых данных в тесте. Далее следуют \(t\) наборов тестовых данных.

Каждый набор тестовых данных состоит из одной строки, в которой записана строка \(b\), состоящая из строчных букв латинского алфавита (\(2 \le |b| \le 100\)) — строка, которую загадал Боб, где \(|b|\) — длина строки \(b\). Гарантируется, что \(b\) была построена по алгоритму, приведенному выше.

Выходные данные

Выведите \(t\) ответов на наборы тестовых данных. Каждый ответ — это строка \(a\), состоящая из строчных букв латинского алфавита, которую загадал Боб.

Примечание

Первый набор тестовых данных разобран в условии.

Во втором наборе тестовых данных Боб загадал строку \(a\)ac», строка \(a\) имеет длину \(2\), поэтому строка \(b\) совпадает со строкой \(a\).

В третьем наборе тестовых данных Боб загадал строку \(a\)bcdaf», подстроки длины \(2\) строки \(a\) таковы: «bc», «cd», «da», «af», поэтому строка \(b\)bccddaaf».

D. Задача на доске

жадные алгоритмы Конструктив реализация сортировки *1800

Поликарп написал на доске некоторую строку \(s\) из строчных букв латинского алфавита ('a'-'z'). Эта строка вам известна и задана во входных данных.

После этого он стёр какие-то буквы из строки \(s\), а оставшиеся буквы он переписал в произвольном порядке. В результате он получил некоторую новую строку \(t\). Её вам и предстоит найти по некоторой дополнительной информации.

Предположим, что длина строки \(t\) равна \(m\), а символы пронумерованы слева направо от \(1\) до \(m\). В таком случае вам задана последовательность из \(m\) целых чисел: \(b_1, b_2, \ldots, b_m\), где \(b_i\) равно сумме расстояний \(|i-j|\) от индекса \(i\) до всех таких индексов \(j\), что \(t_j > t_i\) (считайте, что 'a'<'b'<...<'z'). Иными словами, для вычисления \(b_i\) Поликарп находит все такие индексы \(j\), что в индексе \(j\) находится буква, которая стоит позже в алфавите чем \(t_i\), и суммирует все значения \(|i-j|\).

Например, если \(t\)abzb», то:

  • так как \(t_1\)='a', то все остальные индексы содержат буквы, которые позже в алфавите, то есть: \(b_1=|1-2|+|1-3|+|1-4|=1+2+3=6\);
  • так как \(t_2\)='b', то только индекс \(j=3\) содержит букву, которая позже в алфавите, то есть: \(b_2=|2-3|=1\);
  • так как \(t_3\)='z', то индексов \(j\), что \(t_j>t_i\) не существует: \(b_3=0\);
  • так как \(t_4\)='b', то только индекс \(j=3\) содержит букву, которая позже в алфавите, то есть: \(b_4=|4-3|=1\).

Таким образом, если \(t\)abzb», то \(b=[6,1,0,1]\).

По заданной строке \(s\) и массиву \(b\) найдите любую возможную строку \(t\), для которой выполняются следующие два требования одновременно:

  • \(t\) получается из \(s\) путём стирания некоторых букв (возможно, нуля) и потом записи оставшихся в произвольном порядке;
  • по строке \(t\) получается заданный во входных данных массив \(b\), если его построить по правилам, которые описаны выше.
Входные данные

В первой строке записано целое число \(q\) (\(1 \le q \le 100\)) — количество наборов входных данных в тесте. Далее следуют \(q\) наборов входных данных.

Каждый набор входных данных состоит из трех строк:

  • строки \(s\), которая имеет длину от \(1\) до \(50\) и состоит из строчных букв латинского алфавита;
  • строки, которая содержит целое число \(m\) (\(1 \le m \le |s|\)), где \(|s|\) — длина строки \(s\), а \(m\) — длина массива \(b\);
  • строки, которая содержит целые числа \(b_1, b_2, \dots, b_m\) (\(0 \le b_i \le 1225\)).

Гарантируется, что в каждом наборе данных входные данные таковы, что ответ существует.

Выходные данные

Выведите \(q\) строк: \(k\)-я из них должна содержать ответ (строку \(t\)) на \(k\)-й набор входных данных. Гарантируется, что ответ на каждый набор входных данных существует. Если ответов несколько, то выведите любой.

Примечание

В первом наборе входных данных подходят такие строки \(t\): «aac», «aab».

Во втором наборе входных данных подходят такие строки \(t\): «a», «b», «c».

В третьем наборе входных данных подходит только строка \(t\) равная «aba», но символ 'b' может быть со второй или с третьей позиции.

A. C+=

жадные алгоритмы математика Перебор реализация *800

Лео создал новый язык программирования C+=. В C+= целочисленные переменные можно изменять только операцией «+=», которая прибавляет значение справа к переменной слева. Например, если выполнить «a += b», когда a = \(2\), b = \(3\), значение a станет равно \(5\) (значение b при этом не изменится).

Лео создал программу-прототип с двумя целочисленными переменными a и b, исходно содержащими некоторые положительные значения. Он может выполнить некоторое количество операций «a += b» или «b += a». Лео хочет протестировать обработку больших целых чисел, поэтому ему нужно сделать значение a либо b строго больше, чем некоторое данное число \(n\). Какое наименьшее количество операций ему необходимо выполнить?

Входные данные

В первой строке записано одно целое число \(T\) (\(1 \leq T \leq 100\)) — количество наборов входных данных.

Каждая из следующих \(T\) строк описывает один набор входных данных и содержит три целых числа \(a, b, n\) (\(1 \leq a, b \leq n \leq 10^9\)) — исходные значения a и b, и значение, которое одна из переменных должна превысить, соответственно.

Выходные данные

Для каждого набора входных данных выведите наименьшее необходимое количество операций. Разделяйте ответы переводами строк.

Примечание

В первом наборе входных данных мы не сможем за одну операцию записать значение, большее \(3\), ни в какую переменную. Один из способов сделать это за две операции — выполнить «b += a» дважды.

F. Лампочки по кругу

игры интерактив математика реализация *2600

Это интерактивная задача.

Джон и его воображаемый друг играют в игру. По кругу расположено \(n\) лампочек. Лампочки пронумерованы от \(1\) до \(n\) по часовой стрелке, то есть, лампочки \(i\) и \(i + 1\) являются соседними для любого \(i = 1, \ldots, n - 1\), а также соседними являются лампочки \(n\) и \(1\). Исходно все лампочки выключены.

Джон и его друг ходят по очереди, начиная с Джона. Джон в качестве своего действия может завершить игру либо сделать ход. Чтобы сделать ход, Джон выбирает положительное число \(k\) и может включить любые \(k\) лампочек на свой выбор. Его друг в ответ может выбрать любые \(k\) подряд идущих лампочек и выключить их (выбранные лампочки, которые уже были выключены, остаются выключенными), где \(k\) равно числу, которое выбрал Джон на последнем ходу. Например, если \(n = 5\) и Джон только что включил три лампочки, то его друг может выключить лампочки \(1, 2, 3\), или \(2, 3, 4\), или \(3, 4, 5\), или \(4, 5, 1\), или \(5, 1, 2\).

После этого Джон снова может завершить игру или сходить, и так далее. Однако, Джон не может сделать более \(10^4\) ходов.

Джон хочет максимизировать количество включенных лампочек, а его друг хочет минимизировать это количество. Ваша задача — предъявить стратегию за Джона, которая достигает оптимального результата. Ваша программа будет играть за Джона против программы жюри, которая играет за его друга.

Пусть в игре \(n\) лампочек. Обозначим \(R(n)\) количество включенных лампочек в конце игры, если оба игрока действуют оптимально. Ваша программа должна сделать не более \(10^4\) ходов и завершить игру не менее чем с \(R(n)\) включенными лампочками. Детали реализации приведены в секции «Протокол взаимодействия».

По техническим причинам взломы по этой задаче невозможны.

Протокол взаимодействия

Исходно ваша программа получит на вход одно целое число \(n\) (\(1 \leq n \leq 1000\)) — количество лампочек в игре. После этого программа жюри будет ожидать ваших действий.

Чтобы сделать ход, выведите в одной строке целое число \(k\) (\(1 \leq k \leq n\)), а зачем \(k\) различных целых чисед \(l_1, \ldots, l_k\) (\(1 \leq l_i \leq n\)) — номера лампочек, которые вы хотите включить. Индексы можно выводить в любом порядке. Можно пытаться включать лампочки, которые уже включены (в таком случае их состояние не изменится).

Если ваш ход по какой-либо причине некорректен, или вы совершили более \(10^4\) ходов, программа жюри выведет одно число \(-1\). В противном случае, программа жюри выведет одно целое число \(x\) (\(1 \leq x \leq n)\). Это означает, что в ответ были выключены \(k\) лампочек, начиная с лампочки номер \(x\) в порядке по часовой стрелке.

Чтобы вместо следующего хода завершить игру, выведите в отдельной строке одно число \(0\). Тест будет пройден, если в этот момент включено не менее \(R(n)\) лампочек (значение \(R(n)\) и полученный вердикт не будут сообщены вашей программе). Это действие не включается в количество сделанных ходов (то есть, разрешается завершить игру после ровно \(10^4\) ходов).

Чтобы получить правильный вердикт, ваша программа должна завершиться сразу, как только выведет \(0\) либо получит ответ \(-1\).

Не забудьте сбросить буфер вывода после каждого действия.

Примечание

Если \(n = 3\), любой ход Джона может быть отменен обратно, поэтому \(R(3) = 0\) и завершить игру сразу является верной стратегией.

\(R(4) = 1\), и одна из стратегий, которая достигает этого результата, приведена во втором примере.

Пустые строки в примерах взаимодействия приведены для наглядности, в решении их выводить не нужно.

B. ОчиститеЛи

жадные алгоритмы реализация Строки *1200

Ли убирался у себя в дома перед вечеринкой, когда нашел под ковром «грязную» строку. Теперь он хочет очистить строку, но сделать это стильно...

Строка \(s\), которую нашел Ли, является двоичной строкой длины \(n\) (т. е. строка состоит только из символов 0 и 1).

За один шаг, он может выбрать два последовательных символа \(s_i\) и \(s_{i+1}\) и, если символ \(s_i\) равен 1 и \(s_{i + 1}\) равен 0, он может удалить ровно один из символов (Ли может выбрать какой удалить, но не может удалить оба символа одновременно). После удаления строка сжимается.

Ли может сделать произвольное количество шагов (возможно, ни одного шага) и он хочет сделать строку \(s\) как можно более чистой. Он считает, что из двух различных строк \(x\) и \(y\) более короткая строка чище, а если они равны по длине, то чище та, что лексикографически меньше.

Сейчас же вам необходимо ответить на \(t\) наборов входных данных: для \(i\)-го набора, выведите самую чистую строку, которую может получить Ли за произвольное количество шагов.

Небольшое напоминание: если у нас есть две строки \(x\) и \(y\) равной длины, то \(x\) лексикографически меньше чем \(y\), если существует такая позиция \(i\), что \(x_1 = y_1\), \(x_2 = y_2\),..., \(x_{i - 1} = y_{i - 1}\) и \(x_i < y_i\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В следующих \(2t\) строках заданы сами наборы входных данных — по одному на две строки.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 10^5\)) — длина строки \(s\).

Во второй строке задана сама бинарная строка \(s\). Строка \(s\) — это строка длины \(n\), состоящая только из нулей и единиц.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(10^5\).

Выходные данные

Выведите \(t\) ответов — по одному на набор входных данных.

Ответом на \(i\)-й набор является самая чистая строка, которую может получить Ли за произвольное (возможно, нулевое) количество шагов.

Примечание

В первом наборе входных данных, Ли не может сделать ни одного шага.

Во втором наборе, Ли должен удалить \(s_2\).

В третьем наборе, Ли может, например, выполнить следующие шаги: 1100110\(\rightarrow\) 1100101 \(\rightarrow\) 110101 \(\rightarrow\) 10101 \(\rightarrow\) 110\(\rightarrow\) 10\(\rightarrow\) 01.

E. ВыживатеЛи

жадные алгоритмы поиск в глубину и подобное реализация сортировки Структуры данных *2400

Ли приобрел некоторой еды на обед, но приглашать друзей Ли на обед смертельно опасно. Ли напуган, он не хочет умирать, хотя бы пока не увидит Online IOI 2020...

Всего есть \(n\) различных видов еды и \(m\) лучших друзей Ли. У Ли есть \(w_i\) тарелок \(i\)-го вида еды, и у каждого друга Ли есть два любимых вида еды: любимые блюда \(i\)-го друга — это \(x_i\) и \(y_i\) (\(x_i \ne y_i\)).

Ли начнет вызывать своих друзей по одному. Каждый, кого вызвали, пойдет на кухню и попытается съесть по одной тарелке каждого из его любимых видов еды. Каждый друг зайдет на кухню ровно один раз.

Но проблема в следующем: если друг съест хотя бы одну тарелку еды (суммарно), то он станет абсолютно безвреден. Но если другу нечего есть (не осталось ни \(x_i\), ни \(y_i\)), то он съест самого Ли \(\times\_\times\).

Ли может выбрать, в каком порядке приглашать друзей, а потому Ли хочет понять, может ли он пережить ужин или нет. Также его интересует непосредственно сам порядок.

Входные данные

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 10^5\); \(1 \le m \le 2 \cdot 10^5\)) — количество видов еды и количество друзей Ли.

Во второй строке заданы \(n\) целых чисел \(w_1, w_2, \ldots, w_n\) (\(0 \le w_i \le 10^6\)) — количество тарелок с едой каждого вида.

В \(i\)-й строке из следующих \(m\) строк заданы два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)) — любимые виды еды \(i\)-го друга.

Выходные данные

Если Ли может пережить обед, выведите ALIVE (регистр букв не важен), иначе выведите DEAD (регистр не важен).

Также, если он может пережить обед, выведите порядок, в котором Ли следует вызывать друзей. Если существует несколько возможных порядков, выведите любой из них.

Примечание

В первом примере, любой из следующих порядков друзей будет корректным: \([1, 3, 2]\), \([3, 1, 2]\), \([2, 3, 1]\), \([3, 2, 1]\).

Во втором примере, Ли следует вызвать второго друга первым (тогда он съест тарелку еды \(1\)), а потом и первого друга (этот друг съесть тарелку еды \(2\)). Если же Ли вызовет сначала первого друга, то он съесть по одной тарелке еды \(1\) и \(2\), а следовательно другому другу ничего не останется.

A. Открытки и фотографии

реализация *900

У Поликарпа на стене в ряд вывешены открытки и фотографии. Он решил убрать их в кладовку, чтобы повесить на стене картину известного художника. Для этого он идет слева направо и последовательно снимает объекты. Чтобы не запутаться, он отказывается держать объекты двух разных типов, то есть держать одновременно открытки и фотографии он не может. Иногда он ходит в кладовку и складывает туда предметы. Поликарп должен отнести в кладовку все открытки и фотографии. При этом он не может пропускать предметы. Какое наименьшее количество посещений кладовки ему понадобится сделать, если одновременно он может держать не более 5 предметов?

Входные данные

В единственной строке входных данных содержится непустая строка, состоящая из букв «С» и «P» длиной не более 100 символов. Если i-ый символ в строке это буква «С», значит i-ый объект (нумерация производится слева направо) на стене Поликарпа это открытка. Если же i-ый символ это буква «P», то i-ый объект на стене это фотография.

Выходные данные

Выведите единственное число — наименьшее количество посещений кладовки.

Примечание

В первом примере необходимо 7 раз относить в кладовку по одному предмету.

Во втором примере Поликарп может сначала отнести в кладовку 3 открытки, затем еще 3 открытки. Оставшиеся 6 фотографий Поликарп может отнести аналогичным образом за еще 2 посещения кладовки.

В третьем примере Поликарп может за 2 раза отнести в кладовку 6 открыток, затем отнести 2 фотографии за один раз, затем еще одну открытку и наконец оставшиеся 10 фотографий он может отнести за 2 раза.

В четвертом примере Поликарп может за 2 раза отнести в кладовку все 10 открыток (по 5 штук).

E. Последний шанс

реализация Строки Структуры данных *2000

Прочитав половину книги «Буря и затишье» на уроках информатики, Иннокентий был полон решимости дочитать книгу на математике. И все было хорошо, пока учительница математики Елена Олеговна не увидела, что Иннокентий вместо решения уравнений пятой степени занят литературой. Поскольку Иннокентий на прошлом уроке предложил алгоритм решения уравнений пятой степени в общем случае, у Елены Олеговны не оставалось другого выбора, как дать ему новое задание.

Учительница попросила записать подряд без пробелов все слова из книги «Буря и затишье» в одну длинную строку s. По ее мнению строка является хорошей, если количество гласных букв в строке не более чем вдвое больше количества согласных. Другими словами, строка, в которой v гласных и c согласных, является хорошей тогда и только тогда, когда v ≤ 2c.

Задача, которую должен решить Иннокентий, оказалась достаточно простой: необходимо найти количество наибольших по длине хороших подстрок строки s.

Входные данные

В единственной строке входных данных задана непустая строка s, состоящая из не более чем 2·105 строчных и заглавных латинских букв. Гласными будем считать буквы «a», «e», «i», «o», «u», а также их заглавные варианты.

Выходные данные

Выведите в одну строку через пробел два числа: максимальную длину хорошей подстроки, а также количество максимальных по длине хороших подстрок. Если не существует ни одной хорошей подстроки, выведите «No solution» без кавычек.

Две подстроки считаются различными, если их позиции вхождения различны. Значит, если какая-то строка встречается несколько раз, то она должна быть учтена такое же количество раз.

Примечание

В первом примере есть только одна наидлиннейшая хорошая подстрока: сама «Abo». Остальные хорошие подстроки имеют меньшую длину: «b», «Ab», «bo».

Во втором примере есть только одна наидлиннейшая хорошая подстрока: «EIS». Остальные хорошие подстроки: «S», «IS».

A. Максимальный НОД

жадные алгоритмы математика реализация теория чисел *800

Рассмотрим все целые числа в промежутке от \(1\) до \(n\) (включительно).

По всем парам различных целых чисел из этого промежутка, найдите максимальное возможное значение наибольшего общего делителя чисел в паре. Более формально, найдите максимальное значение \(\mathrm{gcd}(a, b)\) по всем \(1 \leq a < b \leq n\).

Наибольшим общим делителем \(\mathrm{gcd}(a, b)\) пары положительных целых чисел \(a\) и \(b\) называется наибольшее целое число, являющееся делителем числа \(a\) и делителем числа \(b\).

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 100\))  — количество наборов входных данных. Описание наборов входных данных следует.

В единственной строке описания каждого набора входных данных находится единственное целое число \(n\) (\(2 \leq n \leq 10^6\)).

Выходные данные

Для каждого набора входных данных, выведите максимальное значение \(\mathrm{gcd}(a, b)\) по всем \(1 \leq a < b \leq n\).

Примечание

В первом наборе входных данных \(\mathrm{gcd}(1, 2) = \mathrm{gcd}(2, 3) = \mathrm{gcd}(1, 3) = 1\).

Во втором наборе входных данных \(2\) является максимальным возможным значением, соответствующим \(\mathrm{gcd}(2, 4)\).

D. Чет-нечет подпоследовательность

Бинарный поиск дп жадные алгоритмы реализация снм *2000

У Ashish есть массив \(a\) размера \(n\).

Подпоследовательность массива \(a\) определяется, как последовательность, которая может быть получена из \(a\) с помощью удаления некоторых элементов (возможно нуля) без изменения порядка оставшихся элементов.

Рассмотрим подпоследовательность \(s\) массива \(a\). Он определяет цену подпоследовательности \(s\) как минимум между:

  • Максимумом по всем числам, стоящим на нечетных позициях в \(s\).
  • Максимумом по всем числам, стоящим на четных позициях в \(s\).

Обратите внимание, что индекс числа определяется, как его индекс в \(s\), независимо от его индекса в \(a\). Все позиции нумеруются с \(1\). Другими словами, цена \(s\) равна \(min(max(s_1, s_3, s_5, \ldots), max(s_2, s_4, s_6, \ldots))\).

Например, цена последовательности \(\{7, 5, 6\}\) равна \(min( max(7, 6), max(5) ) = min(7, 5) = 5\).

Помогите ему найти минимальную цену какой-то подпоследовательности размера \(k\).

Входные данные

В первой строке находится два целых числа \(n\) и \(k\) (\(2 \leq k \leq n \leq 2 \cdot 10^5\))  — размер массива \(a\) и размер подпоследовательности.

В следующей строке находится \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\))  — элементы массива \(a\).

Выходные данные

Выведите единственное целое число  — минимальную цену подпоследовательности размера \(k\).

Примечание

В первом тесте, рассмотрим подпоследовательность \(s\) = \(\{1, 3\}\). Здесь цена подпоследовательности равна \(min(max(1), max(3)) = 1\).

Во втором тесте, рассмотрим подпоследовательность \(s\) = \(\{1, 2, 4\}\). Здесь цена подпоследовательности равна \(min(max(1, 4), max(2)) = 2\).

В четвертом тесте, рассмотрим подпоследовательность \(s\) = \(\{3, 50, 2, 4\}\). Здесь цена подпоследовательности равна \(min(max(3, 2), max(50, 4)) = 3\).

C. Печенье для тебя

жадные алгоритмы математика реализация *1300

Анна очень смелая девочка, ее любят все в городе. Также все горожане обожают ее печенье. Она планирует провести вечеринку с печеньем. Сейчас у нее есть \(a\) единиц ванильного печенья и \(b\) единиц шоколадного печенья для вечеринки.

Она пригласит \(n\) гостей первого типа и \(m\) гостей второго типа на вечеринку. Они придут на вечеринку в некотором порядке. После того, как они придут на вечеринку, каждый гость выберет один из двух типов печенья (ванильное или шоколадное), чтобы съесть. Есть различие в том, как гости выбирают тип печенья:

Если всего \(v\) единиц ванильного печенья и \(c\) единиц шоколадного печенья в момент, когда гость приходит, тогда

  • если гость первого типа: если \(v>c\) гость выбирает ванильное печенье. Иначе, гость выбирает шоколадное печенье.
  • если гость второго типа: если \(v>c\) гость выбирает шоколадное печенье. Иначе, гость выбирает ванильное печенье.

После этого:

  • Если есть хотя бы одна единица выбранного типа печенья, гость съедает одну.
  • Иначе (если не осталось печенья выбранного типа), гость остается голодным и уходит домой.

Анна хочет узнать, существует ли какой-то порядок гостей, такой что ни один гость не останется голодным. Ваша задача состоит в том, чтобы ответить на ее вопрос.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Следующие \(t\) строк содержат описания набов входных данных.

Для каждого набора входных данных в единственной строке находится четыре целых числа \(a\), \(b\), \(n\), \(m\) (\(0 \le a,b,n,m \le 10^{18}, n+m \neq 0\)).

Выходные данные

Для каждого набора входных данных, выведите ответ в одной строке. Если есть хотя бы один подходящий порядок гостей, выведите «Yes». Иначе, выведите «No».

Вы можете выводить каждый символ в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных рассмотрим порядок \(\{1, 2, 2\}\) типов гостей. Тогда:

  • Первый гость съедает шоколадное печенье. После этого остается \(2\) единицы ванильного печенья и \(1\) единица шоколадного печенья.
  • Второй гость съедает шоколадное печенье. После этого остается \(2\) единицы ванильного печенья и \(0\) единиц шоколадного печенья.
  • Последний гость выбирает шоколадное печенье, чтобы съесть, но больше не осталось шоколадного печенья. Поэтому гость остается голодным.

Поэтому такой порядок гостей Анна выбрать не может.

Рассмотрим порядок \(\{2, 2, 1\}\) типов гостей. Тогда:

  • Первый гость съедает ванильное печенье. После этого остается \(1\) единица ванильного печенья и \(2\) единицы шоколадного печенья.
  • Второй гость съедает ванильное печенье. После этого остается \(0\) единиц ванильного печенья и \(2\) единицы шоколадного печенья.
  • Последний гость съедает шоколадное печенье. После этого остается \(0\) единиц ванильного печенья и \(1\) единица шоколадного печенья.

Поэтому ответ для этого набора входных данных «Yes».

В пятом наборе входных данных можно увидеть, что количество единиц печенья (\(a + b\)) может быть равно нулю, но количество гостей (\(n + m\)) никогда не равно нулю.

В шестом наборе входных данных будьте осторожны с переполнением \(32\)-битного целочисленного типа.

D. Таблица-00100

жадные алгоритмы Конструктив реализация *1600

Безумный ученый Dr.Jubal придумал задачу по программированию. Попробуйте решить ее!

Вам даны целые числа \(n,k\). Постройте таблицу \(A\), имеющую размер \(n \times n\) и состоящую из целых чисел \(0\) или \(1\). Должно быть выполнено очень важное условие: сумма всех элементов в таблице равна \(k\). Другими словами, количество чисел \(1\) в таблице равно \(k\).

Давайте определим:

  • \(A_{i,j}\) как число, стоящее в \(i\)-й строке и \(j\)-м столбце.
  • \(R_i = A_{i,1}+A_{i,2}+...+A_{i,n}\) (для всех \(1 \le i \le n\)).
  • \(C_j = A_{1,j}+A_{2,j}+...+A_{n,j}\) (для всех \(1 \le j \le n\)).
  • Другими словами, \(R_i\) это суммы чисел в строках и \(C_j\) это суммы чисел в столбцах таблицы \(A\).
  • Для таблицы \(A\) определим значение \(f(A) = (\max(R)-\min(R))^2 + (\max(C)-\min(C))^2\) (здесь для последовательности целых чисел \(X\) мы определяем \(\max(X)\) как максимальное число в \(X\) и \(\min(X)\) как минимальное число в \(X\)).

Найдите любую таблицу \(A\), удовлетворяющую описанному условию. Среди всех таких таблиц найдите такую, для которой значение \(f(A)\) минимально возможное. Среди всех таких таблиц найдите любую.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Следующие \(t\) строк содержат описания набов входных данных.

Для каждого набора входных данных в единственной строке находится два целых числа \(n\), \(k\) \((1 \le n \le 300, 0 \le k \le n^2)\).

Гарантируется, что сумма \(n^2\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных сначала выведите минимальное возможное значение \(f(A)\) среди всех таблиц, для которых условие выполнено.

После этого, выведите \(n\) строк, каждая содержит по \(n\) символов. \(j\)-й символ в \(i\)-й строке должен быть равен \(A_{i,j}\).

Если есть несколько возможных решений, вы можете вывести любое.

Примечание

В первом наборе входных данных сумма всех чисел таблицы равна \(2\), поэтому условие выполнено. \(R_1 = 1, R_2 = 1\) и \(C_1 = 1, C_2 = 1\). Тогда \(f(A) = (1-1)^2 + (1-1)^2 = 0\), что является минимальным возможным значением \(f(A)\).

Во втором наборе входных данных сумма всех чисел таблицы равна \(8\), значит условие выполнено. \(R_1 = 3, R_2 = 3, R_3 = 2\) и \(C_1 = 3, C_2 = 2, C_3 = 3\). Тогда \(f(A) = (3-2)^2 + (3-2)^2 = 2\). Можно доказать, что это минимальное возможное значение \(f(A)\).

F. Яростный гром

разделяй и властвуй реализация Структуры данных *2800

Вы воин, который собирается победить бога Тора.

Тор бросил вам вызов, предложив вам решить следующую задачу:

В ряд находится \(n\) конвееров, пронумерованных целыми числами от \(1\) до \(n\) слева направо. Каждый конвеер показывает один из двух символов «<» или «>». Начальное состояние конвеера \(i\) задается \(i\)-м символом строки \(s\). Всего есть \(n+1\) ямка. Они пронумерованы целыми числами от \(0\) до \(n\). Ямка \(0\) находится слева от конвеера \(1\), для всех \(i \geq 1\) ямка \(i\) находится справа от конвеера \(i\).

Когда мячик попадает на конвеер с номером \(i\), он перемещается по следующим правилам:

Если на конвеере \(i\) символ «<», тогда:

  • Если \(i=1\), то мячик падает в ямку \(0\).
  • Если на конвеере \(i-1\) символ «<», то мячик перемещается на конвеер \(i-1\).
  • Если на конвеере \(i-1\) символ «>», то мячик падает в ямку \(i-1\).

Если на конвеере \(i\) символ «>», тогда:

  • Если \(i=n\), то мячик падает в ямку \(n\).
  • Если на конвеере \(i+1\) символ «>», то мячик перемещается на конвеер \(i+1\).
  • Если на конвеере \(i+1\) символ «<», то мячик падает в ямку \(i\).

Вы должны ответить на следующие \(q\) запросов, каждый из которых задается парой целых чисел \(l, r\) (\(1 \leq l \leq r \leq n\)):

  • Сначала, на всех конвеерах \(l,l+1,...,r\) символ «<» изменяется на «>» и наоборот. Эти изменения сохраняются в следующих запросах.
  • После этого, положите один мячик на каждый конвеер \(l,l+1,...,r\). Затем, каждый мячик упадет в какую-то ямку. Найдите максимальное количество мячиков, которое окажется в какой-то ямке. После ответа на запрос, мячики пропадают и не учитываются в следующих запросах.
Входные данные

В первой строке находится два целых числа \(n\), \(q\) (\(1 \le n \le 5 \times 10^5 , 1 \le q \le 10^5\)).

Во второй строке находится строка \(s\) длины \(n\). Она состоит их символов «<» и «>».

В следующих \(q\) строках содержится описание запросов, \(i\)-я из этих строк содержит два целых числа \(l\), \(r\) \((1 \le l \le r \le n)\), описывающих \(i\)-й запрос.

Выходные данные

Выведите \(q\) строк, в \(i\)-й строке выведите ответ на \(i\)-й запрос.

Примечание
  • В первом запросе, состояния конвееров меняются на «>><<<». После этого, мы кладем по одному мячику на конвееры \(\{2,3,4\}\). Все три мячика упадут в ямку \(2\). Поэтому ответ равен \(3\).
  • Во втором запросе, состояния конвееров меняются на «>>>>>». После этого, мы кладем по одному мячику на конвееры \(\{3,4,5\}\). Все три мячика упадут в ямку \(5\). Поэтому ответ равен \(3\).
  • В третьем запросе, состояния конвееров меняются на «<<<<<». После этого, мы кладем по одному мячику на конвееры \(\{1,2,3,4,5\}\). Все пять мячиков упадут в ямку \(0\). Поэтому ответ равен \(5\).
  • В четвертом запросе, состояния конвееров меняются на «>>><<». После этого, мы кладем по одному мячику на конвееры \(\{1,2,3\}\). Все три мячика упадут в ямку \(3\). Поэтому ответ равен \(3\).
  • В пятом запросе, состояния конвееров меняются на «><<><». После этого, мы кладем по одному мячику на конвееры \(\{2,3,4\}\). Тогда два мячика упало в ямку \(1\) и один мячик упал в ямку \(4\). Поэтому ответ равен \(2\).
  • В шестом запросе, состояния конвееров меняются на «<>><>». После этого, мы кладем по одному мячику на конвееры \(\{1,2,3,4,5\}\). Тогда три мячика упало в ямку \(3\), один мячик упал в ямку \(0\) и еще один мячик упал в ямку \(5\). Поэтому ответ равен \(3\).

A. Омкар и полнота

Конструктив реализация *800

Вы были благословлены как дитя Омкара. Чтобы выразить свою благодарность, пожалуйста, решите для Омкара эту задачу!

Массив \(a\) длины \(n\) называется полным, если все его элементы положительны, не превышают \(1000\), и для любых трех индексов \(x\), \(y\), \(z\) (\(1 \leq x,y,z \leq n\)), \(a_{x}+a_{y} \neq a_{z}\) (не обязательно различных).

Вам дано одно целое число \(n\). Найдите полный массив длины \(n\). Гарантируется, что при данных ограничениях решение существует.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит \(t\) (\(1 \le t \le 1000\))  — количество наборов входных данных. Описание наборов входных данных приведено ниже.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 1000\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(1000\).

Выходные данные

Для каждого набора входных данных выведите полный массив в отдельной строке. Все элементы должны быть целыми числами между \(1\) и \(1000\) и для любых трех индексов \(x\), \(y\), \(z\) (\(1 \leq x,y,z \leq n\)) (не обязательно различных), должно выполняться \(a_{x}+a_{y} \neq a_{z}\).

Если существует несколько решений, вы можете вывести любое.

Примечание

Можно показать, что массивы с примера являются полными массивами. Например, \(44+44 \neq 384\).

Ниже приведены некоторые примеры массивов, которые НЕ полные для 1-го теста:

\([1,2,3,4,5]\)

Обратите внимание, что \(a_{1}+a_{2} = a_{3}\).

\([1,3000,1,300,1]\)

Обратите внимание, что \(a_{2} = 3000 > 1000\).

A. Магазины пончиков

жадные алгоритмы математика реализация *1000

Существует два конкурирующих магазина пончиков.

Первый магазин продает пончики в розницу: каждый пончик стоит \(a\) долларов.

Второй магазин продает пончики оптом: коробка из \(b\) пончиков стоит \(c\) долларов. То есть если вы хотите купить \(x\) пончиков в этом магазине, то вам придется купить минимальное количество коробок такое, что суммарное количество пончиков больше или равно \(x\).

Вы хотите определить два положительных целых значения:

  1. сколько пончиков можно купить, чтобы они стоили дешевле в первом магазине, чем во втором?
  2. сколько пончиков можно купить, чтобы они стоили дешевле во втором магазине, чем в первом?

Если какое-то из значений не существует, то оно должно быть равно \(-1\). Если существует несколько решений, выведите любое из них.

Выведенные значения должны быть меньше или равны \(10^9\). Можно показать, что в данных ограничениях такие значения всегда существуют, если значения существуют вообще.

Входные данные

В первой строке записано одно целое \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В каждой из следующих \(t\) строк записаны по три целых числа \(a\), \(b\) и \(c\) (\(1 \le a \le 10^9\), \(2 \le b \le 10^9\), \(1 \le c \le 10^9\)).

Выходные данные

На каждый набор входных данных выведите два положительных целых числа. Для обоих магазинов выведите такой \(x\), что купить \(x\) пончиков в этом магазине строго дешевле, чем купить \(x\) пончиков в другом магазине. \(x\) должно быть больше \(0\) и меньше или равно, чем \(10^9\).

Если такого \(x\) не существует, то выведите \(-1\). Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных любое количество пончиков будет дешевле во втором магазине. Например, для \(3\) или \(5\) пончиков придется купить коробку из \(10\) пончиков за \(4\) доллара. Однако \(3\) или \(5\) пончиков будут стоить \(15\) или \(25\) долларов, соответственно. Для \(20\) пончиков придется купить две коробки за \(8\) долларов суммарно. Обратите внимание, что \(3\) и \(5\) также являются правильными ответами для второго магазина вместе со многими другими ответами.

Во втором наборе входных данных любое количество пончиков будет либо дешевле в первом магазине, либо по одинаковой цене. \(8\) пончиков стоят \(32\) доллара в первом магазине и \(40\) долларов во втором магазине (потому что придется купить две коробки). \(10\) пончиков будут стоить \(40\) долларов в обоих магазинах, поэтому \(10\) не будет правильным ответом ни для одного из магазинов.

В третьем наборе входных данных \(1\) пончик стоит \(2\) и \(3\) доллара, соответственно. \(2\) пончика стоят \(4\) и \(3\) доллара. Поэтому \(1\) является правильным ответом для первого магазина, а \(2\) является правильным ответом для второго магазина.

В четвертом наборе входных данных \(10^9\) пончиков стоят \(10^{18}\) долларов в первом магазине и \(10^9\) долларов во втором магазине.

D. Максимальная сумма на четных позициях

дп жадные алгоритмы разделяй и властвуй реализация *1600

Вам задан массив \(a\), состоящий из \(n\) целых чисел. Индексы элементов массива начинаются с нуля (то есть первый элемент — это \(a_0\), второй — \(a_1\), и так далее).

Вы можете развернуть не более одного подмассива (последовательного отрезка) этого массива. Напомним, что подмассив \(a\) с границами \(l\) и \(r\) равен \(a[l; r] = a_l, a_{l + 1}, \dots, a_{r}\).

Ваша задача — развернуть такой подмассив, чтобы сумма элементов на четных позицияx получившегося массива была максимально возможной (то есть сумма элементов \(a_0, a_2, \dots, a_{2k}\) для целого числа \(k = \lfloor\frac{n-1}{2}\rfloor\) должна быть максимально возможной).

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину \(a\). Вторая строка набора содержит \(n\) целых чисел \(a_0, a_1, \dots, a_{n-1}\) (\(1 \le a_i \le 10^9\)), где \(a_i\) — это \(i\)-й элемент \(a\).

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Для каждого набора тестовых данных выведите ответ на отдельной строке — максимально возможная сумма элементов на четных позициях после разворота не более одного подмассива (последовательного отрезка) \(a\).

E2. Чтение книг (сложная версия)

жадные алгоритмы реализация сортировки Структуры данных Тернарный поиск *2500

Простая и сложная версии на самом деле являются разными задачами, поэтому прочитайте условия обеих задач полностью и внимательно.

Летние каникулы начались, поэтому Алиса и Боб хотят играть и веселиться, но... Их мама не согласна с этим. Она говорит, что они должны прочитать ровно \(m\) книг перед всеми развлечениями. Алиса и Боб прочитают каждую книгу вместе, чтобы быстрее закончить это задание.

В семейной библиотеке есть \(n\) книг. \(i\)-я книга характеризуется тремя целыми числами: \(t_i\) — количество времени, которое Алиса и Боб должны потратить, чтобы прочитать ее, \(a_i\) (равное \(1\), если Алисе нравится \(i\)-я книга, и \(0\), если не нравится), и \(b_i\) (равное \(1\), если Бобу нравится \(i\)-я книга, и \(0\), если не нравится).

Поэтому им нужно выбрать ровно \(m\) книг из имеющихся \(n\) книг таким образом, что:

  • Алисе нравятся не менее \(k\) книг из выбранного множества и Бобу нравятся не менее \(k\) книг из выбранного множества;
  • общее время, затраченное на прочтение этих \(m\) книг минимизировано (ведь они дети и хотят начать играть и веселиться как можно скорее).

Множество, которое они выбирают, одинаковое и для Алисы и для Боба (они читают одни и те же книги), и они читают все книги вместе, таким образом, суммарное время чтения равно сумме \(t_i\) по всем книгам, которые находятся в выбранном множестве.

Ваша задача — помочь им и найти любое подходящее множество книг или определить, что такое множество найти невозможно.

Входные данные

Первая строка теста содержит три целых числа \(n\), \(m\) и \(k\) (\(1 \le k \le m \le n \le 2 \cdot 10^5\)).

Следующие \(n\) строк содержат описания книг, по одному описанию в строке: \(i\)-я строка содержит три целых числа \(t_i\), \(a_i\) и \(b_i\) (\(1 \le t_i \le 10^4\), \(0 \le a_i, b_i \le 1\)), где:

  • \(t_i\) — количество времени, необходимое для прочтения \(i\)-й книги;
  • \(a_i\), равное \(1\), если Алисе нравится \(i\)-я книга, и \(0\) в обратном случае;
  • \(b_i\), равное \(1\), если Бобу нравится \(i\)-я книга, и \(0\) в обратном случае.
Выходные данные

Если подходящего решения не существует, выведите целое число -1.

Если решение существует, выведите \(T\) первой строкой — минимальное суммарное время, необходимое для прочтения подходящего множества книг. Второй строкой выведите \(m\) различных целых чисел от \(1\) до \(n\) в любом порядке — индексы книг, включенных в выбранное вами множество.

Если существует несколько подходящих ответов, вы можете вывести любой из них.

F. Сортировка циклическими сдвигами

Конструктив Перебор реализация сортировки *2400

Вам задан массив \(a\), состоящий из \(n\) целых чисел.

За один ход вы можете выбрать некоторый индекс \(i\) (\(1 \le i \le n - 2\)) и сдвинуть отрезок \([a_i, a_{i + 1}, a_{i + 2}]\) циклически вправо (т.е. заменить отрезок \([a_i, a_{i + 1}, a_{i + 2}]\) на \([a_{i + 2}, a_i, a_{i + 1}]\)).

Ваша задача — отсортировать заданный массив за не более чем \(n^2\) таких операций или сказать, что это невозможно.

Вам нужно ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(3 \le n \le 500\)) — длину массива \(a\). Вторая строка набора тестовых данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 500\)), где \(a_i\)\(i\)-й элемент \(a\).

Гарантируется, что сумма всех \(n\) не превосходит \(500\).

Выходные данные

Для каждого набора тестовых данных выведите ответ: -1 единственной строкой, если невозможно отсортировать заданный массив, используя операции, описанные в условии задачи, или количество операций \(ans\) первой строкой и \(ans\) целых чисел \(idx_1, idx_2, \dots, idx_{ans}\) (\(1 \le idx_i \le n - 2\)), где \(idx_i\) — индекс левой границы отрезка для \(i\)-й операции. Вы должны вывести индексы в порядке применения операций.

A. Акакий и строка

Перебор реализация Строки *1500

Акакий Владиславович изучает строки. Сегодня он столкнулся со следующей задачей.

Дана строка \(s\) длины \(n\), состоящая из строчных букв английского алфавита и знаков вопроса. Можно ли заменить знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз?

Каждый знак вопроса должен быть заменён ровно на одну букву. Например, строка «a?b?c» может быть преобразована в строки «aabbc» или «azbzc», но не может быть преобразована в строки «aabc», «a?bbc» или «babbc».

Вхождением строки \(t\) длины \(m\) в строку \(s\) длины \(n\) называется такой индекс \(i\) (\(1 \leq i \leq n - m + 1\)), что строка \(s[i..i+m-1]\), образованная последовательными \(m\) символами строки \(s\), начиная с \(i\)-го, совпадает со строкой \(t\). Например, в строке «ababa» есть два вхождения строки «aba» как подстроки: \(i = 1\) и \(i = 3\), а в строке «acba» вхождения строки «aba» как подстроки нет.

Помогите Акакию Владиславовичу проверить можно ли заменить все знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз.

Входные данные

В первой строке задано число \(T\) (\(1 \leq T \leq 5000\)) — количество наборов входных данных. Следующие \(T\) пар строк содержат описания наборов входных данных.

В первой строке описания содержится целое число \(n\) (\(7 \leq n \leq 50\)) — длина строки \(s\).

Вторая строка содержит строку \(s\) длины \(n\), состоящую из строчных букв английского алфавита и знаков вопроса.

Выходные данные

Для каждого набора входных данных выведите ответ на него.

В случае, если невозможно заменить знаки вопроса в строке \(s\) на строчные буквы английского алфавита так, чтобы в получившейся строке было ровно одно вхождение строки «abacaba» как подстроки, выведите «No».

В противном случае, выведите «Yes», а во второй строке выведите строку, состоящую из \(n\) строчный букв английского алфавита, — полученную строку. Если существует несколько подходящий строк, выведите любую.

Вы можете выводить «Yes» и «No» в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом примере в строке «abacaba» есть ровно одно вхождение строки «abacaba» как подстроки, совпадающее со всей строкой.

Во втором примере строка из семи знаков вопроса может быть преобразована в любую строку из семи строчных букв английского алфавита, в том числе и в «abacaba».

В шестом примере в строке есть два вхождения строки «abacaba» как подстроки.

A. Акакий и строка

Перебор реализация Строки *1500

Акакий Владиславович изучает строки. Сегодня он столкнулся со следующей задачей.

Дана строка \(s\) длины \(n\), состоящая из строчных букв английского алфавита и знаков вопроса. Можно ли заменить знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз?

Каждый знак вопроса должен быть заменён ровно на одну букву. Например, строка «a?b?c» может быть преобразована в строки «aabbc» или «azbzc», но не может быть преобразована в строки «aabc», «a?bbc» или «babbc».

Вхождением строки \(t\) длины \(m\) в строку \(s\) длины \(n\) называется такой индекс \(i\) (\(1 \leq i \leq n - m + 1\)), что строка \(s[i..i+m-1]\), образованная последовательными \(m\) символами строки \(s\), начиная с \(i\)-го, совпадает со строкой \(t\). Например, в строке «ababa» есть два вхождения строки «aba» как подстроки: \(i = 1\) и \(i = 3\), а в строке «acba» вхождения строки «aba» как подстроки нет.

Помогите Акакию Владиславовичу проверить можно ли заменить все знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз.

Входные данные

В первой строке задано число \(T\) (\(1 \leq T \leq 5000\)) — количество наборов входных данных. Следующие \(T\) пар строк содержат описания наборов входных данных.

В первой строке описания содержится целое число \(n\) (\(7 \leq n \leq 50\)) — длина строки \(s\).

Вторая строка содержит строку \(s\) длины \(n\), состоящую из строчных букв английского алфавита и знаков вопроса.

Выходные данные

Для каждого набора входных данных выведите ответ на него.

В случае, если невозможно заменить знаки вопроса в строке \(s\) на строчные буквы английского алфавита так, чтобы в получившейся строке было ровно одно вхождение строки «abacaba» как подстроки, выведите «No».

В противном случае, выведите «Yes», а во второй строке выведите строку, состоящую из \(n\) строчный букв английского алфавита, — полученную строку. Если существует несколько подходящий строк, выведите любую.

Вы можете выводить «Yes» и «No» в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом примере в строке «abacaba» есть ровно одно вхождение строки «abacaba» как подстроки, совпадающее со всей строкой.

Во втором примере строка из семи знаков вопроса может быть преобразована в любую строку из семи строчных букв английского алфавита, в том числе и в «abacaba».

В шестом примере в строке есть два вхождения строки «abacaba» как подстроки.

A. Акакий и строка

Перебор реализация Строки *1500

Акакий Владиславович изучает строки. Сегодня он столкнулся со следующей задачей.

Дана строка \(s\) длины \(n\), состоящая из строчных букв английского алфавита и знаков вопроса. Можно ли заменить знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз?

Каждый знак вопроса должен быть заменён ровно на одну букву. Например, строка «a?b?c» может быть преобразована в строки «aabbc» или «azbzc», но не может быть преобразована в строки «aabc», «a?bbc» или «babbc».

Вхождением строки \(t\) длины \(m\) в строку \(s\) длины \(n\) называется такой индекс \(i\) (\(1 \leq i \leq n - m + 1\)), что строка \(s[i..i+m-1]\), образованная последовательными \(m\) символами строки \(s\), начиная с \(i\)-го, совпадает со строкой \(t\). Например, в строке «ababa» есть два вхождения строки «aba» как подстроки: \(i = 1\) и \(i = 3\), а в строке «acba» вхождения строки «aba» как подстроки нет.

Помогите Акакию Владиславовичу проверить можно ли заменить все знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз.

Входные данные

В первой строке задано число \(T\) (\(1 \leq T \leq 5000\)) — количество наборов входных данных. Следующие \(T\) пар строк содержат описания наборов входных данных.

В первой строке описания содержится целое число \(n\) (\(7 \leq n \leq 50\)) — длина строки \(s\).

Вторая строка содержит строку \(s\) длины \(n\), состоящую из строчных букв английского алфавита и знаков вопроса.

Выходные данные

Для каждого набора входных данных выведите ответ на него.

В случае, если невозможно заменить знаки вопроса в строке \(s\) на строчные буквы английского алфавита так, чтобы в получившейся строке было ровно одно вхождение строки «abacaba» как подстроки, выведите «No».

В противном случае, выведите «Yes», а во второй строке выведите строку, состоящую из \(n\) строчный букв английского алфавита, — полученную строку. Если существует несколько подходящий строк, выведите любую.

Вы можете выводить «Yes» и «No» в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом примере в строке «abacaba» есть ровно одно вхождение строки «abacaba» как подстроки, совпадающее со всей строкой.

Во втором примере строка из семи знаков вопроса может быть преобразована в любую строку из семи строчных букв английского алфавита, в том числе и в «abacaba».

В шестом примере в строке есть два вхождения строки «abacaba» как подстроки.

A. Акакий и строка

Перебор реализация Строки *1500

Акакий Владиславович изучает строки. Сегодня он столкнулся со следующей задачей.

Дана строка \(s\) длины \(n\), состоящая из строчных букв английского алфавита и знаков вопроса. Можно ли заменить знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз?

Каждый знак вопроса должен быть заменён ровно на одну букву. Например, строка «a?b?c» может быть преобразована в строки «aabbc» или «azbzc», но не может быть преобразована в строки «aabc», «a?bbc» или «babbc».

Вхождением строки \(t\) длины \(m\) в строку \(s\) длины \(n\) называется такой индекс \(i\) (\(1 \leq i \leq n - m + 1\)), что строка \(s[i..i+m-1]\), образованная последовательными \(m\) символами строки \(s\), начиная с \(i\)-го, совпадает со строкой \(t\). Например, в строке «ababa» есть два вхождения строки «aba» как подстроки: \(i = 1\) и \(i = 3\), а в строке «acba» вхождения строки «aba» как подстроки нет.

Помогите Акакию Владиславовичу проверить можно ли заменить все знаки вопроса на строчные буквы английского алфавита так, чтобы в полученную строку строка «abacaba» входила как подстрока ровно один раз.

Входные данные

В первой строке задано число \(T\) (\(1 \leq T \leq 5000\)) — количество наборов входных данных. Следующие \(T\) пар строк содержат описания наборов входных данных.

В первой строке описания содержится целое число \(n\) (\(7 \leq n \leq 50\)) — длина строки \(s\).

Вторая строка содержит строку \(s\) длины \(n\), состоящую из строчных букв английского алфавита и знаков вопроса.

Выходные данные

Для каждого набора входных данных выведите ответ на него.

В случае, если невозможно заменить знаки вопроса в строке \(s\) на строчные буквы английского алфавита так, чтобы в получившейся строке было ровно одно вхождение строки «abacaba» как подстроки, выведите «No».

В противном случае, выведите «Yes», а во второй строке выведите строку, состоящую из \(n\) строчный букв английского алфавита, — полученную строку. Если существует несколько подходящий строк, выведите любую.

Вы можете выводить «Yes» и «No» в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом примере в строке «abacaba» есть ровно одно вхождение строки «abacaba» как подстроки, совпадающее со всей строкой.

Во втором примере строка из семи знаков вопроса может быть преобразована в любую строку из семи строчных букв английского алфавита, в том числе и в «abacaba».

В шестом примере в строке есть два вхождения строки «abacaba» как подстроки.

A. Урок литературы

реализация *1600

Вера очень любит стихи. Все стихи, которые знает Вера, разбиваются на четверостишья, и в каждом из них некоторые строчки рифмуются.

Будем считать, что все строчки в стихах состоят из маленьких латинских букв (без пробелов). Гласными из них считаются буквы «a», «e», «i», «o», «u».

Две строчки рифмуются, если их суффиксы, начинающиеся в k-ых с конца гласных, совпадают. Если в строке меньше k гласных, такая строка не может рифмоваться ни с какой другой. Например, при k = 1 строки palka и seledka рифмуются (соответствующие суффиксы равны a), а при k = 2 — нет (alka ≠ edka).

Сегодня на уроке литературы Вера узнала, что в четверостишьях бывают различные типы рифмы, а именно (одинаковые буквы означают рифмующиеся строки):

  • Смежная (aabb);
  • Перекрестная (abab);
  • Опоясывающая (abba).

Если в четверостишье все строки попарно рифмуются, то оно может быть отнесено к любому из типов рифмы (такая ситуация обозначается aaaa).

Если в стихотворении все четверостишья можно отнести к одному и тому же типу рифмы, то считается, что и все стихотворение относится к этому типу рифмы. Если в каждом четверостишье строки попарно рифмуются, стихотворение относится к типу aaaa. Заметим, что не имеет значения, рифмуются ли между собой строки из разных четверостиший, то есть разные четверостишья могут быть не связаны рифмой.

На дом Вере задали разобрать длинное стихотворение и определить тип рифмы в нем. Помогите Вере справиться с заданием.

Входные данные

В первой строке записано два целых числа n и k (1 ≤ n ≤ 2500, 1 ≤ k ≤ 5) — число четверостиший в стихе и номер гласной, соответственно. В следующих 4n строках записан стих. Каждая строка не пуста и состоит только из маленьких латинских букв, а суммарная длина строк не превышает 104.

Если считать, что строки нумеруются начиная с единицы, то к первому четверостишью относятся строки с номерами 1, 2, 3, 4; ко второму — с номерами 5, 6, 7, 8; и так далее.

Выходные данные

Выведите тип рифмы стиха в виде «aabb», «abab», «abba», «aaaa», либо «NO», если стихотворение не может быть отнесено ни к одному из указанных типов.

Примечание

В последнем примере в обоих четверостишиях присутствует рифма, но общего типа для нее найти не удается, поэтому ответ — «NO».

C. Собери команды

дп жадные алгоритмы Перебор реализация сортировки *1400

У вас есть \(n\) программистов, которых вы хотите распределить по командам. Навык \(i\)-го программиста равен \(a_i\). Вы хотите собрать из них максимальное количество команд. Для команд есть одно ограничение: количество программистов в команде, умноженное на минимальный навык среди всех программистов этой команды, должно быть как минимум \(x\).

Каждый программист может находиться максимум в одной команде. Некоторые программисты могут остаться без команды.

Посчитайте максимальное количество команд, которое вы можете собрать.

Входные данные

Первая строка содержит одно число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два числа \(n\) и \(x\) (\(1 \le n \le 10^5; 1 \le x \le 10^9\)) — количество программистов и ограничение на навык команды соответственно.

Вторая строка каждого набора входных данных содержит \(n\) чисел \(a_1, a_2, \dots , a_n\) (\(1 \le a_i \le 10^9\)), где \(a_i\) равно навыку \(i\)-го программиста.

Сумма \(n\) по всем наборам не превосходит \(10^5\).

Выходные данные

На каждый набор входных данных выведите одно число — максимальное количество команд, которое вы можете собрать.

D. Берсерк и Огненный Шар

жадные алгоритмы Конструктив математика реализация *2000

В ряд стоят \(n\) воинов. Сила \(i\)-го воина равна \(a_i\). Все силы различны.

Вы можете использовать заклинания двух типов:

  1. Огненный Шар: вы тратите \(x\) маны и уничтожаете ровно \(k\) последовательных воинов;
  2. Берсерк: вы тратите \(y\) маны, выбираете двух соседних воинов, и воин с большей силой убивает воина с меньшей силой.

Например, пусть силы воинов равны \([2, 3, 7, 8, 11, 5, 4]\), и \(k = 3\). Если использовать Берсерк на воинах с силой \(8\) и \(11\), последовательность станет \([2, 3, 7, 11, 5, 4]\). Если после этого использовать Огненный Шар на воинах с силами \([7, 11, 5]\), последовательность станет \([2, 3, 4]\).

Вам необходимо превратить последовательность сил воинов \(a_1, a_2, \dots, a_n\) в \(b_1, b_2, \dots, b_m\). Посчитайте минимальное количество маны, которое вы должны затратить.

Входные данные

Первая строка содержит два числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — длина последовательности \(a\) и длина последовательности \(b\) соответственно.

Вторая строка содержит три числа \(x, k, y\) (\(1 \le x, y, \le 10^9; 1 \le k \le n\)) — стоимость Огненного Шара, длина действия Огненного Шара и стоимость Берсерка соответсвенно.

Третья строка содержит \(n\) чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)). Гарантируется что числа \(a_i\) попарно различны.

Четвертая строка содержит \(m\) чисел \(b_1, b_2, \dots, b_m\) (\(1 \le b_i \le n\)). Гарантируется что числа \(b_i\) попарно различны.

Выходные данные

Выведите минимальное количество маны для превращения последовательности \(a_1, a_2, \dots, a_n\) в \(b_1, b_2, \dots, b_m\) (или \(-1\), если это невозможно).

E. Слияние башен

Деревья реализация снм Структуры данных *2300

У вас есть \(n\) дисков, радиус \(i\)-го диска равен \(i\). Изначально эти диски распределены по \(m\) башням из дисков: каждая башня содержит хотя бы один диск, и диски в каждой башне отсортированы от большего к меньшему снизу вверх.

Вы должны собрать все диски в одну башню. Чтобы сделать это, вы можете выбрать две различных башни \(i\) и \(j\) (каждая из которых содержит хотя бы один диск), взять несколько (возможно, все) верхних дисков с башни \(i\) и поместить их на вершину башни \(j\) в том же самом порядке — при условии, что верхний диск башни \(j\) больше каждого перемещаемого диска. Эту операцию можно применять любое количество раз.

Например, если у вас есть две башни, содержащие диски \([6, 4, 2, 1]\) и \([8, 7, 5, 3]\) (в порядке снизу вверх), существуют ровно две возможные операции:

  • переместить диск \(1\) с первой башни на вторую, после чего башни станут следующими: \([6, 4, 2]\) и \([8, 7, 5, 3, 1]\);
  • переместить диски \([2, 1]\) с первой башни на вторую, после чего башни станут следующими: \([6, 4]\) и \([8, 7, 5, 3, 2, 1]\).

Пусть сложность некоторого набора башен — это минимальное количество операций, необходимых для того, чтобы собрать все диски в одну башню. Например, сложность набора башен \([[3, 1], [2]]\) равна \(2\): вы можете переместить диск \(1\) на вторую башню, а потом переместить оба диска со второй башни на первую башню.

Вам заданы \(m - 1\) запросов. Каждый запрос обозначается двумя числами \(a_i\) и \(b_i\), обозначающими следующее: «слить башни \(a_i\) и \(b_i\) в одну» (то есть взять все диски из этих башен и составить из них одну башню, в которой диски отсортированы по убыванию размера снизу вверх). Новая башня (являющаяся результатом слияния) получает индекс \(a_i\).

Для каждого \(k \in [0, m - 1]\) посчитайте сложность набора башен после выполнения первых \(k\) запросов.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le m \le n \le 2 \cdot 10^5\)) — количество дисков и башен, соответственно.

Вторая строка содержит \(n\) целых чисел \(t_1\), \(t_2\), ..., \(t_n\) (\(1 \le t_i \le m\)), где \(t_i\) — индекс башни, к которой принадлежит диск \(i\). Каждое значение от \(1\) до \(m\) встречается в этой последовательности хотя бы один раз.

Затем следуют \(m - 1\) строк, обозначающих запросы. Каждый запрос задается двумя целыми числами \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le m\), \(a_i \ne b_i\)), обозначающими, что во время \(i\)-го запроса башни \(a_i\) и \(b_i\) сливаются в одну (\(a_i\) и \(b_i\) всегда выбраны таким образом, что башни с этими номерами существуют до \(i\)-го запроса).

Выходные данные

Выведите \(m\) целых чисел. \(k\)-е число (в \(0\)-индексации) должно быть равно сложности набора башен после первых \(k\) запросов.

Примечание

Башни в примере из условия:

  • до запросов: \([[5, 1], [2], [7, 4, 3], [6]]\);
  • после первого запроса: \([[2], [7, 5, 4, 3, 1], [6]]\);
  • после второго запроса: \([[7, 5, 4, 3, 2, 1], [6]]\);
  • после третьего запроса остается только одна башня: \([7, 6, 5, 4, 3, 2, 1]\).

A2. Префиксные перевороты (сложная версия)

Конструктив реализация Строки Структуры данных *1700

Это сложная версия задачи. Различия между версиями заключаются в ограничениях на \(n\) и необходимое количество операций. Вы можете делать взломы только если обе версии задачи сданы.

Есть две бинарные строки \(a\) и \(b\) длины \(n\) (бинарная строка это строка, состоящая из символов \(0\) и \(1\)). За одну операцию вы выбираете префикс строки \(a\), меняете все биты этого префикса на другие (\(0\) меняется на \(1\), \(1\) меняется на \(0\)) и переворачиваете этот префикс. За одну операцию вы выполняете оба этих действия.

Например, если \(a=001011\) и вы выбираете префикс длины \(3\), строка становится равной \(011011\). Затем, если вы вы выберете всю строку как префикс для операции, она станет равной \(001001\).

Ваша задача превратить строку \(a\) в строку \(b\) за не больше, чем \(2n\) операций. Можно доказать, что это всегда возможно.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1\le t\le 1000\))  — количество наборов входных данных. Следующие \(3t\) строк содержат описания наборов входных данных.

В первой строке каждого набора входных данных находится единственное целое число \(n\) (\(1\le n\le 10^5\))  — длина бинарных строк.

Следующие две строки содержат две бинарные строки \(a\) и \(b\) длины \(n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите целое число \(k\) (\(0\le k\le 2n\)), затем \(k\) целых чисел \(p_1,\ldots,p_k\) (\(1\le p_i\le n\)). Здесь \(k\) равно количеству операций, которое вы использовали и \(p_i\) равно длине префикса в \(i\)-й операции.

Примечание

В первом наборе входных данных процесс превращения выглядит так: \(01\to 11\to 00\to 10\).

Во втором наборе входных данных процесс превращения выглядит так: \(01011\to 00101\to 11101\to 01000\to 10100\to 00100\to 11100\).

В третьем наборе входных данных данные строки уже совпадают. Другим решением будет, например, сделать операцию с префиксом длины \(2\), от чего строка \(a\) не поменяется.

C. Гениальный шифр

жадные алгоритмы Конструктив Паросочетания реализация сортировки *2500

В игре «Гениальный шифр» есть два игрока  — Алиса и Боб. У Алисы есть секретный код, который Боб хочет отгадать. Код определяется последовательностью из \(n\) цветов. Всего существует \(n+1\) цвет, они пронумерованы целыми числами от \(1\) до \(n+1\).

После того как Боб сделал свою догадку, Алиса говорит ему некоторую информацию о том, насколько его код правильный, в виде двух целых чисел \(x\) и \(y\).

Первое число \(x\) равно количеству индексов, в которых цвет кода Боба совпал с правильным цветом в коде Алисы. Второе число \(y\) равно размеру пересечения двух кодов, как мультимножеств. Другими словами, если Боб может поменять порядок цветов в его догадке, \(y\) равно максимальному количеству правильных индексов, которое он сможет получить.

Например, допустим \(n=5\), код Алисы будет \([3,1,6,1,2]\) и догадка Боба будет \([3,1,1,2,5]\). В позициях \(1\) и \(2\) цвета совпали, тогда как в других позициях нет. Поэтому \(x=2\). И два кода имеют четыре общих цвета \(1,1,2,3\), поэтому \(y=4\).

Обычные линии обозначают совпадающие цвета на одинаковых позициях. Пунктирные линии обозначают одинаковые цвета на разных позициях. Тогда \(x\) равно количеству обычных линий и \(y\) равно количеству всех линий.

Вам дан код-догадка Боба и два значения \(x\) и \(y\). Можете ли вы найти какой-то возможный загаданный код Алисы, такой что числа \(x\) и \(y\) будут правильными?

Входные данные

В первой строке находится единственное целое число \(t\) (\(1\le t\le 1000\))  — количество наборов входных данных. Следующие \(2t\) строк содержат описания наборов входных данных.

В первой строке каждого набора входных данных находится три целых числа \(n,x,y\) (\(1\le n\le 10^5, 0\le x\le y\le n\))  — длины кодов и два числа, которые сказала Алиса.

Во второй строке каждого набора входных данных находится \(n\) целых чисел \(b_1,\ldots,b_n\) (\(1\le b_i\le n+1\))  — догадка Боба, где \(b_i\) равно \(i\)-у цвету в его коде.

Гарантируется что сумма всех \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных в первой строке выведите «YES», если существует решение или «NO», если не существует ни одного секретного кода Алисы, соответствующего данной ситуации. Вы можете вывести каждый символ в любом регистре (верхнем или нижнем).

Если ответ «YES», на следующей строке выведите \(n\) целых чисел \(a_1,\ldots,a_n\) (\(1\le a_i\le n+1\))  — секретный код Алисы, где \(a_i\) равно \(i\)-у цвету этого кода.

Если существует несколько возможных решений, выведите любое.

Примечание

Первый набор входных данных описан в условии.

Во втором наборе в входных данных \(x=3\), потому что цвета совпадают на позициях \(2,4,5\). И \(y=4\), потому что цвета \(1,1,1,2\) общие у двух кодов.

В третьем наборе входных данных \(x=0\), потому что цвета не совпадают ни в одной из позиций. Но \(y=4\), потому что цвета \(3,3,5,5\) общие у двух кодов.

В четвертом наборе входных данных можно показать что ни одного подходящего секретного кода Алисы не существует.

B2. Коа и пляж (сложная версия)

дп жадные алгоритмы Конструктив реализация *2200

Единственная разница между простой и сложной версиями заключается в ограничениях. В этой версии ограничения выше. Вы можете делать взломы только если обе версии задачи сданы.

Коала Коа на пляже!

Пляж состоит из (слева направо) берега, \(n+1\) метров моря, и острова в \(n+1\) метрах от берега.

Она измерила глубину моря на расстоянии \(1, 2, \dots, n\) метров от берега и сохранила эту информацию в массиве \(d\). \(d_i\) обозначает глубину моря в \(i\) метрах от берега для \(1 \le i \le n\).

Как и на любом пляже, на этом есть прилив, интенсивность прилива измеряется параметром \(k\) и влияет на все глубины с начала в момент времени \(t=0\) следующим образом:

  • На протяжении \(k\) секунд каждую секунду прилив увеличивает все глубины на \(1\).

  • На протяжении следующих \(k\) секунд каждую секунду прилив уменьшает все глубины на \(1\).

  • Этот процесс повторяется снова и снова (т.е. глубина увеличивается на протяжении \(k\) секунд, затем уменьшается на протяжении \(k\) секунд и так далее ...).

    Формально, давайте определим \(0\)-индексированный массив \(p = [0, 1, 2, \ldots, k - 2, k - 1, k, k - 1, k - 2, \ldots, 2, 1]\) длины \(2k\). В момент времени \(t\) (\(0 \le t\)) глубина на расстоянии \(i\) метров от берега равна \(d_i + p[t \bmod 2k]\) (\(t \bmod 2k\) обозначает остаток от деления \(t\) на \(2k\)). Обратите внимание, что изменения происходят мгновенно каждую секунду, см. примеры для лучшего понимания.

В момент времени \(t=0\) Коа стоит на берегу, и хочет добраться до острова. Пусть во время \(t\) (\(0 \le t\)) она находится в \(x\) (\(0 \le x \le n\)) метрах от берега:

  • За одну секунду Коа может проплыть на \(1\) метр дальше от берега (\(x\) меняется на \(x+1\)) или вообще не плыть (\(x\) остается неизменным), в обоих случаях \(t\) меняется на \(t+1\).

  • Поскольку Коа  — плохой пловец, глубина моря в точке, где она находится, не может превышать \(l\) во все целые точки времени (или она утонет). Более формально, если Коа находится в \(x\) (\(1 \le x \le n\)) метрах от берега в момент \(t\) (для некоторого целого \(t\ge 0\)), то глубина моря в этой точке  — \(d_x + p[t \bmod 2k]\) — не может превышать \(l\). Другими словами, \(d_x + p[t \bmod 2k] \le l\) должно выполняться всегда.

  • Когда Коа достигает острова в \(n+1\) метров от берега, она останавливается и может отдохнуть.

    Обратите внимание, что пока Коа плывет, прилив не влияет на нее (то есть она не может утонуть во время плавания). Обратите внимание, что Коа может оставаться на берегу, сколько ей нужно, и ни берег, ни остров не подвержены влиянию прилива (это твердая земля, и она там не утонет).

Коа хочет знать, сможет ли она добраться с берега на остров. Помогите ей!

Входные данные

В первой строке входных данных содержится одно целое число \(t\) (\(1 \le t \le 10^4\))  — количество наборов входных данных. Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит три целых числа: \(n\), \(k\) and \(l\) (\(1 \le n \le 3 \cdot 10^5; 1 \le k \le 10^9; 1 \le l \le 10^9\)) — количество метров моря и параметры \(k\) и \(l\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(d_1, d_2, \ldots, d_n\) (\(0 \le d_i \le 10^9\)) — глубины каждого метра моря.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных:

Выведите Yes, если Коа сможет добраться от берега до острова, и No в обратном случае.

Вы можете выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

Ниже \(s\) обозначает берег, \(i\) обозначает остров, \(x\) обозначает расстояние от Коа до берега, нижнее подчеркивание обозначает позицию Коа, а значения в массиве ниже обозначают текущие глубины, измененные под влиянием прилива, на расстояниях \(1, 2, \dots, n\) от берега.

В наборе входных данных \(1\) мы имеем \(n = 2, k = 1, l = 1, p = [ 0, 1 ]\).

Коа хочет добраться с берега (c \(x = 0\)) на остров (c \(x = 3\)). Опишем возможное решение:

  • Первоначально в \(t = 0\) пляж выглядит так: \([\underline{s}, 1, 0, i]\).
  • В \(t = 0\), если бы Коа решила доплыть до \(x = 1\), пляж выглядел бы так: \([s, \underline{2}, 1, i]\) в \(t = 1\), и так как \(2 > 1\) она бы утонула. Таким образом, Коа вместо этого ждет \(1\) секунду, а пляж выглядит как \([\underline{s}, 2, 1, i]\) в \(t = 1\).
  • В \(t = 1\) Коа плывет до \(x = 1\), пляж выглядит как \([s, \underline{1}, 0, i]\) в \(t = 2\). Коа не тонет, потому что \(1 \le 1\).
  • В \(t = 2\) Коа плывет до \(x = 2\), пляж выглядит как \([s, 2, \underline{1}, i]\) в \(t = 3\). Коа не тонет, потому что \(1 \le 1\).
  • В \(t = 3\) Коа плывет до \(x = 3\), пляж выглядит как \([s, 1, 0, \underline{i}]\) в \(t = 4\).
  • В \(t = 4\) Коа находится в \(x = 3\), и она сделала это!

Можно показать, что наборе входных данных \(2\) Коа не сможет доплыть до острова.

D. а-хорошая строка

битмаски дп Перебор разделяй и властвуй реализация *1500

Вам дана строка \(s[1 \dots n]\), состоящая из строчных латинских букв. Гарантируется, что \(n = 2^k\) для некоторого целого числа \(k \ge 0\).

Строка \(s[1 \dots n]\) называется \(c\)-хорошей, если выполняется как минимум одно из следующих условий:

  • Длина строки \(s\) равна \(1\) и она состоит из единственного символа \(c\) (то есть \(s_1=c\));
  • Длина строки \(s\) больше \(1\), первая половина строки состоит только из символа \(c\) (то есть \(s_1=s_2=\dots=s_{\frac{n}{2}}=c\)), а вторая половина строки (то есть строка \(s_{\frac{n}{2} + 1}s_{\frac{n}{2} + 2} \dots s_n\)) является \((c+1)\)-хорошей строкой;
  • Длина строки \(s\) больше \(1\), вторая половина строки состоит только из символа \(c\) (то есть \(s_{\frac{n}{2} + 1}=s_{\frac{n}{2} + 2}=\dots=s_n=c\)), а первая половина строки (то есть строка \(s_1s_2 \dots s_{\frac{n}{2}}\)) является \((c+1)\)-хорошей строкой.

Например: «aabc» является 'a'-хорошей, «ffgheeee» является 'e'-хорошей.

За один ход вы можете выбрать один индекс \(i\) от \(1\) до \(n\) и заменить \(s_i\) на любую строчную латинскую букву (любой символ от 'a' до 'z').

Ваша задача — найти минимальное количество ходов, необходимое, чтобы получить 'a'-хорошую строку из \(s\) (т.е. \(c\)-хорошую строку для \(c=\) 'a'). Гарантируется, что ответ всегда существует.

Вам нужно ответить на \(t\) независимых наборов тестовых данных.

Еще один пример 'a'-хорошей строки является следующим. Например, рассмотрим строку \(s = \)«cdbbaaaa». Это 'a'-хорошая строка, потому что:

  • вторая половина строки («aaaa») состоит только из символов 'a';
  • первая половина строки («cdbb») — 'b'-хорошая строка, потому что:
    • вторая половина строки («bb») состоит только из символов 'b';
    • первая половина строки («cd») — 'c'-хорошая строка, потому что:
      • первая половина строки («c») состоит из единственного символа 'c';
      • вторая половина строки («d») — 'd'-хорошая строка.
Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 131~072\)) — длину \(s\). Гарантируется, что \(n = 2^k\) для некоторого целого числа \(k \ge 0\). Вторая строка набора тестовых данных содержит строку \(s\), состоящую из \(n\) строчных латинских букв.

Гарантируется, что сумма всех \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Для каждого набора тестовых данных выведите ответ на него — наименьшее количество ходов, необходимое, чтобы получить 'a'-хорошую строку \(s\) (т.е. \(c\)-хорошую строку для \(c =\) 'a'). Гарантируется, что ответ существует.

F. Удаление листьев

Деревья жадные алгоритмы реализация Структуры данных *2300

Вам дано дерево (связный граф без циклов), состоящее из \(n\) вершин. Дерево не является корневым — это просто неориентированный связный граф без циклов.

За один ход вы можете выбрать ровно \(k\) листьев (лист — это такая вершина, которая соединена только с одной другой вершиной), соединенных с одной и той же вершиной, и удалить их вместе с ребрами, инцидентными им. То есть вы выбираете такие листья \(u_1, u_2, \dots, u_k\), что существуют ребра \((u_1, v)\), \((u_2, v)\), \(\dots\), \((u_k, v)\), и удаляете эти листья вместе с этими ребрами.

Ваша задача — найти максимальное количество ходов, которое вы можете совершить, если вы будете удалять листья оптимально.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит два целых числа \(n\) и \(k\) (\(2 \le n \le 2 \cdot 10^5\); \(1 \le k < n\)) — количество вершин в дереве и количество листьев, которые вы удаляете за один ход, соответственно. Следующие \(n-1\) строк описывают ребра. \(i\)-е ребро представлено в виде пары целых чисел \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\)), где \(x_i\) и \(y_i\) — это вершины, которые соединяет \(i\)-е ребро. Гарантируется, что заданный набор ребер образует дерево.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Выведите ответ на каждый набор тестовых данных — максимальное количество ходов, которое вы можете совершить, если вы будете удалять листья оптимально.

Примечание

Картинка, соответствующая первому набору тестовых данных примера:

Здесь вы можете удалить вершины \(2\), \(5\) и \(3\) в течение первого хода и вершины \(1\), \(7\) и \(4\) в течение второго хода.

Картинка, соответствующая второму набору тестовых данных примера:

Здесь вы можете удалить вершины \(7\), \(8\) и \(9\) в течение первого хода, затем вершины \(5\), \(6\) и \(10\) в течение второго хода, и вершины \(1\), \(3\) и \(4\) в течение третьего хода.

Картинка, соответствующая третьему набору тестовых данных примера:

Здесь вы можете удалить вершины \(5\) и \(7\) в течение первого хода, затем вершины \(2\) и \(4\) в течение второго хода, и вершины \(1\) и \(6\) в течение третьего хода.

G. Перевороты столбцов

2-sat графы поиск в глубину и подобное реализация снм *2300

Вам дана таблица \(a\) размера \(2 \times n\) (из двух строк и \(n\) столбцов), состоящая из целых чисел от \(1\) до \(n\).

За один ход вы можете выбрать какой-то столбец \(j\) (\(1 \le j \le n\)) и обменять местами значения \(a_{1, j}\) и \(a_{2, j}\). Каждый столбец может быть выбран не более одного раза.

Ваша задача — найти минимальное количество ходов, необходимое для того, чтобы получить перестановки размера \(n\) в первой и во второй строках, или же определить, что это сделать невозможно.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Напомним, что перестановкой размера \(n\) называется такой массив размера \(n\), который содержит каждое целое число от \(1\) до \(n\) ровно один раз (порядок элементов не важен).

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество столбцов в таблице. Вторая строка набора входных данных содержит \(n\) целых чисел \(a_{1, 1}, a_{1, 2}, \dots, a_{1, n}\) (\(1 \le a_{1, i} \le n\)), где \(a_{1, i}\) — это \(i\)-й элемент первой строки таблицы. Третья строка набора входных данных содержит \(n\) целых чисел \(a_{2, 1}, a_{2, 2}, \dots, a_{2, n}\) (\(1 \le a_{2, i} \le n\)), где \(a_{2, i}\) — это \(i\)-й элемент второй строки таблицы.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Выведите ответ на каждый набор тестовых данных: -1, если невозможно получить перестановки размера \(n\) в первой и второй строках таблицы, или же одно целое число \(k\) в первой строке, где \(k\) равно минимальному количеству ходов, необходимому для получения перестановок в обеих строках, а затем \(k\) различных целых чисел \(pos_1, pos_2, \dots, pos_k\) во второй строке (\(1 \le pos_i \le n\)) в любом порядке — индексы столбцов, в которых вам необходимо обменять значения местами для получения перестановок в обеих строках. Если существует несколько ответов, выведите любой.

D. Капитан Флинт и сокровище

графы Деревья жадные алгоритмы поиск в глубину и подобное реализация Структуры данных *2000

В погоне за очередным сокровищем капитан Флинт наткнулся на некоторую задачу, которая может быть связана с поиском сокровища, а может и не быть. Поэтому капитан Флинт поручил ее решение своим матросам и назначил огромное вознаграждение: целый один выходной день. Задача же звучит так...

Заданы массивы \(a\) и \(b\) длины \(n\). Изначально, \(ans\) равен \(0\) и определена следующая операция:

  1. Выбрать позицию \(i\) (\(1 \le i \le n\));
  2. Добавить к \(ans\) значение \(a_i\);
  3. Если \(b_i \neq -1\), то добавить к \(a_{b_i}\) значение \(a_i\);

Какой максимальный \(ans\) можно получить, применив эту операцию к каждой позиции \(i\) (\(1 \le i \le n\)) ровно один раз?

Дядя Богдан очень хочет получить вознаграждение и просит Вас помочь ему с решением задачи, а также предоставить порядок позиций, в котором нужно применять операцию выше.

Входные данные

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина массивов \(a\) и \(b\).

Во второй строке каждого набора задано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(−10^6 \le a_i \le 10^6\)).

В третьей строке каждого набора задано \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le n\) или \(b_i = -1\)).

Дополнительное ограничение: гарантируется, что для \(i\) (\(1 \le i \le n\)) последовательность \(b_i, b_{b_i}, b_{b_{b_i}}, \ldots\) не зациклится, то есть будет всегда оканчиваться на \(-1\).

Выходные данные

В первой строке выведите одно целое число, максимальный \(ans\), который можно получить.

Во второй строке опишите последовательность выполнения операций, чтобы получить этот максимальный ответ: \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)), где \(p_i\) обозначает позицию, операция над которой выполняется \(i\)-й по порядку. Если существует несколько таких последовательностей, выведите любою из них.

D. Пересечения отрезков

жадные алгоритмы математика Перебор реализация *2100

Вам заданы два списка отрезков \([al_1, ar_1], [al_2, ar_2], \dots, [al_n, ar_n]\) и \([bl_1, br_1], [bl_2, br_2], \dots, [bl_n, br_n]\).

Первоначально, все отрезки \([al_i, ar_i]\) равны \([l_1, r_1]\) и все отрезки \([bl_i, br_i]\) равны \([l_2, r_2]\).

За один шаг вы можете выбрать один отрезок (либо из первого списка, либо из второго) и удлинить его на \(1\). Другими словами, предположим, вы выбрали отрезок \([x, y]\), тогда вы можете его превратить либо в \([x - 1, y]\), либо в \([x, y + 1]\).

Объявим суммарное пересечение \(I\) как сумму длин пересечений соответствующих пар отрезков, то есть \(\sum\limits_{i=1}^{n}{\text{intersection_length}([al_i, ar_i], [bl_i, br_i])}\). Пустое пересечение имеет длину \(0\), а длина отрезка \([x, y]\) равна \(y - x\).

Какое минимальное количество шагов необходимо выполнить, чтобы сделать \(I\) большим или равным \(k\)?

Входные данные

В первой строке задано единственное число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5\); \(1 \le k \le 10^9\)) — длина каждого из списков и минимально необходимое суммарное пересечение.

Во второй строке каждого набора заданы два целых числа \(l_1\) и \(r_1\) (\(1 \le l_1 \le r_1 \le 10^9\)) — отрезок, которому первоначально равны все \([al_i, ar_i]\).

В третьей строке каждого набора заданы два целых числа \(l_2\) и \(r_2\) (\(1 \le l_2 \le r_2 \le 10^9\)) — отрезок, которому первоначально равны все \([bl_i, br_i]\).

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(t\) чисел — по одному на набор входных данных. Для каждого набора, выведите минимальное количество необходимых шагов, чтобы сделать \(I\) больше или равным \(k\).

Примечание

В первом наборе входных данных, мы можем достигнуть суммарного пересечения \(5\), используя, например, следующую стратегию:

  • превратим \([al_1, ar_1]\) из \([1, 2]\) в \([1, 4]\) за \(2\) шага;
  • превратим \([al_2, ar_2]\) из \([1, 2]\) в \([1, 3]\) за \(1\) шаг;
  • превратим \([bl_1, br_1]\) из \([3, 4]\) в \([1, 4]\) за \(2\) шага;
  • превратим \([bl_2, br_2]\) из \([3, 4]\) в \([1, 4]\) за \(2\) шага.
В результате, \(I = \text{intersection_length}([al_1, ar_1], [bl_1, br_1]) + \text{intersection_length}([al_2, ar_2], [bl_2, br_2]) + \\ + \text{intersection_length}([al_3, ar_3], [bl_3, br_3]) = 3 + 2 + 0 = 5\).

Во втором наборе, мы можем сделать \([al_1, ar_1] = [0, 1000000000]\) за \(1000000000\) шагов и \([bl_1, br_1] = [0, 1000000000]\) за \(1000000000\) шагов.

В третьем наборе, суммарное пересечение \(I\) уже равно \(10 > 3\), а потому, не нужно делать ни одного шага.

A. Петя и книга

реализация *1000

В воскресенье Петя зашел в книжный магазин и купил новую книгу по спортивному программированию. В книге было ровно n страниц.

Петя решил начать читать ее со следующего дня, то есть с понедельника. У Пети очень тесное расписание, и для каждого дня недели он знает, сколько страниц он будет успевать прочитать за этот день. У Пети могут быть настолько занятые дни, что у него совсем не будет времени читать, но известно, что хотя бы одну страницу в неделю он прочитать успевает.

Предполагая, что Петя не будет пропускать дни, и каждый день будет читать столько, сколько сможет, определите, какой день недели будет, когда он дочитает последнюю страницу книги.

Входные данные

В первой строке находится единственное целое число n (1 ≤ n ≤ 1000) — количество страниц в книге.

Во второй строке находится семь неотрицательных целых чисел, не превосходящих 1000, разделенных пробелами — количества страниц, которые Петя успевает прочесть в понедельник, вторник, среду, четверг, пятницу, субботу и воскресенье соответственно. Гарантируется, что хотя бы одно из этих чисел больше нуля.

Выходные данные

Выведите одно число — номер дня недели, на котором Петя закончит читать книгу. Дни недели нумеруются начиная с единицы в естественном порядке: понедельник, вторник, среда, четверг, пятница, суббота, воскресенье.

Примечание

Комментарий к первому примеру:

К концу понедельника и, соответственно, к началу вторника у Пети останется 85 страниц, к среде — 65, к четвергу — 45, к пятнице — 30, к субботе — 20, в субботу Петя закончит читать книгу (и успеет прочитать еще 10 страниц чего-нибудь другого).

Комментарий ко второму примеру:

В понедельник первой недели Петя прочитает первую страницу, в понедельник второй недели Петя прочитает вторую страницу и закончит читать книгу.

B. Ремонт

математика реализация *1600

После покупки собственной квартиры Боря решил поклеить в каждой комнате обои. В Бориной квартире n комнат, каждая из которых имеет форму прямоугольного параллелепипеда. Про каждую комнату известны длина, ширина и высота стен в метрах (разные комнаты могут иметь разные размеры, в том числе и высоту).

Боря выбрал m типов обоев, которыми он хочет обклеить стены комнат (но не обязательно использовать все типы). Каждый тип обоев продается в рулонах фиксированной длины и ширины (длина, естественно, в размотанном состоянии). Кроме того, для каждого типа известна стоимость одного рулона этого типа.

На обоях каждого типа изображены полоски, идущие вдоль длины рулона. При поклейке полоски обязательно должны располагаться строго вертикально (поэтому рулон нельзя поворачивать, даже если длина меньше ширины). При этом рулоны можно резать произвольным образом, но стыки наклеенных кусков также должны быть вертикальными. Кроме того, в каждой комнате должны использоваться обои только одного типа, и куски одного и того же рулона нельзя клеить в разных комнатах, то есть для каждой комнаты рулоны закупаются отдельно. При этом некоторые рулоны могут быть использованы не полностью.

После покупки квартиры у Бори туго со средствами, поэтому он хочет потратить на обои минимальную сумму. Помогите ему.

Входные данные

В первой строке находится натуральное число n (1 ≤ n ≤ 500) — количество комнат в Бориной квартире.

В каждой из следующих n строк находится по три натуральных числа, разделенных пробелами — длина, ширина и высота стен в метрах очередной комнаты соответственно.

В следующей строке находится натуральное число m (1 ≤ m ≤ 500) — количество доступных типов обоев.

В каждой из следующих m строк находится по три натуральных числа, разделенных пробелами — длина и ширина в метрах, а также стоимость одного рулона очередного типа обоев соответственно.

Все числа во входных данных не превосходят 500. Гарантируется, что каждую комнату можно обклеить, используя данные типы обоев.

Выходные данные

Выведите одно число — минимальную суммарную стоимость рулонов.

Примечание

Комментарий к примеру:

Суммарная длина стен (периметр) комнаты — 20 м.

Из одного рулона первого типа можно сделать три вертикальные полоски шириной 1 м., значит, нужно 7 рулонов этого типа, цена — 700.

Из рулона второго типа получается пять полосок ширины 2 м., нужно 2 рулона, цена — 640.

Одним рулоном третьего типа получится сразу заклеить 19 м. из 20, но пользоваться другими типами уже нельзя и придется докупать второй, цена — 1000.

B. Начни с себя

жадные алгоритмы Перебор реализация *800

Рассмотрим конвейер, представляющий собой сетку, состоящую из \(n\) строк и \(m\) столбцов. Ячейка в \(i\)-й строке сверху и в \(j\)-м слева столбце обозначается как \((i,j)\).

Каждой ячейке, кроме \((n,m)\), назначено направление R (вправо) или D (вниз). Если ячейке \((i,j)\) назначено направление R, любой багаж в ней переместится в ячейку \((i,j+1)\). Аналогично, если ячейке \((i,j)\) назначено D, любой багаж в ней переместится в ячейку \((i+1,j)\). Если в любой момент времени багаж выходит за пределы сетки, он считается утерянным.

В ячейке \((n,m)\) есть стойка, где подбирается весь багаж. Конвейер называется работоспособным тогда и только тогда, когда любой багаж достигнет стойки, независимо от того, в какую ячейку он изначально помещен. Более формально, для каждой ячейки \((i,j)\) любой багаж, помещенный в эту ячейку, должен в итоге оказаться в ячейке \((n,m)\).

Может случиться такое, что это условие изначально не выполняется; вам, однако, разрешено изменять направления некоторых ячеек для обеспечения работоспособности конвейера. Пожалуйста, определите минимальное количество ячеек, направления в которых вы должны изменить.

Обратите внимание, что всегда можно сделать любой конвейер работоспособным, изменив направления набора ячеек.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит два целых числа \(n, m\) (\(1 \le n \le 100\), \(1 \le m \le 100\)) — количество строк и столбцов соответственно.

Каждая из следующих \(n\) строк содержит \(m\) символов. \(j\)-й символ в строке \(i\), \(a_{i,j}\), является начальным направлением ячейки \((i, j)\). Обратите внимание, что \(a_{n,m}=\) C.

Выходные данные

Для каждого случая выведите в новой строке минимальное количество ячеек, которое необходимо изменить, чтобы обеспечить работоспособность конвейера.

Примечание

В первом случае достаточно просто изменить направление \((2,3)\) на D.

Вы можете проверить работоспособность полученного конвейера. Например, если мы поместим багаж в \((2,2)\), он сначала переместится в \((3,2)\), а затем в \((3,3)\).

Во втором случае у нас нет другого выбора, кроме как изменить первые \(3\) ячейки с D на R, сделав сетку равной RRRC.

D. 505

битмаски дп жадные алгоритмы Конструктив Перебор реализация *2000

Бинарная матрица называется хорошей, если каждая квадратная подматрица c четной длиной стороны содержит нечетное число единиц.

Для данной бинарной матрицы \(a\), состоящей из \(n\) строк и \(m\) столбцов, определите минимальное количество ячеек, которые нужно изменить, чтобы сделать ее хорошей, или сообщите, что ее вообще нельзя сделать хорошей.

Все вышеприведенные термины имеют свои обычные значения  — обратитесь к разделу Примечания для их формальных определений.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq m \leq 10^6\) и \(n\cdot m \leq 10^6\)) — число строк и столбцов в \(a\) соответственно.

Каждая из следующих \(n\) строк содержит \(m\) символов, каждый из которых равен 0 или 1. Если \(j\)-й символ в \(i\)-й строке равен 1, то \(a_{i,j} = 1\). Аналогично, если \(j\)-й символ в \(i\)-й строке равен 0, то \(a_{i,j} = 0\)

Выходные данные

Выведите минимальное количество ячеек, которое нужно изменить, чтобы сделать \(a\) хорошей, или выведите \(-1\), если это вообще невозможно.

Примечание

В первом случае достаточно заменить \(a_{1,1}\) на \(0\) и \(a_{2,2}\) на \(1\).

Вы можете проверить, что нет никакой возможности сделать матрицу во втором случае хорошей.

Некоторые определения  —

  • Бинарная матрица  — это матрица, в которой каждый элемент равен \(1\) или \(0\).
  • Подматрица описывается \(4\) параметрами  — \(r_1\), \(r_2\), \(c_1\) и \(c_2\); здесь \(1 \leq r_1 \leq r_2 \leq n\) и \(1 \leq c_1 \leq c_2 \leq m\).
  • Эта подматрица содержит все элементы \(a_{i,j}\), которые удовлетворяют как \(r_1 \leq i \leq r_2\) так и \(c_1 \leq j \leq c_2\).
  • Подматрица называется квадратом четной длины, если\(r_2-r_1 = c_2-c_1\) и \(r_2-r_1+1\) делится на \(2\).

B. Омкар и Часы Бесконечности

математика реализация *800

Когда Рэй застрял дома, ему стало очень скучно. Чтобы скоротать время, он просит лорда Омкара использовать силу, сгибающую время: Часы Бесконечности! Однако, Лорд Омкар будет слушать только смертных, которые могут решить следующую задачу:

Вам дан массив \(a\) из \(n\) целых чисел. Вам также дается целое \(k\). Лорд Омкар хочет, чтобы вы сделали с этим массивом \(k\) операций.

Определим одну операцию следующим образом:

  1. Пусть \(d\) равно максимальному значению вашего массива.
  2. Для каждого \(i\) от \(1\) до \(n\) замените \(a_{i}\) на \(d-a_{i}\).

Цель  — предсказать содержимое массива после \(k\) операций. Пожалуйста, помогите Рэю определить, как будет выглядеть окончательный массив!

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 100\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \leq n \leq 2 \cdot 10^5, 1 \leq k \leq 10^{18}\)) — длину вашего массива и количество операций, которые необходимо выполнить.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_{1},a_{2},...,a_{n}\) \((-10^9 \leq a_{i} \leq 10^9)\) — начальное содержимое массива.

Гарантируется, что сумма \(n\) по наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого случая выведите финальную версию массива \(a\) после описанных выше \(k\) операций.

Примечание

В первом наборе входных данных массив изменяется следующим образом:

  • Изначально массив равен \([-199, 192]\). \(d = 192\).

  • После операции массив становится равным \([d-(-199), d-192] = [391, 0]\).

C. Омкар и водная горка

жадные алгоритмы реализация *1200

Омкар строит водную горку в своем аквапарке, и ему нужна ваша помощь, чтобы сделать это как можно эффективнее.

В настоящее время у Омкара есть \(n\) опор, выстроенных в линию, \(i\)-я из которых имеет высоту \(a_i\). Омкар хочет построить свою водную горку справа налево, поэтому его опоры должны быть неспадающими по высоте, чтобы выдержать водную горку. За \(1\) операцию Омкар может сделать следующее: взять любой последовательный подотрезок опор, неспадающий по высотам, и добавить \(1\) к высоте каждой из них.

Помогите Омкару найти минимальное количество операций, которые ему нужно сделать, чтобы его опоры смогли выдержать его водную горку!

Последовательность \(b\) является подотрезком \(c\), если \(b\) может быть получена из \(c\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца.

Массив \(b_1, b_2, \dots, b_n\) называется неспадающим, если \(b_i\le b_{i+1}\) для каждого \(i\) от \(1\) до \(n-1\).

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \leq t \leq 100\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество опор Омкара.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_{1},a_{2},...,a_{n}\) \((0 \leq a_{i} \leq 10^9)\) — высоты опор.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превысит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которое необходимо выполнить Омкару, чтобы его опоры могли выдерживать его водную горку.

Примечание

Подмассив, с которым Омкар выполняет операцию, выделен жирным шрифтом.

В первом наборе входных данных:

  • Первая операция:

    \([5, 3, \textbf{2}, 5] \to [5, 3, \textbf{3}, 5]\)

  • Вторая операция:

    \([5, \textbf{3}, \textbf{3}, 5] \to [5, \textbf{4}, \textbf{4}, 5]\)

  • Третья операция:

    \([5, \textbf{4}, \textbf{4}, 5] \to [5, \textbf{5}, \textbf{5}, 5]\)

В третьем наборе входных данных массив уже является неспадающим, поэтому Омкар выполняет \(0\) операций.

B. Эпплджек и хранилища

жадные алгоритмы Конструктив реализация Структуры данных *1400

Этот год в Эквестрии выдался урожайным, и Эпплджек захотела построить новые хранилища для яблок. По советам проектировщиков фермы она решила построить два хранилища ненулевой площади: одно в форме квадрата, другое в форме прямоугольника (который, возможно, тоже является квадратом).

Хранилища Эпплджек будет строить из досок, на каждую сторону хранилища она собирается потратить ровно одну доску. Доски она может заказать в одной фирме у своего приятеля. Изначально на складе фирмы есть \(n\) досок, длины которых Эпплджек известны. Работа фирмы не стоит на месте, она периодически получает заказы и сама заказывает новые доски. Приятель Эпплджек может предоставить ей информацию о всех операциях. Для удобства он будет сообщать информацию в следующем формате:

  • \(+\) \(x\) — на склад поступила доска с длиной \(x\)
  • \(-\) \(x\) — со склада отгрузили доску с длиной \(x\) (при этом гарантируется, что на складе были какие-то доски длины \(x\))

Эпплджек пока не определилась, когда она будет заказывать доски, поэтому она хочет после каждого события на складе знать, может ли она заказать доски, чтобы построить прямоугольное и квадратное хранилища. Эпплджек занята сбором яблок, поэтому у нее нет времени на подсчеты, и она попросила вас помочь ей!

Напоминаем, что у квадрата все четыре стороны равны, а у прямоугольника две пары равных сторон.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — изначальное количество досок на складе фирмы, вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^5\)) — длины досок.

Третья строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество событий в фирме. Каждая из следующих \(q\) строк содержит описание событий в данном формате: сначала идет тип события (символ \(+\) или \(-\)), а затем число \(x\) (\(1 \le x \le 10^5\)).

Выходные данные

После каждого события на фирме выведите «YES», если из досок на складе фирмы можно собрать два хранилища нужной формы, и «NO» иначе (без кавычек). Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

После второго события Эпплджек может построить прямоугольное хранилище из досок с длинами \(1\), \(2\), \(1\), \(2\) и квадратное хранилище из досок с длинами \(1\), \(1\), \(1\), \(1\).

После шестого события Эпплджек может построить прямоугольное хранилище из досок с длинами \(1\), \(1\), \(1\), \(1\) и квадратное хранилище из досок с длинами \(2\), \(2\), \(2\), \(2\).

D. Рарити и новое платье

дп кратчайшие пути поиск в глубину и подобное реализация *2100

В бутике Карусель вновь кипит работа! Рарити решила посетить бал пони и для этого ей, конечно, необходимо новое платье, ведь выходить в свет в одном и том же платье несколько раз является признаком дурного тона. Для того чтобы сшить платье, ей прежде всего нужна выкройка, которую она вырежет из прямоугольного куска разноцветной ткани.

Кусок разноцветной ткани состоит из \(n \times m\) отдельных квадратных лоскутков. Так как Рарити любит платья со вкусом, выкройка должна быть целиком составлена из лоскутков одного цвета. Выкройка должна быть квадратной и, так как Рарити обожает ромбы, его стороны должны находиться под углом \(45^{\circ}\) к сторонам куска ткани (так он больше всего похож на классическое представление ромба).

Примеры подходящих выкроек: Примеры неподходящих выкроек: Первая состоит из лоскутков разного цвета, вторая выходит за границы куска ткани, третья не является квадратом со сторонами под углом \(45^{\circ}\) к сторонам куска ткани.

Рарити интересно, сколько существует вариантов вырезать выкройку, которая удовлетворяет всем нужным условиям. Помогите ей удовлетворить свое любопытство, чтобы она могла продолжать работу над своим новым шедевром!

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2000\)). Каждая из следующих \(n\) строк содержит \(m\) символов — строчных латинских букв, \(j\)-я из которых соответствует лоскутку в текущей строке и \(j\)-м столбце. Лоскутки с одинаковыми буквами имеют одинаковые цвета, с различными — различные.

Выходные данные

Выведите единственное число — количество способов вырезать выкройку, чтобы удовлетворить условия Рарити.

Примечание

В первом тесте из условия подходят все выкройки размера \(1\) и одна размера \(2\).

Во втором тесте из условия подходят только выкройки размера \(1\).

E1. Искорка и древний свиток (упрощенная версия)

дп реализация Строки строковые суфф. структуры хэши *2800

Это более простая версия задачи E с меньшими ограничениями.

Сумеречная Искорка получила новое задание от принцессы Селестии. В этот раз Искорке нужно расшифровать древний свиток, содержащий важные знания о происхождении пони.

Чтобы скрыть важнейшую информацию от злых глаз, старейшины пони заколдовали свиток. Заклинание вставляет ровно одну букву в любое место каждого словa, к которому оно применено. Чтобы сделать путь к знанию более запутанным, старейшины выбрали некоторые из слов свитка и применили к ним заклинание.

Сумеречная Искорка знает, что старейшины во всем почитали порядок, поэтому изначально свиток содержал слова в лексикографически неубывающем порядке. Искорке нужно удалить по одной букве из некоторых слов в свитке (чтобы отменить заклинание), для того чтобы получить какую-то версию изначального свитка.

К сожалению, Искорка не всегда может однозначно восстановить древний свиток. Чтобы не упустить важные знания, ей придется перебрать все варианты изначального свитка и найти нужный. Чтобы оценить максимальное время, которое Искорка потратит на работу, ей нужно знать количество вариантов, которые ей нужно перебрать. Она просит вас найти это количество! Так как это количество может быть слишком большим, Искорке достаточно лишь знать его по модулю \(10^9+7\), остальную часть она сможет оценить сама.

Могло случиться так, что принцесса Селестия отправила неверный свиток, и Искорка не сможет получить никакую версию изначального свитка.

Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов:

  • \(a\) — префикс \(b\), но \(a \ne b\);
  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 1000\)) — количество слов в свитке. \(i\)-я из следующих \(n\) строк содержит строку, состоящую из строчных букв латинского алфавита — \(i\)-е слово свитка. Длина каждого слова больше либо равна \(1\). Суммарная длина всех слов не превосходит \(20000\).

Выходные данные

Выведите одно целое число — количество вариантов получить версию оригинала из свитка по модулю \(10^9+7\).

Примечание

Заметьте, что старейшины могли написать пустое слово (но тогда они точно применили к нему заклинание, и таким образом это слово теперь имеет длину \(1\)).

E2. Искорка и древний свиток (усложненная версия)

дп реализация Строки строковые суфф. структуры хэши *3200

Это более сложная версия задачи E с большими ограничениями.

Сумеречная Искорка получила новое задание от принцессы Селестии. В этот раз Искорке нужно расшифровать древний свиток, содержащий важные знания о происхождении пони.

Чтобы скрыть важнейшую информацию от злых глаз, старейшины пони заколдовали свиток. Заклинание вставляет ровно одну букву в любое место каждого словa, к которому оно применено. Чтобы сделать путь к знанию более запутанным, старейшины выбрали некоторые из слов свитка и применили к ним заклинание.

Сумеречная Искорка знает, что старейшины во всем почитали порядок, поэтому изначально свиток содержал слова в лексикографически неубывающем порядке. Искорке нужно удалить по одной букве из некоторых слов в свитке (чтобы отменить заклинание), для того чтобы получить какую-то версию изначального свитка.

К сожалению, Искорка не всегда может однозначно восстановить древний свиток. Чтобы не упустить важные знания, ей придется перебрать все варианты изначального свитка и найти нужный. Чтобы оценить максимальное время, которое Искорка потратит на работу, ей нужно знать количество вариантов, которые ей нужно перебрать. Она просит вас найти это количество! Так как это количество может быть слишком большим, Искорке достаточно лишь знать его по модулю \(10^9+7\), остальную часть она сможет оценить сама.

Могло случиться так, что принцесса Селестия отправила неверный свиток, и Искорка не сможет получить никакую версию изначального свитка.

Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов:

  • \(a\) — префикс \(b\), но \(a \ne b\);
  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество слов в свитке. \(i\)-я из следующих \(n\) строк содержит строку, состоящую из строчных букв латинского алфавита — \(i\)-е слово свитка. Длина каждого слова хотя бы один. Суммарная длина всех слов не превосходит \(10^6\).

Выходные данные

Выведите одно целое число — количество вариантов получить версию оригинала из свитка по модулю \(10^9+7\).

Примечание

Заметьте, что старейшины могли написать пустое слово (но тогда они точно применили к нему заклинание, и таким образом это слово теперь имеет длину \(1\)).

C. Monster Invaders

дп жадные алгоритмы реализация *2300

Ziota нашел игру, которая назыается «Monster Invaders».

Аналогично другим RPG стрелялкам, в «Monster Invaders» требуется уничтожать монстров и боссов с помощью оружия.

Для простоты, мы рассмотрим только два вида монстров и три вида оружия.

А именно, два вида монстров это:

  • обычный монстр с \(1\) hp.
  • босс с \(2\) hp.

И три вида оружия:

  • Пистолет, наносит \(1\) hp урона одному монстру, время перезарядки равно \(r_1\)
  • Лазерная пушка, наносит \(1\) hp урона всем монстрам в данном уровне (включая босса), время перезарядки равно \(r_2\)
  • AWP, мгновенно убивает любого монстра, время перезарядки равно \(r_3\)

Исходно оружия незаряжены, и Ziota не может перезаряжать несколько оружий одновременно.

Этапы в игре могут быть описаны массивом \(a_1, a_2, \ldots, a_n\), в котором \(i\)-й этап содержит \(a_i\) обычных монстров и одного босса. Из-за натуры игры, Ziota не может использовать пистолет (оружие первого типа) или AWP (оружие третьего типа) чтобы выстрелить в босса, до того как будут убиты все \(a_i\) обычных монстров.

Если Ziota ранит босса, но не убивает его полностью, он обязан уйти с текущего этапа на любой соседний этап (соседние к этапу \(i\) \((1 < i < n)\) это этапы \(i - 1\) и \(i + 1\), единственный сосед этапа \(1\) это этап \(2\), единственный этап соседний к этапу \(n\) это \(n - 1\)). Ziota также может уйти в любом соседний уровень в любой момент времени. Каждый переход между соседними уровнями выполняется с помощью портала, с временем телепортации \(d\).

Чтобы не повредить пространственно-временной континуум внутри игры, запрещено перезаряжаться или стрелять в монстров во время телепортации.

Ziota начинает игру на этапе 1. Его задача довольно проста, убить всех монстров на всех этапах. Он хочет узнать минимальное время, которое ему нужно, чтобы этого добиться (вы можете считать, что выстрел в монстров происходит мгновенно и у него есть бесконечное количество патронов для каждого оружия). Пожалуйста, помогите ему найти это значение.

Входные данные

В первой строке записаны пять целых чисел, разделенных пробелами: \(n\) \((2 \le n \le 10^6)\) — количество этапов, \(r_1, r_2, r_3\) \((1 \le r_1 \le r_2 \le r_3 \le 10^9)\) — времена перезарядки трех оружий, \(d\) \((1 \le d \le 10^9)\) — время перехода между соседними уровнями.

Во второй строке записаны \(n\) разделенных пробелами целых чисел \(a_1, a_2, \dots, a_n\) \((1 \le a_i \le 10^6, 1 \le i \le n)\).

Выходные данные

Выведите одно целое число, минимальное время, которое требуется для прохождения игры.

Примечание

В первом примере, оптимальная стратегия это:

  • Используйте пистолет чтобы убить трех обычных монстров и AWP, чтобы убить босса (Итоговое время равно \(1\cdot3+4=7\))
  • Переместитесь на этап два (Итоговое время \(7+3=10\))
  • Используйте пистолет дважды и AWP чтобы убить босса (Итоговое время \(10+1\cdot2+4=16\))
  • Переместитесь на этап три (Итоговое время \(16+3=19\))
  • Используйте лазерную пушку, теперь мы обязаны переместиться на этап два или четыре, мы движемся на этап четыре (Итоговое время \(19+3+3=25\))
  • Используйте пистолет один раз, используйте AWP, чтобы убить босса (Итоговое время \(25+1\cdot1+4=30\))
  • Двигайтесь обратно на этап три (Итоговое время \(30+3=33\))
  • Убейте босса на третьем этапе пистолетом (Итоговое время \(33+1=34\))

Обратите внимание, что здесь мы останавливаемся не на этапе \(n\), а когда все боссы убиты.

E. Два типа заклинаний

Бинарный поиск жадные алгоритмы математика реализация сортировки Структуры данных *2200

Поликарп играет в компьютерную игру (да, опять). В этой игре он сражается с монстрами при помощи заклинаний.

Есть два типа заклинаний: огненный шар силы \(x\) наносит \(x\) урона монстру, а молния силы \(y\) наносит \(y\) урона монстру и удваивает урон следующего заклинания. Каждое заклинание может быть использовано только один раз, но Поликарп может применять их в любом порядке.

Например, предположим, что Поликарп знает три заклинания: огненный шар силы \(5\), молнию силы \(1\) и молнию силы \(8\). Всего есть \(6\) способов выбрать порядок заклинаний:

  • первое, второе, третье. В таком случае вы нанесете \(5 + 1 + 2 \cdot 8 = 22\) урона;
  • первое, третье, второе. В таком случае вы нанесете \(5 + 8 + 2 \cdot 1 = 15\) урона;
  • второе, первое, третье. В таком случае вы нанесете \(1 + 2 \cdot 5 + 8 = 19\) урона;
  • второе, третье, первое. В таком случае вы нанесете \(1 + 2 \cdot 8 + 2 \cdot 5 = 27\) урона;
  • третье, первое, второе. В таком случае вы нанесете \(8 + 2 \cdot 5 + 1 = 19\) урона;
  • третье, второе, первое. В таком случае вы нанесете \(8 + 2 \cdot 1 + 2 \cdot 5 = 20\) урона.

Изначально Поликарп знает \(0\) заклинаний. Его набор заклинаний меняется \(n\) раз, каждый раз он либо учит новое заклинание, либо забывает старое. После каждого изменения выведите максимально количество урона, которое можно нанести при помощи имеющихся заклинаний.

Входные данные

Первая строка содержит целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество заклинаний в наборе.

Каждая из следующих \(n\) строк содержит два числа \(tp\) и \(d\) (\(0 \le tp_i \le 1\); \(-10^9 \le d \le 10^9\); \(d_i \neq 0\)) — описание изменений. Если \(tp_i\) равно \(0\), Поликарп учит (или забывает) огненный шар, иначе он учит (или забывает) молнию.

Если \(d_i > 0\), то Поликарп учит заклинание силы \(d_i\). Иначе, Поликарп забывает заклинание силы \(-d_i\), и гарантируется, что он знал это заклинание до этого.

Гарантируется, что после каждого изменения все силы заклинаний различны (Поликарп не может знать одновременно два заклинания одинаковой силы).

Выходные данные

После каждого изменения выведите максимально количество урона, которое можно нанести при помощи имеющихся заклинаний.

D. Из бинарной строки в подпоследовательности

жадные алгоритмы Конструктив реализация Структуры данных *1500

Вам задана бинарная строка \(s\), состоящая из \(n\) нулей или единиц.

Ваша задача – разделить заданную строку на минимальное число подпоследовательностей таким образом, что каждый символ строки принадлежит ровно одной подпоследовательности и каждая подпоследовательность выглядит подобно «010101 ...» или «101010 ...» (т.е. подпоследовательность не должна содержать два соседних нуля или единицы).

Напомним, что подпоследовательность — это последовательность, которая может быть получена путем удаления из заданной последовательности с помощью удаления нуля или более элементов без изменения порядка остальных элементов. Например, подпоследовательностями «1011101» являются «0», «1», «11111», «0111», «101», «1001», но не «000», «101010» и «11100».

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину \(s\). Вторая строка набора тестовых данных содержит \(n\) символов '0' и '1' — строку \(s\).

Гарантируется, что сумма всех \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Для каждого набора тестовых данных выведите ответ на него: первой строкой выведите одно целое число \(k\) (\(1 \le k \le n\)) — минимальное количество подпоследовательностей, на которые вы можете разделить строку \(s\). Второй строкой выведите \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)), где \(a_i\) — номер подпоследовательности, к которой принадлежит \(i\)-й символ строки \(s\).

Если существует несколько ответов, вы можете вывести любой.

A. Письмо

реализация *800

Мальчик Ваня очень любит рисовать. Недавно он купил прямоугольный лист клетчатой бумаги из n строк и m столбцов. Ваня заштриховал на нём некоторые клетки. Увидев свой шедевр, он решил поделиться им со своим старшим братом, который живёт во Флатландии. Теперь Ване надо послать картину по почте, но в связи с мировым финансовым кризисом и высокими ценами на нефть, он хочет сделать это, потратив как можно меньше денег. За каждую отосланную клеточку бумаги (независимо от того заштрихована клетка или нет) Ваня должен заплатить 3.14 бурлей. Помогите Ване вырезать из шедевра прямоугольник наименьшей стоимости, содержащий все зашрихованные клетки. Стороны прямоугольника должны быть параллельны сторонам листа бумаги.

Входные данные

В первой строке входных данных находятся числа n и m (1 ≤ n, m ≤ 50), n — количество строк, а m — количество столбцов на листе бумаги Вани. В следующих n строках содержится по m символов. Символ «.» обозначает незаштрихованную клетку листа бумаги, а «*» — заштрихованную. Гарантируется, что Ваня заштриховал хотя бы одну клетку.

Выходные данные

Выведите искомый наименьший по стоимости прямоугольник. Смотрите примеры выходных данных для уточнения формата вывода.

B. Юный фотограф

реализация *1000

Кроме всего прочего, Вася увлекается фотографией. Особенно он любит фотографировать спортсменов. По этой причине он встал в позиции x0 длинной прямой беговой дорожки и приготовился к фотосъемке. Но вот незадача — далеко не все спортсмены пробегали мимо него! Всего на беговой дорожке тренируется n спортсменов. И каждый из них регулярно пробегает отрезок дорожки, один и тот же для каждого спортсмена. Например, первый спортсмен пробегает от позиции a1 до позиции b1, второй — от a2 до b2 и т.д.

На какое минимальное расстояние надо переместиться Васе, чтобы иметь возможность сфотографировать каждого спортсмена? Вася может сфотографировать спортсмена, если он расположен на отрезке пути спортсмена на беговой дорожке.

Входные данные

В первой строке входного файла записано целые числа n и x0 (1 ≤ n ≤ 100; 0 ≤ x0 ≤ 1000). Далее в n строках записаны пары целых чисел ai, bi (0 ≤ ai, bi ≤ 1000; ai ≠ bi).

Выходные данные

Выведите искомое минимальное расстояние в тех же единицах измерения, что измеряются позиции на беговой дорожке. Если искомой позиции не существует, то выведите -1.

C. Четыре отрезка

геометрия Конструктив математика Перебор реализация *1700

Несколько месяцев спустя Лёня всё-таки получил творение брата Вани по почте. И теперь Лёня решил сам похвастаться чем-нибудь перед братом. Немного подумав он понял, что у него нет готовых творений и решил написать программу распознавания прямоугольников. По его замыслу программа по четырём заданным отрезкам определяет образуют ли эти отрезки прямоугольник положительной площади со сторонами параллельными осям координат. Так как Лёня плохо учится в школе и сам не может написать такую программу, он попросил вас помочь ему в этом.

Входные данные

Входные данные состоят из четырёх строк. Каждая строка состоит из четырёх целых чисел x1, y1, x2, y2 ( - 109 ≤ x1, y1, x2, y2 ≤ 109) координаты начала и конца отрезка. Заданные отрезки могут вырождаться в точки.

Выходные данные

Выведите слово «YES» если данные четыре отрезка образуют искомый прямоугольник и «NO» в противном случае.

B. Новогодние открытки

жадные алгоритмы Перебор реализация *1800

В то время как хозяйственный Геральд накрывает стол, Александр закончил очередной пост на Codeforces и начинает отвечать на новогодние поздравления друзей. У Александра n друзей, и каждый из них отправляет Александру ровно одну электронную открытку. Будем нумеровать друзей числами от 1 до n в том порядке, в котором они отправляют открытки. Для открыток введем ту же самую нумерацию, то есть получается, что i-ый друг отправил Александру открытку с номером i.

Александр тоже отправляет друзьям открытки, причем чтобы не искать открытки в Интернете, он просто использует ранее присланные ему (иногда, правда, дорисовывая необходимые элементы). Изначально у Александра нет открыток. Александр всегда придерживается двух правил:

  1. Он никогда не отправляет другу открытку, присланную этим же другом.
  2. Среди остальных открыток, имеющихся у него в данный момент, Александр всегда выбирает ту, которая больше всех нравится ему самому.

Каждому другу Александр планирует отправить ровно по одной открытке. Разумеется, Александр может отправлять одну и ту же открытку несколько раз.

У Александра и у каждого из друзей есть список предпочтений, представляющий собой перестановку чисел от 1 до n. Первое число в списке — это номер самой любимой открытки, второе — следующей за ней, и так далее, последний номер — наименее предпочтительная открытка.

Ваша задача — определить, в какие моменты времени Александр должен отправлять открытки своим друзьям, чтобы порадовать каждого из них как можно больше. Иначе говоря, чтобы в результате применения двух Сашиных правил, каждый друг получил как можно более предпочтительную для него открытку.

Обратите внимание, что Александр не обладает свободой выбора в том, какую открытку отправить, а всегда строго придерживается двух правил.

Входные данные

В первой строке задано целое число n (2 ≤ n ≤ 300) — количество друзей Александра, равное количеству открыток. Следующие n строк содержат списки предпочтений друзей. Каждый список состоит из n различных целых чисел от 1 до n. Последняя строка содержит список предпочтений самого Александра в том же формате.

Выходные данные

Выведите n чисел, разделенных пробелами: i-ое число должно являться номером друга, после получения открытки от которого Александр должен отправить открытку i-ому другу. Если решений несколько, выведите любое.

Примечание

В примере алгоритм действий Александра и его друзей таков:

  1. Александр получает открытку 1 от первого друга.
  2. Александр отправляет полученную открытку (на данный момент она у него одна, а значит, самая предпочтительная для него) друзьям с номерами 2 и 3.
  3. Александр получает открытку 2 от второго друга, теперь у него две открытки — 1 и 2.
  4. Александр отправляет открытку первому другу. Несмотря на то, что открытка 1 Александру нравится больше, он отправляет открытку 2, потому что не может отправлять другу открытку, присланную им же.
  5. Александр получает открытку 3 от третьего друга.
  6. Александр получает открытку 4 от четвертого друга.
  7. Среди имеющихся у Александра открыток 1, 2, 3, 4 самая любимая его открытка — 3, и он отправляет ее четвертому другу.

Заметим, что можно делать отправку открытки сразу нескольким друзьям (в данном случае второму и третьему). Четвертому другу можно отправить открытку номер 3 как после получения третьей открытки, так и после получения четвертой открытки (оба варианта являются правильными).

D. Максимально распределенное дерево

Деревья дп жадные алгоритмы математика поиск в глубину и подобное реализация сортировки теория чисел *1800

Вам задано дерево, состоящее из \(n\) вершин. Вы должны сопоставить каждому из \(n-1\) ребер этого дерева целое число таким образом, чтобы выполнялись следующие условия:

  • каждое число должно быть целым и строго больше \(0\);
  • произведение всех \(n-1\) чисел должно быть равно \(k\);
  • количество \(1\)-ц среди всех \(n-1\) чисел должно быть минимально возможным.

Назовем \(f(u,v)\) сумму чисел на простом пути из вершины \(u\) в вершину \(v\). Также, назовем \(\sum\limits_{i=1}^{n-1} \sum\limits_{j=i+1}^n f(i,j)\) как индекс распределения дерева.

Определите максимально возможный индекс распределения, который можно получить. Так как ответ может быть слишком большим, выведите его по модулю \(10^9 + 7\).

В данной задаче, так как число \(k\) может быть слишком большим, задана факторизация \(k\) на простые числа.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(2 \le n \le 10^5\)) — количество вершин в дереве.

В каждой из следующих \(n-1\) строк заданы ребра: в \(i\)-й строке заданы два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \ne v_i\)) — номера вершин, соединенных \(i\)-м ребром.

В следующей строке задано одно число \(m\) (\(1 \le m \le 6 \cdot 10^4\)) — количество простых в факторизации \(k\).

В следующей строке заданы \(m\) простых чисел \(p_1, p_2, \ldots, p_m\) (\(2 \le p_i < 6 \cdot 10^4\)) такие, что \(k = p_1 \cdot p_2 \cdot \ldots \cdot p_m\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\), сумма \(m\) по всем наборам не превосходит \(6 \cdot 10^4\), и что заданные ребра в каждом наборе образуют дерево.

Выходные данные

Выведите максимально возможный индекс распределения. Так как ответ может быть слишком большим, выведите его по модулю \(10^9+7\).

Примечание

В первом наборе входных данных, один из возможных ответов изображен на рисунке ниже:

В данном случае, \(f(1,2)=1\), \(f(1,3)=3\), \(f(1,4)=5\), \(f(2,3)=2\), \(f(2,4)=4\), \(f(3,4)=2\), и сумма этих \(6\) чисел равна \(17\).

Во втором наборе входных данных, один из возможных ответов изображен ниже:

В этом случае, \(f(1,2)=3\), \(f(1,3)=1\), \(f(1,4)=4\), \(f(2,3)=2\), \(f(2,4)=5\), \(f(3,4)=3\), и сумма этих \(6\) чисел равна \(18\).

E. Разбиваем квадрат

геометрия реализация сортировки Структуры данных *2400

У вас есть квадрат размера \(10^6 \times 10^6\) на координатной плоскости с вершинами в точках \((0, 0)\), \((0, 10^6)\), \((10^6, 0)\) и \((10^6, 10^6)\).

Вы собираетесь нарисовать несколько отрезков на плоскости. Все отрезки либо горизонтальные, либо вертикальные и пересекаются хотя бы с одной стороной квадрата.

Сейчас вас интересует: на какое количество частей разобьется данный квадрат после того, как будут нарисованы все отрезки. Напишите программу, подсчитывающую количество частей.

Входные данные

В первой строке заданы два целых числа \(n\) и \(m\) (\(0 \le n, m \le 10^5\)) — количество горизонтальных и вертикальных отрезков, соответственно.

В следующих \(n\) строках заданы описания горизонтальных отрезков. В \(i\)-й строке заданы три целых числа \(y_i\), \(lx_i\) и \(rx_i\) (\(0 < y_i < 10^6\); \(0 \le lx_i < rx_i \le 10^6\)), означающих отрезок, соединяющий \((lx_i, y_i)\) и \((rx_i, y_i)\).

В следующих \(m\) строках заданы описания вертикальных отрезков. В \(i\)-й строке заданы три целых числа \(x_i\), \(ly_i\) и \(ry_i\) (\(0 < x_i < 10^6\); \(0 \le ly_i < ry_i \le 10^6\)), означающих отрезок, соединяющий \((x_i, ly_i)\) и \((x_i, ry_i)\).

Гарантируется, что никакие два отрезка не лежат на одной прямой и каждый отрезок пересекается хотя бы с одной стороной квадрата.

Выходные данные

Выведите количество частей, на которые разбивается квадрат после того, как нарисованы все отрезки.

Примечание

Пример выглядит следующим образом:

A. Fancy Fence

*особая задача математика реализация снм сортировки Структуры данных *1800

Everybody knows that Balázs has the fanciest fence in the whole town. It's built up from \(N\) fancy sections. The sections are rectangles standing closely next to each other on the ground. The \(i\)th section has integer height \(h_i\) and integer width \(w_i\). We are looking for fancy rectangles on this fancy fence. A rectangle is fancy if:

  • its sides are either horizontal or vertical and have integer lengths
  • the distance between the rectangle and the ground is integer
  • the distance between the rectangle and the left side of the first section is integer
  • it's lying completely on sections
What is the number of fancy rectangles? This number can be very big, so we are interested in it modulo \(10^9+7\).
Input

The first line contains \(N\) (\(1\leq N \leq 10^{5}\)) – the number of sections. The second line contains \(N\) space-separated integers, the \(i\)th number is \(h_i\) (\(1 \leq h_i \leq 10^{9}\)). The third line contains \(N\) space-separated integers, the \(i\)th number is \(w_i\) (\(1 \leq w_i \leq 10^{9}\)).

Output

You should print a single integer, the number of fancy rectangles modulo \(10^9+7\). So the output range is \(0,1,2,\ldots, 10^9+6\).

Scoring
\( \begin{array}{|c|c|c|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{sample}\\ \hline 2 & 12 & N \leq 50 \: \text{and} \: h_i \leq 50 \: \text{and} \: w_i = 1 \: \text{for all} \: i \\ \hline 3 & 13 & h_i = 1 \: \text{or} \: h_i = 2 \: \text{for all} \: i \\ \hline 4 & 15 & \text{all} \: h_i \: \text{are equal} \\ \hline 5 & 15 & h_i \leq h_{i+1} \: \text{for all} \: i \leq N-1 \\ \hline 6 & 18 & N \leq 1000\\ \hline 7 & 27 & \text{no additional constraints}\\ \hline \end{array} \)
Note

The fence looks like this:

There are 5 fancy rectangles of shape:

There are 3 fancy rectangles of shape:

There is 1 fancy rectangle of shape:

There are 2 fancy rectangles of shape:

There is 1 fancy rectangle of shape:

C. Chess Rush

*особая задача дп Комбинаторика математика реализация *3200

The mythic world of Chess Land is a rectangular grid of squares with \(R\) rows and \(C\) columns, \(R\) being greater than or equal to \(C\). Its rows and columns are numbered from \(1\) to \(R\) and \(1\) to \(C\), respectively.

The inhabitants of Chess Land are usually mentioned as pieces in everyday language, and there are \(5\) specific types of them roaming the land: pawns, rooks, bishops, queens and kings. Contrary to popular belief, chivalry is long dead in Chess Land, so there are no knights to be found.

Each piece is unique in the way it moves around from square to square: in one step,

  • a pawn can move one row forward (i.e. from row \(r\) to \(r+1\)), without changing columns;
  • a rook can move any number of columns left/right without changing rows OR move any number of rows forward/backward without changing columns;
  • a bishop can move to any square of the two diagonals intersecting at its currently occupied square;
  • a queen can move to any square where a rook or a bishop could move to from her position;
  • and a king can move to any of the \(8\) adjacent squares.
In the following figure, we marked by X the squares each piece can move to in a single step (here, the rows are numbered from bottom to top, and the columns from left to right).

Recently, Chess Land has become a dangerous place: pieces that are passing through the land can get captured unexpectedly by unknown forces and simply disappear. As a consequence, they would like to reach their destinations as fast (i.e. in as few moves) as possible, and they are also interested in the number of different ways it is possible for them to reach it, using the minimal number of steps – because more paths being available could mean lower chances of getting captured. Two paths are considered different if they differ in at least one visited square.

For this problem, let us assume that pieces are entering Chess Land in a given column of row \(1\), and exit the land in a given column of row \(R\). Your task is to answer \(Q\) questions: given the type of a piece, the column it enters row \(1\) and the column it must reach in row \(R\) in order to exit, compute the minimal number of moves it has to make in Chess Land, and the number of different ways it is able to do so.

Input

The first line contains three space-separated integers \(R\), \(C\), and \(Q\) \((1 \leq Q \leq 1000\), \(2 \leq C \leq 1000\) and \(C \leq R \leq 10^9)\) – the number of rows and columns of Chess Land, and the number of questions, respectively. Then \(Q\) lines follow.

Each line consists of

  • a character \(T\), corresponding to the type of the piece in question ('P' for pawn, 'R' for rook, 'B' for bishop, 'Q' for queen and 'K' for king);
  • two integers \(c_1\) and \(c_R\), \(1\leq c_1,c_R\leq C\), denoting that the piece starts from the \(c_1\)-th column of row \(1\), and has to reach the \(c_R\)-th column of row \(R\).
Output

You have to print \(Q\) lines, the \(i\)-th one containing two space separated integers, the answer to the \(i\)-th question: the first one is the minimal number of steps needed, the second is the number of different paths available using this number of steps. Since the answer can be quite large, you have to compute it modulo \(10^9+7\).

If it is impossible to reach the target square, output the line "0 0".

Scoring
\( \begin{array}{|c|c|l|} \hline \text{Subtask} & \text{Points} & \text{Constraints} \\ \hline 1 & 0 & \text{samples}\\ \hline 2 & 8 & T\in\{\text{'P','R','Q'}\}\text{, i.e. all pieces are pawns, rooks or queens} \\ \hline 3 & 15 & T=\text{'B' and } \: C,R\leq 100 \\ \hline 4 & 22 & T=\text{'B'} \\ \hline 5 & 5 & T=\text{'K' and }\:C,R\leq 100\:\text{and}\:Q\leq 50 \\ \hline 6 & 8 & T=\text{'K' and }\:C,R\leq 100\\ \hline 7 & 15 & T=\text{'K' and }\:C\leq 100\\ \hline 8 & 20 & T=\text{'K'}\\ \hline 9 & 7 & \text{no additional constraints}\\ \hline \end{array} \)
Note

You can download the above example and an additional (bigger) sample input here: https://gofile.io/d/GDzwfC

A. Сбалансированная бинарная строка

реализация Строки *1500

Бинарная строка это строка, состоящая только из символов 0 и 1. Бинарная строка называется \(k\)-сбалансированной, если каждая подстрока длины \(k\) этой бинарной строки содержит равное количество символов 0 и 1 (\(\frac{k}{2}\) каждого).

Вам дается целое число \(k\) и строка \(s\), состоящая только из символов 0, 1 и ?. Вам необходимо определить, можно ли получить \(k\)-сбалансированную бинарную строку, заменив каждый символ ? в \(s\) либо на 0, либо на 1.

Строка \(a\) является подстрокой \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов из начала и нескольких (возможно, ни одного или всех) символов из конца.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(2 \le k \le n \le 3 \cdot 10^5\), \(k\) чётное)  — длина строки и параметр для сбалансированной бинарной строки.

Следующая строка содержит строку \(s\) (\(|s| = n\)). При этом \(s\) состоит только из 0, 1 и ?.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите YES, если мы можем заменить каждый ? в \(s\) на 0 или 1 так, чтобы получившаяся бинарная строка была \(k\)-сбалансированной, или NO если это невозможно.

Примечание

В первом наборе входных данных строка уже является \(4\)-сбалансированной бинарной строкой.

Во втором наборе входных данных строка может быть преобразована в 101.

В третьем наборе входных данных строку можно преобразовать в 0110.

В четвертом наборе входных данных строку можно преобразовать в 1100110.

B. Уничтожение массива

Конструктив реализация *1000

Вам дан массив \(a\) из \(n\) целых чисел, таких, что \(a_1 + a_2 + \cdots + a_n = 0\).

За одну операцию можно выбрать два различных индекса \(i\) и \(j\) (\(1 \le i, j \le n\)), уменьшить \(a_i\) на единицу и увеличить \(a_j\) на единицу. Если \(i < j\), то эта операция бесплатная, в противном случае она стоит одну монету.

Какое минимальное количество монет нужно потратить, чтобы все элементы стали равны \(0\)?

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 5000\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 10^5\))  — количество элементов.

Следующая строка содержит \(n\) целых чисел \(a_1, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)). При этом \(\sum_{i=1}^n a_i = 0\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество монет, которое мы должны потратить, чтобы все элементы равнялись \(0\).

Примечание

Возможная стратегия для первого набора входных данных:

  • Сделаем операцию \((i=2, j=3)\) три раза (бесплатно), \(a = [-3, 2, 0, 1]\).
  • Сделаем операцию \((i=2, j=1)\) два раза (за две монеты), \(a = [-1, 0, 0, 1]\).
  • Сделаем операцию \((i=4, j=1)\) один раз (за одну монету), \(a = [0, 0, 0, 0]\).

A. Mex подмножеств

жадные алгоритмы математика реализация *900

Вам дан набор целых чисел (он может содержать одинаковые элементы).

Вы должны разделить его на два подмножества \(A\) и \(B\) (каждое из них также может содержать одинаковые элементы или может быть пустым). Вы должны максимизировать значение \(mex(A)+mex(B)\).

Здесь \(mex\) набора целых чисел определяется как наименьшее неотрицательное целое число, которое не принадлежит этому набору. Например:

  • \(mex(\{1,4,0,2,2,1\})=3\)
  • \(mex(\{3,3,2,1,3,0,0\})=4\)
  • \(mex(\varnothing)=0\) (\(mex\) пустого множества)

Набор разделен на два подмножества \(A\) и \(B\), если для любого целого числа \(x\) количество вхождений \(x\) в этот набор равно сумме количеств вхождений \(x\) в \(A\) и \(x\) в \(B\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1\leq t\leq 100\)) — количество наборов входных данных. Описание наборов входных данных следует.

В первой строке описания каждого набора входных данных находится единственное целое число \(n\) (\(1\leq n\leq 100\)) — размер набора целых чисел.

Во второй строке описания каждого набора входных данных находится \(n\) целых чисел \(a_1,a_2,\dots a_n\) (\(0\leq a_i\leq 100\)) — элементы данного вам набора целых чисел.

Выходные данные

Для каждого набора входных данных, выведите максимальное значение \(mex(A)+mex(B)\).

Примечание

В первом наборе входных данных \(A=\left\{0,1,2\right\},B=\left\{0,1,5\right\}\) является возможным выбором разделения.

Во втором наборе входных данных \(A=\left\{0,1,2\right\},B=\varnothing\) является возможным выбором разделения.

В третьем наборе входных данных \(A=\left\{0,1,2\right\},B=\left\{0\right\}\) является возможным выбором разделения.

В четвертом наборе входных данных \(A=\left\{1,3,5\right\},B=\left\{2,4,6\right\}\) является возможным выбором разделения.

B. Максимальное произведение

дп жадные алгоритмы Перебор реализация сортировки *1200

Вам дан массив целых чисел \(a_1,a_2,\ldots,a_n\). Найдите максимум \(a_ia_ja_ka_la_t\) по всем пятеркам индексов \((i, j, k, l, t)\) (\(i<j<k<l<t\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1\le t\le 2 \cdot 10^4\)) — количество наборов входных данных. Описание наборов входных данных следует.

В первой строке описания каждого набора входных данных находится единственное целое число \(n\) (\(5\le n\le 10^5\)) — размер массива.

Во второй строке описания каждого набора входных данных находится \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(-3\times 10^3\le a_i\le 3\times 10^3\)) — данный массив.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — ответ на задачу.

Примечание

В первом наборе входных данных выбор \(a_1,a_2,a_3,a_4,a_5\) является наилучшим: \((-1)\cdot (-2) \cdot (-3)\cdot (-4)\cdot (-5)=-120\).

Во втором наборе входных данных выбор \(a_1,a_2,a_3,a_5,a_6\) является наилучшим: \((-1)\cdot (-2) \cdot (-3)\cdot 2\cdot (-1)=12\).

В третьем наборе входных данных выбор \(a_1,a_2,a_3,a_4,a_5\) является наилучшим: \((-1)\cdot 0\cdot 0\cdot 0\cdot (-1)=0\).

В четвертом наборе входных данных выбор \(a_1,a_2,a_3,a_4,a_6\) является наилучшим: \((-9)\cdot (-7) \cdot (-5)\cdot (-3)\cdot 1=945\).

C. Дискретное ускорение

Бинарный поиск дп математика реализация *1500

Рассмотрим дорогу длиной \(l\) метров. Начало дороги имеет координату \(0\), конец дороги имеет координату \(l\).

Есть две машины, первая стоит в начале дороги, вторая стоит в конце дороги. Они начинают ехать одновременно. Первая машина будет ехать от начала дороги к концу, вторая машина будет ехать от конца дороги к началу.

Изначально они будут ехать со скоростью \(1\) метр в секунду. Есть \(n\) флажков, расположенных в различных координатах \(a_1, a_2, \ldots, a_n\). Каждый раз, когда любая из двух машин проезжает мимо флажка, скорость этой машины увеличивается на \(1\) метр в секунду.

Найдите, через какое время машины встретятся (их координаты совпадут).

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 10^4\)): количество наборов входных данных.

В первой строке описания каждого набора входных данных находятся два целых числа \(n\), \(l\) (\(1 \leq n \leq 10^5\), \(1 \leq l \leq 10^9\)): количество флажков и длина дороги.

Во второй строке находятся \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) в возрастающем порядке (\(1 \leq a_1 < a_2 < \ldots < a_n < l\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное вещественное число: время, через которое машины встретятся.

Ваш ответ будет признан правильным, если его абсолютная или относительная ошибка не превосходит \(10^{-6}\). Более формально, если ваш ответ \(a\) и ответ жюри \(b\), ваш ответ будет признан правильным, если \(\frac{|a-b|}{\max{(1, b)}} \leq 10^{-6}\).

Примечание

В первом наборе входных данных машины встретятся в координате \(5\).

Первая машина будет в координате \(1\) через \(1\) секунду, и после этого ее скорость увеличится на \(1\) и станет равной \(2\)-м метрам в секунду. Через \(2\) секунды машина окажется в координате \(5\). Итак, первая машина будет в координате \(5\) через \(3\) секунды.

Вторая машина будет в координате \(9\) через \(1\) секунду, и после этого ее скорость увеличится на \(1\) и станет равной \(2\)-м метрам в секунду. Через \(2\) секунды машина окажется в координате \(5\). Итак, вторая машина будет в координате \(5\) через \(3\) секунды.

Во втором наборе входных данных через \(1\) секунду первая машина будет в координате \(1\) и будет иметь скорость, равную \(2\)-м метрам в секунду; вторая машина будет в координате \(9\) и будет иметь скорость \(1\) метр в секунду. Поэтому после этого они встретятся через \(\frac{9-1}{2+1} = \frac{8}{3}\) секунд. Итак, ответ равен \(1 + \frac{8}{3} = \frac{11}{3}\).

D. Прожекторы

Бинарный поиск дп Перебор реализация сортировки Структуры данных *2000

Есть \(n\) грабителей в координатах \((a_1, b_1)\), \((a_2, b_2)\), ..., \((a_n, b_n)\) и \(m\) прожекторов в координатах \((c_1, d_1)\), \((c_2, d_2)\), ..., \((c_m, d_m)\).

За один ход вы можете подвинуть всех грабителей направо (увеличить \(a_i\) всех грабителей на единицу) или подвинуть всех грабителей вверх (увеличить \(b_i\) всех грабителей на единицу). Обратите внимание, что вы должны либо увеличить все \(a_i\), либо все \(b_i\), вы не можете увеличить \(a_i\) некоторых грабителей и \(b_i\) некоторых других грабителей за одну операцию.

Прожектор \(j\) освещает грабителя \(i\), если \(a_i \leq c_j\) и \(b_i \leq d_j\).

Конфигурация грабителей называется безопасной, если ни один прожектор не освещает ни одного грабителя (то есть нет такой пары \(i,j\), что прожектор \(j\) освещает грабителя \(i\)).

Какое минимальное количество ходов нужно сделать, чтобы грабители оказались в безопасной конфигурации?

Входные данные

В первой строке находится два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 2000\)): количество грабителей и количество прожекторов.

Каждая из следующих \(n\) строк содержит два целых числа \(a_i\), \(b_i\) (\(0 \leq a_i, b_i \leq 10^6\)), координаты грабителей.

Каждая из следующих \(m\) строк содержит два целых числа \(c_i\), \(d_i\) (\(0 \leq c_i, d_i \leq 10^6\)), координаты прожекторов.

Выходные данные

Выведите единственное целое число: минимальное количество ходов, необходимое, чтобы грабители оказались в безопасной конфигурации.

Примечание

В первом тесте вы можете подвинуть всех грабителей направо три раза. После этого будет один грабитель в координатах \((3, 0)\).

Конфигурация грабителей будет безопасной, потому что единственный прожектор не освещает грабителя, так как он в координатах \((2, 3)\), а \(3 > 2\).

Во втором тесте вы можете подвинуть всех грабителей направо два раза и вверх два раза. После этого грабители будут в координатах \((3, 8)\), \((8, 3)\).

Легко увидеть, что такая конфигурация безопасна.

Можно доказать, что невозможно получить безопасную конфигурацию, используя не больше, чем \(3\) хода.

A. Веселая шутка

реализация сортировки Строки *800

Вот и прошли новогодние праздники. Для Деда Мороза и его коллег пришло время отдыха и приема гостей. Когда встречаются два «Новогодних Деда», то их помощники в честь такого знаменательного события вырезают из картона буквы имен гостя и хозяина, и вывешивают над парадным входом. Однажды ночью, когда все легли спать, кто-то снял все буквы имен наших персонажей. Затем он, возможно, перемешал эти буквы, и положил в одну кучку перед дверью.

Наутро так и не удалось найти виновника беспорядка, но всех заинтересовал еще один вопрос: можно ли из букв, сложенных перед дверью, заново составить имена гостя и хозяина? То есть нужно проверить, что не останется лишних, и не придется вырезать дополнительные буквы.

Помогите «Новогодним Дедам» и их друзьям разобраться с этой проблемой, если вам даны обе надписи, висевшие над парадной дверью вечером, и буквы в кучке, найденной перед парадной дверью утром.

Входные данные

Во входных данных три строки: в первой строке — имя гостя, во второй — имя хозяина резиденции, в третьей строке — буквы в кучке, найденной перед дверью утром. Все строки не пусты и состоят только из заглавных латинских букв. Длина каждой строки не превосходит 100.

Выходные данные

Выведите «YES» без кавычек, если из букв в кучке можно составить имена «Новогодних Дедов», и «NO» без кавычек в противном случае.

Примечание

В первом примере: из букв, записанных в последней строке можно составить имена, записанные в первых двух, и не останется лишних букв.

Во втором примере: в кучке не хватает буквы «P» и лишняя буква «L».

В третьем примере: лишняя буква «L».

A. Игровой чат

реализация *800

Вам предстоит разработать фильтр для плохих сообщений в чате одной игры. Сообщение представляет из себя строку \(S\) длины \(n\), состоящую из строчных английских букв и символов ')'. Строка считается плохой, если количество символов ')' в конце строки превышает количество остальных символов. Например, у строки «)bc)))» три скобки в конце, три остальных символа, и эта строка не считается плохой.

Входные данные

В первой строке дано целое число \(t\) — количество тестовых случаев (\(1 \leq t \leq 100\)). Далее дано описание \(t\) тестовых случаев.

В первой строке дано число \(n\) (\(1 \leq n \leq 100\)). Во второй строке дана строка \(S\) длины \(n\), состоящая из строчных английских букв и символов ')'.

Выходные данные

Для каждого из \(t\) тестовых случаев выведите «Yes», если строка является плохой, иначе выведите «No».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

D. Грайм Зоопарк

жадные алгоритмы Перебор реализация Строки *2100

Сейчас рэп ХХОСа представляет из себя строку из нулей, единиц и знаков вопроса. К сожалению, хейтеры не дремлют. За каждое вхождение подпоследовательности 01 в рэп ХХОСа хейтеры напишут \(x\) гневных комментариев, а за каждое вхождение подпоследовательности 10 будет написано \(y\) гневных комментариев. Вы должны заменить каждый знак вопроса на 0 либо 1, чтобы минимизировать число гневных комментариев, которые получит ХХОС.

Подпоследовательностью строки \(a\) называется строка \(b\), которая может получиться в результате удаления нескольких символов из строки \(a\). Два вхождения подпоследовательности считаются разными, если различаются множества позиций оставленных символов.

Входные данные

В первой строке записан рэп ХХОСа — строка \(s\) (\(1 \le |s| \leq 10^5\)). Во второй строке даны два целых числа \(x\) и \(y\) — количество гневных комментариев, которые ХХОС получит за каждую подпоследовательность 01 и 10, соответственно (\(0 \leq x, y \leq 10^6\)).

Выходные данные

В единственной строке выведите минимальное число гневных комментариев, которые может получить ХХОС.

Примечание

В первом примере одним из оптимальных вариантов замены является 001. Тогда в строке будет \(2\) подпоследовательности 01 и \(0\) подпоследовательностей 10. Суммарное количество гневных комментариев равно \(2 \cdot 2 + 0 \cdot 3 = 4\).

Во втором примере одним из оптимальных вариантов замены является 11111. Тогда в строке будет \(0\) подпоследовательностей 01 и \(0\) подпоследовательностей 10. Суммарное количество гневных комментариев равно \(0 \cdot 13 + 0 \cdot 37 = 0\).

В третьем примере одним из оптимальных вариантов замены является 1100. Тогда в строке будет \(0\) подпоследовательностей 01 и \(4\) подпоследовательности 10. Суммарное количество гневных комментариев равно \(0 \cdot 239 + 4 \cdot 7 = 28\).

В четвёртом примере одним из оптимальных вариантов замены является 01101001. Тогда в строке будет \(8\) подпоследовательностей 01 и \(8\) подпоследовательностей 10. Суммарное количество гневных комментариев равно \(8 \cdot 5 + 8 \cdot 7 = 96\).

B. Новая техника

реализация *1100

Все техники в мире ниндзя состоят из печатей. Сейчас Наруто учит новую технику, которая состоит из \(n\cdot m\) различных печатей, обозначенных различными целыми числами. Все печати этой техники были записаны на табличке размером \(n\times m\).

Наруто потерял таблицу. Он успел выучить элементы каждой строки из этой таблички слева направо, а также элементы всех столбцов из этой таблички сверху вниз, но он не помнит порядок самих строк и столбцов. Необходимо восстановить табличку, чтобы Наруто смог доучить новую технику.

Входные данные

Первая строка содержит единственное число \(t\) (\(1\leq t\leq 100\,000\)) — количество тестовых случаев. В следующих строках содержатся описания тестовых случаев.

Первая строка каждого описания содержит два разделенных пробелом числа \(n\) и \(m\) (\(1 \leq n, m \leq 500\)) — количество строк и столбцов в табличке. Все печати в табличке занумерованы натуральными натуральными числами от \(1\) до \(n\cdot m\).

Следующие \(n\) строк содержат по \(m\) разделенных пробелом чисел — элементы произвольной строки исходной таблички слева направо.

Следующие \(m\) строк содержат по \(n\) разделенных пробелом чисел — элементы произвольного столба исходной таблички сверху вниз.

Сумма \(nm\) по всем тестовым случаям не превосходит \(250\,000\). Гарантируется, что каждая строчка таблицы встречается во входных данных ровно один раз, как и каждый столбец. Также гарантируется, что любое число от \(1\) до \(nm\) встречается ровно один раз в описании элементов строк, как и в описаниях элементов столбцов столбцах. Наконец, гарантируется, что существует таблица, подходящая под описание.

Выходные данные

Для каждого тестового случая необходимо вывести \(n\) строк по \(m\) чисел, разделенных пробелом — восстановленную табличку. Можно показать, что такая табличка единственная.

Примечание

Рассмотрим первый тестовый случай. Матрица \(2 \times 3\). Даны строки и столбцы в произвольном порядке.

Одна из строк \([6, 5, 4]\). Одна из строк \([1, 2, 3]\).

Один из столбцов \([1, 6]\). Один из столбцов \([2, 5]\). Один из столбцов \([3, 4]\).

Вам нужно восстановить матрицу. Ответ дан в примере выходных данных.

C. Простота исполнения

Бинарный поиск дп Перебор реализация сортировки *1900

После боя с Шикамару Таюя решила, что ее флейта слишком предсказуемая, и поменяла ее на гитару. У гитары Таюи \(6\) струн и бесконечное количество ладов, пронумерованных с \(1\). Если зажать лад номер \(j\) на \(i\)-й струне, то получится нота \(a_{i} + j\).

Таюя хочет сыграть мелодию из \(n\) нот. Ноты можно сыграть, используя различные комбинации струны и лада. Простота исполнения зависит от разности максимального и минимального номера используемых ладов. Чем эта величина меньше, тем проще исполнить технику. Требуется определить минимальную возможную разность.

Например, если \(a = [1, 1, 2, 2, 3, 3]\), а последовательность нот — \(4, 11, 11, 12, 12, 13, 13\) (что соответствует второму примеру), то можно сыграть первую ноту на первой струне, а все остальные ноты на шестой струне. Тогда максимальный лад будет \(10\), минимальный \(3\), и разница составит \(10 - 3 = 7\), как показано на рисунке.

Входные данные

В первой строке через пробел заданы \(6\) чисел \(a_{1}\), \(a_{2}\), ..., \(a_{6}\) (\(1 \leq a_{i} \leq 10^{9}\)) — описания струн гитары Таюи.

Во второй строке задано число \(n\) (\(1 \leq n \leq 100\,000\)) — количество нот, которое хочет сыграть Таюя.

В следующей строке через пробел заданы \(n\) чисел \(b_{1}\), \(b_{2}\), ..., \(b_{n}\) (\(1 \leq b_{i} \leq 10^{9}\)) — описание нот. Гарантируется, что \(b_i > a_j\) для всех \(1\leq i\leq n\) и \(1\leq j\leq 6\). Иными словами, каждую ноту можно сыграть на любой струне.

Выходные данные

Необходимо вывести минимальную возможную разность номеров используемых ладов.

Примечание

В первом примере оптимальным будет сыграть первую ноту на первой струне, вторую ноту на второй струне, третью ноту на шестой струне, четвертую ноту на четвертой струне, пятую ноту на пятой струне, шестую ноту на третьей струне. Тогда для исполнения каждой ноты будет использоваться лад \(100\), а разница составит \(100 - 100 = 0\).

Во втором примере оптимальным будет, например, сыграть вторую ноту на первой струне, а все остальные ноты на шестой струне. Тогда максимальный лад будет \(10\), минимальный \(3\), и разница составит \(10 - 3 = 7\).

D. Сюрикены

жадные алгоритмы реализация Структуры данных *1700

Тентен продает оружие в магазине для ниндзя. Сегодня она хочет продать \(n\) сюрикенов стоимостью \(1\), \(2\), ..., \(n\) рё (местная валюта). В течение дня она будет выкладывать сюрикены на витрину, которая в начале дня пуста. Работа в магазине достаточно простая: в каждый момент времени либо Тентен выкладывает на витрину очередной сюрикен из еще не выложенных, либо к ней в магазин заходит ниндзя и покупает сюрикен с витрины. Поскольку ниндзя очень экономные, то в магазине они покупают самый дешевый из сюрикенов, которые сейчас лежат на витрине. В течение дня Тентен ведет список событий, и в ее списке есть два типа записей:

  • + означает, что она выкладывает на витрину очередной сюрикен;
  • - x означает, что у нее купили сюрикен стоимостью \(x\).

Сегодня у Тентен выдался удачный день, и у нее купили все сюрикены. В конце дня ей стало интересно, не ошиблась ли она в своих записях, и в каком порядке она могла выкладывать сюрикены, чтобы у нее получился такой список.

Входные данные

В первой строке дано целое число \(n\) (\(1\leq n\leq 10^5\)) — количество сюрикенов.

В следующих \(2n\) строках дана информация о произошедших событиях в формате, описанном выше. Гарантируется, что среди событий ровно \(n\) событий первого типа, а также, что во всех событиях второго типа присутствуют все числа от \(1\) до \(n\) по одному разу.

Выходные данные

Необходимо вывести «YES», если такой список мог получиться, и «NO» иначе.

Если список получиться мог, то в следующей строке необходимо вывести \(n\) различных чисел через пробел — стоимости сюрикенов в порядке, в котором Тентен должна выкладывать их на витрину. Если существует несколько решений, выведите любое из них.

Примечание

В первом примере Тентен сначала выложила на витрину сюрикены стоимостью \(4\) и \(2\). После этого к ней пришел покупатель и забрал самый дешевый сюрикен стоимостью \(2\). После этого к оставшемуся сюрикену стоимостью \(4\) она выложила сюрикен стоимостью \(3\). После этого к ней пришел покупатель и забрал сюрикен стоимостью \(3\). После этого она выложила сюрикен стоимостью \(1\). После этого к ней пришел покупатель и забрал сюрикен стоимостью \(1\). Потом к ней пришел еще один покупатель и забрал последний сюрикен стоимостью \(4\). Обратите внимание, что порядок \([2, 4, 3, 1]\) также является верным.

Во втором примере первый покупатель пришел и купил сюрикен раньше, чем Тентен выложила хотя бы один сюрикен на витрину, что, очевидно, невозможно.

В третьем примере Тентен выложила на витрину все сюрикены, после этого к ней пришел покупатель и забрал сюрикен стоимостью \(2\). Такого быть не могло, потому что этот сюрикен не был самым дешевым из тех, что лежали на витрине (ведь там был еще сюрикен стоимостью \(1\)).

C. Попрыгунчик

дп Перебор реализация *1400

Вы создаете уровень для некоторой мобильной игры. Уровень состоит из нескольких клеточек, выстроенных в ряд слева направо и пронумерованных последовательными натуральными числами, начиная с \(1\). Каждую клеточку вы можете оставить пустой или расположить там платформу.

Чтобы пройти уровень, игрок должен бросить мяч слева так, чтобы он сначала упал на платформу в некоторой клеточке \(p\), отскочил от нее, затем отскочил от платформы в клеточке \((p + k)\), затем от платформы в клеточке \((p + 2k)\), и так далее от платформы в каждой \(k\)-й клеточке до тех пор, пока он не перепрыгнет правее последней клеточки. Если хотя бы одна из этих клеточек не содержит платформы, то уровень с такими значениями \(p\) и \(k\) пройти нельзя.

У вас уже есть некоторый шаблон уровня, описываемый числами \(a_1\), \(a_2\), \(a_3\), ..., \(a_n\), где \(a_i = 0\) означает, что в клеточке \(i\) нет платформы, а \(a_i = 1\) означает, что платформа там есть. Вы хотите модифицировать этот шаблон так, чтобы уровень можно было пройти с заданными \(p\) и \(k\). За \(x\) секунд вы можете добавить платформу в любую пустую клеточку. За \(y\) секунд вы можете полностью убрать первую клеточку, при этом количество клеточек уменьшится на один, а оставшиеся клетки пронумеруются заново, сохраняя порядок. Других изменений вы вносить не можете. Вы не можете уменьшить число клеток до меньше \(p\).

Иллюстрация к третьему тестовому случаю. Крестами отмечены удаленные клеточки. Синим показана добавленная платформа.

Какое минимальное количество секунд вам требуется, чтобы сделать возможным прохождение уровня с заданными значениями \(p\) и \(k\)?

Входные данные

Первая строка содержит количество тестовых случаев \(t\) (\(1 \le t \le 100\)). Далее следуют описания тестовых случаев.

Первая строка каждого тестового случая содержит три целых числа \(n\), \(p\) и \(k\) (\(1 \le p \le n \le 10^5\), \(1 \le k \le n\)) — начальное количество клеточек, номер первой клеточки, которая должна содержать платформу, и требуемый период прыжков мяча.

Вторая строка каждого тестового случая содержит строку \(a_1 a_2 a_3 \ldots a_n\) (\(a_i = 0\) или \(a_i = 1\)) — начальный шаблон уровня, записанный без пробелов.

Последняя строка каждого тестового случая содержит два целых числа \(x\) и \(y\) (\(1 \le x, y \le 10^4\)) — время, необходимое для добавления платформы и время, необходимое для удаления первой клеточки, соответственно.

Сумма \(n\) по всем тестовым случаям не превосходит \(10^5\).

Выходные данные

Для каждого тестового случая выведите одно целое число — минимальное количество секунд, необходимое вам, чтобы изменить уровень соответствующим образом.

Можно показать, что всегда возможно изменить уровень так, чтобы его можно было пройти.

Примечание

В первом тестовом случае лучше всего просто убрать первую клеточку, после чего все необходимые платформы будут на своих местах: 0101010101. Зачеркнутая цифра удалена, цифры, выделенные жирным — места, где должны быть платформы. Необходимое время равно \(y = 2\).

Во втором тестовом случае лучше всего добавить платформы в клетки \(4\) и \(5\): 00000 \(\to\) 00011. Необходимое время равно \(x \cdot 2 = 4\).

В третьем тестовом случае лучше всего удалить первую клеточку дважды и затем добавить платформу в клеточку, которая изначально была \(10\)-й: 10110011000 \(\to\) 10110011010. Необходимое время равно \(y \cdot 2 + x = 10\).

A. k-удивительные числа

Бинарный поиск реализация Структуры данных *1500

Вам дан массив \(a\) из \(n\) целых чисел, пронумерованных от \(1\) до \(n\).

Назовем \(k\)-удивительным числом массива минимальное число, которое встречается во всех подмассивах длины \(k\) (напомним, что подмассивом массива \(a\) длины \(k\) называются \(k\) подряд идущих элементов массива \(a\)). Если для некоторого \(k\) не существует ни одного числа, встречающегося во всех подмассивах длины \(k\), то \(k\)-удивительным числом считается \(-1\).

Для каждого \(k\) от \(1\) до \(n\) найдите \(k\)-удивительное число массива \(a\).

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора содержит одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)) — длина массива. Вторая строка набора содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам тестовых данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора тестовых данных выведите \(n\) целых чисел, где \(i\)-е число является \(i\)-удивительным числом массива.

D. Граф и запросы

графы Деревья реализация снм Структуры данных *2600

Вам дан неориентированный граф из \(n\) вершин и \(m\) ребер. Изначально в каждой вершине записано число: в вершине \(i\) записано число \(p_i\) (все \(p_i\) — различные числа от \(1\) до \(n\)).

Вы должны обработать \(q\) запросов двух типов:

  • \(1\) \(v\) — среди всех вершин, достижимых из вершины \(v\) по ребрам (включая саму вершину \(v\)), найти вершину \(u\) с максимальным записанным в ней числом \(p_u\), вывести \(p_u\) и заменить \(p_u\) на \(0\);
  • \(2\) \(i\) — удалить \(i\)-е ребро из графа.

Обратите внимание, что в запросе первого типа может возникнуть такая ситуация, что во всех вершинах, достижимых из \(v\), записано число \(0\) — в таком случае вершина \(u\) явно не определена, но так как от выбора конкретной вершины \(u\) ничего не зависит, в ответ на такой запрос можно выбрать любую вершину, достижимую из \(v\), и вывести число, записанное в ней (то есть \(0\)).

Входные данные

В первой строке заданы три целых числа \(n\), \(m\) и \(q\) (\(1 \le n \le 2 \cdot 10^5\); \(1 \le m \le 3 \cdot 10^5\); \(1 \le q \le 5 \cdot 10^5\)).

Во второй строке заданы \(n\) различных чисел \(p_1\), \(p_2\), ..., \(p_n\), где \(p_i\) — число, изначально записанное в вершине \(i\) (\(1 \le p_i \le n\)).

Далее следует \(m\) строк, \(i\)-я строка содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\), \(a_i \ne b_i\)) и обозначает, что \(i\)-е ребро соединяет вершины \(a_i\) и \(b_i\). Гарантируется, что граф не содержит кратных ребер.

Далее следуют \(q\) строк, задающих запросы. Каждая строка задается одним из следующих форматов:

  • \(1\) \(v\) — обозначает, что очередной запрос — первого типа с заданной вершиной \(v\) (\(1 \le v \le n\));
  • \(2\) \(i\) — обозначает, что очередной запрос — второго типа с заданным ребром \(i\) (\(1 \le i \le m\)). Гарантируется, что на момент каждого запроса второго типа соответствующее ребро еще не удалено из графа.
Выходные данные

На каждый запрос первого типа выведите одно целое число — значение \(p_u\), записанное в выбранной в запросе вершине \(u\).

F. Понты

жадные алгоритмы Паросочетания Потоки реализация *3300

В очередной скучный день карантина BThero принялся изучать матрицы размера \(n \times m\). Строки матрицы нумеруются от \(1\) до \(n\) сверху вниз, а столбцы нумеруются от \(1\) до \(m\) слева направо. Клетка в \(i\)-й строке и \(j\)-м столбце обозначается \((i, j)\).

Для каждой клетки \((i, j)\) матрицы у BThero были два значения:

  1. ценность данной клетки, которая выражается одним положительным целым числом;
  2. направление данной клетки, которое выражается одним из символов L, R, D, U. Данные символы означают переходы в соседние клетки \((i, j - 1)\), \((i, j + 1)\), \((i + 1, j)\), \((i - 1, j)\), соответственно. Никакой переход не вел за границу матрицы.

Назовем клетку \((i_2, j_2)\) достижимой из \((i_1, j_1)\), если, начав из клетки \((i_1, j_1)\) и переходя в соседнюю клетку в соответствии с направлением текущей клетки, мы рано или поздно посетим \((i_2, j_2)\).

BThero решил создать еще одну матрицу из имеющихся двух. Для клетки \((i, j)\) обозначим \(S_{i, j}\) как множество достижимых из нее клеток (включая саму клетку \((i, j)\)). Значение новой матрицы в клетке \((i, j)\) будет равно сумме ценностей всех клеток из \(S_{i, j}\).

Быстро посчитав новую матрицу, BThero разослал ее всем своим друзьям. Однако он не сохранил обе изначальные матрицы! Помогите ему восстановить любые две изначальные матрицы, из которых могла получиться заданная.

Входные данные

В первой строке входного файла дано одно целое число \(T\) (\(1 \le T \le 100\)) — кол-во наборов входных данных. Далее следуют \(T\) наборов входных данных в следующем формате:

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n \cdot m \le 10^5\)).

Каждая из последующих \(n\) строк содержит ровно \(m\) целых чисел — элементы созданной матрицы. Все элементы находятся в отрезке \([2, 10^9]\).

Гарантируется, что \(\sum{(n \cdot m)}\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора, если ответа не существует выведите одну единственную строку NO. Иначе выведите строку YES и две матрицы в таком же формате, как и во вводе.

  • Первая матрица должна быть матрицей ценностей, а вторая должна быть матрицей направлений.
  • Все числа в матрице ценностей должны быть положительными.
  • Все буквы в матрице направлений должны быть допустимыми. Никакой переход не должен указывать за границы матрицы.

D. Мусорная задача

реализация Структуры данных *2100

Вова решил прибраться в своей комнате. Комната может быть представлена как координатная ось \(OX\). Всего в комнате есть \(n\) кучек мусора, координата \(i\)-й кучки равна целому числу \(p_i\). Все кучки имеют различные координаты.

Давайте определим генеральную уборку как следующий процесс. Цель этого процесса —- собрать все кучки в не более чем двух различных \(x\) координатах. Чтобы достичь этой цели, Вова может совершить некоторое (возможно, нулевое) количество ходов. За один ход он может выбрать какой-либо \(x\) и переместить все кучки из \(x\) в \(x+1\) или \(x-1\) при помощи метлы. Заметьте, что он не может выбирать, сколько кучек он будет двигать.

Также существует два типа запросов:

  • \(0\) \(x\) — удалить кучку мусора из координаты \(x\). Гарантируется, что в координате \(x\) находится кучка в этот момент времени.
  • \(1\) \(x\) — добавить кучку мусора в координату \(x\). Гарантируется, что в координате \(x\) не находится кучки мусора в этот момент времени.

Заметьте, что в какой-либо момент времени в комнате может быть нулевое количество кучек мусора.

Вова хочет знать минимальное количество ходов, которое ему необходимо затратить, если он решит сделать генеральную уборку перед всеми запросами. Он также хочет знать это количество ходов после применения каждого запроса. Запросы применяются в заданном порядке. Заметьте, что генеральная уборка на самом деле не происходит и не изменяет состояние кучек. Она используется только для того, чтобы посчитать количество ходов.

Для лучшего понимания, пожалуйста, прочтите секцию Примечание ниже, чтобы увидеть объяснение первого примера.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 10^5\)) — количество кучек в комнате перед выполнением всех запросов и количество запросов, соответственно.

Вторая строка входных данных содержит \(n\) различных целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le 10^9\)), где \(p_i\) равно координате \(i\)-й кучки.

Следующие \(q\) строк описывают запросы. \(i\)-й запрос описывается двумя целыми числами \(t_i\) и \(x_i\) (\(0 \le t_i \le 1; 1 \le x_i \le 10^9\)), где \(t_i\) равно \(0\), если вам необходимо удалить кучку из координаты \(x_i\), и равно \(1\), если вам необходимо добавить кучку в координату\(x_i\). Гарантируется, что для \(t_i = 0\) такая кучка находится в текущем множестве кучек, а для \(t_i = 1\) такая кучка не находится в текущем множестве кучек.

Выходные данные

Выведите \(q+1\) целое число: минимальное количество ходов, которое нужно Вове, чтобы устроить генеральную уборку перед первым запросом и после каждого из \(q\) запросов.

Примечание

Рассмотрим первый пример.

Изначально множество кучек равно \([1, 2, 6, 8, 10]\). Ответ перед первым запросом равен \(5\), потому что вы можете сдвинуть все кучки из \(1\) в \(2\) за один ход, все кучки из \(10\) в \(8\) за \(2\) хода и все кучки из \(6\) в \(8\) за \(2\) хода.

После первого запроса множество превращается в \([1, 2, 4, 6, 8, 10]\). Тогда ответ равен \(7\), потому что вы можете сдвинуть все кучки из \(6\) в \(4\) за \(2\) хода, все кучки из \(4\) в \(2\) за \(2\) хода, все кучки из \(2\) в \(1\) за \(1\) ход и все кучки из \(10\) в \(8\) за \(2\) хода.

После второго запроса множество превращается в \([1, 2, 4, 6, 8, 9, 10]\), а ответ остается таким же самым (и предыдущая последовательность ходов может быть применена к текущему множеству кучек).

После третьего запроса множество превращается в \([1, 2, 4, 8, 9, 10]\), а ответ равен \(5\), потому что вы можете сдвинуть все кучки из \(1\) в \(2\) за \(1\) ход, все кучки из \(2\) в \(4\) за \(2\) хода, все кучки из \(10\) в \(9\) за \(1\) ход и все кучки из \(9\) в \(8\) за \(1\) ход.

После четвертого запроса множество превращается в \([1, 2, 4, 8, 9]\), а ответ остается почти таким же самым (предыдущая последовательность может быть применена полностью, исключая перемещение кучек из \(10\)).

После пятого запроса множество превращается в \([1, 2, 4, 8, 9, 100]\). Вы можете сдвинуть все кучки из \(1\) и дальше в \(9\), а \(100\) оставить на ее месте. Таким образом, ответ равен \(8\).

После шестого запроса множество превращается в \([1, 2, 4, 8, 9, 50, 100]\). Ответ равен \(49\) и может быть получен при помощи почти такой же последовательности ходов, как и после предыдущего запроса. Единственная разница заключается в том, что вы также должны двигать все кучки из \(50\) в \(9\).

A. Цифробой

жадные алгоритмы игры реализация *900

Ни для кого не секрет, что в Валоранте агенты разыгрывают стороны до начала матча, и делают это именно Рейз и Брич, которые решили, что для этого надо сыграть \(t\) партий следующей игры...

В каждой из \(t\) партий игры сначала генерируется какое-то положительное целое число, состоящее из \(n\) цифр. Цифры этого числа пронумерованы целыми числами от \(1\) до \(n\) от старшего разряда к младшему. После того, как число становится известно, начинается партия.

Агенты ходят по очереди, Рейз начинает первой. За один ход агент выбирает любую незакрашенную цифру и закрашивает её. Рейз может выбирать цифры на нечётных позициях, но не может на чётных, а Брич может выбирать цифры на чётных позициях, но не может на нечётных. Партия заканчивается тогда, когда остаётся одна незакрашенная цифра. Если единственная оставшаяся цифра нечётная, то выигрывает Рейз, иначе выигрывает Брич.

Можно доказать, что до того как партия закончится (при любом изначальном целом, состоящем из \(n\) цифр), каждый агент будет иметь возможность сделать ход, то есть будет хотя бы одна незакрашенная цифра, стоящая на позиции нужной чётности.

Для каждой из \(t\) партий определите, кто из агентов выиграет, если оба игрока хотят победить и действуют оптимально.

Входные данные

В первой строке входных данных находится единственное целое число \(t\) \((1 \le t \le 100)\)  — количество партий.

В первой строке описания каждой партии находится единственное целое число \(n\) \((1 \le n \le 10^3)\)  — количество цифр в числе, с которым будет проведена партия.

Во второй строке описания каждой партии находится целое положительное число, состоящее из \(n\) цифр  — число, с которым будет проведена партия. Гарантируется, что это число без лидирующих нулей.

Выходные данные

Для каждой партии выведите \(1\), если выиграет Рейз, и \(2\), если выиграет Брич.

Примечание

В первой партии никто не может сделать ход, единственная оставшаяся цифра  — это \(2\), она четная, поэтому выигрывает Брич.

Во второй партии единственная оставшаяся цифра  — это \(3\), она нечётная, поэтому выигрывает Рейз.

В третьей партии Рейз может закрасить последнюю цифру, после чего Брич может закрасить только \(0\). Останется только цифра \(1\), и она нечётная, поэтому выигрывает Рейз.

В четвертой партии вне зависимости от игры Рейз, Брич может закрасить \(9\), и в конце игры останется \(0\)  — чётная цифра, поэтому выигрывает Брич.

B. Лесенки

жадные алгоритмы Конструктив математика Перебор реализация *1200

Джет устала после уничтожения города и хочет отдохнуть. Она любит высоты, поэтому для отдыха ей надо забраться повыше, и для этого она решила делать лесенки.

Лесенка является клетчатой фигурой, состоящей из одинаковых квадратных клеточек. Если лесенка состоит из \(n\) ступенек, то это означает, что такая лесенка состоит из \(n\) столбиков, первый имеет высоту \(1\) клетку, второй имеет высоту \(2\) клетки, \(\ldots\), \(n\)-й имеет высоту \(n\) клеток. Нижние клетки всех столбиков должны находятся в одной строке.

Лесенка, имеющая \(n\) ступенек, называется красивой, если ее можно покрыть \(n\) непересекающимися квадратами. Все квадраты должны состоять целиком из клеточек лесенки.

Покрытая квадратами красивая лесенка с \(7\) ступеньками:

Скажите Джет, какое максимальное количество различных красивых лесенок она может построить, используя суммарно не больше \(x\) клеточек. Ни одна клеточка не может быть использована больше одного раза.

Входные данные

В первой строке входных данных содержится одно целое число \(t\) \((1 \le t \le 1000)\)  — количество наборов входных данных.

Единственная строка описания каждого набора входных данных содержит единственное целое число \(x\) \((1 \le x \le 10^{18})\)  — количество клеточек для постройки лесенок.

Выходные данные

Для каждого набора входных данных выведите единственное число  — максимальное количество различных красивых лесенок, которые можно построить, используя суммарно не больше \(x\) клеточек.

Примечание

В первом наборе входных данных можно построить только одну лесенку, состоящую из \(1\) ступеньки. Она является красивой. Поэтому ответ равен \(1\).

Во втором наборе входных данных можно построить две различные красивые лесенки: из \(1\) ступеньки и из \(3\) ступенек. На это уйдёт \(7\) клеточек. В таком случае останется еще одна клеточка, но из нее уже нельзя сделать ни одной красивой лесенки такого размера, которого еще нет. Поэтому ответ равен \(2\).

В третьем наборе входных данных можно построить только одну из двух красивых лесенок: с \(1\) ступенькой или с \(3\) ступеньками. В первом случае останется \(5\) клеточек, из которых можно сделать только лесенку из \(2\) ступенек. Она не является красивой, а Джет строит только красивые лесенки. Поэтому в данном случае ответ \(1\). Если же Джет построит лесенку с \(3\) ступеньками, то у неё не останется ни одной клеточки. В этом случае ответ тоже \(1\).

C. Киллджой

жадные алгоритмы математика реализация *1500

Новый агент Киллджой изобрела вирус COVID-2069, который заражает аккаунты на Codeforces. Каждый аккаунт имеет рейтинг — целое число (возможно, отрицательное или очень большое).

Аккаунт Киллджой имеет рейтинг \(x\) и изначально заражён. Рейтинг её аккаунта не изменяется. Кроме её аккаунта существуют ещё \(n\) аккаунтов, пронумерованных целыми числами от \(1\) до \(n\). Рейтинг \(i\)-го аккаунта равен \(a_i\). Любой заражённый аккаунт (изначально это только аккаунт Киллджой) моментально заражает любой здоровый аккаунт, если их рейтинги равны. Заражения могут произойти в самом начале (перед любыми изменениями рейтингов) и после каждого изменения рейтинга. Если аккаунт был заражён, то он не может быть излечен.

На Codeforces регулярно проходят контесты. В каждом контесте участвуют любые из \(n\) аккаунтов (в том числе и заражённые). Киллджой не может участвовать в контестах. В результате контеста рейтинг участников пересчитывается следующим образом: рейтинг каждого участника может измениться на любое целое число, но сумма изменений рейтингов должна быть равна нулю. Новый рейтинг каждого участника может быть любым целым числом.

Найдите, за какое минимальное количество контестов могут заразиться все аккаунты. Вы можете выбирать, какие аккаунты участвуют в контестах, и какими будут изменения рейтингов участников каждого контеста.

Можно доказать, что за конечное количество контестов могут заразиться все аккаунты.

Входные данные

В первой строке содержится единственное целое число \(t\) \((1 \le t \le 100)\) — количество наборов входных данных. Следующие \(2t\) строк содержат описания наборов входных данных.

В первой строке каждого набора входных данных содержатся два целых числа \(n\) и \(x\) (\(2 \le n \le 10^3\), \(-4000 \le x \le 4000\)) — количество аккаунтов на Codeforces и рейтинг аккаунта Киллджой.

Во второй строке каждого набора входных данных содержатся \(n\) целых чисел \(a_1, a_2, \dots, a_n\) \((-4000 \le a_i \le 4000)\) — изначальные рейтинги других аккаунтов на Codeforces.

Выходные данные

Для каждого набора входных данных выведите минимальное количество контестов, за которое могут заразиться все аккаунты.

Примечание

В первом наборе входных данных за один контест рейтинг каждого из аккаунтов может стать равен \(69\). Рейтинг первого участника увеличится на \(1\), а второго — уменьшится на \(1\). При этом сумма изменений рейтингов будет равна нулю.

Во втором наборе входных данных все аккаунты сразу же будут заражены, потому что рейтинг каждого аккаунта (включая аккаунт Киллджой) равен \(4\).

E. Расшифровка

Конструктив математика реализация теория чисел *2100

Агент по имени Кефир расшифровывает послание, которое содержит только одно составное число \(n\).

Сначала Кефир выписывает по кругу все делители числа \(n\), большие \(1\). Он может задать любой изначальный порядок чисел в кругу.

После этого за одно действие Кефир может выбрать любые два соседние числа в кругу и вставить между ними их наименьшее общее кратное. Он может выполнять такое действие сколько угодно раз.

Послание расшифровано, если любые два соседние числа в кругу не взаимно просты. Заметим, что при заданных ограничениях послание всегда можно расшифровать.

Найдите, за какое минимальное количество действий послание можно расшифровать и как для этого нужно изначально расставить по кругу делители.

Входные данные

В первой строке находится единственное целое число \(t\) \((1 \le t \le 100)\) — количество наборов входных данных. Следующие \(t\) строк содержат описания наборов входных данных.

В единственной строке каждого набора входных данных находится единственное целое составное число \(n\) \((4 \le n \le 10^9)\)  — число из послания.

Гарантируется, что суммарное количество делителей \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в первой строке выведите изначальный порядок делителей, больших \(1\), в кругу. Во второй строке выведите минимальное количество действий, необходимых для того, чтобы расшифровать послание.

Если существует несколько возможных порядков с минимальным количеством действий, выведите любой.

Примечание

В первом наборе входных данных у числа \(6\) три делителя, больших \(1\): \(2, 3, 6\). В любом случае числа \(2\) и \(3\) будут стоять рядом в кругу, и поэтому между ними необходимо вставить их наименьшее общее кратное. После этого в кругу будут числа \(2, 6, 3, 6\), и каждые два соседних числа будут не взаимно просты.

Во втором наборе входных данных у числа \(4\) два делителя, больших \(1\): \(2, 4\), и они не взаимно просты, поэтому вставлять наименьшее общее кратное не нужно.

В третьем наборе входных данных все делители \(30\), большие \(1\), можно расставить в кругу так, чтобы любые два соседние числа не были взаимно просты.

F. Огненный ливень

Бинарный поиск графы поиск в глубину и подобное реализация снм Структуры данных *2800

На плоскости есть \(n\) отрядов, пронумерованных от \(1\) до \(n\), \(i\)-й отряд находится в точке с целочисленными координатами \((x_i, y_i)\). Все отряды находятся в различных точках.

Бримстоун должен посетить каждый отряд как минимум один раз. Вы можете выбрать, с каким отрядом в одной точке изначально находится Бримстоун.

Чтобы перейти от одного отряда к другому, Бримстоун выбирает одно из четырех направлений движения (вверх, вниз, вправо или влево) и двигается в этом направлении с постоянной скоростью — один единичный отрезок в секунду — до тех пор, пока не придёт к какому-либо отряду. Как только он приходит к какому-либо отряду, он может повторить этот процесс.

Каждые \(t\) секунд происходит огненный ливень, и в эти моменты Бримстоун должен находиться в одной точке с любым своим отрядом. Он может сколько угодно времени стоять на месте в одной точке с любым отрядом.

Бримстоун хороший командир, поэтому до начала обхода он может собрать не более одного нового отряда и поставить его в любую точку плоскости с целочисленными координатами, в которой не стоит ни один отряд. Обратите внимание, что он также должен будет посетить новый отряд хотя бы один раз.

Помогите Бримстоуну, найдите минимальное целое положительное \(t\) такое, что обход можно произвести, добавив не более одного отряда. Если такого \(t\) не существует, вы должны сообщить об этом.

Входные данные

В первой строке находится единственное целое число \(n\) \((2 \le n \le 1000)\) — изначальное количество отрядов.

В каждой из следующих \(n\) строк содержатся два целых числа \(x_i\), \(y_i\) \((|x_i|, |y_i| \le 10^9)\) — координаты \(i\)-го отряда.

Гарантируется, что все точки различны.

Выходные данные

Выведите единственное целое число — минимальное время \(t\), такое что обход всех отрядов можно произвести, добавив не более одного нового отряда.

Если ни одного такого \(t\) не существует, выведите \(-1\).

Примечание

В первом примере из условия можно добавить отряд в точку \((0, 0)\), после чего все отряды можно будет обойти при \(t = 100\). Можно доказать, что при \(t < 100\), даже добавив не более одного нового отряда, не получится сделать обход, поэтому ответ \(100\).

Во втором тесте из условия нельзя посетить все отряды ни при каком \(t\), даже при добавлении не более одного нового отряда, поэтому ответ \(-1\).

В третьем тесте можно добавить отряд в точку \((1, 0)\), и тогда все отряды можно будет обойти при \(t = 2\). Можно доказать, что это минимальное такое \(t\).

В четвертом тесте не нужно добавлять новый отряд и можно обойти все отряды при \(t = 2\). Можно доказать, что это минимальное такое \(t\).

B. Помогите воеводе

жадные алгоритмы Конструктив реализация *1800

Жил да был в Тридевятом царстве Никита Добрынич — главный царский воевода. Он всегда гордился своими воинами и любил приглашать Царя на строевые учения, на которых демонстрировались боевые приемы и тактики возглавляемого им отряда дружины. Долго ли — коротко ли, но однажды поссорился Никита Добрынич с Бабой Ягой (ходили слухи, что ссора произошла после того, как воевода невысоко отозвался о боевых навыках избушки на курьих ножках, чем очень расстроил Бабу Ягу).

Результатом ссоры стало довольно странное проклятье, наложенное Бабой Ягой на воеводу. Звучало оно очень умно и довольно безобидно: «Да будут все солдаты, квадрат расстояния между которыми на учениях окажется равным 5, враждовать друг с другом!»

Строевые учения проходят на прямоугольной площадке n × m, разбитой на nm квадратных участков размерами 1 × 1 для каждого солдата. Таким образом, квадрат расстояния между солдатами на участках (x1, y1) и (x2, y2) в точности равен (x1 - x2)2 + (y1 - y2)2, и теперь в учениях не всегда могут принимать участие сразу nm солдат, как это было до проклятия Бабы Яги. Если, конечно, воевода не хочет, чтобы солдаты побили друг друга, или того хуже... Например, если поставить дружинника в квадрат (2, 2), то дружинников в квадраты (1, 4), (3, 4), (4, 1) и (4, 3) поставить уже нельзя — между любым из них и дружинником в квадрате (2, 2) начнет действовать проклятье Бабы Яги.

Ваша задача — помочь воеводе, и по заданным размерам площадки для строевых учений сообщить, какое максимальное количество воинов можно одновременно собрать на этой площадке, чтобы ни на каких двух из них не начало действовать проклятье Бабы Яги.

Входные данные

В единственной строке через пробел записаны целые числа n и m (1 ≤ n, m ≤ 1000) — размеры площадки для строевых учений.

Выходные данные

Выведите искомое максимальное количество дружинников.

Примечание

В первом тесте из примера расположить 4-х дружинников на площадке размером 2 × 4 можно следующим образом (места расположения дружинников на схеме обозначены серыми кругами):

Во втором тесте из примера расположить 6-х дружинников на площадке размером 3 × 4 можно следующим образом:

C2. Армия покемонов (сложная версия)

дп жадные алгоритмы разделяй и властвуй реализация Структуры данных *2100

Это сложная версия задачи. Различия между версиями заключаются в том, что в простой версии нет запросов обмена. Вы можете делать взломы только если обе версии задачи сданы.

Пикачу — милый и дружелюбный покемон, живущий в стае диких пикачу.

Однако недавно стало известно, что команда R хочет украсть всех этих покемонов! Тренер покемонов Андрей решил помочь Пикачу собрать армию для борьбы с командой R.

В первую очередь Андрей посчитал всех покемонов: их оказалось ровно \(n\) штук. Затем он установил силу каждого покемона и так получилось, что \(i\)-й покемон имеет силу, равную \(a_i\), и силы всех покемонов различны.

В качестве армии Андрей может выбрать любую непустую подпоследовательность покемонов. Иными словами, Андрей выбирает какой-то массив \(b\) из \(k\) индексов таких, что \(1 \le b_1 < b_2 < \dots < b_k \le n\), и его армия будет состоять из покемонов с силами \(a_{b_1}, a_{b_2}, \dots, a_{b_k}\).

Сила армии вычисляется как знакопеременная сумма элементов подпоследовательности, то есть \(a_{b_1} - a_{b_2} + a_{b_3} - a_{b_4} + \dots\).

Андрей экспериментирует с построением покемонов. Он \(q\) раз меняет двух покемонов местами, а именно, в \(i\)-й раз он менял местами покемонов с номерами \(l_i\) и \(r_i\).

Андрею надо знать: какую максимальную силу армии он мог получить при начальной расстановке покемонов, а также после каждого изменения строя?

Помогите Андрею и покемонам, иначе команде R удастся воплотить в жизнь свой коварный план!

Входные данные

Каждый тест содержит несколько наборов входных данных.

В первой строке находится одно целое положительное число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Описание наборов входных данных приведено ниже.

В первой строке каждого набора входных данных находятся два целых числа \(n\) и \(q\) (\(1 \le n \le 3 \cdot 10^5, 0 \le q \le 3 \cdot 10^5\)) — количество покемонов и количество обменов соответственно.

Во второй строке находятся \(n\) различных целых положительных чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — силы покемонов.

\(i\)-я из следующих \(q\) строк содержит два целых положительных числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le n\)) — номера обмениваемых покемонов в \(i\)-й операции.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\), а также сумма \(q\) по всем тестовым случаям не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q+1\) число — максимально возможную силу армии до изменений и после каждого изменения.

Примечание

Рассмотрим третий набор входных данных:

Изначально мы можем выбрать армию следующим образом: [1 2 5 4 3 6 7], при этом ее итоговая сила будет \(5-3+7=9\).

После первого изменения выбор армии будет таким: [2 1 5 4 3 6 7], при этом ее итоговая сила будет \(2-1+5-3+7=10\).

Далее выбор армии будет таким: [2 1 5 4 3 7 6], при этом ее итоговая сила будет \(2-1+5-3+7=10\).

После третьего изменения армию можно выбрать так: [2 1 4 5 3 7 6], при этом ее итоговая сила будет \(2-1+5-3+7=10\).

Далее выбор армии будет таким: [1 2 4 5 3 7 6], при этом ее итоговая сила будет \(5-3+7=9\).

После всех запросов выбор армии будет таким: [1 4 2 5 3 7 6], при этом ее итоговая сила будет \(4-2+5-3+7=11\).

B. Кирпичи в стене

Конструктив реализация *1100

Пинк Флойд устраивают розыгрыш Роджера Уотерса. Они знают, что ему не нравятся стены, он хочет иметь возможность свободно ходить, поэтому они запрещают ему выходить из своей комнаты, которую можно рассматривать как таблицу.

У Роджера Уотерса есть квадратная таблица размером \(n\times n\) и он хочет добраться из левого верхнего угла (\(1,1\)) своей таблицы в правый нижний угол (\(n,n\)). Уотерс может перемещаться от клетки к любой другой клетке, смежной с ней по стороне, и не может выходить за пределы таблицы. Также за исключением клеток (\(1,1\)) и (\(n,n\)) в каждой клетке записано значение \(0\) или \(1\).

Перед началом своего обхода он выберет либо \(0\), либо \(1\) и сможет переходить только по клеткам, значения в которых равны выбранной им цифре. Начальная и конечная клетки (\(1,1\)) и (\(n,n\))  — исключения из этого правила, он может проходить через них независимо от выбранной цифры. В клетке (\(1, 1\)) записана буква 'S', а в клетке (\(n, n\))  — буква 'F'.

Например, в первом примере теста он может перейти от (\(1,1\)) к (\(n,n\)), используя нули на этом пути: (\(1, 1\)), (\(2, 1\)), (\(2, 2\)), (\(2, 3\)), (\(3, 3\)), (\(3, 4\)), (\(4, 4\))

Остальная часть группы (Пинк Флойд) хочет, чтобы Уотерс не смог совершить свой обход, поэтому пока он не видит, они инвертируют максимум две клетки в таблице (из \(0\) на \(1\) или наоборот). Они боятся, что могут не успеть и просят вашей помощи в выборе клеток. Заметьте, что вы не можете инвертировать клетки \((1, 1)\) и \((n, n)\).

Можно показать, что для данных ограничений решение всегда существует.

Также обратите внимание, что Уотерс выберет свою цифру обхода после того, как группа изменит свою таблицу, поэтому он не должен быть в состоянии достичь (\(n,n\)) независимо от того, какую цифру он выберет.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 50\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(3 \le n \le 200\)).

Следующие \(n\) строк каждого набора входных данных содержат двоичную таблицу, в клетке (\(1, 1\)) написано «S», а в (\(n, n\)) — «F».

Сумма значений \(n\) по всем наборам входных данных не превышает \(200\).

Выходные данные

Для каждого набора входных данных выведите в первой строке целое \(c\) (\(0 \le c \le 2\))  — количество клеток, которые вы переворачиваете.

В \(i\)-й из следующих \(c\) строк выведите координаты \(i\)-й инвертированной ячейки. Нельзя перевернуть одну и ту же ячейку дважды. Заметьте, что вы не можете инвертировать клетки \((1, 1)\) и \((n, n)\).

Примечание

Для первого набора входных данных, после инвертирования клетки, мы получаем следующую таблицу:


S010
0001
1001
111F

D. Шестиугольники

жадные алгоритмы Конструктив кратчайшие пути математика Перебор реализация *1900

Линдси Букингем сказала Стиви Никс «идти своим путем». Никс сейчас грустит и хочет уйти как можно быстрее, но она живет в двухмерном шестиугольном мире.

Рассмотрим шестиугольное покрытие плоскости, как на картинке ниже.

Ники хочет добраться от ячейки с координатами \((0, 0)\) к определенной ячейке, заданной координатами. Она может перейти от шестиугольника к любому из шести своих соседей, но у каждого из переходов есть своя стоимость. Стоимость зависит от направления, в котором вы путешествуете. Таким образом, переход от \((0, 0)\) до \((1, 1)\) будет стоить ровно столько же, как и переход от \((-2, -1)\) до \((-1, 0)\). Стоимости приведены во входных данных в порядке \(c_1\), \(c_2\), \(c_3\), \(c_4\), \(c_5\), \(c_6\), как на рисунке ниже.

Выведите наименьшую стоимость пути от начала координат, который имеет координаты \((0, 0)\), к данной ячейке.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 10^{4}\)). Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит два целых числа \(x\) и \(y\) (\(-10^{9} \le x, y \le 10^{9}\)) — координаты конечного шестиугольника.

Вторая строка каждого набора входных данных содержит шесть целых чисел \(c_1\), \(c_2\), \(c_3\), \(c_4\), \(c_5\), \(c_6\) (\(1 \le c_1, c_2, c_3, c_4, c_5, c_6 \le 10^{9}\)) — стоимости совершения одного шага в определенном направлении (см. рисунок выше).

Выходные данные

Для каждого набора входных данных выведите наименьшую стоимость пути от начала координат до данной клетки.

Примечание

На рисунке ниже показано решение для первого примера. Стоимость \(18\) достигается путем трехкратного взятия \(c_3\) и \(c_2\) один раз, что составляет \(5+5+5+3=18\).

E. Шведские герои

дп Перебор реализация *2700

Играя в очередную стратегическую игру, Мэнс набрал \(n\) Шведских героев, силы которых можно представить в виде массива \(a\).

К сожалению, не все эти могущественные герои были созданы настолько способными, насколько он хотел, так что он решил что-то с этим сделать. Для достижения своей цели он может выбрать двух последовательных героев, с силами \(a_i\) и \(a_{i+1}\), удалить их и вставить обратно в ту же позицию героя с силой \(-(a_i+a_{i+1})\).

Например, если элементы нашего массива — \([5, 6, 7, 8]\), то мы можем выбрать \(6\) и \(7\) и получить \([5, -(6+7), 8] = [5, -13, 8]\).

После того, как он выполнит эту операцию \(n-1\) раз, у него останется только один герой. Мэнс хочет, чтобы его сила была как можно больше. Какой наибольшей силы этого героя он может достичь?

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 200000\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)) — элементы массива.

Выходные данные

Выведите наибольшую возможную силу, которую он может получить после \(n-1\) операций.

Примечание

Оптимальный список операций для первого примера:

\([5, 6, 7, 8] \rightarrow [-11, 7, 8] \rightarrow [-11, -15] \rightarrow [26]\).

B. Красивая матрица

жадные алгоритмы математика реализация *1300

Матрица размером \(n \times m\) называется красивой, если все строки и столбцы данной матрицы являются палиндромами. Последовательность чисел \((a_1, a_2, \dots , a_k)\) называется палиндромом, если выполняются для любого натурального \(i\) (\(1 \le i \le k\)) выполняется равенство \(a_i = a_{k - i + 1}\).

У Саши есть матрица \(a\) размером \(n \times m\). За одну операцию он может увеличить либо уменьшить любое число в матрице на единицу. Саша обязательно хочет сделать свою матрицу красивой. Теперь ему стало интересно, за какое минимальное количество операций он сможет добиться нужного ему результата.

Помогите ему!

Входные данные

В первой строке задается целое число \(t\) — количество тестов (\(1 \le t \le 10\)).

Далее задаются \(t\) тестов. Первая строка каждого теста содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 100\)) — размер исходной матрицы. Следующие \(n\) строк содержат по \(m\) целых чисел \(a_{i, j}\) (\(0 \le a_{i, j} \le 10^9\)) — описание очередного элемента матрицы.

Выходные данные

Для каждого теста в отдельной строке выведите целое число — минимальное число операций, необходимое, чтобы сделать матрицу красивой.

Примечание

В первом примере можно, например, получить следующую красивую матрицу за \(8\) операций:


2 2
4 4
4 4
2 2

Во втором примере можно, например, получить следующую красивую матрицу за \(42\) операции:


5 6 6 5
6 6 6 6
5 6 6 5

E. Минлексы

дп жадные алгоритмы реализация Строки *2700

Недавно в поле зрения Лёши попала одна занимательная строка \(s\), состоящая из маленьких латинских букв. Лёша сразу же разработал уникальный алгоритм с этой строкой и поспешил поделиться им с вами. Суть алгоритма заключалась в следующем.

Лёша выбирал любое количество пар символов на позициях \((i, i + 1)\) так, чтобы выполнялись следующие условия:

  • для любой пары \((i, i + 1)\) выполняется \(0 \le i < |s| - 1\);
  • для любой пары \((i, i + 1)\) выполняется \(s_i = s_{i + 1}\);
  • не существует индекса, который находится в нескольких парах одновременно.

Далее Лёша удалял все символы строки по индексам, содержащимся в выбранных парах, и завершал алгоритм.

Теперь Лёшу интересует, какую лексикографически минимальную строку можно получить после выполнения алгоритма на каждом суффиксе заданной строки.

Входные данные

Единственная строка ввода содержит строку \(s\) (\(1 \le |s| \le 10^5\)) — исходную строку, состоящую из маленьких латинских букв.

Выходные данные

В \(|s|\) строках выведите длины искомых строк и сами искомые строки для всех суффиксов, начиная с наибольшего по длине. Вывод может получится слишком большим, и поэтому, если длина ответа больше \(10\) символов, то вместо самого ответа выведите только первые \(5\) символов, далее «...», и далее последние \(2\) символа ответа.

Примечание

Рассмотрим первый пример.

  • Наибольший по длине суффикс — вся строка «abcdd». Выбирая одну пару \((4, 5)\), Лёша может получить строку «abc».
  • Следующий по длине суффикс — строка «bcdd». Выбирая одну пару \((3, 4)\), получаем «bc».
  • Следующий по длине суффикс — строка «cdd». Выбирая одну пару \((2, 3)\), получаем «c».
  • Следующий по длине суффикс — строка «dd». Выбирая одну пару \((1, 2)\), получаем «» (пустую строку).
  • Последний суффикс — строка «d». Нельзя выбрать ни одну пару, поэтому ответ «d».

Во втором примере для наибольшего по длине суффикса «abbcdddeaaffdfouurtytwoo» выбираем три пары \((11, 12)\), \((16, 17)\), \((23, 24)\) и получаем «abbcdddeaadfortytw»

E. Excitation of Atoms

жадные алгоритмы реализация *2200

Mr. Chanek is currently participating in a science fair that is popular in town. He finds an exciting puzzle in the fair and wants to solve it.

There are \(N\) atoms numbered from \(1\) to \(N\). These atoms are especially quirky. Initially, each atom is in normal state. Each atom can be in an excited. Exciting atom \(i\) requires \(D_i\) energy. When atom \(i\) is excited, it will give \(A_i\) energy. You can excite any number of atoms (including zero).

These atoms also form a peculiar one-way bond. For each \(i\), \((1 \le i < N)\), if atom \(i\) is excited, atom \(E_i\) will also be excited at no cost. Initially, \(E_i\) = \(i+1\). Note that atom \(N\) cannot form a bond to any atom.

Mr. Chanek must change exactly \(K\) bonds. Exactly \(K\) times, Mr. Chanek chooses an atom \(i\), \((1 \le i < N)\) and changes \(E_i\) to a different value other than \(i\) and the current \(E_i\). Note that an atom's bond can remain unchanged or changed more than once. Help Mr. Chanek determine the maximum energy that he can achieve!

note: You must first change exactly \(K\) bonds before you can start exciting atoms.

Input

The first line contains two integers \(N\) \(K\) \((4 \le N \le 10^5, 0 \le K < N)\), the number of atoms, and the number of bonds that must be changed.

The second line contains \(N\) integers \(A_i\) \((1 \le A_i \le 10^6)\), which denotes the energy given by atom \(i\) when on excited state.

The third line contains \(N\) integers \(D_i\) \((1 \le D_i \le 10^6)\), which denotes the energy needed to excite atom \(i\).

Output

A line with an integer that denotes the maximum number of energy that Mr. Chanek can get.

Note

An optimal solution to change \(E_5\) to 1 and then excite atom 5 with energy 1. It will cause atoms 1, 2, 3, 4, 5 be excited. The total energy gained by Mr. Chanek is (5 + 6 + 7 + 8 + 10) - 1 = 35.

Another possible way is to change \(E_3\) to 1 and then exciting atom 3 (which will excite atom 1, 2, 3) and exciting atom 4 (which will excite atom 4, 5, 6). The total energy gained by Mr. Chanek is (5 + 6 + 7 + 8 + 10 + 2) - (6 + 7) = 25 which is not optimal.

A. Номер этажа

математика реализация *800

Вася идет в гости к однокласснику Пете. Вася знает, что Петя живет в квартире номер \(n\).

В доме Пети всего один подъезд, причем на первом этаже всего \(2\) квартиры, а на каждом из следующих этажей по \(x\) квартир. Квартиры нумеруются с единицы, начиная с первого этажа. То есть квартиры, находящиеся на первом этаже имеют номера \(1\) и \(2\), квартиры на втором этаже имеют номера с \(3\) до \((x + 2)\), квартиры на третьем этаже имеют номера от \((x + 3)\) до \((2 \cdot x + 2)\), и так далее.

Перед вами стоит задача помочь Васе и определить номер этажа, на котором живет его друг Петя. Считайте, что количества этажей в доме всегда достаточно для того, чтобы в доме была квартира номер \(n\).

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов тестовых данных. Далее следуют \(t\) наборов тестовых данных.

Единственная строка набора тестовых данных содержит два целых числа \(n\) и \(x\) (\(1 \le n, x \le 1000\)) — номер квартиры, в которой живет Петя и количество квартир на каждом из этажей дома, кроме первого (на первом этаже находятся две квартиры).

Выходные данные

Выведите ответ на каждый набор тестовых данных: номер этажа, на котором живет Петя.

Примечание

В первом наборе тестовых данных примера на первом этаже находятся квартиры с номерами \(1\) и \(2\), на втором этаже находятся квартиры с номерами \(3\), \(4\) и \(5\), на третьем этаже находятся квартиры с номерами \(6\), \(7\) и \(8\). Поэтому Петя живет на третьем этаже.

Во втором наборе тестовых данных примера Петя живет в квартире с номером \(1\), которая находится на первом этаже.

B. Симметричная матрица

реализация *900

У Маши есть \(n\) типов плиток размера \(2 \times 2\). В каждой из четырех клеток плитки записано по одному целому числу. У Маши есть неограниченное количество плиток каждого из типов.

Маша решила выложить из своих плиток квадрат размера \(m \times m\), причем этот квадрат должен представлять из себя симметричную относительно главной диагонали матрицу, а каждая клетка квадрата должна быть покрыта ровно одной клеткой плитки, причем боковые стороны плиток после укладки должны быть параллельны боковым сторонам квадрата. Уложенные плитки не должны пересекаться между собой. Также плитки должны целиком лежать внутри квадрата. Рассмотрите рисунок из примечания для лучшего понимания условия.

Симметричная относительно главной диагонали матрица — это квадрат \(s\), у которого для всех пар \((i, j)\) верно, что \(s[i][j] = s[j][i]\). То есть для всех клеток верно, что элемент, записанный на пересечении \(i\)-й строки и \(j\)-го столбца равен элементу, который записан на пересечении \(j\)-й строки и \(i\)-го столбца.

Перед вами стоит задача определить, сможет ли Маша выложить из своих плиток квадрат размера \(m \times m\), который будет представлять из себя симметричную матрицу. Для укладки Маша может использовать неограниченное количество плиток каждого из имеющихся у нее типов. Обратите внимание, что плитки нельзя поворачивать, их можно укладывать только в той ориентации, в которой они заданы во входных данных.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 100\), \(1 \le m \le 100\)) — количество типов плиток и размер квадрата, который хочет выложить Маша.

Следующие \(2n\) строк набора тестовых данных содержит описание типов плиток. Типы плиток описываются по очереди, на каждый тип отведено по две строки.

Сначала следует два целых положительных числа, не превосходящих \(100\) — число, записанное в левом верхнем углу плитки очередного типа, и число, записанное в правом верхнем углу плитки очередного типа. В следующей строке следует два целых положительных числа, не превосходящих \(100\) — число, записанное в левом нижнем углу плитки очередного типа, и число, записанное в правом нижнем углу плитки очередного типа.

В ходе укладки плитки запрещено поворачивать, их можно укладывать только в той ориентации, в которой они заданы во входных данных.

Выходные данные

Выведите ответ на каждый набор тестовых данных: если Маша может выложить из своих плиток квадрат размера \(m \times m\), который будет являться симметричной матрицей, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек).

Примечание

В первом наборе тестовых данных есть три типа плиток, они изображены на рисунке.

Из таких типов плиток можно составить, например, такой квадрат размера \(4 \times 4\), который является симметричной матрицей:

B. Шахматный мошенник

жадные алгоритмы реализация сортировки *1400

Вам нравится играть в шахматные турниры онлайн.

В своем последнем турнире вы сыграли \(n\) игр. В этой задаче, каждая шахматная партия заканчивается либо победой, либо поражением (ничьих не бывает). Когда вы проигрываете партию, вы получаете \(0\) очков. Когда вы выигрываете, вы получаете \(1\) или \(2\) очка: если вы выиграли и предыдущую партию, вы получаете \(2\) очка, в противном случае вы получаете \(1\) очко. Если вы выиграли самую первую игру турнира, вы получаете \(1\) очко (так как не существует "предыдущей игры").

Итоги \(n\) игр записываются в строку \(s\) длиной \(n\): \(i\)-й символ \(s\)  — W, если вы выиграли \(i\)-ю игру, и L, если вы проиграли \(i\)-ю игру.

После окончания турнира вы замечаете баг на сайте, который позволяет вам изменить результат не более \(k\) игр (то есть, не более \(k\) раз вы можете изменить один символ L на W, или W на L). Так как ваша единственная цель  — улучшение вашего шахматного рейтинга, вы решили сжульничать и использовать данный баг.

Вычислите максимальное количество очков, которое вы можете получить с помощью жульничества оптимальным способом.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке содержится целое число \(t\) (\(1\le t \le 20,000\)) — количество наборов входных данных. Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит два целых числа \(n, k\) (\(1\le n\le 100,000\), \(0\le k\le n\)) — количество сыгранных партий и количество исходов, которые можно изменить.

Вторая строка каждого набора входных данных содержит строку \(s\) длиной \(n\), содержащую только символы W и L. Если вы выиграли \(i\)-ю игру, то \(s_i=\,\)W, если вы проиграли \(i\)-ю игру, то \(s_i=\,\)L.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превысит \(200,000\).

Выходные данные

Для каждого теста выведите одно целое число  — максимальное количество очков, который вы можете получить, обманув оптимальным способом.

Примечание

Пояснение первого набора входных данных. Изначально ваш счет равен \(2\). Действительно, вы выиграли первую игру, за что вы получили \(1\) очко, а также выиграли третью, за что вы получили еще \(1\) очко (а не \(2\), потому что вы проиграли вторую игру).

Лучшим способом сжульничать является изменение исхода второй и четвертой игры. При этом вы выигрываете первые четыре партии (строка исходов становится WWWWL). Следовательно, ваш новый счет будет равен \(7=1+2+2+2\): \(1\) очко за первую партию и по \(2\) очка за вторую, третью и четвертую партию.

Пояснение второго набора входных данных.. Изначально ваш счет равен \(3\). Действительно, вы выиграли четвертую игру, за что вы получили \(1\) очко, а также выиграли пятую игру, так что вы получили \(2\) очка (так как вы выиграли и предыдущую игру).

Лучшим способом сжульничать является изменение исхода первой, второй, третьей и шестой игры. При этом Вы выигрываете все игры (строка исходов становится WWWWWW). Следовательно, новый счет будет равен \(11 = 1+2+2+2+2+2\): \(1\) очко за первую партию и \(2\) очка за все остальные партии.

D. Перетасовка колоды

Конструктив реализация *2000

Вам дается колода из \(n\) карт, пронумерованных от \(1\) до \(n\) (в колоде они лежат не обязательно в таком порядке). Вы должны отсортировать колоду, повторив следующую операцию несколько раз.

  • Выберите \(2 \le k \le n\) и разделите колоду на \(k\) непустых последовательных частей \(D_1, D_2,\dots, D_k\) (\(D_1\) содержит первые \(|D_1|\) карт колоды, \(D_2\) содержит следующие \(|D_2|\) карт и т.д.). Затем поставьте эти части в обратном порядке, превратив колоду в \(D_k, D_{k-1}, \dots, D_2, D_1\) (так что первые \(|D_k|\) новой колоды  — \(D_k\), следующие \(|D_{k-1}|\)  — \(D_{k-1}\) и т.д.). Внутренний порядок каждой части \(D_i\) не меняется при операции.

Вы должны получить отсортированную колоду (т.е. колоду, где первая карта имеет номер \(1\), вторая  — \(2\) и т.д.), выполнив не более \(n\) операций. Можно доказать, что всегда можно отсортировать колоду, выполнив не более \(n\) операций.

Примеры операций: Ниже приведены три примера корректных операций (на трех колодах разного размера).

  • Если колода имеет вид [3 6 2 1 4 5 7] (\(3\)  — первая карта, \(7\)  — последняя), мы можем применить операцию с \(k=4\) и \(D_1=\)[3 6], \(D_2=\)[2 1 4], \(D_3=\)[5], \(D_4=\)[7]. Таким образом, колода становится [7 5 2 1 4 3 6].
  • Если колода имеет вид [3 1 2], то мы можем применить операцию с \(k=3\) и \(D_1=\)[3], \(D_2=\)[1], \(D_3=\)[2]. При этом колода становится [2 1 3].
  • Если колода имеет вид [5 1 2 4 3 6], то мы можем применить операцию с \(k=2\) и \(D_1=\)[5 1], \(D_2=\)[2 4 3 6]. При этом колода становится [2 4 3 6 5 1].
Входные данные

Первая строка ввода содержит одно целое число \(n\) (\(1\le n\le 52\))  — количество карт в колоде.

Вторая строка содержит \(n\) целых чисел \(c_1, c_2, \dots, c_n\) – карты в колоде. Первая карта  — \(c_1\), вторая  — \(c_2\), и так далее.

Гарантируется, что для всех \(i=1,\dots,n\) существует ровно одно \(j\in\{1,\dots,n\}\) такое, что \(c_j = i\).

Выходные данные

В первой строке выведите \(q\)  — число операций, которые вы выполните (должно выполняться \(0\le q\le n\)).

Затем выведите \(q\) строк, каждая из которых описывает одну операцию.

Чтобы описать операцию, выведите в одной строке \(k\)  — число частей, на которые вы собираетесь разделить колоду, а затем \(k\) чисел \(|D_1|, |D_2|, \dots , |D_k|\)  — размеры частей.

Должно выполняться \(2\le k\le n\), \(|D_i|\ge 1\) для всех \(i=1,\dots,k\), и \(|D_1|+|D_2|+\cdots + |D_k| = n\).

Можно доказать, что всегда можно отсортировать колоду, выполнив не более \(n\) операций. Если существует несколько способом отсортировать колоду, вы можете вывести любой из них.

Примечание

Пояснение первого примера: Изначальная колода: [3 1 2 4].

  • Первая операция разделяет колоду как [(3)(1 2)(4)], а затем преобразует ее в [4 1 2 3].
  • Вторая операция разделяет колоду как [(4) (1 2 3)], а затем преобразует ее в [1 2 3 4].
Пояснение второго примера: Изначально колода: [6 5 4 3 2 1].
  • Первая (и единственная) операция разделяет колоду как [(6)(5)(4)(3)(2)(1)], а затем преобразует ее в [1 2 3 4 5 6].

B. Соединенные комнаты

графы реализация *1200

На выставке змей есть \(n\) комнат (пронумерованных от \(0\) до \(n - 1\)) расположенных по кругу. В каждой комнате находится одна змея. Комнаты соединены \(n\) конвейерами, \(i\)-й из них соединяет комнаты \(i\) и \((i+1) \bmod n\). Другими словами, комнаты \(0\) и \(1\), \(1\) и \(2\), \(\ldots\), \(n-2\) и \(n-1\), \(n-1\) и \(0\) соединены конвейерами.

Конвейер \(i\) может быть в одном из трех состояний:

  • Если он направлен по часовой стрелке, змеи могут проползти только из комнаты \(i\) в \((i+1) \bmod n\).
  • Если он направлен против часовой стрелки, змеи могут пройти только из комнаты \((i+1) \bmod n\) в \(i\).
  • Если он выключен, змеи могут проползти в обоих направлениях.

В этом примере \(4\) комнаты, где конвейеры \(0\) и \(3\) выключены, конвейер \(1\) направлен по часовой стрелке, а конвейер \(2\) — против часовой стрелки.

Каждая змея хочет покинуть свою комнату, поползать и вернуться в нее потом снова. Назовем комнату возвратимой, если змея может покинуть ее и вернуться в нее позже, ползая по конвейерам. Сколько всего возвратимых комнат?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 1000\)): количество наборов входных данных. Описание наборов входных данных следует.

В первой строке описания каждого набора входных данных находится единственное целое число \(n\) (\(2 \le n \le 300\,000\)): количество комнат.

В следующей строке описания каждого набора входных данных находится строка \(s\) длины \(n\), состоящая только из символов «<», «>» и «-».

  • Если \(s_{i} = \) «>», то \(i\)-й конвейер направлен по часовой стрелке.
  • Если \(s_{i} = \) «<», то \(i\)-й конвейер направлен против часовой стрелки.
  • Если \(s_{i} = \) «-», то \(i\)-й конвейер выключен.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(300\,000\).

Выходные данные

Для каждого набора входных данных выведите количество возвратимых комнат.

Примечание

В первом наборе входных данных все комнаты являются возвратимыми, кроме комнаты \(2\). Змея в комнате \(2\) заблокирована и не может выйти. Этот набор входных данных соответствует картинке из условия задачи.

Во втором наборе входных данных все комнаты являются возвратимыми, потому что можно вернуться в любую комнату, несколько раз пройдя по конвейерам, направленным по часовой стрелке.

D. Бросание бумерангов

жадные алгоритмы Конструктив реализация *1900

Для улучшения умения животных кидать бумеранги, смотритель зоопарка сделал таблицу размером \(n \times n\), поставив мишени в некоторые ее клетки. В каждой строке и в каждом столбце находится не больше \(2\) мишеней. Строки таблицы пронумерованы от \(1\) до \(n\) сверху вниз, столбцы таблицы пронумерованы от \(1\) до \(n\) слева направо.

Для каждого столбца, смотритель зоопарка бросит бумеранг снизу вверх (из под низа таблицы) вдоль этого столбца. Когда бумеранг попадет в любую мишень он оскочит, сделает поворот на \(90\) градусов вправо и продолжит полет вдоль прямой в новом направлении. Бумеранг может попасть в несколько мишеней и не остановится, пока не покинет таблицу.

В этом примере, \(n=6\) и черные крестики обозначают мишени. Бумеранг в столбце \(1\) (синие стрелки) попадет в мишени \(2\) раза, а бумеранг в столбце \(3\) (красные стрелки) попадет в мишени \(3\) раза.

Бумеранг в столбце \(i\) попал в ровно \(a_i\) мишеней перед тем, как улетел за границы таблицы. Известно, что \(a_i \leq 3\).

К сожалению, смотритель зоопарка потерял изначальные позиции мишеней. Поэтому он просит вас найти любое возможное расположение мишеней, которое удовлетворяет условиям на количества попаданий бумерангов для каждого столбца. Если такого расположения не существует, сообщите об этом.

Если существует несколько возможных расположений мишеней, вы можете найти любое.

Входные данные

В первой строке находится единственное целое число \(n\) \((1 \leq n \leq 10^5)\).

В следующей строке находится \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) \((0 \leq a_i \leq 3)\).

Выходные данные

Если ни одного возможного расположения мишеней не существует, выведите \(-1\).

Иначе в первой строке выведите единственное целое число \(t\) \((0 \leq t \leq 2n)\): количество мишеней в вашем расположении.

Затем выведите \(t\) строк. Каждая строка должна содержать два целых числа \(r\) и \(c\) \((1 \leq r,c \leq n)\), где \(r\) это строка, в которой находится мишень, а \(c\) это столбец, в котором находится мишень. Все мишени должны иметь различные позиции.

В каждой строке и в каждом столбце должно находиться не более двух мишеней.

Примечание

В первом тесте можно использовать такое же расположение мишеней, как на картинке из условия.

Во втором тесте бумеранг не должен попасть ни в одну мишень, поэтому мы можем расположить \(0\) мишеней.

В третьем тесте следующая конфигурация мишеней удовлетворяет условиям на количества попаданий бумерангов, но не разрешена, потому что строка \(3\) содержит \(4\) мишени.

Можно показать, что для этого теста ни одна из конфигураций не будет удовлетворять условиям на количества попаданий бумерангов.

B. Помогите Тридевятому царству 2

реализация Строки *1200

Некоторое время программа для округления чисел, разработанная участниками Codeforces во время одного из предыдущих раундов, помогала жителям Тридевятого царства переводить числа в более удобочитаемый формат. Однако время шло, экономика Тридевятого царства развивалась, росли масштабы операций, царским указом был основан Тридевятый банк, и очень скоро даже округление не помогало быстро определить хотя бы порядок чисел, с которыми проводились операции. Да и округление до целого было не очень удобно — ведь банку нужно представлять все числа с точностью до 0.01, а не до целого.

Царь издал новый указ — ввести для представления чисел, обозначающих денежные суммы, финансовый формат. Формально, правила записи числа в финансовом формате следующие:

  • Число содержит целую и дробную части, разделенные символом «.» (десятичная точка).
  • Цифры целой части числа разбиваются для удобочитаемости на группы по три разряда, начиная с младших разрядов, группы разделяются символом «,» (запятая). Например, если целая часть числа равна 12345678, то она запишется в финансовом формате как 12,345,678
  • Дробная часть числа в финансовом формате должна содержать ровно 2 цифры. Соответственно, если исходное число (которое переводится в финансовый формат) содержит менее двух цифр в дробной части (или не содержит их вовсе) — она дополняется нулями до длины 2. Если дробная часть числа содержит более двух цифр — лишние цифры просто отбрасываются (округление не производится — см. примеры тестов).
  • Знак минус при записи числа в финансовом формате не пишется. Вместо этого, если исходное число имело знак минус, результат записывается в круглых скобках.
  • Не стоит забывать, что Тридевятый банк работает в заморской валюте — змейках ($), поэтому непосредственно перед числом в финансовом формате (внутри скобок, если они необходимы в записи числа) необходимо ставить знак «$».

Например, по вышеизложенным правилам число 2012 запишется в финансовом формате как «$2,012.00», а число -12345678.9 — как «($12,345,678.90)».

Купцы Тридевятого царства снова пришли к вам с поклоном и надеждой, что вы обеспечите их программой для перевода произвольных чисел в финансовый формат. Поможете?

Входные данные

На входе записано число для перевода в финансовый формат. Длина записи числа не превосходит 100 символов, включая (возможные) знак «-» (минус) и «.» (десятичная точка). Запись числа корректна, то есть:

  • Запись числа содержит только символы из множества {«0» – «9», «-», «.»}.
  • Десятичная точка (если она есть) единственна и содержит перед собой и после себя ненулевое количество десятичных цифр
  • Число не может начинаться с цифры 0, за исключением случая, когда его целая часть равна нулю (в этом случае целая часть состоит из одного нуля: «0»).
  • Знак минус (если он есть) единственен и стоит в самом начале записи числа
  • Если число тождественно равно 0 (то есть записано, например, как «0» или «0.000»), то не содержит перед собой знак минус.
  • Входные данные не содержат пробелов.
  • Запись числа содержит хотя бы одну десятичную цифру.
Выходные данные

Выведите число, заданное на входе, в финансовом формате, как описано в условии задачи.

Примечание

Обратите внимание на второй и третий тесты из примеров, демонстрирующие, что знак числа в финансовом формате (и, соответственно, наличие скобок) определяется знаком округляемого числа, а не знаком числа, полученного после округления.

B. Бочки

жадные алгоритмы реализация сортировки *800

Перед вами в ряд выстроены \(n\) бочек, пронумерованные слева направо, начиная с единицы. В \(i\)-й бочке налито \(a_i\) литров воды.

Вы можете переливать воду из одной бочки в другую. В ходе одного переливания вы можете выбрать две разные бочки с номерами \(x\) и \(y\) (бочка \(x\) должна быть непустой) и перелить любое возможное количество воды из бочки \(x\) в бочку \(y\) (возможно, всю воду). Считайте, что каждая бочка имеет бесконечную емкость, то есть в бочку можно налить сколько угодно воды.

Определите максимальную разность между бочкой с наибольшим количество воды и бочкой с наименьшим количеством воды, если вы можете сделать не более \(k\) переливаний.

Несколько примеров:

  • если у вас есть четыре бочки, в каждой из которых по \(5\) литров воды, и \(k = 1\), вы можете вылить \(5\) литров из второй бочки в четвертую, тогда количества литров воды в бочках будут равны \([5, 0, 5, 10]\), и разность между максимальным и минимальным равна \(10\);
  • если все бочки — пустые, вы не сможете сделать ни одного переливания, и разность между максимальным и минимальным количеством будет равна \(0\).
Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(k\) (\(1 \le k < n \le 2 \cdot 10^5\)) — количество бочек и максимальное количество переливаний, которые вы можете произвести.

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^{9}\)), где \(a_i\) равно изначальному количеству литров воды, которое находится в бочке номер \(i\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, выведите максимальную разность между бочкой с наибольшим количество воды и бочкой с наименьшим количеством воды, если вы можете сделать не более \(k\) переливаний.

C. Числа на доске

жадные алгоритмы Конструктив математика реализация Структуры данных *1000

На доске записаны целые числа \(1, 2, 3, \dots n\) (то есть все целые числа от \(1\) до \(n\) по одному разу). Вы можете за одну операцию стереть с доски два любых числа \(a\) и \(b\) и вместо них записать новое число, равное \(\frac{a + b}{2}\) округленному вверх.

Вы должны выполнить ровно \(n - 1\) описанную операцию, при этом число, которое будет записано на доске в ходе последней операции, должно быть минимально возможным.

Например, если \(n = 4\), то следующая последовательность действий является оптимальной:

  1. выбрать \(a = 4\) и \(b = 2\), тогда вы запишете \(3\), и на доске останутся числа \([1, 3, 3]\);
  2. выбрать \(a = 3\) и \(b = 3\), тогда вы запишете \(3\), и на доске останутся числа \([1, 3]\);
  3. выбрать \(a = 1\) и \(b = 3\), тогда вы запишете \(2\), и на доске останется \([2]\).

Легко показать, что после \(n - 1\) операции на доске будет записано всего одно число, его и нужно минимизировать.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора задано целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество целых чисел, изначально записанных на доске.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

В первую строку каждого набора входных данных выведите минимальное число, которое может остаться на доске после \(n - 1\) операции. В каждой из следующих \(n - 1\) строк выведите по два целых числа — числа \(a\) и \(b\), которые должны быть стерты с доски во время очередной операции.

B. Поликарп и язык богов

*особая задача реализация *1400

Поликарп только что закончил записывать очередную лекцию по эльфийским языкам. На этой неделе был язык «VwV» (произносится «уву»). В письменности данного языка используются только две латинские строчные буквы 'v' и 'w'.

К сожалению, Поликарп записал лекцию курсивом и абсолютно без пробелов, поэтому вся запись выглядит как нескончаемая последовательность закорючек. Если быть точным, то Поликарп не может отличить 'w' от 'vv' в своей записи, так как и то, и другое состоит из двух одинаковых закорючек.

К счастью, его брат Монокарп пишет гораздо лучше, поэтому Поликарп смог позаимствовать его запись, и теперь хочет улучшить свою с ее помощью. Чтобы это сделать, он может следовать за записью Монокарпа и подчеркивать некоторые буквы в своей записи так, чтобы не осталось неоднозначностей. Если он подчеркивает букву 'v', то ее становится нельзя перепутать с частью буквы 'w', а если он подчеркивает 'w', то ее становится нельзя перепутать с двумя рядом стоящими буквами 'v'.

Какое минимальное количество букв необходимо подчеркнуть Поликарпу, чтобы запись стала однозначной?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В каждой из следующих \(t\) строк записана непустая строка на языке VwV, которая состоит только из строчных латинских букв 'v' и 'w'. Длина строки не превосходит \(100\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: минимальное количество букв, которые необходимо подчеркнуть Поликарпу, чтобы запись стала однозначной.

Примечание

В первом наборе входных данных достаточно подчеркнуть одну из двух букв 'v'.

Во втором наборе входных данных буква 'v' сама по себе однозначна, поэтому не надо подчеркивать нечего.

В третьем наборе входных данных необходимо подчеркнуть 'w', чтобы не перепутать ее с двумя буквами 'v'.

В четвертом наборе входных данных можно подчеркнуть 'w', чтобы избавиться от всех неоднозначностей.

В пятом наборе входных данных можно подчеркнуть обе буквы 'w', а также одну из двух букв 'v' между ними.

C. Черная пятница

*особая задача реализация *1600

В местном магазине недалеко от вас вовсю готовятся к великому празднику Черной пятницы. Всего на витрине есть \(n\) товаров с ценами \(p_1, p_2, \dots, p_n\). Они упорядочены по ценам, так что \(p_1 \le p_2 \le \dots \le p_n\).

В магазине есть заранее выбранное число скидки \(k\). Скидка в Черную пятницу применяется следующим образом: из одной покупки на \(x\) товаров, вы получаете \(\lfloor \frac x k \rfloor\) самых дешевых из них бесплатно (\(\lfloor \frac x k \rfloor\) — это \(x\), деленное на \(k\) и округленное вниз до ближайшего целого числа). Каждый товар можно включить в покупку не более одного раза.

Например, если в магазине товары с ценами \([1, 1, 2, 2, 2, 3, 4, 5, 6]\), вы покупаете товары с ценами \([1, 2, 2, 4, 5]\) и \(k = 2\), то вы получаете \(\lfloor \frac 5 2 \rfloor = 2\) самых дешевых из них бесплатно. Это товары с ценами \(1\) и \(2\).

Так что вы, будучи наивным покупателем, не заботитесь о том, сколько денег вы потратите. Вы же, однако, хотите, чтобы суммарная цена предметов, которые вы получите бесплатно, была как можно больше.

Какая наибольшая суммарная цена может быть у предметов, которые вы получите бесплатно за одну покупку?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных.

Затем следует описание \(t\) наборов входных данных.

В первой строке записаны два целых числа \(n\) и \(k\) (\(1 \le n \le 200\), \(1 \le k \le n\)) — количество товаров на витрине магазине и значение скидки, соответственно.

Во второй строке каждого набора входных данных записаны \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le 10^6\)) — цены товаров на витрине магазина. Товары упорядочены по своей цене, так что \(p_1 \le p_2 \le \dots \le p_n\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: наибольшая суммарная цена предметов, которые вы получите бесплатно за одну покупку.

A. Скучные квартиры

математика реализация *800

Есть дом, в котором расположены \(10~000\) квартир, пронумерованных от \(1\) до \(10~000\).

Назовем номер квартиры скучным, если ее номер состоит из одинаковых цифр. Примерами скучных квартир являются \(11, 2, 777, 9999\) и так далее.

Наш герой очень наглый и он любит звонить в домофоны всех скучных квартир до тех пор, пока кто-то не ответит, в следующем порядке:

  • сначала он обзванивает квартиры, состоящие из цифр \(1\), в возрастающем порядке (\(1, 11, 111, 1111\));
  • затем он обзванивает квартиры, состоящие из цифр \(2\), в возрастающем порядке (\(2, 22, 222, 2222\));
  • и так далее.

Житель скучной квартиры \(x\) ответил на звонок. После этого наш герой перестал обзванивать кого-либо еще.

Наш герой хочет знать, как много цифр он суммарно нажал. Ваша задача — помочь посчитать ему суммарное количество нажатых клавиш.

Например, если житель квартиры \(22\) ответил, то наш герой звонил в квартиры с номерами \(1, 11, 111, 1111, 2, 22\). Таким образом, суммарное количество нажатий равно \(1 + 2 + 3 + 4 + 1 + 2 = 13\).

Вам нужно ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 36\)) — количество наборов тестовых данных.

Единственная строка набора тестовых данных содержит одно целое число \(x\) (\(1 \le x \le 9999\)) — номер квартиры, житель которой ответил на звонок. Гарантируется, что \(x\) состоит из одинаковых цифр.

Выходные данные

Для каждого набора тестовых данных выведите ответ на него: как много цифр суммарно нажал наш герой.

B. Еще одна задача про книжную полку

жадные алгоритмы реализация *800

Есть книжная полка, на которой может уместиться \(n\) книг. \(i\)-я позиция на книжной полке \(a_i = 1\), если на этой позиции находится книга, и \(a_i = 0\) иначе. Гарантируется, что есть как минимум одна книга на книжной полке.

За один ход вы можете выбрать какой-то непрерывный отрезок \([l; r]\), состоящий из книг (то есть для каждого \(i\) от \(l\) до \(r\) должно выполняться условие \(a_i = 1\)), и:

  • Сдвинуть его вправо на \(1\): переместить книгу с индекса \(i\) в \(i + 1\) для всех \(l \le i \le r\). Этот ход можно свершить только тогда, когда \(r+1 \le n\) и на позиции \(r+1\) нет книги.
  • Сдвинуть его влево на \(1\): переместить книгу с индекса \(i\) в \(i-1\) для всех \(l \le i \le r\). Этот ход можно свершить только тогда, когда \(l-1 \ge 1\) и на позиции \(l-1\) нет книги.

Ваша задача — найти минимальное количество ходов, необходимое, чтобы собрать все книги на полке в непрерывный (последовательный) отрезок (т.е. отрезок без промежутков).

Например, в \(a = [0, 0, 1, 0, 1]\) есть промежуток между книгами (\(a_4 = 0\) при \(a_3 = 1\) и \(a_5 = 1\)), в \(a = [1, 1, 0]\) нет промежутков между книгами и в \(a = [0, 0,0]\) тоже нет промежутков между книгами.

Вам нужно ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 50\)) — количество позиций на книжной полке. Вторая строка набора тестовых данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 1\)), где \(a_i\) равно \(1\), если на этой позиции есть книга, и \(0\) в противном случае. Гарантируется, что на полке есть как минимум одна книга.

Выходные данные

Для каждого набора тестовых данных выведите одно целое число: минимальное количество ходов, необходимое, чтобы собрать все книги на полке в непрерывный (последовательный) отрезок (т.е. отрезок без промежутков).

Примечание

В первом наборе тестовых данных примера вы можете сдвинуть отрезок \([3; 3]\) вправо, а затем отрезок \([4; 5]\) вправо. После всех ходов книги будут образовывать непрерывный отрезок \([5; 7]\). Таким образом, ответ равен \(2\).

Во втором наборе тестовых данных примера вам ничего не нужно делать, так как все книги на книжной полке уже образуют непрерывный отрезок.

В третьем наборе тестовых данных примера вы можете сдвинуть отрезок \([5; 5]\) влево, затем отрезок \([4; 4]\) опять влево. После всех ходов книги будут образовывать непрерывный отрезок \([1; 3]\). Таким образом, ответ равен \(2\).

В четвертом наборе тестовых данных примера вы можете сдвинуть отрезок \([1; 1]\) вправо, отрезок \([2; 2]\) вправо, отрезок \([6; 6]\) влево и, наконец, отрезок \([5; 5]\) влево. После всех ходов книги будут образовывать непрерывный отрезок \([3; 4]\). Таким образом, ответ равен \(4\).

В пятом наборе тестовых данных примера вы можете сдвинуть отрезок \([1; 2]\) вправо. После всех ходов книги будут образовывать непрерывный отрезок \([2; 5]\). Таким образом, ответ равен \(1\).

E. Сделай возрастающим

Бинарный поиск дп Конструктив реализация Структуры данных *2200

Задан массив из \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) и набор \(b\) из \(k\) различных целых чисел от \(1\) до \(n\).

За одну операцию вы можете выбрать два целых числа \(i\) и \(x\) (\(1 \le i \le n\), \(x\) может быть любым целым числом) и присвоить \(a_i := x\). Эта операция может быть выполнена только в том случае, если \(i\) не принадлежит множеству \(b\).

Найдите минимальное количество операций, которые необходимо выполнить, чтобы массив \(a\) строго возрастал (то есть \(a_1 < a_2 < a_3 < \dots < a_n\)), или сообщите, что это невозможно.

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 5 \cdot 10^5\), \(0 \le k \le n\)) — размер массива \(a\) и множества \(b\) соответственно.

Вторая строка содержит \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(1 \le a_i \le 10^9\)).

Затем, если \(k \ne 0\), следует третья строка, содержащая \(k\) целых чисел \(b_1\), \(b_2\), ..., \(b_k\) (\(1 \le b_1 < b_2 < \dots < b_k \le n\)). Если \(k = 0\), то эта строка отсутствует.

Выходные данные

Если невозможно сделать массив \(a\) строго возрастающим с помощью заданных операций, выведите \(-1\).

В противном случае выведите одно целое число — минимальное количество операций, которые необходимо выполнить.

A. Специфичные вкусы Андре

Конструктив реализация *800

У Андре очень специфические вкусы. Недавно он начал влюбляться в массивы.

Андре называет непустой массив \(b\) хорошим, если сумма его элементов делится на длину этого массива. Например, массив \([2, 3, 1]\) хороший, так как сумма его элементов —- \(6\) — делится на \(3\), но массив \([1, 1, 2, 3]\) не хороший, так как \(7\) не делится на \(4\).

Андре вызывает массив \(a\) длиной \(n\) прекрасным, если выполняются следующие условия:

  • Каждый непустой подмассив этого массива является хорошим.
  • Для каждого \(i\) (\(1 \le i \le n\)), \(1 \leq a_i \leq 100\).

Для данного положительное целого числа \(n\) выведите любой прекрасный массив длины \(n\). Можно показать, что при заданных ограничениях такой массив всегда существует.

Массив \(c\) является подмассивом массива \(d\), если \(c\) может быть получен из \(d\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 100\)). Описание наборов входных данных приведено ниже.

Первая и единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)).

Выходные данные

Для каждого набора входных данных выводите в отдельной строке любой прекрасный массив длиной \(n\).

Примечание

Массив \([19, 33]\) прекрасный, так как все \(3\) его подмассивы — \([19]\), \([33]\), \([19, 33]\) — имеют суммы, кратные их длине, и, следовательно, хорошие.

A1. Бинарная таблица (простая версия)

Конструктив реализация *1500

Это простая версия задачи. Различие между версиями заключается ограничениях на количество операций. Вы можете делать взломы, если обе версии задачи сданы.

Вам дана бинарная таблица размера \(n \times m\). Эта таблица состоит из символов \(0\) и \(1\).

Вы можете делать следующую операцию: выбрать \(3\) различные клетки, которые принадлежат одному квадрату \(2 \times 2\), и изменить символы в этих клетках (поменять \(0\) на \(1\) и \(1\) на \(0\)).

Ваша задача сделать все символы таблицы равными \(0\) за не больше чем \(3nm\) операций. Вам не нужно минимизировать количество операций.

Можно доказать, что это всегда возможно.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 5000\)) — количество наборов входных данных. В следующих строках находится описание наборов входных данных.

В первой строке описания каждого набора входных данных находится два целых числа \(n\), \(m\) (\(2 \leq n, m \leq 100\)).

Каждая из следующих \(n\) строк содержит бинарную строку длины \(m\), равную очередной строке таблицы.

Гарантируется, что сумма \(nm\) по всем наборам входных данных не превосходит \(20000\).

Выходные данные

Для каждого набора входных данных выведите целое число \(k\) (\(0 \leq k \leq 3nm\)) — количество операций.

В каждой из следующих \(k\) строк выведите \(6\) целых чисел \(x_1, y_1, x_2, y_2, x_3, y_3\) (\(1 \leq x_1, x_2, x_3 \leq n, 1 \leq y_1, y_2, y_3 \leq m\)), описывающих следующую операцию. Эта операция будет сделана с тремя клетками \((x_1, y_1)\), \((x_2, y_2)\), \((x_3, y_3)\). Все три клетки должны быть различны. Эти три клетки должны лежать в каком-то квадрате \(2 \times 2\).

Примечание

В первом наборе входных данных можно сделать одну операцию с клетками \((1, 1)\), \((2, 1)\), \((2, 2)\). После этого, все символы будут равны \(0\).

Во втором наборе входных данных:

  • операция с клетками \((2, 1)\), \((3, 1)\), \((3, 2)\). После этой операции таблица будет:

    011
    001
    000
  • операция с клетками \((1, 2)\), \((1, 3)\), \((2, 3)\). После этой операции таблица будет:

    000
    000
    000

В пятом наборе входных данных:

  • операция с клетками \((1, 3)\), \((2, 2)\), \((2, 3)\). После этой операции таблица будет:

    010
    110
  • операция с клетками \((1, 2)\), \((2, 1)\), \((2, 2)\). После этой операции таблица будет:

    000
    000

A2. Бинарная таблица (сложная версия)

графы жадные алгоритмы Конструктив реализация *1900

Это сложная версия задачи. Различие между версиями заключается ограничениях на количество операций. Вы можете делать взломы, если обе версии задачи сданы.

Вам дана бинарная таблица размера \(n \times m\). Эта таблица состоит из символов \(0\) и \(1\).

Вы можете делать следующую операцию: выбрать \(3\) различные клетки, которые принадлежат одному квадрату \(2 \times 2\), и изменить символы в этих клетках (поменять \(0\) на \(1\) и \(1\) на \(0\)).

Ваша задача сделать все символы таблицы равными \(0\) за не больше чем \(nm\) операций. Вам не нужно минимизировать количество операций.

Можно доказать, что это всегда возможно.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 5000\)) — количество наборов входных данных. В следующих строках находится описание наборов входных данных.

В первой строке описания каждого набора входных данных находится два целых числа \(n\), \(m\) (\(2 \leq n, m \leq 100\)).

Каждая из следующих \(n\) строк содержит бинарную строку длины \(m\), равную очередной строке таблицы.

Гарантируется, что сумма \(nm\) по всем наборам входных данных не превосходит \(20000\).

Выходные данные

Для каждого набора входных данных выведите целое число \(k\) (\(0 \leq k \leq nm\)) — количество операций.

В каждой из следующих \(k\) строк выведите \(6\) целых чисел \(x_1, y_1, x_2, y_2, x_3, y_3\) (\(1 \leq x_1, x_2, x_3 \leq n, 1 \leq y_1, y_2, y_3 \leq m\)), описывающих следующую операцию. Эта операция будет сделана с тремя клетками \((x_1, y_1)\), \((x_2, y_2)\), \((x_3, y_3)\). Все три клетки должны быть различны. Эти три клетки должны лежать в каком-то квадрате \(2 \times 2\).

Примечание

В первом наборе входных данных можно сделать одну операцию с клетками \((1, 1)\), \((2, 1)\), \((2, 2)\). После этого, все символы будут равны \(0\).

Во втором наборе входных данных:

  • операция с клетками \((2, 1)\), \((3, 1)\), \((3, 2)\). После этой операции таблица будет:

    011
    001
    000
  • операция с клетками \((1, 2)\), \((1, 3)\), \((2, 3)\). После этой операции таблица будет:

    000
    000
    000

В пятом наборе входных данных:

  • операция с клетками \((1, 3)\), \((2, 2)\), \((2, 3)\). После этой операции таблица будет:

    010
    110
  • операция с клетками \((1, 2)\), \((2, 1)\), \((2, 2)\). После этой операции таблица будет:

    000
    000

C. Жадный шоппинг

Бинарный поиск жадные алгоритмы разделяй и властвуй реализация Структуры данных *2600

Вам дан массив \(a_1, a_2, \ldots, a_n\) из целых чисел. Этот массив невозрастающий.

Рассмотрим \(n\) магазинов, расположенных в ряд. Магазины пронумерованы целыми числами от \(1\) до \(n\) слева направо. Цена еды в \(i\)-м магазине равна \(a_i\) монет.

Вы должны обработать \(q\) запросов двух видов:

  • 1 x y: для всех магазинов \(1 \leq i \leq x\) присвоить \(a_{i} = max(a_{i}, y)\).
  • 2 x y: рассмотрим голодного мужчину с \(y\) монетами. Он посещает все магазины с \(x\)-го магазина по \(n\)-й, и если он может купить еду в текущем магазине, он покупает одну порцию этой еды. Найдите, какое количество порций еды он купит. Мужчина может покупать еду в магазине \(i\), если у него есть хотя бы \(a_i\) монет. После покупки количество его монет уменьшается на \(a_i\).
Входные данные

В первой строке находится два целых числа \(n\), \(q\) (\(1 \leq n, q \leq 2 \cdot 10^5\)).

Во второй строке находится \(n\) целых чисел \(a_{1},a_{2}, \ldots, a_{n}\) \((1 \leq a_{i} \leq 10^9)\) — цены в магазинах. Гарантируется, что \(a_1 \geq a_2 \geq \ldots \geq a_n\).

Каждая из следующих \(q\) строк содержит три целых числа \(t\), \(x\), \(y\) (\(1 \leq t \leq 2\), \(1\leq x \leq n\), \(1 \leq y \leq 10^9\)), описывающие очередной запрос.

Гарантируется, что существует хотя бы один запрос типа \(2\).

Выходные данные

Для каждого запроса типа \(2\) выведите ответ в новой строке.

Примечание

В первом запросе голодный мужчина купит еду во всех магазинах с \(3\)-го по \(10\)-й.

Во втором запросе голодный мужчина купит еду в магазинах \(4\), \(9\) и \(10\).

После третьего запроса массив \(a_1, a_2, \ldots, a_n\) цен не поменяется и останется \(\{10, 10, 10, 6, 6, 5, 5, 5, 3, 1\}\).

В четвертом запросе голодный мужчина купит еду в магазинах \(2\), \(3\), \(4\), \(5\), \(9\) и \(10\).

После пятого запроса массив \(a\) цен станет \(\{10, 10, 10, 7, 6, 5, 5, 5, 3, 1\}\).

В шестом запросе голодный мужчина купит еду в магазинах \(2\) и \(4\).

A. Приезд генерала

реализация *800

В Самую Секретную Военную Часть под командованием полковника Покрышкина приехал с проверкой генерал из Министерства Обороны. По этому случаю полковник приказал всем n солдатам из своей Части построиться на плацу.

Согласно военному уставу, солдаты должны стоять в порядке невозрастания их роста, но так как времени на построение совсем не осталось, то солдаты выстроились в произвольном порядке. Однако у генерала весьма плохое зрение, и поэтому он считает, что солдаты построены правильно, если самый первый в строю — солдат с максимальным ростом, а самый последний — солдат с минимальным ростом. Обратите внимание, что неважно то, как расположены остальные солдаты, в том числе и в случае нескольких максимальных или минимальных по росту солдат. Важны лишь росты первого и последнего солдата.

Например, генерал считает последовательность ростов (4, 3, 4, 2, 1, 1) правильной, а последовательность (4, 3, 1, 2, 2) — нет.

За одну секунду полковник может обменять местами любых двух соседних солдат. Помогите ему подсчитать, какое минимальное количество секунд понадобится, чтобы получившийся строй понравился генералу.

Входные данные

Первая строка входных данных содержит единственное целое число n (2 ≤ n ≤ 100) — количество солдат в строю. Вторая строка содержит целые числа a1, a2, ..., an (1 ≤ ai ≤ 100) — величины ростов солдат в порядке от начала строя к концу. Числа разделены пробелом. Числа a1, a2, ..., an не обязательно различны.

Выходные данные

Выведите единственное целое число — какое минимальное количество секунд понадобится полковнику, чтобы получившийся строй понравился генералу.

Примечание

В первом примере полковнику нужно поменять местами первого и второго солдата, а затем третьего и четвертого — это займет 2 секунды. Итоговое положение солдат: (44, 33, 22, 11).

Во втором примере полковник может производить обмены в следующей последовательности:

  1. (10, 10, 58, 31, 63, 40, 76)
  2. (10, 58, 10, 31, 63, 40, 76)
  3. (10, 58, 10, 31, 63, 76, 40)
  4. (10, 58, 10, 31, 76, 63, 40)
  5. (10, 58, 31, 10, 76, 63, 40)
  6. (10, 58, 31, 76, 10, 63, 40)
  7. (10, 58, 31, 76, 63, 10, 40)
  8. (10, 58, 76, 31, 63, 10, 40)
  9. (10, 76, 58, 31, 63, 10, 40)
  10. (76, 10, 58, 31, 63, 10, 40)
  11. (76, 10, 58, 31, 63, 40, 10)

B. Совещание

реализация *1300

Самое Секретное Совещание Самой Секретной Военной Части проходит в Самом Секретном Месте — на бесконечной плоскости, в которой введена декартова система координат. Стол для переговоров представляет собой прямоугольник со сторонами параллельными осям координат и с вершинами в целочисленных точках плоскости. В каждой целочисленной точке, которая принадлежит периметру стола, находится кресло, где сидит один из генералов.

Чтобы генералам было не холодно в зимнее время, в некоторых точках на плоскости стоят тепловые батареи. Каждая батарея характеризуется числом ri — радиусом действия. То есть если некоторый генерал находится на расстоянии, меньшем или равном ri от этой батареи — то ему комфортно и тепло. В этой задаче под расстоянием следует понимать Евклидово расстояние: расстояние от точки (x1, y1) до точки (x2, y2) равно

Каждый генерал, который находится вне зон действия всех батарей, может заболеть, и поэтому вы должны принести ему теплый плед. Ваша задача — подсчитать, сколько теплых пледов вам нужно принести в Самое Секретное Место.

Генералам, которым уже комфортно, не требуется плед. Также генералы никогда не перегреваются, даже если они находятся в зоне действия нескольких батарей. Батареи могут быть расположены в любых целочисленных точках плоскости: даже внутри прямоугольника (под столом) и на периметре (непосредственно под одним из генералов), — и даже в этих случаях их радиус действия не меняется.

Входные данные

В первой строке даны координаты двух противоположных углов стола xa, ya, xb, yb (xa ≠ xb, ya ≠ yb). Во второй строке дано число n — количество батарей (1 ≤ n ≤ 103), и далее в n строках даны координаты батарей в формате «xi yi ri», числа разделены пробелом. Все числа во входных данных — целые. Все координаты по модулю не превосходят 1000, 1 ≤ ri ≤ 1000. В одной точке могут находиться несколько батарей.

Выходные данные

Выведите единственное число — сколько вам нужно принести пледов.

Примечание

В первом примере генералы сидят в точках: (2, 2), (2, 3), (2, 4), (2, 5), (3, 2), (3, 5), (4, 2), (4, 3), (4, 4), (4, 5). Из них вне зон действия батарей расположены лишь 4, это генералы в точках: (2, 5), (3, 5), (4, 4), (4, 5).

Во втором примере генералы сидят в точках: (5, 2), (5, 3), (6, 2), (6, 3). Каждый из них находится в зоне действия хотя бы одной батареи, и пледы не нужны вообще.

C. Поиск анаграмм

реализация Строки *1500

Строка t называется анаграммой строки s, если в строке t можно переставить буквы местами так, чтобы получилась строка s. Например, строка «aab» является анаграммой строки «aba», а строка «aaa» — нет.

Строка t называется подстрокой строки s, если ее можно прочитать начиная с некоторой позиции в строке s. Например, у строки «aba» есть шесть подстрок: «a», «b», «a», «ab», «ba», «aba».

Дана строка s, состоящая из строчных латинских букв и символов «?», и строка p, состоящая только из строчных латинских букв. Назовем строку хорошей, если из нее можно получить анаграмму строки p заменой символов «?» на символы латинского алфавита (каждый символ «?» заменяется на ровно один символ латинского алфавита). Например, если строка p = «aba», то строка «a??» хорошая, а строка «?bc» нет.

Ваша задача найти количество хороших подстрок строки s (одинаковые подстроки нужно учесть в ответе несколько раз).

Входные данные

В первой строке задана непустая строка s, состоящая из не более чем 105 строчных латинских букв и символов «?». Во второй строке задана непустая строка p, состоящая из не более чем 105 строчных латинских букв. Обратите внимание, что длина строки p может быть больше длины строки s.

Выходные данные

Выведите единственное число — количество хороших подстрок строки s.

Две подстроки считаются различными, если их позиции вхождения различны. Значит, если какая-то строка встречается несколько раз, то она должна быть учтена такое же количество раз.

Примечание

Рассмотрим первый тест из условия. Здесь у строки s две хорошие подстроки: «b??» (после замены вопросов получится «baa»), «???» (после замены вопросов получится «baa»).

Рассмотрим второй тест из условия. Здесь у строки s две хорошие подстроки: «ab?» (можно заменить «?» на «c»), «b?c» (можно заменить «?» на «a»).

A. Купи строку

математика реализация *800

Вам даны четыре целых числа \(n\), \(c_0\), \(c_1\) и \(h\) и бинарная строка \(s\) длины \(n\).

Бинарная строка — это строка, состоящая из символов \(0\) и \(1\).

Вы можете поменять любой символ строки \(s\) (но строка должна остаться бинарной после изменения). Вы должны заплатить \(h\) монет за каждое такое изменение.

Вы хотите купить строку после нескольких изменений (возможно, нуля). Чтобы купить строку, вы должны купить все ее символы. Чтобы купить символ \(0\), вы должны заплатить \(c_0\) монет, чтобы купить символ \(1\), вы должны заплатить \(c_1\) монет.

Найдите минимальное количество монет, которое нужно, чтобы купить строку.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 10\)) — количество наборов входных данных. Следующие \(2t\) строк содержат описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит четыре целых числа \(n\), \(c_{0}\), \(c_{1}\), \(h\) (\(1 \leq n, c_{0}, c_{1}, h \leq 1000\)).

Вторая строка описания каждого набора входных данных содержит бинарную строку \(s\) длины \(n\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — минимальное количество монет, нужное, чтобы купить строку.

Примечание

В первом наборе входных данных вы можете купить все символы и заплатить \(3\) монеты, потому что каждый из символов \(0\) и \(1\) стоит \(1\) монету.

Во втором наборе входных данных вы можете сначала поменять \(2\)-й и \(4\)-й символы строки с \(1\) на \(0\) и заплатить \(2\) монеты за это. Ваша строка станет равной \(00000\). После этого вы можете купить строку и заплатить \(5 \cdot 10 = 50\) монет за это. Общее число потраченных монет будет \(2 + 50 = 52\).

A. Счастливое преобразование

жадные алгоритмы реализация *1200

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

У Пети есть две строки a и b одинаковой длины n, состоящие только из счастливых цифр. Он может делать операции двух типов:

  • поменять одну любую цифру строки a на противоположную (то есть 4 на 7, а 7 на 4);
  • поменять местами любую пару цифр строки a.

Петю интересует минимальное количество операций, необходимое для того, чтобы строка a стала равна строке b. Помогите ему с этой задачей.

Входные данные

В первой и второй строках заданы строки a и b, соответственно. Строки a и b равны по длине и содержат только счастливые цифры. Строки не пусты, их длина не превышает 105.

Выходные данные

В единственной строке выведите одно число — минимальное количество операций, необходимых для преобразования строки a в строку b.

Примечание

В первом примере достаточно просто поменять первую и вторую цифры.

Во втором примере нужно поменять вторую цифру на противоположную.

В третьем примере нужно все три цифры поменять на противоположные.

D. Счастливая пара

Комбинаторика реализация Структуры данных *2900

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

У Пети есть массив a из n целых чисел. Числа в массиве нумеруются начиная с 1. К сожалению, в последнее время Петя плохо писал контесты, поэтому родители не разрешают ему играть с массивами, в которых много счастливых чисел. Гарантируется, что в массиве a не более 1000 элементов являются счастливыми.

Пете нужно найти количество пар непересекающихся отрезков [l1;r1] и [l2;r2] (1 ≤ l1 ≤ r1 < l2 ≤ r2 ≤ n, все четыре числа — целые) таких, что нет такого счастливого числа, которое встречается одновременно и в подмассиве a[l1..r1], и в подмассиве a[l2..r2]. Помогите Пете посчитать количество таких пар.

Входные данные

В первой строке задано целое число n (2 ≤ n ≤ 105) — размер массива a. Во второй строке задано через пробел n целых чисел ai (1 ≤ ai ≤ 109) — массив a. Гарантируется, что в массиве a не более 1000 элементов являются счастливыми.

Выходные данные

В единственной строке выведите одно число — ответ на задачу.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

Подмассив a[l..r] — массив из элементов al, al + 1, ..., ar.

В первом примере есть 9 возможных пар, которые удовлетворяют условие: [1, 1] и [2, 2], [1, 1] и [2, 3], [1, 1] и [2, 4], [1, 1] и [3, 3], [1, 1] и [3, 4], [1, 1] и [4, 4], [1, 2] и [3, 3], [2, 2] и [3, 3], [3, 3] и [4, 4].

Во втором примере есть только одна возможная пара отрезков — [1;1] и [2;2] и она удовлетворяет условие.

D. Сжатие рейтинга

Бинарный поиск жадные алгоритмы реализация Структуры данных *1800

На платформе CodeCook для соревнований по спортивному программированию у каждого человека есть график его рейтинга, описываемый массивом целых чисел \(a\) длины \(n\). Вы обновляете инфраструктуру, поэтому вы создали программу, сжимающую эти графики.

Программа работает следующим образом. Задается целое число \(k\). Программа берет минимум на каждом последовательном подмассиве длины \(k\) в массиве \(a\).

Более формально, для массива \(a\) длины \(n\) и целого числа \(k\), определим \(k\)-сжатие массива \(a\) как массив \(b\) длины \(n-k+1\), такой что \(\)b_j =\min_{j\le i\le j+k-1}a_i\(\)

Например, \(3\)-сжатие массива \([1, 3, 4, 5, 2]\) это \([\min\{1, 3, 4\}, \min\{3, 4, 5\}, \min\{4, 5, 2\}]=[1, 3, 2].\)

Перестановка длины \(m\) это массив, состоящий из \(m\) различных целых чисел от \(1\) до \(m\) в некотором порядке. Например, \([2,3,1,5,4]\) это перестановка, но \([1,2,2]\) это не перестановка (\(2\) встречается дважды в массиве) и \([1,3,4]\) это тоже не перестановка (\(m=3\), но в массиве есть число \(4\)).

\(k\)-сжатие массива рейтинга сделает пользователей CodeCook счастливыми, если оно будет перестановкой. Вам дан массив \(a\), определите для всех \(1\leq k\leq n\) будут ли счастливы пользователи CodeCook после \(k\)-сжатия этого массива или нет.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1\leq t\leq 10^4\)) — количество наборов входных данных.

В первой строке описания каждого набора входных данных находится единственное целое число \(n\) (\(1\leq n\leq 3\cdot 10^5\)) — длина массива.

Во второй строке описания каждого набора входных данных находится \(n\) целых чисел \(a_1,\ldots,a_n\) (\(1\leq a_i\leq n\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите бинарную строку длины \(n\).

\(k\)-й символ строки должен быть \(1\), если пользователи CodeCook будут счастливы после \(k\)-сжатия массива \(a\) и \(0\), иначе.

Примечание

В первом наборе входных данных \(a=[1, 5, 3, 4, 2]\).

  • \(1\)-сжатие массива \(a\) будет \([1, 5, 3, 4, 2]\) и это перестановка.
  • \(2\)-сжатие массива \(a\) будет \([1, 3, 3, 2]\) и это не перестановка, потому что \(3\) встречается дважды.
  • \(3\)-сжатие массива \(a\) будет \([1, 3, 2]\) и это перестановка.
  • \(4\)-сжатие массива \(a\) будет \([1, 2]\) и это перестановка.
  • \(5\)-сжатие массива \(a\) будет \([1]\) и это перестановка.

H2. Соединение нитями (сложная версия)

Комбинаторика математика реализация *3300

Единственное различие между двумя версиями задачи состоит в том, что в простой версии задачи нет обновлений.

Есть \(n\) катушек, расположенных вокруг круглого стола. Катушки бывают двух цветов: черного и белого.

Любые две катушки одного цвета можно соединить нитью-отрезком того же цвета. Определим соответствие как способ соединить катушки так, что каждая катушка будет соединена ровно с одной другой катушкой.

Раскраска это выбор цветов (белого или черного) для каждой катушки. Раскраска называется возможной, если для нее существует хотя бы одно соответствие. Это равносильно тому, что количества черных и белых катушек четные.

Для соответствия можно посчитать количество раз, которое какая-то белая нить пересекает какую-то черную нить. Мы считаем не количество точек пересечения, а количество пар нитей разных цветов, которые пересекаются, поэтому одна точка пересечения может быть посчитана несколько раз, если несколько пар нитей пересекаются в одной и той же точке. Если \(c\) это возможная раскраска, обозначим за \(f(c)\) минимальное количество пересечений по всем возможным корректным соответствиям для этой раскраски.

Картинка изображает раскраску bwbbbwww. Для нарисованного соответствия есть одно пересечение между нитями разного цвета. Можно показать, что это минимальное возможное количество по всем корректным соответствиям для этой раскраски, поэтому \(f(\text{bwbbbwww}) = 1\).

Вам дана строка \(s\) описывающая незавершенную раскраску с черными, белыми и непокрашенными катушками. Раскраска \(c\) называется \(s\)-достижимой, если ее можно получить, раскрасив все непокрашенные катушки в \(s\), не меняя цвета остальных.

Раскраска \(c\) выбирается случайно равновероятно по всем возможным \(s\)-достижимым раскраскам. Найдите математическое ожидание \(f(c)\). Вы должны найти его по модулю \(998244353\).

Также будет производиться \(m\) изменений одного символа в \(s\). После каждого изменения вы должны посчитать математическое ожидание \(f(c)\) снова.

Можно показать, что каждый ответ может быть записан в виде \(\frac{p}{q}\), где \(p\) и \(q\) некоторые взаимно простые целые числа и \(q\not\equiv 0\pmod{998244353}\). Тогда ответ по модулю \(998244353\) будет равен \((p\cdot q^{-1})\) modulo \(998244353\).

Входные данные

В первой строке находится два целых числа \(n\), \(m\) (\(2\le n\le 2\cdot 10^5\), \(n\) четное, \(0\le m\le 2\cdot 10^5\)) — количество катушек и изменений, соответственно.

Во второй строке находится строка \(s\) длины \(n\) — незавершенная раскраска катушек. \(i\)-й символ будет 'w', 'b' или '?', и будет описывать цвет \(i\)-й катушки как белый, черный и непокрашенный, соответственно.

Каждая из следующих \(m\) строк содержит целое число \(i\) (\(1 \leq i \leq n\)) — позицию символа в \(s\), который будет изменен и символ \(c\) (\(c \in \{\text{w}, \text{b}, \text{?}\}\)) — новый цвет катушки \(i\) после изменения.

Гарантируется, что существует хотя бы одна непокрашенная катушка изначально и после каждого изменения.

Выходные данные

Выведите \(m+1\) строку: математическое ожидание \(f(c)\) изначально и после каждого изменения. Все значения должны быть найдены по модулю \(998244353\).

Примечание

Первый тест почти соответствует картинке. Нельзя покрасить '?' в 'w', потому что тогда получится не возможная раскраска, потому что количество черных катушек будет нечетным. Тогда единственная достижимая возможная раскраска это 'bwbbbwww'. Поскольку \(f(\text{bwbbbwww}) = 1\) математическое ожидание равно \(1\).

Во втором тесте строка после каждого изменения будет:

  1. ????w?wb??
  2. ??????wb??
  3. ?w????wb??

В третьем тесте строка после каждого изменения будет:

  1. ww?b
  2. wb?b
  3. wb?b

B. Неподстрочные подпоследовательности

дп жадные алгоритмы реализация Строки *900

У Hr0d1y есть \(q\) запросов на бинарной строке \(s\) длины \(n\). Бинарная строка это строка, содержащая только символы «0» и «1».

Запрос задается парой целых чисел \(l_i\), \(r_i\) \((1 \leq l_i \lt r_i \leq n)\).

Для каждого запроса ему необходимо определить, есть ли хорошая подпоследовательность в строке \(s\), которая равна подстроке \(s[l_i\ldots r_i]\).

  • Подстрока \(s[i\ldots j]\) строки \(s\) — это строка из символов \(s_i s_{i+1} \ldots s_j\).
  • Строка \(a\) называются подпоследовательностью строки \(b\), если \(a\) может быть получена из \(b\) удалением некоторых символов, не меняя порядка оставшихся.
  • Подпоследовательность называется хорошей, если она не последовательная и имеет длину \(\ge 2\). Например, если \(s\) равна «1100110», то подпоследовательности \(s_1s_2s_4\)1100110») и \(s_1s_5s_7\)1100110») являются хорошими, а \(s_1s_2s_3\)1100110») не является.

Можете ли вы помочь Hr0d1y ответить на каждый запрос?

Входные данные

В первой строке записано одно целое число \(t\) (\(1\leq t \leq 100\)) — количество наборов входных данных.

Далее идут описания наборов входных данных.

В первой строке записаны два целых числа \(n\) (\(2 \leq n \leq 100\)) и \(q\) (\(1\leq q \leq 100\)) — длина строки и число запросов.

Во второй строке записана строка \(s\).

В \(i\)-й из следующих \(q\) строк записаны два целых числа \(l_i\) и \(r_i\) (\(1 \leq l_i \lt r_i \leq n\)).

Выходные данные

Для каждого набора входных данных выведите \(q\) строк. В \(i\)-й строке ответа на каждый набор входных данных должно быть записано «YES», если есть хорошая подпоследовательность, равная подстроке \(s[l_i...r_i]\), и «NO» иначе.

Вы можете выводить каждый символ в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных:

  • \(s[2\ldots 4] = \) «010». В этом случае \(s_1s_3s_5\)001000») и \(s_2s_3s_6\)001000») являются подходящими хорошими подпоследовательностями, а \(s_2s_3s_4\)001000») — нет.
  • \(s[1\ldots 3] = \) «001». Нет подходящей хорошей подпоследовательности.
  • \(s[3\ldots 5] = \) «100». В этом случае \(s_3s_5s_6\)001000») — это подходящая хорошая подпоследовательность.

C. Равенство строк

дп жадные алгоритмы реализация Строки хэши *1400

У Ashish есть две строки \(a\) и \(b\) длины \(n\) и целое число \(k\). Строки содержат только строчные буквы латинского алфавита.

Он хочет превратить строку \(a\) в строку \(b\), исполнив несколько (возможно, ноль) операций над \(a\).

За одну операцию он может сделать одно из двух возможных действий:

  • выбрать индекс \(i\) (\(1 \leq i\leq n-1\)) и поменять местами \(a_i\) и \(a_{i+1}\), или
  • выбрать индекс \(i\) (\(1 \leq i \leq n-k+1\)) и, если все символы среди \(a_i, a_{i+1}, \ldots, a_{i+k-1}\) равны какому-то символу \(c\) (\(c \neq\) «z»), заменить каждый из них на символ \((c+1)\), таким образом, «a» заменяется на «b», «b» заменяется на «c» и так далее.

Обратите внимание, что он может исполнить любое число операций, и операции можно выполнять только на строке \(a\).

Помогите Ashish определить, возможно ли превратить \(a\) в \(b\), сделав несколько (возможно, ноль) операций на ней.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) (\(2 \leq n \leq 10^6\)) и \(k\) (\(1 \leq k \leq n\)).

Во второй строке записана одна строка \(a\) длины \(n\), состоящая только из строчных букв латинского алфавита.

В третьей строке записана одна строка \(b\) длины \(n\), состоящая только из строчных букв латинского алфавита.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите «Yes», если Ashish может превратить \(a\) в \(b\) после некоторого числа операций, иначе выведите «No».

Вы можете выводить каждый символ в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных можно доказать, что невозможно превратить \(a\) в \(b\).

Во втором наборе входных данных

«abba» \(\xrightarrow{\text{inc}}\) «acca» \(\xrightarrow{\text{inc}}\) \(\ldots\) \(\xrightarrow{\text{inc}}\) «azza».

Здесь «swap» обозначает операцию первого типа, а «inc» обозначает операцию второго типа.

В третьем наборе входных данных

«aaabba» \(\xrightarrow{\text{swap}}\) «aaabab» \(\xrightarrow{\text{swap}}\) «aaaabb» \(\xrightarrow{\text{inc}}\) \(\ldots\) \(\xrightarrow{\text{inc}}\) «ddaabb» \(\xrightarrow{\text{inc}}\) \(\ldots\) \(\xrightarrow{\text{inc}}\) «ddddbb» \(\xrightarrow{\text{inc}}\) \(\ldots\) \(\xrightarrow{\text{inc}}\) «ddddcc».

A. Отменить поезда

реализация *800

Gildong живет в городе, в котором система поездов устроена как \(100\) поездов, которые путешествуют от нижнего края до верхнего края и \(100\) поездов, которые путешествуют от левого края до правого края. Поезда на каждой стороне пронумерованы от \(1\) до \(100\) соответственно, и все поезда движутся с одинаковой скоростью. Рассмотрим следующую картинку.

Система поездов может быть описана как координаты на 2D плоскости. \(i\)-й поезд, стартующий на нижнем краю, имеет координаты \((i,0)\) и будет находится в координатах \((i,T)\) спустя \(T\) минут, а \(i\)-й поезд, стартующий на левом краю, имеет координаты \((0,i)\) и будет находится в координатах \((T,i)\) спустя \(T\) минут. Все поезда приезжают на место назначения спустя \(101\) минуту.

Gildong обнаружил, что некоторые поезда очень опасно отправлять одновременно. В данный момент \(n\) поездов запланировано отправить с нижнего края, и \(m\) поездов запланировано отправить с левого края. Если два поезда одновременно находятся в одной и той же точке \((x,y)\) для некоторых \(x\) и \(y\), они врежутся друг в друга. Он попросил вас найти минимальное число поездов, отправку которых нужно отменить, чтобы предотвратить все столкновения.

Входные данные

Каждый тест содержит один или несколько наборов входных данных. В первой строке записано количество наборов входных данных \(t\) (\(1 \le t \le 100\)).

Каждый набор входных данных содержит три строки. В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 100\)) — количество поездов, у которых запланирована отправка с нижнего края, и количество поездов, у которых запланирована отправка с левого края, соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел. Каждое целое число — это номер поезда, у которого запланирована отправка с нижнего края. Числа даны в строго возрастающем порядке и находятся в промежутке от \(1\) до \(100\) включительно.

Третья строка каждого набора входных данных содержит \(m\) целых чисел. Каждое целое число — это номер поезда, у которого запланирована отправка с левого края. Числа даны в строго возрастающем порядке и находятся в промежутке от \(1\) до \(100\) включительно.

Выходные данные

Для каждого набора входных данных выведите одно целое число: минимальное количество поездов, отправку которых нужно отменить, чтобы предотвратить все столкновения.

Примечание

В первом наборе входных данных можно показать, что текущее расписание не повлечет никаких столкновений. Таким образом, ответ равен нулю.

Во втором наборе входных данных в момент времени \(T=4\) произойдет столкновение, как можно увидеть на картинке ниже. Можно показать, что если отменить отправление одного из этих поездов, то столкновений не произойдет. Таким образом, ответ равен одному.

B. Суффиксные операции

Конструктив реализация *1400

У Gildong есть интересная машина, которая оперирует над массивом \(a\) из \(n\) целых чисел. Машина умеет выполнять операции двух типов:

  1. Увеличить все элементы на суффиксе массива на \(1\).
  2. Уменьшить все элементы на суффиксе массива на \(1\).

Суффикс это подотрезок (последовательных элементов) массива, содержащий \(a_n\). Иначе говоря, для всех \(i\), что \(a_i\) включен в отрезок, все \(a_j\), что \(i \lt j \le n\) тоже должны быть включены в отрезок.

Gildong хочет сделать все элементы в \(a\) равными — он всегда будет это делать минимальным возможным числом операций. Чтобы облегчить ему жизнь, перед тем, как Gildong начнет использовать машину, у вас есть возможность заменить любой один элемент массива на любое целое число. Вам разрешается оставить массив нетронутым. Вы хотите минимизировать число операций, которое совершит Gildong. С вашей помощью, какое минимальное число операций совершит Gildong?

Обратите внимание, что даже если вы измените одно число в массиве, вы не должны считать это как одну из операций, потому что Gildong ее не совершал.

Входные данные

Каждый тест состоит из одного или нескольких наборов входных данных. В первой строке записано количество наборов входных данных \(t\) (\(1 \le t \le 1000\)).

Каждый набор входных данных состоит из двух строк. В первой строке каждого набора входных записано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество элементов в массиве \(a\).

Во второй строке каждого набора входных данных записаны \(n\) целых чисел. \(i\)-е из них это \(a_i\) (\(-5 \cdot 10^8 \le a_i \le 5 \cdot 10^8\)).

Гарантируется, что сумма \(n\) по всем наборах входных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которое должен совершить Gildong, чтобы сделать все элементы массива равными.

Примечание

В первом наборе входных данных все элементы массива уже одинаковы. Таким образом, вам не требуется совершать никаких операций, и Gildong совершит ноль операций.

Во втором наборе входных данных мы можем сделать \(a_3\) равным \(0\), и массив превратится в \([-1,0,0]\). После этого Gildong может совершить \(2\)-ю операцию один раз на суффиксе, начинающимся с \(a_2\), что уменьшит \(a_2\) и \(a_3\) на \(1\), превратив все элементы массива в \(-1\).

В третьем наборе входных данных можно сделать \(a_1\) равным \(96\), так что массив превратится в \([96,96,97,95]\). После этого Gildong должен:

  • Использовать \(2\)-ю операцию на суффиксе, который начинается с \(a_3\), один раз, превратив массив в \([96,96,96,94]\).
  • Использовать \(1\)-ю операцию на суффиксе, который начинается с \(a_4\), \(2\) раза, превратив массив в \([96,96,96,96]\).

В четвертом примере можно заменить массив на \([-3,-3,-2,1]\). Затем Gildong должен:

  • Использовать \(2\)-ю операцию на суффиксе, который начинается с \(a_4\), \(3\) раза, превратив массив в \([-3,-3,-2,-2]\).
  • Испоьзовать \(2\)-ю операцию на суффиксе, который начинается с \(a_3\), один раз, превратив массив в \([-3,-3,-3,-3]\).

C. Треугольники

жадные алгоритмы реализация *1700

У Gildong есть квадратная доска из \(n\) строк и \(n\) столбцов квадратных клеток, каждая клетка содержит одну цифру (от \(0\) до \(9\)). Клетка на пересечении \(j\)-го столбца и \(i\)-й строки может быть описана как \((i, j)\), длины сторон каждой клетки равны \(1\). Gildong любит большие вещи, так что для каждой цифры \(d\) он хочет найти треугольник такой, что:

  • Каждая вершина треугольника находится в центре клетки.
  • Цифра на каждой вершине треугольнике равна \(d\).
  • Хотя бы одна сторона треугольника параллельна одной из сторон доски. Вы можете считать, что сторона длины \(0\) параллельна обоим сторонам доски.
  • Площадь треугольника максимальна.

Конечно, его не успокоят только эти треугольники. Для каждой цифры \(d\) он хочет изменить цифру у ровно одной клетки доски на \(d\), и затем найти искомый треугольник. Он меняет цифру этой клетки обратно после того, как он нашел треугольник. Найдите максимальную площадь треугольника, которую он может получить, для каждой цифры.

Обратите внимание, что он может ставить несколько вершин треугольника на одну и ту же клетку, и что треугольник может быть вырожденным; иначе говоря, площадь треугольника может быть равна \(0\). Также обратите внимание, что разрешается менять цифру \(d\) на \(d\).

Входные данные

Ввод состоит из одного или нескольких наборов входных данных. В первой строке записано количество наборов входных данных \(t\) (\(1 \le t \le 1000\)).

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 2000\)) — количество строк и столбцов в таблице.

Следующие \(n\) строк каждого набора входных данных содержат строку из \(n\) цифр без пробелов. В \(j\)-й цифре \(i\)-й строки записана цифра клетки \((i, j)\). Каждая цифра представлена символом от \(0\) до \(9\).

Гарантируется, что сумма \(n^2\) по всем наборам входных данных не превосходит \(4 \cdot 10^6\).

Выходные данные

Для каждого набора входных данных, выведите строку из \(10\) целых чисел. \(i\)-е из них должно быть равно максимальной площади, которую может получить Gildong, для \(d = i-1\), умноженной на \(2\).

Примечание

В первом наборе входных данных для \(d=0\) вне зависимости от выбранной клетки треугольник с вершинами \((1, 1)\), \((1, 3)\) и \((3, 1)\) — это самый большой треугольник площади \(\cfrac{2 \cdot 2}{2} = 2\). Так как мы должны вывести ответ, умноженный на \(2\), ответ для \(d=0\) это \(4\).

Для \(d=1\) Gildong может поменять цифру у клетки \((1, 3)\) на \(1\), получив треугольник с вершинами в клетках с цифрой \(1\) с площадью \(2\).

Для \(d=2\) Gildong может поменять цифру ровно одной из следующих клеток на \(2\), чтобы получить треугольник с площадью \(\cfrac{1}{2}\): \((1, 1)\), \((1, 2)\), \((1, 3)\), \((3, 1)\), \((3, 2)\) и \((3, 3)\).

Для остальных цифр (от \(3\) до \(9\)) клетка, которую поменяет Gildong, будет единственной клеткой, содержащей эту цифру. Таким образом, треугольник всегда будет вырожденным и площади \(0\).

В третьем наборе входных данных для \(d=4\) обратите внимание, что треугольник будет больше чем ответ, если Gildong поменяет цифру у клетки \((1, 4)\), а затем выберет дополнительно клетки \((2, 1)\) и \((4, 3)\), но это некорректно, потому что это не удовлетворяет условию, что хотя бы одна сторона треугольника должна быть параллельна стороне доски.

B. Unique Bid Auction

реализация *800

Существует игра под названием «Unique Bid Auction». Вы можете узнать про нее больше здесь: https://en.wikipedia.org/wiki/Unique_bid_auction (тем не менее, в этом нет необходимости для решения задачи).

Давайте немного упростим эту игру. Формально, в игре есть \(n\) участников, \(i\)-й участник выбрал число \(a_i\). Победителем игры является тот участник, чье число уникально (то есть никто кроме него не выбрал это число) и минимально (то есть среди всех уникальных значений \(a\) минимальное из них является выигрышным).

Ваша задача — найти индекс участника, который победил в игре (или же -1, если победителя нет). Индексы начинаются с \(1\), то есть участники пронумерованы от \(1\) до \(n\).

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество участников. Вторая строка набора тестовых данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)), где \(a_i\) равно числу, выбранному \(i\)-м участником.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Выведите ответ на каждый набор тестовых данных — индекс участника, который победил в игре (или же -1, если победителя нет). Заметьте, что ответ всегда уникален.

C. Изменение последовательности

жадные алгоритмы реализация *1200

Вам задана последовательность \(a\), изначально состоящая из \(n\) целых чисел.

Вы хотите изменить эту последовательность таким образом, чтобы все элементы в ней были равны между собой (то есть чтобы она состояла из какого-то количества вхождений одного элемента).

Чтобы это сделать, вы выбираете какое-то целое число \(x\), которое встречается в \(a\) хотя бы раз, и затем совершаете следующую операцию любое количество раз (возможно, нулевое): выбираете какой-то отрезок последовательности \([l, r]\) и удаляете его. Но есть одно исключение: вы не можете выбирать отрезки, которые содержат \(x\). Более формально, вы выбираете какую-то такую последовательную подпоследовательность \([a_l, a_{l + 1}, \dots, a_r]\), что \(a_i \ne x\) для \(l \le i \le r\), и удаляете ее. После удаления индексация элементов справа от удаленного отрезка меняется: элемент, который был \((r+1)\)-м, становится \(l\)-м, элемент, который был \((r+2)\)-м, становится \((l+1)\)-м, и так далее (то есть последовательность просто схлопывается).

Заметьте, что вы не можете изменять \(x\) после того, выбрали его.

Например, пусть \(n = 6\), \(a = [1, 3, 2, 4, 1, 2]\). Тогда одним из способов изменить ее за две операции является выбрать \(x = 1\), а затем:

  1. выбрать \(l = 2\), \(r = 4\), после чего получится последовательность \(a = [1, 1, 2]\);
  2. выбрать \(l = 3\), \(r = 3\), после чего получится последовательность \(a = [1, 1]\).

Заметьте, что выбор \(x\) не является операцией. Также заметьте, что вы не можете удалять никакое вхождение \(x\).

Ваша задача — найти минимальное количество операций, необходимое для того, чтобы изменить последовательность так, как описано выше.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество элементов в \(a\). Вторая строка набора тестовых данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)), где \(a_i\) равно \(i\)-му элементу \(a\).

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Выведите ответ на каждый набор тестовых данных — минимальное количество операций, необходимое для того, чтобы изменить заданную последовательность так, как описано в условии задачи. Можно доказать, что всегда возможно совершить конечную последовательность операций таким образом, чтобы последовательность изменилась необходимым образом.

E. Четыре точки

геометрия жадные алгоритмы Конструктив математика Перебор Потоки реализация Тернарный поиск *2400

Вам заданы четыре различные целые точки \(p_1\), \(p_2\), \(p_3\) и \(p_4\) на коодинатной плоскости \(\mathit{XY}\).

За один шаг вы можете выбрать одну из точек \(p_i\) и сдвинуть ее в одном из четырех направлений на единицу. Другими словами, если вы выбрали точку \(p_i = (x, y)\), вы можете передвинуть ее в \((x, y + 1)\), \((x, y - 1)\), \((x + 1, y)\) или \((x - 1, y)\).

Ваша задача — сдвинуть точки таким образом, чтобы они образовали квадрат со сторонами параллельными осям \(\mathit{OX}\) и \(\mathit{OY}\) (квадрат со стороной \(0\) разрешен).

Какое минимальное количество шагов вам нужно, чтобы получить такой квадрат?

Входные данные

В первой строке задано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор состоит из четырех строк. В каждой строке заданы два целых числа \(x\) и \(y\) (\(0 \le x, y \le 10^9\)) — координаты одной из точек \(p_i = (x, y)\).

Все точки в одном наборе различные.

Выходные данные

Для каждого набора входных данных, выведите единственное число — минимальное количество шагов, необходимых для получения квадрата.

Примечание

В первом наборе входных данных, один из оптимальных ответов изображен ниже:

Каждая точка будет сдвинута два раза, поэтому ответ \(2 + 2 + 2 + 2 = 8\).

Во втором наборе, один из оптимальных ответов изображен ниже:

Ответ равен \(3 + 1 + 0 + 3 = 7\).

В третьем наборе, один из оптимальных ответов изображен ниже:

Ответ равен \(1 + 1 + 2 + 1 = 5\).

A. Счастливый билет

реализация *800

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

Петя очень любит билеты. Как известно, каждый билет имеет свой номер, который является целым положительным числом длины n (n всегда четно). Петя называет билет счастливым, если его номер — счастливое число, и сумма цифр в первой половине (сумма первых n / 2 цифр) равна сумме цифр во второй половине (сумма последних n / 2 цифр). Проверьте, является ли заданный билет счастливым.

Входные данные

В первой строке задано четное целое число n (2 ≤ n ≤ 50) — длина номера билета, который нужно проверить. Во второй строке задано целое число длины ровно n — номер билета. Число может содержать лидирующие нули.

Выходные данные

В единственной строке выведите «YES» если заданный номер билета — счастливый, иначе — «NO» (без кавычек).

Примечание

В первом примере сумма цифр в первой половине не равна сумме цифр во второй половине (4 ≠ 7).

Во втором примере номер билета не является счастливым числом.

B. Счастливая маска

Перебор реализация *1300

Петя любит счастливые числа. Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

Маской натурального числа n Петя называет число, полученное последовательной записью всех счастливых цифр числа n слева направо. Например, маской числа 72174994 есть число 7744, 77, 999904747. Очевидно, что маска любого числа всегда является счастливым числом.

У Пети есть два числа — произвольное целое число a и счастливое число b. Помогите ему найти минимальное число c (c > a) такое, что маска числа c равна b.

Входные данные

В единственной строке задано два целых числа a и b (1 ≤ a, b ≤ 105). Гарантируется, что число b — счастливое.

Выходные данные

В единственной строке выведите одно число — искомое Петей c.

B. Найди ель

дп Перебор реализация *1400

Вот-вот наступит новый год. Рик понял, что ему пора задуматься о покупке традиционных новогодних елок. Но Рику жалко покупать настоящие елки, поэтому он решил найти их в матрице размером \(n \times m\), состоящей из символов «*» и «.».

Для того, чтобы найти все ели, сперва дадим определение ели в матрице. Набор ячеек из матрицы называется елью с высотой \(k\) и вершиной в точке \((x, y)\), если:

  • Все ячейки из набора являются символами «*».
  • Для всех \(1 \le i \le k\) все ячейки с номером строки \(x+i-1\) и с номерами столбцов в диапазоне \([y - i + 1, y + i - 1]\) должны принадлежать набору. Все остальные ячейки не могут принадлежать набору.

Примеры корректных и некорректных елок:

Теперь Рику стало интересно, сколько елей существует в его матрице \(n \times m\). Помогите ему ответить на этот вопрос.

Входные данные

Каждый тест содержит один или несколько наборов входных данных. В первой строке записано количество наборов входных данных \(t\) (\(1 \le t \le 10\)).

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 500\)) — размер матрицы.

Следующие \(n\) строк каждого из наборов содержат по \(m\) символов \(c_{i, j}\) — описание матрицы. Гарантируется, что \(c_{i, j}\) является либо символом «.», либо символом «*».

Гарантируется, что сумма \(n \cdot m\) по всем тестовым наборам не превосходит \(500^2\) (\(\sum n \cdot m \le 500^2\)).

Выходные данные

Выведите единственное целое число — количество елок в матрице.

Примечание

В первом тестовом примере первая ель имеет вершину в точке \((1, 2)\) и высоту \(2\), вторая ель имеет вершину в точке \((1, 2)\) и высоту \(1\), третья ель имеет вершину в точке \((2, 1)\) и высоту \(1\), четвертая ель имеет вершину в точке \((2, 2)\) и высоту \(1\), пятая ель имеет вершину в точке \((2, 3)\) и высоту \(1\).

Во втором тестовом примере первая ель имеет вершину в точке \((1, 2)\) и высоту \(1\), вторая ель имеет вершину в точке \((2, 1)\) и высоту \(1\), третья ель имеет вершину в точке \((2, 2)\) и высоту \(1\).

D. Разделяй и суммируй

Бинарный поиск Перебор разделяй и властвуй реализация сортировки Структуры данных *1600

Майк получил в подарок на день рождения массив \(a\) длины \(n\) и решил протестировать, насколько он красивый.

Массив пройдет \(i\)-й тест на красоту, если существует способ из изначального массива путем некоторого (возможно, нулевого) количества операций разреза получить массив с суммой элементов, равной \(s_i\).

Операция разреза массива происходит следующим образом:

  • Вычисляется \(mid = \lfloor\frac{max(array) + min(array)}{2}\rfloor\), где \(max\) и \(min\) — это функции нахождения максимального и минимального элемента массива. Иными словами, \(mid\) равно сумме максимального и минимального элементов \(array\), деленной на \(2\) с округлением вниз.
  • Далее массив разделяется на две части \(\mathit{left}\) и \(right\). В \(\mathit{left}\) попадают все элементы массива, которые имеют значение меньшее либо равное \(mid\), а в массив \(right\) попадают все элементы, которые больше \(mid\). Элементы в \(\mathit{left}\) и \(right\) сохраняют свой относительный порядок, который был в \(array\).
  • Третьим шагом выбирается, какой из массивов \(\mathit{left}\) или \(right\) мы хотим оставить. Выбранный массив заменит собой текущий, а другой навсегда удалится.

Вам требуется помочь Майку определить результаты \(q\) тестов на красоту.

Заметьте, что вы тестируете красоту массива \(a\), поэтому вы начинаете каждый тест на красоту с изначальным (заданным) массивом \(a\). Таким образом, первый разрез (если он необходим) всегда совершается над массивом \(a\).

Входные данные

Каждый тест содержит один или несколько наборов входных данных. В первой строке записано количество наборов входных данных \(t\) (\(1 \le t \le 100\)).

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) \((1 \le n, q \le 10^5)\) — длину массива \(a\) и количество тестов на красоту соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, ..., a_n\) \((1 \le a_i \le 10^6)\) — описание массива \(a\).

Следующие \(q\) строк каждого набора входных данных содержат по одному целому числу \(s_i\) \((1 \le s_i \le 10^9)\) — сумму элементов, которую хочет добиться Майк в \(i\)-м тесте на красоту.

Гарантируется, что сумма \(n\) и сумма \(q\) не превосходят \(10^5\) (\(\sum n, \sum q \le 10^5\)).

Выходные данные

Для каждого набора входных данных выведите \(q\) строк, каждая из которых должна содержать «Yes», если соответствующий тест на красоту пройден, и «No» в противном случае.

Примечание

Объяснение первого набора входных данных:

  1. Получить массив с суммой \(s_1 = 1\) мы можем следующим способом:

    1.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(\mathit{left}\).

    1.2 \(a = [1, 2, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 2]\), \(right = [3]\). Мы выбираем оставить массив \(\mathit{left}\).

    1.3 \(a = [1, 2]\), \(mid = \frac{1+2}{2} = 1\), \(\mathit{left} = [1]\), \(right = [2]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой, равной \(1\).

  2. Массив с суммой \(s_2 = 8\) можно показать, что получить невозможно.
  3. Получить массив с суммой \(s_3 = 9\) мы можем следующим способом:

    3.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(right\) с суммой, равной \(9\).

  4. Массив с суммой \(s_4 = 12\) можно показать, что получить невозможно.
  5. Получить массив с суммой \(s_5 = 6\) мы можем следующим способом:

    5.1 \(a = [1, 2, 3, 4, 5]\), \(mid = \frac{1+5}{2} = 3\), \(\mathit{left} = [1, 2, 3]\), \(right = [4, 5]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой, равной \(6\).

Объяснение второго набора входных данных:

  1. Массив с суммой \(s_1 = 1\) можно показать, что получить невозможно.
  2. Получить массив с суммой \(s_2 = 2\) мы можем следующим способом:

    2.1 \(a = [3, 1, 3, 1, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 1]\), \(right = [3, 3, 3]\). Мы выбираем оставить массив \(\mathit{left}\) с суммой \(2\).

  3. Массив с суммой \(s_3 = 3\) можно показать, что получить невозможно.
  4. Получить массив с суммой \(s_4 = 9\) мы можем следующим способом:

    4.1 \(a = [3, 1, 3, 1, 3]\), \(mid = \frac{1+3}{2} = 2\), \(\mathit{left} = [1, 1]\), \(right = [3, 3, 3]\). Мы выбираем оставить массив \(right\) с суммой \(9\).

  5. Мы можем получить \(s_5 = 11\) без операций разреза, потому что изначальная сумма уже была равна \(11\).

E. Уровень воды

графы жадные алгоритмы математика Перебор реализация *2200

Джон очень успешно обосновался на своей новой работе в офисе. Но Джон не любит сидеть без дела, пока его код компилируется, поэтому он сразу же нашел себе достаточно интересное занятие, которое заключается в поддержании уровня воды в кулере, который используют другие зебры.

Изначально в кулере находится ровно \(k\) литров воды. Джон решил, что уровень воды всегда должен быть не менее \(l\) литров и не более \(r\) литров. Джон будет находиться в офисе ровно \(t\) дней. Он знает, что каждый день из кулера будут выпивать ровно \(x\) литров воды. Джон перед началом каждого дня может налить в кулер ровно \(y\) литров воды. При этом в любой момент времени количество воды в кулере должно находиться в диапазоне \([l, r]\).

Теперь Джону стало интересно, сможет ли он в течение \(t\) дней поддерживать количество воды в кулере. Помогите ему ответить на этот вопрос!

Входные данные

Первая строка ввода содержит шесть целых чисел \(k\), \(l\), \(r\), \(t\), \(x\) и \(y\) (\(1 \le l \le k \le r \le 10^{18}; 1 \le t \le 10^{18}; 1 \le x \le 10^6; 1 \le y \le 10^{18}\)) — изначальное количество воды, требуемый диапазон, количество дней, ежедневные потери воды и допустимое добавляемое количество воды соответственно.

Выходные данные

Выведите «Yes», если Джон сможет поддерживать уровень воды в течение \(t\) дней, и «No» в противном случае.

Примечание

В первом тестовом примере Джон не может увеличить запас воды в начале первого дня, так как он превысит лимит \(r\). Поэтому после первого дня в кулере будет \(2\) литра. Далее Джон увеличивает запас на \(4\) литра, однако теряет \(6\) литров. В итоге у Джона останется \(0\) литров воды, то есть объём не будет в диапазоне \([1, 10]\).

Во втором тестовом примере после первого дня у Джона останется \(2\) литра воды. Далее, в начале второго дня он добавит \(5\) литров, а потом объём воды уменьшится на \(6\) литров. В итоге у Джона останется \(1\) литр воды, что входит в диапазон \([1, 10]\).

В третьем тестовом примере после первого дня у Джона останется \(7\) литров воды, после второго — \(5\) литров, после четвёртого — \(1\) литр. Далее, в начале пятого дня Джон добавит \(9\) литров, а после потеряет \(2\) литра. Значит, после пятого дня у него останется \(8\) литров. Далее, каждый день уровень воды будет понижаться на \(2\) литра, в итоге после восьмого дня у Джона останется \(2\) литра воды, а после девятого — \(0\) литров. \(0\) не входит в диапазон \([1, 10]\), поэтому ответ «No».

В четвёртом тестовом примере после первого дня у Джона останется \(15\) литров воды. В начале второго дня он добавит \(7\) литров, а после потеряет \(5\), а значит после второго дня у него останется \(17\) литров воды. В начале третьего дня он добавит \(7\) литров воды, а после потеряет \(5\), значит после третьего дня у него останется \(19\) литров воды. \(19\) входит в диапазон \([15, 25]\), поэтому ответ «Yes».

A. Любимая последовательность

реализация *800

У Поликарпа есть любимая последовательность \(a[1 \dots n]\), которая состоит из \(n\) целых чисел. Он выписал ее на доску следующим образом:

  • максимально слева (в начале доски) он написал число \(a_1\);
  • максимально справа (в конце доски) он написал число \(a_2\);
  • потом максимально слева (но правее, чем \(a_1\)) он написал число \(a_3\);
  • потом максимально справа (но левее, чем \(a_2\)) он написал число \(a_4\);
  • Поликарп продолжил действовать также, пока не выписал на доску всю последовательность.
Вот что будет изображено после четырёх действий (конечно, если \(n \ge 4\)).

Например, если \(n=7\) и \(a=[3, 1, 4, 1, 5, 9, 2]\), то Поликарп выпишет на доску последовательность \([3, 4, 5, 2, 9, 1, 1]\).

Вы увидели последовательность на доске и теперь хотите узнать, какая была любимая последовательность Поликарпа.

Входные данные

В первой строке находится одно целое число \(t\) (\(1 \le t \le 300\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора входных данных находится целое число \(n\) (\(1 \le n \le 300\)) — длина последовательности, записанной на доске.

В следующей строке находятся \(n\) целых чисел \(b_1, b_2,\ldots, b_n\) (\(1 \le b_i \le 10^9\)) — последовательность на доске.

Выходные данные

Выведите \(t\) ответов на наборы входных данных. Каждый ответ — это последовательность \(a\), которую Поликарп выписывал на доску.

Примечание

В первом наборе входных данных последовательность \(a\) совпадает с последовательностью из условия. Состояния доски после каждого шага выглядят так:

\([3] \Rightarrow [3, 1] \Rightarrow [3, 4, 1] \Rightarrow [3, 4, 1, 1] \Rightarrow [3, 4, 5, 1, 1] \Rightarrow [3, 4, 5, 9, 1, 1] \Rightarrow [3, 4, 5, 2, 9, 1, 1]\).

B. Прошлогодняя подстрока

дп реализация Строки *800

У Поликарпа есть строка \(s[1 \dots n]\) длины \(n\), состоящая из десятичных цифр. Поликарп делает следующую операцию со строкой \(s\) не более одного раза (то есть делает операцию \(0\) или \(1\) раз):

  • Поликарп выбирает два числа \(i\) и \(j\) (\(1 \leq i \leq j \leq n\)) и удаляет из строки \(s\) символы на позициях \(i, i+1, i+2, \ldots, j\) (то есть удаляет подстроку \(s[i \dots j]\)). Более формально, Поликарп превращает строку \(s\) в строку \(s_1 s_2 \ldots s_{i-1} s_{j+1} s_{j+2} \ldots s_{n}\).

Например, строку \(s = \)«20192020» Поликарп может превратить в строки:

  • «2020» (в таком случае \((i, j)=(3, 6)\) или \((i, j)=(1, 4)\));
  • «2019220» (в таком случае \((i, j)=(6, 6)\));
  • «020» (в таком случае \((i, j)=(1, 5)\));
  • возможны и другие ходы, выше перечислены лишь только некоторые из них.

Поликарпу очень нравится строка «2020», поэтому ему интересно, можно ли превратить строку \(s\) в строку «2020» не более чем за одну операцию? Заметьте, что проводить ноль операций допустимо.

Входные данные

В первой строке находится целое число \(t\) (\(1 \leq t \leq 1000 \)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора содержится целое число \(n\) (\(4 \leq n \leq 200\)) — длина строки \(s\). В следующей строке находится строка \(s\) длины \(n\), состоящая из десятичных цифр. Допустимо, что строка \(s\) начинается с цифры 0.

Выходные данные

Для каждого набора входных данных в отдельной строке выведите:

  • «YES», если Поликарп может превратить строку \(s\) в строку «2020» не более чем за одну операцию (то есть за \(0\) или \(1\) операцию);
  • «NO» в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных Поликарп мог выбрать \(i=3\) и \(j=6\).

Во втором наборе входных данных Поликарп мог выбрать \(i=2\) и \(j=5\).

В третьем наборе входных данных Поликарп не делал ни одну операцию со строкой.

E2. Близкие наборы (сложная версия)

Бинарный поиск Комбинаторика математика реализация сортировки *1700

Это сложная версия этой задачи. Единственное различие между простой и сложной версиями заключается в ограничениях на \(k\) и \(m\). В этой версии задачи нужно выводить ответ по модулю \(10^9+7\).

Вам задана последовательность \(a\) длины \(n\), состоящая из целых чисел от \(1\) до \(n\). Среди чисел могут быть одинаковые.

Найдите количество наборов из \(m\) элементов, таких что максимальное число в наборе отличается от минимального не больше, чем на \(k\). Формально, вам нужно найти количество наборов из \(m\) индексов \(i_1 < i_2 < \ldots < i_m\), таких что

\(\)\max(a_{i_1}, a_{i_2}, \ldots, a_{i_m}) - \min(a_{i_1}, a_{i_2}, \ldots, a_{i_m}) \le k.\(\)

Например, если \(n=4\), \(m=3\), \(k=2\), \(a=[1,2,4,3]\), то существуют две такие тройки (\(i=1, j=2, z=4\) и \(i=2, j=3, z=4\)). Если же \(n=4\), \(m=2\), \(k=1\), \(a=[1,1,1,1]\), то все шесть возможных пар подходят.

Поскольку ответ может быть достаточно большим, вам нужно посчитать его по модулю \(10^9 + 7\) (остаток при делении на число \(10^9 + 7\)).

Входные данные

В первой строке находится одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^5\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора входных данных находится три целых числа \(n\), \(m\), \(k\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le m \le 100\), \(1 \le k \le n\)) — длина последовательности \(a\), количество элементов в искомых наборах и максимальная разница элементов в наборе.

В следующей строке находятся \(n\) целых чисел \(a_1, a_2,\ldots, a_n\) (\(1 \le a_i \le n\)) — последовательность \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Выведите \(t\) ответов на наборы входных данных. Каждый ответ — это количество наборов из \(m\) элементов по модулю \(10^9 + 7\), таких что максимальное число в наборе отличается от минимального не больше, чем на \(k\).

C. Занятой робот

реализация *1800

У вас есть робот, который двигается по числовой прямой. В момент времени \(0\) он находится в точке \(0\).

Вы посылаете роботу \(n\) команд: в \(t_i\)-ю секунды вы указываете робот пойти в точку \(x_i\). Когда робот получает команду, он сразу же начинает движение в сторону точки \(x_i\) со скоростью \(1\) в секунду и останавливается, когда достигает этой точки. Однако, когда робот двигается, он игнорирует все другие команды, которые он получает.

Например, предположим, что роботу приходят три команды: в секунду \(1\) ехать в точку \(5\), в секунду \(3\) ехать в точку \(0\) и в секунду \(6\) ехать в точку \(4\). Тогда робот будет стоять в \(0\) до секунды \(1\), затем начнет ехать к \(5\), игнорируя вторую команду, достигнет \(5\) в момент времени \(6\) и сразу же начнет ехать к \(4\), чтобы выполнить третью команду. В момент времени \(7\) он доедет до \(4\) и остановится там.

Команда \(i\) считается выполненной успешно, если существует такой момент времени в отрезке \([t_i, t_{i + 1}]\) (то есть после того, как команда послана, и перед тем, как послана следующая, обе границы включительно; считаем \(t_{n + 1} = +\infty\)), что робот находится в позиции \(x_i\). Посчитайте количество успешных команд. Обратите внимание, что проигнорированная команда все равно может быть успешной.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Затем следует описание наборов входных данных.

В первой строке набора входных данных записано одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество команд.

Затем \(n\) строк описывают команды. В \(i\)-й из них записаны два целых числа \(t_i\) и \(x_i\) (\(1 \le t_i \le 10^9\), \(-10^9 \le x_i \le 10^9\)) — время и точка назначения \(i\)-й команды.

Команды упорядочены по времени, то есть, \(t_i < t_{i + 1}\) для всех возможных \(i\).

Сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество успешных команд.

Примечание

Движение робота в первом наборе входных данных описано в условии задачи. Только последняя команда успешна.

Во втором наборе входных данных вторая команда успешна: робот проходит через точку назначения \(4\) в момент времени \(5\). К тому же, последняя команда тоже в конце концов станет успешной.

В третьем наборе входных данных ни одна команда не успешна, и робот остановится в \(-5\) в секунду \(7\).

Вот \(0\)-индексированные последовательности позиций робота в каждую секунду для каждого набора входных данных из примера. Все отрезанные позиции совпадают с последней:

  1. \([0, 0, 1, 2, 3, 4, 5, 4, 4, \dots]\)
  2. \([0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -5, \dots]\)
  3. \([0, 0, 0, -1, -2, -3, -4, -5, -5, \dots]\)
  4. \([0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 2, 2, 2, 1, 0, 0, \dots]\)
  5. \([0, 0, 1, 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -7, -8, -9, -9, -9, -9, -8, -7, -6, -5, -4, -3, -2, -1, -1, \dots]\)
  6. \([0, 0, -1, -2, -3, -4, -4, -3, -2, -1, -1, \dots]\)
  7. \([0, 0, 1, 2, 2, \dots]\)
  8. \([0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -7, \dots]\)

E. План лекций

графы Деревья Конструктив поиск в глубину и подобное реализация снм сортировки *2400

Иван — учитель по программированию. В течение учебного года он планирует прочитать \(n\) лекций на \(n\) различных тем. Каждая тема должна быть использована ровно в одной лекции. Иван хочет выбрать, какую тему он будет объяснять во время \(1\)-й, \(2\)-й, ..., \(n\)-й лекции — формально он хочет выбрать некоторую перестановку целых чисел от \(1\) до \(n\) (назовем эту перестановку \(q\)). \(q_i\) — это номер темы, которую Иван объяснит во время \(i\)-й лекции.

Для каждой темы (за исключением ровно одной) существует обязательная предшествующая тема (для \(i\)-й темы предшествующая тема — \(p_i\)). Иван не может читать лекцию по теме, не прочитав лекцию по ее предшествующей теме. Существует по крайней мере один допустимый порядок тем в соответствии с этими предварительными ограничениями.

Правильный порядок тем может помочь студентам лучше понять лекции. У Ивана есть \(k\) специальных пар тем \((x_i, y_i)\) таких, что он знает, что студенты лучше поймут \(y_i\)-ю тему, если лекция по ней будет проводиться сразу после лекции по \(x_i\)-й теме. Иван хочет удовлетворить ограничениям на каждую такую пару, то есть для каждого \(i \in [1, k]\) должно существовать некоторое \(j \in [1, n - 1]\) такое, что \(q_j = x_i\) и \(q_{j + 1} = y_i\).

Теперь Иван хочет знать, существует ли порядок тем, удовлетворяющий всем этим ограничениям, и если хотя бы один из них существует, найти любой из них.

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(2 \le n \le 3 \cdot 10^5\), \(1 \le k \le n - 1\)) — количество тем и количество специальных пар тем соответственно.

Вторая строка содержит \(n\) целых чисел \(p_1\), \(p_2\), ..., \(p_n\) (\(0 \le p_i \le n\)), где \(p_i\) — обязательная предшествующая тема для темы \(i\) (или \(p_i = 0\), если у \(i\)-й темы нет предшествующей темы). Ровно одно из этих целых чисел равно \(0\). Существует по крайней мере один порядок тем, такой что для каждой темы \(i\) тема \(p_i\) идет до \(i\)-й темы.

Затем следует \(k\) строк, \(i\)-я строка содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)) — темы из специальной пары \(i\). Все значения \(x_i\) попарно различны; аналогично, все значения \(y_i\) попарно различны.

Выходные данные

Если не существует порядка тем, удовлетворяющих всем ограничениям, выведите \(0\).

В противном случае выведите \(n\) попарно различных целых чисел \(q_1\), \(q_2\), ..., \(q_n\) (\(1 \le q_i \le n\)) — порядок тем, удовлетворяющих всем ограничениям. Если ответов несколько, выведите любой из них.

B. Холмы и долины

Перебор реализация *1700

Дана последовательность \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\). Назовем индекс \(j\) (\(2 \le j \le {{n-1}}\)) холмом, если \(a_j > a_{{j+1}}\) и \(a_j > a_{{j-1}}\); и назовем его долиной, если \(a_j < a_{{j+1}}\) и \(a_j < a_{{j-1}}\).

Определим страшность последовательности как сумму числа холмов и числа долин этой последовательности. Разрешается заменить ровно одно число в последовательности на любое другое, либо оставить последовательность без изменений. Какое минимальное значение страшности при этом можно достигнуть?

Входные данные

В первой строке входных данных содержится единственное целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных данных. Затем следуют описания самих наборов.

Первая строка каждого набора содержит единственное целое число \(n\) (\(1 \le n \le 3\cdot10^5\)).

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(1 \le a_i \le 10^9\)), разделенных пробелами.

Гарантируется, что сумма \(n\) во всех наборах входных данных не превышает \(3\cdot10^5\).

Выходные данные

Для каждого набора входных данных требуется вывести единственное целое число — минимальное значение страшности, которое может быть достигнуто при заданных входных данных.

Примечание

В первом наборе входных данных изменение значения \(a_2\) на \(2\) приведет к тому, что холмов и долин не будет.

Во втором наборе входных данных наилучшим решением будет оставить массив без изменений.

В третьем наборе входных данных изменение значения \(a_3\) на \(6\) приведет к тому, что будет только одна долина (с индексом \(5\)).

В четвертом наборе входных данных изменение значения \(a_3\) на \(6\) приведет к тому, что холмов и долин не будет.

C. Berpizza

реализация Структуры данных *1400

Monocarp and Polycarp are working as waiters in Berpizza, a pizzeria located near the center of Bertown. Since they are waiters, their job is to serve the customers, but they choose whom they serve first differently.

At the start of the working day, there are no customers at the Berpizza. They come there one by one. When a customer comes into the pizzeria, she sits and waits for Monocarp or Polycarp to serve her. Monocarp has been working in Berpizza for just two weeks, so whenever he serves a customer, he simply chooses the one who came to Berpizza first, and serves that customer.

On the other hand, Polycarp is an experienced waiter at Berpizza, and he knows which customers are going to spend a lot of money at the pizzeria (and which aren't) as soon as he sees them. For each customer, Polycarp estimates the amount of money this customer can spend, and when he serves a customer, he chooses the one that is expected to leave the most money at Berpizza (in case there are several such customers, he chooses the one who came first among them).

Obviously, no customer can be served twice, so Monocarp and Polycarp choose which customer to serve only among those who haven't been served yet.

When the number of customers gets really high, it becomes difficult for both Monocarp and Polycarp to choose the customer they are going to serve. Your task is to write a program that makes these choices for them. Formally, your program should be able to process three types of queries:

  • \(1\) \(m\) — a customer comes to Berpizza, and Polycarp estimates the amount of money that they will spend as \(m\);
  • \(2\) — Monocarp serves a customer which came to the pizzeria first;
  • \(3\) — Polycarp serves a customer which is expected to spend the largest amount of money at the pizzeria (if there are several such customers, the one that came to the pizzeria first is chosen).

For each query of types \(2\) and \(3\), report the number of the customer who was served (the customers are numbered in the order they come to the pizzeria, starting from \(1\)).

Input

The first line contains one integer \(q\) (\(2 \le q \le 5 \cdot 10^5\)) — the number of queries.

Then \(q\) lines follow, each describing a query in one of the following formats:

  • \(1\) \(m\) (\(1 \le m \le 5 \cdot 10^5\)) — a customer comes to Berpizza, and Polycarp estimates the amount of money that they will spend as \(m\);
  • \(2\) — Monocarp serves a customer which came to the pizzeria first;
  • \(3\) — Polycarp serves a customer which is expected to spend the largest amount of money at the pizzeria (if there are multiple such customers, the one that came to the pizzeria first is chosen).

Queries of type \(2\) and \(3\) are asked only when there exists at least one customer that hasn't been served yet. There is at least one query of type \(2\) or \(3\) in the input.

Output

For each query of type \(2\) or \(3\), print one integer — the number of the customer that has been served in that event. The customers are numbered in the order in which they come to the pizzeria, starting from \(1\).

I. Plane Tiling

геометрия математика реализация *2500

You are given five integers \(n\), \(dx_1\), \(dy_1\), \(dx_2\) and \(dy_2\). You have to select \(n\) distinct pairs of integers \((x_i, y_i)\) in such a way that, for every possible pair of integers \((x, y)\), there exists exactly one triple of integers \((a, b, i)\) meeting the following constraints:

\( \begin{cases} x \, = \, x_i + a \cdot dx_1 + b \cdot dx_2, \\ y \, = \, y_i + a \cdot dy_1 + b \cdot dy_2. \end{cases} \)
Input

The first line contains a single integer \(n\) (\(1 \le n \le 10^5\)).

The second line contains two integers \(dx_1\) and \(dy_1\) (\(-10^6 \le dx_1, dy_1 \le 10^6\)).

The third line contains two integers \(dx_2\) and \(dy_2\) (\(-10^6 \le dx_2, dy_2 \le 10^6\)).

Output

If it is impossible to correctly select \(n\) pairs of integers, print NO.

Otherwise, print YES in the first line, and then \(n\) lines, the \(i\)-th of which contains two integers \(x_i\) and \(y_i\) (\(-10^9 \le x_i, y_i \le 10^9\)).

If there are multiple solutions, print any of them.

K. The Robot

Перебор реализация *1600

There is a robot on a checkered field that is endless in all directions. Initially, the robot is located in the cell with coordinates \((0, 0)\). He will execute commands which are described by a string of capital Latin letters 'L', 'R', 'D', 'U'. When a command is executed, the robot simply moves in the corresponding direction:

  • 'L': one cell to the left (the \(x\)-coordinate of the current cell decreases by \(1\));
  • 'R': one cell to the right (the \(x\)-coordinate of the current cell is increased by \(1\));
  • 'D': one cell down (the \(y\)-coordinate of the current cell decreases by \(1\));
  • 'U': one cell up (the \(y\)-coordinate of the current cell is increased by \(1\)).

Your task is to put an obstacle in one cell of the field so that after executing the commands, the robot will return to the original cell of its path \((0, 0)\). Of course, an obstacle cannot be placed in the starting cell \((0, 0)\). It is guaranteed that if the obstacle is not placed, then the robot will not return to the starting cell.

An obstacle affects the movement of the robot in the following way: if it tries to go in a certain direction, and there is an obstacle, then it simply remains in place (the obstacle also remains, that is, it does not disappear).

Find any such cell of the field (other than \((0, 0)\)) that if you put an obstacle there, the robot will return to the cell \((0, 0)\) after the execution of all commands. If there is no solution, then report it.

Input

The first line contains one integer \(t\) (\(1 \le t \le 500\)) — the number of test cases.

Each test case consists of a single line containing \(s\) — the sequence of commands, which are uppercase Latin letters 'L', 'R', 'D', 'U' only. The length of \(s\) is between \(1\) and \(5000\), inclusive. Additional constraint on \(s\): executing this sequence of commands leads the robot to some cell other than \((0, 0)\), if there are no obstacles.

The sum of lengths of all \(s\) in a test doesn't exceed \(5000\).

Output

For each test case print a single line:

  • if there is a solution, print two integers \(x\) and \(y\) (\(-10^9 \le x,y \le 10^9\)) such that an obstacle in \((x, y)\) will force the robot to return back to the cell \((0, 0)\);
  • otherwise, print two zeroes (i. e. 0 0).

If there are multiple answers, you can print any of them.

M. Similar Sets

графы реализация Структуры данных *2300

You are given \(n\) sets of integers. The \(i\)-th set contains \(k_i\) integers.

Two sets are called similar if they share at least two common elements, i. e. there exist two integers \(x\) and \(y\) such that \(x \ne y\), and they both belong to each of the two sets.

Your task is to find two similar sets among the given ones, or report that there is no such pair of sets.

Input

The first line contains a single integer \(t\) (\(1 \le t \le 50000\)) — the number of test cases. Then \(t\) test cases follow.

The first line of each test case contains a single integer \(n\) (\(2 \le n \le 10^5\)) the number of given sets. The following \(n\) lines describe the sets. The \(i\)-th line starts with an integer \(k_i\) (\(2 \le k_i \le 10^5\)) — the number of integers in the \(i\)-th set. Then \(k_i\) integers \(a_{i,1}\), \(a_{i,2}\), ..., \(a_{i,k_i}\) (\(1 \le a_{i,j} \le 10^9\)) follow — the elements of the \(i\)-th set. It is guaranteed that all elements in each set are different.

The total number of elements in all sets in all test cases is not greater than \(2\cdot 10^5\).

Output

For each test case, print the answer on a single line.

If there is no pair of similar sets, print -1.

Otherwise, print two different integers — the indices of the similar sets. The sets are numbered from \(1\) to \(n\) in the order they are given in the input. If there are multiple answers, print any of them.

N. Waste Sorting

жадные алгоритмы реализация *900

The progress is not standing still in Berland. Recently all garbage containers in Bertown, the capital of Berland, were replaced by differentiated recycling bins, each accepting some category of waste. While this will definitely improve the ecological situation, for some citizens it's difficult to get used to the habit of sorting waste.

Monocarp is one of those citizens who tries to get used to waste sorting. Today he has to take out the trash from his house. There are three containers near the Monocarp's house, the first one accepts paper waste, the second one accepts plastic waste, and the third one — all other types of waste. It is possible to fit \(c_1\) items into the first container, \(c_2\) items into the second container and \(c_3\) items into the third container.

Monocarp has a lot of items to throw into containers. Some are made of paper, so Monocarp has to put them into the first container (he has \(a_1\) such items), some are made of plastic, so he has to put them into the second container (he has \(a_2\) such items), and some are neither paper nor plastic — so Monocarp has to put them into the third container (he has \(a_3\) such items).

Unfortunately, there are also two categories of items that Monocarp is unsure of: he has \(a_4\) items which are partially made of paper, so he will put each of these items either into the first container or into the third container. Similarly, he has \(a_5\) items partially made of plastic, so he has to put each of them either into the second container or into the third container. Obviously, this choice is made separately for each item — for example, Monocarp can throw several partially-plastic items into the second container, and all other partially-plastic items — into the third one.

Now Monocarp wonders: is it possible to put each item into some container so that the first container will hold no more than \(c_1\) items, the second one — no more than \(c_2\) items, and the third one — no more than \(c_3\) items?

Input

The first line contains one integer \(t\) (\(1 \le t \le 3 \cdot 10^4\)) — the number of test cases.

Each test case consists of two lines. The first line of each test case contains three integers \(c_1\), \(c_2\), \(c_3\) (\(0 \le c_1, c_2, c_3 \le 10^8\)) — the capacities of the containers.

The second line of each test case contains five integers \(a_1\), \(a_2\), \(a_3\), \(a_4\), \(a_5\) (\(0 \le a_i \le 10^8\)), where \(a_i\) is the number of items of the \(i\)-th category Monocarp has to throw out (\(i = 1\) is paper waste, \(i = 2\) is plastic waste, \(i = 3\) is general waste, \(i = 4\) is partially-paper waste, \(i = 5\) is partially-plastic waste).

Output

For each test case, print either YES if it is possible to fit all items into containers, or NO otherwise. You may print each letter in any case (for example, YES, Yes, yes, yEs will all be recognized as positive answer).

Note

Explanations for the example test cases:

  1. Monocarp can put \(1\) item of paper waste into the first container, \(2\) items of plastic waste into the second container, and \(3\) items of general waste into the third container;
  2. Monocarp can put \(1\) item of paper waste and \(1\) item of partially-paper waste into the first container, \(2\) items of plastic waste into the second container, and \(3\) items of general waste into the third container;
  3. there is no answer since either the second container should contain \(3\) items, or the third container should contain \(4\) items;
  4. Monocarp can put \(1\) item of paper waste into the first container, \(2\) items of plastic waste into the second container, and \(3\) items of general waste, \(1\) item of partially-paper waste and \(1\) item of partially-plastic waste into the third container;
  5. there is no waste at all, so all containers can be left empty;
  6. there's no answer since it's impossible to put a paper item into the third container;
  7. Monocarp can put \(10\) items of partially-paper waste into the first container, \(37\) items of partially-plastic waste into the second container, and \(30\) items of partially-paper waste and \(10\) items of partially-plastic waste into the third container.

C. Построение забора

дп жадные алгоритмы реализация *1600

Вы хотите построить забор, который будет состоять из \(n\) равных секций. Все секции имеют ширину \(1\) и высоту \(k\). Вы поставите все секции в ряд бок о бок.

К сожалению, земля под забором далеко не плоская. Для простоты, вы можете считать что уровень земли под \(i\)-й секцией равен \(h_i\).

Для постройки забора вам нужно следовать нескольким правилам:

  1. последовательные секции должны касаться сторонами и иметь ширину касания не менее \(1\);
  2. первая и последняя секции должны стоять на своем уровне земли;
  3. секции между ними могут либо стоять на земле, либо находиться в воздухе, но не выше чем на \(k - 1\) от уровня земли \(h_i\) (высота над уровнем должна быть целым числом);
Один из возможных заборов (синего цвета) для первого набора входных данных

Можно ли построить забор, удовлетворяющий всем правилам?

Входные данные

В первой строке задано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(k\) (\(2 \le n \le 2 \cdot 10^5\); \(2 \le k \le 10^8\)) — количество секций в заборе и высота каждой секции.

Во второй строке каждого наборе заданы \(n\) целых чисел \(h_1, h_2, \dots, h_n\) (\(0 \le h_i \le 10^8\)), где \(h_i\) — уровень земли под \(i\)-й секцией.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, выведите YES, если возможно построить забор, удовлетворяющий всем правилам. Иначе, выведите NO.

Вы можете выводить каждый символ в любом регистре (например, YES, Yes, yes, yEs будут определяться как положительный ответ).

Примечание

В первом наборе входных данных, один из возможных заборов изображен выше.

Во втором наборе, согласно второму правилу, вы должны построить обе секции на высоте земли, и, так как \(k = 3\), \(h_1 = 0\) и \(h_2 = 2\), первое правило также выполняется.

В третьем наборе, согласно второму правилу, вы должны построить первую секцию на высоте \(3\) и третью на высоте \(2\). Согласно первому правилу, вторая секция должна быть на высоте не менее \(2\) (чтобы иметь общую часть с первой секцией), но согласно третьему правилу, вторая секция должна быть на высоте не более \(h_2 + k - 1 = 1\).

A. Пунктуация

реализация Строки *1300

Дан текст, состоящий из маленьких латинских букв, пробелов и знаков препинания (точка, запятая, восклицательный и вопросительный знаки). Слово — это последовательность подряд идущих латинских букв.

Ваша задача — расставить пробелы по следующим правилам:

  • если между двумя словами нет знака препинания, тогда они должны разделяться ровно одним пробелом
  • перед каждым знаком препинания не должно быть пробелов
  • после каждого знака препинания должен быть ровно один пробел

Гарантируется, что между двумя знаками препинания содержится хотя бы одно слово. Текст начинается и заканчивается латинской буквой.

Входные данные

Входные данные состоят из единственной непустой строки — текста, длиной не более 10000 символов.

Выходные данные

Выведите отформатированный в соответствии с правилами текст. В этой задаче необходимо крайне точно следовать правилам вывода, например, наличие лишнего пробела в конце строки вывода является ошибкой. Обратите внимание, что заключительный перевод строки при проверке правильности ответа значения не имеет. Можете выводить его, а можете не выводить.

E. Странная перестановка

Бинарный поиск графы дп Комбинаторика реализация Структуры данных *3200

У Игоря была перестановка \(p_1, p_2, \ldots, p_n\). К сожалению, перестановка выглядела достаточно скучно, так что он решил выбрать несколько непересекающихся подотрезков перестановки и развернуть каждый из них. Стоимость разворота одного отрезка \([l, r]\) (то есть элементов на позициях с \(l\) по \(r\) включительно) равна \(r - l\), а общая стоимость одной операции равна сумме стоимостей разворота для соответствующих отрезков. Игорю на Новый Год подарили целое число \(c\), поэтому его интересуют лишь те операции, стоимость которых не превосходит \(c\).

Затем Игорю стало совсем скучно, и он решил выписать на листочек все перестановки, которые он может получить из исходной, проделав ровно одну операцию. Каждую перестановку он выписал ровно один раз, даже если какую-то перестановку можно было получить несколькими способами. Полученный список Игорь отсортировал лексикографически.

Теперь Денис решил задать Игорю несколько вопросов про его список. Каждый вопрос выглядит следующим образом: чему равно \(i\)-е число в \(j\)-й перестановке в списке Игоря? Разумеется, Игорю слишком скучно заниматься ответами на эти вопросы, так что он обратился к вам за помощью.

Входные данные

В первой строке дано целое число \(t\) (\(1 \leq t \leq 30\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(c\), \(q\) (\(1 \leq n \leq 3 \cdot 10^4\), \(1 \leq c \leq 4\), \(1 \leq q \leq 3 \cdot 10^5\)) — размер перестановки, максимальная стоимость операции и число вопросов.

В следующей строке содержатся \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \leq p_i \leq n\), \(p_i \neq p_j\) если \(i \neq j\)) — элементы исходной перестановки.

В каждой из следующих \(q\) содержатся описания вопросов, каждое описание состоит из двух целых чисел \(i\) и \(j\) (\(1 \leq i \leq n\), \(1 \leq j \leq 10^{18}\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\), и что сумма \(q\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого вопроса в отдельной строке выведите ответ на этот вопрос или \(-1\), если Игорь ошибся и \(j\)-й перестановки не существует на листочке Игоря.

Примечание

В первом примере Игорь выписал на листочек следующие перестановки: \([1, 2, 3]\), \([1, 3, 2]\), \([2, 1, 3]\).

Обратите внимание, что для получения перестановки \([3, 2, 1]\) Игорю пришлось бы развернуть весь массив, а стоимость такой операции равна \(2\), что больше указанного значения \(c=1\). Другие две перестановки не могут быть получены из исходной путем применением операции из условия задачи.

B. Странный список

жадные алгоритмы математика Перебор реализация *1100

На Новый Год Дима получил целых два подарка: массив \(a\) длины \(n\) и число \(x\). Оба подарка ему очень понравились, и он сразу же начал экспериментировать с ними. Для этого он отдал их своему новому роботу.

Робот обрабатывает элементы массива по очереди. Пусть текущий рассматриваемый элемент равен \(q\). Если \(q\) кратно \(x\), то робот дописывает в конец массива \(x\) копий числа \(\frac{q}{x}\), а после этого переходит к следующему элементу массива. Обратите внимание, что добавленные элементы могут быть рассмотрены роботом в будущем. Если же \(q\) не делится на \(x\), то робот немедленно прекращает работу.

Определите, чему будет равна сумма элементов массива после того, как робот закончит работу.

Входные данные

Первая строка содержит одно число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) (\(1 \leq n \leq 10^5\), \(2 \leq x \leq 10^9\)) — количество элементов массива и число, на которое робот делит элементы массива.

Следующая строка содержит целые числа \(a_1\), \(a_2\), ..., \(a_n\) (\(1 \leq a_i \leq 10^9\)) — изначальные элементы массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — сумму элементов после окончания процесса.

Примечание

В первом наборе входных данных массив изначально состоит лишь из одного числа: \([12]\), а \(x = 2\). После рассмотрения первого элемента массив превратится в \([12, 6, 6]\). После обработки второго элемента массив будет содержать элементы \([12, 6, 6, 3, 3]\). После обработки третьего элемента массив будет состоять из чисел \([12, 6, 6, 3, 3, 3, 3]\), а после этого робот рассмотрим следующий элемент, который не делится на \(x=2\), и завершит работу. Сумма чисел в итоговом массиве равна \(36\).

Во втором наборе входных данных массив изначально состоит из чисел \([4, 6, 8, 2]\), а \(x=2\). Итоговый массив выглядит как \( [4, 6, 8, 2, 2, 2, 3, 3, 4, 4, 1, 1, 1, 1, 1, 1]\).

A. Замена элементов

жадные алгоритмы математика реализация сортировки *800

У вас есть массив \(a_1, a_2, \dots, a_n\). Все \(a_i\) являются целыми положительными числами.

За один шаг вы можете выбрать три различных индекса \(i\), \(j\) и \(k\) (\(i \neq j\); \(i \neq k\); \(j \neq k\)) и присвоить \(a_i\) сумму \(a_j\) и \(a_k\), т. е. сделать \(a_i = a_j + a_k\).

Можете ли вы сделать все \(a_i\) меньше или равными \(d\), используя вышеописанную операцию произвольное количество раз (возможно, ноль)?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 2000\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(d\) (\(3 \le n \le 100\); \(1 \le d \le 100\)) — длину массива \(a\) и значение \(d\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)) — массив \(a\).

Выходные данные

Для каждого набора входных выведите YES, если можно сделать все элементы \(a_i\) меньше или равными \(d\), используя описанную выше операцию, или NO в противном случае.

Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ).

Примечание

В первом примере можно доказать, что мы не можем сделать все \(a_i \le 3\).

Во втором примере все \(a_i\) уже меньше или равны \(d = 4\).

В третьем примере мы можем, например, выбрать \(i = 5\), \(j = 1\), \(k = 2\) и сделать \(a_5 = a_1 + a_2 = 2 + 1 = 3\). Массив \(a\) станет \([2, 1, 5, 3, 3]\).

После этого мы можем сделать \(a_3 = a_5 + a_2 = 3 + 1 = 4\). Массив станет \([2, 1, 4, 3, 3]\) и все элементы меньше или равны \(d = 4\).

D. Программа

дп реализация Строки Структуры данных *1700

Задана программа, состоящая из \(n\) инструкций. Изначально единственная переменная \(x\) присваивается \(0\). После этого следуют инструкции двух типов:

  • увеличить \(x\) на \(1\);
  • уменьшить \(x\) на \(1\).

Даны \(m\) запросов следующего типа:

  • запрос \(l\) \(r\) — сколько различных значений принимает переменная \(x\), если все инструкции между \(l\)-й и \(r\)-й включительно пропускаются, а остальные исполняются без изменения порядка?
Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следует описание \(t\) наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество инструкций в программе и количество запросов.

Во второй строке каждого набора входных данных записана программа — последовательность из \(n\) символов: каждый символ равен либо '+', либо '-' — инструкция увеличения и уменьшения, соответственно.

В каждой из следующих \(m\) строк записаны по два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)) — описание запроса.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите \(m\) целых чисел — для каждого запроса \(l\), \(r\) выведите количество различных значений, которые принимает переменная \(x\), если все инструкции между \(l\)-й и \(r\)-й включительно пропускаются, а остальные исполняются без изменения порядка.

Примечание

Инструкции, которые остаются в каждом запросе первого набора входных данных:

  1. пустая программа — \(x\) был равен только \(0\);
  2. «-» — \(x\) принимал значения \(0\) и \(-1\);
  3. «---+» — \(x\) принимал значения \(0\), \(-1\), \(-2\), \(-3\), \(-2\) — среди них \(4\) различных значения;
  4. «+--+--+» — различные значения — это \(1\), \(0\), \(-1\), \(-2\).

C. Уничтожение массива

жадные алгоритмы Конструктив Перебор реализация сортировки Структуры данных *1700

Вы нашли бесполезный массив целых чисел \(a\) длины \(2n\). Так как он оказался Вам не нужен, Вы решили выкинуть все элементы \(a\).

Это было бы просто, но оказалось, что выкидывать числа надо, соблюдая следующие правила:

  1. Сначала Вы выбираете натуральное число \(x\).
  2. Затем Вы \(n\) раз повторите следующую операцию:
    • выбрать два числа с суммой \(x\)
    • выкинуть их из \(a\) и заменить \(x\) на максимальное из этих двух чисел.

Например, если изначально \(a = [3, 5, 1, 2]\), то Вы можете выбрать \(x = 6\) и выкинуть второе и третье число в \(a\), сумма которых равна \(5 + 1 = 6\). После этого \(x\) станет равно \(5\), а в массиве останутся числа \(3\) и \(2\), которые Вы можете выкинуть на следующей операции.

Обратите внимание, что Вы выбираете \(x\) только в начале и не можете изменить его между операциями.

Напишите программу, чтобы определить, как выбросить все элементы \(a\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следуют описания самих наборов.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \leq n \leq 1000\)).

Во второй строке каждого набора задано \(2n\) натуральных чисел \(a_1, a_2, \dots, a_{2n}\) (\(1 \leq a_i \leq 10^6\)) — изначальный массив \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных в первой строке выведите YES если возможно выкинуть все элементы массива. Иначе выведите NO.

Если Вы вывели YES в следующей строке выведите значение \(x\), которое Вы выбираете в начале. В следующих \(n\) строках выведите по два числа — числа, которые Вы выбираете на очередной операции.

Примечание

Первый набор входных данных был описан в условии.

Во втором и третьем наборах входных данных можно показать, что нельзя выкинуть все элементы массива \(a\).

D. Путешествие

дп поиск в глубину и подобное реализация снм *1700

В некоторой стране \(n + 1\) городов, пронумерованных от \(0\) до \(n\). \(n\) дорог соединяют эти города, \(i\)-я дорога соединяет города \(i - 1\) и \(i\) (\(i \in [1, n]\)).

У каждой дороги есть направление. Направления задаются строкой из \(n\) символов, каждый символ — либо L, либо R. Если \(i\)-й символ — L, то \(i\)-я дорога сначала направлена из города \(i\) в город \(i - 1\); иначе она направлена из города \(i - 1\) в город \(i\).

Путешественник хочет посетить как можно больше городов этой страны. Сначала он выбирает город, из которого начнет свое путешествие. Каждый день путешественник должен перейти из текущего города в соседний город по дороге, и он может перейти по дороге только в соответствии с ее направлением; то есть, если дорога направлена из города \(i\) в город \(i + 1\), он может перейти из города \(i\) в город \(i + 1\), но не из \(i + 1\) в \(i\). После того как путешественник перемещается в соседний город, все дороги меняют свое направление на противоположное. Если путешественник не может перейти в соседний город, он обязан закончить свое путешествие; также он может закончить путешествие в любой момент, в который захочет.

Цель путешественника — посетить как можно больше городов за одно путешествие (каждый город можно посетить любое количество раз, но только первое посещение считается). Для каждого города \(i\) посчитайте максимальное количество городов, которое путешественник может посетить за одно путешествие, если оно начинается в городе \(i\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк. В первой строке задано одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)). Во второй строке — последовательность \(s\), состоящая из ровно \(n\) символов, каждый из которых — L или R.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n + 1\) целое число. \(i\)-е число должно быть равно максимальному количеству городов, которое можно посетить за одно путешествие, если это путешествие начинается в \(i\)-м городе.

C. Nezzar и симметричный массив

математика реализация сортировки *1700

Много тысячелетий назад был симметричный массив \(a_1,a_2,\ldots,a_{2n}\), состоящий из \(2n\) различных целых чисел. Массив \(a_1,a_2,\ldots,a_{2n}\) называется симметричным, если для всех целых чисел \(1 \le i \le 2n\) существует целое число \(1 \le j \le 2n\) такое, что \(a_i = -a_j\).

Для каждого целого числа \(1 \le i \le 2n\) Nezzar выписал целое число \(d_i\), равное сумме модулей разности между \(a_i\) и всеми числами из \(a\), то есть \(d_i = \sum_{j = 1}^{2n} {|a_i - a_j|}\).

Прошел миллион лет, и сейчас Nezzar с трудом помнит массив \(d\) и полностью забыл массив \(a\). Nezzar хочет узнать, существует ли симметричный массив \(a\), состоящий из \(2n\) различных целых чисел, из которого получается массив \(d\).

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных.

В первой строке описания каждого набора входных данных находится единственное целое число \(n\) (\(1 \le n \le 10^5\)).

Во второй строке описания каждого набора входных данных находится \(2n\) целых чисел \(d_1, d_2, \ldots, d_{2n}\) (\(0 \le d_i \le 10^{12}\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если существует любой возможный массив \(a\). Иначе выведите «NO».

Вы можете выводить символы в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных \(a=[1,-3,-1,3]\) это один из возможных массивов, из которых получается \(d=[8,12,8,12]\).

Во втором наборе входных данных можно показать, что не существует симметричных массивов, состоящих из различных целых чисел, из которых можно получить массив \(d\).

B1. Покраска массива I

дп жадные алгоритмы Конструктив реализация Структуры данных *1900

Единственное различие между двумя версиями задачи заключается в том, что в этой версии вам нужно найти максимальный возможный ответ.

Гомеру очень нравятся массивы. Сегодня он красит массив \(a_1, a_2, \dots, a_n\) двумя видами цветов, белым и черным. Покраска массива \(a_1, a_2, \dots, a_n\) описывается массивом \(b_1, b_2, \dots, b_n\), где \(b_i\) обозначает цвет \(a_i\) (\(0\) для белого и \(1\) для черного).

Согласно покраске \(b_1, b_2, \dots, b_n\) массив \(a\) разделяется на два новых массива \(a^{(0)}\) и \(a^{(1)}\), где \(a^{(0)}\) — это подпоследовательность всех белых элементов в \(a\), а \(a^{(1)}\) — это подпоследовательность всех черных элементов в \(a\). Например, если \(a = [1,2,3,4,5,6]\) и \(b = [0,1,0,1,0,0]\), то \(a^{(0)} = [1,3,5,6]\) и \(a^{(1)} = [2,4]\).

Количество отрезков в массиве \(c_1, c_2, \dots, c_k\), обозначаемое \(\mathit{seg}(c)\), — это количество элементов, которое останется, если объединить все соседние элементы с одинаковым значением в \(c\). Например, количество отрезков в \([1,1,2,2,3,3,3,2]\) равно \(4\), так как массив станет равным \([1,2,3,2]\) после объединения соседних элементов с одинаковым значением. В частности, количество отрезков в пустом массиве равно \(0\).

Гомер хочет найти покраску \(b\), согласно которой суммарное количество отрезков в \(a^{(0)}\) и \(a^{(1)}\), т. е. \(\mathit{seg}(a^{(0)})+\mathit{seg}(a^{(1)})\), максимально. Найдите, чему равно это значение.

Входные данные

Первая строка содержит целое число \(n\) (\(1 \leq n \leq 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq n\)).

Выходные данные

Выведите единственное число — максимально возможное суммарное количество отрезков.

Примечание

В первом примере можно выбрать \(a^{(0)} = [1,2,3,3]\), \(a^{(1)} = [1,2,3]\) и \(\mathit{seg}(a^{(0)}) = \mathit{seg}(a^{(1)}) = 3\). Таким образом, ответ \(3+3 = 6\).

Во втором примере можно выбрать \(a^{(0)} = [1,2,3,4,5,6,7]\) и \(a^{(1)}\) пустое. Мы видим, что \(\mathit{seg}(a^{(0)}) = 7\) и \(\mathit{seg}(a^{(1)}) = 0\). Таким образом, ответ \(7+0 = 7\).

B2. Покраска массива II

дп жадные алгоритмы Конструктив реализация Структуры данных *2100

Единственное различие между двумя версиями задачи заключается в том, что в этой версии вам нужно найти минимальный возможный ответ.

Гомеру очень нравятся массивы. Сегодня он красит массив \(a_1, a_2, \dots, a_n\) двумя видами цветов, белым и черным. Покраска массива \(a_1, a_2, \dots, a_n\) описывается массивом \(b_1, b_2, \dots, b_n\), где \(b_i\) обозначает цвет \(a_i\) (\(0\) для белого и \(1\) для черного).

Согласно покраске \(b_1, b_2, \dots, b_n\) массив \(a\) разделяется на два новых массива \(a^{(0)}\) и \(a^{(1)}\), где \(a^{(0)}\) — это подпоследовательность всех белых элементов в \(a\), а \(a^{(1)}\) — это подпоследовательность всех черных элементов в \(a\). Например, если \(a = [1,2,3,4,5,6]\) и \(b = [0,1,0,1,0,0]\), то \(a^{(0)} = [1,3,5,6]\) и \(a^{(1)} = [2,4]\).

Количество отрезков в массиве \(c_1, c_2, \dots, c_k\), обозначаемое \(\mathit{seg}(c)\),  — это количество элементов, которое останется, если объединить все соседние элементы с одинаковым значением в \(c\). Например, количество отрезков в \([1,1,2,2,3,3,3,2]\) равно \(4\), так как массив станет равным \([1,2,3,2]\) после объединения соседних элементов с одинаковым значением. В частности, количество отрезков в пустом массиве равно \(0\).

Гомер хочет найти покраску \(b\), согласно которой суммарное количество отрезков в \(a^{(0)}\) и \(a^{(1)}\), т. е. \(\mathit{seg}(a^{(0)})+\mathit{seg}(a^{(1)})\), минимально. Найдите, чему равно это значение.

Входные данные

Первая строка содержит целое число \(n\) (\(1 \leq n \leq 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq n\)).

Выходные данные

Выведите единственное число — минимально возможное суммарное количество отрезков.

Примечание

В первом примере можно выбрать \(a^{(0)} = [1,1,2,2]\), \(a^{(1)} = [2,3]\) и \(\mathit{seg}(a^{(0)}) = \mathit{seg}(a^{(1)}) = 2\). Таким образом, ответ \(2+2 = 4\).

Во втором примере можно выбрать \(a^{(0)} = [1,1,1,1]\), \(a^{(1)} = [2,2,2]\) и \(\mathit{seg}(a^{(0)}) = \mathit{seg}(a^{(1)}) = 1\). Таким образом, ответ \(1+1 = 2\).

A. Средство от бессонницы

Конструктив математика реализация *800

«Раз дракон. Два дракон. Три дракон», — считала принцесса. У нее была бессонница, а считать барашков ей надоело еще в девять лет.

Впрочем, считать драконов просто так тоже было скучно, поэтому она развлекалась как могла. Этой ночью она представляла, что все посчитанные драконы явились сюда, чтобы ее украсть, а она отбивается от них, как может. Каждого k-ого дракона она била сковородкой по морде. Каждому l-ому — прищемляла хвост балконной дверью. Каждому m-ому — наступала на лапу острым каблучком. Наконец, каждому n-ому она грозила позвать мамочку, и он в ужасе ретировался.

Скольким воображаемым драконам успела нанести моральный или физический ущерб принцесса, если всего она насчитала d драконов?

Входные данные

Входные данные содержат целые числа k, l, m, n и d, каждое число в отдельной строке (1 ≤ k, l, m, n ≤ 10, 1 ≤ d ≤ 105).

Выходные данные

Выведите количество пострадавших драконов.

Примечание

В первом примере каждый первый дракон был жестоко бит сковородкой. Некоторым доставалось также от дверей и каблучков, но даже сковородки хватало всем.

Во втором примере неповрежденными остались драконы 1, 7, 11, 13, 17, 19 и 23.

B. Побег

математика реализация *1500

Принцесса собирается сбежать из пещеры дракона. Это нужно как следует спланировать.

Принцесса бегает со скоростью vp миль в час, дракон летает со скоростью vd миль в час. Дракон обнаружит побег через t часов и немедленно бросится в погоню. Затея кажется безнадежной, но принцесса заметила, что дракон очень жаден и не очень умен. Чтобы задержать его, принцесса решает прихватить с собой несколько драгоценностей из его сокровищницы. Когда дракон догоняет принцессу, она может бросить на землю драгоценность; тогда дракон остановится, подберет упавшее, вернется в пещеру и потратит f часов в самой пещере на возвращение вещицы на место и наведение порядка в сокровищнице, после чего вновь отправится в погоню, начиная все с самого начала.

Предполагая, что принцесса будет бежать по прямой без остановок, сколько драгоценностей ей нужно взять с собой, чтобы успеть добраться до королевского замка, расположенного на расстоянии c миль от пещеры дракона? Если дракон догоняет принцессу в тот момент, когда она добегает до замка, считается, что она успела раньше (дополнительная драгоценность не нужна).

Входные данные

Входные данные содержат целые числа vp, vd, t, f и c (1 ≤ vp, vd ≤ 100, 1 ≤ t, f ≤ 10, 1 ≤ c ≤ 1000), каждое число записано в отдельной строке.

Выходные данные

Выведите минимальное количество драгоценностей, необходимых для того, чтобы побег удался.

Примечание

В первом примере через час после побега принцесса будет находиться на расстоянии 1 от пещеры, а дракон обнаружит побег. Через 2 часа после побега дракон догонит принцессу на расстоянии 2 от пещеры, и ей нужно будет расстаться с первой драгоценностью. Возвращение в пещеру и возня в сокровищнице займет у дракона еще два часа; за это время принцесса убежит на расстояние 4 от пещеры. Во второй раз дракон догонит принцессу на расстоянии 8 от пещеры, и ей понадобится вторая драгоценность, после чего она спокойно добежит до замка.

Второй пример аналогичен первому, но второй раз дракон догонит принцессу ровно в тот момент, когда она добежит до замка, и вторая драгоценность ей не понадобится.

B. Великий герой

жадные алгоритмы реализация сортировки *900

Великий герой охраняет страну, где живет Гомер. У героя есть сила атаки \(A\) и начальное количество здоровья \(B\). Перед героем стоят \(n\) монстров. \(i\)-й монстр имеет силу атаки \(a_i\) и начальное количество здоровья \(b_i\).

Герой или монстр жив, если его здоровье положительно (больше или равно \(1\)); и мертв, если его здоровье не положительно (меньше или равно \(0\)).

Чтобы защитить людей в стране, герой будет сражаться с монстрами до тех пор, пока либо герой не умрет, либо все монстры не умрут.

  • В каждой схватке герой может выбрать произвольного живого монстра и сразиться с ним. Предположим, что выбран \(i\)-й монстр, а количества здоровья героя и \(i\)-го монстра перед боем равны \(x\) и \(y\) соответственно. После боя количества здоровья героя и \(i\)-го монстра становятся соответственно \(x-a_i\) и \(y-A\).

Заметьте, что герой может сражаться с одним и тем же монстром несколько раз.

Для безопасности людей в стране, пожалуйста, скажите им, может ли великий герой убить всех монстров (даже если великий герой сам умрет после убийства последнего монстра).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Описание наборов входных данных приведено ниже.

Первая строка каждого набора входных данных содержит три целых числа \(A\) (\(1 \leq A \leq 10^6\)), \(B\) (\(1 \leq B \leq 10^6\)) и \(n\) (\(1 \leq n \leq 10^5\)) — силу атаки великого героя, начальное количество здоровья великого героя и количество монстров соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq 10^6\)), где \(a_i\) обозначает силу атаки \(i\)-го монстра.

Третья строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \leq b_i \leq 10^6\)), где \(b_i\) обозначает начальное значение здоровья \(i\)-го монстра.

Гарантируется, что сумма \(n\) по всех наборах входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ «YES» (без кавычек), если великий герой может убить всех монстров, в противном случае выведите «NO» (без кавычек).

Примечание

В первом наборе входных данных будет \(6\) боев между героем и единственным монстром. После этого монстр умирает, а количество здоровья героя становится \(17 - 6 \times 2 = 5 > 0\). Поэтому ответ: «YES», а кроме того, герой все еще жив.

Во втором наборе входных данных после того, как все монстры мертвы, значение здоровья героя станет \(709\) независимо от порядка всех боев. Таким образом, ответ «YES».

В третьем наборе входных данных возможный порядок — сражаться с \(1\)-м, \(2\)-м, \(3\)-м и \(4\)-м монстрами в этом порядке. После всех поединков количество здоровья героя становится \(-400\). К сожалению, герой мертв, но все монстры тоже мертвы. Так что ответ: «YES».

В четвертом наборе входных данных герой умирает, но монстр остается живым с количеством здоровья, равным \(1000 - 999 = 1\). Таким образом, ответ «NO».

B. Новая колония

жадные алгоритмы Перебор реализация *1100

Достигнув нужной планеты вы решили основать здесь колонию. Так как на планете множество гор, а для колонии нужна ровная поверхность, вы решили выровнять горы, используя валуны (во сне эта идея показалась вам вполне логичной).

Вам задан массив \(h_1, h_2, \dots, h_n\), в котором \(h_i\) — это высота \(i\)-й горы, и \(k\) — количество валунов в вашем распоряжении.

Вы начинаете сбрасывать валуны над первой горой по одному, и каждый валун будет двигаться следующим образом (предположим, высота текущей горы равна \(h_i\)):

  • если \(h_i \ge h_{i + 1}\), валун перекатится на следующую гору;
  • если \(h_i < h_{i + 1}\), валун остановится и увеличит высоту текущей горы на \(1\) (\(h_i = h_i + 1\));
  • если валун достигает последней горы, то он упадет в специальную систему сбора остатков и исчезнет.

Ваша задача — определить финальную позицию \(k\)-го валуна или сказать, что он упадет в систему сбора.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк. В первой строке каждого набора заданы два целых числа \(n\) и \(k\) (\(1 \le n \le 100\); \(1 \le k \le 10^9\)) — количество гор и валунов.

Во второй строке заданы \(n\) целых чисел \(h_1, h_2, \dots, h_n\) (\(1 \le h_i \le 100\)) — высоты гор.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(100\).

Выходные данные

Для каждого набора входных данных выведите \(-1\), если \(k\)-й валун упадет в систему сбора. В противном случае выведите позицию \(k\)-го валуна.

Примечание

Промоделируем первый набор входных данных:

  • Первый валун появляется в \(i = 1\); так как \(h_1 \ge h_2\), он перемещается в \(i = 2\), и остается там, так как \(h_2 < h_3\).
  • Новые высоты будут равны \([4,2,2,3]\).
  • Второй валун появляется в \(i = 1\); так как \(h_1 \ge h_2\), валун перемещается в \(i = 2\); так как \(h_2 \ge h_3\), валун перемещается в \(i = 3\), и остается там, как как \(h_3 < h_4\).
  • Новые высоты будут равны \([4,2,3,3]\).
  • Третий валун появляется в \(i = 1\); так как \(h_1 \ge h_2\), перемещается в \(i = 2\), и остается там, так как \(h_2 < h_3\).
  • Новые высоты будут равны \([4,3,3,3]\).

Позиции, в которых каждый валун остановится, следующие: \([2,3,2]\).

Во втором наборе все \(7\) валунов останутся прямо на первой горе, увеличивая ее высоту от \(1\) до \(8\).

Третий набор входных данных похож на первый, но в данном случае вы сбросите \(5\) валунов. Первые три будут вести себя аналогично первому набору входных данных. После этого высоты гор станут равны \([4, 3, 3, 3]\), а потому оставшиеся два валуна упадут в систему сбора.

В четвертом наборе первый и единственный валун упадет прямо в систему сбора.

D. AB граф

графы жадные алгоритмы Конструктив Перебор реализация *2000

Ваш друг Salem — брат Warawreh, и ему нравятся только математические и геометрические задачи. Он решил уже множество таких задач, но, по словам Warawreh, чтобы успешно окончить университет, ему нужно решать больше графовых задач. Так как Salem не очень хорош в графах, он попросил вас помочь ему с такой задачей.

Вам задан полный ориентированный граф из \(n\) вершин без петель. Другими словами, у вас есть \(n\) вершин, и для каждой пары вершин \(u\) и \(v\) (\(u \neq v\)) есть две направленных дуги \((u, v)\) и \((v, u)\).

На каждой направленной дуге графа написано по одной букве: либо «a», либо «b» (дуги \((u, v)\) и \((v, u)\) могут иметь различные метки).

Вам также задано целое число \(m > 0\). Вам нужно найти путь длины \(m\) такой, что строка, полученная выписыванием букв на дугах в порядке из обхода, будет являться палиндромом. Длина пути — это количество дуг в нем.

Вы можете посещать одни и те же вершины и дуги произвольное количество раз.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(m\) (\(2 \leq n \leq 1000\); \(1 \leq m \leq 10^{5}\)) — количество вершин в графе и желаемая длина палиндрома.

В следующих \(n\) строках задано по \(n\) символов. \(j\)-й символ \(i\)-й строки описывает символ, написанный на дуге из вершины \(i\) в вершину \(j\).

Каждый символ — это «a» или «b», если \(i \neq j\), либо же «*», если \(i = j\), так как граф не содержит петель.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(1000\) и сумма \(m\) не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных, если возможно найти такой путь, выведите «YES» и сам путь как последовательность из \(m + 1\) целых чисел: номера вершин в пути в порядке обхода. Если существует несколько возможных путей, выведите любой из них.

В противном случае (если ответа нет), выведите «NO».

Примечание

Граф для первых трех наборов входных данных изображен ниже:

В первом наборе ответ — это последовательность \([1,2]\), означающая следующий путь:

\(\)1 \xrightarrow{\text{b}} 2\(\)

Таким образом, полученная строка равна b.

Во втором наборе ответ — это последовательность \([2,1,3,2]\), означающая следующий путь:

\(\)2 \xrightarrow{\text{b}} 1 \xrightarrow{\text{a}} 3 \xrightarrow{\text{b}} 2\(\)

Таким образом, полученная строка равна bab.

В третьем наборе ответ — это последовательность \([1,3,1,3,1]\), означающая следующий путь:

\(\)1 \xrightarrow{\text{a}} 3 \xrightarrow{\text{a}} 1 \xrightarrow{\text{a}} 3 \xrightarrow{\text{a}} 1\(\)

Таким образом, полученная строка равна aaaa.

Строка, полученная в четвертом наборе, равна abaaba.

B. Восстановление модуля

математика реализация *1500

За первое место на олимпиаде Лёше подарили много массивов целых чисел, уверив его, что эти массивы очень дорогие. Сразу после награждения Лёша принял решение продать их. На двери пункта приема массивов было сказано, что принимаются только массивы, которые можно сжать в генератор, работающий по следующему принципу:

На вход генератору дается четверка целых чисел \(n\), \(m\), \(c\), \(s\), при этом \(n\) и \(m\) положительны, \(s\) неотрицательно, а для \(c\) верно, что \(0 \leq c < m\). Массив \(a\) из \(n\) элементов генерируется по следующим правилам:

  • \(a_1 = s \bmod m\), где \(x \bmod y\) обозначает остаток от деления \(x\) на \(y\);
  • \(a_i = (a_{i-1} + c) \bmod m\) для всех \(i\) таких, что \(1 < i \le n\).

Например, если \(n = 5\), \(m = 7\), \(c = 4\), а \(s = 10\), то \(a = [3, 0, 4, 1, 5]\).

Цена такого массива вычисляется очень просто — это значение \(m\) в этой четверке чисел.

Лёше стало интересно, сколько денег он может потребовать за каждый свой массив. Помогите Лёше определить для каждого массива, можно ли его задать какой-нибудь четверкой чисел \(n\), \(m\), \(c\), \(s\), и, если да, найти максимальное значение \(m\) среди всех подходящих четверок.

Входные данные

На первой строке находится целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество массивов.

Первая строка описания массива содержит целое число \(n\) (\(1 \leq n \leq 10^5\)) — размер очередного массива, полученного Лешей.

Вторая строка описания массива содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^9\) ) — элементы массива.

Гарантируется, что суммарный размер массивов не превосходит \(10^5\).

Выходные данные

Для каждого массива выведите:

  • \(-1\), если нет такой четверки чисел, что генерирует этот массив;
  • \(0\), если есть четверки чисел со сколь угодно большим \(m\);
  • максимальное значение \(m\) и любое подходящее \(c\) (\(0 \leq c < m\)) в остальных случаях.

C. Базовая дипломатия

жадные алгоритмы Конструктив Перебор реализация *1600

У Алексея есть \(n\) друзей. А ещё Алексей сейчас в отпуске, поэтому у него есть целых \(m\) дней, чтобы поиграть в эту новую популярную кооперативную игру! Поскольку эта игра кооперативная, Алексею нужен один сокомандник в каждый из \(m\) дней.

Каждый день какие-то его друзья свободны и готовы играть в эту игру, а остальные заняты и не могут. Каждый день Алексей должен выбрать одного из свободных друзей и предложить ему поиграть (а тот, разумеется, согласится). Однако если какой-то из друзей будет играть с Алексеем суммарно строго больше \(\left\lceil\dfrac{m}{2}\right\rceil\) раз (округление вверх), то все остальные обидятся. Конечно же, Алексей не хочет никого обижать.

Помогите ему выбрать сокомандников таким образом, чтобы никто не играл с Алексеем суммарно строго больше \(\left\lceil\dfrac{m}{2}\right\rceil\) раз.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два натуральных числа \(n\) и \(m\) (\(1\leq n, m\leq 100\,000\)) — количество друзей и количество дней, соответственно.

В \(i\)-й из следующих \(m\) строк содержится натуральное число \(k_i\) (\(1\leq k_i\leq n\)), за которым следуют \(k_i\) попарно различных целых чисел \(f_{i1}\), ..., \(f_{ik_i}\) (\(1\leq f_{ij}\leq n\)), разделённых пробелами — свободные друзья в день \(i\).

Гарантируется, что сумма значений \(n\) и сумма значений \(m\) по всем наборам входных данных не превосходят \(100\,000\). Гарантируется, что сумма всех \(k_i\) по всем дням всех наборов входных данных не превосходит \(200\,000\).

Выходные данные

Выведите ответ для каждого набора входных данных. Если невозможно никого не обидеть, то выведите «NO».

В противном случае в первой строке выведите «YES», а во второй строке выведите \(m\) целых чисел \(c_1\), ..., \(c_m\), разделённых пробелами. Каждое \(c_i\) должно быть номером друга, взятого в команду в \(i\)-й день (соответственно, это должно быть одно из чисел \(f_{ij}\)).

Никакое значение не должно встречаться больше, чем \(\left\lceil\dfrac{m}{2}\right\rceil\) раз. Если есть несколько возможных ответов, выведите любой из них.

D. Плейлист

кратчайшие пути реализация снм Структуры данных *1900

У Аркадия есть плейлист, в котором изначально \(n\) песен, пронумерованных от \(1\) до \(n\) в том порядке, в котором они находятся в плейлисте. Аркадий начинает слушать песни из плейлиста друг за другом, начиная с песни \(1\). Плейлист зациклен, то есть после того, как он прослушает последнюю песню, он опять начнет слушать с начала плейлиста.

У каждой песни есть жанр, определяемый натуральным числом \(a_i\). Пусть Аркадий только что прослушал песню с жанром \(y\), а до нее — песню с жанром \(x\). Если \(\operatorname{gcd}(x, y) = 1\), он думает, что песни не сочетаются, и удаляет последнюю прослушанную песню (с жанром \(y\)) из плейлиста. После этого он продолжает слушать песни как обычно, пропуская уже удаленные, при этом он забывает, что слушал какие-то песни до удаления. Иными словами, он не может удалить песню сразу после того, как удалил предыдущую. Здесь \(\operatorname{gcd}(x, y)\) обозначает наибольший общий делитель (НОД) чисел \(x\) и \(y\).

Например, если жанры песен в начальном плейлисте равны \([5, 9, 2, 10, 15]\), то прослушивание происходит следующим образом: [5, 9, 2, 10, 15] \(\to\) [5, 9, 2, 10, 15] \(\to\) [5, 2, 10, 15] (т. к. \(\operatorname{gcd}(5, 9) = 1\)) \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 2, 10, 15] \(\to\) [5, 10, 15] (т. к. \(\operatorname{gcd}(5, 2) = 1\)) \(\to\) [5, 10, 15] \(\to\) [5, 10, 15] \(\to\) ... Жирным выделены последние две прослушанные песни. Обратите внимание, после удаления некоторой песни Аркадий забывает, что слушал ее и предыдущую.

Вам дан начальный плейлист, определите, какие песни будут в итоге удалены и в каком порядке.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(1 \le n \le 10^5\)) — количество песен.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — жанры песен.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку. Сначала выведите одно целое число \(k\) — количество песен, которые будут удалены. Затем выведите \(k\) различных целых чисел — номера удаленных песен в порядке удаления.

Примечание

Первый набор входных данных объяснен в условии.

Во втором наборе плейлист изменяется следующим образом: [1, 2, 4, 2, 4, 2] \(\to\) [1, 2, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] (т. к. \(\operatorname{gcd}(1, 2) = 1\)) \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [1, 4, 2, 4, 2] \(\to\) [4, 2, 4, 2] (т. к. \(\operatorname{gcd}(2, 1) = 1\)) \(\to\) [4, 2, 4, 2] \(\to\) ...

Во третьем наборе плейлист изменяется следующим образом: [1, 2] \(\to\) [1, 2] \(\to\) [1] (т. к. \(\operatorname{gcd}(1, 2) = 1\)) \(\to\) [1] \(\to\) [1] (Аркадий послушал одну и ту же песню подряд дважды) \(\to\) [] (т. к. \(\operatorname{gcd}(1, 1) = 1\)).

Четвертый набор входных данных совпадает с предыдущим после удаления второй песни.

В пятом примере Аркадий слушает одну и ту же песню снова и снова, но т. к. \(\operatorname{gcd}(2, 2) \ne 1\), он не удаляет ее.

B. Замена и возрастание

дп математика реализация *1200

Дано положительное целое число \(k\). Два массива называются \(k\)-похожими, если:

  • они строго возрастающие;
  • они имеют одинаковую длину;
  • все их элементы — это положительные целые числа между \(1\) и \(k\) (включительно);
  • они различаются в ровно одной позиции.

Вам дано число \(k\), строго возрастающий массив \(a\) и \(q\) запросов. Для каждого запроса вам даны два целых числа \(l_i \leq r_i\). Ваша задача найти, сколько массивов \(b\) существует таких, что \(b\) \(k\)-похож на массив \([a_{l_i},a_{l_i+1}\ldots,a_{r_i}]\).

Входные данные

В первой строке находятся три целых числа \(n\), \(q\) и \(k\) (\(1\leq n, q \leq 10^5\), \(n\leq k \leq 10^9\)) — длина массива \(a\), количество запросов и число \(k\).

Во второй строке находятся \(n\) целых чисел \(a_1, a_2, \ldots,a_n\) (\(1 \leq a_i \leq k\)). Этот массив строго возрастающий: \(a_1 < a_2 < \ldots < a_n\).

Каждая из следующих \(q\) строк содержит два целых числа \(l_i\), \(r_i\) (\(1 \leq l_i \leq r_i \leq n\)).

Выходные данные

Выведите \(q\) строк. \(i\)-я из них должна содержать ответ на \(i\)-й запрос.

Примечание

В первом примере:

В первом запросе есть \(4\) массива, которые \(5\)-похожи на \([2,4]\): \([1,4],[3,4],[2,3],[2,5]\).

Во втором запросе есть \(3\) массива, которые \(5\)-похожи на \([4,5]\): \([1,5],[2,5],[3,5]\).

A. Сдвигая стопки

жадные алгоритмы реализация *900

У вас есть \(n\) стопок из блоков. В \(i\)-й стопке изначально \(h_i\) блоков и ее высота — это число блоков в ней. За один ход вы можете взять блок из \(i\)-й стопки (если в ней есть хотя бы один блок) и переложить его в \(i + 1\)-ю стопку. Можно ли сделать высоты блоков строго возрастающими?

Обратите внимание, что количество стопок всегда остается равно \(n\): стопки не исчезают, когда у них становится \(0\) блоков.

Входные данные

В первой строке находится единственное целое число \(t\) \((1 \leq t \leq 10^4)\) — число наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) \((1 \leq n \leq 100)\). Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(h_i\) \((0 \leq h_i \leq 10^9)\) — изначальные высоты стопок.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

Для каждого набора вxодных данных выведите YES, если вы можете сделать последовательность высот строго возрастающей и NO иначе.

Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ).

Примечание

В первом примере не нужно делать никаких действий, последовательность высот уже возрастающая.

Во втором примере мы должны переложить один блок с первой стопки на вторую. Тогда последовательность высот становится \(0\) \(1\).

В третьем примере мы можем подвинуть один блок с первой стопки на вторую, а потом его же со второй стопки на третью и получим последовательность высот \(3\) \(4\) \(5\).

В четвертом примере мы не можем сделать никакое действие, а последовательность высот не возрастает, откуда ответ NO.

В пятом примере мы можем сделать только одно действие (переложить блок с второй на третью стопку) и получим последовательность высот \(0\) \(0\) \(1\). Ни \(0\) \(1\) \(0\), ни \(0\) \(0\) \(1\) не являются возрастающими, откуда ответ NO.

A. Арена

реализация сортировки *800

\(n\) героев сражаются друг с другом на арене. Изначально \(i\)-й герой имеет уровень \(a_i\).

Каждую минуту происходит битва между двумя разными героями. Эти герои могут быть выбраны произвольно (возможно даже, что это те же самые два героя, которые сражались в последнюю минуту).

Когда сражаются два героя равных уровней, никто не выигрывает. Когда сражаются два героя разных уровней, побеждает тот, у кого уровень выше, и его уровень увеличивается на \(1\).

Победитель турнира — первый герой, который победит по крайней мере в \(100^{500}\) боях (обратите внимание, что возможна ситуация, в которой турнир длится бесконечно и никто не набирает нужное кол-во побед, тогда победителя нет). A возможный победитель — это такой герой, что существует последовательность боев, в которой этот герой становится победителем турнира.

Вычислите количество возможных победителей среди \(n\) героев.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных.

Каждый набор состоит из двух строк. Первая строка содержит одно целое число \(n\) (\(2 \le n \le 100\)) — количество героев. Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)), где \(a_i\) — начальный уровень \(i\)-го героя.

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество возможных победителей среди заданных \(n\) героев.

Примечание

В первом наборе входных данных примера из условия только первый герой может оказаться победителем.

Во втором наборе входных данных в каждой битве между героями никто не побеждает, и турнир длится бесконечно без победителя.

C. Как можно меньше ничьих

графы жадные алгоритмы Конструктив математика Перебор поиск в глубину и подобное реализация *1500

Скоро состоится большой футбольный чемпионат! \(n\) команд будут участвовать в нем, и каждая пара различных команд сыграет ровно один матч друг с другом.

У матча может быть два различных исхода:

  • матч может закончиться вничью, тогда обе команды получат по \(1\) очку;
  • одна из команд может победить, тогда победившая команда получит \(3\) очка, а проигравшая — \(0\).

Счет команды — суммарное количество очков, полученное командой за все матчи, в которых она играла.

Вас интересует гипотетическая ситуация, в которой все команды будут в конце чемпионата иметь одинаковый счет. Простой пример такой ситуации — если все матчи закончатся вничью, но вас интересует подобная ситуация с минимально возможным количеством ничьих.

Ваша задача — найти ситуацию (выбрать результат каждой игры), в которой у всех команд одинаковый итоговый счет, а количество ничьих минимально возможно.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Затем следуют сами наборы входных данных. Каждый набор описывается одной строкой, содержащей целое число \(n\) (\(2 \le n \le 100\)) — количество команд.

Выходные данные

Для каждого набора входных данных выведите \(\frac{n(n - 1)}{2}\) целых чисел, описывающих результаты игр в следующем порядке: первое число соответствует результату матча между командой \(1\) и командой \(2\), второе — между командой \(1\) и командой \(3\), затем \(1\) и \(4\), ..., \(1\) и \(n\), \(2\) и \(3\), \(2\) и \(4\), ..., \(2\) и \(n\), и так далее, до результата матча между командой \(n - 1\) и командой \(n\).

Число, соответствующее результату матча между командой \(x\) и командой \(y\), должно быть равно \(1\), если побеждает команда \(x\), \(-1\), если побеждает команда \(y\), или \(0\), если матч заканчивается вничью.

Все команды должны иметь одинаковый итоговый счет, и количество ничьих должно быть минимально возможным. Если оптимальных ответов несколько — выведите любой из них. Можно показать, что всегда есть способ составить результаты игр так, что все команды имеют одинаковый итоговый счет.

Примечание

В первом наборе входных данных из примера обе команды получают по \(1\) очку, так как их матч заканчивается вничью.

Во втором наборе входных данных из примера команда \(1\) побеждает команду \(2\) (команда \(1\) получает \(3\) очка), команда \(1\) проигрывает команде \(3\) (команда \(3\) получает \(3\) очка), и команда \(2\) выигрывает у команды \(3\) (команда \(2\) получает \(3\) очка).

E. Дешевый обед

графы жадные алгоритмы Перебор реализация сортировки Структуры данных *2000

Иван хочет полноценно пообедать. Для этого он хочет заказать первое, второе, напиток и десерт.

Всего на выбор у Ивана есть \(n_1\) разных первых блюд (\(i\)-е первое стоит \(a_i\) монет), \(n_2\) разных вторых блюд (\(i\)-е второе стоит \(b_i\) монет), \(n_3\) разных напитков (\(i\)-й напиток стоит \(c_i\) монет) и \(n_4\) разных десертов (\(i\)-й десерт стоит \(d_i\) монет).

Некоторые блюда не сочетаются между собой. Всего есть \(m_1\) пар из первого и второго, которые не сочетаются, \(m_2\) несочетающихся пар из второго и напитка и \(m_3\) несочетающихся пар из напитка и десерта.

Иван хочет купить ровно одно первое, одно второе, один напиток и один десерт так, чтобы они хорошо сочетались между собой и их общая стоимость была наименьшей возможной. Помогите ему найти самый бюджетный вариант!

Входные данные

В первой строке заданы четыре целых числа \(n_1\), \(n_2\), \(n_3\) и \(n_4\) (\(1 \le n_i \le 150000\)) — количество видов первого, второго, напитков и десертов соответственно.

Далее следуют четыре строки. В первой строке заданы \(n_1\) целых чисел \(a_1, a_2, \dots, a_{n_1}\) (\(1 \le a_i \le 10^8\)), где \(a_i\) — это цена \(i\)-го вида первого блюда. Следующие три строки описывают цены вторых блюд, напитков и десертов в том же формате (\(1 \le b_i, c_i, d_i \le 10^8\)).

В следующей строке задан одно целое число \(m_1\) (\(0 \le m_1 \le 200000\)) — количество несочетающихся пар из первого и второго блюд. В каждой из следующих \(m_1\) строк заданы два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i \le n_1\); \(1 \le y_i \le n_2\)) означающие, что первое блюдо номер \(x_i\) не сочетается со вторым блюдом номер \(y_i\). Все пары различные.

Блок несочетающихся пар из второго блюда и напитка задан в аналогичном формате. В таком же формате заданы и несочетающиеся пары из напитка и десерта (\(0 \le m_2, m_3 \le 200000\)).

Выходные данные

Если невозможно выбрать первое, второе, напиток и десерт, сочетающиеся друг с другом, выведите \(-1\). В противном случае выведите одно число — наименьшую суммарную стоимость обеда.

Примечание

Оптимальный вариант в первом примере — это выбрать первое блюдо номер \(2\), второе номер \(1\), напиток номер \(2\) и десерт номер \(1\).

Во втором примере, единственная пара из первого и второго не сочетается, а потому невозможно выбрать обед.

A. Командировка

жадные алгоритмы реализация сортировки *900

Какая радость! Родители Пети уехали в командировку на целый год, предоставив шаловливого мальчугана самому себе. Петя обрадовался неимоверно. Он прыгал на кровати и бросался подушками целыми днями напролет, пока...

Сегодня Петя полез в буфет и обнаружил там страшную записку. Родители поручили сыну поливать их любимый цветок весь год, каждый день, утром, в обед и вечером. «Стоп!» — подумал Петя. Он точно знал, что если выполнять поручение родителей в течение i-го (1 ≤ i ≤ 12) месяца года, то цветок вырастет на ai сантиметров, а если не поливать цветок в i-ый месяц, то цветок за этот месяц не вырастет. Также Петя знает, что родители ни за что на свете не поверят, что он поливал цветок, если цветок вырастет строго меньше, чем на k сантиметров.

Помогите Пете выбрать минимальное количество месяцев, в которые он будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров.

Входные данные

Первая строка содержит ровно одно целое число k (0 ≤ k ≤ 100). В следующей строке записаны двенадцать целых чисел, разделенных пробелами: i-ое (1 ≤ i ≤ 12) число в строке обозначает ai (0 ≤ ai ≤ 100).

Выходные данные

Выведите единственное целое число — минимальное количество месяцев, в которые Петя будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров. Если цветок не сможет вырасти на k сантиметров за год, выведите -1.

Примечание

Рассмотрим первый тестовый пример. В нем достаточно поливать цветок в течение седьмого и девятого месяца, тогда цветок вырастет ровно на пять сантиметров.

Во втором тестовом примере родители поверят Пете, даже если цветок совсем не вырастет (k = 0). Значит, Петя может не поливать цветок вовсе.

A. Командировка

жадные алгоритмы реализация сортировки *900

Какая радость! Родители Пети уехали в командировку на целый год, предоставив шаловливого мальчугана самому себе. Петя обрадовался неимоверно. Он прыгал на кровати и бросался подушками целыми днями напролет, пока...

Сегодня Петя полез в буфет и обнаружил там страшную записку. Родители поручили сыну поливать их любимый цветок весь год, каждый день, утром, в обед и вечером. «Стоп!» — подумал Петя. Он точно знал, что если выполнять поручение родителей в течение i-го (1 ≤ i ≤ 12) месяца года, то цветок вырастет на ai сантиметров, а если не поливать цветок в i-ый месяц, то цветок за этот месяц не вырастет. Также Петя знает, что родители ни за что на свете не поверят, что он поливал цветок, если цветок вырастет строго меньше, чем на k сантиметров.

Помогите Пете выбрать минимальное количество месяцев, в которые он будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров.

Входные данные

Первая строка содержит ровно одно целое число k (0 ≤ k ≤ 100). В следующей строке записаны двенадцать целых чисел, разделенных пробелами: i-ое (1 ≤ i ≤ 12) число в строке обозначает ai (0 ≤ ai ≤ 100).

Выходные данные

Выведите единственное целое число — минимальное количество месяцев, в которые Петя будет поливать цветок, так чтобы цветок вырос не менее чем на k сантиметров. Если цветок не сможет вырасти на k сантиметров за год, выведите -1.

Примечание

Рассмотрим первый тестовый пример. В нем достаточно поливать цветок в течение седьмого и девятого месяца, тогда цветок вырастет ровно на пять сантиметров.

Во втором тестовом примере родители поверят Пете, даже если цветок совсем не вырастет (k = 0). Значит, Петя может не поливать цветок вовсе.

B. Марсианские часы

реализация *1600

Пока дома никого нет, Петя решил тайком посмотреть в интернете запрещенные фильмы. «Как некрасиво!» — скажете вы, но не спешите судить мальчугана. В стране, в которой он живет, запрещены фильмы про марсиан, да и вообще про любые внеземные цивилизации. Это было очень несправедливо по отношению к Пете, ведь он так любил увлекательные космические истории с лазерами и роботами.

Сегодня Петя смотрит шокирующий блокбастер про марсиан с загадочным названием «R2:D2». Что же это такое, «R2:D2»? Кажется, это марсианское время, записанное в марсианской системе счисления. Петя знает, что время на Марсе считается в точности как на Земле (то есть 24 часа, в каждом часе 60 минут) и записывается в виде «a:b», где строка a — обозначает количество часов (от 0 до 23 включительно), а строка b — количество минут (от 0 до 59 включительно). Единственное, что Петя не знает — в какой системе счисления записано марсианское время.

Ваша задача — вывести основания всех систем счисления, в которых могло бы быть записано время «a:b».

Входные данные

В первой строке записана единственная строка в виде «a:b» (без кавычек), где a — непустая строка, состоящая из цифр и прописных букв латинского алфавита, обозначающая количество часов, а строка b — непустая строка, состоящая из цифр и прописных букв латинского алфавита, обозначающая количество минут. Длины строк a и b — от 1 до 5 символов, включительно. Обратите внимание, в строках a и b могут быть лидирующие нули, которые никак не влияют на ответ (например, строка «008:1» в десятичной системе счисления обозначает корректно записанное время).

Мы считаем, что символы 0, 1, ..., 9 обозначают соответствующие цифры записи числа в некоторой системе счисления, а символы A, B, ..., Z обозначают цифры 10, 11, ..., 35.

Выходные данные

Выведите основания систем счисления, в которых могло бы быть записано время «a:b», в возрастающем порядке. Разделяйте числа пробелами или переводами строк. Если не существует ни одной системы счисления, в которой может быть записано время «a:b», выведите единственное целое число 0. Если существует бесконечно много систем счисления, в которых могло бы быть записано время «a:b», выведите единственное целое число -1.

Обратите внимание, что на Марсе возможны любые позиционные системы счисления с положительными основаниями строго больше единицы.

Примечание

Рассмотрим первый тестовый пример. Строка «11:20» может быть воспринята, например, как время 4:6, записанное в троичной системе счисления или как время 17:32 в шестнадцатеричной.

Рассмотрим второй тестовый пример. Строка «2A:13» не может быть воспринята как корректное время ни в какой системе счисления. Для примера, возьмем одинадцатиричную систему счисления. В ней данная строка обозначает время 32:14, что не является корректным временем.

Рассмотрим третий тестовый пример. Строка «000B:00001» может быть воспринята как корректное время в бесконечном количестве систем счисления. Для примера вы можете взять любую систему счисления с основанием не меньше 12.

D. Трансформация перестановки

поиск в глубину и подобное разделяй и властвуй реализация *1200

Перестановка — это последовательность длины \(n\) целых чисел от \(1\) до \(n\), в которой все числа встречаются ровно по одному разу. Например, \([1]\), \([3, 5, 2, 1, 4]\), \([1, 3, 2]\) — перестановки, а \([2, 3, 2]\), \([4, 3, 1]\), \([0]\) — нет.

Поликарпу недавно подарили перестановку \(a[1 \dots n]\) длины \(n\). Поликарпу деревья нравятся больше, чем перестановки, поэтому он хочет превратить перестановку \(a\) в корневое бинарное дерево. Массив различных целых чисел он превращает в дерево следующим образом:

  • максимальный элемент массива становится корнем дерева;
  • все элементы слева от максимума — образуют левое поддерево (которое строится по тем же правилам, но применяемым для левого участка массива), но если слева от максимума элементов нет, то у корня нет левого сына;
  • все элементы справа от максимума — образуют правое поддерево (которое строится по тем же правилам, но применяемым для правого участка массива), но если справа от максимума элементов нет, то у корня нет правого сына.

Например, если он строит дерево по перестановке \(a=[3, 5, 2, 1, 4]\), то корнем будет элемент \(a_2=5\), левым поддеревом будет дерево, которое будет построено для подмассива \(a[1 \dots 1] = [3]\), а правым — для подмассива \(a[3 \dots 5] = [2, 1, 4]\). В итоге будет построено следующее дерево:

Дерево, соответствующее перестановке \(a=[3, 5, 2, 1, 4]\).

Другой пример: пусть перестановка имеет вид \(a=[1, 3, 2, 7, 5, 6, 4]\). В этом случае дерево выглядит так:

Дерево, соответствующее перестановке \(a=[1, 3, 2, 7, 5, 6, 4]\).

Обозначим за \(d_v\) глубину вершины \(a_v\), то есть количество ребер на пути от корня до вершины с номером \(a_v\). Заметьте, что глубина корня равна нулю. По заданной перестановке \(a\) для каждой вершины найдите значение \(d_v\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 100\)) – длину перестановки.

Далее следуют \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) — перестановка \(a\).

Выходные данные

Для каждого набор входных данных выведите \(n\) значений — \(d_1, d_2, \ldots, d_n\).

A. K-е наибольшее

жадные алгоритмы Перебор реализация *800

Вам дан массив \(a\), состоящий из \(n\) целых чисел. Изначально все элементы \(a\) равны \(0\) либо \(1\). Вы должны обработать \(q\) запросов двух типов:

  • 1 x : Присвоить \(a_x\) значение \(1 - a_x\).
  • 2 k : Вывести \(k\)-й наибольший элемент массива.

Напомним, что \(k\)-й наибольший элемент массива \(b\) определяется следующим образом:

  • Сортируем массив в невозрастающем порядке, возвращаем из него \(k\)-й элемент.

Например, второй наибольший элемент массива \([0, 1, 0, 1]\) равен \(1\), так как после сортировки в невозрастающем порядке он становится равен \([1, 1, 0, 0]\), а второй элемент в этом массиве равен \(1\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 10^5\)) — длину заданного массива и количество запросов.

Во второй строке находятся \(n\) целых чисел \(a_1, a_2, a_3, \dots, a_n\) (\(0 \le a_i \le 1\)) — элементы исходного массива.

Каждая из следующих строк \(q\) содержит два целых числа. Первое из них — \(t\) (\(1 \le t \le 2\)) — тип запроса.

  • Если \(t = 1\), то второе число это \(x\) (\(1 \le x \le n\)) — позиция измененного числа. Вы должны присвоить \(a_x\) значение \(1 - a_x\).
  • Если \(t = 2\), то второе число это \(k\) (\(1 \le k \le n\)) — вы должны вывести \(k\)-й наибольший элемент массива.

Гарантируется, что будет по крайней мере один запрос второго типа (удовлетворяющий \(t = 2\)).

Выходные данные

Для каждого запроса второго типа выведите единственное целое число — ответ на запрос.

Примечание

Изначально \(a = [1, 1, 0, 1, 0]\).

В первой операции нужно вывести третье наибольшее значение, которое равно \(1\).

Вторая операция присваивает \(a_2\) значение \(0\), \(a\) становится \([1, 0, 0, 1, 0]\).

В третьей операции нужно вывести третье наибольшее значение, которое равно \(0\).

В четвертой операции нужно вывести первое наибольшее значение, которое равно \(1\).

В пятой операции нужно вывести пятое наибольшее значение, которое равно \(0\).

C. Pekora и батуты

дп жадные алгоритмы Перебор реализация Структуры данных *1700

Есть парк батутов с \(n\) батутами, расположенными в ряд. \(i\)-й из них имеет силу \(S_i\).

Pekora может прыгать по батутам в несколько проходов. Она начинает проход, прыгая на любой батут по своему выбору.

Если сейчас Pekora прыгает на батут \(i\), то батут подбросит ее в позицию \(i + S_i\), а \(S_i\) станет равно \(\max(S_i-1,1)\). Иначе говоря, \(S_i\) уменьшится на \(1\), кроме случая \(S_i=1\), когда \(S_i\) останется равно \(1\).

Если в позиции \(i + S_i\) нет батута, то этот проход завершен. В противном случае Pekora продолжит проход прыжком с батута в позиции \(i + S_i\) по принципу, описанному выше.

Pekora не может перестать прыгать во время прохода, пока не приземлится на позицию больше \(n\) (в которой нет батута). Бедная Pekora!

Pekora — непослушный кролик, и хочет разрушить парк батутов, уменьшив все \(S_i\) до \(1\). Какое минимальное количество проходов ей нужно, чтобы уменьшить все \(S_i\) до \(1\)?

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 5000\)) — количество батутов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(S_1, S_2, \dots, S_n\) (\(1 \le S_i \le 10^9\)), где \(S_i\) — это сила \(i\)-го батута.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(5000\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество проходов, за которое Pekora может уменьшить все \(S_i\) до \(1\).

Примечание

Для первого набора входных данных, ниже приведена оптимальная последовательность проходов, которые Pekora может использовать. (Жирным выделены позиции батутов, куда прыгает Pekora в очередной проход).

  • \([1,4,\textbf{2},2,\textbf{2},2,\textbf{2}]\)
  • \([1,\textbf{4},1,2,1,\textbf{2},1]\)
  • \([1,\textbf{3},1,2,\textbf{1},\textbf{1},\textbf{1}]\)
  • \([1,\textbf{2},1,\textbf{2},1,\textbf{1},\textbf{1}]\)

Для второго набора входных данных оптимальная последовательность проходов приведена ниже.

  • \([\textbf{2},3]\)
  • \([1,\textbf{3}]\)
  • \([1,\textbf{2}]\)

Для третьего набора входных данных, все \(S_i\) уже равны \(1\).

E. Почти отказоустойчивая база данных

жадные алгоритмы Конструктив Перебор поиск в глубину и подобное реализация *2500

Вы храните в базе данных массив длины \(m\). Чтобы обезопасить данные от случайного повреждения, база данных хранит не одну, а \(n\) физических копий хранимой информации.

К сожалению, недавно в базе данных произошла масштабная авария, которая потенциально изменила информацию в каждой копии.

Предполагается, что инцидент поменял не более двух элементов в каждой копии. Вам нужно восстановить исходный массив из текущего состояния базы данных.

Если существует несколько способов восстановления, найдите любой. Если нет ни одного массива, отличающегося от каждой копии не более чем в двух позициях, определите это тоже.

Входные данные

В первой строке задано два целых числа \(n\) и \(m\) (\(2 \le n\); \(1 \le m\); \(n \cdot m \le 250\,000\)) — количество физических копий исходной информации и размер массива исходной информации, соответственно.

В каждой из следующих \(n\) строк задан массив из \(m\) чисел \(s_{i, 1}, s_{i, 2}, \dots, s_{i, m}\) (\(1 \le s_{i, j} \le 10^9\)) — очередная физическая копия в базе данных после аварии.

Выходные данные

Если можно восстановить массив, который мог бы представлять исходную информацию, то выведите в первой строке слово «Yes», и во второй строке сам массив из ровно \(m\) чисел от \(1\) до \(10^9\).

Если возможных ответов несколько, то выведите любой.

Если ни одного ответа нет, то выведите в единственной строке слово «No».

Примечание

В первом примере массив \([1, 10, 1, 100]\) отличается от первой и второй физических копий ровно в одной позиции, от третьей физической копии ровно в двух позициях.

Во втором примере массив \([1, 1, 1, 1, 1, 1, 1]\) равен первой физической копии и отличается от каждой из остальных девяти физических копий не более чем в двух позициях.

В третьем примере невозможно найти какой-нибудь массив, который отличается не более чем в двух позициях от обеих физических копий после аварии.

B. Планета Лапитулетти

Перебор реализация *1300

На планете Лапитулетти время идет так же, как и на Земле, только сутки длятся \(h\) часов, а каждый час длится \(m\) минут. Жители этой планеты используют цифровые часы, схожие с земными. Часы показывают время в формате ЧЧ:ММ (сначала показывается число часов в десятичной записи, затем (после двоеточия) показывается число минут в десятичной записи; при необходимости число минут и часов дополняется ведущими нулями слева до двух цифр). Часы исчисляются числами от \(0\) до \(h-1\), а минуты от \(0\) до \(m-1\).

Так изображаются цифры на часах. Обратите внимание, что цифра \(1\) расположена посередине своей позиции.

На планете Лапитулетти пользуются обычным зеркалом. Жители часто смотрят на отражение цифровых часов в зеркале и радуются каждый раз, когда отраженные показания часов являются корректными (то есть в отражении видны корректные цифры, и время, которое они образуют, отображается на обычных часах в какой-то момент суток).

Зеркало отражает изображение часов относительно вертикальной оси.

Отражение не является корректным временем.

Отражение является корректным временем для \(h=24\), \(m = 60\). Однако, например, при \(h=10\), \(m=60\) отражение не является корректным временем.

Житель планеты Лапитулетти начинает смотреть на отражение часов в момент времени \(s\) и хочет узнать ближайший момент времени в будущем (который, возможно, наступит в следующие сутки), когда отраженные показания часов будут корректными.

Можно показать, что при любых \(h\), \(m\) и \(s\) такой момент времени существует. Если в момент времени, когда житель начинает смотреть на часы, отраженное время корректное, ближайшим считается этот момент времени.

Вам предстоит решить задачу для нескольких тестовых случаев.

Входные данные

Первая строка содержит одно целое число \(T\) (\(1 \le T \le 100\)) — количество наборов входных данных.

Следующие \(2 \cdot T\) строк содержат описание наборов входных данных. Описание каждого набора состоит из двух строк.

Первая строка описания содержит два целых числа \(h\), \(m\) (\(1 \le h, m \le 100\)).

Вторая строка содержит показания часов \(s\) в описанном формате ЧЧ:ММ.

Выходные данные

Для каждого тестового случая в отдельной строке выведите ближайший момент времени в формате ЧЧ:ММ, в который отраженное время является корректным.

Примечание

Во втором тестовом случае нетрудно показать, что отражение 23:59 не является корректным, а отражение момента 00:00 следующих суток является корректным.

D. НОД массива

математика Перебор реализация сортировки Структуры данных теория чисел хэши *2100

Дан массив \(a\) длины \(n\). Требуется обработать \(q\) запросов следующего вида: даны два целых числа \(i\) и \(x\), необходимо умножить элемент \(a_i\) на \(x\).

После обработки каждого запроса нужно вывести наибольший общий делитель (НОД) всех чисел массива \(a\).

Так как ответ может быть слишком большим, вам требуется вывести его по модулю \(10^9+7\).

Входные данные

Первая строка входных данных содержит два целых числа — \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)).

Вторая строка содержит \(n\) натуральных чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 2 \cdot 10^5\)) — элементы массива \(a\) до изменений.

Следующие \(q\) строк содержат запросы в следующем формате: в каждой строке содержатся два целых числа \(i\) и \(x\) (\(1 \le i \le n\), \(1 \le x \le 2 \cdot 10^5\)).

Выходные данные

Выведите \(q\) строк: после выполнения каждого запроса выведите НОД всех чисел массива по модулю \(10^9+7\) в отдельной строке.

Примечание

После первого запроса массив станет \([12, 6, 8, 12]\), \(\operatorname{gcd}(12, 6, 8, 12) = 2\).

После второго запроса — \([12, 18, 8, 12]\), \(\operatorname{gcd}(12, 18, 8, 12) = 2\).

После третьего запроса — \([12, 18, 24, 12]\), \(\operatorname{gcd}(12, 18, 24, 12) = 6\).

Здесь функция \(\operatorname{gcd}\) обозначает наибольший общий делитель.

A. Строка ABC

битмаски Перебор реализация *900

Задана строка \(a\), состоящая из \(n\) символов, \(n\) четно. Для каждого \(i\) от \(1\) до \(n\) \(a_i\) является одним из 'A', 'B' или 'C'.

Правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов '1' и '+'. Например, скобочные последовательности «()()», «(())» — правильные (полученные выражения: «(1)+(1)», «((1+1)+1)»), а «)(» и «(» — нет.

Вы хотите найти такую строку \(b\), которая состоит из \(n\) символов, что:

  • \(b\) является правильной скобочной последовательностью;
  • если для некоторых \(i\) и \(j\) (\(1 \le i, j \le n\)) \(a_i=a_j\), тогда \(b_i=b_j\).

Другими словами, вы хотите заменить все вхождения 'A' скобками одного типа, затем все вхождения 'B' скобками одного типа и все вхождения 'C' скобками одного типа.

Ваша задача — определить, существует ли такая строка \(b\).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следуют описания \(t\) наборов входных данных.

В единственной строке каждого набора входных данных содержится одна строка \(a\). \(a\) состоит только из заглавных букв 'A', 'B' и 'C'. Пусть \(n\) будет длиной строки \(a\). Гарантируется, что \(n\) четно и что \(2 \le n \le 50\).

Выходные данные

Для каждого набора входных данных выведите «YES», если существует такая строка \(b\), что:

  • \(b\) является правильной скобочной последовательностью;
  • если для некоторых \(i\) и \(j\) (\(1 \le i, j \le n\)) \(a_i=a_j\), тогда \(b_i=b_j\).

Иначе выведите «NO».

Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных одна из возможных строк \(b\) равна «(())()».

Во втором наборе входных данных одна из возможных строк \(b\) равна «()()».

B. Берляндский кроссворд

битмаски жадные алгоритмы Перебор реализация *1400

Берляндский кроссворд — это головоломка, которая решается на квадратном поле, состоящим из \(n\) строк и \(n\) столбцов. Изначально все ячейки белые.

Чтобы решить головоломку, нужно раскрасить некоторые ячейки на границах поля в черный цвет так, чтобы:

  • ровно \(U\) ячеек в верхнем ряду были черными;
  • ровно \(R\) ячеек в правом столбце были черными;
  • ровно \(D\) ячеек в нижнем ряду были черными;
  • ровно \(L\) ячеек в левом столбце были черными.

Обратите внимание, что можно ничего не красить в черный и оставить все клетки белыми.

Ваша задача — проверить, существует ли решение у заданной головоломки.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следует описание \(t\) наборов входных данных.

В единственной строке каждого набора входных данных записаны \(5\) целых чисел \(n, U, R, D, L\) (\(2 \le n \le 100\); \(0 \le U, R, D, L \le n\)).

Выходные данные

На каждый набор входных данных выведите «YES», если решение существует, и «NO» в противном случае.

Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ).

Примечание

Возможные решения на наборы входных данных \(1\), \(2\) и \(4\):

C. 1D Сокобан

Бинарный поиск дп жадные алгоритмы реализация *1900

Вы играете в игру, похожую на Сокобан, на бесконечной числовой прямой. Игра дискретна, поэтому вы рассматриваете только целочисленные позиции на прямой.

Вы начинаете в позиции \(0\). Есть \(n\) коробок, \(i\)-я коробка находится на позиции \(a_i\). Все позиции коробок различны. Также есть \(m\) специальных позиций, \(j\)-я позиция — это \(b_j\). Все специальные позиции также различны.

За один ход можно пройти на одну позицию влево или вправо. Если в направлении вашего движения стоит коробка, то вы толкаете коробку на следующую позицию в этом направлении. Если следующая позиция занята другой коробкой, то эта коробка также двигается на следующую позицию, и так далее. Нельзя ходить сквозь коробки. Нельзя тащить коробки на себя.

Разрешается совершить произвольное количество ходов (возможно, ноль). Ваша цель — поместить как можно больше коробок на специальные позиции. Обратите внимание, что некоторые коробки могут уже находиться на специальных позициях.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следует описание \(t\) наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество коробок и количество специальных позиций, соответственно.

Во второй строке каждого набора входных данных записаны \(n\) различных целых чисел в возрастающем порядке \(a_1, a_2, \dots, a_n\) (\(-10^9 \le a_1 < a_2 < \dots < a_n \le 10^9\); \(a_i \neq 0\)) — начальные позиции коробок.

В третьей строке каждого набора входных данных записаны \(m\) различных целых чисел в возрастающем порядке \(b_1, b_2, \dots, b_m\) (\(-10^9 \le b_1 < b_2 < \dots < b_m \le 10^9\); \(b_i \neq 0\)) — специальные позиции.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — максимальное количество коробок, которые можно поставить на специальные позиции.

Примечание

В первом наборе входных данных можно пойти на \(5\) направо: коробка на позиции \(1\) окажется на позиции \(6\), а коробка на позиции \(5\) — на позиции \(7\). Затем можно пойти на \(6\) налево и встать в позицию \(-1\), сдвинув коробку в \(-2\). В конце коробки стоят на позициях \([-2, 6, 7, 11, 15]\), соответственно. Среди них позиции \([-2, 6, 7, 15]\) специальные, поэтому ответ равен \(4\).

Во втором наборе входных данных можно дотолкать коробку из \(-1\) в \(-10^9\), а затем коробку из \(1\) в \(10^9\), и получить ответ \(2\).

Третий набор входных данных показывает, что не разрешается тащить коробки на себя, поэтому нельзя их притащить на специальные позиции.

В четвертом наборе входных данных все коробки уже находятся на специальных позициях, поэтому можно ничего не делать и все равно получить ответ \(3\).

В пятом наборе входных данных особенных позиций меньше, чем коробок. Можно пойти на \(8\) или на \(9\) направо, чтобы какая-нибудь коробка встала в \(10\).

F. Уничтожение ребер

графы Конструктив Перебор поиск в глубину и подобное реализация *2900

Вам дан неориентированный связный граф, состоящий из \(n\) вершин и \(m\) ребер. Ваша цель — уничтожить все ребра данного графа.

Вы можете выбрать любую вершину в качестве начальной и начать ходить от нее по ребрам. Когда вы идете по ребру, вы разрушаете его. Очевидно, что вы не можете пройти по ребру, если оно уже разрушено.

Вы можете выполнить операцию смена режима не более одного раза во время обхода, и эта операция может быть выполнена только тогда, когда вы находитесь в какой-то вершине (вы не можете выполнить ее во время обхода ребра). После смены режима ребра, через которые вы проходите, удаляются следующим образом: первое ребро после смены режима не уничтожается, второе — уничтожается, третье — не уничтожается, четвертое — уничтожается и так далее. Вы не можете переключиться обратно в исходный режим, и вам не нужно выполнять эту операцию, если вы этого не хотите.

Можете ли вы уничтожить все ребра данного графа?

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 3000\); \(n - 1 \le m \le \min(\frac{n(n-1)}{2}, 3000\))) — число вершин и число ребер в графе.

Затем следуют \(m\) строк, каждая из которых содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)) — концы \(i\)-го ребра.

Эти ребра образуют связный неориентированный граф без кратных ребер.

Выходные данные

Если невозможно уничтожить все ребра, выведите 0.

В противном случае выведите последовательность ваших действий следующим образом. Сначала выведите \(k\) — количество действий (\(k \le 2m + 2\)). Затем выведите саму последовательность, состоящую из \(k\) целых чисел. Первое целое число должно быть индексом стартовой вершины. Затем каждое следующее целое число должно быть либо индексом следующей вершины в вашем обходе, либо \(-1\), если вы используете операцию смена режима. Вы можете использовать операцию смена режима не более одного раза.

Если ответов несколько, выведите любой из них.

E. Циншань и Даниэль

жадные алгоритмы Перебор реализация Структуры данных *3200

Циншань и Даниэль собираются сыграть в карточную игру. Но играть в нее только вдвоем будет очень скучно. Поэтому они решили сделать \(n\) роботов, чтобы они сыграли в игру автоматически. Роботы, сделанные Циншань, относятся к команде \(1\), а роботы, сделанные Даниэлем, относятся к команде \(2\). Робот \(i\) находится в команде \(t_i\). Перед началом игры роботу \(i\) выдается \(a_i\) карт.

Правила карточной игры просты:

  • Роботы выстраиваются по кругу в порядке номеров и будут в некотором порядке выбрасывать по одной карте. Сначала робот \(1\) выбрасывает одну из своих карт из игры. После этого роботы будут действовать по следующим правилам:
  • Если последнюю карту выбросил робот \(i\), то следующим карту выбрасывает ближайший робот, чья команда противоположна команде \(i\)-го робота. Другими словами, робот \(j\) должен выбросить одну свою карту сразу после робота \(i\), если и только если среди всех возможных \(j\) таких, что \(t_i\ne t_j\), расстояние \(dist(i,j)\) (определение будет дано ниже) минимально.
  • Робот, у которого больше не осталось карт, должен завершить игру немедленно. Этот робот не будет рассматриваться в следующих шагах.
  • Когда нет подходящего робота, который должен выбросить следующую карту, игра заканчивается.

Мы определяем расстояние от робота \(x\) до робота \(y\) как \(dist(x,y)=(y-x+n)\bmod n\). Это соответствует ориентированному расстоянию по кругу.

Например, если \(n=5\), то расстояние от \(1\) до \(3\) это \(dist(1,3)=(3-1+5)\bmod 5=2\), а расстояние от \(3\) до \(1\) это \(dist(3,1)=(1-3+5)\bmod 5 =3\).

Циншань заметила, что наблюдение за игрой роботов занимает очень большое время. Она хочет узнать результаты как можно быстрее. Вы, как фанат Циншань, должны помочь ей посчитать массив \([ans_1,ans_2,\ldots,ans_n]\): \(ans_i\) равно количеству карт, которое выбросит \(i\)-й робот в течение всей игры. Нужно спешить!

Чтобы избежать большого размера входных данных, команды и количества карт каждого робота должны быть сгенерированы в вашей программе с использованием некоторых вспомогательных массивов.

Входные данные

В первой строке находится единственное целое число \(n\) (\(1 \le n \le 5\cdot 10^6\)) — количество роботов, играющих в игру.

Во второй строке находится единственное целое число \(m\) (\(1 \le m \le \min(n,200\,000)\)).

Каждая из следующих \(m\) строк содержит четыре целых числа \(p_i\), \(k_i\), \(b_i\), \(w_i\) (\(1 \le p_i \le n\), \(1 \le k_i \le 10^9+7\), \(0 \le b_i ,w_i< k_i\)). Гарантируется, что \(p_m=n\) и \(p_{j-1}<p_{j}\) (\(2 \le j \le m\)).

Массивы \(a_j\) и \(t_j\) должны быть сгенерированы следующим псевдокодом:


seed = 0
base = 0

function rnd():
ret = seed
seed = (seed * base + 233) mod 1000000007
return ret

p[0] = 0
for i = 1 to m:
seed = b[i]
base = w[i]
for j = p[i - 1] + 1 to p[i]:
t[j] = (rnd() mod 2) + 1
a[j] = (rnd() mod k[i]) + 1
Выходные данные

Выведите единственное целое число \(\left( \prod_{i=1}^{n} ((ans_i \oplus i^2)+1)\right) \bmod 10^9+7\), где \(\oplus\) обозначает операцию исключающего ИЛИ.

Примечание

В первом тесте \(a=[5,5,1]\) и \(t=[1,2,2]\).

Робот \(1\) выбрасывает первую карту.

Затем робот \(2\) выбрасывает карту. Это делает не робот \(3\), потому что \(dist(1,2)<dist(1,3)\).

Затем робот \(1\) выбрасывает карту. Это делает не робот \(3\), потому что \(t_2=t_3\).

Если мы выпишем индексы роботов, которые будут выбрасывать карты по очереди, то мы получим последовательность \([1,2,1,2,1,2,1,2]\). Поэтому роботы \(1\), \(2\) и \(3\) уберут \(5\), \(5\) и \(0\) карт, соответственно. Ответ будет равен \((((5 \oplus 1^2)+1)\times((5 \oplus 2^2)+1)\times((0 \oplus 3^2)+1)) \bmod 10^9+7=(5\times 2 \times 10)\bmod 10^9+7=100\).

D. Бананы в микроволновке

графы дп поиск в глубину и подобное реализация *2200

У вас есть сломанная микроволновка, в которую вы хотите положить несколько бананов. У вас есть \(n\) моментов времени, пока микроволновка не сломается окончательно. В каждый момент времени она показывает новую операцию.

Пусть \(k\) будет равно текущему количеству бананов в микроволновке. Изначально \(k = 0\). В \(i\)-й операции на вход подаются три параметра \(t_i\), \(x_i\), \(y_i\). В зависимости от значения \(t_i\) необходимо сделать одно из следующий действий:

Тип 1: (\(t_i=1\), \(x_i\), \(y_i\)) — выберите \(a_i\) такое, что \(0 \le a_i \le y_i\), и произведите следующую замену \(a_i\) раз: \(k:=\lceil (k + x_i) \rceil\).

Тип 2: (\(t_i=2\), \(x_i\), \(y_i\)) — выберите \(a_i\) такое, что \(0 \le a_i \le y_i\), и произведите следующую замену \(a_i\) раз: \(k:=\lceil (k \cdot x_i) \rceil\).

Обратите внимание, что \(x_i\) может быть дробным значением. Смотрите формат входных данных для пояснения. Также \(\lceil x \rceil\) — это наименьшее целое число \(\ge x\).

В \(i\)-й момент времени необходимо произвести \(i\)-ю операцию ровно один раз.

Для каждого \(j\) такого, что \(1 \le j \le m\), выведите самый ранний момент времени такой, что вы можете получить ровно \(j\) бананов. Если нельзя получить ровно \(j\) бананов, то выведите \(-1\).

Входные данные

В первой строке записаны два целых числа \(n\) \((1 \le n \le 200)\) и \(m\) \((2 \le m \le 10^5)\).

Затем следуют \(n\) строк, где \(i\)-я строка описывает операцию в \(i\)-й момент времени. Каждая строка содержит три целых числа \(t_i\), \(x'_i\) и \(y_i\) (\(1 \le t_i \le 2\), \(1\le y_i\le m\)).

Обратите внимание, что задается \(x'_i\), которое равно \(10^5 \cdot x_i\). Чтобы получить \(x_i\), используйте формулу \(x_i= \dfrac{x'_i} {10^5}\).

Для операций типа 1 \(1 \le x'_i \le 10^5 \cdot m\), а для операций типа 2 \(10^5 < x'_i \le 10^5 \cdot m\).

Выходные данные

Выведите \(m\) целых чисел, где \(i\)-е число равно самому раннему моменту времени, в который можно получить ровно \(i\) бананов (или \(-1\), если это невозможно).

Примечание

В первом примере мы хотим показать, как получить \(16\) бананов за три момента времени. Изначально \(k=0\).

  • В момент времени 1 мы выбираем \(a_1=2\), поэтому мы применяем обновление типа 1 — \(k := \lceil(k+3)\rceil\) — два раза. Поэтому \(k\) теперь 6.
  • В момент времени 2 мы выбираем \(a_2=0\), поэтому \(k\) не изменяется.
  • В момент времени 3 мы выбираем \(a_3=1\), поэтому мы применяем обновление типа 1 \(k:= \lceil(k+10)\rceil\) один раз. Поэтому \(k\) теперь 16.

Можно показать, что \(k=16\) нельзя получить быстрее, чем за три момента времени, используя данные операции.

Во втором примере мы хотим показать, как получить \(17\) бананов за два момента времени. Изначально \(k=0\).

  • В момент времени 1 мы выбираем \(a_1=1\), поэтому мы применяем обновление типа 1 — \(k := \lceil(k+3.99999)\rceil\) — один раз. Поэтому \(k\) теперь 4.
  • В момент времени 2 мы выбираем \(a_2=1\), поэтому мы применяем обновление типа 2 — \(k := \lceil(k\cdot 4.12345)\rceil\) — один раз. Поэтому \(k\) теперь 17.

Можно показать, что \(k=17\) нельзя получить быстрее, чем за два момента времени, используя данные операции.

B. Двоичные удаления

дп жадные алгоритмы Перебор реализация *1000

Задана строка \(s\), состоящая только из символов '0' или '1'. Пусть \(|s|\) будет длиной строки \(s\).

Требуется выбрать некоторое целое число \(k\) (\(k > 0\)) и последовательность \(a\) длины \(k\) такую что:

  • \(1 \le a_1 < a_2 < \dots < a_k \le |s|\);
  • \(a_{i-1} + 1 < a_i\) для всех \(i\) от \(2\) до \(k\).

Символы на позициях \(a_1, a_2, \dots, a_k\) удаляются, оставшиеся символы склеиваются без изменения порядка. То есть, другими словами, позиции в выбранной последовательности \(a\) не должны быть соседними.

Пусть полученная строка будет \(s'\). \(s'\) называется отсортированной, если для всех \(i\) от \(2\) до \(|s'|\) \(s'_{i-1} \le s'_i\).

Существует ли такая последовательность \(a\), что \(s'\) отсортирована?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следует описание \(t\) наборов входных данных.

В единственной строке каждого набора входных данных содержится строка \(s\) (\(2 \le |s| \le 100\)). Каждый символ равен либо '0', либо '1'.

Выходные данные

На каждый набор входных данных выведите «YES», если существует такая последовательность \(a\), что при удалении символов на позициях \(a_1, a_2, \dots, a_k\) и склеивании оставшихся частей без изменения порядка получится отсортированная строка.

В противном случае выведите «NO».

Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных можно выбрать последовательность \(a=[1,3,6,9]\). При удалении подчеркнутых букв из «10101011011» получится строка «0011111», которая отсортирована.

Во втором и в третьем наборах входных данных последовательность уже отсортирована.

В четвертом наборе входных данных можно выбрать последовательность \(a=[3]\). \(s'=\) «11», которая отсортирована.

В пятом наборе входных данных нет способа выбрать последовательность \(a\) так, чтобы \(s'\) была отсортирована.

A. Коттеджный городок

реализация сортировки *1200

Во Флатландии строится коттеджный городок «Плоский». На данный момент в «Плоском» уже построено n квадратных домов, центры которых лежат на оси Оx. Стороны домов параллельны осям координат. Известно, что никакие два дома не пересекаются, хотя могут касаться друг друга.

Петя работает в архитектурном бюро, в которое поступил заказ на постройку нового дома в «Плоском». Заказчик хочет, чтобы его дом тоже находился на оси Оx, имел форму квадрата со стороной t, а также примыкал как минимум к одному из уже существующих домов. Разумеется, его стороны должны быть параллельны осям координат, центр должен находиться на оси Ox и он не должен пересекаться ни с каким существующим домом.

Пете дан список всех домов в «Плоском», помогите ему найти количество возможных положений нового дома.

Входные данные

Первая строка входных данных содержит целые числа n и t (1 ≤ n, t ≤ 1000). Далее идут n строк в которых два целых числа перечислены через пробел: xi ai, где xix-координата центра i-го дома, а ai — длина его стороны ( - 1000 ≤ xi ≤ 1000, 1 ≤ ai ≤ 1000).

Выходные данные

Выведите количество возможных положений нового дома.

Примечание

Центр нового дома не обязательно должен иметь целочисленную x-координату.

D. Карта

реализация сортировки Структуры данных *2500

Задана карта местности, представляющая собой прямоугольную матрицу n × m, в каждой клетке которой записана средняя высота соответствующего участка местности. Прорабу Пете нужно расположить на карте несколько городов, каждый из которых на карте займет прямоугольник размера a × b клеток. Но прежде чем построить город в определенном месте, Пете необходимо убрать лишнюю землю с участка, на котором будет строиться город. Для этого он выбирает клетку наименьшей высоты на этом участке и делает высоту всех клеток на участке равной высоте этой клетки. Будем считать, что для того, чтобы опустить уровень земли с h2 до h1 (h1 ≤ h2), необходимо вывезти h2 - h1 единиц земли.

Назовем положение участка под город оптимальным, если количество вывозимой с него земли наименьшее из всех возможных положений. Петя строит города в соответствии со следующим алгоритмом: из всех оптимальных положений участка он выбирает самое верхнее. Если таких положений несколько, он выбирает среди них самое левое. На этом участке он строит город. Петя повторяет этот процесс до тех пор, пока он может построить хотя бы еще один город. На уже застроенных клетках, разумеется, строить вновь нельзя. Помогите Пете расположить города в соответствии с алгоритмом.

Входные данные

В первой строке перечислено через пробел четыре целых числа — размеры карты n, m и размеры города a, b (1 ≤ a ≤ n ≤ 1000, 1 ≤ b ≤ m ≤ 1000). Далее идут n строк по m неотрицательных целых чисел в каждой, задающие матрицу высот. Все числа не превышают 109. Числа в строках разделяются пробелами.

Выходные данные

В первой строке выведите k — число построенных городов. В следующих k строках выведите по 3 числа, разделенных пробелами, — номер строки и номер столбца левого верхнего угла очередного участка, а также объем земли, который требуется с него вывезти. Участки выводите в порядке их построения.

A. Поеду домой

математика Перебор реализация хэши *1800

На третьем месяце дистанционного обучения студентке Насте стало скучно, и она решила поехать домой к себе в родной город на пару недель с целью развеяться. Чтобы ей было веселее в дороге, её друг подарил ей массив целых чисел \(a\).

Шел пятый час поездки, и Настя вспомнила про подарок. Чтобы развлечь себя, она решила проверить, можно ли выбрать четыре различных индекса \(x, y, z, w\) таких, что \(a_x + a_y = a_z + a_w\).

Занявшись этим делом, Настя не заметила, как прошло время, и её поезд уже пришел на станцию назначения. Она не успела закончить проверку, но всё ещё хочет узнать истину. Сможете ей помочь?

Входные данные

Первая строка содержит целое число \(n\) (\(4 \leq n \leq 200\,000\)) — количество чисел в массиве.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 2.5 \cdot 10^6\)).

Выходные данные

Выведите «YES», если четыре таких индекса существуют, и «NO» иначе.

Если они существуют, далее выведите сами индексы \(x\), \(y\), \(z\) и \(w\) (\(1 \le x, y, z, w \le n\)).

Если возможных ответов несколько, выведите любой.

Примечание

В первом примере \(a_2 + a_3 = 1 + 5 = 2 + 4 = a_1 + a_6\). Обратите внимание, что ответ 2 3 4 6 также подходит.

Во втором примере нельзя выбрать четыре таких индекса. Ответ 1 2 2 3 не подходит, потому что в нем не все индексы различны, хоть и \(a_1 + a_2 = 1 + 3 = 3 + 1 = a_2 + a_3\)

A. Леша и поезд

реализация *800

Леша едет на поезде. Но вот незадача — из-за плохой погоды поезд едет медленнее, чем должен!

Леша садится на поезд на вокзале. Будем считать, что поезд трогается с вокзала в момент \(0\). Также будем считать, что поезд пройдет через \(n\) станций, пронумерованных от \(1\) по \(n\) в порядке маршрута поезда и Леше нужно попасть на станцию \(n\).

Из маршрутного листа он узнал \(n\) пар целых чисел \((a_i, b_i)\), где \(a_i\) — ожидаемое время прибытия на \(i\)-ю станцию, а \(b_i\) — ожидаемое время отбытия с нее.

Также, принимая во внимание множество факторов, Леша смог рассчитать \(n\) целых чисел \(tm_1, tm_2, \dots, tm_n\), где \(tm_i\) — это то, на сколько больше будет ехать поезд от станции \(i - 1\) до станции \(i\), чем ожидалось. Формально говоря, поезд проедет от станции \(i - 1\) до \(i\) ровно \(a_i - b_{i-1} + tm_i\) времени (при \(i = 1\), за \(b_0\) берется время отбытия от вокзала, равное \(0\)).

Поезд выезжает со станции \(i\), если соблюдаются оба следующих условия:

  1. он стоит уже хотя бы \(\left\lceil \frac{b_i - a_i}{2} \right\rceil\) времени (деление с округлением вверх);
  2. текущее время \(\ge b_i\).

Так как Леша потратил все силы на предсказание задержек, помогите ему посчитать время прибытия на станцию \(n\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 100\)) — количество станций.

Далее заданы \(n\) строк, в каждой из которых содержится два целых числа: \(a_i\) и \(b_i\) (\(1 \le a_i < b_i \le 10^6\)). Гарантируется, что \(b_i < a_{i+1}\).

В следующей строке заданы \(n\) целых чисел \(tm_1, tm_2, \dots, tm_n\) (\(0 \le tm_i \le 10^6\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число — время прибытия Леши на последнюю станцию.

Примечание

В первом наборе входных данных Леша сначала пребывает без опоздания на станцию номер \(1\) в момент времени \(a_1 = 2\) (так как \(tm_1 = 0\)). Затем отъезжает с неё в момент времени \(b_1 = 4\). На станцию номер \(2\) он приезжает с опозданием на \(tm_2 = 2\) единицы времени, то есть в \(12\).

Во втором наборе, Леша прибывает на первую станцию с опозданием в \(tm_1 = 1\), то есть в момент \(2\). Далее поезд должен пробыть хотя бы \(\left\lceil \frac{b_1 - a_1}{2} \right\rceil = 2\) единицы времени на станции и отправится не ранее чем в момент \(b_1 = 4\). Таким образом, поезд оправляется с первой станции в момент \(4\).

Разбирая аналогичным образом следующие станции, можно получить, что поезд прибудет на вторую станцию в момент \(9\), а покинет в \(10\); на третью станцию прибудет в \(14\), покинет в \(15\); на четвертую: прибудет в \(22\), покинет в \(23\). И, наконец, прибудет на пятую в \(32\).

B. Торт Наполеон

дп реализация сортировки *900

На этой неделе Аркадий хотел последовать традициям, испечь стопку блинов и придумать про это задачу. Однако он вспомнил, что чтобы придумать задачу про стопки блинов, нужно работать в одной известной IT-компании, поэтому вместо этого Аркадий решил испечь торт «Наполеон».

Чтобы испечь торт «Наполеон», нужно сначала выпечь \(n\) сухих коржей (слоев), а затем сложить их друг на друга, пропитывая кремом. Аркадий начал с пустого блюда, и повторил следующие шаги \(n\) раз:

  • положил новый сухой слой на верх стопки;
  • после того, как он положил \(i\)-й слой, он добавил на верх стопки \(a_i\) ложек крема.

Когда Аркадий добавляет \(x\) ложек крема на верх стопки, \(x\) верхних слоев торта пропитываются кремом. Если с торте в этот момент меньше \(x\) слоев, то пропитываются все эти слои, а оставшийся крем пропадает. Если \(x = 0\), то не пропитывается ни один слой.

Рисунок иллюстрирует первый набор входных данных из примера.

Помогите Аркадию определить, какие слои окажутся пропитаны кремом, когда он закончит собирать торт, а какие нет.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 20\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество слоев в торте.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le n\)) — объем крема, добавленного после добавления каждого слоя.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку с \(n\) целыми числами. \(i\)-е из этих чисел должно быть равно \(1\), если \(i\)-й слой снизу окажется пропитанным, и \(0\) иначе.

F. Сбалансируйте карты

геометрия графы Конструктив разделяй и властвуй реализация Структуры данных *3500

Сбалансированная скобочная последовательность определяется как целая последовательность целых чисел, которая может быть построена по следующим правилам:

  • Пустая последовательность сбалансирована.
  • Если \([a_1,\ldots,a_n]\) и \([b_1,\ldots, b_m]\) сбалансированы, то их конкатенация \([a_1,\ldots,a_n,b_1,\ldots,b_m]\) сбалансирована.
  • Если \(x\) — целое положительное число и \([a_1,\ldots,a_n]\) сбалансирована, то \([x,a_1,\ldots,a_n,-x]\) сбалансирована.

Положительные числа можно представить себе в виде открывающихся скобок, а отрицательные — в виде закрывающих скобок, где соответствующие скобки должны иметь одинаковый тип (абсолютное значение). Например, \([1, 2, -2, -1]\) и \([1, 3, -3, 2, -2, -1]\) сбалансированы, но \([1, 2, -1, -2]\) и \([-1, 1]\) не сбалансированы.

Есть \(2n\) карт. Каждая карта имеет число на лицевой стороне и число на оборотной. Каждое целое число \(1,-1,2,-2,\ldots,n,-n\) встречается на лицевой стороне ровно одной карты и на оборотной стороне ровной одной карты (необязательно той же карты).

Вы можете переупорядочить карты, как вам угодно. Вам не разрешено переворачивать карты, поэтому числа не могут перемещаться между лицевой и оборотной сторонами карты. Ваша задача — упорядочить карты так, чтобы последовательности, заданные числами на лицевых и оборотных сторонах, были сбалансированы, или сообщить, что это невозможно.

Входные данные

В первой строке содержится одно целое число \(n\) (\(1\le n\le 2\cdot 10^5\)) — количество типов скобок и половина количества карт.

Следующие \(2n\) строк описывают карты. В \(i\)-й из этих строк содержатся два целых числа \(a_i\), \(b_i\) (\(-n\le a_i,b_i\le n\), \(a_i\ne 0\), \(b_i\ne 0\)) — числа на лицевой и оборотной стороне \(i\)-й карты соответственно. Каждое целое число \(1,-1,2,-2,\ldots,n,-n\) встречается ровно один раз как \(a_i\) и ровно один раз как \(b_i\).

Выходные данные

В первой строке выведите «YES», если можно упорядочить карты, чтобы выполнялось условие. В противном случае выведите «NO». Вы можете выводить каждый символ в любом регистре.

Если это возможно, в следующих \(2n\) строках выведите карты в таком порядке, чтобы и лицевая и оборотная части были сбалансированы. Если есть несколько решений, то можно вывести любое.

Примечание

В первом примере лицевые числа образуют сбалансированную последовательность \([1,4,-4,-1,5,3,2,-2,-3,-5]\), а оборотные числа создают сбалансированную последовательность \([3,-3,4,-4,1,-1,2,5,-5,-2]\).

Во втором примере карты даются в таком порядке, что лицевые числа сбалансированы, а оборотные образуют несбалансированную последовательность \([1,2,-1,-2]\). Если бы мы поменяли местами вторую и третью карты, то сбалансировали бы оборотные числа и разбалансировали бы лицевые. Но нет такого порядка, который бы балансировал и то, и другое.

B. Меняем биты

жадные алгоритмы Конструктив математика реализация *1200

Дана бинарная строка \(a\) длины \(n\). За одну операцию можно выбрать любой префикс \(a\) с равным числом символов \(0\) и \(1\). Затем все символы в префиксе меняются: каждый \(0\) становится \(1\), а каждый \(1\)\(0\).

Например, предположим, что \(a=0111010000\).

  • В первой операции можно выбрать префикс длины \(8\), так как он имеет четыре \(0\) и четыре \(1\): \([01110100]00\to [10001011]00\).
  • Во второй операции можно выбрать префикс длины \(2\), так как он имеет один \(0\) и одну \(1\): \([10]00101100\to [01]00101100\).
  • Для третьей операции запрещено выбирать префикс длины \(4\), так как он имеет три \(0\) и одну \(1\).

Можете ли вы преобразовать строку \(a\) в строку \(b\), сделав некоторое конечное количество операций (возможно, ни одной)?

Входные данные

В первой строке содержится одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных содержится одно целое \(n\) (\(1\le n\le 3\cdot 10^5\)) — длина строк \(a\) и \(b\).

Следующие две строки содержат строки \(a\) и \(b\) длиной \(n\), состоящие из символов \(0\) и \(1\).

Сумма \(n\) во всех наборах входных данных не превышает \(3\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если возможно преобразовать \(a\) в \(b\), или «NO», если это невозможно. Вы можете выводить каждый символ в любом регистре.

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе входных данных мы преобразуем \(a\) в \(b\), используя ноль операций.

В третьем наборе входных данных нельзя сделать ни одну операцию, поэтому преобразовать \(a\) в \(b\) невозможно.

В четвертом наборе входных данных, вот одно из таких преобразований:

  • Выберите префикс длины \(2\), чтобы получить \(100101010101\).
  • Выберите префикс длины \(12\), чтобы получить \(011010101010\).
  • Выберите префикс длины \(8\), чтобы получить \(100101011010\).
  • Выберите префикс длины \(4\), чтобы получить \(011001011010\).
  • Выберите префикс длины \(6\), чтобы получить \(100110011010\).

В пятом наборе входных данных единственной разрешенной операцией является преобразование \(a\) в \(111000\). Но для получившейся строки единственная разрешенная операция — это вернуться к строке, с которой мы начали, поэтому мы не можем преобразовать \(a\) в \(b\).

A. Is it rated - 2

*особая задача интерактив реализация *900

Протокол взаимодействия

Эта задача - интерактивная. Вы можете прочитать задаваемые вопросы из стандартного потока ввода, и выводить свои ответы в стандартный поток вывода. Количество вопросов неизвестно заранее, так что вам придется обрабатывать их по мере их поступления, пока вы не достигнете конца файла.

В каждом запросе вам зададут один вопрос, записанный в одной строке. Вы должны ответить на него правильно, терпеливо и без эмоций. Ваш ответ обрабатывается без учета регистра.

Пожалуйста, используйте оператор flush после каждого запроса, чтобы не оставить часть запроса в буфере.

B. DMCA

*особая задача реализация теория чисел *1600

Многие знают о DMCA – Digital Millennium Copyright Act (Закон об авторском праве в цифровую эпоху). Но мало кто знает о другом недавно предложенном DMCA – Digital Millennium Calculation Act (Закон о вычислениях в цифровую эпоху).

В этой задаче вам нужно найти корень числа в соответствии с этим новым законом.

Входные данные

Входные данные содержат одно целое число \(a\) (\(1 \le a \le 1000000\)).

Выходные данные

Выведите ответ – целое число.

C. Слова Фибоначчи

*особая задача реализация *1400

Входные данные

Входные данные состоят из одной строки символов английского алфавита в верхнем регистре A-Z. Длина строки - от 1 до 10 символов, включительно.

Выходные данные

Выведите «YES» или «NO».

E. Прогулка по торту

*особая задача жадные алгоритмы кратчайшие пути реализация *1800

Мышь нашла большой красивый торт и решила прогуляться по нему, попутно объедая ягоды на верхушке торта. Торт прямоугольный и разделен на аккуратные квадраты; в некоторых квадратах есть ягода, а в некоторых нет.

Мышь спешит, поэтому когда она взберется на торт в его северо-западном углу (вернняя левая клетка входных данных), она будет двигаться только на восток (направо) или на юг (вниз), пока не достигнет юго-восточного угла (нижняя правая клетка). Она съест все ягоды на клетках, через которые она пройдет, и оставит остальные ягоды нетронутыми.

Мышь хочет выбрать свой путь так, чтобы съесть наибольшее возможное количество ягод. Но, возможно, ее спешка и голод затмевают ее разум и вынуждают ее принимать неоптимальные решения...

Входные данные

Первая строка входных данных состоит из двух чисел \(H\) и \(W\) (\(1 \le H, W \le 5\)), разделенных пробелом - высоты и ширины торта.

Следующие \(H\) строк содержат строки из ровно \(W\) символов, описывающих квадраты торта: «.» представляет пустой квадрат, а «*» - квадрат с ягодой.

Выходные данные

Выведите одно число - количество ягод, которые съест мышь, следуя своей стратегии.

G. Закодированное сообщение

*особая задача реализация *2600

Входные данные

Первая строка входных данных содержит единственное целое число \(N\) (\(1 \le N \le 24\)). Следующие \(N\) строк содержат по \(5\) целых чисел, разделенных пробелами. Первые три числа находятся в диапазоне от 0 до 2, включительно, последние два – от 0 до 3, включительно. Сумма первых трех чисел равна сумме двух последних.

Выходные данные

Выведите результат – строку латинских букв в нижнем регистре.

B. Частичная замена

жадные алгоритмы реализация *1100

Вам заданы число \(k\) и строка \(s\) длины \(n\), состоящая из символов '.' и '*'. Вы хотите заменить некоторые из символов '*' на символы 'x', чтобы были выполнены следующее условия:

  • Самый первый символ '*' в исходной строке должен быть заменен на 'x';
  • Самый последний символ '*' в исходной строке должен быть заменен на 'x';
  • Расстояние между двумя соседними замененными символами 'x' не должно превосходить \(k\) (более формально, если вы заменили символы на позициях \(i\) и \(j\) (\(i < j\)) и на позициях \([i+1, j-1]\) нет символа 'x', то \(j-i\) должно быть не больше \(k\)).

Например, если \(n=7\), \(s=\).**.*** и \(k=3\), то вы следующие строки будут удовлетворять условиям выше:

  • .xx.*xx;
  • .x*.x*x;
  • .xx.xxx.
Но, например, следующие строки удовлетворять условиям не будут:
  • .**.*xx (самый первый символ '*' должен быть заменен на 'x');
  • .x*.xx* (самый последний символ '*' должен быть заменен на 'x');
  • .x*.*xx (расстояние между символами на позициях \(2\) и \(6\) больше \(k=3\)).

Для заданных \(n\), \(k\) и \(s\) найдите минимальное количество символов '*', которые необходимо заменить на символы 'x', чтобы были выполнены условия выше.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)). Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 50\)).

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\), состоящую из символов '.' и '*'.

Гарантируется, что в строке \(s\) есть хотя бы один символ '*'.

Гарантируется, что расстояние между любыми двумя соседними символами '*' не превосходит \(k\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество символов '*', которые необходимо заменить на символы 'x', чтобы были выполнены условия выше.

C. Двусторонние строки

Перебор реализация Строки *1000

Вам заданы строки \(a\) и \(b\), состоящие из строчных букв латинского алфавита. Вы можете сделать произвольное число следующих операций в произвольном порядке:

  • если \(|a| > 0\) (длина строки \(a\) больше нуля), удалить первый символ строки \(a\), то есть заменить \(a\) на \(a_2 a_3 \ldots a_n\);
  • если \(|a| > 0\), удалить последний символ строки \(a\), то есть заменить \(a\) на \(a_1 a_2 \ldots a_{n-1}\);
  • если \(|b| > 0\) (длина строки \(b\) больше нуля), удалить первый символ строки \(b\), то есть заменить \(b\) на \(b_2 b_3 \ldots b_n\);
  • если \(|b| > 0\), удалить последний символ строки \(b\), то есть заменить \(b\) на \(b_1 b_2 \ldots b_{n-1}\).

Заметьте, что после каждой из операций строка \(a\) или \(b\) могут стать пустыми.

Например, если \(a=\)«hello» и \(b=\)«icpc», то вы можете применить следующую последовательность операций:

  • удалить первый символ строки \(a\) \(\Rightarrow\) \(a=\)«ello» и \(b=\)«icpc»;
  • удалить первый символ строки \(b\) \(\Rightarrow\) \(a=\)«ello» и \(b=\)«cpc»;
  • удалить первый символ строки \(b\) \(\Rightarrow\) \(a=\)«ello» и \(b=\)«pc»;
  • удалить последний символ строки \(a\) \(\Rightarrow\) \(a=\)«ell» и \(b=\)«pc»;
  • удалить последний символ строки \(b\) \(\Rightarrow\) \(a=\)«ell» и \(b=\)«p».

По заданным строкам \(a\) и \(b\) найдите минимальное количество операций, за которые можно сделать строки \(a\) и \(b\) равными. Обратите внимание, что пустые строки также являются равными.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 100\)). Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит строку \(a\) (\(1 \le |a| \le 20\)), состоящую из строчных букв латинского алфавита.

Вторая строка каждого набора входных данных содержит строку \(b\) (\(1 \le |b| \le 20\)), состоящую из строчных букв латинского алфавита.

Выходные данные

Для каждого набора входных данных выведите одно число — минимальное количество операций, за которые можно сделать строки \(a\) и \(b\) равными.

E. Восстановление перестановки

Конструктив реализация *1500

Перестановка — это последовательность из \(n\) целых чисел от \(1\) до \(n\), в которой все числа встречаются ровно по одному разу. Например, \([1]\), \([3, 5, 2, 1, 4]\), \([1, 3, 2]\) — перестановки, а \([2, 3, 2]\), \([4, 3, 1]\), \([0]\) — нет.

Поликарпу подарили перестановку \(p\) чисел от \(1\) до \(n\). Однако, когда Поликарп пришёл домой, он заметил, что в кармане перестановка \(p\) превратилась в массив \(q\) согласно следующему правилу:

  • \(q_i = \max(p_1, p_2, \ldots, p_i)\).

Теперь Поликарпу стало интересно: какую лексикографически минимальную и лексикографически максимальную перестановки ему могли подарить.

Массив \(a\) длины \(n\) лексикографически меньше массива \(b\) длины \(n\), если существует индекс \(i\) (\(1 \le i \le n\)), такой что первые \(i-1\) элементов у массивов \(a\) и \(b\) совпадают, а \(i\)-й элемент у массива \(a\) меньше, чем \(i\)-й элемент у массива \(b\). Например массив \(a=[1, 3, 2, 3]\) лексикографически меньше массива \(b=[1, 3, 4, 2]\).

Например, если \(n=7\) и \(p=[3, 2, 4, 1, 7, 5, 6]\), тогда \(q=[3, 3, 4, 4, 7, 7, 7]\) и следующие перестановки могли быть в качестве \(p\) изначально:

  • \([3, 1, 4, 2, 7, 5, 6]\) (лексикографически минимальная перестановка);
  • \([3, 1, 4, 2, 7, 6, 5]\);
  • \([3, 2, 4, 1, 7, 5, 6]\);
  • \([3, 2, 4, 1, 7, 6, 5]\) (лексикографически максимальная перестановка).

Для заданного массива \(q\) найдите лексикографически минимальную и лексикографически максимальную перестановки, которые могли быть подарены Поликарпу изначально.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 10^4\)). Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(q_1, q_2, \ldots, q_n\) (\(1 \le q_i \le n\)).

Гарантируется, что массив \(q\) был получен применением правила из условия к какой-то перестановке \(p\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите две строки:

  • в первой строке выведите \(n\) целых чисел — лексикографически минимальную перестановку, которая могла быть подарена Поликарпу изначально;
  • во второй строке выведите \(n\) целых чисел — лексикографически максимальную перестановку, которая могла быть подарена Поликарпу изначально.

A. Бинарная литература

жадные алгоритмы Конструктив реализация Строки *1900

Бинарная строка — это строка, содержащая только символы 0 и 1.

Koyomi Kanou усердно работает над своей мечтой стать писательницей. Чтобы попрактиковаться, она решила принять участие в Конкурсе по Написанию Бинарных Романов. Указание к конкурсу состоит из трёх бинарных строк длины \(2n\). Корректным романом для конкурса является бинарная строка длины не более \(3n\), содержащая в качестве подпоследовательностей не менее двух из трёх данных строк.

Koyomi только что получила три строки — указание от организаторов конкурса. Помогите ей написать корректный роман для конкурса.

Строка \(a\) является подпоследовательностью строки \(b\), если \(a\) можно получить из \(b\), удалив несколько (возможно, ноль) символов.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое \(n\) (\(1 \le n \le 10^5\)).

Каждая из следующих трех строк содержит бинарную строку длины \(2n\). Гарантируется, что эти три строки попарно различны.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую бинарную строку длины не более \(3n\), которая в качестве подпоследовательностей содержит как минимум две из заданных бинарных строк.

Можно доказать, что при данных ограничениях такая бинарная строка существует всегда.

Если есть несколько возможных ответов, вы можете вывести любой из них.

Примечание

В первом наборе входных данных бинарные строки 00 и 01 являются подпоследовательностями выходной строки: 010 и 010. Обратите внимание, что 11 не является подпоследовательностью выходной строки, но это не требуется.

Во втором наборе входных данных все три входных строки являются подпоследовательностями выходной строки: 011001010, 011001010 и 011001010.

B. Почти отсортированные

Бинарный поиск Комбинаторика Конструктив реализация *1800

Seiji Maki не только любит наблюдать за развитием отношений, он также любит наблюдать за последовательностями чисел, особенно перестановками. Сегодня он смотрит на почти отсортированные перестановки.

Перестановка \(a_1, a_2, \dots, a_n\) чисел \(1, 2, \dots, n\) считается почти отсортированной, если условие \(a_{i + 1} \ge a_i - 1\) выполняется для всех \(i\) от \(1\) до \(n - 1\) включительно.

Maki рассматривает список всех почти отсортированных перестановок чисел \(1, 2, \dots, n\), приведенных в лексикографическом порядке, и хочет найти в этом списке перестановку \(k\)-ю. Можете ли вы помочь ему найти такую перестановку?

Перестановка \(p\) лексикографически меньше перестановки \(q\), если и только если выполняется следующее:

  • в первой позиции, где \(p\) и \(q\) различны, в перестановке \(p\) элемент меньше, чем соответствующий элемент в \(q\).
Входные данные

В первой строке содержится одно целое число \(t\) (\(1\le t\le 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей два целых числа \(n\) и \(k\) (\(1 \le n \le 10^5\), \(1 \le k \le 10^{18}\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую \(k\)-ю почти отсортированную перестановку длины \(n\) в лексикографическом порядке, или \(-1\), если ее не существует.

Примечание

Для первого и второго набора входных данных список почти отсортированных перестановок с \(n = 1\) составляет \(\{[1]\}\).

Для третьего и пятого набора входных данных список почти отсортированных перестановок с \(n = 3\) составляет \(\{[1, 2, 3], [1, 3, 2], [2, 1, 3], [3, 2, 1]\}\).

A. Газировкопитие

математика реализация *800

В городе XXXводске очень холодно этой зимой! Чтобы согреться, компания из n друзей решила купить k бутылок газировки «Take-It-Light» объемом l миллилитров каждая. Также они купили c лаймов (каждый из который разрезали на d долек) и p граммов соли.

Для одного тоста каждому из друзей требуется nl миллилитров газировки, одна долька лайма и np граммов соли. Друзья хотят сделать как можно больше тостов, при этом все должны выпить поровну. Сколько тостов получится сделать у каждого?

Входные данные

В первой и единственной строке записаны положительные целые числа n, k, l, c, d, p, nl, np, не превосходящие 1000 и не меньшие 1. Числа разделены ровно одним пробелом.

Выходные данные

Выведите одно целое число — сколько тостов сможет сделать каждый из друзей.

Примечание

Комментарий к первому примеру:

Всего газировки у друзей 4 * 5 = 20 мл, значит ее хватит на 20 / 3 = 6 тостов. Лаймов хватит на 10 * 8 = 80 тостов, соли же на 100 / 1 = 100. Однако в компании 3 друга поэтому ответ min(6, 80, 100) / 3 = 2.

B. Телефонные номера

реализация Строки *1200

В городе XXXводске просто чертовски холодно этой зимой! Поэтому компания из n друзей предпочитает ездить на такси, заказывать пиццу в гостиницу и звонить знакомым девушкам домой. Телефонные номера в этом городе состоят из трех пар цифр (например, 12-34-56). У каждого из друзей есть своя записная книжка размера si (количество номеров). Известно, что номера такси состоят из шести одинаковых цифр (например, 22-22-22), номера заказа пиццы обязательно являются убывающей последовательностью из шести различных цифр (например, 98-73-21), остальные номера являются номерами знакомых девушек.

Вам даны записные книжки ваших друзей, посчитайте к кому из них лучше всего обращаться по каждому из этих вопросов (у кого больше номеров каждого типа).

Если в записной книжке одного человека какой-то номер встречается дважды, его следует считать дважды. То есть каждый номер нужно учесть столько же раз, сколько он встречается в записной книжке.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — количество друзей.

Далее следует n блоков данных описывающих записные книжки каждого из них. Каждый блок соответствует следующему формату: сперва идет строка, содержащая целое число si и строка namei (0 ≤ si ≤ 100) — количество номеров в записной книжке i-ого из друзей и его имя. Имя — непустая последовательность больших и маленьких букв латинского алфавита, содержащая не более 20 символов. Следующие si строк содержат номера в формате «XX-XX-XX», где X — произвольные цифры от 0 до 9.

Выходные данные

В первой строке выведите фразу «If you want to call a taxi, you should call: ». Далее выведите имена всех друзей, имеющих в своих записных книжках максимальное количество номеров такси.

Во второй строке выведите фразу «If you want to order a pizza, you should call: ». Далее выведите имена всех друзей с максимальным количеством номеров доставки пиццы.

В третьей строке выведите фразу «If you want to go to a cafe with a wonderful girl, you should call: ». Далее выведите имена всех друзей с максимальным количеством номеров девушек.

Имена выводите в том же порядке, в котором они даны во входных данных. Два последовательных имени разделяйте запятой и пробелом. Каждая строка должна заканчиваться ровно одной точкой. Для уточнения формата вывода смотрите примеры. Необходимо строго следовать формату вывода. Лишние пробелы не допускаются.

Примечание

В первом примере дано четыре друга. В записной книжке Fedorov находится один номер такси и один номер доставки пиццы, у Melnikov есть только 3 номера девушек, Rogulenko6 номеров такси и один номер доставки пиццы, Kaluzhin2 номера такси и один номер доставки пиццы.

Таким образом, если требуется заказать такси очевидно звонить нужно Rogulenko, чтобы заказать пиццу нужно позвонить любому из Rogulenko, Fedorov, Kaluzhin (у каждого по одному номеру), по количеству номеров девушек первое место единолично занимает Melnikov.

C. Очередная задача про колоду карт

Деревья Перебор реализация Структуры данных *1100

У вас есть колода из \(n\) карт, пронумерованных сверху вниз, т. е. у верхней карты индекс \(1\), а у нижней — \(n\). У каждой карты есть цвет: цвет \(i\)-й карты равен \(a_i\).

Вам нужно обработать \(q\) запросов: \(j\)-й запрос описывается одним целым числом \(t_j\). Для каждого запроса вам нужно:

  • найти самую верхнюю карту в колоде с цветом \(t_j\), т. е. карту с минимальным индексом;
  • вывести индекс найденной карты;
  • вытащить данную карту и положить ее сверху колоды.
Входные данные

В первой строке заданы два целых числа \(n\) и \(q\) (\(2 \le n \le 3 \cdot 10^5\); \(1 \le q \le 3 \cdot 10^5\)) — количество карт в колоде и количество запросов.

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 50\)) — цвета карт.

В третьей строке заданы \(q\) целых чисел \(t_1, t_2, \dots, t_q\) (\(1 \le t_j \le 50\)) — цвета в запросах. Гарантируется, что в запросах используются только цвета, представленные в колоде.

Выходные данные

Выведите \(q\) целых чисел — ответы на все запросы.

Примечание

Описание примера:

  1. текущая колода \([2, 1, 1, 4, \underline{3}, 3, 1]\) и верхняя карта цвета \(t_1 = 3\) на позиции \(5\);
  2. текущая колода \([3, \underline{2}, 1, 1, 4, 3, 1]\) и верхняя карта цвета \(t_2 = 2\) на позиции \(2\);
  3. текущая колода \([2, 3, \underline{1}, 1, 4, 3, 1]\) и верхняя карта цвета \(t_3 = 1\) на позиции \(3\);
  4. текущая колода \([\underline{1}, 2, 3, 1, 4, 3, 1]\) и верхняя карта цвета \(t_4 = 1\) на позиции \(1\);
  5. текущая колода \([1, 2, 3, 1, \underline{4}, 3, 1]\) и верхняя карта цвета \(t_5 = 4\) на позиции \(5\).

A. Шпион обнаружен!

Перебор реализация *800

Вам дан массив \(a\), состоящий из \(n\) (\(n \ge 3\)) целых положительных чисел. Известно, что в этом массиве, все числа, кроме одного, совпадают (например, в массиве \([4, 11, 4, 4]\) все числа, кроме одного, равны \(4\)).

Выведите номер элемента, который не совпадает с остальными. Числа в массиве пронумерованы с единицы.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 100\)). Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(3 \le n \le 100\)) — длина массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 100\)).

Гарантируется, что в массиве \(a\) все числа, кроме одного, совпадают.

Выходные данные

Для каждого набора входных данных выведите одно целое число — номер элемента, который не совпадает с остальными.

B. Почти прямоугольник

реализация *800

На квадратном поле \(n \times n\) отмечены две клетки. Они могут находиться в одной строке или столбце.

Необходимо отметить еще две клетки так, чтобы они являлись углами какого-либо прямоугольника со сторонами, параллельными осям координат.

Например, если \(n=4\) и прямоугольное поле выглядит следующим образом (в отмеченных клетках находятся звездочки):

\(\) \begin{matrix} . & . & * & . \\ . & . & . & . \\ * & . & . & . \\ . & . & . & . \\ \end{matrix} \(\)

То можно отметить еще две клетки следующим образом:

\(\) \begin{matrix} * & . & * & . \\ . & . & . & . \\ * & . & * & . \\ . & . & . & . \\ \end{matrix} \(\)

Если существует несколько возможных решений, то выведите любое.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 400\)). Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора входных данных находится целое число \(n\) (\(2 \le n \le 400\)) — количество строк и столбцов в таблице.

В следующих \(n\) строках находится по \(n\) символов '.' или '*' обозначающих пустые и отмеченные клетки, соответственно.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(400\).

Гарантируется, что на поле есть ровно две звездочки. Они могут находиться в одной строке или столбце.

Гарантируется, что решение существует.

Выходные данные

Для каждого набора входных данных выведите \(n\) строк по \(n\) символов — поле с четырьмя отмеченными звездочками, соответствующее условию. Если ответов несколько, то выведите любой из них.

C. A-B палиндром

Конструктив реализация Строки *1200

Вам дана строка \(s\), состоящая из символов '0', '1' и '?'. Вам необходимо заменить все символы '?' в строке \(s\) на '0' или '1' так, чтобы строка стала палиндромом и чтобы в ней было ровно \(a\) символов '0' и ровно \(b\) символов '1'. Обратите внимание, что каждый из символов '?' вы заменяете независимо от других.

Строка \(t\) длины \(n\) называется палиндромом, если для всех \(i\) (\(1 \le i \le n\)) верно равенство \(t[i] = t[n-i+1]\).

Например, если \(s=\)«01?????0», \(a=4\) и \(b=4\), то можно заменить символы '?' следующими способами:

  • «01011010»;
  • «01100110».

Для заданной строки \(s\) и чисел \(a\) и \(b\) замените все символы '?' в строке \(s\) на '0' или '1' так, чтобы строка стала палиндромом и чтобы в ней было ровно \(a\) символов '0' и ровно \(b\) символов '1'.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 10^4\)). Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(a\) и \(b\) (\(0 \le a, b \le 2 \cdot 10^5\), \(a + b \ge 1\)).

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(a+b\), состоящую из символов '0', '1' и '?'.

Гарантируется, что сумма длин строк \(s\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите:

  • «-1», если нельзя заменить все символы '?' в строке \(s\) на '0' или '1' так, чтобы строка стала палиндромом и чтобы в ней было ровно \(a\) символов '0' и ровно \(b\) символов '1';
  • строку, которая получается в результате замены, в противном случае.

Если существует несколько подходящий способов замены символов, то можете выводить любой.

F. Образование

дп жадные алгоритмы Перебор реализация *1900

Поликарп мечтает о покупке нового компьютера, который стоит \(c\) тугриков. Для этого он хочет устроиться программистом в большую компанию.

В компании Поликарпа есть \(n\) должностей, пронумерованных начиная с единицы. Сотрудник на должности \(i\) каждый день зарабатывает \(a[i]\) тугриков. Чем выше номер должности, тем больше тугриков получает сотрудник. Изначально Поликарп устраивается на должность с номером \(1\) и имеет \(0\) тугриков.

Каждый день Поликарп может сделать одно из двух действий:

  • Если Поликарп находится на должности \(x\), то он может заработать \(a[x]\) тугриков;
  • Если Поликарп находится на должности \(x\) (\(x < n\)) и имеет хотя бы \(b[x]\) тугриков, то он может потратить \(b[x]\) тугриков на онлайн-курс и перейти на должность \(x+1\).

Например, если \(n=4\), \(c=15\), \(a=[1, 3, 10, 11]\), \(b=[1, 2, 7]\), то Поликарп может действовать так:

  • В первый день Поликарп находится на должности \(1\) и зарабатывает \(1\) тугрик. Теперь у него есть \(1\) тугрик;
  • Во второй день Поликарп находится на должности \(1\) и переходит на должность \(2\). Теперь у него есть \(0\) тугриков;
  • В третий день Поликарп находится на должности \(2\) и зарабатывает \(3\) тугрика. Теперь у него есть \(3\) тугрика;
  • В четвертый день Поликарп находится на должности \(2\) и переходит на должность \(3\). Теперь у него есть \(1\) тугрик;
  • В пятый день Поликарп находится на должности \(3\) и зарабатывает \(10\) тугриков. Теперь у него есть \(11\) тугриков;
  • В шестой день Поликарп находится на должности \(3\) и зарабатывает \(10\) тугриков. Теперь у него есть \(21\) тугриков;
  • Спустя шесть дней, Поликарп может купить себе новый компьютер.

Найдите минимальное количество дней, через которое Поликарп сможет купить себе новый компьютер.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 10^4\)). Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(c\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le c \le 10^9\)) — количество должностей в компании и стоимость нового компьютера.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1 \le a_2 \le \ldots \le a_n\) (\(1 \le a_i \le 10^9\)).

Третья строка каждого набора входных данных содержит \(n - 1\) целое число \(b_1, b_2, \ldots, b_{n-1}\) (\(1 \le b_i \le 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышаем \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество дней, через которое Поликарп сможет купить себе новый компьютер.

A. Массив и пики

Конструктив реализация *800

Последовательность \(n\) целых чисел называется перестановкой, если она содержит все целые числа от \(1\) до \(n\) по одному разу.

Вам даны два целых числа \(n\) и \(k\). Постройте перестановку \(a\) чисел от \(1\) до \(n\), в которой ровно \(k\) пиков. Индекс \(i\) массива \(a\) размера \(n\) называется пиком, если \(1 < i < n\), \(a_i \gt a_{i-1}\) и \(a_i \gt a_{i+1}\). Если такой перестановки не существует, выведите \(-1\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Далее следуют \(t\) строк, каждая из которых содержит два целых числа \(n\) (\(1 \leq n \leq 100\)) и \(k\) (\(0 \leq k \leq n\)) — требуемую длину массива и необходимое число пиков.

Выходные данные

Выведите \(t\) строк. Для каждого набора входных данных, если необходимой перестановки не существует, выведите \(-1\). В противном случае выведите строку, содержащую \(n\) целых чисел, образующих перестановку целых чисел \(1\) до \(n\), содержащую ровно \(k\) пиков.

Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных ответом является, например, \(a = [2,4,1,5,3]\). Здесь индексы \(i=2\) и \(i=4\) являются пиками. Это так, потому что \((a_{2} \gt a_{1} \), \(a_{2} \gt a_{3})\), а также \((a_{4} \gt a_{3}\), \(a_{4} \gt a_{5})\).

D. Вырежи и склей

Бинарный поиск жадные алгоритмы реализация сортировки Структуры данных *2000

У маленького Эхаба есть набор для аппликации, содержащий массив \(a\) длины \(n\). Он планирует взять ножницы и сделать следующее:

  • выбрать отрезок \((l, r)\), и вырезать каждый элемент \(a_l\), \(a_{l + 1}\), ..., \(a_r\) на этом отрезке;
  • склеить некоторые из элементов вместе в том же порядке, в котором они шли в массиве;
  • в итоге, получится несколько кусочков, каждый кусочек содержит некоторые элементы, и каждый элемент принадлежит какому-то кусочку.

Более формально, он разделит последовательность \(a_l\), \(a_{l + 1}\), ..., \(a_r\) на подпоследовательности. Он считает, что разделение красивое, если для каждого кусочка (подпоследовательности) верно, что если его длина равна \(x\), то никакое значение не встречается строго больше \(\lceil \frac{x}{2} \rceil\) раз в этом кусочке.

Эхаб еще не определился с отрезком, поэтому он интересуется для \(q\) отрезков \((l, r)\), чему равно минимальное количество кусочков, на которые нужно разделить \(a_l\), \(a_{l + 1}\), ..., \(a_r\), чтобы разделение было красивым.

Последовательность \(b\) является подпоследовательностью массива \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, ни одного) элементов. Обратите внимание, что она не обязательно должна быть непрерывной.

Входные данные

В первой строке даны два целых числа \(n\) и \(q\) (\(1 \le n,q \le 3 \cdot 10^5\)) — длина массива \(a\) и количество запросов.

Во второй строке даны \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_{n}\) (\(1 \le a_i \le n\)) — элементы массива \(a\).

Каждая из следующих \(q\) строк содержит два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)) — отрезок этого запроса.

Выходные данные

Для каждого запроса выведите минимальное количество подпоследовательностей, на которые нужно разбить отрезок, чтобы разбиение было красивым. Можно доказать, что такое разбиение всегда существует.

Примечание

В первом запросе можно взять весь массив в одну подпоследовательность, так как его длина равна \(6\), и ни одно значение не встречается в нем больше \(3\) раз.

Во втором запросе элементы отрезка равны \([3,2,3,3]\). Вы не можете взять их всех в одну подпоследовательность, потому что ее длина будет равна \(4\), и \(3\) встречается в ней больше \(2\) раз. Однако, вы можете разделить отрезок на две подпоследовательности: \([3]\) и \([2,3,3]\).

C. Филломино 2

жадные алгоритмы Конструктив поиск в глубину и подобное реализация *1400

Филломино это классическая головоломка. (Вам не нужно знать Филломино, чтобы решить эту задачу.) В одной из аудиторий в городе Юньци несколько человек играют в настольную игру, вдохновленную этой головоломкой:

Рассмотрим шахматную доску \(n\) на \(n\). Ее строки пронумерованы от \(1\) до \(n\) сверху вниз. А столбцы пронумерованы от \(1\) до \(n\) слева направо. Клетка на пересечении \(x\)-й строки и \(y\)-го столбца обозначается \((x, y)\). Главная диагональ доски это клетки \((x, x)\) для всех \(1 \le x \le n\).

На главной диагонали доски написана перестановка чисел \(\{1, 2, 3, \dots, n\}\). В каждой из клеток написано ровно одно число. Цель игры — разделить клетки ниже и на главной диагонали (таких клеток ровно \(1+2+ \ldots +n\) штук) на \(n\) связных областей, которые удовлетворяют следующим условиям:

  1. Каждая область должна быть связной. Это означает, что мы можем добраться от любой клетки области до любой другой клетки той же области, посещая только клетки из этой области и перемещаясь из клетки в соседнюю по стороне.
  2. \(x\)-я область должна содержать клетку главной диагонали, в которой написано \(x\), для всех \(1\le x\le n\).
  3. Количество клеток, принадлежащих \(x\)-й области, должно равняться \(x\) для всех \(1\le x\le n\).
  4. Каждая клетка ниже и на главной диагонали должна принадлежать ровно одной области.
Входные данные

Первая строка содержит одно целое число \(n\) (\(1\le n \le 500\)), обозначающее размер доски.

Вторая строка содержит \(n\) целых чисел \(p_1\), \(p_2\), ..., \(p_n\). \(p_i\) это число, написанное в клетке \((i, i)\). Гарантируется, что каждое из чисел \(\{1, \ldots, n\}\) встречаются ровно один раз среди \(p_1\), ..., \(p_n\).

Выходные данные

Если решения не существует, выведите \(-1\).

Иначе, выведите \(n\) строк. \(i\)-я строка должна содержать \(i\) чисел. \(j\)-е число в \(i\)-й строке должно равняться \(x\), если клетка \((i, j)\) принадлежит области размера \(x\).

Примечание

Решения для примеров изображены на иллюстрациях:

E. Групповое фото

Бинарный поиск реализация Структуры данных *2500

На конференции 2050 собралось несколько человек, увлекающихся спортивным программированием. Они собираются сделать общее фото. \(n\) человек выстроились в ряд. Они пронумерованы от \(1\) до \(n\) слева направо. Каждый из них держит в руках табличку с буквой «C» или с буквой «P».

Пусть \(C=\{c_1,c_2,\dots,c_m\}\) \((c_1<c_2<\ldots <c_m)\) — это множество людей, которые держат таблички с буквой «C». Аналогично, \(P=\{p_1,p_2,\dots,p_k\}\) \((p_1<p_2<\ldots <p_k)\) — множество людей, которые держат таблички с буквой «P». Фото хорошее тогда и только тогда, когда выполнены следующие ограничения:

  1. \(C\cup P=\{1,2,\dots,n\}\)
  2. \(C\cap P =\emptyset \).
  3. \(c_i-c_{i-1}\leq c_{i+1}-c_i(1< i <m)\).
  4. \(p_i-p_{i-1}\geq p_{i+1}-p_i(1< i <k)\).

Вам дан массив \(a_1,\ldots, a_n\), найдите количество хороших фото, удовлетворяющих условию: \(\)\sum\limits_{x\in C} a_x < \sum\limits_{y\in P} a_y.\(\)

Ответ может быть большим, поэтому выведите его по модулю \(998\,244\,353\). Два фото считаются разными, если существует хотя бы один человек, который держит табличку с буквой «C» на одном фото, и с буквой «P» на другом.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 200\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\leq n\leq 200\,000\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(200\,000\).

Выходные данные

Для каждого набора входных данных выведите ответ по модулю \(998\,244\,353\) на новой строке.

Примечание

В первом наборе входных данных есть \(10\) хороших фото, которые удовлетворяют условию: PPPPP, CPPPP, PCPPP, CCPPP, PCCPP, PCPCP, PPPPC, CPPPC, PCPPC, PPPCC.

Во втором наборе входных данных есть \(7\) хороших фото, которые удовлетворяют условию: PPPP, PCPP, PCCP, PPPC, PCPC, PPCC, PCCC

D. Максимальная сумма произведений

дп математика Перебор реализация *1600

Вам заданы два массива целых чисел \(a\) и \(b\) длины \(n\).

Вы можете развернуть не более одного подмассива (последовательного отрезка) массива \(a\).

Ваша задача состоит в том, чтобы перевернуть такой подмассив, чтобы сумма \(\sum\limits_{i=1}^n a_i \cdot b_i\) была максимально возможной.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 5000\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^7\)).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le 10^7\)).

Выходные данные

Выведите одно целое число — максимально возможную сумма после разворота не более одного подмассива (последовательного отрезка) \(a\).

Примечание

В первом примере можно перевернуть подмассив \([4, 5]\). Тогда \(a = [2, 3, 2, 3, 1]\) и \(2 \cdot 1 + 3 \cdot 3 + 2 \cdot 2 + 3 \cdot 4 + 1 \cdot 2 = 29\).

Во втором примере не нужно использовать операцию. \(13 \cdot 2 + 37 \cdot 4 = 174\).

В третьем примере можно перевернуть подмассив \([3, 5]\). Тогда \(a = [1, 8, 3, 6, 7, 6]\) и \(1 \cdot 5 + 8 \cdot 9 + 3 \cdot 6 + 6 \cdot 8 + 7 \cdot 8 + 6 \cdot 6 = 235\).

A. Оценки

реализация *900

Вася, а точнее Василий Петрович, — декан одного из факультетов в местном университете. После сессии в его руки попал журнал успеваемости одной из групп.

Всего в этой группе учатся n студентов, а оценки ставились по m предметам. Каждый из студентов по каждому из предметов получил оценку от 1 до 9 включительно.

Назовем студента лучшим по некоторому предмету, если нет студента, который получил оценку выше по этому предмету. Назовем студента успешным, если существует предмет, по которому он лучший.

Ваша задача — найти количество успешных студентов в группе.

Входные данные

В первой строке входных данных даны два целых числа n и m (1 ≤ n, m ≤ 100) — количество студентов и количество предметов соответственно. Далее в n строках по m символов в каждой дана таблица успеваемости, где каждый символ — это цифра от 1 до 9. Обратите внимание, что оценки в таблице успеваемости не разделяются пробелами.

Выходные данные

Выведите единственное число — количество успешных студентов в данной группе.

Примечание

В первом примере студент номер 1 — лучший по предметам 1 и 3, студент 2 — лучший по предметам 1 и 2, а студент 3 не является лучшим ни по одному из предметов.

Во втором примере каждый из студентов является лучшим хотя бы по одному из предметов.

B. Шаги

Бинарный поиск реализация *1300

Однажды Вася вышел во двор погулять, а там не оказалось его друзей, с которыми он обычно играл в салки. Мальчик не растерялся и решил поиграть в салки сам с собой. «Как он это сделал?» — спросите вы. Очень просто.

Вася заметил, что двор представляет собой прямоугольное поле размером n × m клеток, а каждая клетка имеет координаты (x, y) (1 ≤ x ≤ n, 1 ≤ y ≤ m), где x — номер строки поля, y — номер столбца поля.

Изначально, Вася стоит в клетке с координатами (xc, yc). Для игры у него заготовлен список из k векторов (dxi, dyi) ненулевой длины. Действие игры происходит следующим образом. Мальчик рассматривает все вектора в порядке от 1 до k, и по очереди выбирает каждый из них в качестве текущего. Выбрав вектор в качестве текущего, мальчик делает максимально возможное количество корректных шагов по направлению этого вектора (возможно, ноль шагов).

Шагом называется одно перемещение из клетки, где сейчас стоит мальчик, в направлении текущего вектора. То есть, если Вася находится в клетке (x, y), а текущий вектор — (dx, dy), то за один шаг Вася перемещается в клетку (x + dx, y + dy). Шаг считается корректным, если, совершая этот шаг, мальчик не выходит за пределы двора.

Вася шагал и шагал, шагал и шагал, до тех пор, пока вектора из его списка не закончились. Он так много шагал, что совершенно позабыл, сколько шагов он сделал. Помогите мальчику — посчитайте, сколько шагов он сделал.

Входные данные

В первой строке входных данных даны два целых числа n и m (1 ≤ n, m ≤ 109) — размеры двора. Во второй строке записаны целые числа xc и yc — координаты начальной клетки (1 ≤ xc ≤ n, 1 ≤ yc ≤ m).

В третьей строке задано целое число k (1 ≤ k ≤ 104) — количество векторов. Далее идут k строк, в каждой из которых записаны два целых числа dxi и dyi (|dxi|, |dyi| ≤ 109, |dx| + |dy| ≥ 1).

Выходные данные

Выведите единственное целое число — количество шагов, которые сделал Вася.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере Вася изначально находится в клетке (1, 1) и делает 3 шага по первому вектору (1, 1) последовательно посещая клетки: (2, 2), (3, 3), (4, 4). Затем он делает 0 шагов по второму вектору (1, 1). И 1 шаг по третьему вектору (0,  - 2) и оказывается в клетке (4, 2). В итоге Вася сделает 4 шага.

Во втором примере Вася изначально находится в клетке (1, 2) и делает 0 шагов по вектору ( - 1, 0), так как клетка с координатами (0, 2) находится вне двора.

A. Не отвлекайся!

Перебор реализация *800

У Поликарпа есть \(26\) задач. Каждая задача обозначается заглавной буквой латинского алфавита.

Учитель попросил Поликарпа решать задачи следующим образом: если Поликарп начал решать какую-то задачу, то он должен решать ее до конца, не отвлекаясь на другие задачи. После переключения на другую задачу, возвращаться к предыдущей задаче нельзя.

Поликарп может решать только одну задачу в течение дня. Каждый день он записывал, какую задачу он решал. Теперь учитель хочет узнать, следовал ли Поликарп его советам.

Например, если Поликарп решал задачи в следующем порядке «DDBBCCCBBEZ», то учитель увидит, что в третий день Поликарп начал решать задачу 'B', потом в пятый день он отвлекся и начал решать задачу 'C' и в восьмой день Поликарп вернулся к задаче 'B'. Другие примеры, когда у учителя возникают подозрения: «BAB», «AABBCCDDEEBZZ» и «AAAAZAAAAA».

Если же Поликарп решал задачи в следующем порядке «FFGZZZY», то у учителя не может возникнуть никаких подозрений. Обратите внимание, что Поликарп не обязан решать все задачи. Другие примеры, когда у учителя не возникает подозрений: «BA», «AFFFCC» и «YYYYY».

Помогите Поликарпу узнать, могут ли возникнуть подозрения у его учителя.

Входные данные

В первой строке находится целое число \(t\) (\(1 \le t \le 1000\)). Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора входных данных находится одно целое число \(n\) (\(1 \le n \le 50\)) — количество дней в течение которых Поликарп решал задачи.

Во второй строке находится строка длины \(n\) состоящая из заглавных английских букв — задачи которые решал Поликарп.

Выходные данные

Для каждого набора входных данных выведите:

  • «YES», если у учителя не могут возникнуть подозрения;
  • «NO», в противном случае.

Вы можете вывести каждую букву в любом регистре (например, YES, Yes, yes, yEs будут распознаны как положительный ответ).

G. Идти или не идти?

графы жадные алгоритмы кратчайшие пути Перебор поиск в глубину и подобное реализация *2200

Дима проспал будильник, который должен был поднять его в школу.

Диме интересно, успеет ли он прийти на первый урок. Для этого ему необходимо узнать минимальное время, которое потребуется ему, чтобы дойти от дома до школы.

Город, в котором живет Дима, представляет собой прямоугольное поле размером \(n \times m\). Каждая клетка \((i, j)\) на этом поле обозначается одним числом \(a_{ij}\):

  • Число \(-1\) означает, что проход по клетке запрещен;
  • Число \(0\) означает, что клетка свободна, и Дима может по ней пройти.
  • Число \(x\) (\(1 \le x \le 10^9\)) означает, что в клетке расположен портал со стоимостью \(x\). Клетка с порталом также считается свободной.

Из любого портала Дима может отправиться в любой другой портал, при этом время перемещения из портала \((i, j)\) в портал \((x, y)\) соответствует сумме их стоимостей \(a_{ij} + a_{xy}\).

Помимо перемещения между порталами, Дима также может перемещаться между соседними по стороне не занятыми клетками за время \(w\). В частности, он может заходить на клетку с порталом и не пользоваться им.

Изначально Дима находится в левой верхней клетке \((1, 1)\), а школа в правой нижней клетке \((n, m)\).

Входные данные

В первой строке содержатся три целых числа \(n\), \(m\) и \(w\) (\(2 \le n, m \le 2 \cdot 10^3\), \(1 \le w \le 10^9\)), где \(n\) и \(m\) — размеры города, \(w\) — время, за которое Дима перемещается между не занятыми клетками.

Следующие \(n\) строк содержат по \(m\) чисел (\(-1 \le a_{ij} \le 10^9\)) — описания клеток.

Гарантируется, что клетки \((1, 1)\) и \((n, m)\) свободны.

Выходные данные

Выведите одно число — минимальное время, которое потребуется Диме, чтобы добраться до школы. Если он не сможет добраться до школы вообще — выведите «-1».

Примечание

Пояснение к первому примеру:

D. Настя играет с деревом

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм Структуры данных *2500

У Насти есть невзвешенное дерево из \(n\) вершин, с которым ей не терпится поиграть!

Девочка будет выполнять следующую операцию с деревом столько раз, сколько ей потребуется:

  1. удалить любое существующее ребро, затем
  2. добавить неориентированное ребро между любой парой вершин.

Какое минимальное количество операций требуется девочке, чтобы получить из дерева бамбук? Бамбуком называется дерево, степень вершин в котором не превосходит \(2\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных.

В первой строке каждого набора задано число \(n\) (\(2 \le n \le 10^5\)) — количество вершин в дереве.

Следующая \(n - 1\) строка каждого набора входных данных описывают ребро дерево в формате \(a_i\), \(b_i\) (\(1 \le a_i, b_i \le n\), \(a_i \neq b_i\)).

Гарантируется, что заданный граф является деревом и сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого из наборов входных данных в первой строке выведите одно целое число \(k\) — минимальное количество операций, необходимых, чтобы получить из дерева бамбук.

В последующих \(k\) строках выведите \(4\) целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(1 \le x_1, y_1, x_2, y_{2} \le n\), \(x_1 \neq y_1\), \(x_2 \neq y_2\)) — таким образом вы удаляете ребро \((x_1, y_1)\) и добавляете неориентированное ребро \((x_2, y_2)\).

Обратите внимание, что ребро \((x_1, y_1)\) обязано содержаться в графе до его удаления.

Примечание

Обратите внимание, что граф может быть несвязным после какого-то количества операций.

Рассмотрим первый набор входных данных:

Красным обозначены удаленные ребра, а зеленым – добавленные.

A. Игра в жизнь

реализация *800

Василию очень нравится клеточный автомат «Game of life», поэтому он решил попробовать придумать что-то подобное. Для простоты, Василий решил определить свой клеточный автомат на массиве из \(n\) ячеек, каждый элемент которого может быть в живом или неживом состоянии.

Эволюция массива в клеточном автомате Василия происходит итеративно следующим образом:

  • Если у неживого элемента есть ровно \(1\) живой сосед в текущем состоянии массива, то на следующей итерации он станет живым. Соседями для элемента на позиции \(i\) являются элементы на позициях \(i - 1\) и \(i + 1\), если соседа на такой позиции не существует, то считается, что он мертв.
  • Василий — гуманист, поэтому все живые элементы в его автомате остаются живыми.

Смотрите секцию примечание для примеров эволюции.

Вам дано некоторое начальное состояние всех элементов, и вам нужно помочь Василию определить, каким будет состояние массива через \(m\) итераций эволюции.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 10^3, 1 \le m \le 10^9\)) — количество ячеек в массиве и количество итераций.

Вторая строка набора входных данных содержит строку длины \(n\) из «0» и «1» — описание начального состояния. «1» обозначает живую клетку, а «0» — неживую.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

Для каждого набора входных данных выведите строку из \(n\) символов «0» и «1» — состояние массива через \(m\) итераций эволюции.

Примечание

Последовательность итераций эволюции для первого набора данных:

  • 01000000001 — начальное состояние
  • 11100000011 — первая итерация эволюции
  • 11110000111 — вторая итерация эволюции
  • 11111001111 — третья итерация эволюции

Последовательность итераций эволюции для второго набора данных:

  • 0110100101 — начальное состояние
  • 1110111101 — первая итерация эволюции
  • 1110111101 — вторая итерация эволюции

A. Игра в жизнь

реализация *800

Василию очень нравится клеточный автомат «Game of life», поэтому он решил попробовать придумать что-то подобное. Для простоты, Василий решил определить свой клеточный автомат на массиве из \(n\) ячеек, каждый элемент которого может быть в живом или неживом состоянии.

Эволюция массива в клеточном автомате Василия происходит итеративно следующим образом:

  • Если у неживого элемента есть ровно \(1\) живой сосед в текущем состоянии массива, то на следующей итерации он станет живым. Соседями для элемента на позиции \(i\) являются элементы на позициях \(i - 1\) и \(i + 1\), если соседа на такой позиции не существует, то считается, что он мертв.
  • Василий — гуманист, поэтому все живые элементы в его автомате остаются живыми.

Смотрите секцию примечание для примеров эволюции.

Вам дано некоторое начальное состояние всех элементов, и вам нужно помочь Василию определить, каким будет состояние массива через \(m\) итераций эволюции.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 10^3, 1 \le m \le 10^9\)) — количество ячеек в массиве и количество итераций.

Вторая строка набора входных данных содержит строку длины \(n\) из «0» и «1» — описание начального состояния. «1» обозначает живую клетку, а «0» — неживую.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

Для каждого набора входных данных выведите строку из \(n\) символов «0» и «1» — состояние массива через \(m\) итераций эволюции.

Примечание

Последовательность итераций эволюции для первого набора данных:

  • 01000000001 — начальное состояние
  • 11100000011 — первая итерация эволюции
  • 11110000111 — вторая итерация эволюции
  • 11111001111 — третья итерация эволюции

Последовательность итераций эволюции для второго набора данных:

  • 0110100101 — начальное состояние
  • 1110111101 — первая итерация эволюции
  • 1110111101 — вторая итерация эволюции

C. Вложить и выложить

Деревья жадные алгоритмы Перебор реализация Структуры данных *1600

Василий — большой любитель планирования дел наперед. Поэтому каждое утро он занимается формированием вложенного списка предстоящих дел.

Корректным вложенным списком является любой список, который можно получить из списка с одним пунктом «1» путем применения операций. Каждая операция вставляет в список новый пункт на следующей строке после одного из уже существующих пунктов \(a_1 \,.\, a_2 \,.\, a_3 \,.\, \,\cdots\, \,.\,a_k\), и бывает двух видов:

  1. добавить пункт \(a_1 \,.\, a_2 \,.\, a_3 \,.\, \cdots \,.\, a_k \,.\, 1\) (начав более вложенный список), или
  2. добавить пункт \(a_1 \,.\, a_2 \,.\, a_3 \,.\, \cdots \,.\, (a_k + 1)\) (продолжив текущий уровень).
Операцию можно производить только при условии, что в списке не появится двух одинаковых пунктов. А также, если рассматривать каждый пункт как последовательность чисел, последовательность пунктов должна всегда оставаться возрастающей в лексикографическом порядке. Примеры корректных и некорректных списков приведены на рисунке. Пример того, как можно получить корректный список, изображенный на картинке, приведен в секции «Примечание».

Когда Василий захотел сохранить Word-документ со списком своих дел, он промахнулся и вместо «Ctrl+S» нажал совсем другую комбинацию клавиш. Достоверно неизвестно, что это была за комбинация клавиш, но после ее нажатия каждый пункт списка заменился одним числом: числом, изначально написанным последним в номере пункта.

Василий хочет, чтобы вы помогли ему восстановить подходящий изначальный вложенный список.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(1 \le n \le 10^3\)) — количество строк в списке.

Следующие \(n\) строк набора входных данных содержат по одному числу \(a_i\) (\(1 \le a_i \le n\)) — описание того, что осталось от вложенного списка Василия.

Гарантируется, что в каждом наборе входных данных существует хотя бы один подходящий список.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^3\).

Выходные данные

Для каждого набора входных данных выведите \(n\) строк, которые являются корректным вложенным списком, из которого мог получиться список, который вам предоставил Василий.

Если ответов несколько, то вы можете вывести любой подходящий.

Примечание

Во втором наборе входных данных одним из корректных подходящих списков является:

1

1.1

1.1.1

1.1.2

1.2

1.2.1

2

2.1

2.2

Такой список можно получить при помощи последовательности операций, показанной ниже:

  1. Изначальный список с одним пунктом \(1\).
  2. Вставляем пункт \(2\) при помощи операции вставки второго типа после пункта \(1\).
  3. Вставляем пункт \(1.1\) при помощи операции вставки первого типа после пункта \(1\).
  4. Вставляем пункт \(1.2\) при помощи операции вставки второго типа после пункта \(1.1\).
  5. Вставляем пункт \(1.1.1\) при помощи операции вставки первого типа после пункта \(1.1\).
  6. Вставляем пункт \(1.1.2\) при помощи операции вставки второго типа после пункта \(1.1.1\).
  7. Вставляем пункт \(1.2.1\) при помощи операции вставки первого типа после пункта \(1.2\).
  8. Вставляем пункт \(2.1\) при помощи операции вставки первого типа после пункта \(2\).
  9. Вставляем пункт \(2.2\) при помощи операции вставки второго типа после пункта \(2.1\).

C. Столкновения роботов

жадные алгоритмы реализация сортировки Структуры данных *2000

\(n\) роботов ездят по координатной оси OX. На этой оси также есть две стены: одна в координате \(0\), другая в координате \(m\).

\(i\)-й робот начинает в целой координате \(x_i~(0 < x_i < m)\) и движется либо влево (в сторону \(0\)), либо вправо со скоростью \(1\) в секунду. Никакие два робота не начинают в одной координате.

Когда робот достигает стены, он мгновенно разворачивается и продолжает свою поездку в противоположном направлении с той же скоростью.

Когда несколько роботов встречаются в одной целой координате, они сталкиваются и взрываются. Как только робот взорвался, он больше не сталкивается с другими роботами. Обратите внимание, что если роботы встретятся в нецелой координате, то ничего не случится.

Для каждого робота проверьте, взорвется ли он когда-нибудь, и выведите время взрыва, если да, и \(-1\) в противном случае.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следуют описания \(t\) наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n \le 3 \cdot 10^5\); \(2 \le m \le 10^8\)) — количество роботов и координата правой стены.

Во второй строке каждого набора входных данных записаны \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(0 < x_i < m\)) — начальные координаты каждого робота.

В третьей строке каждого набора входных данных записаны \(n\) символов 'L' или 'R' — начальные направления роботов ('L' означает влево, а 'R' означает вправо).

Все координаты \(x_i\) в наборе входных данных различны.

Сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите \(n\) целых чисел — для \(i\)-го робота выведите время взрыва, если он взорвется, и \(-1\) в противном случае.

Примечание

Изображение секунд \(0, 1, 2\) и \(3\) для первого набора входных данных:

Обратите внимание, что роботы \(2\) и \(3\) не сталкиваются, потому что они встречаются в одной точке \(2.5\), которая не является целой.

После секунды \(3\) робот \(6\) просто ездит бесконечно, потому что нет робота, с которым он мог бы столкнуться.

C. Парный вес последовательности

математика реализация хэши *1600

Вес последовательности определяется как количество пар \((i,j)\) (здесь \(i \lt j\)) с равными значениями (\(a_{i} = a_{j}\)). Например, вес последовательности \(a = [1, 1, 2, 2, 1]\) равен \(4\). Множество неупорядоченных пар индексов с равными значениями: \((1, 2)\), \((1, 5)\), \((2, 5)\), и \((3, 4)\).

Вам задана последовательность \(a\) из \(n\) чисел. Найдите сумму весов всех подотрезков \(a\).

Последовательность \(a\) является подотрезком \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) элементов из начала и нескольких (возможно, ни одного или всех) элементов из конца.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее идет описание наборов.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число  — сумму весов всех подотрезков \(a\).

Примечание
  • В примере \(1\), все возможные подотрезки \([1, 2, 1, 1]\) имеющие размер более \(1\) это:
    1. \([1, 2]\) содержит \(0\) пар;
    2. \([2, 1]\) содержит \(0\) пар;
    3. \([1, 1]\) содержит \(1\) пару;
    4. \([1, 2, 1]\) содержит \(1\) пару;
    5. \([2, 1, 1]\) содержит \(1\) пару;
    6. \([1, 2, 1, 1]\) содержит \(3\) пары.
    Таким образом ответ \(6\).
  • В примере \(2\) все элементы различны. Таким образом, ни для одного подотрезка нет подходящей пары. Ответ \(0\).

D. MEX дерево

Деревья Комбинаторика математика поиск в глубину и подобное реализация *2400

Вам дано дерево из \(n\) вершин, в котором вершины пронумерованы от \(0\) до \(n-1\). Для каждого \(k\) от \(0\) до \(n\) включительно вам необходимо посчитать количество неупорядоченных пар \((u,v)\), \(u \neq v\), таких, что MEX всех номеров вершин на пути от \(u\) до \(v\) равен \(k\).

MEX последовательности целых чисел равен наименьшему неотрицательному целому числу, которое в ней не встречается.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \le n \le 2 \cdot 10^{5}\)).

Следующая \(n-1\) строка содержит описание дерева. Каждая строка содержит два целых числа \(u\) и \(v\) (\(0 \le u,v \le n-1\)), задающие ребро между \(u\) и \(v\) (\(u \neq v\)).

Гарантируется, что данные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^{5}\).

Выходные данные

Для каждого набора входных данных выведите \(n+1\) целое число: число путей в дереве таких, что MEX всех номеров вершин на нем равен \(k\), для всех \(k\) от \(0\) до \(n\).

Примечание
  1. В наборе входных данных \(1\):
    • Для \(k = 0\) существует только \(1\) путь из \(2\) в \(3\) с \(MEX([2, 3]) = 0\).
    • Для \(k = 1\) существует \(2\) пути. Один из \(0\) в \(2\) с \(MEX([0, 2]) = 1\), и из \(0\) в \(3\) с \(MEX([0, 2, 3]) = 1\).
    • Для \(k = 2\) существует \(1\) путь из \(0\) в \(1\) с \(MEX([0, 1]) = 2\).
    • Для \(k = 3\) существует \(1\) путь из \(1\) в \(2\) с \(MEX([1, 0, 2]) = 3\)
    • Для \(k = 4\) существует \(1\) путь из \(1\) в \(3\) с \(MEX([1, 0, 2, 3]) = 4\).
  2. В наборе входных данных \(2\):
    • Для \(k = 0\) не существует таких путей.
    • Для \(k = 1\) не существует таких путей.
    • Для \(k = 2\) существует \(1\) путь из \(0\) в \(1\) с \(MEX([0, 1]) = 2\).

B. Расставьте тарелки

Конструктив реализация *800

В честь вашего дня рождения вы подготовили праздничный стол! Теперь вы хотите посадить за него как можно больше гостей.

Стол можно схематично представить в виде прямоугольника с высотой \(h\) и шириной \(w\), разбитого на \(h \times w\) ячеек. Будем обозначать через \((i, j)\) ячейку в \(i\)-й строке и \(j\)-м столбце прямоугольника (\(1 \le i \le h\); \(1 \le j \le w\)).

В каждую ячейку можно либо поставить тарелку для гостя, либо оставить её пустой.

Поскольку гостя нужно посадить рядом со своей тарелкой, можно ставить тарелки только на границу стола — в первую или последнюю строку прямоугольника, либо в первый или последний столбец. Формально, для любой ячейки \((i, j)\), в которую ставится тарелка, должно выполняться хотя бы одно из следующих условий: \(i = 1\), \(i = h\), \(j = 1\), \(j = w\).

Чтобы гостям было максимально комфортно, никакие две тарелки не должны находиться в ячейках, имеющих общую сторону или угол. Иными словами, если в ячейке \((i, j)\) находится тарелка, нельзя ставить тарелки в ячейки \((i - 1, j)\), \((i, j - 1)\), \((i + 1, j)\), \((i, j + 1)\), \((i - 1, j - 1)\), \((i - 1, j + 1)\), \((i + 1, j - 1)\), \((i + 1, j + 1)\).

Поставьте как можно больше тарелок на стол, не нарушая описанные выше условия.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке задано целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Каждая из следующих \(t\) строк описывает один набор входных данных и содержит два целых числа \(h\) и \(w\) (\(3 \le h, w \le 20\)) — высоту и ширину стола.

Выходные данные

Для каждого набора входных данных выведите \(h\) строк по \(w\) символов каждый. Символ \(j\) в строке \(i\) должен быть равен \(1\), если в ячейку \((i, j)\) ставится тарелка, и \(0\) в противном случае. Если существует несколько решений, выведите любое из них.

Все тарелки должны стоять на границе стола. Никакие две тарелки не могут стоять в ячейках, соседних по стороне или углу. Число тарелок, выставленных на стол при этих условиях, должно быть максимальным возможным.

Разрешается выводить дополнительные пустые строки.

Примечание

В примере представлен единственный способ расставить \(6\) тарелок на стол в первом наборе входных данных.

Во втором наборе входных данных есть много способов расставить \(4\) тарелки, приведён один из них.

Поставить больше \(6\) тарелок в первом наборе входных данных или \(4\) тарелок во втором невозможно.

A. Зингер | color

*особая задача реализация

Немногие знают, что сотрудники ВКонтакте могут менять цвет подсветки в куполе знаменитого Дома Зингера, где расположена штаб-квартира ВКонтакте. Для этого нужно всего лишь отправить сообщение с цветом в специальный чат «Зингер | color», а бот его распознает и сменит подсветку. При этом на время городских мероприятий смена цвета блокируется.

Формально, бот обрабатывает три типа сообщений:

  • lock: заблокировать изменение цвета. Если оно и так заблокировано на данный момент, сообщение игнорируется.
  • unlock: разблокировать изменение цвета. Если оно и так разблокировано на данный момент, сообщение игнорируется.
  • red / orange / yellow / green / blue / indigo / violet: изменить цвет купола на заданный, если изменение цвета на данный момент не заблокировано.

Вам дана история сообщений, полученных ботом, в хронологическом порядке. Считайте, что перед получением первого сообщения купол подсвечивается голубым (blue), а изменение цвета не заблокировано.

Определите, какой цвет будет у купола Дома Зингера после обработки этих сообщений.

Входные данные

В первой строке задано одно целое число \(n\) (\(1 \le n \le 100\)) — число сообщений, полученных ботом.

В следующих \(n\) строках заданы сообщения, полученные ботом, в хронологическом порядке, по одному сообщению в строке. Каждое сообщение — строка из следующего набора: lock, unlock, red, orange, yellow, green, blue, indigo, violet.

Выходные данные

Выведите цвет купола после обработки сообщений ботом.

A. Путешествие в Бертаун

*особая задача математика реализация

Вика решила отправиться в путешествие в Бертаун. Она приезжает в Бертаун в день \(k\). Вика не готова тратить деньги на отели. К счастью, у нее есть \(n\) друзей, которые живут в Бертауне и готовы принять Вику у себя дома. \(i\)-й друг сообщил, что Вика может остановиться у него со дня \(l_i\) по день \(r_i\) включительно.

Вика решила, что остановится не более чем у одного друга. Помогите Вике определить максимальное количество дней, которое она сможет пробыть в Бертауне.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le n, k \le 100\)) — количество друзей Вики и номер дня, когда она приезжает в Бертаун.

Затем следуют \(n\) строк, каждая содержит два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le 100\)) — отрезок дней, который Вика может жить у \(i\)-го друга.

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество дней, которое Вика сможет пробыть в Бертауне (или \(0\), если ни один из друзей Вики не может принять ее в день \(k\)).

Примечание

В первом примере Вика может погостить у \(2\)-го друга с \(3\)-го по \(6\)-й день.

Во втором примере ни один из друзей Вики не может принять ее в день \(4\).

В третьем примере Вика может погостить у \(1\)-го друга только \(4\)-й день.

B. Функция поиска ближайшей точки

*особая задача реализация

Ваш друг создал функцию поиска ближайшей точки. Для заданного массива целочисленных точек \(x\) (отсортированного в возрастающем порядке и не содержащего дубликатов) и точки \(y\) эта функция может найти ближайшую точку из \(x\) к заданной точке \(y\). Другими словами, функция найдет такую точку \(x_i\), что значение \(|y - x_i|\) является минимальным, где \(|a|\) — абсолютное значение (модуль) \(a\).

Например, если \(x = [1, 2, 5, 7, 9, 11]\), то ответ для \(y=3\) будет равен \(2\), ответ для \(y=5\) будет равен \(5\), а ответ для \(y=100\) будет равен \(11\).

На самом деле, эта функция работает немного неправильно. Если к заданной точке существует несколько ближайших точек, то функция сломается (возникнет ошибка при ее исполнении). Например, если \(x = [1, 2, 5, 7, 9, 11]\) (как выше) и \(y=6\), то функция сломается, потому что точки \(5\) и \(7\) обе являются ближайшими для точки \(6\).

Ваша задача — для заданного массива целочисленных точек \(x\) (отсортированного в возрастающем порядке и не содержащего дубликатов) определить, можно ли сломать функцию, выбрав какую-то целочисленную точку \(y\).

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов тестовых данных.

Первая строка набора содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество точек в массиве \(x\).

Вторая строка набора содержит \(n\) целых чисел \(x_1, x_2, \ldots, x_n\) (\(1 \le x_i \le 10^9\)), где \(x_i\)\(i\)-я точка в массиве \(x\).

Все точки в массиве \(x\) различны, а массив \(x\) отсортирован в возрастающем порядке (другими словами, \(x_1 < x_2 < \ldots < x_n\)).

Сумма \(n\) по всем наборам тестовых данных в тесте не превосходит \(2 \cdot 10^5\) (\(\sum n \le 2 \cdot 10^5\)).

Выходные данные

Для каждого набора тестовых данных выведите YES, если возможно найти какую-то целочисленную точку \(y\), которая сломает функцию, и NO иначе.

Примечание

В первом наборе входных данных примера из условия функция не может обработать точку \(y = 2\).

В пятом наборе входных данных примера из условия функция не может обработать точку \(y = 500000000\).

В шестом наборе входных данных примера из условия функция не может обработать точку \(y = 10\).

C. Сладости

*особая задача реализация Структуры данных

Аня пришла на день рождения к своей подруге. На столе по кругу распложено \(n\) вкуснейших сладостей (для удобства пронумеруем их от \(1\) до \(n\) по часовой стрелке). Для каждой из сладостей известно, нравится она Ане или нет. Аня решила, что она должна съесть все сладости, которые есть на столе и нравятся ей.

Однако, есть все сладости подряд слишком скучно. Поэтому Аня придумала игру, которая позволит сделать процесс поедания сладостей более интересным.

Игра проходит по следующим правилам:

  • если на столе не осталось сладостей, которые нравятся Ане, то игра заканчивается;
  • в самом начале игры, если на столе есть хотя бы одна сладость, которую Аня хочет съесть, она съедает сладость под номером \(1\);
  • после того, как Аня съела какую-то сладость, она отсчитывает \(k\) сладостей по часовой стрелке, начиная со следующей сладости в круге, и съедает \(k\)-ю сладость в отсчете (если в круге меньше \(k\) сладостей, некоторые сладости могут поучаствовать в отсчете несколько раз, и Аня выбирает последнюю сладость в отсчете). Очевидно, уже съеденные сладости в отсчете не участвуют.

Например, пусть по кругу расположены \(6\) сладостей, сладости под номерами \(4\), \(5\) и \(6\) нравятся Ане, \(k = 4\). Тогда игра проходит следующим образом:

  1. изначально на столе расположены сладости \([1, 2, 3, 4, 5, 6]\), Аня выбирает сладость под номером \(1\).
  2. Аня съедает сладость \(1\), после этого на столе остаются сладости \([2, 3, 4, 5, 6]\). Аня отсчитывает \(4\) сладости, начиная со сладости \(2\), и останавливается на сладости \(5\).
  3. Аня съедает сладость \(5\), после этого на столе остаются сладости \([2, 3, 4, 6]\). Аня отсчитывает \(4\) сладости, начиная со сладости \(6\), и останавливается на сладости \(4\).
  4. Аня съедает сладость \(4\), после этого на столе остаются сладости \([2, 3, 6]\). Аня отсчитывает \(4\) сладости, начиная со сладости \(6\), и останавливается на сладости \(6\).
  5. Аня съедает сладость \(6\), после этого на столе остаются сладости \([2, 3]\). На столе не осталось сладостей, которые нравятся Ане, поэтому игра заканчивается.

Ваша задача — определить, сколько сладостей съест Аня.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 5000\)) — количество сладостей и параметр \(k\).

Следующая строка содержит строку \(s\), где \(s_i = 1\), если \(i\)-я сладость нравится Ане, и \(s_i = 0\) в противном случае.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5000\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — сколько сладостей съест Аня.

Примечание

Первый набор входных данных примера разобран в условии.

A. Покраска флага

Перебор реализация *800

Сегодня мы сыграем в игру «покрась в красный и белый» (нет, это не гражданская война, это просто цвета канадского флага).

Вам дана таблица \(n \times m\), состоящая из символов «R», «W» и «.». Символ «R» обозначает красную клетку, «W» обозначает белую клетку, а «.» обозначает непокрашенную клетку. Соседями клетки называются клетки, имеющие общую сторону с данной (клетки, имеющие только общий угол, не считаются).

Ваша задача — покрасить непокрашенные клетки в красный или белый так, чтобы у каждой красной клетки были только белые соседи (и не было красных), а у каждой белой — только красные соседи (и не было белых). Уже покрашенные клетки перекрашивать нельзя.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит целые числа \(n\) и \(m\) (\(1 \le n \le 50\), \(1 \le m \le 50\)) — высота и ширина таблицы.

Следующие \(n\) строк содержат таблицу. Каждый символ таблицы равен «R», «W» или «.».

Выходные данные

Для каждого набора входных данных выведите «YES», если можно раскрасить таблицу требуемым образом, и «NO» в противном случае.

Если ответ существует, выведите покрашенную таблицу в следующих \(n\) строках. Если существует несколько решений, выведите любое из них.

Вы можете выводить каждую букву слов «YES» и «NO» в любом регистре (строчную или заглавную), например, ответы «yEs» и «nO» будут зачтены. Однако буквы в таблице нужно выводить заглавными.

Примечание

Ответ в первом примере дан в примере вывода. Можно показать, что решения во втором примере не существует. В третьем примере все клетки изначально покрашены, и покраска является корректной.

B. Уродливость гистограммы

жадные алгоритмы математика реализация *1100

Маленький Дорми на Рождество получил гистограмму с \(n\) столбцами высоты \(a_1, a_2, \ldots, a_n\). Однако чем больше он играл с гистограммой, тем больше он осознавал ее неидеальность, поэтому сегодня он решил ее немного изменить.

Чтобы изменить гистограмму, маленький Дорми может выполнить следующую операцию произвольное количество раз:

  • Выбрать индекс \(i\) (\(1 \le i \le n\)) такой, что \(a_i>0\), и присвоить \(a_i := a_i-1\).

Маленький Дорми определяет уродливость гистограммы (после выполнения некоторого количества операций) как сумму длин вертикальных отрезков границы гистограммы и количества операций, которые он сделал. Чтобы получить лучшую гистограмму, он хочет минимизировать ее уродливость, применив несколько операций.

Так как гистограмма очень большая, маленькому Дорми сложно вычислить минимально возможную уродливость, поэтому, как старший брат Дорми, вы должны помочь ему найти минимально возможную уродливость.

Рассмотрим пример, в котором изначально в гистограмме \(4\) столбца, высоты которых равны \(4,8,9,6\):

Синим показана гистограмма, а красные линии показывают вертикальные отрезки границы гистограммы. В настоящий момент сумма длин вертикальных отрезков границы равна \(4+4+1+3+6 = 18\), поэтому, если Дорми не будет изменять гистограмму, ее уродливость будет равна \(18\).

Если Дорми применит операцию один раз к столбцу \(2\) и два раза к столбцу \(3\), столбцы будут иметь высоты \(4,7,7,6\):

Теперь общая длина вертикальных отрезков границы равна \(4+3+1+6=14\), а уродливость равна \(14+3=17\). Можно показать, что это — оптимальное решение.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(1 \le n \le 4 \cdot 10^5\)).

Вторая строка набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(4 \cdot 10^5\).

Выходные данные

Для каждого набора выходных данных выведите одно целое число: минимально возможную уродливость, которую может получить Дорми.

Примечание

Пример \(1\) описан в условии задачи.

Изначальная гистограмма в примере \(2\) показана ниже:

Изначально уродливость равна \(2+1+6+3+4=16\).

Применяя операцию один раз к столбцу \(1\), шесть раз к столбцу \(3\) и три раза к столбцу \(4\), получится гистограмма с высотами \(1,1,1,1,0,0\):

Длина вертикальных отрезков границы теперь равна \(1+1=2\), а маленький Дорми сделал \(1+6+3=10\) операций, поэтому общая уродливость равна \(2+10=12\), что является оптимальным решением.

A. Честный плей-офф

Перебор реализация *800

В турнире по системе плей-офф участвуют четыре игрока. Турнир проводится по следующей схеме: первый игрок сыграет со вторым, а третий с четвертым, затем победители пар сыграют в финале турнира.

Известно, что в матче между двумя игроками выиграет тот, чье мастерство больше. Мастерство \(i\)-го игрока равно \(s_i\) и все уровни мастерства попарно различны (т.е. в массиве \(s\) нет двух одинаковых значений).

Турнир называется честным, если в финале встретятся игроки с максимальными умениями.

Определите, является ли заданный турнир честным.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Единственная строка входных данных содержит четыре целых числа \(s_1, s_2, s_3, s_4\) (\(1 \le s_i \le 100\)) — мастерство игроков. Гарантируется, что в массиве все числа различны.

Выходные данные

Для каждого набора входных данных, выведите YES, если турнир является честным, или NO в противном случае.

Примечание

Рассмотрим примеры:

  1. в первом примере игроки \(2\) и \(3\) с навыками \(7\) и \(9\) выходят в финал;
  2. во втором примере игроки \(2\) и \(4\) с навыками \(5\) и \(9\) выходят в финал. Игрок с навыком \(6\) не прошел в финал, но игрок с навыком \(5\) прошел в финал, поэтому турнир нечестен;
  3. в третьем примере игроки \(1\) и \(3\) с навыками \(5\) и \(8\) выходят в финал;
  4. в четвертом примере игроки \(1\) и \(3\) с навыками \(6\) и \(3\) выходят в финал. Игрок с навыком \(5\) не прошел в финал, но игрок с навыком \(3\) прошел в финал, поэтому турнир нечестен.

C. Нестабильная строка

Бинарный поиск дп жадные алгоритмы реализация Строки *1400

Вам задана строка \(s\), состоящая из символов 0, 1 и ?.

Назовем строку нестабильной, если она состоит из символов 0 и 1 и любые два соседних символа различаются (т. е. имеет вид 010101... или 101010...).

Назовем строку красивой, если она состоит из символов 0, 1 и ?, и в ней можно заменить символы ? на 0 или 1 (для каждого символа выбор происходит независимо), чтобы строка стала нестабильной.

Например, строки 0??10, 0 и ??? являются красивыми, а строки 00 и ?1??1 — нет.

Посчитайте количество красивых непрерывных подстрок строки \(s\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая и единственная строка каждого набора содержит строку \(s\) (\(1 \le |s| \le 2 \cdot 10^5\)), состоящую из символов 0, 1 и ?.

Гарантируется, что сумма длин строк по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора выходных данных выведите одно целое число — количество красивых подстрок строки \(s\).

D. Плей-офф турнир

Деревья дп поиск в глубину и подобное реализация Структуры данных *1800

\(2^k\) команд участвуют в плей-офф турнире. Турнир состоит из \(2^k - 1\) игры. Они проводятся следующим образом: во-первых, команды делятся на пары: команда \(1\) играет против команды \(2\), команда \(3\) играет против команды \(4\) (именно в таком порядке) и так далее (таким образом, в этой фазе будет сыграно \(2^{k-1}\) игры). Когда команда проигрывает игру, она выбывает, и каждая игра приводит к выбыванию одной команды (нет ничьих). После этого остается \(2^{k-1}\) команд. Если остается только одна команда, она объявляется чемпионом; в противном случае играется еще \(2^{k-2}\) игр: в первой из них победитель игры «\(1\) против \(2\)» играет против победителя игры «\(3\) против \(4\)», затем победитель игры «\(5\) против \(6\)» играет против победителя игры «\(7\) против \(8\)» и так далее. Этот процесс повторяется до тех пор, пока не останется только одна команда.

Например, на этом рисунке описан хронологический порядок игр с \(k = 3\):

Пусть строка \(s\), состоящая из \(2^k - 1\) символов, описывает результаты игр в хронологическом порядке следующим образом:

  • если \(s_i\) равно 0, то команда с меньшим индексом выигрывает \(i\)-ю игру;
  • если \(s_i\) равно 1, то команда с большим индексом выигрывает \(i\)-ю игру;
  • если \(s_i\) равно ?, то результат \(i\)-й игры неизвестен (любая команда может выиграть эту игру).

Пусть \(f(s)\) — число возможных победителей турнира, описываемого строкой \(s\). Команда \(i\) является возможным победителем турнира, если можно заменить каждый ? на 1 или 0 таким образом, что команда \(i\) является чемпионом.

Вам дается начальное состояние строки \(s\). Вы должны обработать \(q\) запросов следующей формы:

  • \(p\) \(c\) — заменить \(s_p\) символом \(c\) и вывести \(f(s)\) в результате запроса.
Входные данные

Первая строка содержит одно целое число \(k\) (\(1 \le k \le 18\)).

Вторая строка содержит строку, состоящую из \(2^k - 1\) символов — начальное состояние строки \(s\). Каждый символ либо ?, 0, либо 1.

Третья строка содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Затем следует \(q\) строк, строка \(i\) содержит целое число \(p\) и символ \(c\) (\(1 \le p \le 2^k - 1\); \(c\) - это либо ?, 0, либо 1), описывающие запрос \(i\).

Выходные данные

Для каждого запроса выведите одно целое число — \(f(s)\).

F. Расстояние между строками

Бинарный поиск Перебор реализация Строки Структуры данных хэши *3000

Предположим, вам даны две строки \(a\) и \(b\). Вы можете применить следующую операцию любое количество раз: выбрать любую непрерывную подстроку \(a\) или \(b\) и отсортировать символы в ней в порядке неубывания. Пусть \(f(a, b)\) — минимальное количество операций, которое необходимо применить, чтобы сделать строки равными (или \(f(a, b) = 1337\), если невозможно сделать \(a\) и \(b\) равными с помощью этих операций).

Например:

  • \(f(\text{ab}, \text{ab}) = 0\);
  • \(f(\text{ba}, \text{ab}) = 1\) (за одну операцию мы можем отсортировать всю первую строку);
  • \(f(\text{ebcda}, \text{ecdba}) = 1\) (за одну операцию мы можем отсортировать подстроку со \(2\)-го по \(4\)-й символ второй строки);
  • \(f(\text{a}, \text{b}) = 1337\).

Вам задано \(n\) строк \(s_1, s_2, \dots, s_k\) одинаковой длины. Вычислите \(\sum \limits_{i = 1}^{n} \sum\limits_{j = i + 1}^{n} f(s_i, s_j)\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество строк.

Затем следует \(n\) строк, каждая строка содержит одну из строк \(s_i\), состоящую из строчных латинских букв. \(|s_1| = |s_2| = \ldots = |s_n|\) и \(n \cdot |s_1| \le 2 \cdot 10^5\). Все заданные строки попарно различны.

Выходные данные

Выведите одно целое число: \(\sum \limits_{i = 1}^{n} \sum\limits_{j = i + 1}^{n} f(s_i, s_j)\).

D. Омкар и медианы

жадные алгоритмы реализация Структуры данных *2000

О-о-о! Рэй снова потерял свой массив! Однако Омкар может помочь, потому что он думает, что нашел OmkArray массива Рэя. OmkArray массива \(a\) с элементами \(a_1, a_2, \ldots, a_{2k-1}\) — это массив \(b\) с элементами \(b_1, b_2, \ldots, b_{k}\) такой, что \(b_i\) равен медиане \(a_1, a_2, \ldots, a_{2i-1}\) для всех \(i\). Омкар нашел массив \(b\) размера \(n\) (\(1 \leq n \leq 2 \cdot 10^5\), \(-10^9 \leq b_i \leq 10^9\)). Для этого массива \(b\), Рэй хочет проверить утверждение Омкара и узнать, действительно ли \(b\) является OmkArray некоторого массива \(a\). Можете ли вы помочь Рэю?

Медиана набора чисел \(a_1, a_2, \ldots, a_{2i-1}\) — это число \(c_{i}\), где \(c_{1}, c_{2}, \ldots, c_{2i-1}\) представляют собой \(a_1, a_2, \ldots, a_{2i-1}\), отсортированные в неубывающем порядке.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — длину массива \(b\).

Вторая строка содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(-10^9 \leq b_i \leq 10^9\)) — элементы \(b\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую YES, если существует массив \(a\) такой, что \(b_i\) является медианой \(a_1, a_2, \dots, a_{2i-1}\) для всех \(i\), и NO в противном случае. Регистр букв в YES и NO не имеет значения (поэтому yEs и No также будут приняты).

Примечание

Во втором наборе входных данных первого примера массив \([4]\) даст OmkArray \([4]\), так как медиана первого элемента равна \(4\).

В четвертом наборе входных данных первого примера массив \([3, 2, 5]\) даст OmkArray \([3, 3]\), так как медиана \(3\) равна \(3\), а медиана \(2, 3, 5\) равна \(3\).

В пятом наборе входных данных первого примера массив \([2, 1, 0, 3, 4, 4, 3]\) даст OmkArray \([2, 1, 2, 3]\), так как

  • медиана \(2\) равна \(2\)
  • медиана \(0, 1, 2\) равна \(1\)
  • медиана \(0, 1, 2, 3, 4\) равна \(2\)
  • и медиана \(0, 1, 2, 3, 3, 4, 4\) равна \(3\).

Во втором наборе входных данных второй выборки массив \([1, 0, 4, 3, 5, -2, -2, -2, -4, -3, -4, -1, 5]\) даст OmkArray \([1, 1, 3, 1, 0, -2, -1]\), как

  • медиана \(1\) равна \(1\)
  • медиана из \(0, 1, 4\) равна \(1\)
  • медиана из \(0, 1, 3, 4, 5\) равна \(3\)
  • медиана \(-2, -1, 0, 1, 3, 4, 5\) равна \(1\)
  • медиана \(-4, -2, -2, -2, 0, 1, 3, 4, 5\) равна \(0\)
  • медиана \(-4, -4, -3, -2, -2, -2, 0, 1, 3, 4, 5\) равна \(-2\)
  • и медиана \(-4, -4, -3, -2, -2, -2, -1, 0, 1, 3, 4, 5, 5\) равна \(-1\)

Для всех случаев, когда ответ NO, можно доказать, что невозможно найти массив \(a\) такой, что \(b\) является Omkarray \(a\).

C. Сложные скалы

жадные алгоритмы Конструктив математика реализация *1200

Вы — дизайнер игр, и хотите создать полосу препятствий. Игрок будет идти слева направо. У вас уже есть \(n\) высот гор, и вы хотите расположить эти высоты так, чтобы абсолютная разность между высотами первой и последней гор была как можно меньше.

Кроме того, вы хотите сделать игру сложной, а поскольку идти в гору или по равнине сложнее, чем спускаться по склону, то сложность уровня будет равна количеству гор \(i\) (\(1 \leq i < n\)) таких, что \(h_i \leq h_{i+1}\), где \(h_i\) — высота \(i\)-й горы. Вы не хотите потратить впустую ни одну из смоделированных гор, поэтому должны использовать их все.

Из всех вариантов, минимизирующих \(|h_1-h_n|\), найдите самый сложный. Если существует несколько порядков, удовлетворяющих этим требованиям, вы можете найти любой.

Входные данные

Первая строка будет содержать одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Затем следуют \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество гор.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(h_1,\ldots,h_n\) (\(1 \leq h_i \leq 10^9\)), где \(h_i\) — высота \(i\)-й горы.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел — заданные высоты в порядке, который максимизирует сложность уровня среди всех порядков, минимизирующих \(|h_1-h_n|\).

Если существует несколько порядков, удовлетворяющих этим требованиям, вы можете вывести любой.

Примечание

В первом наборе входных данных:

Игрок начинает с высоты \(2\), затем поднимается на высоту \(4\), увеличивая сложность на \(1\). После этого он спускается на высоту \(1\), и сложность не меняется, потому что он спускается вниз. Наконец, игрок поднимется на высоту \(2\), и сложность увеличится на \(1\). Абсолютная разность между начальной и конечной высотой равна \(0\), а следовательно минимальна. Трудность максимальна при данных условиях.

Во втором наборе входных данных:

Игрок начинает с высоты \(1\), затем поднимается до высоты \(3\), увеличивая сложность на \(1\). Абсолютная разниость между начальной и конечной высотой равна \(2\) и она минимально возможная, так как это единственные высоты. Трудность максимальна.

E1. Удаляй и удлиняй (простая версия)

Бинарный поиск дп жадные алгоритмы Перебор реализация Строки строковые суфф. структуры хэши *1600

Это простая версия задачи. Единственное отличие — это ограничения на \(n\) и \(k\). Вы можете делать взломы, только если все версии задачи решены.

У вас есть строка \(s\), и вы можете выполнять над ней два типа операций:

  • Удалить последний символ строки.
  • Дублировать строку: \(s:=s+s\), где \(+\) обозначает конкатенацию.

Вы можете использовать каждую операцию любое количество раз (возможно, ни одного).

Ваша задача — найти лексикографически наименьшую строку длины ровно \(k\), которую можно получить, выполнив эти операции над строкой \(s\).

Строка \(a\) лексикографически меньше строки \(b\) тогда и только тогда, когда выполняется одно из следующих условий:

  • \(a\) является префиксом \(b\), но \(a\ne b\);
  • В первой позиции, где \(a\) и \(b\) отличаются, строка \(a\) имеет букву, которая появляется раньше в алфавите, чем соответствующая буква в \(b\).
Входные данные

Первая строка содержит два целых числа \(n\), \(k\) (\(1 \leq n, k \leq 5000\)) — длину исходной строки \(s\) и длину желаемой строки.

Вторая строка содержит строку \(s\), состоящую из \(n\) строчных английских букв.

Выходные данные

Выведите лексикографически наименьшую строку длины \(k\), которая может быть получена путем выполнения операций над строкой \(s\).

Примечание

В первом тесте оптимально сделать одно дублирование: «dbcadabc» \(\to\) «dbcadabcdbcadabc».

Во втором тесте оптимально удалить последние \(3\) символа, затем продублировать строку \(3\) раза, затем удалить последние \(3\) символов, чтобы строка имела длину \(k\).

«abcd» \(\to\) «abc» \(\to\) «ab» \(\to\) «a» \(\to\) «aa» \(\to\) «aaaa» \(\to\) «aaaa» \(\to\) «aaaa» \(\to\) «aaaa» \(\to\) «aaaa».

E. Смешные подстроки

матрицы реализация Строки Структуры данных хэши *2100

Поликарп придумал новый язык программирования. В нем есть только два типа команд:

  1. «x := s» — назначить переменной с именем x значение s (где s - строка). Например, команда var := hello присваивает переменной с именем var значение hello. Обратите внимание, что s - это значение строки, а не имя переменной. Между названием переменной, оператором := и строкой находится ровно по одному пробелу.
  2. «x = a + b» — назначить переменной с именем x конкатенацию двух переменных a и b. Например, если программа состоит из трех команд a := hello, b := world, c = a + b, то переменная c будет содержать строку helloworld. Гарантируется, что программа корректна и переменные a и b были определены ранее. Между названиями переменных и операторами = и + находится ровно по одному пробелу.

Все имена переменных и строки состоят только из строчных букв английского алфавита и состоят не больше, чем из \(5\) символов.

Результатом работы программы является количество вхождений строки haha в строке, которая была записана в переменную в последней команде.

Поликарп очень устал, изобретая этот язык. Он просит вас реализовать его. Ваша задача состоит в том, чтобы — для заданных программных операторов вычислить количество вхождений строки haha в последней назначенной переменной.

Входные данные

В первой строке находится целое число \(t\) (\(1 \le t \le 10^3\)). Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора входных данных находятся одно целое число \(n\) — (\(1 \le n \le 50\)) — количество команд в программе. Все имена переменных и строки гарантированно состоят только из строчных букв английского алфавита и состоят не больше, чем из \(5\) символов.

Далее следуют \(n\) строк описывающих команды в формате из условия выше. Гарантируется, что программа корректна.

Выходные данные

Для каждого набора входных данных выведите количество вхождений подстроки haha в строку, которая была записана в переменную в последней команде.

Примечание

В первом наборе входных данных результат — значение переменной d=hhahahaha.

B. Песня о любви

дп реализация Строки *800

Однажды Петя в очередной раз написал грустную песню про любовь и поспешил показать ее Васе. Песня представляет собой строку из маленьких букв английского алфавита. У Васи сразу возникло \(q\) вопросов про эту песню. Каждый вопрос представляет собой некоторый отрезок песни с позиции \(l\) до позиции \(r\). Вася рассматривает подстроку, образованную символами на этом отрезке, а затем повторяет каждую букву в этой подстроке \(k\) раз, где \(k\) — порядковый номер буквы в алфавите. Например, если Вася выбрал подстроку «abbcb», то он повторит букву «a» один раз, каждую из букв «b» — по два раза, букву «c» — три раза, и полученная строка будет равна «abbbbcccbb», ее длина равна \(10\). Вася интересуется именно длиной полученной строки.

Помогите Пете ответить Васе на его вопросы, а именно, для каждого из заданных вопросов определите длину строки, которую выпишет Вася.

Входные данные

В первой строке вводятся числа \(n\) и \(q\) (\(1\leq n\leq 100\,000\), \(1\leq q \leq 100\,000\)) — длина песни и количество вопросов.

Во второй строке дана строка \(s\) — сама песня, представляющая собой строку длины \(n\) из маленьких букв английского алфавита.

В следующих \(q\) строках даны описания вопросов. Каждое описание состоит из двух чисел \(l\) и \(r\) (\(1 \leq l \leq r \leq n\)) — границы каждого из вопросов.

Выходные данные

Выведите \(q\) строк — для каждого вопроса выведите длину строки, которую выпишет Вася.

Примечание

В первом примере Васю интересуют три вопроса. В первом вопросе Вася рассматривает подстроку «aba», которая превратится в «abba», а значит, ответ на этот вопрос равен \(4\). Во втором вопросе Вася рассматривает подстроку «baca», которая превратится в «bbaccca», а значит, ответ на этот вопрос будет равен \(7\). В третьем вопросе Вася рассматривает всю строку «abacaba», которая превратится в «abbacccabba» — строку длины \(11\).

D. PriceFixed

Бинарный поиск жадные алгоритмы реализация сортировки *1600

Девочка Лена — самая экономная девочка в Москве. Поэтому когда папа поручил ей закупку продуктов для поездки на дачу, она сразу отправилась в самый лучший магазин — «PriceFixed». У этого магазина есть несколько особенностей:

  • В магазине есть бесконечный запас каждого товара.
  • Все товары в нем стоят одинаково — ровно \(2\) рубля за единицу товара.
  • Для каждого из \(i\) товаров предусмотрена скидка для опытных покупателей: если вы уже приобрели \(b_i\) единиц товаров (любого типа, не обязательно типа \(i\)), то на все последующие покупки \(i\)-го товара будет действовать скидка \(50\%\) (то есть единицу \(i\)-го товара можно будет купить за \(1\) рубль!).

Лене нужно купить \(n\) товаров: \(i\)-го товара нужно купить не менее \(a_i\) единиц. Помогите Лене понять, какую минимальную сумму денег ей нужно будет потратить, если она будет выбирать порядок покупки товаров оптимальным образом. Обратите внимание, Лена, если хочет, может купить больше единиц некоторого товара, чем необходимо.

Входные данные

В первой строке вводится число \(n\) (\(1 \leq n \leq 100\,000\)) — количество различных товаров в списке.

В следующих \(n\) строках вводятся описания товаров. Каждое описание состоит из двух чисел \(a_i\) и \(b_i\), (\(1 \leq a_i \leq 10^{14}\), \(1 \leq b_i \leq 10^{14}\)) — требуемое число единиц \(i\)-го товара и сколько единиц товаров нужно купить, чтобы получить скидку на товар \(i\).

Сумма всех \(a_i\) в тесте не превосходит \(10^{14}\).

Выходные данные

Выведите искомую минимальную сумму, которая требуется Лене для совершения всех покупок.

Примечание

В первом примере из условия Лена может купить товары в таком порядке:

  1. единицу товара \(3\) за \(2\) рубля,
  2. единицу товара \(1\) за \(2\) рубля
  3. единицу товара \(1\) за \(2\) рубля,
  4. единицу товара \(2\) за \(1\) рубль (она может купить его со скидкой, так как уже куплено \(3\) товара),
  5. единицу товара \(1\) за \(1\) рубль (она может купить его со скидкой, так как уже куплено \(4\) товара).

Суммарно она потратит \(8\) рублей. Можно показать, что меньше потратить невозможно.

Во втором примере из условия Лена может купить товары в таком порядке:

  1. единицу товара \(1\) за \(2\) рубля,
  2. две единицы товара \(2\) по \(2\) рубля за каждую,
  3. единицу товара \(5\) за \(2\) рубля,
  4. единицу товара \(3\) за \(1\) рубль,
  5. две единицы товара \(4\) по \(1\) рублю за каждую,
  6. единицу товара \(1\) за \(1\) рубль.

Суммарно при таком порядке приобретения товаров Лена потратит \(12\) рублей.

E. Игра с картами

Бинарный поиск дп жадные алгоритмы Конструктив реализация Структуры данных *2500

У Алисы сломался компьютер и теперь она не может играть в свою любимую карточную игру. Чтобы помочь Алисе, Боб решил помочь ей и ответить на \(n\) запросов.

Изначально в левой и правой руке Боб держит по одной карте с числом \(0\), записанным на этих картах. Во время выполнения \(i\)-го запроса Алиса предлагает Бобу заменить карту в правой или левой руке на карту с числом \(k_i\) (Боб выбирает, какую из карт заменить, Боб обязан заменить ровно одну карту).

После замены карты Алиса хочет, чтобы число на левой и правой картах принадлежали каким-то заданным отрезкам (отрезки для левой и правой карты могут быть различны). Формально, пусть число записанное на левой карте — \(x\), а на правой — \(y\). Тогда после замены карты на \(i\)-м запросе должно выполняться, что \(a_{l, i} \le x \le b_{l, i}\) и \(a_{r, i} \le y \le b_{r,i}\).

Скажите, сможет ли Боб ответить на все запросы, чтобы все условия удовлетворялись. Если ответить на все запросы возможно, то приведите способ это сделать.

Входные данные

В первой строке вводятся два целых числа \(n\) и \(m\) (\(2 \le n \le 100\,000\), \(2 \le m \le 10^9\)) — количество запросов и максимально возможное значение на карте.

Далее следует описание \(n\) запросов. Описание каждого запроса состоит из трех строк.

В первой строке описания \(i\)-го запроса вводится целое число \(k_i\) (\(0 \le k_i \le m\)) — число, записанное на новой карте.

Во второй строке описания \(i\)-го запроса вводятся два целых числа \(a_{l, i}\) и \(b_{l, i}\) (\(0 \le a_{l, i} \le b_{l, i} \le m\)) — минимальное и максимальное допустимые значения, записанные на карте в левой руке после замены.

Во третьей строке описания \(i\)-го запроса вводятся два целых числа \(a_{r, i}\) и \(b_{r,i}\) (\(0 \le a_{r, i} \le b_{r,i} \le m\)) — минимальное и максимальное допустимые значения, записанные на карте в правой руке после замены.

Выходные данные

В первой строке выведите «Yes», если Боб может ответить на все запросы, и «No» иначе.

Если Боб может ответить на все \(n\) запросов, то во второй строке выходных данных должны содержаться \(n\) чисел, соответствующих корректному способу ответить на все запросы. Если в ответ на \(i\)-й запрос Бобу нужно взять карту в левую руку, выведите \(0\), иначе выведите \(1\). Если существует несколько корректных способов ответить на запросы, то любой из них будет засчитан.

A. Симпатичные перестановки

жадные алгоритмы Конструктив реализация *800

Есть ряд из \(n\) кошек, пронумерованных с \(1\) по \(n\): \(i\)-я кошка на позиции \(i\). Кошкам надоедает вращаться на одном и том же месте целый день, поэтому они хотят поменяться местами так, чтобы никакая кошка не осталась на том же самом месте. Кошки очень ленивы, а поэтому они хотят минимизировать суммарное расстояние, на которое им нужно передвинуться. Помогите им решить, какой кошке переместиться на какое место.

Например, если кошки \(3\), то можно выбрать следующую перестановку: \([3, 1, 2]\). Никакая кошка не осталась на своем месте. Суммарное расстояние, на которое сдвинулись кошки равно \(1 + 1 + 2 = 4\), т. е. кошка \(1\) сдвинулась на один вправо, кошка \(2\) сдвинулась на один вправо, а кошка \(3\) — на два влево.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой и единственной строке каждого набора задано одно целое число \(n\) (\(2 \leq n \leq 100\)) — количество кошек.

Можно доказать, что при текущих ограничениях ответ всегда существует.

Выходные данные

Выведите \(t\) ответов — по одному на набор входных данных. Каждый ответ должен состоять из \(n\) целых чисел — перестановки минимальной стоимости. Если существует несколько ответов, выведите любой из них.

Примечание

В первом наборе входных данных есть одна возможная перестановка, удовлетворяющая условиям: \([2, 1]\).

Второй набор описан в условии задачи. Другой возможный ответ — это \([2, 3, 1]\).

B. Приятные пары

математика Перебор реализация теория чисел *1200

Вам задан массив \(a_1, a_2, \dots, a_n\), состоящий из \(n\) различных целых чисел. Посчитайте количество пар индексов \((i, j)\) таких, что \(i < j\) и \(a_i \cdot a_j = i + j\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой стоке каждого набора задано одно целое число \(n\) (\(2 \leq n \leq 10^5\)) — длина массива \(a\).

Во второй строке каждого набора заданы \(n\) целых чисел через пробел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 2 \cdot n\)) — массив \(a\). Гарантируется, что все элементы массива различны.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора выведите количество пар индексов \((i, j)\) таких, что \(i < j\) и \(a_i \cdot a_j = i + j\).

Примечание

В первом наборе единственная пара, удовлетворяющая условиям — это \((1, 2)\), так как \(a_1 \cdot a_2 = 1 + 2 = 3\)

Во втором наборе единственная подходящая пара – это \((2, 3)\).

В третьем наборе пары, удовлетворяющие условиям — это \((1, 2)\), \((1, 5)\) и \((2, 3)\).

D. Очередь с приоритетом

дп Комбинаторика математика реализация Тернарный поиск *2200

Дана последовательность \(A\), в которой каждый элемент записан в формате + x или -, где \(x\) — целое число.

Для последовательности \(S\), в которой каждый элемент записан в формате + x или -, определим \(f(S)\) следующим образом:

  • Проходим по \(S\) от первого элемента до последнего и поддерживаем мультимножество \(T\), изначально пустое.
  • Если элемент последовательности имеет вид + x, добавим \(x\) в \(T\). Иначе удалим наименьший элемент из \(T\) (если \(T\) пусто, ничего делать не нужно).
  • После прохода по \(S\) посчитаем сумму всех элементов в \(T\). \(f(S)\) полагается равным этой сумме.

Последовательность \(b\) является подпоследовательностью последовательности \(a\), если \(b\) может быть получена из \(a\) удалением нуля или больше элементов без изменения порядка оставшихся элементов. Для всех подпоследовательностей \(B\) последовательности \(A\) посчитайте сумму \(f(B)\) по модулю \(998\,244\,353\).

Входные данные

Первая строка содержит целое число \(n\) (\(1\leq n\leq 500\)) – длину \(A\).

Каждая из следующих \(n\) строк начинается с символа операции + или -. Если символ равен +, то за ним следует целое число \(x\) (\(1\le x<998\,244\,353\)). \(i\)-я строка из этих \(n\) строк описывает \(i\)-й элемент \(A\).

Выходные данные

Выведите одно целое число, равное ответу на задачу по модулю \(998\,244\,353\).

Примечание

В первом примере все возможные пары \(B\) и \(f(B)\) выглядят так:

  • \(B=\) {}, \(f(B)=0\).
  • \(B=\) {-}, \(f(B)=0\).
  • \(B=\) {+ 1, -}, \(f(B)=0\).
  • \(B=\) {-, + 1, -}, \(f(B)=0\).
  • \(B=\) {+ 2, -}, \(f(B)=0\).
  • \(B=\) {-, + 2, -}, \(f(B)=0\).
  • \(B=\) {-}, \(f(B)=0\).
  • \(B=\) {-, -}, \(f(B)=0\).
  • \(B=\) {+ 1, + 2}, \(f(B)=3\).
  • \(B=\) {+ 1, + 2, -}, \(f(B)=2\).
  • \(B=\) {-, + 1, + 2}, \(f(B)=3\).
  • \(B=\) {-, + 1, + 2, -}, \(f(B)=2\).
  • \(B=\) {-, + 1}, \(f(B)=1\).
  • \(B=\) {+ 1}, \(f(B)=1\).
  • \(B=\) {-, + 2}, \(f(B)=2\).
  • \(B=\) {+ 2}, \(f(B)=2\).

Сумма этих значений равна \(16\).

C. Машины соперников

битмаски математика Перебор поиск в глубину и подобное реализация Теория вероятностей *1900

После победы над соперником из Чёрного Списка вы получаете шанс вытянуть \(1\) из \(x\) доступных призовых карточек. Изначально \(x=3\) и доступны следующие карточки: Взятка, Освобождение от конфискации и Машина соперника. Изначально вероятность вытянуть их в случайной попытке равна \(c\), \(m\) и \(p\) соответственно. Также присутствует фактор изменчивости \(v\). Вы можете играть в гонки с соперником до тех пор, пока не вытяните карточку Машина соперника. Предположим, что вы выигрываете каждую гонку и получаете шанс тянуть призовую карточку. В каждом вытягивании вы достаете одну из \(x\) доступных карточек с соответствующей вероятностью. Пусть вы вытянули карточку и вероятность ее вытягивания до вашей попытки была равна \(a\). Тогда

  • Если это карточка Машина соперника, то игра для вас заканчивается и вы больше не можете участвовать в гонках.
  • Иначе
    1. Если \(a\leq v\), то вероятность вытянутой карточки становится равной \(0\) и она перестает быть доступной для последующих вытягиваний, уменьшая \(x\) на \(1\). Более того, освободившаяся вероятность \(a\) распределяется равномерно среди оставшихся доступных карточек.
    2. Если \(a > v\), вероятность вытянутой карточки уменьшается на \(v\), и освободившаяся вероятность распределяется равномерно среди остальных доступных карточек.

Например,

  • Если \((c,m,p)=(0.2,0.1,0.7)\) и \(v=0.1\), то после вытягивания карточки Взятка новые вероятности будут равны \((0.1,0.15,0.75)\).
  • Если \((c,m,p)=(0.1,0.2,0.7)\) и \(v=0.2\), то после вытягивания карточки Взятка новые вероятности будут равны \((\text{Недоступна},0.25,0.75)\).
  • Если \((c,m,p)=(0.2, \text{Недоступна},0.8)\) и \(v=0.1\), то после вытягивания карточки Взятка новые вероятности будут равны \((0.1, \text{Недоступна} ,0.9)\).
  • Если \((c,m,p)=(0.1,\text{Недоступна},0.9)\) и \(v=0.2\), то после вытягивания карточки Взятка новые вероятности будут равны \((\text{Недоступна},\text{Недоступна},1.0)\).

Вам хочется заполучить машину соперника. Для этого вы должны найти математическое ожидание количества гонок, которые нужно пройти, чтобы вытянуть карточку Машина соперника.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 10\)) — количество наборов входных данных.

Первая и единственная строка каждого набора содержит четыре действительных числа \(c\), \(m\), \(p\) и \(v\) (\(0 < c,m,p < 1\), \(c+m+p=1\), \(0.1\leq v\leq 0.9\)).

Гарантируется, что каждое из чисел \(c\), \(m\), \(p\) и \(v\) содержит не более \(4\)-х знаков после запятой.

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую одно действительное число — математическое ожидание количества гонок, которые нужно пройти, чтобы вытянуть карточку Машина соперника.

Ответ будет считаться верным, если его абсолютная или относительная ошибка не будет превосходить \(10^{-6}\).

Формально, пусть ваш ответ равен \(a\), а ответ жюри – \(b\). Ваш ответ считается правильным, если \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).

Примечание

Обозначим за C вытягивание карточки Взятка, за M — карточки Освобождение от конфискации, за P — карточки Машина соперника.

В первом наборе входных данных возможные последовательности вытягиваний представлены ниже:

  • P с вероятностью \(0.6\);
  • CP с вероятностью \(0.2\cdot 0.7 = 0.14\);
  • CMP с вероятностью \(0.2\cdot 0.3\cdot 0.9 = 0.054\);
  • CMMP с вероятностью \(0.2\cdot 0.3\cdot 0.1\cdot 1 = 0.006\);
  • MP с вероятностью \(0.2\cdot 0.7 = 0.14\);
  • MCP с вероятностью \(0.2\cdot 0.3\cdot 0.9 = 0.054\);
  • MCCP с вероятностью \(0.2\cdot 0.3\cdot 0.1\cdot 1 = 0.006\);
Поэтому математическое ожидание количества гонок равно \(1\cdot 0.6 + 2\cdot 0.14 + 3\cdot 0.054 + 4\cdot 0.006 + 2\cdot 0.14 + 3\cdot 0.054 + 4\cdot 0.006 = 1.532\).

Во втором наборе данных возможные последовательности вытягиваний представлены ниже -

  • P с вероятностью \(0.4\);
  • CP с вероятностью \(0.4\cdot 0.6 = 0.24\);
  • CMP с вероятностью \(0.4\cdot 0.4\cdot 1 = 0.16\);
  • MP с вероятностью \(0.2\cdot 0.5 = 0.1\);
  • MCP с вероятностью \(0.2\cdot 0.5\cdot 1 = 0.1\).

Поэтому математическое ожидание количества гонок равно \(1\cdot 0.4 + 2\cdot 0.24 + 3\cdot 0.16 + 2\cdot 0.1 + 3\cdot 0.1 = 1.86\).

A. Кратчайший путь с препятствием

математика реализация *800

На бесконечном клетчатом поле отмечены три различные клетки: \(A\), \(B\) и \(F\). Выведите длину кратчайшего пути из \(A\) в \(B\), если:

  • за один ход можно переходить на любую из четырех соседних по стороне клеток;
  • посещать клетку \(F\) — запрещено (она является препятствием).
Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных, перед каждым из них входные данные содержат пустую строку.

Каждый набор входных данных состоит из трех строк. Первая из них содержит два целых числа \(x_A, y_A\) (\(1 \le x_A, y_A \le 1000\)) — координаты стартовой клетки \(A\). Вторая из них содержит два целых числа \(x_B, y_B\) (\(1 \le x_B, y_B \le 1000\)) — координаты конечной клетки \(B\). Третья строка содержит два целых числа \(x_F, y_F\) (\(1 \le x_F, y_F \le 1000\)) — координаты клетки \(F\), которая является препятствием. Все три клетки — различны.

Координата \(x\) соответствует номеру столбца, а \(y\) — номеру строки (см. картинки ниже).

Выходные данные

Выведите \(t\) строк. \(i\)-я из них должна содержать ответ для \(i\)-го набора входных данных — длину кратчайшего пути из клетки \(A\) в клетку \(B\), если клетка \(F\) запрещена для посещения.

Примечание
Пример возможного кратчайшего пути для первого набора входных данных.
Пример возможного кратчайшего пути для второго набора входных данных.

B. Алфавитные строки

жадные алгоритмы реализация Строки *800

Строка \(s\) длины \(n\) (\(1 \le n \le 26\)) называется алфавитной, если она может быть получена с помощью следующего алгоритма:

  • вначале записываем в \(s\) пустую строку (то есть выполняем присваивание \(s\) := "");
  • далее выполним следующий шаг \(n\) раз;
  • при \(i\)-м выполнении шага берем \(i\)-ю строчную букву латинского алфавита и приписываем её либо слева к строке \(s\), либо справа к строке \(s\) (то есть осуществляем присвоение \(s\) := \(c+s\) или \(s\) := \(s+c\), где \(c\)\(i\)-я буква латинского алфавита).

Иными словами, переберем \(n\) первых букв латинского алфавита от 'a' и далее. Каждый раз к строке \(s\) будем приписывать букву либо слева, либо справа. Строки, которые можно получить таким образом — алфавитные.

Например, следующие строки являются алфавитными: «a», «ba», «ab», «bac» и «ihfcbadeg». Следующие строки не являются алфавитными: «z», «aa», «ca», «acb», «xyz» и «ddcba».

По заданной строке определите, является ли она алфавитной.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных записан в отдельной строке, которая содержит \(s\). Строка \(s\) состоит из строчных букв латинского алфавита, имеет длину от \(1\) до \(26\), включительно.

Выходные данные

Выведите \(t\) строк, каждая из строк должна содержать ответ на соответствующий набор входных данных. Выведите YES, если заданная строка \(s\) является алфавитной и NO в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

Пример содержит наборы входных данных из основной части условия.

E. Кондиционеры

дп кратчайшие пути реализация сортировки Структуры данных *1500

На клетчатой полоске длины \(n\) расположены \(k\) кондиционеров: \(i\)-й кондиционер расположен в клетке \(a_i\) (\(1 \le a_i \le n\)). Два или более кондиционера не могут находиться в одной клетке (то есть все \(a_i\) различны).

Каждый кондиционер характеризуется еще одним параметром — температурой: \(i\)-й кондиционер включен на температуру \(t_i\).

Пример полосы длины \(n=6\), где \(k=2\), \(a=[2,5]\) и \(t=[14,16]\).

Для каждой клетки \(i\) (\(1 \le i \le n\)) найдите температуру воздуха в ней, которая равна \(\)\min_{1 \le j \le k}(t_j + |a_j - i|),\(\)

где \(|a_j - i|\) обозначает абсолютную величину (модуль) значения разности \(a_j - i\).

Иными словами, температура в клетке \(i\) равна минимуму среди температур кондиционеров, увеличенных на расстояние от кондиционера до клетки \(i\).

Рассмотрим пример. Пусть \(n=6, k=2\), первый кондиционер стоит в клетке \(a_1=2\) включен на температуру \(t_1=14\), а второй стоит в клетке \(a_2=5\) и включен на температуру \(t_2=16\). В таком случае температуры воздуха в клетках будут следующими:

  1. температура в \(1\)-й клетке равна: \(\min(14 + |2 - 1|, 16 + |5 - 1|)=\min(14 + 1, 16 + 4)=\min(15, 20)=15\);
  2. температура во \(2\)-й клетке равна: \(\min(14 + |2 - 2|, 16 + |5 - 2|)=\min(14 + 0, 16 + 3)=\min(14, 19)=14\);
  3. температура в \(3\)-й клетке равна: \(\min(14 + |2 - 3|, 16 + |5 - 3|)=\min(14 + 1, 16 + 2)=\min(15, 18)=15\);
  4. температура в \(4\)-й клетке равна: \(\min(14 + |2 - 4|, 16 + |5 - 4|)=\min(14 + 2, 16 + 1)=\min(16, 17)=16\);
  5. температура в \(5\)-й клетке равна: \(\min(14 + |2 - 5|, 16 + |5 - 5|)=\min(14 + 3, 16 + 0)=\min(17, 16)=16\);
  6. температура в \(6\)-й клетке равна: \(\min(14 + |2 - 6|, 16 + |5 - 6|)=\min(14 + 4, 16 + 1)=\min(18, 17)=17\).

Для каждой клетки от \(1\) до \(n\) найдите температуру воздуха в ней.

Входные данные

В первой строке задано целое число \(q\) (\(1 \le q \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют наборы входных данных. Перед каждым набором входных данных записана пустая строка.

Каждый набор входных данный состоит из трех строк. В первой строке заданы два целых числа \(n\) (\(1 \le n \le 3 \cdot 10^5\)) и \(k\) (\(1 \le k \le n\)) — длина клетчатой полоски и количество кондиционеров соответственно.

Вторая строка содержит \(k\) целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \le a_i \le n\)) — позиции кондиционеров на клетчатой полоске.

Третья строка содержит \(k\) целых чисел \(t_1, t_2, \ldots, t_k\) (\(1 \le t_i \le 10^9\)) — температуры кондиционеров.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите через пробел \(n\) целых чисел — температуры воздуха в клетках.

B. Грегор и игра в пешки

графы дп жадные алгоритмы Паросочетания поиск в глубину и подобное Потоки реализация *800

Дана шахматная доска размера \(n\) на \(n\). Клетка на пересечении \(i\)-й сверху ряду и \(j\)-го слева столбца обозначается как \((i,j)\).

На данный момент у Грегора есть несколько пешек в \(n\)-м ряду. Также в \(1\)-м ряду стоят вражеские пешки. За один шаг Грегор перемещает одну из своих пешек. Пешка может ходить на одну клетку вверх (из \((i,j)\) в \((i-1,j)\)), если клетка назначения не занята другой пешкой. В дополнение, пешка может переместиться на одну клетку вверх по диагонали (из \((i,j)\) в \((i-1,j-1)\) или в \((i-1,j+1)\)), если и только если в этой клетке стоит вражеская пешка. Вражеская пешка в таком случае убирается с доски.

Грегор хочет узнать, какое максимальное количество его пешек может достичь \(1\)-го ряда.

Заметьте, что в этой игре ходит только Грегор, вражеские пешки никогда не перемещаются. Также, когда пешка Грегора достигает \(1\)-го ряда, она останавливается и больше не может перемещаться.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1\le t\le 2\cdot 10^4\)) — количество наборов входных данных. Далее следует описание этих \(t\) наборов.

Каждый набор входных данных состоит из трех строк. Первая строка содержит одно целое число \(n\) (\(2\le n\le 2\cdot{10}^{5}\)) — размер доски.

Вторая строка содержит бинарную строку длины \(n\), в которой \(1\) на \(i\)-й позиции соответствует вражеской пешке в \(i\)-й слева клетке в первом ряду, а \(0\) соответствует пустой клетке.

Третья строка содержит бинарную строку длины \(n\), в которой \(1\) на \(i\)-й позиции соответствует пешке Грегора в \(i\)-й слева клетке в последнем ряду, а \(0\) соответствует пустой клетке.

Гарантируется, что сумма \(n\) по всем наборам входных данных меньше \(2\cdot{10}^{5}\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: максимальное количество пешек Грегора, которые могут достичь \(1\)-го ряда.

Примечание

В первом примере Грегор может просто переместить вперед все его \(3\) пешки. Таким образом, ответ равен \(3\).

Во втором примере Грегор может гарантировать, что все его \(4\) пешки достигнут вражеского ряда, следуя раскрашенным путям как показано ниже. Помните — только Грегор делает ходы в этой «игре»!

В третьем примере единственная пешка Грегора застряла перед вражеской пешкой и не может достигнуть желаемого ряда.

В четвертом примере у Грегора нет пешек, поэтому ответ равен \(0\).

C. Манхэттенские подмассивы

геометрия жадные алгоритмы Перебор реализация *1700

Предположим, есть две точки \(p = (x_p, y_p)\) и \(q = (x_q, y_q)\). Тогда обозначим манхэттенское расстояние между ними как \(d(p, q) = |x_p - x_q| + |y_p - y_q|\).

Назовем три точки \(p\), \(q\), \(r\) как плохую тройку, если \(d(p, r) = d(p, q) + d(q, r)\).

Назовем массив \(b_1, b_2, \dots, b_m\) хорошим, если нельзя выбрать три различных индекса \(i\), \(j\) и \(k\) так, что точки \((b_i, i)\), \((b_j, j)\) и \((b_k, k)\) — плохая тройка.

Вам задан массив \(a_1, a_2, \dots, a_n\). Посчитайте количество хороших подмассивов \(a\). Подмассив массива \(a\) — это массив \(a_l, a_{l + 1}, \dots, a_r\) для некоторых \(1 \le l \le r \le n\).

Заметим, что согласно определению, подмассивы длины \(1\) и \(2\) являются хорошими.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина массива \(a\).

Во второй строке каждого набора заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора выведите количество хороших подмассивов массива \(a\).

Примечание

В первом наборе, можно доказать, что любой подмассив массива \(a\) является хорошим. Например, подмассив \([a_2, a_3, a_4]\) — хороший, потому что содержит только три элемента и:

  • \(d((a_2, 2), (a_4, 4)) = |4 - 3| + |2 - 4| = 3\) \(<\) \(d((a_2, 2), (a_3, 3)) + d((a_3, 3), (a_4, 4)) = 3 + 1 + 2 + 1 = 7\);
  • \(d((a_2, 2), (a_3, 3))\) \(<\) \(d((a_2, 2), (a_4, 4)) + d((a_4, 4), (a_3, 3))\);
  • \(d((a_3, 3), (a_4, 4))\) \(<\) \(d((a_3, 3), (a_2, 2)) + d((a_2, 2), (a_4, 4))\);

Во втором наборе, для примера, подмассив \([a_1, a_2, a_3, a_4]\) не является хорошим, потому что содержит плохую тройку \((a_1, 1)\), \((a_2, 2)\), \((a_4, 4)\):

  • \(d((a_1, 1), (a_4, 4)) = |6 - 9| + |1 - 4| = 6\);
  • \(d((a_1, 1), (a_2, 2)) = |6 - 9| + |1 - 2| = 4\);
  • \(d((a_2, 2), (a_4, 4)) = |9 - 9| + |2 - 4| = 2\);

То есть, \(d((a_1, 1), (a_4, 4)) = d((a_1, 1), (a_2, 2)) + d((a_2, 2), (a_4, 4))\).

D. Отличные массивы

Бинарный поиск Комбинаторика Конструктив математика реализация сортировки *2300

Назовем целочисленный массив \(a_1, a_2, \dots, a_n\) хорошим, если \(a_i \neq i\) для всех \(i\).

Пусть \(F(a)\) — это количество пар \((i, j)\) (\(1 \le i < j \le n\)) таких, что \(a_i + a_j = i + j\).

Назовем массив \(a_1, a_2, \dots, a_n\) отличным если:

  • \(a\) — хороший;
  • \(l \le a_i \le r\) для всех \(i\);
  • \(F(a)\) максимально возможное среди всех хороших массивов размера \(n\).

Для заданных \(n\), \(l\) и \(r\) посчитайте количество отличных массивов по модулю \(10^9 + 7\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой и единственной строке каждого набора заданы три целых числа \(n\), \(l\) и \(r\) (\(2 \le n \le 2 \cdot 10^5\); \(-10^9 \le l \le 1\); \(n \le r \le 10^9\)).

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите количество отличных массивов по модулю \(10^9 + 7\).

Примечание

В первом наборе входных данных, можно показать, что максимальное \(F(a)\) среди всех хороших массивов \(a\) равно \(2\). Отличными являются следующие массивы:

  1. \([2, 1, 2]\);
  2. \([0, 3, 2]\);
  3. \([2, 3, 2]\);
  4. \([3, 0, 1]\).

D2. Домино (усложнённая версия)

Конструктив математика реализация *2100

Единственное отличие этой задачи от задачи D1 состоит в том, что в задаче D1 не нужно выводить способ построения ответа, но это необходимо делать в этой задаче.

Рассмотрим прямоугольную таблицу размера \(n \times m\) (из \(n\) строк и \(m\) столбцов). Значение \(n \cdot m\) является чётным числом.

Доминошка — это фигура из двух клеток, имеющих общую сторону. Доминошка является горизонтальной, если одна из клеток находится правее другой, или вертикальной, если одна из клеток находится выше другой.

В этой таблице необходимо разместить \(\frac{nm}{2}\) доминошек таким образом, чтобы ровно \(k\) из них были расположены горизонтально, остальные — вертикально. Доминошки не должны пересекаться, и на таблице не должно оставаться незанятых ячеек.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из одной строки. Строка содержит три целых числа — \(n\), \(m\), \(k\) (\(1 \le n,m \le 100\), \(0 \le k \le \frac{nm}{2}\), \(n \cdot m\) — чётно) — количество строк, столбцов в таблице и горизонтальных доминошек соответственно.

Выходные данные

Для каждого набора входных данных выведите:

  • «NO», если невозможно расположить доминошки описанным способом;
  • в противном случае в первой строке, соответствующей набору входных данных, выведите «YES», далее выведите \(n\) строк, каждая из которых содержит по \(m\) символов — описание расположения доминошек на таблице. Каждая ячейка таблицы должна быть помечена строчной буквой латинского алфавита таким образом, чтобы любые две имеющие общую сторону клетки были помечены одинаковыми буквами тогда и только тогда, когда на них размещена одна и та же доминошка. Иными словами, обе части одной доминошки должны быть помечены одинаковой буквой, но две доминошки, соседние по стороне, должны быть помечены разными буквами. Если существует несколько решений, выведите любое из них.

B. Переворот строки

дп Перебор реализация Строки хэши *1300

У вас есть строка \(s\) и фишка, которую вы можете поставить на любой символ этой строки.

После того, как вы поставите фишку, вы можете подвинуть ее вправо несколько (возможно, ноль) раз, то есть сделать следующее действие несколько раз: если текущая позиция фишки обозначена как \(i\), фишка перемещается в позицию \(i + 1\). Конечно же, это действие невозможно, если фишка находится в последней позиции строки.

После того, как вы закончите двигать фишку вправо, вы можете подвинуть ее влево несколько (возможно, ноль) раз, то есть сделать следующее действие несколько раз: если текущая позиция фишки обозначена как \(i\), фишка перемещается в позицию \(i - 1\). Конечно же, это действие невозможно, если фишка находится в первой позиции строки.

Когда вы ставите фишку или перемещаете ее, вы выписываете символ, на котором оказалась фишка. Например, если строка \(s\)abcdef, вы ставите фишку на \(3\)-й символ, двигаете ее вправо \(2\) раза, а затем двигаете ее влево \(3\) раза, вы выпишете строку cdedcb.

Вам даны две строки \(s\) и \(t\). Ваше задание — определить, можно ли так выполнить описанные операции со строкой \(s\), что в результате вы выпишете строку \(t\).

Входные данные

В первой строке задано одно целое число \(q\) (\(1 \le q \le 500\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк. В первой строке задана строка \(s\) (\(1 \le |s| \le 500\)), во второй строке — строка \(t\) (\(1 \le |t| \le 2 \cdot |s| - 1\)). Обе строки состоят из строчных букв латинского алфавита.

Гарантируется, что сумма \(|s|\) по всем наборам входных данных не превосходит \(500\).

Выходные данные

Для каждого набора выходных данных выведите «YES», если можно выписать строку \(t\), проводя описанные в условии действия со строкой \(s\), или «NO» в противном случае.

Каждую букву можно выводить в любом регистре (YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

Примечание

Рассмотрим примеры из условия.

Первый набор входных данных разобран в условии.

Во втором наборе входных данных можно поместить фишку на \(1\)-ю позицию, подвинуть ее дважды вправо, а затем дважды влево.

В четвертом наборе входных данных можно поместить фишку на \(2\)-ю позицию, а потом не двигать ее вообще.

В пятом наборе входных данных можно поставить фишку на \(1\)-ю позицию, подвинуть ее \(5\) раз вправо и завершить процесс.

C. Микаса

Бинарный поиск битмаски жадные алгоритмы реализация *1800

Вам даны два целых числа \(n\) и \(m\). Найдите \(\operatorname{MEX}\) последовательности \(n \oplus 0, n \oplus 1, \ldots, n \oplus m\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

\(\operatorname{MEX}\) последовательности неотрицательных целых чисел — это наименьшее неотрицательное целое число, которое не встречается в этой последовательности. Например, \(\operatorname{MEX}(0, 1, 2, 4) = 3\), а \(\operatorname{MEX}(1, 2021) = 0\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 30\,000\))  — количество наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(0 \le n, m \le 10^9\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число  — ответ на задачу.

Примечание

В первом наборе входных данных последовательность равна \(3 \oplus 0, 3 \oplus 1, 3 \oplus 2, 3 \oplus 3, 3 \oplus 4, 3 \oplus 5\), или \(3, 2, 1, 0, 7, 6\). Наименьшее неотрицательное целое число, которое не присутствует в последовательности, т. е. \(\operatorname{MEX}\) последовательности — \(4\).

Во втором наборе входных данных последовательность равна \(4 \oplus 0, 4 \oplus 1, 4 \oplus 2, 4 \oplus 3, 4 \oplus 4, 4 \oplus 5, 4 \oplus 6\), или \(4, 5, 6, 7, 0, 1, 2\). Наименьшее неотрицательное целое число, которое не присутствует в последовательности, т. е. \(\operatorname{MEX}\) последовательности — \(3\).

В третьем наборе входных данных последовательность равна \(3 \oplus 0, 3 \oplus 1, 3 \oplus 2\), или \(3, 2, 1\). Наименьшее неотрицательное целое число, которое не присутствует в последовательности, т. е. \(\operatorname{MEX}\) последовательности — \(0\).

C. Ряды монет

дп Конструктив Перебор реализация *1300

Алиса и Боб играют в игру на матрице, состоящей из \(2\) строк и \(m\) столбцов. В ячейке в \(i\)-й строке в \(j\)-м столбце лежит \(a_{i, j}\) монет.

Изначально Алиса и Боб стоят в ячейке \((1, 1)\). Они собираются пройти какой-то последовательностью ходов в ячейку \((2, m)\).

Возможные ходы следующие:

  • Пойти направо — из некоторой ячейки \((x, y)\) в \((x, y + 1)\);
  • Пойти вниз — из некоторой ячейки \((x, y)\) в \((x + 1, y)\).

Сначала Алиса делает все свои ходы, пока не достигнет \((2, m)\). Она собирает монеты во всех клетках, которые они посещает (включая стартовую).

Когда Алиса заканчивает, Боб начинает свой путь. Он также делает ходы, чтобы достичь \((2, m)\), и собирает монеты во всех клетках, которые он посетил, а Алиса нет.

Счет в игре равен суммарному количеству монет, которые собрал Боб.

Алиса хочет минимизировать счет. Боб хочет максимизировать счет. Какой будет счет в игре, если оба игрока играют оптимально?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Затем следуют описания \(t\) наборов входных данных.

В первой строке каждого набора записано одно целое число \(m\) (\(1 \le m \le 10^5\)) — количество столбцов в матрице.

В \(i\)-й из следующих \(2\) строк записаны \(m\) целых чисел \(a_{i,1}, a_{i,2}, \dots, a_{i,m}\) (\(1 \le a_{i,j} \le 10^4\)) — количество монет в ячейке в \(i\)-м ряду в \(j\)-м столбце матрицы.

Сумма \(m\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — счет игры, если оба игрока играют оптимально.

Примечание

Пути для наборов входных данных из примеров изображены ниже. Путь Алисы раскрашен красным, а путь Боба — синим.

B. По местам!

реализация *1300

У Василия есть массив из \(n\) целых чисел \(a_1, a_2, \dots, a_n\). За одно действие он может поменять местами два рядом стоящих элемента. Два элемента \(a_i\) и \(a_j\) называются рядом стоящими, если выполняется условие \(|i - j| = 1\).

Василий просит вас посчитать минимальное количество действий для того, чтобы в массиве не было двух рядом стоящих элементов с одинаковой четностью.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) \((1 \le n \le 10^5)\) — количество элементов в массиве Василия.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) \((1 \le a_i \le 10^9)\) — описание массива Василия.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество операций или \(-1\), если в любом случае в массиве будет два рядом стоящих числа с одинаковой четностью.

Примечание

В первом тестовом примере подходит следующая последовательность операций:

  1. swap(2, 3). Массив после применения операции: \([6, 1, 6]\)

Во втором тестовом примере в массиве изначально отсутствуют два рядом стоящих элемента с одинаковой четностью.

В третьем тестовом примере подходит следующая последовательность операций:

  1. swap(3, 4). Массив после применения операции: \([1, 1, 2, 1, 2, 2]\)
  2. swap(2, 3). Массив после применения операции: \([1, 2, 1, 1, 2, 2]\)
  3. swap(4, 5). Массив после применения операции: \([1, 2, 1, 2, 1, 2]\)

В четвертом тестовом примере требуемых условий добиться невозможно.

В пятом тестовом примере подходит следующая последовательность операций:

  1. swap(2, 3). Массив после применения операции: \([6, 3, 2, 4, 5, 1]\)
  2. swap(4, 5). Массив после применения операции: \([6, 3, 2, 5, 4, 1]\)

C. Сжатая скобочная последовательность

Перебор реализация *1800

У Василия есть его любимая скобочная последовательность. Так как последовательность имеет внушительный размер, Василий предоставил вам ее в виде последовательности положительных чисел \(c_1, c_2, \dots, c_n\), где \(c_i\) обозначает количество подряд идущих скобок «(» в случае, если \(i\) — нечетное число, либо количество подряд идущих скобок «)» в случае, если \(i\) — четное число.

К примеру, скобочной последовательности «((())()))» соответствует последовательность \([3, 2, 1, 3]\).

Вам необходимо найти количество подотрезков \([l, r]\) (\(l \le r\)) оригинальной скобочной последовательности, которые являются правильными скобочными последовательностями.

Напомним, что правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов «1» и «+». Например, скобочные последовательности «(())()», «()» и «(()(()))» — правильные, а «)(», «(()» и «(()))(» — нет.

Входные данные

Первая строка ввода содержит целое число \(n\) \((1 \le n \le 1000)\) — размер сжатой последовательности.

Вторая строка ввода содержит последовательность целых чисел \(c_1, c_2, \dots, c_n\) \((1 \le c_i \le 10^9)\) — описание сжатой скобочной последовательности.

Выходные данные

Выведите одно целое число — количество отрезков оригинальной скобочной последовательности, которые являются правильными скобочными последовательностями.

Можно показать, что ответ помещается в знаковый 64-битный целочисленный тип данных.

Примечание

В первом тестовом примере описана скобочная последовательность (((()(()))(. В этой скобочной последовательности есть \(5\) отрезков, которые являются правильными скобочными последовательностями:

  1. Отрезок с \(3\) по \(10\) символ: (()(()))
  2. Отрезок с \(4\) по \(5\) символ: ()
  3. Отрезок с \(4\) по \(9\) символ: ()(())
  4. Отрезок с \(6\) по \(9\) символ: (())
  5. Отрезок с \(7\) по \(8\) символ: ()

Во втором тестовом примере описана скобочная последовательность ()))(()(()))).

В третьем тестовом примере описана скобочная последовательность ()()(()).

B. Подозреваемые

Конструктив реализация Структуры данных *1600

Расследуя очередное убийство, Шерлок Холмс определил n подозреваемых. Он точно знает, что убийство совершил ровно один из них. Чтобы определить, кто именно это сделал, детектив выстроил подозреваемых в ряд и пронумеровал их числами от 1 до n. После этого он спросил каждого: «Кто из вас совершил убийство?». Подозреваемый номер i ответил либо «Убийство совершил подозреваемый номер ai», либо «Подозреваемый номер ai не совершал убийства». В том числе, подозреваемый мог сказать это про себя (ai = i).

Шерлок Холмс безошибочно определил, что ровно m ответов были правдой, а все остальные — ложью. Помогите ему теперь понять, кто из подозреваемых соврал, а кто сказал правду?

Входные данные

В первой строке заданы два целых числа n и m (1 ≤ n ≤ 105, 0 ≤ m ≤ n) — общее количество подозреваемых и количество подозреваемых, сказавших правду. В следующих n строках заданы ответы подозреваемых. В i-ой строке написано «+ai» (без кавычек), если подозреваемый номер i говорит, что убийство совершил подозреваемый номер ai, или «-ai» (без кавычек), если подозреваемый номер i говорит, что подозреваемый номер ai не совершал убийства (ai — целое число, 1 ≤ ai ≤ n).

Гарантируется, что существует хотя бы один подозреваемый, такой, что если он совершил убийство, то правду сказали ровно m человек.

Выходные данные

Выведите n строк. В строке номер i должно быть написано «Truth», если подозреваемый номер i точно сказал правду, «Lie», если подозреваемый номер i точно соврал, и «Not defined», если он мог соврать, а мог и сказать правду, в зависимости от того, кто совершил убийство.

Примечание

В первом примере есть единственный человек, и он признается в убийстве, и Шерлок Холмс знает, что один человек сказал правду. Значит, этот человек говорит правду.

Во втором примере трое подозреваемых и все трое отрицают свою вину. Шерлок Холмс знает, что только двое из них говорят правду. Любой из них может быть убийцей, и поэтому ни про кого из них неизвестно, говорит ли он правду.

В третьем примере второй и четвертый защищают первого и третьего. Но правду сказал только один, значит, первый или третий совершил убийство. Оба они могли совершить убийство, значит, второй и четвертый могут как врать, так и говорить правду. Первый и третий же точно врут, поскольку сваливают вину на второго и четвертого.

A. Нелюбовь к тройкам

реализация *800

Поликарп не любит целые числа, которые делятся на \(3\) или оканчиваются цифрой \(3\) в десятичной записи. Числа, для которых выполняются оба условия одновременно, Поликарп тоже не любит.

Поликарп начал выписывать последовательно целые положительные (большие, чем \(0\)) числа, к которым он относится хорошо: \(1, 2, 4, 5, 7, 8, 10, 11, 14, 16, \dots\). Выведите \(k\)-й элемент из этой последовательности (элементы нумеруются с \(1\)).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей одно целое число \(k\) (\(1 \le k \le 1000\)).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите одно число \(x\)\(k\)-й элемент в последовательности, выписанной Поликарпом.

C. Бесконечная таблица

математика реализация *800

Поликарп нашёл таблицу, имеющую бесконечное количество строк и столбцов. Строки пронумерованы от \(1\), начиная с самой верхней. Аналогично, столбцы пронумерованы от \(1\), начиная с самого левого.

Изначально таблица не заполнена, и Поликарп хочет это исправить. Он записывает числа от \(1\) и далее в таблицу следующим образом.

Здесь изображено, как он расставит числа от \(1\) до \(10\). Стрелками обозначены дальнейшие действия.

В левую верхнюю ячейку таблицы он записывает число \(1\). Далее он последовательно записывает в таблицу все положительные целые числа, начиная с \(2\), по порядку, придерживаясь следующего алгоритма.

Сначала Поликарп выбирает самую левую незаполненную ячейку в самой первой строке таблицы и заполняет её. Затем, пока у последней заполненной ячейки сосед слева существует и заполнен, он переходит вниз и заполняет очередную ячейку. Таким образом, он переходит вниз до тех пор, пока не окажется в клетке, у которой не заполнен сосед слева (смотрите на вертикальную стрелку, идущую вниз, на рисунке выше).

После этого он начинает заполнять клетки справа налево от текущей, пока не упрётся в первый столбец (смотрите на горизонтальную стрелку, идущую влево, на рисунке выше). После этого Поликарп снова выбирает самую левую незаполненную ячейку в первой строке и идет вниз, и так далее.

У друга Поликарпа есть любимое число \(k\). Он хочет узнать, в какой ячейке это число окажется. Помогите ему найти номер строки и столбца, на пересечении которых находится ячейка, содержащая заданное число \(k\).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей одно целое число \(k\) (\(1 \le k \le 10^9\)), координаты которого необходимо найти.

Выходные данные

Для каждого набора входных данных в отдельной строке выведите через пробел два целых числа \(r\) и \(c\) (\(r, c \ge 1\)) — номер строки и номер столбца ячейки, содержащей число \(k\), соответственно.

E. Поликарп и преобразование строки

Бинарный поиск реализация сортировки Строки *1800

У Поликарп есть строка \(s\). Поликарп делает следующие действия до тех пор, пока строка \(s\) не станет пустой (изначально \(t\) — пустая строка):

  • дописывает справа к \(t\) строку \(s\), то есть совершает присвоение \(t = t + s\), где \(t + s\) обозначает конкатенацию (соединение) строк \(t\) и \(s\);
  • выбирает произвольным образом какую-то одну букву из \(s\) и удаляет из \(s\) все её вхождения (выбранная буква обязательно должна встречаться в \(s\) на момент выполнения этого действия).

Поликарп выполняет данную последовательность действий строго в заданном порядке.

Отметим, что в конце концов строка \(s\) станет пустой, а строка \(t\) будет равна некоторому значению (и это значение определяется неоднозначно, оно зависит от порядка удаления).

Например, если изначально \(s\)abacaba», то события могли разворачиваться следующим образом:

  • \(t\)abacaba», выбрана буква 'b', теперь \(s\)aacaa»;
  • \(t\)abacabaaacaa», выбрана буква 'a', теперь \(s\)c»;
  • \(t\)abacabaaacaac», выбрана буква 'c', теперь \(s\)=«» (пустая строка).

Вам необходимо восстановить исходное значение строки \(s\) по итоговому значению \(t\) и найти порядок, в котором удалялись буквы из \(s\).

Входные данные

В первой строке записано одно целое число \(T\) (\(1 \le T \le 10^4\)) — количество наборов входных данных. Далее следуют \(T\) наборов входных данных.

Каждый набор входных данных состоит из одной строки \(t\), состоящей из строчных букв латинского алфавита. Длина \(t\) не превышает \(5 \cdot 10^5\). Сумма длин всех строк \(t\) во всех наборах входных данных теста не превышает \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке:

  • \(-1\), если ответа не существует;
  • две строки через пробел. Первая строка должна содержать начальное возможное значение \(s\). Вторая строка должна содержать последовательность букв — в каком порядке надо удалять буквы из \(s\), чтобы получилась строка \(t\). Например, если выведена строка «bac», то сначала удалялись все вхождения буквы 'b', потом — все вхождения буквы 'a', затем — все вхождения буквы 'c'. Если существует несколько решений, выведите любое из них.
Примечание

Первый набор входных данных разобран в условии.

A. Простая странная сортировка

Перебор реализация сортировки *800

У вас есть перестановка — массив \(a = [a_1, a_2, \ldots, a_n]\) из различных целых чисел от \(1\) до \(n\). Длина перестановки \(n\) нечётна.

Рассмотрим следующий алгоритм сортировки перестановки по возрастанию.

Вспомогательная процедура алгоритма, \(f(i)\), принимает на вход индекс \(i\) (\(1 \le i \le n-1\)) и делает следующее. Если \(a_i > a_{i+1}\), значения \(a_i\) и \(a_{i+1}\) меняются местами. В противном случае перестановка остаётся без изменений.

Алгоритм состоит из итераций, пронумерованных последовательными целыми числами, начиная с \(1\). На \(i\)-й итерации алгоритм делает следующее:

  • если \(i\) нечётно, вызываются \(f(1), f(3), \ldots, f(n - 2)\);
  • если \(i\) чётно, вызываются \(f(2), f(4), \ldots, f(n - 1)\).

Можно доказать, что после конечного числа итераций перестановка станет отсортирована по возрастанию.

Через сколько итераций это впервые произойдёт?

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит одно целое число \(n\) (\(3 \le n \le 999\); \(n\) нечётно) — длину перестановки.

Вторая строка содержит \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — саму перестановку.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(999\).

Выходные данные

Для каждого набора входных данных выведите число итераций, после которого заданная перестановка впервые окажется отсортирована по возрастанию.

Если заданная перестановка уже отсортирована, выведите \(0\).

Примечание

В первом наборе входных данных перестановка будет меняться следующим образом:

  • после \(1\)-й итерации: \([2, 3, 1]\);
  • после \(2\)-й итерации: \([2, 1, 3]\);
  • после \(3\)-й итерации: \([1, 2, 3]\).

Во втором наборе входных данных перестановка будет меняться следующим образом:

  • после \(1\)-й итерации: \([4, 5, 1, 7, 2, 3, 6]\);
  • после \(2\)-й итерации: \([4, 1, 5, 2, 7, 3, 6]\);
  • после \(3\)-й итерации: \([1, 4, 2, 5, 3, 7, 6]\);
  • после \(4\)-й итерации: \([1, 2, 4, 3, 5, 6, 7]\);
  • после \(5\)-й итерации: \([1, 2, 3, 4, 5, 6, 7]\).

В третьем наборе входных данных перестановка уже отсортирована, поэтому ответ равен \(0\).

B. Scenes From a Memory

Конструктив математика Перебор реализация теория чисел *1000

Во время сеанса гипноза Николас неожиданно вспомнил целое положительное число \(n\), не содержащее нулей в десятичной записи.

Вскоре, когда он уже вернулся домой, ему стало интересно: какое максимальное количество цифр можно удалить из числа так, чтобы оно стало не простым, то есть либо составным, либо равным единице? Помогите ему найти ответ!

Для некоторых чисел сделать это невозможно: например, для числа \(53\) невозможно удалить некоторые из его цифр, чтобы получить не простое целое число. Однако, для всех \(n\) в тестах этой задачи гарантируется, что можно удалить некоторые из их цифр, чтобы получить не простое число.

Из числа нельзя удалять все цифры.

Простым называется число, которое не имеет никаких делителей, кроме единицы и самого себя. Составным называется число, которое имеет более двух делителей. \(1\) не является ни простым, ни составным числом.

Входные данные

Каждый тест содержит несколько наборов входных данных.

В первой строке находится одно целое положительное число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Описание наборов входных данных приведено ниже.

В первой строке каждого набора входных данных находится одно целое положительное число \(k\) (\(1 \le k \le 50\)) — количество цифр в числе.

Во второй строке каждого набора входных данных находится целое положительное число \(n\), не содержащее нулей в десятичной записи (\(10^{k-1} \le n < 10^{k}\)). Гарантируется, что из числа можно удалить менее, чем \(k\) цифр, чтобы оно стало не простым.

Гарантируется, что сумма \(k\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

Для каждого набора входных данных выведите в отдельных двух строках выведите два числа: количество цифр, которое вы оставили в первой строке, и оставшееся после удалений число во второй.

Если существует несколько правильных вариантов ответа, вы можете вывести любой.

Примечание

В первом наборе входных данных нельзя удалить \(2\) цифры из числа \(237\), так как все числа \(2\), \(3\) и \(7\) являются простыми. Однако вы можете удалить \(1\) цифру, получив число \(27 = 3^3\).

Во втором наборе входных данных можно удалить все цифры, кроме одной, так как \(4 = 2^2\) — составное число.

D2. Рассадка в кинотеатре (сложная версия)

жадные алгоритмы реализация сортировки Структуры данных *1600

Это сложная версия задачи. Единственное различие состоит в том, что в этой версии \(1 \le n \le 300\).

В кинотеатре места могут быть представлены как таблица из \(n\) рядов и \(m\) столбцов. Ряды нумеруются целыми числами от \(1\) до \(n\). Места в каждом ряду нумеруются последовательными целыми числами слева направо: в \(k\)-м ряду от \(m (k - 1) + 1\) до \(m k\) для всех рядов \(1 \le k \le n\).

\(1\)\(2\)\(\cdots\)\(m - 1\)\(m\)
\(m + 1\)\(m + 2\)\(\cdots\)\(2 m - 1\)\(2 m\)
\(2m + 1\)\(2m + 2\)\(\cdots\)\(3 m - 1\)\(3 m\)
\(\vdots\)\(\vdots\)\(\ddots\)\(\vdots\)\(\vdots\)
\(m (n - 1) + 1\)\(m (n - 1) + 2\)\(\cdots\)\(n m - 1\)\(n m\)
Таблица с номерами мест

Есть \(nm\) людей, которые хотят прийти в кинотеатр, чтобы посмотреть новый фильм. Они пронумерованы целыми числами от \(1\) до \(nm\). Вы должны задать ровно одно место для каждого человека.

Известно, что в этом кинотеатре чем меньше номер места, тем лучше виден экран. У \(i\)-го человека уровень зрения \(a_i\). Обозначим за \(s_i\) номер места \(i\)-го человека. Необходимо выдать место лучше тем, у кого зрение хуже, то есть для любых двух людей \(i\), \(j\) таких, что \(a_i < a_j\), должно выполняться условие \(s_i < s_j\).

После того, как вы определите места всем людям, они начнут их занимать. В порядке от \(1\) до \(nm\) каждый человек входит в зал и садится на своё место. Чтобы сесть, человек подходит к своему ряду и начинает двигаться от первого места в ряду к своему слева направо. Во время того, как человек будет занимать свое место, какие-то места будут свободны, какие-то будут заняты теми людьми, которые уже вошли в зал. Неудобство человека равно количеству занятых мест, мимо которых он прошёл, пока занимал своё место.

Рассмотрим пример: \(m = 5\), человеку определено место \(4\) в первом ряду, причём места \(1\), \(3\), \(5\) в первом ряду уже заняты, а места \(2\) и \(4\) свободны. Неудобство этого человека будет равно \(2\), потому что он пройдет мимо двух занятых мест: \(1\) и \(3\).

Найдите минимальное общее неудобство (сумму неудобств всех людей), которое можно получить, задав места для всех людей (при этом все условия должны быть выполнены).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 300\)) — количество рядов и мест в каждом ряду кинотеатра соответственно.

Следующая строка содержит \(n \cdot m\) целых чисел \(a_1, a_2, \ldots, a_{n \cdot m}\) (\(1 \le a_i \le 10^9\)), где \(a_i\) — уровень зрения \(i\)-го человека.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора выходных данных выведите единственное целое число — минимальное общее неудобство, которое можно получить.

Примечание

В первом наборе входных данных существует единственный способ рассадить людей: первого человека посадить на первое место, а второго — на второе. Тогда суммарное неудобство будет равно \(1\).

Во втором наборе входных данных оптимальная рассадка выглядит следующим образом:

В третьем наборе входных данных оптимальная рассадка выглядит следующим образом:

Число в клетке обозначает индекс человека, занимающего это место.

F. Движение точек

дп жадные алгоритмы реализация сортировки Структуры данных *2600

На числовой прямой даны \(n\) точек и \(m\) отрезков. Изначальная координата \(i\)-й точки равна \(a_i\). Левая и правая границы \(j\)-го отрезка это \(l_j\) и \(r_j\), соответственно.

Точки можно двигать. За одну операцию можно подвинуть любую точку из ее текущей координаты \(x\) в координату \(x - 1\) или в координату \(x + 1\). Стоимость такого движения \(1\).

Необходимо выполнить последовательность операций такую, чтобы каждый отрезок был посещён хотя бы одной точкой. Точка посетила отрезок \([l, r]\), если был такой момент, когда её координата принадлежала отрезку \([l, r]\) (включая границы).

Вы должны найти минимальную стоимость операций, которые нужно сделать, чтобы все отрезки были посещены.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество точек и отрезков соответственно.

Следующая строка содержит \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)) — изначальные координаты точек.

Каждая из следующих \(m\) строк содержит два целых числа \(l_j\) и \(r_j\) (\(-10^9 \le l_j \le r_j \le 10^9\)) — левая и правая границы \(j\)-го отрезка соответственно.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — минимальную суммарную стоимость всех перемещений, чтобы посетить все отрезки.

Примечание

В первом наборе входных данных точки можно двигать следующим образом:

  • Подвинуть вторую точку из координаты \(6\) в координату \(5\).
  • Подвинуть третью точку из координаты \(14\) в координату \(13\).
  • Подвинуть четвёртую точку из координаты \(18\) в координату \(17\).
  • Подвинуть третью точку из координаты \(13\) в координату \(12\).
  • Подвинуть четвёртую точку из координаты \(17\) в координату \(16\).

Суммарная стоимость всех действий равна \(5\). Легко заметить, что все отрезки будут посещены после таких перемещений. Например, десятый отрезок (\([7, 13]\)) будет посещён после второго перемещения третьей точкой.

Ниже рисунок, иллюстрирующий первый набор входных данных:

G. Четыре вершины

графы жадные алгоритмы Конструктив кратчайшие пути реализация Структуры данных *3100

Дан неориентированный взвешенный граф, состоящий из \(n\) вершин и \(m\) рёбер.

На этом графе осуществляются запросы:

  • Удалить из графа существующее ребро.
  • Добавить в граф ещё не существующее в нём ребро.

В самом начале и после каждого запроса вам необходимо найти четыре различные вершины \(a\), \(b\), \(c\), \(d\) такие, что существует путь между \(a\) и \(b\), существует путь между \(c\) и \(d\) и сумма длин двух кратчайших путей из \(a\) в \(b\) и из \(c\) в \(d\) минимальна. Ответ на запрос — это сумма длин этих двух кратчайших путей. Длина пути равна сумме весов рёбер на этом пути.

Входные данные

В первой строке находится два целых числа \(n\) и \(m\) \((4 \le n, m \le 10^5)\) — количество вершин и рёбер в графе соответственно.

Каждая из следующих \(m\) строк содержит три целых числа \(v\), \(u\), \(w\) (\(1 \le v, u \le n, v \neq u\), \(1 \le w \le 10^9\)) — это означает, что существует ребро между вершинами \(v\) и \(u\) с весом \(w\).

Следующая строка содержит одно целое число \(q\) \((0 \le q \le 10^5)\) — количество запросов.

Следующие \(q\) строк содержат запросы двух типов:

  • \(0\) \(v\) \(u\) — такой запрос означает удаление ребра между вершинами \(v\) и \(u\) \((1 \le v, u \le n, v \neq u)\). Гарантируется, что такое ребро существует в графе.
  • \(1\) \(v\) \(u\) \(w\) — такой запрос означает добавление ребра между вершинами \(v\) и \(u\) весом \(w\) (\(1 \le v, u \le n, v \neq u\), \(1 \le w \le 10^9\)). Гарантируется, что такого ребра не было в графе.

Гарантируется, что изначальный граф не содержит кратных рёбер.

В самом начале и после каждого запроса граф не обязательно связный.

Гарантируется, что в любой момент количество рёбер в графе не будет меньше \(4\). Можно доказать, что в любой момент существуют четыре различные вершины \(a\), \(b\), \(c\), \(d\) такие, что существует путь между вершинами \(a\) и \(b\), и существует путь между вершинами \(c\) и \(d\).

Выходные данные

Выведите \(q + 1\) целое число — минимальную сумму длин кратчайших путей для выбранных пар вершин до всех запросов и после каждого из них.

Примечание

До всех запросов можно выбрать вершины \((a, b) = (3, 2)\) и \((c, d) = (1, 4)\). Сумма длин двух кратчайших путей равна \(3 + 1 = 4\).

После первого запроса можно выбрать вершины \((a, b) = (2, 5)\) и \((c, d) = (1, 4)\). Сумма длин двух кратчайших путей равна \(2 + 1 = 3\).

После второго запроса можно выбрать вершины \((a, b) = (3, 4)\) и \((c, d) = (2, 5)\). Сумма длин двух кратчайших путей равна \(1 + 2 = 3\).

После третьего запроса можно выбрать вершины \((a, b) = (2, 6)\) и \((c, d) = (4, 5)\). Сумма длин двух кратчайших путей равна \(4 + 3 = 7\).

После последнего запроса можно выбрать вершины \((a, b) = (1, 6)\) и \((c, d) = (2, 5)\). Сумма длин двух кратчайших путей равна \(3 + 2 = 5\).

A. Доска с домино

реализация Строки *800

У Алисы есть клеточная доска из \(2\) рядов и \(n\) столбцов. Она полностью покрыла доску с помощью \(n\) доминошек размера \(1 \times 2\) — Алиса могла класть их как вертикально, так и горизонтально, и каждая клетка доски была покрыта ровно одной доминошкой.

Теперь Алиса решила показать одну из строк Бобу. Помогите Бобу и определите, как может выглядеть другая строка доски!

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 5000\)) — количество наборов входных данных. Далее следуют сами наборы.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \leq n \leq 100\)) — ширина доски.

Во второй строке каждого набора задана строка \(s\), состоящая из \(n\) букв, каждая буква — это L, R, U или D, описывающих левую, правую, верхнюю или нижнюю половину доминошки, соответственно (изучите примечания для лучшего понимания). Данная строка описывает одну из строк доски.

Дополнительное ограничение: каждый набор входных данных соответствует хотя бы одному допустимому покрытию доски доминошками.

Выходные данные

Для каждого набора входных данных выведите одну строку — возможную другую строку доски, используя такой же формат строки, как и во входных данных. Если существует несколько ответов, выведите любой из них.

Примечание

В первом наборе входных данных Алиса показывает Бобу верхнюю строку. Вся доска может выглядеть следующим образом:

Во втором наборе Алиса показывает Бобу нижнюю строку. Вся доска может выглядеть следующим образом:

В третьем наборе Алиса показывает Бобу нижнюю строку. Вся доска может выглядеть следующим образом:

В четвертом наборе входных данных Алиса показывает Бобу верхнюю строку. Вся доска может выглядеть следующим образом:

D. Своеобразная система счисления

жадные алгоритмы Конструктив математика реализация *2000

Боб выписал на доске \(n\) положительных целых чисел в десятичной системе счисления с суммой \(s\) (то есть по основанию \(10\)). Алиса увидела числа на доске, но по ошибке интерпретировала числа как записанные по основанию \(11\) и сложила их (по основанию \(11\)).

Какие числа должен был написать Боб, чтобы сумма, полученная Алисой, была максимально возможной?

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют сами наборы.

В единственной строке каждого набора заданы два целых числа \(s\) и \(n\) (\(1 \leq s \leq 10^9\); \(1 \leq n \leq \min(100, s)\)) — сумма и количество чисел на доске, соответственно. Числа \(s\) и \(n\) заданы в десятичной системе счисления (по основанию \(10\)).

Выходные данные

Для каждого набора данных выведите \(n\) положительных целых чисел — числа, которые должен написать Боб, чтобы полученная Алисой сумма была максимально возможной. Если есть несколько ответов, выведите любой из них.

Примечание

В первом наборе, \(70_{10} + 27_{10} = 97_{10}\), а у Алисы получится сумма \(\)70_{11} + 27_{11} = 97_{11} = 9 \cdot 11 + 7 = 106_{10}.\(\) (Здесь \(x_b\) обозначает число \(x\) по основанию \(b\).) Можно показать, что для Алисы невозможно получить сумму больше, чем \(106_{10}\).

Во втором наборе, Боб выписывает только одно число, поэтому он может выписать только \(17\).

В третьем примере, \(3_{10} + 4_{10} + 100_{10} + 4_{10} = 111_{10}\), а у Алисы получится сумма \(\)3_{11} + 4_{11} + 100_{11} + 4_{11} = 110_{11} = 1 \cdot 11^2 + 1 \cdot 11 = 132_{10}.\(\) Можно показать, что для Алисы невозможно получить сумму более \(132_{10}\).

F. Непереводимое название

2-sat графы Конструктив поиск в глубину и подобное реализация снм *2700

У Алисы есть пустое поле из \(n\) строк и \(m\) столбцов. Некоторые клетки этого поля помечены, и ни одна помеченная клетка не касается края поля. (Две клетки считаются соседними, если они касаются по стороне.)

Алиса хочет записать в каждую клетку число так, чтобы они удовлетворяли следующим условиям:

  • в каждой непомеченной клетке записано либо \(1\), либо \(4\);
  • в каждой помеченной клетке записана сумма чисел всех соседних непомеченных клеток (если у помеченной вершины нет соседних непомеченных, то сумма равна \(0\));
  • в каждой помеченной клетке записанное число делится на \(5\).
Не придумав ничего, Алиса решила попросить помощи у Боба. Помогите Бобу найти любое подходящее заполнение поля, или определить, что такого поля не существует.
Входные данные

В первой строке заданы два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 500\)) — количество строк и столбцов поля, соответственно.

Далее следуют \(n\) строк, каждая состоит из \(m\) символов. Каждый символ — это «.» или «X» — непомеченная или помеченная клетка, соответственно. Ни одна помеченная клетка не касается краев поля.

Выходные данные

Выведите «NO», если не существует подходящего заполнения. В противном случае выведите «YES». Далее выведите \(n\) строк по \(m\) целых чисел через пробел — числа в клетках поля.

Примечание

Можно показать, что во втором примере не существует подходящего заполнения.

A. Сбалансированная подстрока

реализация *800

Дана строка \(s\), состоящая из \(n\) букв, каждая буква — либо 'a', либо 'b'. Буквы в строке пронумерованы от \(1\) до \(n\).

\(s[l; r]\) — это подстрока подряд идущих букв с позиции \(l\) до позиции \(r\) строки включительно.

Строка называется сбалансированной, если количество букв 'a' в ней равно количеству букв 'b'. Например, строки «baba» и «aabbab» сбалансированные, а строки «aaab» и «b» — нет.

Найдите любую непустую сбалансированную подстроку \(s[l; r]\) строки \(s\). Выведите ее \(l\) и \(r\) (\(1 \le l \le r \le n\)). Если таких подстрок нет, то выведите \(-1\) \(-1\).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следуют описания \(t\) наборов входных данных.

В первой строке набора входных данных записано одно целое число \(n\) (\(1 \le n \le 50\)) — длина строки.

Во второй строке набора входных данных записана строка \(s\), состоящая из \(n\) букв, каждая буква — либо 'a', либо 'b'.

Выходные данные

На каждый набор входных данных выведите два целых числа. Если существует непустая сбалансированная подстрока \(s[l; r]\), то выведите \(l\) \(r\) (\(1 \le l \le r \le n\)). В противном случае выведите \(-1\) \(-1\).

Примечание

В первом наборе входных данных нет непустых сбалансированных подстрок.

Во втором и в третьем наборах входных данных есть несколько сбалансированных подстрок, включая всю строку «abbaba» и подстроку «baba».

D. Неудачные пары

Бинарный поиск реализация сортировки Структуры данных *1900

Есть город, который можно представить как квадрат на плоскости с концами в координатах \((0, 0)\) и \((10^6, 10^6)\).

В городе есть \(n\) вертикальных и \(m\) горизонтальных улиц, которые пересекают весь город, т. е. \(i\)-я вертикальная улица проходит от \((x_i, 0)\) до \((x_i, 10^6)\), а \(j\)-я горизонтальная улица проходит от \((0, y_j)\) до \((10^6, y_j)\).

Все улицы двухсторонние. Границы города также являются улицами.

В городе на некоторых улицах стоят \(k\) человек: \(p\)-й человек стоит в точке \((x_p, y_p)\) (таким образом, либо \(x_p\) равняется некоторому \(x_i\), либо \(y_p\) равняется некоторому \(y_j\), либо и то и другое).

Назовем пару человек неудачной парой, если кратчайший путь от одного человека до другого, если двигаться только по улицам, строго больше чем Манхеттенское расстояние между ними.

Посчитайте общее количество неудачных пар (пары \((x, y)\) и \((y, x)\) — это одна и та же пара).

Напомним, что Манхеттенское расстояние между точками \((x_1, y_1)\) и \((x_2, y_2)\) равно \(|x_1 - x_2| + |y_1 - y_2|\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора заданы три целых числа \(n\), \(m\) и \(k\) (\(2 \le n, m \le 2 \cdot 10^5\); \(2 \le k \le 3 \cdot 10^5\)) — количество вертикальных и горизонтальных улиц и количество человек.

Во второй строке каждого набора заданы \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(0 = x_1 < x_2 < \dots < x_{n - 1} < x_n = 10^6\)) — \(x\)-координаты вертикальных улиц.

В третьей строке заданы \(m\) целых чисел \(y_1, y_2, \dots, y_m\) (\(0 = y_1 < y_2 < \dots < y_{m - 1} < y_m = 10^6\)) — \(y\)-координаты горизонтальных улиц.

В следующих \(k\) строках заданы описания людей. В \(p\)-й строке заданы два целых числа \(x_p\) и \(y_p\) (\(0 \le x_p, y_p \le 10^6\); \(x_p \in \{x_1, \dots, x_n\}\) или \(y_p \in \{y_1, \dots, y_m\}\)) — координаты \(p\)-го человека. Все координаты различны.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\), сумма \(m\) не превосходит \(2 \cdot 10^5\) и сумма \(k\) не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, выведите общее количество неудачных пар людей.

Примечание

Изображение второго набора входных данных представлено ниже:

Для примера, точки \(3\) и \(4\) образуют неудачную пару, потому что кратчайший путь между ними (отмечен красным и равен \(7\)) больше, чем их Манхеттенское расстояние (равное \(5\)).

Точки \(3\) и \(5\) также образуют неудачную пару: кратчайший путь равен \(1000001\) (отмечен зеленым) больше, чем Манхеттенское расстояние равное \(999999\).

Однако, точки \(5\) и \(9\) не образуют неудачную пару, потому что кратчайший путь (отмечен фиолетовым) равен их Манхеттенскому расстоянию.

E. Восстановление турнирной таблицы

meet-in-the-middle битмаски Перебор реализация хэши *2600

\(2^k\) команд участвуют в плей-офф турнире. Турнир состоит из \(2^k - 1\) игры. Они проводятся следующим образом: во-первых, команды делятся на пары: команда \(1\) играет против команды \(2\), команда \(3\) играет против команды \(4\) (именно в таком порядке) и так далее (таким образом, в этой фазе будет сыграно \(2^{k-1}\) игры). Когда команда проигрывает игру, она выбывает, и каждая игра приводит к выбыванию одной команды (нет ничьих). После этого остается \(2^{k-1}\) команд. Если остается только одна команда, она объявляется чемпионом; в противном случае играется еще \(2^{k-2}\) игр: в первой из них победитель игры «\(1\) против \(2\)» играет против победителя игры «\(3\) против \(4\)», затем победитель игры «\(5\) против \(6\)» играет против победителя игры «\(7\) против \(8\)» и так далее. Этот процесс повторяется до тех пор, пока не останется только одна команда.

Место команды в турнире зависит от того, в какой фазе турнира она выбыла:

  • команда-победитель турнира занимает место \(1\);
  • команда, выбывшая в финале, занимает место \(2\);
  • обе команды, выбывшие в полуфинале, занимают место \(3\);
  • все команды, выбывшие в четвертьфинале, занимают место \(5\);
  • все команды, выбывшие в 1/8 финала, занимают место \(9\), и так далее.

Например, на этой картинке показан возможный ход турнира при \(k = 3\), а также итоговые места команд при таком ходе турнира:

После окончания турнира, который проходил по этим правилам, его результаты были закодированы следующим образом. Пусть \(p_i\) — место, которое заняла \(i\)-я команда. Хэш турнира \(h\) считается по формуле \(h = (\sum \limits_{i=1}^{2^k} i \cdot A^{p_i}) \bmod 998244353\), где \(A\) — некоторое заданное целое число.

К сожалению, из-за сбоя системы почти вся информация о прошедшем турнире была утеряна. Остались только значения \(k\), \(A\) и \(h\). Вам нужно по этим трем числам восстановить, какое место заняла какая команда (если это вообще возможно).

Входные данные

В единственной строке заданы три числа \(k\), \(A\) и \(h\) (\(1 \le k \le 5\); \(100 \le A \le 10^8\); \(0 \le h \le 998244352\)).

Выходные данные

Если распределения команд по местам, удовлетворяющего всем требованиям, не существует, выведите \(-1\).

Иначе выведите \(2^k\) чисел, \(i\)-е из которых должно быть равно \(p_i\) (месту, занятому \(i\)-й командой). Обратите внимание: ваш ответ должен быть корректным вариантом результатов турнира, проводимого по описанным правилам; кроме того, структура турнира является фиксированной (например, команды \(1\) и \(2\) всегда играют между собой в первой фазе турнира). Если существует несколько способов восстановить места, занятые командами, выведите любой из них.

Примечание

Турнир из первого примера описан на картинке в условии.

Для третьего примера, если выбрать расстановку команд по местам \([1, 2, 3, 3]\) (команда \(1\) занимает место \(1\), команда \(2\) занимает место \(2\), команды \(3\) и \(4\) занимают место \(3\)), можно получить хэш турнира, равный \(7020100\) (при \(A = 100\)). Однако такое распределение мест не может быть результатом турнира, потому что команды \(1\) и \(2\) обязательно должны играть друг с другом в полуфинале, поэтому они не могут занять два первых места.

C. Рифма

*особая задача реализация *1800

Скажем, что две строки \(s\) и \(t\) рифмуются, если обе строки имеют длину хотя бы \(k\), и их \(k\) последних букв равны. Например, для \(k = 3\) строки abcd и cebcd рифмуются, строки ab и ab не рифмуются, строки aaaa и aaaaa рифмуются, а строки abcd и abce — нет.

Вам задано \(n\) пар строк \((s_i, t_i)\). Для каждой пары известно, должны ли строки рифмоваться или не должны.

Определите все возможные неотрицательные целые значения \(k\), для которых пары, которые должны рифмоваться, рифмуются, а пары, которые не должны рифмоваться, не рифмуются.

Входные данные

Во входных данных заданы несколько наборов входных данных. В первой строке задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют сами наборы входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество пар строк.

В следующих \(n\) строках заданы описания пар — по одной паре в строке. В \(i\)-й строке заданы строки \(s_i\) и \(t_i\) и метка \(r_i\) через пробел. Строки непустые, состоят только из строчных букв латинского алфавита и длины строк не превосходят \(2 \cdot 10^5\). Метка \(r_i\) равна \(1\), если строки должны рифмоваться, или \(0\), если они не должны рифмоваться.

Гарантируется, что в каждом наборе входных данных есть хотя бы одна пара с \(r_i\) равным \(1\) и что суммарная длина строк по всем наборам входных данных не превосходит \(4 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, сначала выведите целое число \(m\) — количество возможных неотрицательных целых значений \(k\) таких, что пары, которые должны рифмоваться, рифмуются, а пары, которые не должны рифмоваться, не рифмуются. Далее выведите все данные значения \(k\) (без повторений). Вы можете выводить их в любом порядке.

Примечание

В первом наборе входных данных, если \(k\) будет хотя бы \(1\), то kotlin и heroes не будут рифмоваться.

Во втором наборе, для \(k = 2\) join и kotlin рифмуются, и episode и eight не рифмуются.

D. Лотерея

*особая задача Конструктив математика Перебор реализация *1800

Соревнование Kotlin Heroes близится к завершению. В этот раз в соревновании участвовало \(n\) программистов. И теперь организаторы думают над тем, как развлечь еще и зрителей. Один из возможных вариантов — устроить лотерею. Но для начала нужно провести опрос среди зрителей.

В общем, организаторы опросили \(m\) зрителей, каждому задали два вопроса:

  1. Кто займет первое место?
  2. Кто займет последнее место?

Получив все ответы, организаторы присвоили всем зрителям места на основании того, скольких программистов они угадали. Предположим, что \(c_2\) зрителей правильно угадали и первое и последнее место, \(c_1\) зрителей угадали только первое или только последнее место, и \(c_0\) зрителей не угадали никого. Тогда все \(c_2\) зрителей получат \(1\)-е место, все зрители с одним правильным местом получат место \(c_2 + 1\), а все остальные — место \(c_2 + c_1 + 1\).

Вы были одним из опрашиваемых зрителей. Кроме того, как один из организаторов, вы можете смотреть результаты опроса, но не результаты соревнования. Определите, какое наихудшее место вы можете занять согласно системе ранжирования организаторов?

Входные данные

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 1000\); \(1 \le m \le 2 \cdot 10^5\)) — количество программистов, участвовавших в соревновании, и количество опрошенных зрителей.

В следующих \(m\) строках заданы ответы зрителей. В \(i\)-й строке заданы два целых числа \(f_i\) и \(l_i\) (\(1 \le f_i, l_i \le n\); \(f_i \ne l_i\)) — индексы программистов, кто займет первое и последнее места по мнению \(i\)-го зрителя.

Для простоты, ваш ответ всегда первый, то есть ваш ответ — это \(f_1\) и \(l_1\).

Выходные данные

Выведите одно целое число — худшее место, которое вы можете получить согласно системе ранжирования организаторов (чем больше место, тем хуже).

Примечание

В первом примере, если второй программист займет первое место, а первый программист — последнее, то у вас будет \(0\) правильных ответов в то время, как у других двух зрителей — \(2\) правильных ответа. А потому ваше место (в худшем случае) будет равно \(c_2 + c_1 + 1\) \(=\) \(2 + 0 + 1 = 3\).

Во втором примере, если, например, третий программист займет первое место, а второй программист — последнее место, то у вас будет \(1\) правильный ответ. У зрителей \(2\), \(4\) и \(5\) будет \(2\) правильных ответа, у зрителя \(6\) — \(1\) правильный ответ, и у зрителя \(3\) — \(0\) правильных ответов. В результате ваше место будет равно \(c_2 + 1\) \(=\) \(3 + 1 = 4\). (Заметим, что у зрителя \(6\) также будет место \(4\)).

A. Книга

Бинарный поиск графы дп Перебор реализация сортировки Структуры данных *1800

У вас есть книга, в которой \(n\) глав.

В начале каждой главы перечислен список других глав, которые нужно понимать для понимания написанного в этой главе. Чтобы понять главу, нужно прочитать эту главу после того, как вы поняли все главы из данного списка.

Сейчас ни одна глава книги не понятна вам. Вы планируете читать книгу с начала до конца по кругу до тех пор, пока не поймете все главы. Обратите внимание, что если вы читаете некоторую главу, но еще не понимаете какие-то из необходимых для ее понимания глав, то вы не можете понять эту главу.

Определите, сколько раз вам нужно будет прочитать всю книгу, чтобы понять все главы, или определите, что есть главы, которые вы никогда не поймете, сколько бы раз вы не прочитали книгу.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 2\cdot10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит \(n\) (\(1 \le n \le 2\cdot10^5\)) — количество глав.

Далее следуют \(n\) строк. \(i\)-я из этих строк начинается с целого числа \(k_i\) (\(0 \le k_i \le n-1\)) — количества глав, которые требуется понимать для понимания \(i\)-й главы. Далее следуют \(k_i\) целых чисел \(a_{i,1}, a_{i,2}, \dots, a_{i, k_i}\) (\(1 \le a_{i, j} \le n, a_{i, j} \ne i, a_{i, j} \ne a_{i, l}\) для \(j \ne l\)) — главы, которые нужно понимать для понимания \(i\)-й главы.

Гарантируется, что сумма значений \(n\) и сумма значений \(k_i\) по всем наборам входных данных не превосходят \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных, если вы можете понять все главы, выведите, сколько раз вам нужно прочитать книгу целиком, иначе выведите \(-1\).

Примечание

В первом примере с первого прочтения вы поймете главы \(\{2, 4\}\), а со второго — главы \(\{1, 3\}\).

Во втором примере для понимания любой главы нужно сначала понимать какую-то другую, поэтому невозможно понять всю книгу.

В третьем примере для понимания любой главы нужно понимать только более ранние, поэтому можно понять всю книгу за одно прочтение.

В четвертом примере вы поймете главы \(\{2, 3, 4\}\) с первого прочтения, и главу \(1\) со второго.

В пятом примере вы будем понимать главы по одной за прочтение, с \(5\)-й по \(1\)-ю.

D. Самый сильный билд

Бинарный поиск графы жадные алгоритмы Перебор поиск в глубину и подобное реализация Структуры данных хэши *2000

Иван играет в очередную roguelike компьютерную игру. В игре он управляет одним героем. У героя есть \(n\) слотов для экипировки предметов. Для \(i\)-го слота есть список из \(c_i\) предметов, \(j\)-й из них увеличивает силу героя на \(a_{i,j}\). Предметы для каждого из слотов попарно различные и упорядочены по возрастанию увеличения силы. То есть, \(a_{i,1} < a_{i,2} < \dots < a_{i,c_i}\).

В каждый слот Иван выбирает ровно один предмет. Пусть в \(i\)-й слот он выбрал \(b_i\)-й предмет из соответствующего списка. Последовательность выборов \([b_1, b_2, \dots, b_n]\) называется билдом.

Сила билда — это сумма увеличений силы предметов в нем. Некоторые билды в игре запрещены. Задан список из \(m\) попарно различных запрещенных билдов. Гарантируется, что хотя бы один билд не запрещен.

Какой билд среди не запрещенных в игре имеет максимальную силу? Если есть несколько билдов с максимальной силой, выведите любой из них.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 10\)) — количество слотов экипировки.

В \(i\)-й из следующих \(n\) строк содержится описание предметов для \(i\)-го слота. Сначала одно целое число \(c_i\) (\(1 \le c_i \le 2 \cdot 10^5\)) — количество предметов для \(i\)-го слота. Затем \(c_i\) целых чисел \(a_{i,1}, a_{i,2}, \dots, a_{i,c_i}\) (\(1 \le a_{i,1} < a_{i,2} < \dots < a_{i,c_i} \le 10^8\)).

Сумма \(c_i\) не превосходит \(2 \cdot 10^5\).

В следующей строке записано одно целое число \(m\) (\(0 \le m \le 10^5\)) — количество запрещенных билдов.

В каждой из следующих \(m\) строк содержится описание запрещенного билда — последовательность из \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le c_i\)).

Билды попарно различные, и существует хотя бы один не запрещенный билд.

Выходные данные

Выведите билд с максимальной силой среди не запрещенных в игре. Если есть несколько билдов с максимальной силой, выведите любой из них.

E. Раскраска

Комбинаторика Конструктив математика реализация *2500

Матрица размера \(n \times m\), состоящая только из цифр \(0\) или \(1\) считается красивой, если сумма в каждой подматрице размера \(2 \times 2\) ровно \(2\), т. е. каждый «квадрат» размера \(2 \times 2\) содержит ровно две цифры \(1\) и две цифры \(0\).

Вам задана матрица размера \(n \times m\). Изначально все ячейки матрицы пусты. Обозначим ячейку стоящую на пересечении \(x\)-й строки \(y\)-го столбца как \((x, y)\). Вам нужно обрабатывать запросы трех типов:

  • \(x\) \(y\) \(-1\) — сделать ячейку \((x, y)\) пустой;
  • \(x\) \(y\) \(0\) — записать цифру \(0\) в ячейку \((x, y)\), это перезапишет то, что там было;
  • \(x\) \(y\) \(1\) — записать цифру \(1\) в ячейку \((x, y)\), это перезапишет то, что там было.

После каждого запроса выведите количество способов заполнить пустые ячейки матрицы так, чтобы матрица была красивой. Так как это значение может быть слишком велико, выведите его по модулю \(998244353\).

Входные данные

Первая строка содержит три числа \(n\), \(m\) и \(k\) (\(2 \le n, m \le 10^6\); \(1 \le k \le 3 \cdot 10^5\)) — количество строк матрицы, количество столбцов и количество запросов соответственно.

Следующие \(k\) строк содержат описания запросов. \(i\)-я строка содержит три числа \(x_i\), \(y_i\), \(t_i\) (\(1 \le x_i \le n\); \(1 \le y_i \le m\); \(-1 \le t_i \le 1\)) — параметры \(i\)-го запроса.

Выходные данные

После каждого запроса выведите число — количество способов заполнить пустые ячейки матрицы так, чтобы матрица была красивой по модулю \(998244353\).

J. Jeopardy of Dropped Balls

Бинарный поиск Перебор реализация снм *1500

Mr. Chanek has a new game called Dropping Balls. Initially, Mr. Chanek has a grid \(a\) of size \(n \times m\)

Each cell \((x,y)\) contains an integer \(a_{x,y}\) denoting the direction of how the ball will move.

  • \(a_{x,y}=1\) — the ball will move to the right (the next cell is \((x, y + 1)\));
  • \(a_{x,y}=2\) — the ball will move to the bottom (the next cell is \((x + 1, y)\));
  • \(a_{x,y}=3\) — the ball will move to the left (the next cell is \((x, y - 1)\)).

Every time a ball leaves a cell \((x,y)\), the integer \(a_{x,y}\) will change to \(2\). Mr. Chanek will drop \(k\) balls sequentially, each starting from the first row, and on the \(c_1, c_2, \dots, c_k\)-th (\(1 \leq c_i \leq m\)) columns.

Determine in which column each ball will end up in (position of the ball after leaving the grid).

Input

The first line contains three integers \(n\), \(m\), and \(k\) (\(1 \leq n, m \leq 1000\), \(1 \leq k \leq 10^5\)) — the size of the grid and the number of balls dropped by Mr. Chanek.

The \(i\)-th of the next \(n\) lines contains \(m\) integers \(a_{i,1},a_{i,2},\ldots,a_{i,m}\) (\(1 \leq a_{i,j} \leq 3\)). It will satisfy \(a_{i, 1} \ne 3\) and \(a_{i, m} \ne 1\).

The next line contains \(k\) integers \(c_1, c_2, \ldots, c_k\) (\(1 \leq c_i \leq m\)) — the balls' column positions dropped by Mr. Chanek sequentially.

Output

Output \(k\) integers — the \(i\)-th integer denoting the column where the \(i\)-th ball will end.

Note

In the first example, the first ball will drop as follows. Note that the cell \((1, 1)\) will change direction to the bottom direction.

The second and third balls will drop as follows.

All balls will be dropped from the first row and on the \(c_1, c_2, \dots, c_k\)-th columns respectively. A ball will stop dropping once it leaves the grid.

K. Knitting Batik

математика реализация *2200

Mr. Chanek wants to knit a batik, a traditional cloth from Indonesia. The cloth forms a grid \(a\) with size \(n \times m\). There are \(k\) colors, and each cell in the grid can be one of the \(k\) colors.

Define a sub-rectangle as an ordered pair of two cells \(((x_1, y_1), (x_2, y_2))\), denoting the top-left cell and bottom-right cell (inclusively) of a sub-rectangle in \(a\). Two sub-rectangles \(((x_1, y_1), (x_2, y_2))\) and \(((x_3, y_3), (x_4, y_4))\) have the same pattern if and only if the following holds:

  • they have the same width (\(x_2 - x_1 = x_4 - x_3\));
  • they have the same height (\(y_2 - y_1 = y_4 - y_3\));
  • for every pair \((i, j)\) where \(0 \leq i \leq x_2 - x_1\) and \(0 \leq j \leq y_2 - y_1\), the color of cells \((x_1 + i, y_1 + j)\) and \((x_3 + i, y_3 + j)\) are equal.

Count the number of possible batik color combinations, such that the subrectangles \(((a_x, a_y),(a_x + r - 1, a_y + c - 1))\) and \(((b_x, b_y),(b_x + r - 1, b_y + c - 1))\) have the same pattern.

Output the answer modulo \(10^9 + 7\).

Input

The first line contains five integers \(n\), \(m\), \(k\), \(r\), and \(c\) (\(1 \leq n, m \leq 10^9\), \(1 \leq k \leq 10^9\), \(1 \leq r \leq \min(10^6, n)\), \(1 \leq c \leq \min(10^6, m)\)) — the size of the batik, the number of colors, and size of the sub-rectangle.

The second line contains four integers \(a_x\), \(a_y\), \(b_x\), and \(b_y\) (\(1 \leq a_x, b_x \leq n\), \(1 \leq a_y, b_y \leq m\)) — the top-left corners of the first and second sub-rectangle. Both of the sub-rectangles given are inside the grid (\(1 \leq a_x + r - 1\), \(b_x + r - 1 \leq n\), \(1 \leq a_y + c - 1\), \(b_y + c - 1 \leq m\)).

Output

Output an integer denoting the number of possible batik color combinations modulo \(10^9 + 7\).

Note

The following are all \(32\) possible color combinations in the first example.

E. Easy Scheduling

математика реализация *1200

Eonathan Eostar decided to learn the magic of multiprocessor systems. He has a full binary tree of tasks with height \(h\). In the beginning, there is only one ready task in the tree — the task in the root. At each moment of time, \(p\) processes choose at most \(p\) ready tasks and perform them. After that, tasks whose parents were performed become ready for the next moment of time. Once the task becomes ready, it stays ready until it is performed.

You shall calculate the smallest number of time moments the system needs to perform all the tasks.

Input

The first line of the input contains the number of tests \(t\) (\(1 \leq t \leq 5\cdot 10^5\)). Each of the next \(t\) lines contains the description of a test. A test is described by two integers \(h\) (\(1 \leq h \leq 50\)) and \(p\) (\(1 \leq p \leq 10^4\)) — the height of the full binary tree and the number of processes. It is guaranteed that all the tests are different.

Output

For each test output one integer on a separate line — the smallest number of time moments the system needs to perform all the tasks.

Note

Let us consider the second test from the sample input. There is a full binary tree of height \(3\) and there are two processes. At the first moment of time, there is only one ready task, \(1\), and \(p_1\) performs it. At the second moment of time, there are two ready tasks, \(2\) and \(3\), and the processes perform them. At the third moment of time, there are four ready tasks, \(4\), \(5\), \(6\), and \(7\), and \(p_1\) performs \(6\) and \(p_2\) performs \(5\). At the fourth moment of time, there are two ready tasks, \(4\) and \(7\), and the processes perform them. Thus, the system spends \(4\) moments of time to perform all the tasks.

H. Higher Order Functions

реализация Строки *1700

Helen studies functional programming and she is fascinated with a concept of higher order functions — functions that are taking other functions as parameters. She decides to generalize the concept of the function order and to test it on some examples.

For her study, she defines a simple grammar of types. In her grammar, a type non-terminal \(T\) is defined as one of the following grammar productions, together with \(\textrm{order}(T)\), defining an order of the corresponding type:

  • "()" is a unit type, \(\textrm{order}(\textrm{"}\texttt{()}\textrm{"}) = 0\).
  • "(" \(T\) ")" is a parenthesized type, \(\textrm{order}(\textrm{"}\texttt{(}\textrm{"}\,T\,\textrm{"}\texttt{)}\textrm{"}) = \textrm{order}(T)\).
  • \(T_1\) "->" \(T_2\) is a functional type, \(\textrm{order}(T_1\,\textrm{"}\texttt{->}\textrm{"}\,T_2) = max(\textrm{order}(T_1) + 1, \textrm{order}(T_2))\). The function constructor \(T_1\) "->" \(T_2\) is right-to-left associative, so the type "()->()->()" is the same as the type "()->(()->())" of a function returning a function, and it has an order of \(1\). While "(()->())->()" is a function that has an order-1 type "(()->())" as a parameter, and it has an order of \(2\).

Helen asks for your help in writing a program that computes an order of the given type.

Input

The single line of the input contains a string consisting of characters '(', ')', '-', and '>' that describes a type that is valid according to the grammar from the problem statement. The length of the line is at most \(10^4\) characters.

Output

Print a single integer — the order of the given type.

K. Kingdom of Islands

графы Перебор реализация *2800

The Kingdom of Islands consists of \(p\) islands. As the king, you rule over the whole kingdom, while each island is ruled over by one or several jarls under your rule. In total, there are \(n\) jarls under your jurisdiction.

Each island of the kingdom has its own strong traditions, so jarls that rule over the same island support each other and never have conflicts. The downsides of such strength are cultural conflicts between people inhabiting different islands. Thus, two jarls that rule over different islands are in conflict.

However, recent years brought a few changes to traditional relations between the jarls. To your knowledge, there are exactly \(k\) pairs of jarls such that relationships between two jarls in the pair are different from the traditional. That is, if two jarls of the pair you know rule over the same island, these jarls are in conflict. If they rule over different islands, then they overcome cultural disagreement and there is no conflict between them anymore.

As a true responsible king, you are worried about whether the kingdom is close to a major conflict. In order to estimate the current situation, you would like to find the largest possible group of jarls such that every two jarls in the group are in conflict.

Input

The first line of the input consists of two integers \(p\) and \(n\) (\(1 \le p \le n \le 10^5\); \(1 \le p \le 10^4\)).

The second line consists of \(n\) integers \(s_1, s_2, \ldots, s_n\) (\(1 \le s_i \le p\)). The integer \(s_i\) denotes that the \(i\)-th jarl rules over the island number \(s_i\). It is guaranteed that each island is ruled by at least one jarl.

The third line consists of a single integer \(k\) (\(0 \le k \le 20\)).

Then \(k\) lines follow. The \(j\)-th of these lines consists of two distinct integers \(a_j\) and \(b_j\) (\(1 \le a_j < b_j \le n\)), denoting that the relation between the \(a_j\)-th jarl and the \(b_j\)-th jarl differs from traditional. It is guaranteed that no pair of jarls appears twice in this list.

Output

In the first line print a single integer \(q\) between \(1\) and \(n\) — the largest possible number of jarls in a pairwise conflicting group. In the second line print \(q\) distinct integers between \(1\) and \(n\) — the numbers of jarls in the group. The numbers of jarls can be printed in any order.

Note

The conflict graph for the last sample testcase is given below. Each circle represents an island.

B. Сортировка сдвигами

реализация сортировки *1100

Во внешней памяти нового поколения расположен массив целых чисел \(a[1 \ldots n] = [a_1, a_2, \ldots, a_n]\).

Данный вид памяти не позволяет изменить значение произвольного элемента по его индексу. Вместо этого можно вырезать любой подотрезок данного массива, циклически сдвинуть его на произвольную величину и вставить обратно на то же самое место.

Формально, один такий циклический сдвиг состоит из двух последовательных действий:

  1. Выбрать произвольные \(l\) и \(r\) (\(1 \le l < r \le n\)) — границы изменяемого подотрезка массива.
  2. Заменить подотрезок массива \(a[l \ldots r]\) на его циклический сдвиг влево на произвольную величину \(d\). Поясним понятие циклический сдвиг: последовательность \([1, 4, 1, 3]\) является циклическим сдвигом последовательности \([3, 1, 4, 1]\) на \(1\) влево. Последовательность \([4, 1, 3, 1]\) является циклическим сдвигом последовательности \([3, 1, 4, 1]\) на \(2\) влево.

Например, если \(a = [1, \color{blue}{3, 2, 8}, 5]\), то при выборе \(l = 2\), \(r = 4\) и \(d = 2\) получается подотрезок \(a[2 \ldots 4] = [3, 2, 8]\). Затем этот отрезок сдвигается на \(d = 2\) влево, и получается подотрезок \([8, 3, 2]\), который в итоге встает на место исходных элементов отрезка. Получается \(a = [1, \color{blue}{8, 3, 2}, 5]\).

Отсортируйте заданный массив \(a\), используя не более \(n\) циклических сдвигов любых его отрезков. Обратите внимание, что вам не нужно минимизировать количество циклических сдвигов. Подойдет любой способ, который требует \(n\) или менее циклических сдвигов.

Входные данные

В первой строке записано целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

В следующих \(2t\) строках даны описания наборов входных данных.

В описании каждого набора входных данных первая строка содержит целое число \(n\) (\(2 \leq n \leq 50\)) — длину массива, а во второй строке через пробел перечислены элементы массива \(a_i\) (\(-10^9 \leq a_i \leq 10^9\)). Элементы массива \(a\) могут повторяться, то есть не обязаны быть уникальными.

Выходные данные

Выведите \(t\) ответов на все наборы входных данных.

Первая строка ответа на набор входных данных должна содержать число \(k\) (\(0 \le k \le n\)) — количество действий, которыми сортируется массив. Следующие \(k\) строк должны содержать описания действий в формате «\(l\) \(r\) \(d\)» (без кавычек), где \(l\) и \(r\) (\(1 \le l < r \le n\)) — это границы сдвигаемого отрезка, а \(d\) (\(1 \le d \le r - l\)) — величина сдвига. Напоминаем, что по условию задачи рассматриваются циклические сдвиги влево, и выбранный отрезок будет сдвинут на \(d\) влево.

Обратите внимание, что от вас не требуется найти минимальное необходимое для сортировки количество циклических сдвигов. Подойдет любой способ сортировки, количество сдвигов в котором не превосходит \(n\).

Если заданный массив \(a\) уже отсортирован, то одним из возможных ответов является \(k = 0\) и пустая последовательность циклических сдвигов.

Если возможных ответов несколько, выведите любой из них.

Примечание

Пояснение к четвертому набору данных в примере:

  1. Выбирается отрезок \(a[2 \ldots 4]\) и сдивгается на \(2\) влево: \([2, \color{blue}{5, 1, 4}, 3] \longrightarrow [2, \color{blue}{4, 5, 1}, 3]\)
  2. Выбирается отрезок \(a[1 \ldots 5]\) и сдвигается на \(3\) влево: \([\color{blue}{2, 4, 5, 1, 3}] \longrightarrow [\color{blue}{1, 3, 2, 4, 5}]\)
  3. Выбирается отрезок \(a[1 \ldots 2]\) и сдвигается на \(1\) влево: \([\color{blue}{1, 3}, 2, 4, 5] \longrightarrow [\color{blue}{3, 1}, 2, 4, 5]\)
  4. Выбирается отрезок \(a[1 \ldots 3]\) и сдвигается на \(1\) влево: \([\color{blue}{3, 1, 2}, 4, 5] \longrightarrow [\color{blue}{1, 2, 3}, 4, 5]\)

C. Галочки

жадные алгоритмы реализация *1500

У Казимира есть прямоугольный лист бумаги с клетчатым полем размера \(n \times m\). Изначально все клетки поля пустые.

Обозначим клетку с координатами \(i\) по вертикали и \(j\) по горизонтали за \((i, j)\). Тогда левая верхняя клетка будет обозначаться как \((1, 1)\), а правая нижняя — как \((n, m)\).

Казимир рисует на поле галочки разных размеров. Галочка размера \(d\) (\(d > 0\)) с вершиной в клетке \((i, j)\) рисуется следующим образом:

  1. Сначала закрашивается клетка \((i, j)\).
  2. Затем закрашиваются \(d\) клеток слева-сверху по диагонали от вершины и \(d\) клеток справа-сверху по диагонали от вершины.
  3. Итого закрашенными оказываются клетки с координатами \((i - h, j \pm h)\) для всех \(h\) от \(0\) до \(d\). В частности, галочка состоит из \(2d + 1\) закрашенных клеток.

Если повторно закрасить уже закрашенную клетку, она останется закрашенной. Снизу приведен пример поля \(4 \times 9\), на котором нарисованы две галочки размеров \(2\) и \(3\).

Вам дано описание клетчатого поля размера \(n \times m\). Казимир утверждает, что это поле получилось после того, как он нарисовал на нем сколько-то (возможно, \(0\)) галочек. Галочки могли быть разного размера, но размер каждой из них не меньше \(k\) (то есть \(d \ge k\) для всех галочек).

Проверьте, можно ли получить заданную картинку, нарисовав несколько (возможно, ноль) галочек, для каждой из которых \(d \ge k\).

Входные данные

В первой строке записано целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

В следующих строках по очереди даны описания наборов входных данных.

В описании каждого набора входных данных первая строка содержит целые числа \(n\), \(m\) и \(k\) (\(1 \le k \le n \le 10\); \(1 \le m \le 19\)) — размеры поля и минимальный размер галочек, которые рисовал Казимир. В следующих \(n\) строках описания дано описание поля: каждая строка состоит из \(m\) символов, каждый из которых равен '.', если эта клетка пустая, и '*', если закрашенная.

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите YES, если данное поле могло быть получено из пустого рисованием галочек размеров \(\ge k\), и NO в противном случае.

Вы можете выводить ответ в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

Первый набор данных из примера состоит из двух звездочек, которые не могут являться самостоятельными галочками, так как не существует галочек размера \(0\).

Второй набор данных из примера описан в условии (см. рисунок в тексте условия). Такое поле может быть получено, если нарисовать галочки размеров \(2\) и \(3\), как и показано на рисунке.

Поле в третьем наборе данных соответствует трем нарисованным галочкам размера \(1\). Их вершины ниже обозначены \(\color{blue}{\text{синим}}\), \(\color{red}{\text{красным}}\) и \(\color{green}{\text{зеленым}}\) цветами:

*.*.
*\(\color{blue}{\textbf{*}}\)**
.\(\color{green}{\textbf{*}}\color{red}{\textbf{*}}\).
....

Поле в четвертом наборе данных из примера могло быть получено рисованием двух галочек размеров \(1\) и \(2\). Их вершины отмечены ниже \(\color{blue}{\text{синим}}\) и \(\color{red}{\text{красным}}\) цветами соответственно:

.....
*...*
.*.*.
..\(\color{red}{\textbf{*}}\).*
...\(\color{blue}{\textbf{*}}\).

Поле в пятом наборе данных из примера не может быть получено, так как \(k = 2\), а последняя звездочка в четвертой сверху строке с координатами \((4, 5)\) может быть только частью галочки размера \(1\).

Поле в шестом наборе данных из примера не может быть получено, так как левая верхняя звездочка \((1, 1)\) не может быть самостоятельной галочкой, так как размеры галочек должны быть положительными, и не может быть частью галочки с вершиной в нижнем ряду, так как отделена от нее разрывом (точкой, '.') в \((2, 2)\).

В седьмом наборе данных, аналогично, поле не может быть получено, так как звездочки с координатами \((1, 2)\) (центральная верхняя), \((3, 1)\) и \((3, 3)\) (крайние нижние) не могут быть частью никаких галочек.

A. Следующий раунд

*особая задача реализация *800

«Участник выходит в следующий раунд соревнований, если он набрал не меньше баллов, чем участник, занявший k-е место, при условии, что набранное им число баллов строго положительно...» — выдержка из правил соревнований.

Всего в соревновании было n участников (n ≥ k), и вам уже известны их баллы. Определите, сколько участников выйдет в следующий раунд.

Входные данные

В первой строке входных данных записаны два целых числа n и k (1 ≤ k ≤ n ≤ 50), разделенных единичным пробелом.

Во второй строке записаны n целых чисел, разделенных единичными пробелами, a1, a2, ..., an (0 ≤ ai ≤ 100), где ai — количество баллов, набранных участником на i-ом месте. Числа в заданной последовательности не возрастают (то есть для всех i от 1 до n - 1 выполняется ai ≥ ai + 1).

Выходные данные

Выведите одно целое число — искомое количество участников, в соответствии с правилами.

Примечание

В первом примере участник на 5ом месте набрал 7 баллов. Так как участник на 6ом месте тоже набрал 7 баллов, то в следующий раунд выходят 6 участников.

Во втором примере никто не набрал положительного количества баллов.

B. Такси

*особая задача жадные алгоритмы реализация *1100

После окончания уроков n групп школьников вышли на улицу и собрались ехать домой к Поликарпу на празднование его дня рождения. Известно, что i-ая группа состоит из si друзей (1 ≤ si ≤ 4), которые не хотят расставаться по пути к Поликарпу. Решено ехать на такси. Каждая машина может вместить не более четырех пассажиров. Какое минимальное количество машин потребуется школьникам, если каждая группа должна целиком находиться в одной из машин такси (но одна машина может вмещать более чем одну группу)?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество групп школьников. Вторая строка содержит последовательность целых чисел s1, s2, ..., sn (1 ≤ si ≤ 4). Числа записаны через пробел, si — количество ребят в i-ой группе.

Выходные данные

Выведите единственное число — минимальное необходимое количество такси, чтобы отвезти всех ребят к Поликарпу.

Примечание

В первом тесте возможно следующее распределение по четырем машинам:

  • третья группа (из четырех школьников),
  • четвертая группа (из трех школьников),
  • пятая группа (из трех школьников),
  • первая и вторая группы (из одного и двух школьников соответственно).

Существуют и другие способы расположиться в четырех машинах.

C. Команды cd и pwd

*особая задача реализация Структуры данных *1400

Вася пишет оболочку для своей операционной системы. В ней непременно должны присутствовать команды для работы с директориями. Для начала он решил обойтись всего двумя командами: cd (смена текущей директории) и pwd (вывод на экран текущей директории).

Директории в операционной системе Васи образуют традиционную иерархическую древовидную структуру. Существует единственная корневая директория, обозначаемая символом слеш «/». У всех остальных директорий есть названия — непустые строки из строчных латинских букв. У каждой некорневой директории есть родительская директория — та, внутри которой она расположена. Эта директория обозначается как «..».

Команда cd принимает один параметр, являющийся путем в файловой системе. Команда меняет текущую директорию на директорию, расположенную по заданному пути. Путь состоит из названий директорий, разделённых слешами. В качестве названия директории может использоваться «..», что обозначает переход в родительскую директорию. «..» может встретиться вместо названия директории в любом месте пути, возможно, несколько раз. Если путь начинается со слеша, он считается абсолютным путём, то есть директория меняется на указанную, считая от корневой. Если параметр начинается с имени директории (или «..»), он считается относительным путём, то есть директория меняется на указанную, считая от текущей.

Команда pwd должна выводить абсолютный путь до текущей директории. Этот путь не должен содержать «..».

Изначально текущей директорией является корневая. Все директории, явно упоминаемые или проходимые косвенно внутри одной команды cd, считаются существующими. Гарантируется отсутствие попыток перехода в родительскую директорию корневой директории.

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 50) — количество команд.

Далее следуют n строк по одной команде в каждой строке. В каждой из этих строк записана либо команда pwd, либо команда cd, после которой идёт отделённый пробелом непустой параметр.

В параметре команды cd используются только строчные латинские буквы, слеши и точки, не может идти два слеша подряд, точки встречаются только как название родительской псевдо-директории. Параметр команды cd не завершается слешем, кроме случая, когда это единственный символ, указывающий на корневую директорию. Параметр команды имеет длину от 1 до 200 символов включительно.

Директории в файловой системе могут иметь одинаковые имена.

Выходные данные

Для каждой команды pwd требуется вывести полный абсолютный путь текущей директории, завершённый слешем. Он должен начинаться со слеша и содержать список директорий в порядке вложенности от корневой до текущей, разделённый слешами. Этот путь не должен содержать точек.

A. Портал

дп жадные алгоритмы Перебор реализация Структуры данных *1700

CQXYM нашел прямоугольник \(A\) размера \(n \times m\), состоящий из \(n\) строк и \(m\) столбцов. Каждый блок прямоугольника либо является обсидиановым блоком, либо пуст. За одну операцию CQXYM может заменить обсидиановый блок пустым или пустой — обсидиановым.

Прямоугольник \(M\) размера \(a \times b\) называется порталом тогда и только тогда, когда он удовлетворяет следующим условиям:

  • \(a \geq 5,b \geq 4\).
  • Для всех \(1 < x < a\), блоки \(M_{x,1}\) и \(M_{x,b}\) обсидиановые.
  • Для всех \(1 < x < b\), блоки \(M_{1,x}\) и \(M_{a,x}\) обсидиановые.
  • Для всех \(1<x<a,1<y<b\), блок \(M_{x,y}\) пустой.
  • \(M_{1, 1}, M_{1, b}, M_{a, 1}, M_{a, b}\) могут быть любого типа.

Обратите внимание, что портал имеет \(a\) строк и \(b\) столбцов (не \(b\) строк и \(a\) столбцов).

CQXYM хочет узнать, за какое минимальное число операций один из подпрямоугольников можно сделать порталом.

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(t \geq 1\)) — количество наборов входных данных.

Для каждого набора входных данных в первой строке содержатся два целых числа \(n\) и \(m\) (\(5 \le n \le 400\), \(4 \le m \le 400\)).

Далее следуют \(n\) строк по \(m\) символов \(0\) или \(1\) в каждой. Если \(j\)-й символ \(i\)-й строки равен \(0\), блок \(A_{i,j}\) пуст. В противном случае блок \(A_{i,j}\) обсидиановый.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(400\).

Гарантируется, что сумма \(m\) по всем наборам входных данных не превосходит \(400\).

Выходные данные

Выведите \(t\) ответов, по одному на строке.

Примечание

В первом тестовом случае портал в итоге выглядит следующим образом:


1110
1001
1001
1001
0111

C. Техническое обслуживание поездов

Перебор реализация Структуры данных *2200

Кавасиро Нитори — талантливый инженер. Поэтому ее назначили ответственной по обслуживанию поездов.

Всего существуют \(n\) моделей поездов, и в депо, в котором работает Нитори, в любой момент времени будет не более одного поезда каждой модели. Изначально в депо нет поездов, и в каждый из следующих \(m\) дней либо один поезд будет добавлен в депо, либо один поезд будет убран из депо. Когда добавляется поезд \(i\)-й модели в день \(t\), он будет работать \(x_i\) дней (включая день \(t\)), затем будет на ремонте в течение \(y_i\) дней, затем опять работать \(x_i\) дней, и так далее до тех пор, пока его не уберут из депо.

Чтобы следить за обслуживанием было проще, Нитори просит вас посчитать для каждого из дней, сколько поездов будут на ремонте в этот день.

В день, когда поезд убирают, он не считается находящимся в ремонте.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 2 \cdot 10^5\)).

Каждая \(i\)-я из следующих \(n\) строк содержит два целых числа \(x_i,y_i\) (\(1 \le x_i,y_i \le 10^9\)).

Далее следуют \(m\) строк, содержащих два целых числа \(op\) и \(k\) (\(1 \le k \le n\), \(op = 1\) или \(op = 2\)). Если \(op=1\), это означает, что в этот день добавляется поезд \(k\)-й модели, иначе поезд модели \(k\) убирают. Гарантируется, что когда добавляется поезд модели \(x\), в депо нет поездов такой модели, а когда поезд модели \(x\) убирают, в депо есть такой поезд.

Выходные данные

Выведите \(m\) строк, каждая \(i\)-я из которых содержит одно целое число, обозначающее количество поездов, находящихся на ремонте в \(i\)-й день.

Примечание

Рассмотрим первый пример.

Первый день: Нитори добавляет поезд модели \(3\). Работает только поезд модели \(3\), и ни один поезд не находится в ремонте.

Второй день: Нитори добавляет поезд модели \(1\), поезд модели \(1\) работает, а поезд модели \(3\) находится в ремонте.

Третий день: Нитори убирает поезд модели \(1\). Ситуация такая же, как и в первый день.

Четвертый день: Нитори убирает поезд модели \(3\). Нет ни одного поезда.

A. Жизни цветов важны

реализация *800

Пете на день рождения подарили очень необычный цветок, но Петя не всегда бывает дома и не всегда может его поливать. Вам даны \(n\) дней из жизни Пети, вы должны сказать, что станет с цветком в конце.

Цветок обладает следующими свойствами:

  • Если цветок не полить два дня подряд, то он завянет.
  • Если в \(i\)-й день цветок полили, то он вырастает на \(1\) сантиметр.
  • Если цветок полили и в \(i\)-й, и в \((i-1)\)-й день (\(i > 1\)), то цветок растёт на \(5\) сантиметров вместо \(1\).
  • Если в \(i\)-й день цветок не полили, то в этот день он не растёт.

На начало \(1\)-го дня высота цветка равна \(1\) сантиметру. Чему равна высота цветка в конце \(n\)-го дня?

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора находится единственное целое число \(n\) (\(1 \leq n \leq 100\)).

Во второй строке набора находятся \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(a_i = 0\) или \(a_i = 1\)). Если \(a_i = 1\), то Петя полил цветок в \(i\)-й день, иначе не полил.

Выходные данные

Для каждого набора входных данных требуется вывести единственное число \(k\) — размер цветка после \(n\) дней, или \(-1\), если цветок завял.

A. Друзья или нет?

*особая задача жадные алгоритмы реализация *1400

У Поликарпа есть хобби — он разрабатывает необычную социальную сеть. Работа почти закончена, осталось только реализовать модуль, определяющий друзей. Да-да, в этой социальной сети не придется добавлять друзей вручную! Определение пар друзей осуществляется следующим образом. Пусть пользователь A написал сообщение пользователю B в момент t1, а пользователь B написал сообщение пользователю A в момент t2. Если 0 < t2 - t1 ≤ d, тогда сообщение пользователя B было ответом на сообщение пользователя A. Пользователи A и B считаются друзьями, если A ответил хотя бы на одно сообщение B или B ответил хотя бы на одно сообщение A.

Вам дан журнал переписки в хронологическом порядке и число d. Найдите все пары пользователей, которые будут считаться друзьями.

Входные данные

В первой строке входных данных записаны два целых числа n и d (1 ≤ n, d ≤ 1000). В n следующих строках задан журнал переписки. В i-ой строке записана строка журнала в виде «Ai Bi ti» (без кавычек), означающая, что пользователь Ai послал сообщение пользователю Bi в момент времени ti (1 ≤ i ≤ n). Здесь Ai и Bi — непустые строки, состоящие из строчных латинских букв, длиной не более 20 символов, ti — целое число (0 ≤ ti ≤ 10000). Гарантируется, что строки журнала заданы в порядке неубывания ti, и никакой пользователь не присылал сообщения самому себе. Элементы в строках разделяются единичными пробелами.

Выходные данные

В первую строку выведите целое число k — количество пар друзей. В следующих k строках выведите пары друзей в виде «Ai Bi» (без кавычек). Как пользователей в парах, так и сами пары можно выводить в любом порядке. Каждая пара должна быть выведена ровно один раз.

Примечание

В первом примере Вася и Петя — друзья, потому что времена отправки их сообщений отличаются на единицу, а Аня и Иван — нет, потому что времена отправки их сообщений отличаются больше чем на единицу.

D. Хемосе на ICPC?

Бинарный поиск Деревья интерактив математика поиск в глубину и подобное реализация теория чисел *2300

Это интерактивная задача!

На последнем региональном этапе Хемосе, ЗейадХаттаб и ЯхиаШериф — члены команды Carpe Diem — не прошли отбор на ICPC по каким-то неизвестным причинам. Хемосе был очень расстроен и у него был плохой день после соревнований, но ЗейадХаттаб очень мудрый и хорошо знает Хемосе, и не хочет видеть его грустным.

Зейад знает, что Хемосе любит задачи с деревьями, поэтому он дал ему задачу с деревом с очень особенным устройством.

У Хемоса есть взвешенное дерево на \(n\) вершинах и \(n-1\) ребрах. К сожалению, Хемосе не помнит веса ребер.

Определим \(Dist(u, v)\) для \(u\neq v\) как наибольший общий делитель весов всех ребер на пути от вершины \(u\) к вершине \(v\).

У Хемосе есть специальное устройство. Хемосе может дать устройству набор вершин, и устройство вернет наибольший \(Dist\) между любыми двумя вершинами из этого набора. Более формально, если Хемосе даст устройству набор из \(S\) узлов, устройство вернет наибольшее значение \(Dist(u, v)\) по всем парам \((u, v)\), для которых \(u\), \(v\) \(\in\) \(S\) и \(u \neq v\).

Хемосе может использовать это устройство не более \(12\) раз, и хочет найти любые две различные вершины \(a\), \(b\) такие, что \(Dist(a, b)\) является максимально возможным. Можете ли вы ему помочь?

Протокол взаимодействия

Начните взаимодействие с чтения одного целого числа \(n\) (\(2 \le n \le 10^3\)) — количества вершин в дереве.

Затем прочитайте \(n-1\) строк.

\(i\)-я из следующих \(n-1\) строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i\neq v_i\)), что означает наличие ребра между вершинами \(u_i\) и \(v_i\).

Гарантируется, что веса ребер были \(\leq 10^9\).

Гарантируется, что данный граф является деревом.

Теперь вы можете начать задавать запросы. Чтобы задать запрос о множестве из \(k\) вершин \(v_1, v_2, \ldots, v_k\) (\(2 \le k \le n\), \(1 \le v_i \le n\), все \(v_i\) различны), выведите:

? \(k\) \(v_1\) \(v_2\) \(\ldots\) \(v_k\).

Вы получите целое число \(x\), наибольшее \(Dist(v_i, v_j)\) по \(1 \le i, j \le k\) с \(i \neq j\).

Когда вы найдете \(a\) и \(b\) (\(1 \le a, b \le n)\), \(a\neq b\)) такие, что \(Dist(a, b)\) является максимально возможным, выведите ответ в следующем формате:

! \(a\) \(b\)

Вывод ответа не учитывается в лимит в \(12\) запросов.

Если существует несколько пар \((a, b)\) с одинаковым наибольшим \(Dist(a, b)\), можно вывести любую.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Чтобы взломать решение, используйте следующий формат.

Первая строка должна содержать одно целое число \(n\) \((2 \leq n \le 10^3)\) — количество вершин.

В \(i\)-й из следующих \(n-1\) строк должно содержаться три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1 \le u_i, v_i \le n\), \(u_i\ne v_i\), \(1 \le w \le 10^9\)), что означает, что между вершинами \(u_i\) и \(v_i\) есть ребро с весом \(w_i\).

Эти \(n-1\) ребер должны образовывать дерево.

Примечание

Дерево в первом примере приведено ниже:

E. Садовник и дерево

Деревья жадные алгоритмы Перебор поиск в глубину и подобное реализация Структуры данных *1600

Дерево — это неориентированный связный граф, в котором отсутствуют циклы. В этой задаче речь идет о некорневых деревьях.

Лист дерева — это вершина, которая соединена не более чем с одной другой вершиной.

Садовник Виталий вырастил дерево из \(n\) вершин. Он решил подстричь дерево. Для этого он совершает несколько операций. За одну операцию он удаляет все листья дерева.

Пример дерева.

Например, рассмотрим дерево, изображённое на рисунке выше. На рисунке ниже приведён результат применения к дереву ровно одной операции.

Результат применения операции «удалить все листья».

Обратите внимание на особенные случаи применения операций:

  • применение операции к пустому дереву (из \(0\) вершин) не меняет его;
  • применение операции к дереву из одной вершины приводит к удалению этой вершины (т. е. одна эта вершина считается листом);
  • применение операции к дереву из двух вершин приводит к удалению обеих вершин (обе вершины считаются листьями).

Виталий применил к дереву последовательно \(k\) операций. Сколько вершин в нём осталось?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Перед каждым набором входных данных расположена пустая строка.

Каждый набор данных состоит из нескольких строк. Первая строка набора данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 4 \cdot 10^5\), \(1 \le k \le 2 \cdot 10^5\)) — количество вершин в дереве и количество операций. Далее идут \(n - 1\) строк, каждая содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — две вершины, которые соединены ребром. Гарантируется, что заданный граф является деревом, в нём отсутствуют петли и кратные рёбра. Гарантируется, что сумма \(n\) из всех наборов входных данных не превосходит \(4 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке одно целое число — количество вершин, которое осталось в дереве после применения \(k\) операций.

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе задано дерево из двух вершин. К нему применяются \(200000\) операций. Первая удаляет обе вершины, остальные операции не изменяют дерево.

В третьем наборе входных данных дано дерево из трёх вершин. В результате применения первой операции в нём остаётся всего \(1\) вершина (с номером \(2\)), в результате второй операции дерево становится пустым.

F. Красно-чёрное число

meet-in-the-middle дп математика поиск в глубину и подобное реализация *2100

Дано целое неотрицательное число \(x\), десятичная запись которого содержит \(n\) цифр. Необходимо покрасить каждую его цифру в красный или чёрный цвет, так чтобы число, образуемое красными цифрами, делилось на \(A\), а число, образуемое чёрными цифрами, делилось на \(B\). Как в красный, так и в чёрный цвет должна быть покрашена хотя бы одна цифра. Из всех таких покрасок числа \(x\), которые возможны, необходимо вывести любую такую, чтобы, если в красный покрашено \(r\) цифр, а в чёрный — \(b\) цифр, величина \(|r - b|\) была минимально возможной.

Обратите внимание, что число \(x\), а также числа, образуемые цифрами одного цвета, могут содержать ведущие нули.

Пример покраски числа для \(A = 3\) и \(B = 13\)

На рисунке выше показан пример покраски числа \(x = 02165\) из \(n = 5\) цифр для \(A = 3\) и \(B = 13\). Красные цифры образуют число \(015\), которое делится на \(3\), а чёрные — \(26\), которое делится на \(13\). Заметим, что абсолютная величина разности количеств красных и чёрных цифр равна \(1\), меньшего значения добиться невозможно.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из двух строк. Первая строка содержит три целых числа \(n\), \(A\), \(B\) (\(2 \le n \le 40\), \(1 \le A, B \le 40\)). Вторая строка содержит целое неотрицательное число \(x\), состоящее ровно из \(n\) цифр и, возможно, содержащее ведущие нули.

Выходные данные

Для каждого набора входных данных выведите в отдельной строке:

  • -1, если не существует искомой покраски;
  • строку \(s\) из \(n\) символов, каждый из которых является буквой «R» или «B». Если \(i\)-я цифра числа \(x\) красится в красный цвет, то \(i\)-й символ строки \(s\) должен быть буквой «R», иначе буквой «B».

Число, которое образовано покрашенными в красный цвет цифрами, должно делится на \(A\). Число, которое образовано покрашенными в черный цвет цифрами, должно делится на \(B\). Значение \(|r-b|\) должно быть минимальным, где \(r\)  — количество красных цифр, а \(b\)  — количество чёрных. Если ответов несколько, то выведите любой из них.

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе входных данных нет чётных цифр, поэтому невозможно составить число, которое делится на \(2\).

В третьем наборе входных данных любая покраска, содержащая хотя бы одну красную и одну чёрную цифру, подходит, поэтому можно покрасить \(4\) цифры в красный и \(4\) в чёрный (\(|4 - 4| = 0\), т. е. нельзя улучшить результат).

В четвёртом наборе входных данных существует единственная искомая покраска.

E2. Раскраска кубика Рубика (сложная версия)

Деревья дп математика Перебор реализация *2300

Это сложная версия задачи. Различие состоит в том, что в этой версии есть вершины с уже зафиксированными цветами.

Теофанис ужасно проголодался и хочет, наконец, отведать своего любимого блюда, шефталью. Но сначала ему нужно закончить с домашней работой. Поможете ли вы ему в решении данной задачи?

Вам задано идеальное двоичное дерево из \(2^k - 1\) вершин — двоичное дерево, в котором у всех вершин \(i\) от \(1\) по \(2^{k - 1} - 1\) есть ровно два сына: вершины \(2i\) и \(2i + 1\). У вершин с \(2^{k - 1}\) по \(2^k - 1\) нет детей. Вы хотите покрасить его вершины в \(6\) цветов кубика Рубика (белый, зеленый, красный, синий, оранжевый и желтый).

Назовем раскраску хорошей, если все ребра дерева соединяют вершины, цвета которых являются соседними цветами кубика Рубика.

Изображение кубика Рубика и его развертка.

Формально говоря:

  • соседними к белой вершине не могут быть белые и желтые вершины;
  • соседними к желтой вершине не могут быть белые и желтые вершины;
  • соседними к зеленой вершине не могут быть зеленые и синие вершины;
  • соседними к синей вершине не могут быть зеленые и синие вершины;
  • соседними к красной вершине не могут быть красные и оранжевые вершины;
  • соседними к оранжевой вершине не могут быть красные и оранжевые вершины.

Однако, есть \(n\) особых вершин в дереве, цвета которых уже зафиксированы.

Вам нужно посчитать количество хороших раскрасок двоичного дерева. Две раскраски считаются различными, если существует вершина, цвет которой в них различается.

Так как ответ может быть слишком большим, выведите его по модулю \(10^9+7\).

Входные данные

В первой строке задано одно целое число \(k\) (\(1 \le k \le 60\)) — количество уровней в идеальном двоичном дереве, которое вам нужно раскрасить.

Во второй строке задано одно целое число \(n\) (\(1 \le n \le \min(2^k - 1, 2000)\)) — количество вершин, цвета которых уже выбраны.

В следующих \(n\) строках заданы целое число \(v\) (\(1 \le v \le 2^k - 1\)) и строка \(s\) — номер вершины и ее цвет (\(s\) является одной из следующих строк: white, yellow, green, blue, red или orange).

Гарантируется, что каждая вершина \(v\) появляется во входных данных не более одного раза.

Выходные данные

Выведите одно целое число — количество различных раскрасок по модулю \(10^9+7\).

Примечание

На изображении ниже вы можете видеть одну из корректных раскрасок для первого примера.

A. Компьютерная игра

дп Перебор поиск в глубину и подобное реализация *800

Монокарп играет в компьютерную игру. Сейчас он хочет пройти первый уровень этой игры.

Уровень — это прямоугольное клеточное поле из \(2\) строк и \(n\) столбцов. Персонаж Монокарпа изначально стоит в клетке \((1, 1)\) — на пересечении \(1\) строки и \(1\) столбца.

Персонаж Монокарпа за одно действие может переместиться из одной клетки в другую, если они — соседние по стороне и/или углу. Формально, из клетки \((x_1, y_1)\) можно за одно действие переместиться в клетку \((x_2, y_2)\), если \(|x_1 - x_2| \le 1\) и \(|y_1 - y_2| \le 1\). Очевидно, выходить за границы уровня нельзя.

На некоторых клетках находятся ловушки. Если персонаж Монокарпа оказывается в такой клетке, он умирает, и игра заканчивается.

Чтобы пройти уровень, персонаж Монокарпа должен оказаться в клетке \((2, n)\) — на пересечении строки \(2\) и столбца \(n\).

Помогите Монокарпу определить, можно ли пройти уровень.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют сами наборы входных данных, каждый из которых состоит из трех строк.

В первой строке задано одно целое число \(n\) (\(3 \le n \le 100\)) — количество столбцов.

Далее следуют две строки, описывающие уровень. \(i\)-я из этих строк описывает \(i\)-ю строку уровня — строка состоит из символов 0 и 1. Символ 0 соответствует безопасной клетке, символ 1 — клетке с ловушкой.

Дополнительное ограничение на входные данные: клетки \((1, 1)\) и \((2, n)\) — безопасные.

Выходные данные

Для каждого набора входных данных выведите YES, если уровень можно пройти, и NO, если нельзя.

Примечание

Рассмотрим пример из условия.

Возможный путь в первом наборе входных данных: \((1, 1) \rightarrow (2, 2) \rightarrow (2, 3)\).

Возможный путь во втором наборе входных данных: \((1, 1) \rightarrow (1, 2) \rightarrow (2, 3) \rightarrow (2, 4)\).

Возможный путь в четвертом наборе входных данных: \((1, 1) \rightarrow (2, 2) \rightarrow (1, 3) \rightarrow (2, 4) \rightarrow (1, 5) \rightarrow (2, 6)\).

B. Деление на группы

Перебор реализация *1000

На первое собрание кружка по программированию Берляндского ГУ пришли \(n\) студентов (\(n\) — четно). Было решено поделить всех студентов на две группы. У каждой группы будет ровно по одному занятию в неделю в один из будних дней (понедельник, вторник, среда, четверг или пятница), причем дни занятий у каждой группы должны быть разными. Также было решено, что количество студентов в каждой группе должно быть одинаковым.

Каждый из студентов заполнил форму, в которой отметил дни недели, в которые ему было бы удобно посещать занятия.

Перед вами стоит задача определить, возможно ли выбрать два различных будних дня в неделю, в которые будут проходить занятия у каждой из групп, а также поделить всех студентов на две группы таким образом, чтобы каждый из студентов занимался в один из тех дней, в который ему удобно, при этом количество студентов в каждой из групп должно быть одинаковым.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Далее следуют описания \(t\) наборов входных данных.

В первой строке каждого набора входных данных записано одно четное целое число \(n\) (\(2 \le n \le 1\,000\)) — количество студентов.

В \(i\)-й из следующих \(n\) строк следует \(5\) целых чисел \(0\) или \(1\), причем \(j\)-е число равно \(1\), если \(i\)-му студенту удобно ходить на занятия в \(j\)-й будний день, или \(j\)-е число равно \(0\), если \(i\)-му студенту неудобно ходить на занятия в \(j\)-й будний день.

Гарантируется, что каждый из студентов хочет ходить на занятия хотя бы в один из будних дней. Гарантируется, что сумма количества студентов по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

На каждый набор входных данных выведите ответ. Если возможно разделить всех студентов на две равные группы и выбрать дни для занятий так, чтобы всем студентам было удобно, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек).

Примечание

В первом наборе входных данных возможно распределить студентов так, чтобы удовлетворить всем описанным условиям. Для этого в одну группу нужно распределить первого и третьего студентов, которые будут заниматься в четверг, то есть в четвертый будний день, а в другую группу — второго и четвертого студентов, которые будут заниматься во вторник, то есть во второй будний день.

Во втором наборе входных данных невозможно разделить студентов на группы так, чтобы группы занимались в разные будние дни.

C. Удаление двух элементов

дп математика реализация Структуры данных *1200

У Монокарпа есть массив целых чисел \(a\), состоящий из \(n\) элементов. Обозначим среднее арифметическое всех элементов массива за \(k\) (обратите внимание, что \(k\) может быть вещественным числом).

Среднее арифметическое массива из \(n\) элементов — это сумма всех элементов массива деленная на \(n\), то есть на количество элементов массива.

Монокарп решил удалить из массива \(a\) ровно два элемента, при этом он хочет, чтобы после удаления среднее арифметическое оставшихся \((n - 2)\) элементов массива по-прежнему было равно \(k\).

Перед вами стоит задача определить количество пар позиций \([i, j]\) (\(i < j\)) таких, что если удалить элементы из этих позиций, среднее арифметическое оставшихся \((n - 2)\) элементов массива будет равно \(k\), то есть будет равно среднему арифметическому \(n\) элементов изначального массива \(a\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — количество элементов в массиве Монокарпа.

Во второй строке следует последовательность целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^{9}\)), где \(a_i\) равно \(i\)-му элементу массива Монокарпа.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите количество пар позиций \([i, j]\) (\(i < j\)) таких, что если удалить элементы из этих позиций, среднее арифметическое оставшихся \((n - 2)\) элементов массива будет равно \(k\), то есть будет равно среднему арифметическому \(n\) элементов изначального массива \(a\).

Примечание

В первом примере можно удалить любую пару чисел, так как все элементы массива одинаковы.

Во второй примере нельзя удалить ни одной пары чисел таким образом, чтобы среднее арифметическое не изменилось.

В третьем примере можно удалить пару элементов в позициях \(1\) и \(3\) или пару элементов в позициях \(4\) и \(5\).

D. Тренировка

геометрия Комбинаторика математика реализация Структуры данных *1700

Монокарп тренер команд Берляндского ГУ по программированию. Он решил собрать тренировку для своих команд перед квалификационным этапом.

У Монокарпа есть \(n\) задач, которые еще не решал ни один из его студентов. У \(i\)-й задачи есть тема \(a_i\) (целое число от \(1\) до \(n\)) и сложность \(b_i\) (целое число от \(1\) до \(n\)), причем все задачи попарно различны, то есть нет двух задач, у которых одинаковы и тема, и сложность.

Монокарп решил выбрать из \(n\) задач ровно \(3\) задачи для тренировки, при этом должно выполняться хотя бы одно из двух условий (возможно, оба):

  • темы всех трех выбранных задач различны;
  • сложности всех трех выбранных задач различны.

Перед вами стоит задача определить количество способов, которыми Монокарп может выбрать три задачи для тренировки.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 50000\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — количество задач, которые есть у Монокарпа.

В \(i\)-й из следующих \(n\) строк следуют по два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le n\)) — тема и сложность \(i\)-й задачи.

Гарантируется, что нет двух задач, у которых одинаковы и тема, и сложность.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите количество способов выбрать три задачи для тренировки, которые удовлетворяют описанным в условии требованиям.

Примечание

В первом примере можно взять следующие наборы по три задачи:

  • задачи с номерами \(1\), \(2\), \(4\);
  • задачи с номерами \(1\), \(3\), \(4\);
  • задачи с номерами \(2\), \(3\), \(4\).

Таким образом, количество способов равно трем.

E. Лестницы

дп Комбинаторика математика Перебор поиск в глубину и подобное реализация Структуры данных *2100

Дана матрица, состоящая из \(n\) строк и \(m\) столбцов. Строки пронумерованы сверху вниз, столбцы пронумерованы слева направо.

Ячейки данной матрицы могут быть свободными или заблокированными.

Назовем путь в матрице лестницей, если он:

  • начинается и заканчивается в свободной ячейке;
  • посещает только свободные ячейки;
  • имеет одну из двух возможных структур:
    1. вторая ячейка лежит на \(1\) справа от первой, третья — на \(1\) снизу от второй, четвертая — на \(1\) справа от третьей, и так далее;
    2. вторая ячейка лежит на \(1\) снизу от первой, третья — на \(1\) справа от второй, четвертая — на \(1\) снизу от третьей, и так далее.

В частности, путь, состоящий из одной ячейки, считается лестницей.

Некоторые примеры лестниц:

Изначально все ячейки в матрице свободные.

Требуется обработать \(q\) запросов, каждый из которых переключает состояние одной ячейки. То есть, если клетка в данный момент свободна, то делает ее заблокированной, а если заблокирована, то делает ее свободной.

После каждого запроса требуется вывести количество различных лестниц. Две лестницы считаются различными, если существует такая ячейка, которая входит в один путь и не входит в другой.

Входные данные

В первой строке записаны три целых числа \(n\), \(m\) и \(q\) (\(1 \le n, m \le 1000\); \(1 \le q \le 10^4\)) — размерности матрицы и количество запросов.

В каждой из следующих \(q\) строк записаны два целых числа \(x\) и \(y\) (\(1 \le x \le n\); \(1 \le y \le m\)) — описание очередного запроса.

Выходные данные

Выведите \(q\) целых чисел — \(i\)-е число должно быть равно количеству различных лестниц в матрице после \(i\) запросов. Две лестницы считаются различными, если существует такая ячейка, которая входит в один путь и не входит в другой.

A. Флаг

реализация *800

Согласно новому стандарту ISO, флаг каждой страны должен представлять собой клетчатое поле размером n × m, каждая клетка которого покрашена в один из 10 цветов, а так же быть «полосатым»: каждый горизонтальный ряд флага должен содержать клетки одного и того же цвета, а цвета соседних горизонтальных рядов должны отличаться. Правительство Берляндии попросило вас выяснить, соответствует ли флаг их страны новому стандарту ISO.

Входные данные

В первой строке входных данных находятся числа n и m (1 ≤ n, m ≤ 100), n — количество строк, а m — количество столбцов в флаге Берляндии. Далее следует описание флага: в следующих n строках содержится по m символов. Каждый символ - цифра от 0 до 9, обозначает цвет соответствующей клетки.

Выходные данные

Выведите YES, если флаг соответствует новому стандарту ISO, и NO в противном случае.

B. Вор и спички

жадные алгоритмы реализация сортировки *900

Вор пробрался на склад спичек и хочет украсть как можно больше спичек. На складе находится m контейнеров, в контейнере номер i находится ai коробок спичек, а в каждой коробке bi спичек. Все коробки имеют одинаковый размер. В рюкзак вора помещается ровно n коробок. Ваша задача найти наибольшее количество спичек, которое сможет унести вор. У него нет времени на перекладывание спичек между коробками, поэтому он просто выбирает не более n коробок так, чтобы суммарное число спичек в них было максимальным.

Входные данные

В первой строке входных данных находится число n (1 ≤ n ≤ 2·108) и число m (1 ≤ m ≤ 20). В i + 1 строке находится пара чисел ai и bi (1 ≤ ai ≤ 108, 1 ≤ bi ≤ 10). Все числа во входных данных — целые.

Выходные данные

Выведите единственное число — ответ на задачу.

D. Журналирование

реализация Строки *1900

На главный сервер компании Гомбл недавно пришёл лог одного сверхсекретного процесса даже название которого не разрешено разглашать. Лог был записан в формате «[дата:время]: сообщение», где для каждого значения «[дата:время]» существовало не более 10 строк. Все файлы были зашифрованы сверхсложным способом и расшифровать их мог только программист Леша. Шифр был настолько сложен, что Леше понадобилось четыре недели на их расшифровку. Сразу после расшифровки все файлы были уничтожены. И только после удаления файлов Леша заметил, что он сохранял записи в формате «[время]: сообщение». Таким образом, информация о датах была утеряна. Однако так как строки добавлялись в лог в хронологическом порядке, то, например, несложно сделать вывод о том, могли ли все записи появиться в течение одних суток. Также можно определить минимальное количество суток, в которые лог мог быть записан.

Теперь чтобы хоть как-то оправдать себя перед начальством Леша должен узнать какое минимальное число суток затрагивают логи. Заметим, что Леше требуется найти не количество суток между началом и концом журналирования, а количество суток, в которые производились записи (см. пример 2).

Напомним, что за минуту процесс производил не более 10 записей. Считайте, что полночь принадлежит наступающим суткам.

Входные данные

Первая строка файла содержит число n (1 ≤ n ≤ 100). Следующие n строк содержат записи в «[время]: сообщение»: сообщение, где время задаётся в формате «hh:mm x.m.». В качестве hh используются двухзначные числа от 01 до 12, а в качестве mm используются двухзначные числа от 00 до 59, а x это либо символ «a», либо «p». Сообщение — это непустая последовательность латинских букв и/или пробелов, которая не начинается и не заканчивается пробелом. Длина каждого сообщения не превосходит 20.

Выходные данные

Выведите одно число — минимальное количество суток, затрагиваемых записями.

Примечание

Формально 12-часовой формат времени описан:

  • http://ru.wikipedia.org/wiki/12-часовой_формат_времени,
  • http://en.wikipedia.org/wiki/12-hour_clock.
Авторы рекомендуют ознакомиться с формальными описаниями до решения задачи.

C. Найти пару

математика реализация сортировки *1700

Перед Вами очередная задача на массивы. Рассмотрим произвольную последовательность из n (не обязательно различных) целых чисел a1, a2, ..., an. Нас будут интересовать всевозможные пары чисел (ai, aj), (1 ≤ i, j ≤ n). Другими словами, рассмотрим все n2 пар чисел, выбранных из заданного массива.

Например, в последовательности a = {3, 1, 5} существует 9 пар чисел: (3, 3), (3, 1), (3, 5), (1, 3), (1, 1), (1, 5), (5, 3), (5, 1), (5, 5).

Отсортируем лексикографически все полученные пары по неубыванию. Напомним, что пара (p1, q1) лексикографически меньше пары (p2, q2) тогда и только тогда, когда либо p1 < p2 либо p1 = p2 и q1 < q2.

Тогда отсортированная последовательность, упомянутая выше, будет выглядеть следующим образом: (1, 1), (1, 3), (1, 5), (3, 1), (3, 3), (3, 5), (5, 1), (5, 3), (5, 5)

Пронумеруем пары в отсортированном списке от 1 до n2. Ваша задача формулируется следующим образом: нужно найти k-ую пару в упорядоченном списке всевозможных пар заданного вам массива.

Входные данные

В первой строке заданы два целых числа n и k (1 ≤ n ≤ 105, 1 ≤ k ≤ n2). Во второй строке задан массив из n целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109). Числа в массиве могут совпадать. Все числа разделены пробелами.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++, вместо него рекомендуется использовать потоки cin, cout, а также спецификатор %I64d.

Выходные данные

В единственной строке выведите два числа — искомую k-ую пару.

Примечание

В первом примере отсортированная последовательность для заданного массива выглядит следующим образом: (1, 1), (1, 2), (2, 1), (2, 2). 4-ой среди них является пара (2, 2).

Отсортированная последовательность для массива из второго примера приведена в условии. 2-ой парой в ней является (1, 3).

A. Две подпоследовательности

реализация *800

Вам задана строка \(s\). Вам нужно найти две непустые строки \(a\) и \(b\) такие, что выполняются следующие свойства:

  1. Обе строки \(a\) и \(b\) являются подпоследовательностями \(s\).
  2. Для каждой позиции \(i\) символ \(s_i\) строки \(s\) принадлежит ровно одной строке: \(a\) или \(b\).
  3. Строка \(a\) является лексикографически минимально возможной; строка \(b\) может быть любой возможной.

Для заданной строки \(s\), выведите любую пару \(a\) и \(b\).

Напоминание:

Строка \(a\) (\(b\)) является подпоследовательностью строки \(s\), если \(a\) (\(b\)) может быть получена из \(s\) путем удаления нескольких символов (возможно, ни одного). Например, «dores», «cf» и «for» являются подпоследовательностями «codeforces», а «decor» и «fork» не являются.

Строка \(x\) лексикографически меньше чем строка \(y\), если выполняется одно из следующего:

  • \(x\) является префиксом \(y\), но \(x \ne y\);
  • в первой позиции, где \(x\) и \(y\) различны, в строке \(x\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(y\).
Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют сами наборы входных данных.

В первой и единственной строке каждого набора задана одна строка \(s\) (\(2 \le |s| \le 100\), где \(|s|\) означает длину строки \(s\)). Строка \(s\) состоит только из строчных букв латинского алфавита.

Выходные данные

Для каждого набора входных данных, выведите строки \(a\) и \(b\), удовлетворяющие описанным выше условиям. Если существует несколько ответов, выведите любой из них.

Примечание

В первом наборе входных данных, есть только две пары строк: либо \(a =\) f и \(b = \) c, либо \(a = \) c и \(b = \) f. И \(a = \)c лексикографически меньше, чем \(a = \) f.

Во втором наборе, a это единственная буква в строке.

В третьем наборе, можно доказать, что b — лексикографически наименьшая подпоследовательность \(s\). Вторая строка может быть нескольких вариантов; один из них представлен выше.

B. Священный массив

Конструктив реализация *1100

Блэку был ниспослан Священный массив \(a\) состоящий из \(n\) (\(1 \le n \le 2000\)) целых чисел. У каждого элемента \(a\) есть первоначальное состояние. Однако после ругательств в свою сторону, массив разозлился и начал бесконтрольно трансформироваться.

Трансформация состоит из бесконечного количества шагов. На \(i\)-м шаге массив \(a\) меняется следующим образом: в каждой позиции \(j\), \(a_j\) становится равным количеству вхождений значения \(a_j\) в \(a\) перед началом этого шага.

Для большего понимания, ниже приведен пример превращения:

Первоначальный массив:\(2\) \(1\) \(1\) \(4\) \(3\) \(1\) \(2\)
После \(1\)-го шага:\(2\) \(3\) \(3\) \(1\) \(1\) \(3\) \(2\)
После \(2\)-го шага:\(2\) \(3\) \(3\) \(2\) \(2\) \(3\) \(2\)
После \(3\)-го шага:\(4\) \(3\) \(3\) \(4\) \(4\) \(3\) \(4\)
......

В первоначальном массиве были две \(2\), три \(1\), одна \(4\) и одна \(3\), а потому после первого шага, каждый элемент стал равен его количеству вхождений: все двойки стали равны \(2\), все единицы стали равны \(3\), четверка стала равна \(1\) и тройка стала равна \(1\).

Количество шагов в трансформации бесконечно.

Вам нужно обработать \(q\) запросов: в каждом запросе Блэка интересует значение \(a_x\) после \(k\)-го шага трансформации.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют сами наборы входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 2000\)) — размер массива \(a\).

Во второй строке каждого набора заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — первоначальные значения массива \(a\).

В третьей строке каждого набора задано одно целое число \(q\) (\(1 \le q \le 100\,000\)) — количество запросов.

В следующих \(q\) строках заданы сами запросы — по одному в строке. В \(i\)-й строке заданы два целых числа \(x_i\) и \(k_i\) (\(1 \le x_i \le n\); \(0 \le k_i \le 10^9\)) означающих, что Блэка интересует значение \(a_{x_i}\) после \(k_i\)-го шага трансформации. \(k_i = 0\) означает, что Блэка интересуют значения первоначального массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2000\), а сумма \(q\) по всем наборам не превосходит \(100\,000\).

Выходные данные

Для каждого набора входных данных выведите \(q\) ответов. \(i\)-м ответом будет являться значение \(a_{x_i}\) после \(k_i\)-го шага трансформации. Можно показать, что ответ на каждый запрос единственен.

Примечание

Первый набор входных данных рассмотрен в условии задачи. Можно видеть, что:

  1. \(k_1 = 0\) (начальный массив): \(a_3 = 1\);
  2. \(k_2 = 1\) (после \(1\)-го шага): \(a_1 = 2\);
  3. \(k_3 = 2\) (после \(2\)-го шага): \(a_2 = 3\);
  4. \(k_4 = 1\) (после \(1\)-го шага): \(a_6 = 3\).

Для второго набора входных данных,

Первоначальный массив:\(1\) \(1\)
После \(1\)-го шага:\(2\) \(2\)
После \(2\)-го шага:\(2\) \(2\)
......

Можно видеть, что:

  1. \(k_1 = 0\) (начальный массив): \(a_1 = 1\);
  2. \(k_2 = 1000000000\): \(a_2 = 2\);

F. 18 октября 2017

дп Комбинаторика математика реализация *2700

Это произошло 18 октября 2017 года. Shohag, меланхоличная душа, твердо решил, что будет серьезно заниматься спортивным программированием, поскольку оно показалось ему увлекательным. Прошло 4 года, и он счастлив, что выбрал этот путь. Сейчас он создает раунд на Codeforces. Он нашел выдающуюся задачу, но не имеет ни малейшего представления о том, как ее решить. Помогите ему решить финальную задачу раунда.

Вам даны три целых числа \(n\), \(k\) и \(x\). Найдите количество, по модулю \(998\,244\,353\), последовательностей целых чисел \(a_1, a_2, \ldots, a_n\) таких, что выполняются следующие условия:

  • \(0 \le a_i \lt 2^k\) для каждого целого числа \(i\) от \(1\) до \(n\).
  • Не существует непустой подпоследовательности в \(a\) такой, что побитовое исключающее ИЛИ элементов подпоследовательности равно \(x\).

Последовательность \(b\) является подпоследовательностью последовательности \(c\), если \(b\) может быть получена из \(c\) путем удаления нескольких (возможно, нуля или всех) элементов.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит три целых числа \(n\), \(k\) и \(x\) (\(1 \le n \le 10^9\), \(0 \le k \le 10^7\), \(0 \le x \lt 2^{\operatorname{min}(20, k)}\)), разделенных пробелами.

Гарантируется, что сумма \(k\) по всем наборам входных данных не превышает \(5 \cdot 10^7\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — ответ на задачу.

Примечание

В первом наборе входных данных допустимыми последовательностями являются \([1, 2]\), \([1, 3]\), \([2, 1]\), \([2, 3]\), \([3, 1]\) и \([3, 2]\).

Во втором наборе входных данных единственной допустимой последовательностью является \([0, 0]\).

C. Доминантный характер

жадные алгоритмы Перебор реализация Строки *1400

У Ashish есть строка \(s\) длины \(n\), содержащая только символы 'a', 'b' и 'c'.

Он хочет найти длину наименьшей подстроки, которая удовлетворяет следующим условиям:

  • Длина подстроки не меньше чем \(2\)
  • 'a' встречается строго больше раз в этой подстроке, чем 'b'
  • 'a' встречается строго больше раз в этой подстроке, чем 'c'

Ashish занят планированием следующего раунда Codeforces. Помогите ему решить задачу.

Строка \(a\) является подстрокой строки \(b\), если \(a\) можно получить из \(b\), удалив несколько (возможно, ноль или все) символов из начала и несколько (возможно, ноль или все) символов из конца.

Входные данные

Первая строка содержит одно целое число \(t\) \((1 \le t \le 10^{5})\)  — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) \((2 \le n \le 10^{6})\)  — длину строки \(s\).

Вторая строка каждого набора входных данных содержит строку \(s\), состоящую только из символов 'a', 'b' и 'c'.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^{6}\).

Выходные данные

Для каждого набора входных данных выведите длину наименьшей подстроки, удовлетворяющей заданным условиям, или выведите \(-1\), если такой подстроки нет.

Примечание

Рассмотрим первый набор входных данных. В подстроке «aa», 'a' встречается дважды, а 'b' и 'c' встречаются ноль раз. Поскольку 'a' встречается строго больше раз, чем 'b' и 'c', подстрока «aa» удовлетворяет условию, и ответ равен \(2\). Подстрока «a» также удовлетворяет этому условию, однако ее длина меньше \(2\).

Во втором наборе входных данных можно показать, что ни в одной из подстрок «cbabb» 'a' не встречается строго больше раз, чем 'b' и 'c'.

В третьем наборе входных данных, «cacabccc», длина наименьшей подстроки, удовлетворяющей условиям, равна \(3\).

D. Деревонумерация

битмаски Деревья жадные алгоритмы игры Конструктив поиск в глубину и подобное реализация *2100

Eikooc и Sushi играют в игру.

Игра проводится на дереве из \(n\) вершин, пронумерованных от \(1\) до \(n\). Напомним, что дерево с \(n\) вершинами это неориентированный связный граф с \(n-1\) ребрами.

Игроки поочередно перемещают фишку по дереву. Eikooc делает первый ход, помещая фишку на любую вершину по своему выбору. Sushi делает следующий ход, затем Eikooc, затем Sushi, и так далее. В каждый ход после первого, игрок должен переместить фишку в какую-то вершину \(u\) такую, что:

  • Между вершинами \(u\) и \(v\) (на которой фишка находится данный момент), есть ребро
  • \(u\) не была посещена ранее
  • \(u \oplus v \leq min(u, v)\)

Здесь \(x \oplus y\) обозначает операцию побитового исключающего ИЛИ чисел \(x\) и \(y\).

Оба игрока играют оптимально. Игрок, который не может сделать ход, проигрывает.

Ниже приведены примеры, демонстрирующие правила игры.

Предположим, Eikooc начинает игру, помещая фишку в вершину \(4\). Затем Sushi перемещает фишку в вершину \(6\), которая не была посещена и является соседней к \(4\). Также \(6 \oplus 4 = 2 \leq min(6, 4)\). На следующем ходу Eikooc перемещает фишку в вершину \(5\), которая не была посещена и является соседней к \(6\). Также, \(5 \oplus 6 = 3 \leq min(5, 6)\). У Sushi больше нет ходов для игры, поэтому она проигрывает.
Предположим, Eikooc начинает игру, помещая фишку в вершинул \(3\). Sushi перемещает фишку в вершину \(2\), которая не была посещена и является соседней к \(3\). Также \(3 \oplus 2 = 1 \leq min(3, 2)\). Eikooc не может переместить фишку в вершину \(6\), так как \(6 \oplus 2 = 4 \nleq min(6, 2)\). Поскольку у Eikooc нет ходов для игры, она проигрывает.

Перед началом игры Eikooc решает тайком перенумеровать вершины дерева в свою пользу. Формально, перенумерация — это перестановка \(p\) длины \(n\) (последовательность из \(n\) целых чисел, где каждое целое число от \(1\) до \(n\) встречается ровно один раз), где \(p_i\) обозначает новый номер вершины \(i\).

Она хочет максимизировать количество вершин, которые она может выбрать в первый ход, для которых она сможет гарантировать себе победу. Помогите Eikooc найти любую перенумерацию, которая поможет ей в этом.

Входные данные

Первая строка содержит одно целое число \(t~(1 \le t \le 10^5)\)  — количество наборов входных данных. Описание каждого набора входных данных выглядит следующим образом.

Первая строка каждого набора входных данных содержит целое число \(n~(1 \le n \le 2 \cdot 10^5)\)  — количество вершин в дереве.

Следующие \(n-1\) строки содержат по два целых числа \(u\) и \(v\) \((1 \le u, v \le n; u \neq v)\)  — обозначающие ребро между вершинами \(u\) и \(v\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите любую подходящую перестановку  — перестановку длины \(n\), которая максимизирует количество вершин, которые Eikooc может выбрать в первый ход и иметь выиграшную стратегию. Если таких перестановок несколько, вы можете вывести любую из них.

Примечание

В первом наборе входных данных у Eikooc есть только одна вершина. У Sushi не будет ходов после того, как Eikooc выберет эту вершину, и Eikooc выиграет.

Во втором наборе входных данных \(1 \oplus 2 = 3 \nleq min(1, 2)\). Следовательно, после того, как Eikooc выберет любую из вершин, у Sushi не останется ходов, и Eikooc выиграет. И \(\{1, 2\}\), и \(\{2, 1\}\) являются допустимыми перенумерациями.

E. Уравнитель массивов

Бинарный поиск жадные алгоритмы математика реализация сортировки теория чисел *2400

У Jeevan есть два массива \(a\) и \(b\) размером \(n\). Он любит выполнять странные операции над массивами. На этот раз он придумал два типа операций:

  • Выберите любое \(i\) (\(1 \le i \le n\)) и увеличьте \(a_j\) на \(1\) для каждого \(j\), которое кратно \(i\) и \(1 \le j \le n\).
  • Выберите любое \(i\) (\(1 \le i \le n\)) и уменьшите \(a_j\) на \(1\) для каждого \(j\), которое кратно \(i\) и \(1 \le j \le n\).

Он хочет преобразовать массив \(a\) в массив \(b\), используя минимальное общее количество операций. Однако Jeevan, похоже, забыл значение \(b_1\). Поэтому он делает некоторые предположения. Он задаст вам \(q\) вопросов, соответствующих его \(q\) догадкам, \(i\)-я из которых имеет вид:

  • Если \(b_1 = x_i\), то какое минимальное количество операций требуется для преобразования \(a\) в \(b\)?

Помогите ему, ответив на каждый вопрос.

Входные данные

Первая строка содержит одно целое число \(n\) \((1 \le n \le 2 \cdot 10^{5})\)  — размер массивов \(a\) и \(b\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, ..., a_n\) \((1 \le a_i \le 10^{6})\).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, ..., b_n\) \((1 \le b_i \le 10^6\) для \(i \neq 1\); \(b_1 = -1\), что означает, что значение \(b_1\) неизвестно\()\).

Четвертая строка содержит одно целое число \(q\) \((1 \le q \le 2 \cdot 10^{5})\)  — количество вопросов.

Каждая из следующих \(q\) строк содержит одно целое число \(x_i\) \((1 \le x_i \le 10^6)\)  — представляющее \(i\)-й вопрос.

Выходные данные

Выведите \(q\) целых чисел  — ответы на каждый из его \(q\) вопросов.

Примечание

Рассмотрим первый пример.

  • \(b_1 = 1\): Нам нужно преобразовать \([3, 7] \rightarrow [1, 5]\). Мы можем выполнить следующие операции:

    \([3, 7]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 1}}\) \([2, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 1}}\) \([1, 5]\) Следовательно, ответ равен \(2\).

  • \(b_1 = 4\): Нам нужно преобразовать \([3, 7] \rightarrow [4, 5]\). Мы можем выполнить следующие операции:

    \([3, 7]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 5]\) \(\xrightarrow[\text{увеличить}]{\text{i = 1}}\) \([4, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([4, 5]\)

    Следовательно, ответ — \(4\).

  • \(b_1 = 3\): Нам нужно преобразовать \([3, 7] \rightarrow [3, 5]\). Мы можем выполнить следующие операции:

    \([3, 7]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 6]\) \(\xrightarrow[\text{уменьшить}]{\text{i = 2}}\) \([3, 5]\)

    Следовательно, ответ равен \(2\).

B. Файлы обновлений

жадные алгоритмы математика реализация *1100

Берляндский государственный университет получил файлы обновления для операционной системы. Изначально они установлены только на \(1\)-м компьютере.

Файлы обновлений должны быть скопированы на все \(n\) компьютеров. Компьютеры не подключены к интернету, поэтому единственный способ перенести файлы обновлений с одного компьютера на другой — скопировать их с помощью патч-корда (кабель, соединяющий два компьютера напрямую). Одновременно к компьютеру может быть подключен только один кабель. Это означает, что с любого компьютера, на котором установлены файлы обновления, их можно скопировать на любой другой компьютер всего за один час.

Ваша задача — найти минимальное количество часов, необходимое для копирования файлов обновлений на все \(n\) компьютеров, если в университете есть только \(k\) патч-кордов.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных.

Каждый набор состоит из одной строки, которая содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 10^{18}\)) — количество компьютеров и количество патч-кордов.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество часов, необходимое для копирования файлов обновлений на все \(n\) компьютеров.

Примечание

Рассмотрим примеры из условия:

  • \(n=8\), \(k=3\):
    1. в течение первого часа мы копируем файлы с компьютера \(1\) на компьютер \(2\);
    2. в течение второго часа мы копируем файлы с компьютера \(1\) на компьютер \(3\), и с компьютера \(2\) на компьютер \(4\);
    3. в течение третьего часа мы копируем файлы с компьютера \(1\) на компьютер \(5\), с компьютера \(2\) на компьютер \(6\), и с компьютера \(3\) на компьютер \(7\);
    4. в течение четвертого часа мы копируем файлы с компьютера \(2\) на компьютер \(8\).
  • \(n=6\), \(k=6\):
    1. в течение первого часа мы копируем файлы с компьютера \(1\) на компьютер \(2\);
    2. в течение второго часа мы копируем файлы с компьютера \(1\) на компьютер \(3\), и с компьютера \(2\) на компьютер \(4\);
    3. в течение третьего часа мы копируем файлы с компьютера \(1\) на компьютер \(5\), и с компьютера \(2\) на компьютер \(6\).
  • \(n=7\), \(k=1\):
    1. в течение первого часа мы копируем файлы с компьютера \(1\) на компьютер \(2\);
    2. в течение второго часа мы копируем файлы с компьютера \(1\) на компьютер \(3\);
    3. в течение третьего часа мы копируем файлы с компьютера \(1\) на компьютер \(4\);
    4. в течение четвертого часа мы копируем файлы с компьютера \(4\) на компьютер \(5\);
    5. в течение пятого часа мы копируем файлы с компьютера \(4\) на компьютер \(6\);
    6. в течение шестого часа мы копируем файлы с компьютера \(3\) на компьютер \(7\).

D. Красно-синяя матрица

Конструктив Перебор реализация сортировки *2400

Дана матрица, состоящая из \(n\) строк и \(m\) столбцов. В \(j\)-й ячейке \(i\)-й строки записано целое число \(a_{ij}\).

Сначала необходимо раскрасить каждую строку матрицы либо в красный, либо в синий цвет, так, чтобы хотя бы одна строка была красная и хотя бы одна строка была синяя.

Затем необходимо выбрать целое число \(k\) (\(1 \le k < m\)) и разрезать матрицу таким образом, что первые \(k\) столбцов становятся отдельной матрицей (левой матрицей) и последние \(m-k\) столбцов становятся отдельной матрицей (правой матрицей).

Раскраска и разрез называются идеальными, если выполняются два условия:

  • в каждой красной ячейке левой матрицы записано число большее, чем в каждой синей ячейке левой матрицы;
  • в каждой синей ячейке правой матрицы записано число большее, чем в каждой красной ячейке правой матрицы.

Найдите любые идеальные раскраску и разрез или скажите, что таких нет.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Затем следуют описания \(t\) наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(2 \le n, m \le 5 \cdot 10^5\); \(n \cdot m \le 10^6\)) — количество строк и столбцов в матрице, соответственно.

В \(i\)-й из следующих \(n\) строк записаны по \(m\) целых чисел \(a_{i1}, a_{i2}, \dots, a_{im}\) (\(1 \le a_{ij} \le 10^6\)).

Сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

На каждый набор входных данных выведите ответ. Если нет идеальных раскраски и разреза, то выведите «NO».

Иначе, сначала выведите «YES». Затем строку, состоящую из \(n\) символов: \(i\)-й символ должен быть 'R', если \(i\)-я строка покрашена в красный и 'B', если в синий. В строке должен быть хотя бы один символ 'R' и хотя бы один символ 'B'. Наконец, выведите целое число \(k\) (\(1 \le k < m\)) — количество столбцов, которые отрезаются слева.

Примечание

Раскраска и разрез для первого набора входных данных:

A. Линейная клавиатура

реализация Строки *800

Перед вами клавиатура, которая состоит из \(26\) клавиш. Клавиши расположены в один ряд друг за другом в некотором порядке. Каждой клавише соответствует своя строчная латинская буква.

Требуется напечатать на этой клавиатуре слово \(s\). Оно тоже состоит только из строчных латинских букв.

Чтобы напечатать слово, требуется последовательно напечатать все его буквы. Чтобы напечатать очередную букву, необходимо расположить руку в точности над соответствующей клавишей и нажать эту клавишу.

Перемещение руки между клавишами занимает время, которое равно модулю (абсолютной величине) разности позиций этих клавиш (клавиши пронумерованы слева направо). На нажатия и размещение руки над первой буквой слова время не тратится.

Например, рассмотрим клавиатуру, на которой буквы от 'a' до 'z' расположены подряд в алфавитном порядке. Буквы 'h', 'e', 'l' и 'o' в таком случае расположены на позициях \(8\), \(5\), \(12\) и \(15\), соответственно. Поэтому, чтобы напечатать слово «hello», потребуется \(|5 - 8| + |12 - 5| + |12 - 12| + |15 - 12| = 13\) единиц времени.

Определите, сколько времени понадобится, чтобы напечатать слово \(s\).

Входные данные

В первой строке записано целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

В следующих \(2t\) строках заданы описания наборов входных данных.

Первая из них содержит строку длины \(26\), которая состоит из различных строчных латинских букв — клавиатуру. Каждая из букв от 'a' до 'z' встречается на клавиатуре ровно один раз.

Вторая строка описания набора входных данных содержит \(s\) — слово, которое необходимо напечатать. Слово имеет длину от \(1\) до \(50\) букв, включительно, и состоит из строчных латинских букв.

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите минимальное время, которое надо потратить, чтобы напечатать слово \(s\) на заданной клавиатуре.

E. Робот на доске 1

реализация *1600

Робот находится на клетчатой прямоугольной доске размера \(n \times m\) (\(n\) строк, \(m\) столбцов). Строки в доске пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы — от \(1\) до \(m\) слева направо.

Робот умеет передвигаться из текущей клетки в одну из четырех соседних с ней по стороне.

Известна последовательность выполняемых роботом команд \(s\). Каждая команда обозначается одним из символов 'L', 'R', 'D' или 'U', и задает движение влево, вправо, вниз или вверх, соответственно.

Начать свое движение робот может в любой клетке. Команды робот выполняет, начиная с самой первой, строго в том порядке, в котором они перечислены в \(s\). Если робот перемещается за границу доски, он падает и ломается. Команда, приводящая к поломке робота, не считается успешно выполненной.

Задача робота — выполнить как можно больше команд, не упав с доски. Например, на доске \(3 \times 3\), начав исполнять последовательность действий \(s=\)«RRDLUU» («вправо», «вправо», «вниз», «влево», «вверх», «вверх») из центральной клетки, робот выполнит одну команду, после чего следующей командой выйдет за границу доски. Если же робот начнет движение из клетки \((2, 1)\) (вторая строка, первый столбец), то все команды будут успешно выполнены, и робот остановится в клетке \((1, 2)\) (первая строка, второй столбец).

Робот начинает из клетки \((2, 1)\) (вторая строка, первый столбец). Двигается вправо, вправо, вниз, влево, вверх и вверх. В этом случае он заканчивает в клетке \((1, 2)\) (первая строка, второй столбец).

Определите, с какой клетки роботу стоит начинать свое движение, чтобы выполнить как можно больше команд.

Входные данные

В первой строке записано целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

В следующих \(2t\) строках даны описания наборов входных данных.

В описании каждого набора входных данных первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 10^6\)) — высоту и ширину поля, по которому перемещается робот. Во второй строке описания дана строка \(s\), состоящая исключительно из символов 'L', 'R', 'D' и 'U' — последовательность команд, исполняемых роботом. Строка имеет длину от \(1\) до \(10^6\) команд.

Гарантируется, что сумма длин \(s\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите два целых числа \(r\) (\(1 \leq r \leq n\)) и \(c\) (\(1 \leq c \leq m\)), разделенные пробелом — координаты клетки (номер строки и номер столбца), из которой роботу следует начинать движение, чтобы выполнить как можно больше команд.

Если таких клеток несколько, выведите любую.

F. Робот на доске 2

графы Перебор поиск в глубину и подобное реализация *2300

Робот находится на клетчатой прямоугольной доске размера \(n \times m\) (\(n\) строк, \(m\) столбцов). Строки пронумерованы от \(1\) до \(n\) сверху вниз, столбцы — от \(1\) до \(m\) слева направо.

Робот умеет передвигаться из текущей клетки в одну из четырех соседних с ней по стороне.

На каждой клетке доски написан один из символов 'L', 'R', 'D' или 'U', обозначающий направление движения робота, находящегося в этой клетке — влево, вправо, вниз или вверх, соответственно.

Начать свое движение робот может в любой клетке. После этого он за один ход перемещается в соседнюю по стороне клетку в направлении, указанном на текущей клетке.

  • Если робот перемещается за границу доски, он падает и ломается.
  • Если робот оказывается в клетке, в которой он был ранее, то он ломается (он останавливается и больше не двигается).

Робот может выбрать любую клетку в качестве стартовой. Его цель — совершить максимальное количество команд до поломки или остановки.

Определите, с какой клетки роботу стоит начинать свое движение, чтобы выполнить как можно больше команд. Команда считается успешно выполненной, если робот переместился с той клетки, на которой эта команда была написана (не важно, на другую клетку или за границу доски).

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10000\)) — количество наборов входных данных в тесте.

Перед каждым набором в тесте записана пустая строка. Далее идёт строка, которая содержит целые числа \(n\) и \(m\) (\(1 \le n \le 2000\); \(1 \le m \le 2000\)) — размеры доски. Затем следуют \(n\) строк, \(i\)-я из которых описывает \(i\)-ю строку доски. Каждая из них имеет длину ровно \(m\) и состоит из символов 'L', 'R', 'D' и 'U'.

Гарантируется, что сумма размеров всех досок во входных данных не превосходит \(4\cdot10^6\).

Выходные данные

Для каждого набора входных данных выведите три целых числа \(r\), \(c\) и \(d\) (\(1 \le r \le n\); \(1 \le c \le m\); \(d \ge 0\)), которые обозначают, что роботу следует начать движение из клетки \((r, c)\), чтобы сделать максимальное количество ходов \(d\). Если ответов несколько, то выведите любой из них.

E. Бумага в клеточку

Бинарный поиск реализация сортировки *2800

На бесконечном клетчатом листе бумаги выбираются \(n\) клеток и окрашиваются в три цвета, где \(n\) кратно \(3\). Оказывается, что есть ровно \(\frac{n}{3}\) отмеченных клеток каждого из трех цветов!

Найдите наибольшее такое \(k\), при котором можно выбрать \(\frac{k}{3}\) клеток каждого цвета, удалить все остальные помеченные клетки, а затем выбрать три прямоугольника со сторонами, параллельными линиям сетки, так, чтобы выполнялись следующие условия:

  • Никакие два прямоугольника не могут пересекаться (но они могут иметь общую часть границы). Другими словами, площадь пересечения любых двух прямоугольников должна быть равна \(0\).
  • \(i\)-й прямоугольник содержит все выбранные клетки \(i\)-го цвета и ни одной выбранной клетки другого цвета, для \(i = 1, 2, 3\).
Входные данные

Первая строка входных данных содержит одно целое число \(n\) — количество отмеченных клеток (\(3 \leq n \le 10^5\), \(n\) кратно 3).

В \(i\)-й из следующих \(n\) строк содержится три целых числа \(x_i\), \(y_i\), \(c_i\) (\(|x_i|,|y_i| \leq 10^9\); \(1 \leq c_i \leq 3\)), где \((x_i, y_i)\) — координаты \(i\)-й отмеченной клетки, а \(c_i\) — ее цвет.

Гарантируется, что все клетки \((x_i, y_i)\) попарно различны, и что существует ровно \(\frac{n}{3}\) клеток каждого цвета.

Выходные данные

Выведите одно целое число \(k\) — наибольшее количество клеток, которое можно оставить.

Примечание

В первом примере можно оставить \(6\) клеток с индексами \(1, 5, 6, 7, 8, 9\).

Во втором примере можно оставить \(3\) клетки с индексами \(1, 2, 3\).

F. MEX подсчет

дп Комбинаторика реализация *3200

Для массива \(c\) неотрицательных целых чисел, \(MEX(c)\) обозначает наименьшее неотрицательное целое число, которое в нем не встречается. Например, \(MEX([0, 1, 3]) = 2\), \(MEX([42]) = 0\).

Вам даны целые числа \(n, k\) и массив \([b_1, b_2, \ldots, b_n]\).

Найдите количество массивов \([a_1, a_2, \ldots, a_n]\), для которых выполняются следующие условия:

  • \(0 \le a_i \le n\) для каждого \(i\) для каждого \(i\) от \(1\) до \(n\).

  • \(|MEX([a_1, a_2, \ldots, a_i]) - b_i| \le k\) для каждого \(i\) от \(1\) до \(n\).

Поскольку это число может быть очень большим, выведите его по модулю \(998\,244\,353\).

Входные данные

Первая строка содержит два целых числа \(n, k\) (\(1 \le n \le 2000\), \(0 \le k \le 50\)).

Вторая строка содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(-k \le b_i \le n+k\)) — элементы массива \(b\).

Выходные данные

Выведите одно целое число — количество массивов, удовлетворяющих ограничениям из условия, по модулю \(998\,244\,353\).

A. Дели и преумножай

жадные алгоритмы математика реализация теория чисел *900

У Василия есть массив из \(n\) чисел \(a_1, a_2, \dots, a_n\). Он может любое количество раз выполнить следующую последовательность операций:

  1. выбрать два любых элемента массива \(a_i\) и \(a_j\), где \(a_i\) должно делиться нацело на \(2\)
  2. \(a_i = \frac{a_i}{2}\)
  3. \(a_j = a_j \cdot 2\)

Помогите Василию найти максимальную сумму элементов массива, которую он сможет добиться, используя описанную последовательность операций.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) \((1 \le n \le 15)\) — количество элементов в массиве Василия.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) \((1 \le a_i < 16)\) — описание массива Василия.

Выходные данные

Для каждого набора входных данных выведите максимальную сумму элементов массива после оптимального применения последовательности операций.

Примечание

В первом тестовом примере оптимальный порядок выглядит следующим образом:

  1. Выбрать \(i = 2\) и \(j = 1\). После выполнения последовательности операций \(a_2 = \frac{4}{2} = 2\) и \(a_1 = 6 \cdot 2 = 12\), массив будет следующим: [12, 2, 2].
  2. Выбрать \(i = 2\) и \(j = 1\). После выполнения последовательности операций \(a_2 = \frac{2}{2} = 1\) и \(a_1 = 12 \cdot 2 = 24\), массив будет следующим: [24, 1, 2].
  3. Выбрать \(i = 3\) и \(j = 1\). После выполнения последовательности операций \(a_3 = \frac{2}{2} = 1\) и \(a_1 = 24 \cdot 2 = 48\), массив будет следующим: [48, 1, 1].

Итоговый ответ \(48 + 1 + 1 = 50\).

В третьем тестовом примере нет возможности поменять сумму элементов, поэтому ответ \(10\).

B. Внимательный Василий

реализация Строки *1100

Перед тем как стать успешным трейдером, Василий закончил университет. Во время его обучения произошел один случай, после которого Василий стал намного внимательнее слушать условия заданий для домашней работы. Далее приведено правильное формальное условие домашнего задания.

Дана строка \(s\) длины \(n\), состоящая только из символов «a», «b» и «c». Есть \(q\) запросов вида (\(pos, c\)), который обозначает замену элемента строки \(s\) на позиции \(pos\) на символ \(c\). После каждого запроса требуется вывести минимальное количество символов в строке, которые нужно заменить, чтобы строка не содержала строку «abc» в качестве подстроки. Правильной заменой символа является его изменение на символ «a», «b» или «c».

Строка \(x\) является подстрокой \(y\), если \(x\) может быть получена из \(y\) удалением нескольких (возможно, ни одного или всех) символов из начала и нескольких (возможно, ни одного или всех) символов из конца.

Входные данные

Первая строка ввода содержит два целых числа \(n\) и \(q\) \((1 \le n, q \le 10^5)\) — длину строки и количество запросов соответственно.

Следующая строка ввода содержит строку \(s\), состоящую из символов «a», «b» и «c».

Следующие \(q\) строк содержат целое число \(i\) и символ \(c\) \((1 \le i \le n)\) — индекс и значение нового элемента строки соответственно. Гарантируется, что символ \(c\) равен значению «a», «b» или «c».

Выходные данные

Для каждого запроса выведите минимальное количество символов, которые необходимо заменить, чтобы строка не содержала «abc» как подстроку.

Примечание

Рассмотрим состояния строки после каждого запроса:

  1. \(s =\) «abcabcabc». В этом случае можно сделать \(3\) замены и получить, например, строку \(s =\) «bbcaccabb». Эта строка не содержит «abc» как подотрезок.
  2. \(s =\) «bbcabcabc». В этом случае можно сделать \(2\) замены и получить, например, строку \(s =\) «bbcbbcbbc». Эта строка не содержит «abc» как подотрезок.
  3. \(s =\) «bccabcabc». В этом случае можно сделать \(2\) замены и получить, например, строку \(s =\) «bccbbcbbc». Эта строка не содержит «abc» как подотрезок.
  4. \(s =\) «bcaabcabc». В этом случае можно сделать \(2\) замены и получить, например, строку \(s =\) «bcabbcbbc». Эта строка не содержит «abc» как подотрезок.
  5. \(s =\) «bcabbcabc». В этом случае можно сделать \(1\) замену и получить, например, строку \(s =\) «bcabbcabb». Эта строка не содержит «abc» как подотрезок.
  6. \(s =\) «bcabccabc». В этом случае можно сделать \(2\) замены и получить, например, строку \(s =\) «bcabbcabb». Эта строка не содержит «abc» как подотрезок.
  7. \(s =\) «bcabccaac». В этом случае можно сделать \(1\) замену и получить, например, строку \(s =\) «bcabbcaac». Эта строка не содержит «abc» как подотрезок.
  8. \(s =\) «bcabccaab». В этом случае можно сделать \(1\) замену и получить, например, строку \(s =\) «bcabbcaab». Эта строка не содержит «abc» как подотрезок.
  9. \(s =\) «ccabccaab». В этом случае можно сделать \(1\) замену и получить, например, строку \(s =\) «ccabbcaab». Эта строка не содержит «abc» как подотрезок.
  10. \(s =\) «ccaaccaab». В этом случае строка не содержит «abc» как подотрезок, поэтому замен делать не требуется.

C. Сложный анализ рынка

Бинарный поиск дп расписания реализация теория чисел *1400

В процессе сложного анализа рынка у Василия возникла следующая задача:

Дан массив \(a\) длины \(n\) и натуральное число \(e\). Требуется посчитать количество пар натуральных чисел \((i, k)\) для которых выполняются следующие условия:

  • \(1 \le i, k\)
  • \(i + e \cdot k \le n\).
  • Произведение \(a_i \cdot a_{i + e} \cdot a_{i + 2 \cdot e} \cdot \ldots \cdot a_{i + k \cdot e} \) является простым числом.

Простым числом называется натуральное число больше единицы, имеющее ровно два различных натуральных делителя — единицу и самого себя.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(e\) \((1 \le e \le n \le 2 \cdot 10^5)\) — количество элементов в массиве и число \(e\) соответственно.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) \((1 \le a_i \le 10^6)\) — описание массива.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ в следующем формате:

В единственной строке выведите количество подходящих пар чисел \((i, k)\).

Примечание

В первом тестовом примере подходят две пары:

  1. \(i = 2, k = 1\), тогда произведение: \(a_{2} \cdot a_{5} = 2\) является простым числом.
  2. \(i = 3, k = 1\), тогда произведение: \(a_{3} \cdot a_{6} = 19\) является простым числом.

Во втором тестовом примере не существует подходящих пар.

В третьем тестовом примере подходят четыре пары:

  1. \(i = 1, k = 1\), тогда произведение: \(a_{1} \cdot a_{4} = 2\) является простым числом.
  2. \(i = 1, k = 2\), тогда произведение: \(a_{1} \cdot a_{4} \cdot a_{7} = 2\) является простым числом.
  3. \(i = 3, k = 1\), тогда произведение: \(a_{3} \cdot a_{6} = 2\) является простым числом.
  4. \(i = 6, k = 1\), тогда произведение: \(a_{6} \cdot a_{9} = 2\) является простым числом.

В четвертом тестовом примере не существует подходящих пар.

В пятом тестовом примере подходят пять пар:

  1. \(i = 1, k = 1\), тогда произведение: \(a_{1} \cdot a_{2} = 2\) является простым числом.
  2. \(i = 1, k = 2\), тогда произведение: \(a_{1} \cdot a_{2} \cdot a_{3} = 2\) является простым числом.
  3. \(i = 1, k = 3\), тогда произведение: \(a_{1} \cdot a_{2} \cdot a_{3} \cdot a_{4} = 2\) является простым числом.
  4. \(i = 2, k = 1\), тогда произведение: \(a_{2} \cdot a_{3} = 2\) является простым числом.
  5. \(i = 2, k = 2\), тогда произведение: \(a_{2} \cdot a_{3} \cdot a_{4} = 2\) является простым числом.

В шестом тестовом примере не существует подходящих пар.

D. Социальная сеть

графы Деревья жадные алгоритмы реализация снм *1600

Василий приехал на посвященную криптовалютам конференцию. Для того, чтобы быть в курсе всех самых важных новостей из мира криптовалют, нужно постоянно заводить новые знакомства или пользоваться знакомствами своих друзей.

В конференции участвует \(n\) человек, которые изначально не знакомы между собой. Василий может познакомить двух любых людей \(a\) и \(b\), которые не были знакомы до этого.

У Василия есть \(d\) условий, \(i\)-е из которых требует, чтобы человек \(x_i\) имел связь с человеком \(y_i\). Формально два человека \(x\) и \(y\) имеют связь, если найдется цепочка \(p_1=x, p_2, p_3, \dots, p_k=y\) такая, что для всех \(i\) от \(1\) до \(k - 1\) известно, что люди под номерами \(p_i\) и \(p_{i + 1}\) знакомы.

Василий хочет, чтобы для каждого \(i\) (\(1 \le i \le d\)) вы рассчитали, какое максимальное количество знакомств может иметь один человек при условии, что Василий выполнил все условия от \(1\) до \(i\) включительно, произведя при этом ровно \(i\) знакомств. Проверка условий происходит после того, как Василий провел \(i\) знакомств. Ответ для каждого \(i\) необходимо найти независимо. То есть, когда вы вычисляете ответ для \(i\), вы должны считать, что никто из людей еще не был знаком.

Входные данные

Первая строка содержит два целых числа \(n\) и \(d\) (\(2 \le n \le 10^3, 1 \le d \le n - 1\)) — количество людей и количество условий.

Следующие \(d\) строк содержат по два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n, x_i \neq y_i\)) — номера людей, которые должны иметь связь согласно \(i\)-му условию.

Выходные данные

Выведите \(d\) целых чисел. \(i\)-е число должно быть равно количеству знакомств у человека с наибольшим возможным количеством знакомств, если Василий провел \(i\) знакомств и выполнил первые \(i\) условий.

Примечание

Пояснение для первого тестового примера:

В этом пояснении круг и вписанное число обозначают человека с соответствующим номером. Линии, соединяющие людей, обозначают то, что эти люди знакомы между собой. Человек, отмеченный красным цветом, имеет наибольшее количество знакомых. Данные способы познакомить людей не являются единственными правильными.

E. AmShZ и G.O.A.T.

Бинарный поиск жадные алгоритмы математика Перебор реализация *2300

Назовем массив из \(k\) целых чисел \(c_1, c_2, \ldots, c_k\) ужасным, если выполняется следующее условие:

  • Пусть \(AVG\) — это \(\frac{c_1 + c_2 + \ldots + c_k}{k}\) (то есть среднее значение всех элементов массива, не обязательно целое). Тогда количество элементов массива, которые больше \(AVG\), должно быть строго больше количества элементов массива, которые меньше \(AVG\). Обратите внимание, что элементы, равные \(AVG\), не учитываются.

    Например, \(c = \{1, 4, 4, 5, 6\}\) является ужасным, потому что \(AVG = 4.0\) и \(5\)-й и \(4\)-й элементы больше \(AVG\), а \(1\)-й элемент меньше \(AVG\).

Назовем массив из \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) плохим, если хотя бы одна из его непустых подпоследовательностей ужасна, и хорошим в противном случае.

Вам дан массив из \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Найдите минимальное количество элементов, которые нужно удалить из него, чтобы получить хороший массив.

Массив является подпоследовательностью другого массива, если он может быть получен из него путем удаления нескольких (возможно, нуля или всех) элементов.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — размер \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — элементы массива \(a\).

В каждом наборе входных данных для любого \(1 \le i \lt n\) гарантируется, что \(a_i \le a_{i+1}\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество элементов, которые нужно удалить из него, чтобы получить хороший массив.

Примечание

В первом примере массив \(a\) уже хороший.

Во втором примере достаточно удалить \(1\), получив массив \([4, 4, 5, 6]\), который является хорошим.

A. Длинное сравнение

математика реализация *900

Монокарп выписал на доске два числа. Оба заданы в следующем формате: положительное целое число \(x\), к концу которому приписаны \(p\) нулей.

Теперь Монокарп просит вас сравнить эти два числа. Можете ему помочь?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(x_1\) и \(p_1\) (\(1 \le x_1 \le 10^6; 0 \le p_1 \le 10^6\)) — описание первого числа.

Во второй строке каждого набора входных данных записаны два целых числа \(x_2\) и \(p_2\) (\(1 \le x_2 \le 10^6; 0 \le p_2 \le 10^6\)) — описание второго числа.

Выходные данные

На каждый набор входных данных выведите результат сравнения двух данных чисел. Если первое число меньше второго, то выведите '<'. Если первое число больше второго, то выведите '>'. Если они равны, то выведите '='.

Примечание

Сравнения в примере: \(20 > 19\), \(1000 = 1000\), \(1999 < 2000\), \(1 = 1\), \(99 < 100\).

B. Отсутствующий остаток

жадные алгоритмы реализация сортировки *1000

Задана последовательность \(a_1, a_2, \dots, a_n\), состоящая из \(n\) попарно различных положительных чисел.

Найдите \(\left\lfloor \frac n 2 \right\rfloor\) различных пар целых чисел \(x\) и \(y\) таких, что:

  • \(x \neq y\);
  • \(x\) и \(y\) встречаются в \(a\);
  • \(x~mod~y\) не встречается в \(a\).

Обратите внимание, что некоторые \(x\) или \(y\) могут входить в несколько пар.

\(\lfloor x \rfloor\) обозначает функцию округления вниз — наибольшее целое число меньше либо равное \(x\). \(x~mod~y\) обозначает остаток от деления \(x\) на \(y\).

Если существует несколько решений, выведите любое из них. Можно показать, что решение всегда существует.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — длина последовательности.

Во второй строке каждого набора входных данных записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^6\)).

Все числа в последовательности попарно различные. Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Ответ на каждый набор входных данных должен содержать \(\left\lfloor \frac n 2 \right\rfloor\) различных пар целых чисел \(x\) и \(y\) таких, что \(x \neq y\), \(x\) и \(y\) встречаются в \(a\) и \(x~mod~y\) не встречается в \(a\). Выведите пары одну за другой.

Можно выводить пары в любом порядке. Однако, внутри пары числа должны быть такие, что первое число — это \(x\), а второе число — это \(y\). Все пары должны быть попарно различны.

Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных существует только две пары: \((1, 4)\) и \((4, 1)\). \(\left\lfloor \frac 2 2 \right\rfloor=1\), поэтому надо найти одну пару. \(1~mod~4=1\), и \(1\) встречается в \(a\), поэтому такая пара некорректная. Поэтому единственный возможный ответ — это пара \((4, 1)\).

Во втором наборе входных данных мы выбрали пары \(8~mod~2=0\) и \(8~mod~4=0\). \(0\) не входит в \(a\), поэтому такой ответ правильный. В данном тесте существуют несколько решений.

В третьем наборе входных данных выбранные пары — \(9~mod~5=4\) и \(7~mod~5=2\). Ни \(4\), ни \(2\) не встречаются в \(a\), поэтому такой ответ правильный.

A. Целочисленное разнообразие

реализация *800

Вам даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Вы можете выбрать любое подмножество этих чисел (возможно, ни одного или все) и поменять их знак (т. е. поменять \(x \to (-x)\)). Какое наибольшее количество различных чисел может получиться после такой операции?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)): количество наборов входных данных.

Далее следуют описания \(t\) наборов входных данных, по две строки на набор.

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 100\)): количество чисел.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-100 \leq a_i \leq 100\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число: максимальное количество различных чисел, которое можно достичь, меняя знаки у чисел.

Примечание

В первом примере мы можем, например, изменить знаки у первого и последнего числа, получив массив \([-1, 1, 2, -2]\) с четырьмя различными значениями.

Во втором примере все три числа уже различны.

В третьем примере смена знаков ничего не меняет.

C. Репрезентативные края

геометрия математика Перебор реализация *1500

Массив \(a_1, a_2, \ldots, a_n\) называется хорошим, если и только если для любого подотрезка \(1 \leq l \leq r \leq n\), выполняется следующее: \(a_l + a_{l + 1} + \ldots + a_r = \frac{1}{2}(a_l + a_r) \cdot (r - l + 1)\).

Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\). За одну операцию вы можете заменить один любой элемент массива на любое вещественное число. Определите минимальное число операций, необходимое, чтобы сделать массив хорошим.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)): количество наборов входных данных.

Далее следуют описания \(t\) наборов входных данных, по две строки на набор.

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 70\)): количество чисел в массиве.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-100 \leq a_i \leq 100\)): изначальный массив.

Выходные данные

Для каждого набора входных данных выведите одно целое число: минимальное число элементов, которое нужно заменить, чтобы массив стал хорошим.

Примечание

В первом примере массив хороший изначально.

Во втором примере один из возможных хороших массивов — \([1, 1, \underline{1}, \underline{1}]\) (замененные элементы подчеркнуты).

В третьем примере массив хороший изначальное.

Во четвертом примере один из возможных хороших массивов — \([\underline{-2.5}, -2, \underline{-1.5}, -1, \underline{-0.5}, 0]\).

D1. Слишком много предателей (простая версия)

интерактив Конструктив реализация *1800

Это интерактивная задача. Единственным различием между лёгкой и сложной версиями является ограничение на количество запросов.

Есть \(n\) игроков, пронумерованных \(1\) до \(n\). Гарантируется, что \(n\) кратно \(3\).

Среди них присутствуют \(k\) предателей и \(n-k\) друзей. Количество предателей \(k\) вам не дано. Гарантируется, что \(\frac{n}{3} < k < \frac{2n}{3}\).

За один запрос вы можете выбрать три различных числа \(a\), \(b\), \(c\) (\(1 \le a, b, c \le n\)) и спросить: «Среди игроков с номерами \(a\), \(b\) и \(c\) больше предателей или друзей?» В качестве ответа на запрос вам будет дан \(0\), если предателей больше, чем друзей, и \(1\) в противном случае.

Найдите количество предателей \(k\) и номера игроков, которые являются предателями, сделав не более \(2n\) запросов.

Жюри будет отвечать адаптивно, что означает, что индексы предателей не обязательно зафиксированы заранее и могут меняться в зависимости от ваших запросов. Гарантируется, что существует хотя бы один набор предателей, который удовлетворяет ограничениям и ответам на ваши запросы в любой момент времени.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит единственное число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит единственное целое число \(n\) (\(6 \le n < 10^4\), \(n\) кратно \(3\)) — количество игроков.

Гарантируется, что сумма по \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^4\).

Протокол взаимодействия

Взаимодействие начинается со считывания \(n\).

Вам разрешено сделать не более \(2n\) запросов следующим образом:

«? a b c» (\(1 \le a, b, c \le n\), \(a\), \(b\) и \(c\) попарно различны).

После каждого запроса вы должны считать число \(r\), которое равно \(0\), если среди игроков с номерами \(a\), \(b\) и \(c\) больше предателей, чем друзей, и равно \(1\) в противном случае.

Ответ \(-1\) вместо \(0\) или \(1\) означает, что вы сделали некорректный запрос или превысили ограничение на количество запросов. Ваша программа должна немедленно завершиться, после прочтения ответа \(-1\) и вы получите вердикт Неправильный ответ. В противном случае вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока.

Когда вы нашли номера всех предателей, выведите единственную строку «! » (без кавычек), затем количество предателей \(k\), а затем \(k\) целых чисел, обозначающих номера предателей. Пожалуйста, обратите внимание, что вы должны вывести всю эту информацию на одной строке.

После вывода ответа ваша программа должна продолжить решать оставшиеся наборы входных данных или завершить работу, если все наборы входных данных были решены.

После вывода запросов не забудьте вывести символ перевода строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Вы не можете делать взломы по этой задаче.

Примечание

Пояснение к примеру взаимодействия (обратите внимание, что показанное в примере взаимодействие лишь иллюстрирует формат взаимодействия, и не демонстрирует решение задачи):

Первый набор входных данных:

Запрос «? 1 2 3» возвращает \(0\), так как среди игроков \(1\), \(2\) и \(3\) предателей больше, чем друзей.

Запрос «? 3 4 5» возвращает \(1\), так как среди игроков \(3\), \(4\) и \(5\) друзей больше, чем предателей.

Вывод «! 3 4 1 2» означает, что были найдены все предатели. Всего есть \(k = 3\) предателей. Игроки, являющиеся предателями, имеют номера \(4\), \(1\) и \(2\).

Второй набор входных данных:

Запрос «? 7 1 9» возвращает \(1\), так как среди игроков \(7\), \(1\) и \(9\) друзей больше, чем предателей.

Вывод «! 4 2 3 6 8» означает, что были найдены все предатели. Всего есть \(k = 4\) предателей. Игроки, являющиеся предателями, имеют номера \(2\), \(3\), \(6\) и \(8\).

D2. Слишком много предателей (сложная версия)

интерактив Конструктив математика реализация *2400

Это интерактивная задача. Единственным различием между лёгкой и сложной версиями является ограничение на количество запросов.

Есть \(n\) игроков, пронумерованных \(1\) до \(n\). Гарантируется, что \(n\) кратно \(3\).

Среди них присутствуют \(k\) предателей и \(n-k\) друзей. Количество предателей \(k\) вам не дано. Гарантируется, что \(\frac{n}{3} < k < \frac{2n}{3}\).

За один запрос вы можете выбрать три различных числа \(a\), \(b\), \(c\) (\(1 \le a, b, c \le n\)) и спросить: «Среди игроков с номерами \(a\), \(b\) и \(c\) больше предателей или друзей?» В качестве ответа на запрос вам будет дан \(0\), если предателей больше, чем друзей, и \(1\) в противном случае.

Найдите количество предателей \(k\) и номера игроков, которые являются предателями, сделав не более \(n+6\) запросов.

Жюри будет отвечать адаптивно, что означает, что индексы предателей не обязательно зафиксированы заранее и могут меняться в зависимости от ваших запросов. Гарантируется, что существует хотя бы один набор предателей, который удовлетворяет ограничениям и ответам на ваши запросы в любой момент времени.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит единственное число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит единственное целое число \(n\) (\(6 \le n < 10^4\), \(n\) кратно \(3\)) — количество игроков.

Гарантируется, что сумма по \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^4\).

Протокол взаимодействия

Взаимодействие начинается со считывания \(n\).

Вам разрешено сделать не более \(n+6\) запросов следующим образом:

«? a b c» (\(1 \le a, b, c \le n\), \(a\), \(b\) и \(c\) попарно различны).

После каждого запроса вы должны считать число \(r\), которое равно \(0\), если среди игроков с номерами \(a\), \(b\) и \(c\) больше предателей, чем друзей, и равно \(1\) в противном случае.

Ответ \(-1\) вместо \(0\) или \(1\) означает, что вы сделали некорректный запрос или превысили ограничение на количество запросов. Ваша программа должна немедленно завершиться, после прочтения ответа \(-1\) и вы получите вердикт Неправильный ответ. В противном случае вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока.

Когда вы нашли номера всех предателей, выведите единственную строку «! » (без кавычек), затем количество предателей \(k\), а затем \(k\) целых чисел, обозначающих номера предателей. Пожалуйста, обратите внимание, что вы должны вывести всю эту информацию на одной строке.

После вывода ответа ваша программа должна продолжить решать оставшиеся наборы входных данных или завершить работу, если все наборы входных данных были решены.

После вывода запросов не забудьте вывести символ перевода строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Вы не можете делать взломы по этой задаче.

Примечание

Пояснение к примеру взаимодействия (обратите внимание, что показанное в примере взаимодействие лишь иллюстрирует формат взаимодействия, и не демонстрирует решение задачи):

Первый набор входных данных:

Запрос «? 1 2 3» возвращает \(0\), так как среди игроков \(1\), \(2\) и \(3\) предателей больше, чем друзей.

Запрос «? 3 4 5» возвращает \(1\), так как среди игроков \(3\), \(4\) и \(5\) друзей больше, чем предателей.

Вывод «! 3 4 1 2» означает, что были найдены все предатели. Всего есть \(k = 3\) предателей. Игроки, являющиеся предателями, имеют номера \(4\), \(1\) и \(2\).

Второй набор входных данных:

Запрос «? 7 1 9» возвращает \(1\), так как среди игроков \(7\), \(1\) и \(9\) друзей больше, чем предателей.

Вывод «! 4 2 3 6 8» означает, что были найдены все предатели. Всего есть \(k = 4\) предателей. Игроки, являющиеся предателями, имеют номера \(2\), \(3\), \(6\) и \(8\).

E. Новогодние конфеты

графы Деревья дп игры кратчайшие пути математика поиск в глубину и подобное реализация теория чисел *2700

Лунный Новый год приближается, и Льдинка только что получила коробку конфет от бабушки с дедушкой! Коробка содержит \(n\) конфет. \(i\)-я конфета имеет вкус \(a_i\).

Льдинка верит, что хорошие вещи случаются парами. К сожалению, вкусы всех конфет попарно различны (все \(a_i\) различны). Льдинка хочет сделать равные вкусы хотя бы у одной пары конфет.

Поэтому она попросила бабушку с дедушкой выполнить несколько замен. Перед выполнением замен Льдинка выбирает две конфеты с номерами \(x\) и \(y\) (\(1 \le x, y \le n\), \(x \ne y\)).

За одну замену дедушка и бабушка Льдинки выбирают неотрицательное целое число \(k\) такое, что \(2^k \ge a_x\), и заменяют вкус \(x\)-й конфеты с \(a_x\) на \(2^k - a_x\) (то есть, присваивают \(a_x := 2^k - a_x\)).

Замены прекратятся только при условии, что \(a_x = a_y\). Заметьте, что другие пары равных по вкусу конфет не остановят процесс.

У Льдинки умные бабушка и дедушка, поэтому они выберут такую последовательность замен, которая минимизирует количество требуемых замен. Поскольку Льдинка любит доставлять неприятности, она хочет максимизировать минимальное требуемое количество замен, выбрав соответствующие \(x\) и \(y\). Она задаётся вопросом, как выбрать такую пару \((x, y)\), что минимальное требуемое количество замен максимально среди всех возможных пар \((x, y)\).

Так как у Льдинки не очень хорошо с математикой, она надеется, что вы поможете ей решить эту задачу.

Входные данные

Первая строка ввода содержит единственное целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество конфет.

Вторая строка ввода содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^9\)).

Гарантируется, что все \(a_i\) различны.

Выходные данные

Выведите три целых числа \(x\), \(y\) и \(m\).

\(x\) и \(y\) являются номерами оптимальных конфет для применения замен. Ваш ответ должен удовлетворять \(1 \le x, y \le n\), \(x \ne y\).

\(m\) является минимальным количеством замен, чтобы сделать \(a_x = a_y\). Можно показать, что \(m \le 10^9\) для любой пары конфет.

Примечание

В первом тесте минимальное количество замен, требуемое, чтобы заменить конфету со вкусом \(6\) на конфету со вкусом \(9\), является \(5\). Последовательность замен следующая: \(6 \rightarrow 2 \rightarrow 0 \rightarrow 1 \rightarrow 7 \rightarrow 9\).

Во втором тесте минимальное количество замен, требуемое, чтобы заменить конфету со вкусом \(4\) на конфету со вкусом \(8\), является \(2\). Последовательность замен следующая: \(4 \rightarrow 0 \rightarrow 8\).

B. Потерянная биграмма

реализация *800

Поликарп придумал новую игру, в которую он хочет поиграть с вами. Он называет ее «Потерянная биграмма».

Биграмма слова — это последовательность двух подряд идущих в нем букв.

Например, слово «abbaaba» содержит биграммы «ab», «bb», «ba», «aa», «ab» и «ba».

Процесс игры следующий. Сначала Поликарп придумывает слово, состоящее только из строчных букв 'a' и 'b'. Затем он выписывает все его биграммы на доске в том же порядке, в котором они идут в строке. После этого он стирает одну из них с доски.

Наконец, Поликарп приглашает вас угадать, какое слово он загадывал.

Ваша цель — найти любое такое слово, что можно выписать все его биграммы и удалить одну так, чтобы полученная последовательность биграмм совпадала с той, которая получилась у Поликарпа.

Тесты сгенерированы таким образом, что ответ существует. Если существует несколько ответов, то выведите любой из них.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 2000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(3 \le n \le 100\)) — длина слова, которое загадал Поликарп.

Во второй строке каждого набора входных данных записаны \(n-2\) биграммы этого слова, разделенные одним пробелом. Каждая биграмма состоит из двух букв, каждая из них — либо 'a', либо 'b'.

Дополнительное ограничение на входные данные: существует строка, для которой можно выписать все ее биграммы и удалить одну так, чтобы получилась заданная последовательность биграмм. Другими словами, ответ существует.

Выходные данные

На каждый набор входных данных выведите одно слово из \(n\) букв, каждая из них должна быть либо 'a', либо 'b'. Должно быть возможно выписать все его биграммы и удалить одну так, чтобы полученная последовательность биграмм совпадала с той, которая получилась у Поликарпа (которая дана во входных данных).

Тесты сгенерированы таким образом, что ответ существует. Если существует несколько ответов, то выведите любой из них.

Примечание

Первые два набора входных данных из примера получены из слова «abbaaba». Как приведено в условии, оно содержит биграммы «ab», «bb», «ba», «aa», «ab» и «ba».

В первом наборе входных данных удалена \(5\)-я биграмма.

Во втором наборе входных данных удалена \(2\)-я биграмма. Однако, такая последовательность могла быть получена и из слова «abaabaa». Оно содержит биграммы «ab», «ba», «aa», «ab», «ba» и «aa». Отсутствующая биграмма – \(6\)-я.

В третьем наборе входных данных все слова из «baa», «aab» and «aaa» — правильные ответы.

F. Развороты

битмаски Конструктив математика поиск в глубину и подобное реализация Строки *2000

Вам даны два целых положительных числа \(x\) и \(y\). Вы можете совершать с числом \(x\) следующую операцию: записать его в двоичном виде без ведущих нулей, приписать справа \(0\) или \(1\), затем развернуть двоичную запись и превратить ее в десятичное число, которое окажется новым значением \(x\).

Например:

  • \(34\) можно одной операцией превратить в \(81\): двоичная запись \(34\) — это \(100010\), если приписать справа \(1\), развернуть и убрать ведущие нули, можно получить \(1010001\), что является двоичной записью числа \(81\);
  • \(34\) можно одной операцией превратить в \(17\): двоичная запись \(34\) — это \(100010\), если приписать справа \(0\), развернуть и убрать ведущие нули, можно получить \(10001\), что является двоичной записью числа \(17\);
  • \(81\) можно одной операцией превратить в \(69\): двоичная запись \(81\) — это \(1010001\), если приписать справа \(0\), развернуть и убрать ведущие нули, можно получить \(1000101\), что является двоичной записью числа \(69\);
  • \(34\) можно превратить в \(69\) за две операции: сначала превратить \(34\) в \(81\), а потом превратить \(81\) в \(69\).

Ваша задача — выяснить, можно ли превратить \(x\) в \(y\) за какое-то (возможно, нулевое) число операций.

Входные данные

Единственная строка входных данных содержит два целых числа \(x\) и \(y\) (\(1 \le x, y \le 10^{18}\)).

Выходные данные

Выведите YES, если вы можете сделать \(x\) равным \(y\), или NO, если это невозможно.

Примечание

В первом примере не надо совершать никаких действий.

Четвертый пример разобран в условии задачи.

A. Квадратная строка?

реализация Строки *800

Строка называется квадратной, если она состоит из двух одинаковых половин, записанных дважды подряд. Например, строки «aa», «abcabc», «abab» и «baabaa» — квадратные. Строки «aaa», «abaaab» и «abcdabc» квадратными не являются.

Для заданной строки \(s\) определите, является ли она квадратной.

Входные данные

В первое строке входных данных записано целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных в тесте.

Далее следует \(t\) строк, каждая содержит описание одного набора входных данных. Заданные строки состоят только из строчных букв латинского алфавита, имеют длины от \(1\) до \(100\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите:

  • YES, если строка во наборе входных данных является квадратной,
  • NO в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

B. Квадраты и кубы

математика реализация *800

Поликарп очень любит квадраты и кубы положительных целых чисел. Вот начало ряда чисел, которые ему нравятся: \(1\), \(4\), \(8\), \(9\), ....

Для заданного числа \(n\) посчитайте количество чисел от \(1\) до \(n\), которые нравятся Поликарпу. Иными словами, найдите количество таких \(x\), что \(x\) является квадратом натурального числа или кубом натурального числа (или и квадратом и кубом одновременно).

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 20\)) — количество наборов входных данных в тесте.

Далее в \(t\) строках записаны наборы входных данных по одному в строке. Каждая из строк содержит одно целое число \(n\) (\(1 \le n \le 10^9\)).

Выходные данные

Для каждого набора входных данных выведите искомый ответ — количество чисел от \(1\) до \(n\), которые нравятся Поликарпу.

C. Неправильное сложение

реализация *1200

Таня учится складывать числа столбиком, но пока что делает это неправильно. Она складывает два числа \(a\) и \(b\) по следующему алгоритму:

  1. Если одно из чисел число короче, чем другое, то Таня дописывает в его начало нули таким образом, чтобы числа оказалиcь одинаковыми по длине.
  2. Цифры обрабатываются справа налево (то есть от наименее значимых цифр к наиболее значимым).
  3. На первом шаге она складывает последнюю цифру числа \(a\) с последней цифрой числа \(b\) и записывает в ответ их сумму.
  4. На каждом следующем шаге она производит ту же самую операцию с каждой парой цифр, стоящих в одном разряде, приписывая результат каждый раз слева.

Например, числа \(a = 17236\) и \(b = 3465\) Таня сложит следующим образом:

\(\) \large{ \begin{array}{r} + \begin{array}{r} 17236\\ 03465\\ \end{array} \\ \hline \begin{array}{r} 1106911 \end{array} \end{array}} \(\)

  • сложит \(6 + 5 = 11\) и запишет в ответ \(11\).
  • сложит \(3 + 6 = 9\) и допишет результат слева к ответу, получит \(911\).
  • сложит \(2 + 4 = 6\) и допишет результат слева к ответу, получит \(6911\).
  • сложит \(7 + 3 = 10\) и допишет результат слева к ответу, получит \(106911\).
  • сложит \(1 + 0 = 1\) и допишет результат слева к ответу, получит \(1106911\).

В результате сложения она получит \(1106911\).

Вам задано два целых положительных числа \(a\) и \(s\). Найдите такое число \(b\), что, сложив числа \(a\) и \(b\) как описано выше, Таня получит \(s\). Или определите, что подходящего \(b\) не существует.

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Каждый набор входных данных состоит из единственной строки, содержащей два целых положительных числа \(a\) и \(s\) (\(1 \le a \lt s \le 10^{18}\)), разделенных пробелом.

Выходные данные

Для каждого набора входных данных выведите ответ на отдельной строке.

Если решение существует, то выведите единственное целое положительное число \(b\). Ответ должен быть записан без ведущих нулей. Если существует несколько ответов, выведите любой из них.

Если же подходящего числа \(b\) не существует, то выведите -1.

Примечание

Первый набор входных разобран в основной части условия.

В третьем наборе входных данных нельзя подобрать \(b\), удовлетворяющее условию задачи.

E. MEX и инкременты

дп жадные алгоритмы Конструктив математика реализация сортировки Структуры данных *1700

У Дмитрия есть массив из \(n\) неотрицательных целых чисел \(a_1, a_2, \dots, a_n\).

За одну операцию он может выбрать произвольный индекс \(j\) (\(1 \le j \le n\)) и увеличить значение элемента \(a_j\) на \(1\). Он может выбирать один и тот же индекс \(j\) многократно.

Для каждого \(i\) от \(0\) до \(n\) определите, сможет ли Дмитрий сделать \(\mathrm{MEX}\) массива равным ровно \(i\). Если сможет, то определите, за какое минимальное количество операций.

\(\mathrm{MEX}\) массива равен минимальному целому неотрицательному числу, которого нет в массиве. Например, \(\mathrm{MEX}\) массива \([3, 1, 0]\) равен \(2\), а массива \([3, 3, 1, 4]\)\(0\).

Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину массива \(a\).

Вторая строка описания каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le n\)) — элементы массива \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n + 1\) целое число — \(i\)-е число равно минимальному числу операций, за которое можно сделать \(\mathrm{MEX}\) массива равным \(i\) (\(0 \le i \le n\)), или -1, если этого сделать нельзя.

Примечание

В первом наборе входных данных примера \(n=3\):

  • чтобы получить \(\mathrm{MEX}=0\), достаточно выполнить один инкремент: \(a_1\)++;
  • чтобы получить \(\mathrm{MEX}=1\), достаточно выполнить один инкремент: \(a_2\)++;
  • \(\mathrm{MEX}=2\) для заданного массива, поэтому выполнять инкременты не надо;
  • получить \(\mathrm{MEX}=3\), выполняя инкременты, невозможно.

A. Пятиугольные числа

*особая задача реализация *1100

Пятиугольные числа — фигурные числа, которые можно вычислить по следующей формуле: pn = (3n2 - n) / 2 (всегда целое). Вам дан номер n; вычислите n-ое пятиугольное число.

Входные данные

Единственная строка входных данных содержит целое число n (1 ≤ n ≤ 100).

Выходные данные

Выведите n-ое пятиугольное число.

A. Равно или не равно

Конструктив реализация снм *800

У вас были \(n\) положительных целых чисел \(a_1, a_2, \dots, a_n\), записанных по кругу. Для каждой пары соседних элементов (\(a_1\) и \(a_2\), \(a_2\) и \(a_3\), ..., \(a_{n - 1}\) и \(a_n\), и \(a_n\) и \(a_1\)) вы выписали следующее: равны ли элементы в паре или нет.

К сожалению, вы потеряли бумажку с записанным массивом \(a\). Более того, вы боитесь, что и информация о равенстве соседних элементов могла быть повреждена. А потому вас интересует: существует ли массив \(a\), который согласовывается с вашей информацией о равенстве (или неравенстве) соседних элементов?

Входные данные

В первой строке каждого набора задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой и единственной строке каждого набора задана непустая строка \(s\), состоящая из букв E и/или N. Длина строки \(s\) равна размеру массива \(n\) и \(2 \le n \le 50\). Для каждого \(i\) от \(1\) по \(n\):

  • если \(s_i =\) E, то \(a_i\) равно \(a_{i + 1}\) (\(a_n = a_1\) для \(i = n\));
  • если \(s_i =\) N, то \(a_i\) не равно \(a_{i + 1}\) (\(a_n \neq a_1\) для \(i = n\)).
Выходные данные

Для каждого набора входных данных, выведите YES, если возможно подобрать массив \(a\), который согласуется с вашей информацией из строки \(s\). Иначе, выведите NO.

Можно доказать, что если существует какой-то подходящий массив \(a\), то существует также массив \(a\) из положительных целых чисел меньше или равных \(10^9\).

Примечание

В первом наборе входных данных, вы можете выбрать, например, \(a_1 = a_2 = a_3 = 5\).

Во втором наборе, не существует подходящего массива \(a\), так как, согласно \(s_1\), \(a_1\) равно \(a_2\), но, согласно \(s_2\), \(a_2\) не равно \(a_1\).

В третьем наборе, вы можете, например, выбрать массив \(a = [20, 20, 4, 50, 50, 50, 20]\).

Во четвертом наборе, вы можете, например, выбрать массив \(a = [1, 3, 3, 7]\).

C. BA-строка

дп жадные алгоритмы математика Перебор реализация *1800

Заданы целое число \(k\) и строка \(s\), которая состоит только из символов 'a' (строчная латинская буква) и '*' (звездочка).

Каждая звездочка должна быть заменена на несколько (от \(0\) до \(k\) включительно) строчных латинских букв 'b'. Разные звездочки можно заменить на разные количества букв 'b'.

Результат замены называется BA-строкой.

Две строки \(a\) и \(b\) различные, если у них либо различная длина, либо существует такая позиция \(i\), что \(a_i \neq b_i\).

Строка \(a\) лексикографически меньше строки \(b\), если и только если выполняется один из следующих пунктов:

  • \(a\) — префикс \(b\), но \(a \ne b\);
  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).

Рассмотрите все различные BA-строки и найдите из них \(x\)-ю лексикографически наименьшую.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 2000\)) — количество наборов входных данных.

Во первой строке каждого набора входных данных записаны три целых числа \(n\), \(k\) and \(x\) (\(1 \le n \le 2000\); \(0 \le k \le 2000\); \(1 \le x \le 10^{18}\)). \(n\) — это длина строка \(s\).

Во второй строке каждого набора входных данных содержится строка \(s\). Она состоит из \(n\) символов, каждый из них — либо 'a' (строчная латинская буква), либо '*' (звездочка).

Сумма \(n\) по всем наборам входных данных не превосходит \(2000\). В каждом наборе входных данных \(x\) не превосходит количество различных BA-строк. Строка \(s\) содержит хотя бы один символ 'a'.

Выходные данные

На каждый набор входных данных выведите одну строку, состоящую из символов 'b' и 'a' (строчные латинские буквы) — \(x\)-ю лексикографически наименьшую BA-строку.

Примечание

В первом наборе входных данных примера BA-строки, упорядоченные лексикографически, следующие:

  1. a
  2. ab
  3. abb
  4. abbb
  5. abbbb

Во втором наборе входных данных примера BA-строки, упорядоченные лексикографически, следующие:

  1. aa
  2. aba
  3. abba

Обратите внимание, что строка «aba» считается только один раз, хотя и есть два способа заменить звездочки на символы 'b' так, чтобы ее получить.

E. Замена чисел

Конструктив реализация снм Структуры данных *1900

У вас есть массив целых чисел (изначально пустой).

Вам предстоит выполнить \(q\) запросов. Каждый запрос имеет один из двух типов:

  • «\(1\) \(x\)» — добавить элемент \(x\) в конец массива;
  • «\(2\) \(x\) \(y\)» — заменить все вхождения \(x\) в массиве на \(y\).

Найдите массив, получившийся после выполнения всех запросов.

Входные данные

Первая строка содержит одно целое число \(q\) (\(1 \le q \le 5 \cdot 10^5\)) — количество запросов.

Следующие \(q\) строк содержат запросы (по одному на строку). Каждый запрос имеет один из двух типов:

  • «\(1\) \(x\)» (\(1 \le x \le 5 \cdot 10^5\));
  • «\(2\) \(x\) \(y\)» (\(1 \le x, y \le 5 \cdot 10^5\)).

Гарантируется, что есть хотя бы один запрос первого типа.

Выходные данные

В единственную строку выведите \(k\) целых чисел — массив, получившийся после выполнения всех запросов, где \(k\) — количество запросов первого типа.

Примечание

В первом примере из условия массив меняется следующим образом:

\([]\) \(\rightarrow\) \([3]\) \(\rightarrow\) \([3, 1]\) \(\rightarrow\) \([3, 2]\) \(\rightarrow\) \([3, 2, 2]\) \(\rightarrow\) \([3, 2, 2, 1]\) \(\rightarrow\) \([3, 2, 2, 1, 2]\) \(\rightarrow\) \([3, 2, 2, 3, 2]\).

Во втором примере из условия массив меняется следующим образом:

\([]\) \(\rightarrow\) \([1]\) \(\rightarrow\) \([1, 2]\) \(\rightarrow\) \([1, 2, 1]\) \(\rightarrow\) \([1, 2, 1]\).

В третьем примере из условия массив меняется следующим образом:

\([]\) \(\rightarrow\) \([]\) \(\rightarrow\) \([1]\) \(\rightarrow\) \([1, 4]\) \(\rightarrow\) \([1, 4, 2]\) \(\rightarrow\) \([1, 4, 4]\) \(\rightarrow\) \([1, 3, 3]\) \(\rightarrow\) \([1, 3, 3, 2]\) \(\rightarrow\) \([1, 3, 3, 7]\).

B. Магазин целых чисел

жадные алгоритмы реализация Структуры данных *1500

Магазин целых чисел продаёт \(n\) отрезков, \(i\)-й из которых состоит из чисел от \(l_i\) до \(r_i\) и стоит \(c_i\) монет.

Завтра Вася отравится в этот магазин и купит несколько отрезков. Он получит все числа, лежащие хотя бы в одном из выбранных отрезков. Количество монет, которое он потратит на покупку равно сумме стоимостей отрезков, которые он купит.

В качестве подарка за покупку, Вася дополнительно получит ещё несколько целых чисел. Число \(x\), не купленное Васей ранее, он получит тогда и только тогда, когда для \(x\) выполняются два следующих условия:

  • Найдётся купленное Васей число \(l\), меньшее \(x\).
  • Найдётся купленное Васей число \(r\), большее \(x\).

Число \(x\) Вася может получить в подарок не более одного раза, таким образом все числа, которые получит Вася будут различными.

Например, если Вася купит отрезок \([2, 4]\) за \(20\) монет и отрезок \([7, 8]\) за \(22\) монеты, он потратит \(42\) монеты и получит числа \(2, 3, 4, 7, 8\) как содержимое отрезков. В качестве подарка он получит числа \(5\) и \(6\).

По техническим причинам, завтра в магазине будут доступны к покупке только \(s\) первых отрезков (то есть отрезки \([l_1, r_1], [l_2, r_2], \ldots, [l_s, r_s]\)). Вася не сможет купить отрезки, не доступные к покупке.

Вася хочет получить (купить или получить в подарок) как можно больше целых чисел. Если это можно сделать разными способами, то он выберет самый дешёвый из них.

Для всех значений \(s\) от \(1\) до \(n\) определите, сколько монет потратит Вася, если к покупке будут доступны только \(s\) первых отрезков.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано одно число \(n\) (\(1 \leq n \leq 10^5\)) — количество отрезков в магазине.

В следующих \(n\) строках дано по три числа \(l_i\), \(r_i\), \(c_i\) (\(1 \leq l_i \leq r_i \leq 10^9, 1 \leq c_i \leq 10^9\)) — концы \(i\)-го отрезка и его стоимость.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) чисел: \(s\)-е (\(1 \leq s \leq n\)) из них должно быть равно количеству монет, которое потратит Вася, если к покупке будут доступны только первые \(s\) отрезков.

Примечание

В первом наборе входных данных при \(s = 1\) Вася может купить только один отрезок \([2, 4]\) за \(20\) монет и получить \(3\) числа.

Способ получить \(7\) чисел за \(42\) монеты при \(s = 2\) описан в условии.

Во втором наборе входных данных обратите внимание на то, что в магазине могут быть одинаковые отрезки.

E. Новая школа

Бинарный поиск дп жадные алгоритмы реализация сортировки Структуры данных *2300

Вы решили открыть новую школу. Вы уже нашли \(n\) преподавателей и \(m\) групп учеников. Группа учеников \(i\) состоит из \(k_i \geq 2\) учеников. Вы знаете возраста всех преподавателей и всех учеников. Возраста преподавателей равны \(a_1, a_2, \ldots, a_n\), а возраста учеников в \(i\)-й группе равны \(b_{i, 1}, b_{i, 2}, \ldots, b_{i, k_i}\).

Чтобы начать занятия, осталось лишь назначить каждой группе учеников преподавателя. При этом должны выполняться следующие условия:

  • Каждой группе учеников назначен ровно один из преподавателей.
  • Каждому преподавателю назначено не более \(1\) группы учеников.
  • Для каждой группы, cреднее арифметическое возрастов учеников группы не превосходит возраста назначенного этой группе преподавателя.

Средним арифметическим множества \(x_1, x_2, \ldots, x_k\) из \(k\) чисел является значение \(\frac{x_1 + x_2 + \ldots + x_k}{k}\).

Недавно Вы узнали, что один из учеников решил отказаться от обучения в Вашей школе. После его отказа размер одной из групп учеников уменьшится на \(1\), все остальные группы останутся без изменений.

Вы не знаете, кто именно решил отказаться от обучения. Для каждого ученика определите, сможете ли Вы начать занятия в случае его отказа.

Обратите внимание, что не гарантируется, что до отказа ученика от обучения, было возможно начать занятия.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано два числа \(n\) и \(m\) (\(1 \leq m \leq n \leq 10^5\)) — количество преподавателей и количество групп учеников.

Во второй строке дано \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^5\)) — возраста преподавателей.

В следующих \(2m\) строках содержатся описания групп.

В первой строке описания группы дано одно число \(k_i\) (\(2 \leq k_i \leq 10^5\)) — количество учеников в группе.

Во второй строке описания группы дано \(k_i\) целых чисел \(b_{i, 1}, b_{i, 2}, \ldots, b_{i, k_i}\) (\(1 \leq b_{i, j} \leq 10^5\)) — возраста учеников в этой группе.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\), и что сумма \(k_1 + k_2 + \ldots + k_m\) всех наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку длины \(k_1 + k_2 + \ldots + k_m\), состоящую из символов \(0\) и \(1\). \(i\)-й символ этой строки должен быть равен \(1\), если в случае отказа \(i\)-го ученика можно будет начать занятия, и равен \(0\) иначе.

Ученики пронумерованы целыми числами от \(1\) до \(k_1 + k_2 + \ldots + k_m\) в том порядке, в котором они встречаются во входных данных. Таким образом, ученики \(1\)-й группы имеют номера \(1\), \(2\), \(\ldots\), \(k_1\), ученики \(2\)-й группы имеют номера \(k_1 + 1\), \(k_1 + 2\), \(\ldots\), \(k_1 + k_2\) и так далее.

Примечание

В первом наборе входных данных есть одна группа учеников с средним возрастом \(\frac{25+16+37}{3}=26\) и один преподаватель с возрастом \(30\). Существует единственный способ назначить каждой группе учеников преподавателя и начать занятия.

Если ученик возраста \(16\) откажется от обучения, среднее арифметическое возрастов в группе станет равно \(\frac{25+37}{2}=31\), и не будет существовать способа назначить каждой группе учеников преподавателя.

Во втором наборе входных данных невозможно начать занятия изначально. Но если \(3\)-й ученик возраста \(111\) откажется от обучения, средние возраста учеников в группах станут равны \(\frac{4 + 5}{2}=4.5\) и \(\frac{11+11}{2} = 11\) соответственно. Тогда можно назначить первой группе первого преподавателя, а второй группе — третьего преподавателя.

F. Странные инструкции

жадные алгоритмы реализация Структуры данных *2700

У Даши есть \(10^{100}\) монет. Недавно она нашла бинарную строку \(s\) длины \(n\) и несколько операций, с помощью которых её можно изменять (каждую операцию можно делать сколько угодно раз):

  1. Заменить подстроку строки \(s\), равную 00, на 0 и получить \(a\) монет.
  2. Заменить подстроку строки \(s\), равную 11, на 1 и получить \(b\) монет.
  3. Удалить из строки \(s\) символ 0, заплатив за это \(c\) монет.

Оказалось, что при выполнении операций нужно соблюдать следующее правило:

  • Запрещается делать две операции с номерами одинаковой чётности подряд. Операции пронумерованы числами от \(1\) до \(3\) в порядке, в котором они даны выше.

Определите максимальное количество монет, которое Даша может получить делая эти операции и не нарушая правило.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано четыре целых числа \(n\), \(a\), \(b\), \(c\) (\(1 \leq n \leq 10^5, 1 \leq a, b, c \leq 10^9\)).

Во второй строке дана бинарная строка \(s\) длины \(n\).

Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ.

Примечание

В первом наборе входных данных одна из оптимальных последовательностей операций такая: 01101 \(\rightarrow\) 0101 \(\rightarrow\) 011 \(\rightarrow\) 01. Эта последовательность состоит из операций \(2\), \(3\) и \(2\) в таком порядке. Она удовлетворяет всем правилам и даёт \(3\) монеты. Можно показать, что нельзя получить больше монет, поэтому ответ \(3\).

Во втором наборе входных данных одна из оптимальных последовательностей операций такая: 110001 \(\rightarrow\) 11001 \(\rightarrow\) 1001 \(\rightarrow\) 101.

В третьем наборе входных данных одна из оптимальных последовательностей операций такая: 011110 \(\rightarrow\) 01110 \(\rightarrow\) 1110 \(\rightarrow\) 110 \(\rightarrow\) 11 \(\rightarrow\) 1.

A. Робот-пылесос

математика Перебор реализация *800

Робот-пылесос находится на полу прямоугольной комнаты, ограниченной стенами. Пол можно представить как таблицу из \(n\) строк и \(m\) столбцов. Строки пола пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы пронумерованы от \(1\) до \(m\) слева направо. Клетка на пересечении \(r\)-й строки и \(c\)-го столбца обозначается \((r,c)\). Изначально робот находится в клетке \((r_b, c_b)\).

Каждую секунду робот двигается на \(dr\) строк и \(dc\) столбцов, то за секунду робот передвигается из клетки \((r, c)\) в \((r + dr, c + dc)\). Изначально \(dr = 1\), \(dc = 1\). Если в направлении движения робота находится вертикальная стена (левая или правая), \(dc\) отражается перед движением, новое значение \(dc\) становится \(-dc\). Также, если в направлении движения робота находится горизонтальная стена (верхняя или нижняя), \(dr\) отражается перед движением, новое значение \(dr\) становится \(-dr\).

В начале каждой секунды (в том числе перед первым движением робота) робот очищает все клетки, лежащие в той же строке или в том же столбце, что и робот. В комнате лишь одна грязная клетка \((r_d, c_d)\). Задача робота — очистить эту грязную клетку.

Иллюстрация к первому примеру. Робот обозначен голубой дугой. Красной звездой обозначена грязная клетка. Каждую секунду робот очищает строку и столбец, что показано желтыми линиями.

По данному размеру пола \(n\) и \(m\), начальной позиции робота \((r_b, c_b)\) и позиции грязной клетки \((r_d, c_d)\) найдите, через какое время робот выполнит задачу.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Каждый набор входных данных описывается в одной строке шестью целыми числами \(n\), \(m\), \(r_b\), \(c_b\), \(r_d\) и \(c_d\) (\(1 \le n, m \le 100\), \(1 \le r_b, r_d \le n\), \(1 \le c_b, c_d \le m\)) — размерами комнаты, начальной позицией робота и позицией грязной клетки.

Выходные данные

Для каждого набора входных данных выведите одно целое число — время, необходимое роботу для очистки грязной клетки. Можно показать, что робот всегда очистит грязную клетку за конечное время.

Примечание

В первом примере размер пола равен \(10\times 10\). Начальная позиция робота \((6, 1)\), грязная клетка — \((2, 8)\). Иллюстрация к этому примеру находится в условии задачи.

Во втором примере пол такой же, но начальная позиция робота \((9, 9)\), а грязная клетка — \((1, 1)\). В этом примере робот дойдет точно до грязной клетки и очистит ее.

В третьем примере пол имеет размеры \(9 \times 8\). Начальная позиция робота \((5, 6)\), грязная клетка \((2, 1)\).

В четвертом примере пол имеет размеры \(6 \times 9\). Начальная позиция робота \((2, 2)\), грязная клетка \((5, 8)\).

В последнем примере робот изначально в том же столбце, что и грязная клетка, поэтому он ее сразу очистит.

B. Игра на отрезках

Перебор поиск в глубину и подобное реализация сортировки *1100

Алиса и Боб играют в следующую игру. У Алисы есть набор непересекающихся отрезков целых чисел \(S\), изначально содержащий только один отрезок \([1, n]\). За один ход Алиса выбирает некоторый отрезок \([l, r]\) из набора \(S\), а Боб выбирает некоторое число \(d\) из этого отрезка (\(l \le d \le r\)). Затем Алиса убирает \([l, r]\) из \(S\), и добавляет в \(S\) отрезки \([l, d - 1]\) (если \(l \le d - 1\)) и \([d + 1, r]\) (если \(d + 1 \le r\)). Игра заканчивается, когда \(S\) становится пустым. Можно показать, что количество шагов в такой игре всегда ровно \(n\).

После того, как игра была сыграна, Алиса запомнила все отрезки \([l, r]\), которые она доставала из набора \(S\), но Боб не запомнил ни одного числа, которые он выбирал. Но Боб умный и понимает, что числа \(d\) можно восстановить, используя отрезки, которые помнит Алиса, и просит вас помочь запрограммировать это.

По данному списку отрезков, которые Алиса доставала (\([l, r]\)) восстановите для каждого отрезка число \(d\), которое выбирал Боб.

Можно показать, что по данному списку отрезков всегда существует ровно один способ восстановить числа Боба.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 1000\)).

Каждая из следующих \(n\) строк содержит два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)), обозначающих, что Алиса в какой-то момент игры выбрала отрезок \([l, r]\).

Обратите внимание, что отрезки даны в произвольном порядке.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(1000\), а отрезки в каждом наборе входных данных соответствуют корректной игре.

Выходные данные

Для каждого набора входных данных выведите \(n\) строк. Каждая строка должна содержать три целых числа \(l\), \(r\) и \(d\), обозначающих, что для отрезка Алисы \([l, r]\) Боб выбрал число \(d\).

Вы можете выводить эти строки в любом порядке. Можно показать, что ответ единственный.

Не обязательно выводить пустую строку между различными входными данными. В примере эти пустые строки сделаны только для удобства.

Примечание

В первом примере есть только один отрезок \([1, 1]\). Алиса выбирала только один отрезок \([1, 1]\), и Боб мог выбрать только число \(1\).

Во втором примере \(n = 3\). Изначально в наборе находится один отрезок \([1, 3]\).

  • Алиса выбирает отрезок \([1, 3]\). Боб выбирает число \(1\). Алиса добавляет в набор отрезок \([2, 3]\), и после этого хода это единственный отрезок в наборе.
  • Алиса выбирает отрезок \([2, 3]\). Боб выбирает число \(3\). Алиса добавляет в набор отрезок \([2, 2]\).
  • Алиса выбирает отрезок \([2, 2]\). Боб выбирает число \(2\). Игра заканчивается.

В четвертом наборе игра начинается с \(n = 5\). Изначально в наборе находится только отрезок \([1, 5]\). Ходы в игре показаны в следующей таблице.

Номер ходаОтрезок, выбранный АлисойЧисло, выбранное БобомНабор отрезков после хода
Перед началом\( \{ [1, 5] \} \)
1\([1, 5]\)\(3\)\( \{ [1, 2], [4, 5] \}\)
2\([1, 2]\)\(1\)\( \{ [2, 2], [4, 5] \} \)
3\([4, 5]\)\(5\)\( \{ [2, 2], [4, 4] \} \)
4\([2, 2]\)\(2\)\( \{ [4, 4] \} \)
5\([4, 4]\)\(4\)\( \{ \} \) (пустой набор)

D. Возвращение робота-пылесоса

математика реализация Теория вероятностей *2300

Условие задачи имеет много общего с задачей A. Отличия в задачах заключаются в том, что в этой задаче введена вероятность операции очистки, и отличаются ограничения.

Робот-пылесос находится на полу прямоугольной комнаты, ограниченной стенами. Пол можно представить как таблицу из \(n\) строк и \(m\) столбцов. Строки пола пронумерованы от \(1\) до \(n\) сверху вниз, а столбцы пронумерованы от \(1\) до \(m\) слева направо. Клетка на пересечении \(r\)-й строки и \(c\)-го столбца обозначается \((r,c)\). Изначально робот находится в клетке \((r_b, c_b)\).

Каждую секунду робот двигается на \(dr\) строк и \(dc\) столбцов, то за секунду робот передвигается из клетки \((r, c)\) в \((r + dr, c + dc)\). Изначально \(dr = 1\), \(dc = 1\). Если в направлении движения робота находится вертикальная стена (левая или правая), \(dc\) отражается перед движением, новое значение \(dc\) становится \(-dc\). Также, если в направлении движения робота находится горизонтальная стена (верхняя или нижняя), \(dr\) отражается перед движением, новое значение \(dr\) становится \(-dr\).

В начале каждой секунды (в том числе перед первым движением робота) робот очищает все клетки, лежащие в той же строке или в том же столбце, что и робот. В комнате лишь одна грязная клетка \((r_d, c_d)\). Задача робота — очистить эту грязную клетку.

После долгого тестирования в рамках задачи A робот сломался. А именно, он чистит пол, как указано выше, но в начале каждой секунды операция очистки выполняется только с вероятностью \(\frac p {100}\), и не выполняется с вероятностью \(1 - \frac p {100}\). События выполнения или невыполнения операции очистки в начале каждой секунды независимы.

По данному размеру пола \(n\) и \(m\), начальной позиции робота \((r_b, c_b)\) и позиции грязной клетки \((r_d, c_d)\) найдите математическое ожидание времени, за которое робот выполнит свою работу.

Можно показать, что ответ может быть представлен в виде несократимой дроби \(\frac x y\), где \(x\) и \(y\) — целые числа, и \(y \not \equiv 0 \pmod{10^9 + 7} \). Выведите целое число, равное \(x \cdot y^{-1} \bmod (10^9 + 7)\). Другими словами, выведите целое число \(a\) такое, что \(0 \le a < 10^9 + 7\) и \(a \cdot y \equiv x \pmod {10^9 + 7}\).

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Каждый набор входных данных описывается семью целыми числами \(n\), \(m\), \(r_b\), \(c_b\), \(r_d\), \(c_d\) и \(p\) (\(4 \le n \cdot m \le 10^5\), \(n, m \ge 2\), \(1 \le r_b, r_d \le n\), \(1 \le c_b, c_d \le m\), \(1 \le p \le 99\)) — размерами комнаты, начальной позицией робота, позицией грязной клетки и вероятностью выполнения операции очистки в процентах.

Выходные данные

Для каждого набора входных данных выведите одно целое число — математическое ожидание времени, через которое робот очистит грязную клетку, по модулю \(10^9 + 7\).

Примечание

В первом примере у робота есть возможности очистить грязную клетку каждую секунду. Используя геометрическое распределение, мы можем вычислить, что при вероятности успеха \(25\%\) ожидаемое количество попыток очистить грязную клетку равно \(\frac 1 {0.25} = 4\). Но так как первая попытка очистки выполняется до первого движения робота, то ответ равен \(3\).

Иллюстрация к первому примеру. Робот обозначен голубой дугой. Красной звездой обозначена грязная клетка. Каждую секунду робот с некоторое вероятностью может очистить строку и столбец, что показано желтыми линиями.

Во втором примере размеры доски и позиции другие, но робот все еще имеет возможность очистить строку и столбец каждую секунду с той же вероятность. Поэтому ответ такой же, как и в первом примере.

Иллюстрация ко второму примеру.

Третий и четвертый примеры почти одинаковые. Единственное отличие — позиции робота и грязной клетки поменяны местами. Однако движения в этих двух примерах одинаковые, поэтому результат тоже одинаковый.

B. Сделай АП

математика реализация *900

У Поликарпа есть \(3\) положительных целых числа \(a\), \(b\) и \(c\). Он может выполнить следующую операцию ровно один раз.

  • Выбрать положительное целое число \(m\) и домножить ровно одно из чисел \(a\), \(b\) или \(c\) на число \(m\).

Может ли Поликарп сделать так, что после выполнения операции последовательность трёх чисел \(a\), \(b\), \(c\) (именно в этом порядке) образует арифметическую прогрессию? Обратите внимание, что вы не можете менять порядок следования \(a\), \(b\) и \(c\).

Формально, последовательность \(x_1, x_2, \dots, x_n\) называется арифметической прогрессией (АП), если существует такое число \(d\) (называемое «разностью прогрессии»), что \(x_{i+1}=x_i+d\) для всех \(i\) от \(1\) до \(n-1\). В этой задаче \(n=3\).

Например, следующие последовательности являются АП: \([5, 10, 15]\), \([3, 2, 1]\), \([1, 1, 1]\) и \([13, 10, 7]\). Cледующие последовательности не являются АП: \([1, 2, 4]\), \([0, 1, 0]\) и \([1, 3, 2]\).

Вам необходимо ответить на \(t\) независимых наборов входных данных.

Входные данные

В первой строке дано число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В следующих \(t\) строках дано по \(3\) целых числа \(a\), \(b\), \(c\) (\(1 \le a, b, c \le 10^8\)).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если Поликарп может выбрать положительное целое число \(m\) и домножить ровно одно из чисел \(a\), \(b\) или \(c\) на число \(m\), чтобы сделать \([a, b, c]\) арифметической прогрессией. Выведите «NO» (без кавычек) в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом и втором наборе входных данных можно выбрать число \(m=4\) и домножить второе число (\(b=5\)) на \(4\).

В первом наборе входных данных получится последовательность \([10, 20, 30]\). Это АП с разностью \(d=10\).

Во втором наборе входных данных получится последовательность \([30, 20, 10]\). Это АП с разностью \(d=-10\).

В третьем тестовом примере можно выбрать \(m=1\) и домножить любое из чисел на \(1\). Получится последовательность \([1, 2, 3]\). Это АП с разностью \(d=1\).

В четвёртом тестовом примере можно выбрать \(m=9\) и домножить первое число (\(a=1\)) на \(9\). Получится последовательность \([9, 6, 3]\). Это АП с разностью \(d=-3\).

В пятом тестовом примере сделать АП не получится никак.

E. Маша-забываша

дп Конструктив Перебор реализация Строки хэши *2000

Маша познакомилась с новым другом и узнала его номер телефона — \(s\). Она хочет как можно скорее запомнить его. Номер телефона — это строка длины \(m\), которая состоит из цифр от \(0\) до \(9\). Допустимо, что телефон начинается с 0.

Маша уже знает \(n\) номеров телефонов (все номера имеют одинаковую длину \(m\)). Ей будет проще запомнить новый номер, если строку \(s\) представить как отрезки уже известных ей номеров. Каждый такой отрезок должен быть длины не менее \(2\), иначе отрезков будет слишком много, и Маша запутается.

Например, Маше нужно запомнить номер: \(s = \) «12345678» и она уже знает \(n = 4\) номера: «12340219», «20215601», «56782022», «12300678». Можно представить \(s\) как \(3\) отрезка: «1234» из первого номера, «56» из второго номера и «78» из третьего номера. Есть и другие способы представления \(s\).

Маша обратилась к вам за помощью, она просит вас разбить строку \(s\) на отрезки длины \(2\) или более из уже известных ей номеров. Если существует несколько возможных ответов, выведите любой из них.

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Перед каждым набором в тесте записана пустая строка. Далее идёт строка, которая содержит целые числа \(n\) и \(m\) (\(1 \le n, m \le 10^3\)) — количество номеров, которые знает Маша и количество цифр в каждом номере. Затем следуют \(n\) строк, \(i\)-я из которых описывает \(i\)-й номер, который знает Маша. Следующая строка содержит номер телефона её нового друга \(s\).

Среди заданных \(n+1\) телефонов могут быть дубликаты (одинаковые телефоны).

Гарантируется, что сумма значений \(n \cdot m\) (\(n\) умножить на \(m\)) по всем наборам входных данных в тесте не превосходит \(10^6\).

Выходные данные

Вам нужно вывести ответы на \(t\) запросов. В первой строке ответа должно содержаться одно число \(k\), соответствующее количеству отрезков, на которые вы разбили номер телефона \(s\). Выведите -1, если такого разбиения получить нельзя.

В случае положительного ответа далее должны следовать \(k\) строк, содержащие тройки чисел \(l, r, i\). Такая тройка обозначает, что очередные \(r-l+1\) цифр номера \(s\) равны отрезку (подстроке) с границами \([l, r]\) телефона под номером \(i\). И телефоны и цифры в них нумеруются от \(1\). Обратите внимание, что \(r-l+1 \ge 2\) для всех \(k\) строк.

Примечание

Первый тестовый случай соответствует примеру из условия.

Во втором случае невозможно представить отрезками известных номеров длины 2 или более.

В третьем случае можно получить отрезки «12» и «21» из первого номера телефона.

D. Двоичные пауки

битмаски Деревья математика реализация сортировки Структуры данных *2300

На Марсе обитает необычный вид пауков — Двоичные пауки. Они плетут паутину, чтобы защищаться от врагов.

Чтобы сплести паутину, пауки объединяются в пары. При этом, если у первого паука в паре \(x\) лапок, а у второго — \(y\) лапок, то у них выходит паутина прочностью \(x \oplus y\). Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Двоичные пауки живут большими группами. Сейчас Вы наблюдаете за группой из \(n\) пауков, причем \(i\)-й паук имеет \(a_i\) лапок.

Когда группе пауков грозит опасность, то некоторые из них становятся защитниками. Защитники выбираются следующим образом. Во-первых, должно быть как минимум два паука-защитника. Во-вторых, любая пара из пауков-защитников должна уметь сплести паутину прочностью хотя бы \(k\). В-третьих, защитников должно быть как можно больше.

Ученые долго исследовали поведение Двоичных пауков и выдвинули гипотезу, что они всегда могут выбрать защитников оптимальным образом, удовлетворяя при этом условиям выше. Вам предстоит проверить эту гипотезу на группе пауков. Для этого надо понять, сколько пауков должны стать защитниками. А поскольку Вы не являетесь Двоичным пауком, то Вы решили прибегнуть к помощи компьютера и написать программу, которая решает эту непростую задачу.

Входные данные

В первой строке входных данных находится два целых числа \(n\) и \(k\) (\(2 \le n \le 3\cdot10^5\), \(0 \le k \le 2^{30} - 1\)) — количество пауков в группе и минимальная допустимая прочность паутины.

Во второй строке входных данных находится \(n\) целых чисел \(a_i\) (\(0 \le a_i \le 2^{30}-1\)) — количество лапок у \(i\)-го паука.

Выходные данные

В первой строке выведите целое число \(\ell\) (\(2 \le \ell \le n\)) — максимально возможное количество пауков-защитников.

Во второй строке выведите через пробел \(\ell\) различных целых чисел \(b_i\) (\(1 \le b_i \le n\)) — номера пауков, которые станут защитниками.

Если существует несколько способов выбрать защитников, то выведите любой из них.

Увы, может получиться и так, что собрать защитников невозможно. В таком случае требуется вывести единственное число \(-1\).

Примечание

Рассмотрим пример из условия.

В первом примере группа пауков выглядит следующим образом:

Возьмем трех пауков: с двумя, десятью и \(16\)-ю лапками. Тогда нетрудно видеть, что каждая пара сможет сплести достаточно прочную паутину, т. к. \(2 \oplus 10 = 8 \ge 8\), \(2 \oplus 16 = 18 \ge 8\) и \(10 \oplus 16 = 26 \ge 8\).

Данный вариант выбора не единственный: можно, к примеру, выбрать трех пауков с номерами \(3\), \(4\) и \(6\).

Во втором примере никакая пара пауков не сможет сплести паутину прочностью \(1024\) или больше, поэтому ответ \(-1\).

C. Монстры и заклинания

Бинарный поиск дп жадные алгоритмы математика реализация Структуры данных *1700

Монокарп снова играет в компьютерную игру. Он ученик мага, поэтому знает только одно заклинание. К счастью, это заклинание может наносить урон монстрам.

Уровень, на котором он сейчас, содержит \(n\) монстров. \(i\)-й из них появляется через \(k_i\) секунд с начала уровня и имеет \(h_i\) очков здоровья. Дополнительно есть ограничение \(h_i \le k_i\) для всех \(1 \le i \le n\). Все \(k_i\) различны.

Монокарп может использовать заклинание в моменты времени, которые являются положительным целым количеством секунд с начала уровня: \(1, 2, 3, \dots\) Урон от заклинания считается следующим образом. Если он не использовал заклинание в предыдущую секунду, то урон равен \(1\). Иначе, пусть урон в прошлую секунду был равен \(x\). Тогда он может выбрать, чтобы урон был либо \(x + 1\), либо \(1\). Заклинание использует ману: использование заклинания с уроном \(x\) использует \(x\) маны. Мана не восстанавливается.

Чтобы убить \(i\)-го монстра, Монокарп должен использовать заклинание с уроном хотя бы \(h_i\) ровно в тот момент, когда появляется монстр, что равно \(k_i\).

Обратите внимание, что Монокарп может использовать заклинание и тогда, когда в текущую секунду монстра нет.

Количество маны, необходимое для использования всех заклинаний, — это сумма маны по всем использованным заклинаниям. Посчитайте наименьшее количество маны, которое потребуется Монокарпу, чтобы убить всех монстров.

Можно показать, что всегда можно убить всех монстров в рамках ограничений задачи.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 100\)) — количество монстров на уровне.

Во второй строке каждого набора входных данных записаны \(n\) целых чисел \(k_1 < k_2 < \dots < k_n\) (\(1 \le k_i \le 10^9\)) — количество секунд с начала уровня до появления \(i\)-го монстра. Все \(k_i\) различны, \(k_i\) заданы в порядке возрастания.

В третьей строке записаны \(n\) целых чисел \(h_1, h_2, \dots, h_n\) (\(1 \le h_i \le k_i \le 10^9\)) — здоровье \(i\)-го монстра.

Сумма \(n\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

На каждый набор входных данных выведите одно целое число — наименьшее количество маны, которое потребуется Монокарпу, чтобы убить всех монстров.

Примечание

В первом наборе входных данных Монокарп может использовать заклинание через \(3, 4, 5\) и \(6\) секунд с начала уровня с уроном \(1, 2, 3\) и \(4\), соответственно. Урон в \(6\) секунду равен \(4\), что действительно больше или равно здоровью монстра, который появляется.

Во втором наборе входных данных Монокарп может использовать заклинание через \(3, 4\) и \(5\) секунд с начала уровня с уроном \(1, 2\) и \(3\), соответственно.

В третьем наборе входных данных Монокарп может использовать заклинание через \(4, 5, 7, 8\) и \(9\) секунд с начала уровня с уроном \(1, 2, 1, 1\) и \(2\), соответственно.

A. Не красить

Конструктив реализация *800

Вам задана прямоугольная таблица из \(n\) строк и \(m\) столбцов. Некоторые ее клетки покрашены в черный цвет, остальные — белые.

За одну операцию вы выбираете некоторую черную клетку и выполняете ровно один пункт из следующих:

  • красите все клетки в ее строке в черный цвет, или
  • красите все клетки в ее столбце в черный цвет.

Вам заданы два целых числа \(r\) и \(c\). Найдите минимальное количество операций, чтобы сделать клетку в \(r\)-й строке \(c\)-м столбце черной, или определите, что это невозможно.

Входные данные

Входные данные состоят из одного или нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее идут описания наборов.

Первая строка каждого набора входных данных состоит из четырех целых чисел \(n\), \(m\), \(r\) и \(c\) (\(1 \leq n, m \leq 50\); \(1 \leq r \leq n\); \(1 \leq c \leq m\)) — количество строки и столбцов в таблице, номер строки и столбца клетки, которую необходимо сделать черной.

Затем следуют \(n\) строк, каждая содержит \(m\) символов. Каждый из символов равен либо «B», либо «W» в зависимости от того, черная или белая соответствующая клетка поля.

Выходные данные

Для каждого набора входных данных, если невозможно сделать клетку в \(r\)-й строке \(c\)-м столбце черной, выведите \(-1\).

В противном случае выведите одно целое число — минимальное количество операций, необходимое для того, чтобы сделать клетку в строке \(r\) столбце \(c\) черной.

Примечание

Изображение первого набора входных данных представлено ниже.

В первом наборе входных данных мы можем выбрать черную клетку в строке \(1\) столбце \(2\) и сделать все клетки в ее строке черными. Таким образом, клетка в строке \(1\) столбце \(4\) станет черной.

Во втором наборе входных данных примера клетка в строке \(2\) столбце \(1\) уже черная.

В третьем наборе входных данных примера невозможно сделать клетку в строке \(2\) столбце \(2\) чёрной.

Изображение четвертого набора входных данных представлено ниже.

В четвертом наборе входных данных мы можем выбрать черную клетку в строке \(2\) столбце \(2\) и сделать черными все клетки столбца.

После этого мы можем выбрать клетку в строке \(1\) столбце \(2\) и сделать сделать всю ее строку черной.

Таким образом, клетка в строке \(1\) столбце \(1\) станет черной.

E. Не спасаться

дп кратчайшие пути реализация Структуры данных *2200

Майора Рама преследует его заклятый враг Рагхав. Рам должен добраться до вершины здания, чтобы сбежать на вертолете, однако здание горит. Рам должен выбрать оптимальный путь, чтобы добраться до вершины здания, потеряв минимальное количество здоровья.

Здание состоит из \(n\) этажей, на каждом этаже \(m\) комнат. За \((i, j)\) обозначим \(j\)-ю комнату на \(i\)-м этаже. В здании \(k\) лестниц. \(i\)-я лестница позволяет Раму подняться из комнаты \((a_i, b_i)\) в \((c_i, d_i)\), но не в другом направлении. За проход по \(i\)-й лестнице Рам получает \(h_i\) очков здоровья. Гарантируется, что для всех лестниц \(a_i < c_i\).

Если Рам находится на \(i\)-м этаже, то он может двигаться влево или вправо. Путешествовать по этажам, однако, сложно, поэтому если Рам переходит от комнаты \((i, j)\) к \((i, k)\), он теряет \(|j-k| \cdot x_i\) очков здоровья.

Изначально Рам находится в комнате \((1, 1)\), а вертолет ожидает его в \((n, m)\). Какое минимальное количество очков здоровья Рам может потерять, если выберет оптимальный путь? Обратите внимание, что этот ответ может быть отрицательным (в этом случае он наберет очки здоровья). Выведите «NO ESCAPE», если Рам никак не может добраться к вертолету.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5 \cdot 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит \(3\) целых числа \(n, m, k\) (\(2 \leq n, m \leq 10^5\); \(1 \leq k \leq 10^5\)) — количество этажей, количество комнат на каждом этаже, и количество лестниц, соответственно.

Вторая строка содержит \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(1 \leq x_i \leq 10^6\)).

Следующие \(k\) строк содержат описания лестниц. Лестница \(i\) описана пятью целыми числами \(a_i, b_i, c_i, d_i, h_i\) (\(1 \leq a_i < c_i \leq n\); \(1 \leq b_i, d_i \leq m\); \(1 \leq h_i \leq 10^6\)) — номера комнат, которые она соединяет, и бонус к здоровью при использовании лестницы.

Гарантируется, что для всех лестниц выполняется \(a_i < c_i\), и между любыми двумя комнатами существует не более чем одна лестница.

Гарантируется, что сумма значений \(n\), сумма значений \(m\), сумма значений \(k\) по всем наборам входных данных не превосходят \(10^5\).

Выходные данные

Выведите минимальное число очков здоровья, которое Рам может потерять на пути от \((1, 1)\) до \((n, m)\). Если Рам не может добраться до вертолета, выведите «NO ESCAPE» (заглавными буквами без кавычек).

Примечание

Рисунок в условии демонстрирует первый пример из условия. Есть только \(2\) возможных пути к \((n, m)\):

  • Рам идет в \((1, 3)\), поднимается по лестнице в \((3, 3)\), идет в \((3, 2)\), поднимается по лестнице в \((5, 1)\), идет до \((5, 3)\), откуда улетает на вертолете. Потери здоровья равны \(\) \begin{align*} &\mathrel{\phantom{=}} x_1 \cdot |1-3| - h_1 + x_3 \cdot |3-2| - h_3 + x_5 \cdot |1-3| \\ &= 5 \cdot 2 - 4 + 8 \cdot 1 - 6 + 4 \cdot 2 \\ &= 16. \end{align*} \(\)
  • Рам идет в \((1, 3)\), поднимается по лестнице в \((3, 3)\), идет в \((3, 1)\), поднимается по лестнице в \((5, 2)\), идет до \((5, 3)\) , откуда улетает на вертолете. Потери здоровья равны \(\) \begin{align*} &\mathrel{\phantom{=}} x_1 \cdot |1-3| - h_1 + x_3 \cdot |3-1| - h_2 + a_5 \cdot |2-3| \\ &= 5 \cdot 2 - 4 + 8 \cdot 2 - 5 + 4 \cdot 1 \\ &= 21. \end{align*} \(\)
Минимальная потеря здоровья равна \(16\).

Во втором примере нет пути в \((n, m)\).

В третьем примере Рам идет в \((1, 3)\), а затем поднимается по лестнице в \((5, 3)\). Он теряет \(5 \cdot 2\) очка здоровья и затем получает \(h_1 = 100\) очков. Поэтому его потери равны \(10-100=-90\) (отрицательное число означает, что он улучшил здоровье).

F. Не разрезать

геометрия графы жадные алгоритмы кратчайшие пути реализация *2700

У вас есть квадрат \(k \times k\), причем \(k\) четно. Клетка в строке \(r\) и столбце \(c\) обозначается \((r,c)\). Две клетки \((r_1, c_1)\) и \((r_2, c_2)\) называются соседними, если \(\lvert r_1 - r_2 \rvert + \lvert c_1 - c_2 \rvert = 1\).

Массив пар соседних клеток называется прочным, если существует способ разрезать квадрат на две связных конгруэнтных части таким образом, что в каждой данной паре клеток обе клетки принадлежат одной части. Две части конгруэнтны, если одну можно наложить на другую с помощью переноса, вращения и/или зеркального отражения, а также их комбинаций.

Рисунок выше демонстрирует первый пример. Стрелки показывают пары клеток, а жирная линия показывает разрез на две части.

Вам дан массив \(a\) из \(n\) пар соседних клеток. Найдите размер наибольшей прочной подпоследовательности \(a\). Массив \(p\) является подпоследовательностью \(q\), если \(p\) может быть получен из \(q\) удалением нескольких (возможно, ни одного или всех) элементов.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \leq n \leq 10^5\); \(2 \leq k \leq 500\), \(k\) четно) — размер \(a\) и размер квадрата, соответственно.

Далее следуют \(n\) строк. \(i\)-я из этих строк содержит четыре целых числа \(r_{i,1}\), \(c_{i,1}\), \(r_{i,2}\) и \(c_{i,2}\) (\(1 \leq r_{i,1}, c_{i,1}, r_{i,2}, c_{i,2} \leq k\)) — \(i\)-й элемент \(a\), где \((r_{i,1}, c_{i,1})\) — строка и столбец первой клетки, а \((r_{i,2}, c_{i,2})\) — строка и столбец второй. Эти квадраты соседние.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\), и что сумма значений \(k\) по всем наборам входных данных не превосходит \(500\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — размер наибольшей прочной подподпоследовательности \(a\).

Примечание

В первом примере \(a\) не является прочным, но подпоследовательность \([a_1, a_2, a_3, a_4, a_5, a_6, a_8]\) является, т. к. квадрат может быть разрезан способом, показанным в условии.

Во втором примере подпоследовательность из четырех последних элементов \(a\) является прочным, т. к. квадрат можно разрезать с помощью горизонтальной прямой через центр.

A. MEX-массив

Бинарный поиск жадные алгоритмы Конструктив математика реализация *1400

Магнус только что узнал о MEX, и он ему так понравился, что он решил сразу его использовать.

Учитывая массив \(a\) из \(n\) неотрицательных целых чисел, Магнус хочет создать новый массив \(b\), который сформирован следующим образом:

Пока массив \(a\) не пуст:

  • Выберите целое число \(k\) (\(1 \leq k \leq |a|\)).
  • Добавьте MEX первых \(k\) чисел массива \(a\) в конец массива \(b\) и удалите эти числа из массива \(a\), сдвинув позиции оставшихся чисел в \(a\).

Магнус любит большие массивы так же сильно, как и MEX, поэтому он хочет, чтобы новый массив \(b\) был лексикографически максимальным. Магнус просит вас сказать ему, какой лексикографически максимальный массив \(b\), он может создать, построив его оптимальным образом.

Массив \(x\) лексикографически больше массива \(y\), если в первой позиции, где \(x\) и \(y\) различаются \(x_i > y_i\), или если \(|x| > |y|\) и \(y\) — это префикс \(x\) (где \(|x|\) обозначает размер массива \(x\)).

MEX набора неотрицательных целых чисел — это минимальное неотрицательное целое число, которого нет в наборе. Например, MEX ({\({1, 2, 3}\)}) \(= 0\) и MEX ({\({0, 1, 2, 4, 5}\)}) \(= 3\).

Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество тестов. Описание тестовых примеров следует ниже.

Первая строка каждого тестового примера содержит единственное целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество элементов в массиве \(a\).

Вторая строка каждого тестового примера содержит \(n\) неотрицательных целых чисел \(a_1, \ldots, a_n\) (\(0 \leq a_i \leq n\)), где \(a_i\) — это \(i\)-е число из массива \(a\).

Гарантируется, что сумма \(n\) по всем тестам не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого тестового примера выведите \(m\) — длину лексикографически максимального массива \(b\), который может создать Магнус, за которым следуют \(m\) целых чисел, обозначающие элементы массива \(b\).

Примечание

В первом наборе входных данных лексикографически максимальный массив \(b\) получается выбором \(k=5\), что приводит к \(MEX\) всего массива \(a\). Он лексикографически максимален, так как массив, начинающийся с меньшего числа, чем \(4\), лексикографически меньше, и выбор \(k<5\) приведет к массиву, начинающемуся с числа меньше чем \(4\).

Во втором наборе входных данных есть два способа получить максимальный массив: сначала выбрать \(k=6\), затем \(k=2\) или сначала выбрать \(k=7\), а затем \(k=1\).

C. XOR-сетка

жадные алгоритмы интерактив Конструктив математика реализация *2300

XOR множества \(\{s_1,s_2,\ldots,s_m\}\) определяется как \(s_1 \oplus s_2 \oplus \ldots \oplus s_m\), где \(\oplus\) обозначает побитовую операцию XOR.

Почти выиграв IOI, Виктор купил себе сетку размером \(n\times n\), содержащую целые числа в каждой ячейке. \(n\) — четное число. Целое число в \(i\)-й строке и \(j\)-м столбце равно \(a_{i,j}\).

К сожалению, Mihai украл сетку у Виктора и сказал ему, что вернет ее только с одним условием: Виктор должен сообщить Mihai XOR всех чисел сетки.

Виктор не помнит все элементы сетки, но он помнит некоторую информацию о ней: для каждой ячейки Виктор помнит XOR всех соседних ячеек.

Две клетки считаются соседними, если они имеют общую сторону — другими словами, для некоторых целых чисел \(1 \le i, j, k, l \le n\) ячейка в \(i\)-й строке и \(j\)-м столбце является соседом ячейки в \(k\)-й строке и \(l\)-м столбце, если \(|i - k| = 1\) и \(j = l\), или если \(i = k\) и \(|j - l| = 1\).

Чтобы вернуть свою сетку, Виктор просит вас о помощи. Можете ли вы, используя информацию, которую помнит Виктор, найти XOR всей сетки?

Можно доказать, что ответ определяется однозначно.

Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество тестов. Далее следует описание тестовых случаев.

Первая строка каждого набора входных данных содержит единственное четное целое число \(n\) (\(2 \leq n \leq 1000\)) — размер сетки.

Далее следуют \(n\) строк, каждая из которых содержит \(n\) целых чисел. \(j\)-е число в \(i\)-й строке представляет собой XOR всех чисел, записанных в соседях ячейки в \(i\)-й строке и \(j\)-м столбце.

Гарантируется, что сумма \(n\) по всем тестам не превышает \(1000\) и в исходной сетке \(0 \leq a_{i, j} \leq 2^{30} - 1\).

Формат взлома

Чтобы взломать решение, используйте следующий формат:

Первая строка должна содержать единственное целое число t (\(1 \le t \le 100\)) — количество тестов.

Первая строка каждого набора входных данных должна содержать единственное четное целое число \(n\) (\(2 \leq n \leq 1000\)) — размер сетки.

Далее должны следовать \(n\) строк, каждая из которых содержит \(n\) целых чисел. \(j\)-е целое число в \(i\)-й из этих строк равно \(a_{i,j}\) в исходной сетке Виктора. Значения в сетке должны быть целыми числами в диапазоне \([0, 2^{30}-1]\).

Сумма \(n\) по всем тестам не должна превышать \(1000\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — XOR всей сетки.

Примечание

Для первого набора входных данных одна из возможных исходных сеток Виктора:

\(1\)\(3\)
\(2\)\(4\)

Для второго набора входных данных одна из возможных исходных сеток Виктора:

\(3\)\(8\)\(8\)\(5\)
\(9\)\(5\)\(5\)\(1\)
\(5\)\(5\)\(9\)\(9\)
\(8\)\(4\)\(2\)\(9\)

Для третьего набора входных данных одна из возможных исходных сеток Виктора:

\(4\)\(3\)\(2\)\(1\)
\(1\)\(2\)\(3\)\(4\)
\(5\)\(6\)\(7\)\(8\)
\(8\)\(9\)\(9\)\(1\)

A. ABC

реализация *800

Недавно в 179-й школе разработали уникальный алгоритм, который на вход принимает бинарную строку \(s\). Однако школьники обнаружили, что если какая-то подстрока \(t\) строки \(s\) является палиндромом длины больше чем 1, то алгоритм сработает некорректно. Им стало интересно, можно ли в строке \(s\) поменять порядок символов, чтобы на ней корректно отработал алгоритм?

Бинарная строка — это строка, состоящая только из символов 0 и 1.

Строка \(a\) является подстрокой \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов из начала и нескольких (возможно, ни одного или всех) символов из конца.

Палиндром — это строка, которая читается одинаково слева направо и справа налево.

Входные данные

Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка описания каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)) — длину строки \(s\).

Вторая строка описания каждого набора входных данных содержит строку \(s\) длины \(n\), состоящую только из символов 0 и 1.

Выходные данные

Для каждого набора входных данных выведите YES (без учета регистра), если в строке \(s\) можно как-то поменять порядок символов, чтобы в ней не было подстрок, которые являются палиндромами длины больше чем 1, и NO (без учета регистра) в противном случае.

Примечание

В первых трёх наборах исходные строки не содержат палиндромов длины больше чем 1, поэтому ответы YES.

В последнем наборе невозможно поменять порядок символов, чтобы в строке не было палиндромов длины больше чем 1, поэтому ответ NO.

F. Прибавления Фибоначчи

математика Перебор реализация Структуры данных хэши *2700

One of my most productive days was throwing away 1,000 lines of code.
— Ken Thompson

Прибавление Фибоначчи — это операция на массиве \(X\) целых чисел, параметризованная индексами \(l\) и \(r\). При применении этой операции к \(X_l\) прибавляется \(F_1\), к \(X_{l + 1}\) прибавляется \(F_2\), и так далее, вплоть до числа \(X_r\), которое увеличивается на \(F_{r - l + 1}\).

Здесь \(F_i\) — это \(i\)-е число Фибоначчи (\(F_1 = 1\), \(F_2 = 1\), \(F_{i} = F_{i - 1} + F_{i - 2}\) для \(i > 2\)), и все операции производятся по модулю \(MOD\).

Вам даны массивы \(A\) и \(B\) одинаковой длины. Мы просим вас применить к этим массивам несколько операций прибавления Фибоначчи с разными параметрами. После каждой операции вы должны сообщить, равны ли массивы \(A\) и \(B\) (по модулю \(MOD\)).

Входные данные

В первой строке вводится 3 числа \(n\), \(q\) и \(MOD\) (\(1 \le n, q \le 3\cdot 10^5, 1 \le MOD \le 10^9+7\)) — длина массивов, количество операций и модуль, по которому выполняются все операции.

Во второй строке находится \(n\) чисел — массив \(A\) (\(0 \le A_i < MOD\)).

В третей строке находится \(n\) чисел — массив \(B\) (\(0 \le B_i < MOD\)).

В последующих \(q\) строках находится символ \(c\) и два числа \(l\) и \(r\) (\(1 \le l \le r \le n\)) — параметры операции. Символ \(c\), равный «A», означает, что прибавление Фибоначчи нужно применить к массиву \(A\), равный «B» — к массиву \(B\).

Выходные данные

После каждой операции выведите «YES» (без кавычек), если массивы равны, и «NO» иначе. Ответ можно выводить в любом регистре.

Примечание

Пояснение к тесту из условия:

  • Изначально \(A=[2,2,1]\), \(B=[0,0,0]\).
  • После операции «A 1 3»: \(A=[0,0,0]\), \(B=[0,0,0]\) (сложение производится по модулю 3).
  • После операции «A 1 3»: \(A=[1,1,2]\), \(B=[0,0,0]\).
  • После операции «B 1 1»: \(A=[1,1,2]\), \(B=[1,0,0]\).
  • После операции «B 2 2»: \(A=[1,1,2]\), \(B=[1,1,0]\).
  • После операции «A 3 3»: \(A=[1,1,0]\), \(B=[1,1,0]\).

C. Андрей и камни

жадные алгоритмы реализация *1200

Андрей разложил у себя на столе \(n\) кучек с камнями. В кучке с номером \(i\) лежит \(a_i\) камней. Он хочет добиться того, что каждый камень будет лежать либо в кучке \(1\), либо в кучке \(n\).

Для этого Андрей может выполнить следующую операцию сколько угодно раз: выбрать \(3\) индекса \(1 \le i < j < k \le n\) такие, что в кучке \(j\) лежит хотя бы \(2\) камня, забрать \(2\) камня из кучки \(j\) и один из них положить в кучку \(i\), а второй в кучку \(k\).

Определите, за какое минимальное количество операций Андрей сможет переложить камни так, чтобы каждый камень лежал либо в кучке \(1\), либо в кучке \(n\), или скажите, что это сделать невозможно.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10\,000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(3 \leq n \leq 10^5\)) — длина массива.

Во второй строке набора задана последовательность целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — элементы массива.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное число операций, которые надо сделать, чтобы каждый камень лежал либо в кучке \(1\), либо в кучке \(n\), или выведите \(-1\), если это сделать невозможно.

Примечание

В первом наборе входных данных оптимально сделать следующее:

  1. Выбрать \((i, j, k) = (1, 2, 5)\). Массив становится равным \([2, 0, 2, 3, 7]\).
  2. Выбрать \((i, j, k) = (1, 3, 4)\). Массив становится равным \([3, 0, 0, 4, 7]\).
  3. Затем два раза выбрать \((i, j, k) = (1, 4, 5)\). Массив становится равным \([5, 0, 0, 0, 9]\). Этот массив удовлетворяет условию задачи, потому что все камни лежат в \(1\)-й или \(5\)-й кучке.
Всего \(4\) операции.

Во втором наборе входных данных положить все камни в кучки \(1\) и \(3\) невозможно:

  1. Изначально есть только один способ совершить операцию, выбрав \((i, j, k) = (1, 2, 3)\). Массив становится равным \([2, 1, 2]\).
  2. Теперь ни одной операции сделать невозможно, а массив не удовлетворяет условию задачи, поэтому ответ \(-1\).

В третьем наборе входных данных оптимально сделать следующее:

  1. Выбрать \((i, j, k) = (1, 2, 3)\). Массив становится равным \([2, 0, 2]\). Этот массив удовлетворяет условию задачи, потому что все камни лежат в \(1\)-й или \(3\)-й кучке.
Всего \(1\) операция.

В четвёртом наборе входных данных изначально нельзя сделать ни одной операции, и исходный массив не удовлетворяет условию задачи, поэтому ответ \(-1\).

E. Лучшая пара

Бинарный поиск Перебор реализация *2100

Дан массив \(a\) размера \(n\). Пусть \(cnt_x\) — количество элементов исходного массива, равных \(x\). Определим \(f(x, y)\) как \((cnt_x + cnt_y) \cdot (x + y)\).

Также даны \(m\) плохих пар \((x_i, y_i)\). Обратите внимание, что если \((x, y)\) плохая пара, то \((y, x)\) тоже плохая.

Найдите максимальное значение \(f(u, v)\) по всем парам \((u, v)\) таким, что \(u \neq v\), что эта пара не является плохой, а также что числа \(u\) и \(v\) встречаются в массиве \(a\). Гарантируется, что хотя бы одна такая пара существует.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных.

Первая строка набора содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 3 \cdot 10^5\), \(0 \le m \le 3 \cdot 10^5\)) — длину массива и количество плохих пар.

Вторая строка набора содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — элементы массива.

\(i\)-я из следующих \(m\) строк содержат два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i < y_i \le 10^9\)) — очередную плохую пару. Гарантируется, что ни одна пара не вводится два раза. Также гарантируется, что \(cnt_{x_i} > 0\) и \(cnt_{y_i} > 0\).

Гарантируется, что в каждом наборе входных данных существует хотя бы одна пара чисел \((u, v)\), \(u \ne v\), не являющаяся плохой, такая, что оба этих числа встречаются в массиве \(a\).

Гарантируется, что сумма \(n\) и сумма \(m\) не превосходят \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — ответ на задачу.

Примечание

В первом тестовом случае в массиве встречаются значения \(3\), \(6\), \(7\).

  • \(f(3, 6) = (cnt_3 + cnt_6) \cdot (3 + 6) = (3 + 2) \cdot (3 + 6) = 45\). Но пара \((3, 6)\) плохая, поэтому её не учитываем.
  • \(f(3, 7) = (cnt_3 + cnt_7) \cdot (3 + 7) = (3 + 1) \cdot (3 + 7) = 40\).
  • \(f(6, 7) = (cnt_6 + cnt_7) \cdot (6 + 7) = (2 + 1) \cdot (6 + 7) = 39\).

Ответ на задачу \(\max(40, 39) = 40\).

D. Большая кисть

жадные алгоритмы Конструктив реализация Структуры данных *2000

Вы нашли картину на холсте размером \(n \times m\). Холст можно представить в виде сетки с \(n\) строками и \(m\) столбцами. Каждая клетка покрашена в какой-то цвет. Клетка \((i, j)\) имеет цвет \(c_{i,j}\).

Рядом с картиной вы также нашли кисть в форме квадрата \(2 \times 2\), поэтому холст был покрашен следующим образом. Изначально никакая клетка не была покрашена. Затем следующая операция покраски была выполнена некоторое количество раз:

  • Выбрать два целых числа \(i\) и \(j\) (\(1 \le i < n\), \(1 \le j < m\)) и некоторый цвет \(k\) (\(1 \le k \le nm\)).
  • Покрасить клетки \((i, j)\), \((i + 1, j)\), \((i, j + 1)\), \((i + 1, j + 1)\) в цвет \(k\).

Каждая клетка должна быть покрашена хотя бы один раз. Клетка может быть покрашена несколько раз. В этом случае её итоговый цвет будет равен последнему.

Найдите некоторую последовательность из не более \(nm\) операций, позволяющую получить картину, которую вы нашли, или определите, что это невозможно.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n, m \le 1000\)) — размеры холста.

В \(i\)-й из следующих \(n\) строк входных данных содержатся \(m\) целых чисел. \(j\)-е из них равно \(a_{i,j}\) (\(1 \le a_{i,j} \le nm\)) — цвет клетки \((i, j)\).

Выходные данные

Если решения не существует, выведите единственное число \(-1\).

Иначе, на первой строке, выведите одно целое число \(q\) (\(1 \le q \le nm\)) — количество операций.

Далее выведите сами операции по порядку. В \(k\)-й из следующих \(q\) строк, выведите три целых числа \(i\), \(j\), \(c\) (\(1 \le i < n\), \(1 \le j < m\), \(1 \le c \le nm\)) — описание \(k\)-й операции.

Если существует несколько решений, выведите любое.

Примечание

В первом наборе входных данных решение не единственно. Здесь представлено одно из них:

Во втором наборе входных данных не существует способа получить данную картину, поэтому ответ \(-1\).

E. Красочные запросы

Перебор реализация Структуры данных *2400

У вас есть массив \(a_1,a_2, \dots, a_n\). Каждый элемент изначально имеет значение \(0\) и цвет \(1\). Также вам дано \(q\) запросов, которые нужно обработать:

  • Color \(l\) \(r\) \(c\): Поменять цвет элементов \(a_l,a_{l+1},\cdots,a_r\) на \(c\) (\(1 \le l \le r \le n\), \(1 \le c \le n\)).
  • Add \(c\) \(x\): Прибавить \(x\) к значениям всех элементов \(a_i\) (\(1 \le i \le n\)), имеющих цвет \(c\) (\(1 \le c \le n\), \(-10^9 \le x \le 10^9\)).
  • Query \(i\): Вывести \(a_i\) (\(1 \le i \le n\)).
Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(q\) (\(1 \le n,q \le 10^6\)) — длину массива \(a\) и количество запросов, которые нужно обработать.

Каждая из следующих \(q\) строк содержит запрос, который задан в формате, описанном в условии задачи.

Выходные данные

Выведите ответы на запросы третьего типа в отдельных строках.

Примечание

Первый тестовый пример описан ниже. Синий, красный и зеленый обозначают цвета \(1\), \(2\) и \(3\) соответственно.

B. Расшифровка повторяшек

Конструктив реализация сортировки *2000

У Оли есть массив целых чисел \(a_1, a_2, \ldots, a_n\). Оля хочет разбить его на тандемные повторы. Так как это не всегда возможно, перед разбиением она хочет несколько (возможно, ноль) раз вставить в произвольное место пару одинаковых чисел. Помогите ей!

Более формально:

  • Тандемным повтором называется любая последовательность \(x\) четной длины \(2k\) такая, что для всех \(1 \le i \le k\) выполнено, что \(x_i = x_{i + k}\).
  • Массив \(a\) разбивается на тандемные повторы, если его можно разбить на несколько частей, каждая из которых является тандемным повтором.
  • Оля может несколько раз выбрать произвольное целое число \(c\) и вставить \([c, c]\) в произвольное место массива (в самом начале, между какими-то двумя числами, или в самом конце).
  • Вам необходимо сделать некоторое количество вставок и затем разбить массив на тандемные повторы, или сообщить, что это невозможно. Обратите внимание, что от вас не требуется минимизировать количество вставок.
Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 30\,000\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит единственное целое число \(n\) (\(1 \le n \le 500\)) — изначальную длину массива.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — сам массив.

Гарантируется, что сумма значений \(n^2\) по всем наборам входных данных не превосходит \(250\,000\).

Выходные данные

Для каждого набора входных данных выведите ответ в следующем формате.

Если операциями вставки двух равных чисел нельзя превратить массив в конкатенацию тандемных повторов, выведите единственное целое число \(-1\).

Иначе выведите количество вставок \(q\) (\(0 \le q \le 2 \cdot n^2\)) в вашем решении. Далее выведите описание вставок.

В каждой из следующих \(q\) строк выведите два целых числа \(p\) и \(c\) (\(1 \le c \le 10^9\)), которые означают, что после \(p\) чисел с начала массива вставляется число \(c\) два раза подряд. Если перед этим действием длина массива была \(m\), то должно быть выполнено \(0 \le p \le m\).

Далее вам нужно вывести любое разбиение итогового массива на тандемные повторы. Сначала выведите целое число \(d\), а на следующей строке выведите последовательность четных целых чисел \(t_1, t_2, \ldots, t_d\) размера \(d\) (\(d, t_i \ge 1\)). Это длины подотрезков, являющихся тандемными повторами, на которые можно разбить получившийся массив после всех операций.

Заметим, что после всех действий длина массива \(a\) будет равна \(m = n + 2 \cdot q\). Должны выполняться следующие условия:

  • \(m = \sum\limits_{i = 1}^{d}{t_i}\).
  • Для всех целых \(i\) таких, что \(1 \le i \le d\), последовательность \(a_l, a_{l+1}, \ldots, a_r\) является тандемным повтором, где \(l = \sum\limits_{j = 1}^{i - 1}{t_j} + 1\), \(r = l + t_i - 1\).

Можно показать, что если решение существует, то существует решение, которое удовлетворяет заданным ограничениям. Если существует несколько возможных ответов, вы можете вывести любой.

Примечание

В первом наборе входных данных невозможно вставками двух равных чисел подряд массив, который является конкатенацией тандемных повторов.

Во втором наборе входных данных массив уже является тандемным повтором \([5, 5] = \underbrace{([5] + [5])}_{t_1 = 2}\), поэтому мы можем не делать никаких вставок.

В третьем наборе входных данных у нас изначально следующий массив: \(\)[1, 3, 1, 2, 2, 3].\(\) После первого действия вставки с \(p = 1, c = 3\): \(\)[1, \textbf{3, 3}, 3, 1, 2, 2, 3].\(\) После второго действия вставки с \(p = 5, c = 3\): \(\)[1, 3, 3, 3, 1, \textbf{3, 3}, 2, 2, 3].\(\) После третьего действия вставки с \(p = 5, c = 3\): \(\)[1, 3, 3, 3, 1, \textbf{3, 3}, 3, 3, 2, 2, 3].\(\) После четвертого действия вставки с \(p = 10, c = 3\): \(\)[1, 3, 3, 3, 1, 3, 3, 3, 3, 2, \textbf{3, 3}, 2, 3].\(\) Итоговый массив можно представить как конкатенацию двух тандемных повторов: \(\)\underbrace{([1, 3, 3, 3] + [1, 3, 3, 3])}_{t_1 = 8} + \underbrace{([3, 2, 3] + [3, 2, 3])}_{t_2 = 6}.\(\)

В четвёртом наборе входных данных у нас изначально следующий массив: \(\)[3, 2, 1, 1, 2, 3].\(\) После первого действия вставки с \(p = 0, c = 3\): \(\)[\textbf{3, 3}, 3, 2, 1, 1, 2, 3].\(\) После второго действия вставки с \(p = 8, c = 3\): \(\)[3, 3, 3, 2, 1, 1, 2, 3, \textbf{3, 3}].\(\) После третьего действия вставки с \(p = 5, c = 3\) \(\)[3, 3, 3, 2, 1, \textbf{3, 3}, 1, 2, 3, 3, 3].\(\) После четвертого действия вставки с \(p = 6, c = 2\): \(\)[3, 3, 3, 2, 1, 3, \textbf{2, 2}, 3, 1, 2, 3, 3, 3].\(\) После пятого действия вставки с \(p = 7, c = 1\): \(\)[3, 3, 3, 2, 1, 3, 2, \textbf{1, 1}, 2, 3, 1, 2, 3, 3, 3].\(\) Итоговый массив можно представить как конкатенацию тандемных повторов: \(\)\underbrace{([3] + [3])}_{t_1 = 2} + \underbrace{([3, 2, 1] + [3, 2, 1])}_{t_2 = 6} + \underbrace{([1, 2, 3] + [1, 2, 3])}_{t_3 = 6} + \underbrace{([3] + [3])}_{t_4 = 2}.\(\)

A. Двери и ключи

реализация *800

Рыцарь стоит в начале длинного и узкого коридора. Принцесса ждет его на другом конце коридора.

В коридоре есть три двери: красная дверь, зеленая дверь и синяя дверь. Двери расположены одна за другой, однако возможно, в другом порядке. Чтобы пройти к следующей двери, рыцарь обязан открыть предыдущую дверь.

Каждую дверь можно открыть только ключом соответствующего цвета. Так что три ключа: красный ключ, зеленый ключ и синий ключ — также расположены где-то в коридоре. Чтобы открыть дверь, рыцарь должен сначала подобрать ключ ее цвета.

У рыцаря есть карта коридора. Она может быть записана как строка, состоящая из шести символов:

  • R, G, B — обозначающие красную, зеленую и синюю двери, соответственно;
  • r, g, b — обозначающие красный, зеленый и синий ключи, соответственно.

Каждый из этих символов встречается в строке ровно один раз.

Рыцарь стоит в начале коридора — слева на карте.

По карте коридора определите, может ли рыцарь открыть все двери и встретиться с принцессой в конце коридора.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 720\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки. Каждый символ — один из R, G, B (для дверей), r, g, b (для ключей), и каждый из них встречается ровно один раз.

Выходные данные

На каждый набор входных данных выведите YES, если рыцарь может открыть все двери. Иначе выведите NO.

Примечание

В первом наборе рыцарь сначала собирает все ключи, затем открывает все двери.

Во втором наборе сразу перед рыцарем красная дверь, но у него нет к ней ключа.

В третьем наборе ключ к каждой двери лежит перед соответствующей дверью, поэтому рыцарь подбирает ключ и использует его сразу три раза.

В четвертом наборе рыцарь не может открыть синюю дверь.

B. Антифибоначчиевы перестановки

Конструктив Перебор реализация *800

Назовем перестановку \(p\) длины \(n\) антифибоначчиевой, если для всех \(i\) (\(3 \le i \le n\)) выполняется \(p_{i-2} + p_{i-1} \ne p_i\). Напомним, что перестановкой называется массив длины \(n\), содержащий каждое целое число от \(1\) до \(n\) ровно один раз.

Ваша задача — для заданного числа \(n\) вывести \(n\) различных антифибоначчиевых перестановок длины \(n\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 48\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(3 \le n \le 50\)).

Выходные данные

Для каждого набора входных данных выведите \(n\) строк. Каждая строка должна содержать антифибоначчиеву перестановку длины \(n\). В каждом наборе входных данных каждая перестановка должна быть выведена не более одного раза.

Если существует несколько ответов, выведите любой из них. Можно показать, что всегда существует способ найти \(n\) различных антифибоначчиевых перестановок длины \(n\), соблюдая ограничения задачи.

C. Увеличь суммы подотрезков

дп жадные алгоритмы Перебор реализация *1400

Задан массив \(a_1, a_2, \dots, a_n\), состоящий из \(n\) целых чисел. Также дано целое число \(x\).

Пусть \(f(k)\) будет равно максимальной сумме последовательного подмассива \(a\) после применения следующей операции: прибавить \(x\) к элементам на ровно \(k\) различных позициях. Пустой подмассив тоже рассматривается, его сумма равна \(0\).

Обратите внимание, что подмассив не обязан включать в себя все увеличенные элементы.

Посчитайте максимальное значение \(f(k)\) для каждого \(k\) от \(0\) до \(n\) независимо.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных.

В первой строке каждого набора записано два целых числа \(n\) и \(x\) (\(1 \le n \le 5000\); \(0 \le x \le 10^5\)) — количество элементов массива и значение для прибавления.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^5 \le a_i \le 10^5\)).

Сумма \(n\) по всем наборам целых чисел не превосходят \(5000\).

Выходные данные

На каждый набор входных данных выведите \(n + 1\) целое число — максимальное значение \(f(k)\) для каждого \(k\) от \(0\) до \(n\) независимо.

Примечание

В первом наборе не важно, к каким элементам прибавлять \(x\). Подотрезок с максимальной суммой всегда будет целым массивом. Если увеличить \(k\) элементов на \(x\), к сумме прибавится \(k \cdot x\).

Во втором наборе:

  • Для \(k = 0\) пустой подмассив — это лучший вариант.
  • Для \(k = 1\) наиболее выгодно увеличить элемент на позиции \(3\). Лучшая сумма становится \(-1 + 5 = 4\) для подмассива \([3, 3]\).
  • Для \(k = 2\) наиболее выгодно увеличить элемент на позиции \(3\) и любой другой элемент. Лучшая сумма останется \(4\) для подотрезка \([3, 3]\).
  • Для \(k = 3\) необходимо увеличить все элементы. Лучшая сумма становится \((-2 + 5) + (-7 + 5) + (-1 + 5) = 5\) для подотрезка \([1, 3]\).

D. Раскраска крестиками

математика реализация Структуры данных *1700

Представьте лист бумаги — сетку размера \(n \times m\): \(n\) строк и \(m\) столбцов с ячейками. Все ячейки изначально белые.

К листу применили \(q\) операций. \(i\)-я из них может быть описана следующим образом:

  • \(x_i\) \(y_i\) — выбирается один из \(k\) небелых цветов, и вся строка \(x_i\) и весь столбец \(y_i\) раскрашиваются в этот цвет. Новый цвет наносится на каждую клетку вне зависимости от того, была ли клетка раскрашена до операции.

Лист после применения всех \(q\) операций называется раскраской. Две раскраски различные, если существует хотя бы одна клетка, раскрашенная в разные цвета.

Сколько существует различных раскрасок? Выведите их количество по модулю \(998\,244\,353\).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора записаны четыре целых числа \(n, m, k\) и \(q\) (\(1 \le n, m, k, q \le 2 \cdot 10^5\)) — размер листа, количество небелых цветов и количество операций.

В \(i\)-й из следующих \(q\) строк записана \(i\)-я операция — два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i \le n\); \(1 \le y_i \le m\)) — строка и столбец, к которым применяется операция.

Сумма \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — количество различных раскрасок по модулю \(998\,244\,353\).

E. Расширь маршрут

Комбинаторика математика Перебор реализация Структуры данных *1900

Задана сетка размера \(n \times n\). Строки пронумерованы сверху вниз от \(1\) до \(n\), столбцы пронумерованы слева направо от \(1\) до \(n\).

Робот расположен в клетке \((1, 1)\). Он может делать два типа ходов:

  • D — перейти на одну клетку вниз;
  • R — перейти на одну клетку вправо.

Роботу запрещено выходить за пределы поля.

Дана последовательность ходов \(s\) — изначальный маршрут робота. Этот маршрут не ведет робота за пределы поля.

Вам разрешено провести произвольное количество изменений строки (возможно, ноль). За одно изменение можно раздвоить один ход в последовательности. То есть, заменить одно вхождение D на DD или одно вхождение R на RR.

Посчитайте количество клеток таких, что существует хотя бы одна последовательность изменений, после применения которой робот посетит эту клетку на измененном маршруте и не выйдет за пределы поля.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора записаны два целых числа \(n\) (\(2 \le n \le 10^8\)) — количество строк и столбцов.

Во второй строке каждого набор записана непустая строка \(s\), состоящая только из символов D и R, — изначальный маршрут робота. Этот маршрут не ведет робота за пределы поля.

Суммарная длина строк \(s\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — количество клеток таких, что существует хотя бы одна последовательность изменений, после применения которой робот посетит эту клетку на измененном маршруте и не выйдет за пределы поля.

Примечание

В первом наборе входных данных достаточно рассмотреть следующие измененные маршруты:

  • RD \(\rightarrow\) RRD \(\rightarrow\) RRRD \(\rightarrow\) RRRDD \(\rightarrow\) RRRDDD — этот маршрут посещает клетки \((1, 1)\), \((1, 2)\), \((1, 3)\), \((1, 4)\), \((2, 4)\), \((3, 4)\) и \((4, 4)\);
  • RD \(\rightarrow\) RRD \(\rightarrow\) RRDD \(\rightarrow\) RRDDD — этот маршрут посещает клетки \((1, 1)\), \((1, 2)\), \((1, 3)\), \((2, 3)\), \((3, 3)\) и \((4, 3)\);
  • RD \(\rightarrow\) RDD \(\rightarrow\) RDDD — этот маршрут посещает клетки \((1, 1)\), \((1, 2)\), \((2, 2)\), \((3, 2)\) и \((4, 2)\).

Таким образом, клетки, которые посещены на хотя бы одном измененном маршруте: \((1, 1)\), \((1, 2)\), \((1, 3)\), \((1, 4)\), \((2, 2)\), \((2, 3)\), \((2, 4)\), \((3, 2)\), \((3, 3)\), \((3, 4)\), \((4, 2)\), \((4, 3)\) и \((4, 4)\).

Во втором примере, нет способа изменить последовательность так, чтобы робот не вышел за пределы поля. Поэтому все посещенные клетки — это те, которые посещены на маршруте DRDRDRDR.

В третьем примере клетки, которые посещены на хотя бы одном измененном маршруте: \((1, 1)\), \((2, 1)\) и \((3, 1)\).

Клетки для всех наборов:

D. Взвесьте дерево

Деревья дп Конструктив поиск в глубину и подобное реализация *2000

Вам дано дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\). Деревом называется связный неориентированный граф без циклов.

Для всех \(i=1,2, \ldots, n\) обозначим за \(w_i\) вес \(i\)-й вершины. Вершина называется хорошей, если ее вес равен сумме весов всех ее соседей.

Изначально веса в вершинах не определены. Выберете для каждой вершины положительный целочисленный вес так, чтобы количество хороших вершин в дереве было максимально возможным. Если есть несколько способов сделать это, вам нужно найти такой, который минимизирует сумму весов всех вершин в дереве.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2\le n\le 2\cdot 10^5\)) — количество вершин в дереве.

Далее следует \(n−1\) строка. Каждая из этих строк содержит два целых числа \(u\) и \(v\) (\(1\le u,v\le n\)), обозначающие ребро между вершинами \(u\) и \(v\). Гарантируется, что ребра образуют дерево.

Выходные данные

В первой строке выведите два целых числа: максимальное количество хороших вершин и минимально возможный суммарный вес вершин при этом.

Во второй строке выведите \(n\) целых чисел \(w_1, w_2, \ldots, w_n\) (\(1\le w_i\le 10^9\)) — веса вершин. Можно показать, что существует оптимальное решение, удовлетворяющее данным ограничениям.

Если существует несколько решений, выведите любое из них.

Примечание

Ниже изображено дерево из первого примера:

В этом случае, если вы выберете для каждый вершины вес \(1\), то хорошими вершинами будут вершины (покрашены черным) \(1\), \(3\) и \(4\). Невозможно выбрать такие веса, чтобы все вершины были хорошими. Минимально возможная сумма весов равна \(1+1+1+1=4\), меньшая сумма недостижима, так как вершины обязаны иметь положительный вес.

Ниже изображено дерево из второго примера:

В этом случае, если вы выберете для каждой вершины вес \(1\), то хорошими вершинами будут вершины (покрашены черным) \(2\) и \(3\). Можно показать, что это оптимальное решение.

F. Игра вокруг стола

жадные алгоритмы Конструктив реализация *2900

Вокруг круглого стола сидят \(n\) игроков, пронумерованных от \(1\) до \(n\). Игрок номер \((i+1)\) сидит справа от \(i\)-го игрока для всех \(1 \le i < n\), а \(1\)-й игрок сидит справа от \(n\)-го.

У них есть \(n^2\) карт, на каждой из которых написано одно целое число от \(1\) до \(n\). Для каждого числа от \(1\) до \(n\) есть ровно \(n\) с этим числом.

Изначально все карты некоторым образом распределены между игроками, причем у каждого ровно \(n\) карт. За один шаг каждый игрок выбирает одну из своих карт и передает ее игроку справа. Все игроки выполняют свой шаг одновременно.

Игрок \(i\) называется готовым, если на всех его картах написано число \(i\). Цель игроков — достичь конфигурации, где все игроки готовы. Найдите способ сделать это за не более чем \((n^2-n)\) шагов. Вам не нужно минимизировать число шагов.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2\le n\le 100\)).

Далее следуют \(n\) строк. \(i\)-я из них содержит \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1\le c_j\le n\)) — начальные карты \(i\)-го игрока.

Гарантируется, что для всех целых \(i\) от \(1\) до \(n\) существуют ровно \(n\) карт с числом \(i\).

Выходные данные

В первой строке выведите целое число \(k\) (\(0\le k\le (n^2-n)\)) — количество шагов в вашем решении.

Далее выведите \(k\) строк. В \(i\)-й из них выведите \(n\) целых чисел \(d_1, d_2, \ldots, d_n\) (\(1\le d_j\le n\)), где \(d_j\) равно числу, написанному на карте, которую \(j\)-й игрок передает на \(i\)-м шаге игроку, сидящему справа от него.

Можно показать, что в данных ограничениях ответ всегда существует. Если существует несколько решений, выведите любое.

Примечание

В первом примере если первый игрок передает карту с числом \(2\), а второй игрок передает карту с числом \(1\), то у первого игрока будет две карты с числом \(1\), а у второго — две карты с числом \(2\). Значит после этого шага оба игрока готовы.

Во втором примере можно также сделать \(0\) шагов. Обратите внимание, что не нужно минимизировать число шагов.

A. Мадока и отец математик

математика реализация *800

Мадока наконец-то узнала пароль от своего компьютера. Но так как ее отец известный популяризатор математики, то пароль — это ответ на следующую задачу:

Требуется узнать максимальное число, сумма цифр в десятичной записи которого равна \(n\), а также в его десятичной записи нет нулей и подряд идущих одинаковых цифр.

Так как Мадока уже устала от математики, то помогите ей решить эту задачу!

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В единственной строке каждого набора входных данных задано число \(n\) (\(1 \le n \le 1000\)) — необходимая сумма цифр у числа.

Выходные данные

Для каждого набора входных данных выведите максимальное число, которое вы можете получить.

Примечание

Все числа с суммой цифр \(2\) без нулей в записи: \(2\), \(11\). Но последнее не подходит, так как в нем \(2\) единицы подряд. Поэтому ответ \(2\).

Все числа с суммой цифр \(3\) без нулей в записи: \(111\), \(12\), \(21\), \(3\). Первое не подходит, так как в нём две едицины подряд, поэтому максимальное число \(21\).

Все числа с суммой цифр \(4\) без нулей в записи: \(1111\), \(211\), \(121\), \(112\), \(13\), \(31\), \(22\), \(4\). Числа \(1111\), \(211\), \(112\), \(22\) не подходят, так как в них есть одинаковые подряд идущих цифр. А среди остальных максимальное число — \(121\).

B. Мадока и элегантный подарок

графы Конструктив Перебор реализация *1200

Отец Мадоки достиг отметки в \(1\) миллион подписчиков на Mathub! В честь этого вебсайт решил отправить ему персонализированную награду — Битовую Кнопку Mathub!

Награда представляет из себя таблицу из \(n\) строк и \(m\) столбцов, в каждой клетке которой записано число \(0\) или \(1\). Изучив таблицу, она вывела следующие характеристики:

  • Подпрямоугольник \(A\) лежит в подпрямоугольнике \(B\), если нет клетки, которая лежит внутри \(A\), но при этом не лежит внутри \(B\).
  • Два подпрямоугольника пересекаются, если найдется клетка, лежащая внутри обоих подпрямоугольников.
  • Подпрямоугольник называется чёрным, если в нём нет клетки со значением \(0\).
  • Подпрямоугольник называется красивым, если он чёрный и не лежит в каком-то другом чёрном подпрямоугольнике.
  • Таблица называется элегантной, если никакие два красивых подпрямоугольника не пересекаются.

Например, на первой картинке красный подпрямоугольник является красивым, а на второй нет, так как он лежит внутри фиолетового подпрямоугольника.

Помогите Мадоке определить, является ли таблица элегантной.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержатся два целых числа \(n, m\) (\(1 \le n, m \le 100\)) — размеры таблицы.

Далее следуют \(n\) строк длины \(m\), состоящих из нулей и единиц — описание таблицы.

Гарантируется, что сумма значений \(n\) и сумма значений \(m\) по всем наборам входных данных не превосходят \(777\).

Выходные данные

Для каждого набора входных данных выведите «YES», если данная таблица является элегантной. Иначе, выведите «NO».

Вы можете выводить каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ).

Примечание

Во втором наборе входных данных таблица не элегантная, поскольку красный красивый подпрямоугольник пересекается с фиолетовым.

В четвертом наборе входных данных таблица не элегантная, поскольку красный красивый подпрямоугольник пересекается с фиолетовым.

C. Тайлер и строки

Комбинаторика реализация Структуры данных *1900

Маленький Тайлер зашел на кухню и увидел, что на холодильнике магнитиками выложена строка \(s\). Он сразу увидел её безграничный потенциал!

Тайлеру нравятся строки, особенно те, которые лексикографически меньше другой строки \(t\). Играя с магнитиками на холодильнике, он задумался, а сколько различных строк, лексикографически меньших строки \(t\), он может собрать, переставляя буквы в строке \(s\). Так как он учится всего лишь во втором классе, он не может этого посчитать, поэтому просит вас о помощи! Так как в алфавите языка Тайлера много букв, то для вашего удобства Тайлер уже заменил одинаковые буквы в строках \(s\) и \(t\) одинаковыми числами, а разные — разными.

Напомним, что строка \(x\) лексикографически меньше строки \(y\), если выполнено одно из двух условий:

  • существует такая позиция символа \(m\), присутствующая в обеих строках, что до \(m\)-го символа строки совпадают, а \(m\)-й символ строки \(x\) меньше \(m\)-го символа \(y\),
  • строка \(x\) является префиксом \(y\) и \(x \neq y\).

Так как ответ может быть слишком большим, выведите его по модулю \(998\,244\,353\).

Входные данные

В первой строке даны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 200\,000\)) — длины строк \(s\) и \(t\) соответственно.

Во второй строке даны \(n\) целых чисел \(s_1, s_2, s_3, \ldots, s_n\) (\(1 \le s_i \le 200\,000\)) — буквы строки \(s\).

Во третьей строке даны \(m\) целых чисел \(t_1, t_2, t_3, \ldots, t_m\) (\(1 \le t_i \le 200\,000\)) — буквы строки \(t\).

Выходные данные

Выведите единственное число — количество строк, лексикографически меньших \(t\), которые можно получить, переставляя буквы в \(s\), по модулю \(998\,244\,353\).

Примечание

В первом примере интересующие нас строки это \([1\, 2\, 2]\) и \([2\, 1\, 2]\). Строка \([2\, 2\, 1]\) лексикографически больше строки \([2\, 1\, 2\, 1]\), поэтому её мы не считаем.

Во втором примере подходят все строки, кроме \([4\, 3\, 2\, 1]\), так что их \(4! - 1 = 23\).

В третьем примере подходит только строка \([1\, 1\, 1\, 2]\).

D. Бизнес-шоу

дп кратчайшие пути разделяй и властвуй реализация Структуры данных *2800

Дима находится на шоу от бизнесмена Петра. В этом шоу Диме предстоит пройтись по дорожке, которая является прямоугольником \(3 \times n\), где строки пронумерованы от \(1\) до \(3\) сверху вниз, а столбцы от \(1\) до \(n\) слева направо.

На клетке на пересечении строки \(i\) и столбца \(j\) написано число \(a_{i,j}\). Изначально у Димы есть баланс, равный нулю, и когда Дима наступает на клетку в \(i\)-й строке и \(j\)-м столбце, его баланс меняется на \(a_{i,j}\) рублей. Баланс может становиться отрицательным.

Дима может заходить на любые клетки первой и третьей строки, но изначально клетки второй строки для него недоступны. Однако есть \(q\) предложений от бизнесмена Петра, которые могут сделать их доступными: \(i\)-е предложение позволяет разблокировать все клетки второй строки на отрезке с \(l_i\) по \(r_i\), заплатив за это \(k_i\) рублей. Дима может воспользоваться любым количеством таких предложений, а также разблокировать одну и ту же клетку несколько раз.

Дима изначально стоит на клетке в клетке \((1, 1)\) и хочет попасть в клетку \((3, n)\). За один ход Дима может подвинуться на 1 вправо или вниз, то есть увеличить на 1 номер строки или столбца. Таким образом, всего в процессе пути Дима сделает \(n + 1\) ход, из которых ровно \(n - 1\) будет по горизонтали и \(2\) по вертикали.

Выигрыш Димы будет равен финальному балансу после совершения всех ходов, то есть сумме чисел на всех посещённых клетках за вычетом стоимости всех использованных предложений. Ваша задача — определить максимальный возможный выигрыш Димы.

Входные данные

В первой строке даны два целых числа \(n\) и \(q\) (\(1 \le n, q \le 500\,000\)) — длина прямоугольника и число возможных отрезков для разблокировки.

В следующих трёх строках описываются числа в прямоугольнике, в \(i\)-й строке даны \(n\) целых чисел \(a_{i1}\), \(a_{i2}\), ..., \(a_{in}\) (\(-10^9 \le a_{ij} \le 10^9)\) — числа в \(i\)-й строке прямоугольника.

В следующих \(q\) строках описываются доступные предложения для разблокировки отрезков, в \(i\)-й из них даны три целых числа \(l_i\), \(r_i\) и \(k_i\) (\(1 \leq l_i \leq r_i \leq n\), \(1\leq k_i\leq 10^9\)) — границы разблокируемого отрезка и стоимость предложения.

Выходные данные

Выведите одно число — максимальный возможный выигрыш Димы.

Примечание

В первом примере оптимально воспользоваться вторым предложением Петра за \(4\) рубля и пройти по клеткам \((1, 1)\), \((1, 2)\), \((1, 3)\), \((2, 3)\), \((3, 3)\), \((3, 4)\), заработав \(1 + 0 + 2 + 9 + 4 + 1 - 4 = 13\) рублей.

Во втором примере оптимально воспользоваться вторым и третьим предложением Петра за \(2\) и \(3\) рубля соответственно, и пройти по клеткам \((1, 1)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((2, 4)\), \((3, 4)\), \((3, 5)\), заработав \(-20 + 1 + 3 + 3 + 6 + 6 + 2 - 2 - 3= -4\) рубля.

E. Авиареформа

графы Деревья поиск в глубину и подобное разделяй и властвуй реализация снм Структуры данных *3200

Берляндия — большая страна с развитой системой авиасообщения. Всего в стране есть \(n\) городов, которые исторически обслуживаются авиакомпанией Берляфлот. Авиакомпания выполняет двухсторонние рейсы между \(m\) парами городов, \(i\)-й из них соединяет города с номерами \(a_i\) и \(b_i\) и имеет цену \(c_i\) на перелёт в каждую из сторон.

Известно, что с помощью рейсов Берляфлота можно добраться от любого города до любого другого (возможно, с пересадками), а стоимость любого маршрута из нескольких стыковочных рейсов Берляфлота равна стоимости самого дорогого из них. Более формально, стоимость маршрута из города \(t_1\) в город \(t_k\) с \((k-2)\)-мя пересадками в городах \(t_2,\ t_3,\ t_4,\ \ldots,\ t_{k - 1}\) равна максимуму из стоимостей рейсов из города \(t_1\) в \(t_2\), из \(t_2\) в \(t_3\), из \(t_3\) в \(t_4\) и так далее до рейса из \(t_{k - 1}\) в \(t_k\). Разумеется, все эти рейсы должны выполняться авиакомпанией Берляфлот.

Недавно в Берляндии начала работать новая авиакомпания S8 Airlines. Эта авиакомпания совершает двусторонние рейсы между всеми парами городов, между которыми нет рейсов Берляфлота. Таким образом, между каждой парой городов есть рейс либо Берляфлота, либо S8 Airlines.

Стоимости рейсов авиакомпании S8 Airlines рассчитываются следующим образом: для каждой пары городов \(x\) и \(y\), между которыми выполняется рейс S8 Airlines, стоимость этого рейса равняется минимальной стоимости маршрута между городами \(x\) и \(y\) у Берляфлота в соответствии с описанным ранее ценообразованием.

Известно, что с помощью рейсов S8 Airlines можно добраться от любого города до любого другого с возможными пересадками, и, аналогично Берляфлоту, стоимость маршрута между любыми двумя городами стыковочными рейсами S8 Airlines равна стоимости самого дорогого рейса в этом маршруте.

Из-за увеличившейся конкуренции с S8 Airlines Берляфлот решил провести авиареформу и изменить стоимости своих рейсов. А именно, для \(i\)-го своего рейса между городами \(a_i\) и \(b_i\) Берляфлот хочет сделать стоимость этого рейса равной минимальной стоимости маршрута между городами \(a_i\) и \(b_i\) у авиакомпании S8 Airlines. Помогите менеджерам Берляфлота рассчитать новые стоимости рейсов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке вводятся одно целое число \(t\) (\(1 \le t \le 10\,000\)) — число наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных водятся два целых числа \(n\) и \(m\) (\(4 \le n \le 200\,000\), \(n - 1 \le m \le 200\,000\), \(m \le \frac{(n - 1) (n - 2)}{2}\)) — число городов в Берляндии и число рейсов у Берляфлота.

В следующих \(m\) строках описываются рейсы Берляфлота. В \(i\)-й строке даны три целых числа \(a_i\), \(b_i\) и \(c_i\) (\(1 \le a_i, b_i \le n\), \(1 \le c_i \le 10^9\)) — номера городов, которые соединены \(i\)-м рейсом Берляфлота, и стоимость \(i\)-го рейса Берляфлота.

Гарантируется, что никакой рейс не соединяет город сам с собой, а никакие 2 рейса не соединяют одну и ту же пару городов. Гарантируется, что рейсами Берляфлота можно добраться от любого города до любого другого и что рейсами S8 Airlines можно добраться от любого города до любого другого.

Обозначим за \(N\) сумму значений \(n\) по всем наборам входных данных, и за \(M\) — сумму значений \(m\) по всем наборам входных данных. Гарантируется, что \(N, M \le 200\,000\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите \(m\) целых чисел, \(i\)-е из которых должно быть равно стоимости \(i\)-го рейса Берляфлота после авиареформы.

Примечание

В примере в первом наборе входных данных авиакомпания S8 Airlines будет выполнять рейсы между парами городов: \((1, 3)\), \((1, 4)\) и \((2, 4)\).

Стоимость рейса между городами \(1\) и \(3\) будет равна \(2\), так как минимальная стоимость маршрута Берляфлота равна \(2\) — маршрут состоит из рейса между городами \(1\) и \(2\) стоимостью \(1\) и рейса между городами \(2\) и \(3\) стоимостью \(2\), максимум из стоимостей равен \(2\).

Стоимость рейса между городами \(1\) и \(4\) будет равна \(3\), так как минимальная стоимость маршрута Берляфлота составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(2\) стоимостью \(1\), рейса между городами \(2\) и \(3\) стоимостью \(2\) и рейса между городами \(3\) и \(4\) стоимостью \(3\), максимум из стоимостей равен \(3\).

Стоимость рейса между городами \(2\) и \(4\) будет равна \(3\), так как минимальная стоимость маршрута Берляфлота составляет \(3\) — маршрут состоит из рейса между городами \(2\) и \(3\) стоимостью \(2\) и рейса между городами \(3\) и \(4\) стоимостью \(3\), максимум из стоимостей равен \(3\).

После авиареформы стоимость рейса Берляфлота между городами \(1\) и \(2\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(4\) стоимостью \(3\) и рейса между городами \(2\) и \(4\) стоимостью \(3\), максимум равен \(3\).

Стоимость рейса Берляфлота между городами \(2\) и \(3\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(2\) и \(4\) стоимостью \(3\), рейса между городами \(1\) и \(4\) стоимостью \(3\) и рейса между \(1\) и \(3\) стоимостью \(2\), максимум равен \(3\).

Стоимость рейса Берляфлота между городами \(3\) и \(4\) будет составлять \(3\), так как минимальная стоимость маршрута S8 Airlines между этими городами составляет \(3\) — маршрут состоит из рейса между городами \(1\) и \(3\) стоимостью \(2\) и рейса между городами \(1\) и \(4\) стоимостью \(3\), максимум равен \(3\).

Во втором наборе входных данных у авиакомпании S8 Airlines будут следующие рейсы: между городами \(1\) и \(4\) стоимостью \(1\), между городами \(2\) и \(3\) стоимостью \(1\), между городами \(2\) и \(5\) стоимостью \(2\), между городами \(3\) и \(4\) стоимостью \(1\) и между городами \(3\) и \(5\) стоимостью \(2\).

A. Игра

реализация *800

Вы играете в одну очень популярную компьютерную игру. Очередной уровень состоит из \(n\) подряд идущих локаций, пронумерованных от \(1\) до \(n\), каждая из которых содержит либо землю, либо воду. Известно, что первая и последняя локации содержат землю, и ваша задача — попасть с первой локации на последнюю, при этом если вы попадете на локацию с водой, то вы погибнете, так что вы можете перемещаться только между локациями с землей.

Вы можете бесплатно совершать прыжки между соседними локациями, а также не более одного раза совершить прыжок с любой локации с землей \(i\) на любую локацию с землей \(i + x\), затратив на это \(x\) монет (\(x \geq 0\)).

Ваша задача — вывести минимальное количество монет, необходимое для того, чтобы переместиться с первой локации на последнюю.

Обратите внимание, что это всегда возможно, так как и первая, и последняя локация являются локациями с землей.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(2 \leq n \leq 100\)) — количество локаций.

Во второй строке набора задана последовательность целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 1\)), где \(a_i = 1\) обозначает, что \(i\)-я локация является локацией с землей, а \(a_i = 0\) обозначает, что \(i\)-я локация является локацией с водой. Гарантируется, что \(a_1 = 1\) и \(a_n = 1\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — ответ на задачу.

Примечание

В первом наборе входных данных достаточно сделать один бесплатный прыжок с первой локации на вторую, которая также последняя, поэтому ответ \(0\).

Во втором наборе единственный способ добраться с первой локации до последней — перепрыгнуть между ними сразу, что будет стоить \(4\) монеты.

В третьем наборе можно за \(2\) монеты прыгнуть с первой локации на третью, а затем бесплатно прыгнуть на четвертую, поэтому ответ \(2\). Можно показать, что это оптимальный способ.

B. Игра в пас

жадные алгоритмы реализация *1300

Даниэль наблюдает за игрой футбольной команды во время тренировки. Во время этой тренировки они хотят улучшить свои навыки паса.

В игре участвуют \(n\) игроков, которые делают передачи друг другу. Тренировка закончилась, но к сожалению, поскольку мячи двигались слишком быстро, Даниэль не смог понять, сколько мячей находилось в игре. Единственное, что он знает, это количество пасов, сделанных каждым игроком за время тренировки.

Найдите минимально возможное количество мячей, которые участвовали в игре.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 5 \cdot 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(2 \leq n \leq 10^5\)) — количество игроков в команде.

Во второй строке набора задана последовательность целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^9\)), где \(a_i\) обозначает количество пасов, сделанных \(i\)-м игроком.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — ответ на задачу.

Примечание

В первом наборе входных данных с единственным мячом игра могла проходить так:

\(2 \rightarrow 1 \rightarrow 3 \rightarrow 4 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 4 \rightarrow 2 \rightarrow 3 \rightarrow 2\).

Во втором наборе входных данных выполнить передачи одним мячом невозможно. Один из возможных способов игры двумя мячами:

\(2 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 2 \rightarrow 1\).

\(2 \rightarrow 3 \rightarrow 2 \rightarrow 1\)

В третьем наборе пасов не было, поэтому возможны \(0\) мячей.

A. Суперцентральная точка

реализация *1000

Однажды Вася нарисовал на листке бумаги декартову систему координат и отметил некоторое множество точек (x1, y1), (x2, y2), ..., (xn, yn). Для некоторой фиксированной точки (x, y) из данного множества определим понятия соседей:

  • точка (x', y') называется правым соседом для (x, y), если x' > x и y' = y
  • точка (x', y') называется левым соседом для (x, y), если x' < x и y' = y
  • точка (x', y') называется нижним соседом для (x, y), если x' = x и y' < y
  • точка (x', y') называется верхним соседом для (x, y), если x' = x и y' > y

Точку (x, y) из данного множества назовем суперцентральной, если среди точек этого множества у нее есть хотя бы один верхний, хотя бы один нижний, хотя бы один левый и хотя бы один правый сосед.

Вася нарисовал очень много точек на листке. Вручную анализировать рисунок очень сложно, поэтому Вася попросил Вас помочь ему. Ваша задача — найти количество суперцентральных точек среди заданного множества.

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 200) — количество точек в заданном множестве. Далее в n строках записаны координаты точек в формате «x y» (без кавычек) (|x|, |y| ≤ 1000), все координаты — целые числа. Числа в строке разделены ровно одним пробелом. Гарантируется, что все точки различны.

Выходные данные

Выведите единственное число — количество суперцентральных точек из данного множества.

Примечание

В первом примере суперцентральными точками являются только (1, 1) и (1, 2).

Во втором примере одна суперцентральная точка — это точка (0, 0).

B. Ночная работа

Бинарный поиск реализация *1500

Однажды Васе поручили очень важное задание — написать за ночь программу, которая состоит из n строк кода. Вася уже очень устал и поэтому работает по следующей схеме: сначала он пишет v строк кода, выпивает стакан чая, после чего пишет уже строк, опять выпивает стакан чая, после пишет строк и так далее: , , , ...

Под выражением понимается целая часть от деления числа a на число b.

Как только текущая величина станет равной 0, Вася немедленно засыпает и просыпается только утром, когда программа должна быть уже полностью написана.

Васе интересно, какое наименьшее допустимое значение может принимать величина v, чтобы успеть написать не менее n строк кода до того момента, как он заснет.

Входные данные

Входные данные состоят из двух целых чисел n и k, записанных через пробел — размер программы в строках и коэффициент уменьшения производительности, 1 ≤ n ≤ 109, 2 ≤ k ≤ 10.

Выходные данные

Выведите единственное целое число — минимальное значение величины v, при котором Вася успеет написать программу за ночь.

Примечание

В первом примере при v = 4 Вася будет печатать код следующим образом: сначала 4 строки, потом 2, потом 1, а затем Вася уснет. Таким образом, он успеет за ночь написать 4 + 2 + 1 = 7 строк, и задание будет выполнено.

Во втором примере при v = 54 Вася печатает код следующими порциями: 54, 6. В сумме 54 + 6 = 60, что даже больше, чем n = 59.

A. Удаления двух соседних букв

реализация Строки *800

Задана строка \(s\), длина строки — нечётное число. Строка состоит из строчных букв латинского алфавита.

Пока длина строки строго больше \(1\), над ней можно производить следующую операцию: выбрать любые две соседние в строке \(s\) буквы и удалить их из строки. Например, из строки «lemma» за одну операцию можно получить любую из четырёх строк: «mma», «lma», «lea» или «lem». В частности, за одну операцию длина строки уменьшается на \(2\).

Формально, пусть строка \(s\) имеет вид \(s=s_1s_2 \dots s_n\) (\(n>1\)). Во время одного хода вы выбираете произвольный индекс \(i\) (\(1 \le i < n\)) и делаете замену \(s=s_1s_2 \dots s_{i-1}s_{i+2} \dots s_n\).

Для заданных строки \(s\) и буквы \(c\) определите, можно ли совершить такую последовательность ходов, что в итоге будет верно равенство \(s=c\)? Иными словами, существует ли такая последовательность действий, что процесс завершится строкой длины \(1\), которая состоит из буквы \(c\)?

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных в тесте.

Далее следуют описания \(t\) наборов. Каждый набор данных представлен двумя строками:

  • строкой \(s\), которая имеет нечётную длину от \(1\) до \(49\) включительно и состоит из строчных букв латинского алфавита;
  • строкой, содержащей одну букву \(c\), где \(c\) — строчная буква латинского алфавита.
Выходные данные

Для каждого набора входных данных в отдельной строке выведите:

  • YES, если строка \(s\) может быть преобразована так, что будет верно \(s=c\);
  • NO в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных примера \(s\)abcde». Требуется получить \(s\)c». За первый ход удалим первые две буквы, получим \(s\)cde». За второй ход удалим последние две буквы, получим ожидаемое значение \(s\)c».

В третьем наборе входных данных примера \(s\)x», требуется получить \(s\)y». Очевидно, что это невозможно сделать.

C. Вес системы вложенных отрезков

жадные алгоритмы реализация сортировки хэши *1200

На числовой прямой заданы \(m\) точек, \(i\)-я из которых имеет координату \(x_i\) и целочисленный вес \(w_i\). Координаты всех точек различны, точки пронумерованы от \(1\) до \(m\).

Последовательность из \(n\) отрезков \([l_1, r_1], [l_2, r_2], \dots, [l_n, r_n]\) называется системой вложенных отрезков, если для каждой пары \(i, j\) (\(1 \le i < j \le n\)) выполнено \(l_i < l_j < r_j < r_i\). Другими словами, второй отрезок находится строго внутри первого, третий отрезок находится строго внутри второго, и так далее.

Для заданного числа \(n\) найдите такую систему вложенных отрезков, что:

  • оба конца каждого из отрезков являются одной из \(m\) заданных точек;
  • сумма весов \(2\cdot n\) точек, которые использованы в качестве концов отрезков, минимальна.

Например, пусть \(m = 8\). Заданные точки отмечены на рисунке, их веса выделены красным цветом, координаты — синим. Составим систему из трёх вложенных отрезков:

  • вес первого отрезка: \(1 + 1 = 2\)
  • вес второго отрезка: \(10 + (-1) = 9\)
  • вес третьего отрезка: \(3 + (-2) = 1\)
  • сумма весов всех отрезков в системе: \(2 + 9 + 1 = 12\)
Система из трёх вложенных отрезков
Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Перед каждым набором в тесте записана пустая строка.

В первой строке каждого набора входных данных записано два положительных целых числа \(n\) (\(1 \le n \le 10^5\)) и \(m\) (\(2 \cdot n \le m \le 2 \cdot 10^5\)).

В последующих \(m\) строках записаны пары целых чисел \(x_i\) (\(-10^9 \le x_i \le 10^9\)) и \(w_i\) (\(-10^4 \le w_i \le 10^4\)) — координата и вес точки с номером \(i\) (\(1 \le i \le m\)) соответственно. Все \(x_i\) различны.

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n + 1\) строку: в первой из них выведите вес составленной системы, а в последующих \(n\) строках ровно по два числа  — номера точек, являющихся границами отрезка с номером \(i\) (\(1 \le i \le n\)). Порядок вывода концов отрезка не важен — вы можете вывести как сначала левый, а затем правый конец, так и наоборот.

Если способов составить систему вложенных отрезков с минимальным весом несколько, выведите любой из них.

Примечание

Первый набор входных данных совпадает с примером из условия. Можно показать, что вес составленной системы является минимальным.

Во втором наборе входных данных есть всего \(6\) точек, поэтому необходимо использовать каждую из них, чтобы составить \(3\) отрезка.

D. Петя и циклические сдвиги

Конструктив математика Перебор реализация *1300

У Пети изначально был массив \(a\) целых чисел от \(1\) до \(n\), где \(a[i]=i\).

Он последовательно произвёл \(n\) операций. В итоге он получил новое состояние массива \(a\).

На \(i\)-й операции Петя выбирал первые \(i\) элементов массива и произвольное количество раз совершал их циклический сдвиг вправо (элементы с номерами \(i+1\) и больше оставались на своих местах). Один циклический сдвиг вправо — это такое преобразование, что массив \(a=[a_1, a_2, \dots, a_n]\) станет равен \(a = [a_i, a_1, a_2, \dots, a_{i-2}, a_{i-1}, a_{i+1}, a_{i+2}, \dots, a_n]\).

Например, если \(a = [5,4,2,1,3]\) и \(i=3\) (то есть это третья операция), то в результате этой операции он мог получить любой из трёх массивов:

  • \(a = [5,4,2,1,3]\) (делает \(0\) циклических сдвигов или любое количество, которое делится на \(3\));
  • \(a = [2,5,4,1,3]\) (делает \(1\) циклический сдвиг или любое количество, которое имеет остаток \(1\) при делении на \(3\));
  • \(a = [4,2,5,1,3]\) (делает \(2\) циклических сдвига или любое количество, которое имеет остаток \(2\) при делении на \(3\)).

Рассмотрим пример. Пусть \(n=6\), то есть изначально \(a=[1,2,3,4,5,6]\). Возможный вариант развития событий описан ниже.

  • \(i=1\): сколько бы циклических сдвигов Петя не производил, массив \(a\) не изменится.
  • \(i=2\): допустим Петя решил сделать \(1\) циклический сдвиг, тогда массив примет вид \(a = [\textbf{2}, \textbf{1}, 3, 4, 5, 6]\).
  • \(i=3\): допустим Петя решил сделать \(1\) циклический сдвиг, тогда массив примет вид \(a = [\textbf{3}, \textbf{2}, \textbf{1}, 4, 5, 6]\).
  • \(i=4\): допустим Петя решил сделать \(2\) циклических сдвига, тогда массив примет вид \(a = [\textbf{1}, \textbf{4}, \textbf{3}, \textbf{2}, 5, 6]\).
  • \(i=5\): допустим Петя решил сделать \(0\) циклических сдвигов, тогда массив не изменится.
  • \(i=6\): допустим Петя решил сделать \(4\) циклических сдвига, тогда массив примет вид \(a = [\textbf{3}, \textbf{2}, \textbf{5}, \textbf{6}, \textbf{1}, \textbf{4}]\).

Вам задано финальное состояние массива \(a\) после всех \(n\) операций. Определите, существует ли способ выполнения операций, который приведёт к этому результату. В случае положительного ответа найдите количество циклических сдвигов, которое могло быть сделано во время каждой из \(n\) операций.

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка описания каждого набора содержит одно целое число \(n\) (\(2 \le n \le 2\cdot10^3\)) — длина массива \(a\).

В следующей строке задано финальное состояние массива \(a\): записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)). Все \(a_i\) — различны.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных теста не превосходит \(2\cdot10^3\).

Выходные данные

Для каждого набора входных данных выведите ответ на отдельной строке.

Выведите -1, если заданное финальное значение \(a\) нельзя получить, производя произвольное количество циклических сдвигов на каждой операции. Иначе выведите \(n\) неотрицательных целых чисел \(d_1, d_2, \dots, d_n\) (\(d_i \ge 0\)), где \(d_i\) обозначает, что во время \(i\)-й операции первые \(i\) элементов массива были циклически сдвинуты вправо \(d_i\) раз.

Если возможных ответов несколько выведите тот, где суммарное количество сдвигов минимально (то есть сумма значений \(d_i\) наименьшая). Если таких ответов несколько, то выведите любой из них.

Примечание

Первый набор входных данных совпадает с примером из условия.

Второй набор входных данных как видно несложный. Заметим, что ответ \([3, 2, 1]\) также даёт ту же перестановку, но так как суммарное количество сдвигов \(3+2+1\) больше \(0+0+1\), то такой ответ не является правильным.

E. Перенос экзамена

Бинарный поиск жадные алгоритмы математика реализация сортировки Структуры данных *1900

Сейчас у Дмитрия сессия, и он должен сдать \(n\) экзаменов. Сессия начинается в день \(1\) и длится \(d\) дней. \(i\)-й экзамен пройдёт в день \(a_i\) (\(1 \le a_i \le d\)), все \(a_i\) — различны.

Пример, где \(n=3\), \(d=12\), \(a=[3,5,9]\). Оранжевым — дни сдачи экзамена. Перед первым экзаменом Дмитрий отдохнёт \(2\) дня, перед вторым он отдохнёт \(1\) день и перед третьим он отдохнёт \(3\) дня.

Для расписания сессии Дмитрий считает специальную величину \(\mu\) — наименьшее из времен отдыха перед экзаменом по всем экзаменам. Например, для картинки выше \(\mu=1\). Иными словами, для расписания он подсчитывает ровно \(n\) чисел — сколько дней он отдыхает между экзаменом сдачей экзамена \(i-1\) и \(i\) (для \(i=0\) между началом сессии и сдачей экзамена \(i\)). Затем он находит \(\mu\) — минимум среди этих \(n\) чисел.

Дмитрий считает, что может улучшить предложенное расписание сессии. Он может попросить изменить дату одного экзамена (изменить одно произвольное значение \(a_i\)). Помогите ему поменять дату так, чтобы все \(a_i\) остались различны, а значение \(\mu\) было как можно больше.

Например, для рассмотренного выше расписания Дмитрию наиболее выгодно перенести второй экзамен на самый конец сессии. Новое расписание примет вид:

Теперь длительности отдыхов перед экзаменами равны \([2,2,5]\). Следовательно, \(\mu=2\).

Дмитрий может оставить предложенное расписание без изменений (если не существует способа передвинуть один экзамен так, что это приведёт к улучшению ситуации).

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Перед каждым набором в тесте записана пустая строка.

Первая строка описания каждого набора входных данных содержит два целых числа \(n\) и \(d\) (\(2 \le n \le 2 \cdot 10^5, 1 \le d \le 10^9\)) — количество экзаменов и длительность сессии, соответственно.

Вторая строка описания каждого набора входных данных содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le d, a_i < a_{i+1}\)), где \(i\)-е число означает дату сдачи \(i\)-го экзамена.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите максимальное возможное значение \(\mu\), если Дмитрий может перенести один любой экзамен на произвольный день. Все значения \(a_i\) должны остаться различны.

Примечание

Первый пример разобран в условии.

Одно из оптимальных изменений расписаний для второго примера:

Изначальное расписание.

Новое расписание

В третьем примере необходимо передвинуть экзамен с дня \(1\) на любой день от \(4\) до \(100\).

В четвёртом примере любое изменение расписания только уменьшит \(\mu\), соответственно расписание нужно оставить исходным.

В пятом примере необходимо перенести экзамен с дня \(1\) на любой день от \(100000000\) до \(300000000\).

Одно из оптимальных изменений расписаний для шестого примера:

Изначальное расписание.

Новое расписание

В седьмом примере каждый день занят экзаменами и перестроить расписание невозможно.

F. Виталий и Advanced Useless Algorithms

дп жадные алгоритмы реализация *2200

Виталий записался на курс Advanced Useless Algorithms. Курс состоит из \(n\) заданий. Виталий подсчитал, что до задания \(i\) у него есть \(a_i\) часов на выполнение, начиная с дня записи на курс. То есть, дедлайн до задания \(i\) составляет \(a_i\) часов. Массив \(a\) отсортирован по возрастанию, другими словами, номера заданий соответствуют порядку сдачи заданий.

Виталий все делает добросовестно, поэтому он хочет выполнить каждое задание на \(100\) процентов, или больше. Изначально его уровень выполнения по каждому заданию равен \(0\) процентов.

У Виталия есть \(m\) опций подготовки, каждая опция может быть использована не более одного раза. Опция \(i\) характеризуется тремя целыми числами: \(e_i, t_i\) и \(p_i\). Если Виталий использует \(i\)-ю опцию, то через \(t_i\) часов (с текущего момента) он улучшит выполнение задания \(e_i\) на \(p_i\) процентов.

Например, пусть Виталию предстоит выполнить \(3\) задания. Пусть массив \(a\) имеет вид: \(a = [5, 7, 8]\). Допустим, Виталию доступны \(5\) опций: \([e_1=1, t_1=1, p_1=30]\), \([e_2=2, t_2=3, p_2=50]\), \([e_3=2, t_3=3, p_3=100]\), \([e_4=1, t_4=1, p_4=80]\), \([e_5=3, t_5=3, p_5=100]\).

Тогда если Виталий будет готовиться следующим образом, он сможет выполнить все вовремя:

  • Виталий выбирает опцию \(4\). Тогда через \(1\) час он выполнит задание \(1\) на \(80\) процентов. До дедлайна задания \(1\) ему остается ещё \(4\) часа.
  • Виталий выбирает опцию \(3\). Тогда через \(3\) часа он полностью выполнит задание \(2\). До дедлайна задания \(1\) у него остается ещё \(1\) час, а до дедлайна задания \(3\) ему остаётся \(4\) часа.
  • Виталий выбирает опцию \(1\). Тогда через \(1\) час он выполнит задание \(1\) на \(110\) процентов, то есть успеет выполнить задание \(1\) как раз к дедлайну.
  • Виталий выбирает опцию \(5\). Тогда \(2\) часа он будет выполнять задание \(3\), и через еще \(1\) час Виталий полностью выполнит задание \(3\).

Таким образом, Виталий полностью и вовремя сумел пройти курс, использовав \(4\) опции.

Помогите Виталию — выведите опции, по которым Виталию следует выполнить задания в нужном порядке. Обратите внимание: каждая опция может быть использована не более одного раза. Если существует несколько возможных ответов, разрешается вывести любой.

Входные данные

В первой строке входных данных записано целое число \(T\) (\(1 \le T \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка описания каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 10^5\)) — количество заданий и количество опций подготовки соответственно.

В следующей строке заданы \(n\) чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — время до дедлайна задания \(i\). Заданные значения — не убывают, то есть \(a_1 \le a_2 \le \dots \le a_n\).

Следующие \(m\) строк содержат тройки чисел \(e_i, t_i, p_i\) (\(1 \le e_i \le n\), \(1 \le t_i \le 10^9\), \(1 \le p_i \le 100\)) — если Виталий выберет эту опцию, то через \(t_i\) часов он улучшит выполнение задания с номером \(e_i\) на \(p_i\) процентов. Опции пронумерованы от \(1\) до \(m\) в порядке следования во входных данных.

Гарантируется, что сумма \(n+m\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в первой строке число \(k\), означающие что за \(k\) опций Виталий сможет выполнить каждое задание на \(100\) процентов или больше вовремя. Опции не должны повторяться. Либо выведите -1, если Виталий не имеет возможности выполнить все задания вовремя.

Если ответ существует, то в следующей строке выведите \(k\) различных целых чисел от \(1\) до \(m\) — номера опций в нужном порядке. Если существует несколько ответов, разрешается вывести любой из них.

A. Плей-офф

реализация *800

Рассмотрим турнир по системе плей-офф, в котором участвуют \(2^n\) спортсменов. Спортсмены пронумерованы от \(1\) до \(2^n\).

Турнир проходит в \(n\) этапов. На каждом этапе спортсмены делятся на пары таким образом, что каждый оказывается ровно в одной паре. В каждой паре атлеты соревнуются друг с другом, и один из них побеждает. Победитель проходит в следующий этап турнира, проигравший покидает турнир.

Пары формируются следующим образом:

  • на первом этапе спортсмен \(1\) соревнуется со спортсменом \(2\); \(3\) соревнуется с \(4\); \(5\) соревнуется с \(6\), и так далее;
  • на втором этапе победитель пары «\(1\)\(2\)» соревнуется с победителем пары «\(3\)\(4\)»; победитель пары «\(5\)\(6\)» соревнуется с победителем пары «\(7\)\(8\)», и так далее;
  • следующие этапы проходят по той же закономерности.

Когда соревнуются спортсмены \(x\) и \(y\), победитель выбирается следующим образом:

  • если \(x+y\) нечетно, побеждает спортсмен с меньшим номером (то есть, если \(x < y\), то побеждает \(x\), иначе побеждает \(y\));
  • если \(x+y\) четно, побеждает спортсмен с большим номером.

На картинке показано, как проходит турнир при \(n = 3\).

Ваша задача состоит в следующем: по заданному числу \(n\) определите номер спортсмена, который будет победителем турнира.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 30\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей единственное целое число \(n\) (\(1 \le n \le 30\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число — номер победителя турнира.

Примечание

Случай \(n = 3\) разобран на картинке в условии.

Если \(n = 1\), то в турнире соревнуются только спортсмены \(1\) и \(2\). Так как \(1 + 2 = 3\) — нечетное число, спортсмен с меньшим номером побеждает. Поэтому спортсмен \(1\) — победитель турнира.

C. Отказоустойчивая сеть

Перебор реализация Структуры данных *1500

В компьютерном классе стоят два ряда компьютеров. В каждом ряду ровно по \(n\) компьютеров и у компьютеров есть своя классификация. Компьютеры в первом ряду имеют классы \(a_1, a_2, \dots, a_n\), а компьютеры во втором ряду — \(b_1, b_2, \dots, b_n\).

Первоначально, все пары соседних компьютеров в каждом ряду соединены кабелем (пары \((i, i + 1)\) для всех \(1 \le i < n\)), а потому ряды образуют две независимые компьютерные сети.

Ваша задача — объединить их в одну общую сеть посредством соединения одной или более пар компьютеров с разных рядов. Соединение \(i\)-го компьютера с первого ряда и \(j\)-го компьютера второго ряда стоит \(|a_i - b_j|\).

Вы можете соединять один компьютер с несколькими другими, но вам нужно обеспечить хотя бы базовую отказоустойчивость: вам нужно соединить компьютеры таким образом, чтобы сеть осталась цельной, даже если один из компьютеров будет уничтожен. Другими словами, какой бы один компьютер не был выведен из строя, сеть не развалится на несколько несвязанных частей.

Чему равна наименьшая стоимость построить отказоустойчивую сеть?

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — количество компьютеров в каждом ряду.

Во второй строке каждого набора заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — классы компьютеров в первом ряду.

В третьей строке заданы \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le 10^9\)) — классы компьютеров во втором ряду.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — минимальную суммарную стоимость построить отказоустойчивую сеть.

Примечание

В первом наборе входных данных, выгодно соединить четыре пары компьютеров:

  1. компьютер \(1\) на первом ряду и компьютер \(2\) на втором ряду: стоимость равна \(|1 - 4| = 3\);
  2. компьютер \(3\) на первом ряду и компьютер \(2\) на втором ряду: стоимость \(|1 - 4| = 3\);
  3. компьютер \(2\) на первом ряду и компьютер \(1\) на втором ряду: стоимость \(|10 - 20| = 10\);
  4. компьютер \(2\) на первом ряду и компьютер \(3\) на втором ряду: стоимость \(|10 - 25| = 15\);
В сумме, \(3 + 3 + 10 + 15 = 31\).

Во втором наборе, выгодно соединить \(1\) на первом ряду и \(1\) на втором ряду, а также \(4\) на первом ряду и \(4\) на втором.

C. Удаление скобочной последовательности

жадные алгоритмы реализация *1200

Вам задана скобочная последовательность, состоящая из \(n\) символов '(' и/или )'. Вы производите над ней последовательность операций.

В течение одной операции вы выбираете кратчайший префикс этой строки (какое-то количество первых символов строки), который является хорошим, и удаляете его из строки.

Префикс считается хорошим, если выполняется одно из следующих двух условий:

  • этот префикс является правильной скобочной последовательностью;
  • этот префикс является палиндромом длины хотя бы два.

Скобочная последовательность называется правильной, если из нее возможно получить корректное арифметическое выражение вставкой символов '+' и '1' в эту последовательность. Например, последовательности (())(), () и (()(())) являются правильными, когда )(, (() и (()))( ими не являются.

Скобочная последовательность называется палиндромом, если она читается одинаково и вперед и назад. Например, скобочные последовательности )), (( и )(() являются палиндромами, а скобочные последовательности (), )( и ))( ими не являются.

Вы прекращаете производить операции тогда, когда невозможно найти ни одного хорошего префикса. Ваша задача — найти количество операций, которые вы произведете, а также количество оставшихся в строке символов после всех операций.

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов тестовых данных. Следующие \(2t\) строк описывают сами наборы.

Первая строка набора содержит одно целое число \(n\) (\(1 \le n \le 5 \cdot 10^5\)) — длину скобочной последовательности.

Вторая строка набора содержит \(n\) символов '(' и/или ')' — саму скобочную последовательность.

Гарантируется, что сумма \(n\) по всем наборам тестовых данных не превышает \(5 \cdot 10^5\) (\(\sum n \le 5 \cdot 10^5\)).

Выходные данные

На каждый набор тестовых данных выведите два целых числа \(c\) и \(r\) — количество операций, которые вы произведете над данной скобочной последовательностью и количество оставшихся в ней символов после всех операций.

A. Марин и фотосессия

Конструктив математика реализация *800

Сегодня Марин пришла на фестиваль косплея и готовится к групповому фотоснимку!

Для группового снимка косплееры выстраиваются в горизонтальный ряд. Групповой снимок считается красивым, если на каждом непрерывном отрезке, включающем хотя бы \(2\) косплееров, количество мужчин не превышает количества женщин (очевидно).

Сейчас ряд состоит из \(n\) косплееров и может быть описан бинарной строкой \(s\). \(i\)-й косплеер — мужчина, если \(s_i = 0\), а женщина, если \(s_i = 1\). Чтобы сделать ряд красивым, вы можете предложить дополнительным косплеерам (возможно, нулю) встать в любое место в ряду. Вы не можете исключать косплееров из ряда.

Марин хочет узнать минимальное количество дополнительных косплееров, которых нужно пригласить, чтобы групповой снимок получился красивым. Она не может сделать это сама, поэтому просит у вас помощи. Сможете ей помочь?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое положительное число \(n\) (\(1 \leq n \leq 100\)) — начальное количество косплееров в ряду.

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\) — описание косплееров в ряду. Каждый символ строки это 0, означающий мужчину, или 1, означающий женщину.

Обратите внимание, что ограничений на сумму \(n\) по всем наборам нет.

Выходные данные

Для каждого набора входных данных выведите минимальное количество косплееров, которых нужно добавить в ряд, чтобы фото стало красивым.

Примечание

В первом примере для каждой пары подряд стоящих косплееров вы можете пригласить двух девушек-косплееров для того, чтобы они встали между ними. Тогда \(000 \rightarrow 0110110\).

В третьем наборе вы можете пригласить одну девушку-косплеера, чтобы она встала после второго косплеера. Тогда \(010 \rightarrow 0110\).

E. Годзё и игра на матрице

дп игры математика реализация сортировки Структуры данных теория чисел хэши *2500

Марин измоталась после долгого дня косплея, поэтому Годзё приглашает ее сыграть в игру!

Марин и Годзё по очереди кладут одну из своих фишек на таблицу размером \(n \times n\), при этом Марин ходит первой. Существуют некоторые ограничения на размещение фишек:

  • За исключением первого хода фишка, размещенная игроком, должна находиться на манхэттенском расстоянии более чем \(k\) от последней размещенной фишки. Другими словами, если игрок кладет фишку в \((x_1, y_1)\), то фишка, помещенная на следующем ходу, должна находиться в ячейке \((x_2, y_2)\), удовлетворяющей \(|x_2 - x_1| + |y_2 - y_1| > k\).
  • Помимо предыдущего ограничения, фишка может быть размещена в любом месте матрицы, включая ячейки, где уже были размещены фишки любого игрока.

Каждый раз, когда какой-либо игрок кладет фишку в ячейку \((x, y)\), этот игрок получает \(v_{x,\ y}\) очков. Все значения \(v\) в таблице различны. Очки за ячейку даются даже в случае, если какие-то фишки уже находятся в этой ячейке. Игра заканчивается, когда каждый игрок сделает \(10^{100}\) ходов.

Марин и Годзё сыграют \(n^2\) партий. Для каждой ячейки таблицы будет ровно одна партия, в которой первым ходом Марин размещает фишку в этой ячейке. Для каждой такой партии определите, у кого в итоге будет больше очков при оптимальной игре Марин и Годзё (после первого хода Марин)? Или партия закончится вничью?

Входные данные

Первая строка содержит два целых числа \(n\), \(k\) (\(3 \le n \le 2000\), \(1 \leq k \leq n - 2\)). Заметьте, что при таких ограничениях всегда возможно сделать ход.

Следующие \(n\) строк содержат по \(n\) целых чисел. \(j\)-м числом в \(i\)-й строке является \(v_{i,j}\) (\(1 \le v_{i,j} \le n^2\)). Все значения в \(v\) различны.

Выходные данные

Выведите \(n\) строк. \(i\)-я строка должна содержать \(n\) символов, где \(j\)-й символ является результатом партии, в которой Марин начинает с ячейки \((i, j)\). Выведите 'M' в случае победы Марин, 'G' — в случае победы Годзё и 'D' — в случае равного количества очков. Не выводите пробелы между символами в одной строке.

A. Красные против синих

жадные алгоритмы Конструктив математика реализация *1000

Команда красных и команда синих соревнуются в одной из игр-шутеров. Их игра транслировалась на весь мир. Всего они сыграли \(n\) матчей.

В конце оказалось, что команда красных выиграла \(r\) раз, а команда синих — \(b\) раз. Команда красных была сильнее, поэтому \(b\) строго меньше \(r\).

Вы пропустили трансляцию, но думаете, что матч был очень интересным, так как его смотрели много людей. Вы представляете строку длины \(n\), где \(i\)-й символ обозначает, кто выиграл \(i\)-й матч: R, если выиграла команда красных, и B, если выиграла команда синих. Вы считаете, что строка была такой, что максимальное число раз, которое какая либо команда выигрывала подряд было минимально возможным. Например, в строке RBBRRRB команда красных выиграла максимум \(3\) матча подряд.

Найдите строку, удовлетворяющую данным критериям. Если есть несколько возможных ответов, выведите любой.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор входных данных описывается одной строкой, содержащей три целых числа \(n\), \(r\) и \(b\) (\(3 \leq n \leq 100\); \(1 \leq b < r \leq n\), \(r+b=n\)).

Выходные данные

Для каждого набора входных данных выведите одну строку, удовлетворяющую данным условиям. Если существует несколько решений, выведите любое из них.

Примечание

Первый пример показывает оптимальный ответ для случая, описанного в в условии. Максимальное количество раз, которое команда выигрывала подряд в RBRBRBR, равно \(1\). Нельзя уменьшить это значение.

Ответ для второго примера RRBRBRBRBR. Максимальное количество раз, которое команда выигрывала подряд, равно \(2\), а именно в RR в начале строки. Можно показать, что нельзя уменьшить это значение.

C. Империя на прямой

Бинарный поиск дп жадные алгоритмы математика Перебор реализация *1500

Вы — амбициозный король, который хочет быть Императором Действительных чисел. Но перед этим вам нужно стать Императором Целых чисел.

Рассмотрим числовую ось. Столица вашей империи изначально находится в точке \(0\). На прямой есть \(n\) незахваченных королевств в позициях \(0<x_1<x_2<\ldots<x_n\). Вы хотите захватить все эти королевства.

Вы можете делать два вида действий:

  • Вы можете переместить свою столицу (пусть ее текущая координата \(c_1\)) в любое захваченное королевство (пусть его позиция \(c_2\)), стоимость такого действия \(a\cdot |c_1-c_2|\).
  • Вы можете из текущей столицы (пусть ее текущая координата \(c_1\)) захватить королевство (пусть его позиция \(c_2\)), стоимость такого действия \(b\cdot |c_1-c_2|\). Вы не можете захватывать королевство, если между вашей столицей и целью есть другие незахваченные королевства.

Обратите внимание, что вы не можете расположить столицу в точке, где нет королевства. Другими словами, в любой момент времени ваша столица может быть только в точке \(0\) или в \(x_1,x_2,\ldots,x_n\). Также обратите внимание, что захват королевства не изменяет положение вашей столицы.

Выведите минимальную суммарную стоимость захвата всех королевств. Ваша столица может оказаться в итоге в любой точке.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит \(3\) целых числа \(n\), \(a\) и \(b\) (\(1 \leq n \leq 2 \cdot 10^5\); \(1 \leq a,b \leq 10^5\)).

Вторая строка каждого набора содержит \(n\) целых чисел \(x_1, x_2, \ldots, x_n\) (\(1 \leq x_1 < x_2 < \ldots < x_n \leq 10^8\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число: минимальную стоимость захвата всех королевств.

Примечание

Ниже приведена оптимальная последовательность действий для второго примера:

  1. Захватить королевство в точке \(1\), стоимость \(3\cdot(1-0)=3\).
  2. Переместить столицу в королевство в точке \(1\), стоимость \(6\cdot(1-0)=6\).
  3. Захватить королевство в точке \(5\), стоимость \(3\cdot(5-1)=12\).
  4. Переместить столицу в королевство в точке \(5\), стоимость \(6\cdot(5-1)=24\).
  5. Захватить королевство в точке \(6\), стоимость \(3\cdot(6-5)=3\).
  6. Захватить королевство в точке \(21\), стоимость \(3\cdot(21-5)=48\).
  7. Захватить королевство в точке \(30\), стоимость \(3\cdot(30-5)=75\).

Суммарная стоимость \(3+6+12+24+3+48+75=171\). Нельзя получить меньшую стоимость.

D. Обратная сумма сортировки

жадные алгоритмы Конструктив математика реализация Структуры данных *1900

Представим, что у вас был массив \(A\) из \(n\) элементов, каждый из которых это \(0\) или \(1\).

Определим функцию \(f(k,A)\), которая возвращает массив \(B\), который является результатом сортировки первых \(k\) элементов массива \(A\) в неубывающем порядке. Например, \(f(4,[0,1,1,0,0,1,0]) = [0,0,1,1,0,1,0]\). Обратите внимание, что первые \(4\) элемента были отсортированы.

Рассмотрим массивы \(B_1, B_2,\ldots, B_n\), равные \(f(1,A), f(2,A),\ldots,f(n,A)\). Пусть \(C\) — массив, равный поэлементной сумме массивов \(B_1, B_2,\ldots, B_n\).

Например, пусть \(A=[0,1,0,1]\). Тогда \(B_1=[0,1,0,1]\), \(B_2=[0,1,0,1]\), \(B_3=[0,0,1,1]\), \(B_4=[0,0,1,1]\). Тогда \(C=B_1+B_2+B_3+B_4=[0,1,0,1]+[0,1,0,1]+[0,0,1,1]+[0,0,1,1]=[0,2,2,4]\).

Вам дан массив \(C\). Найдите бинарный массив \(A\) такой, что, если его обработать как описано выше, то получится данный массив \(C\). Гарантируется, что такой массив \(A\) существует для данного \(C\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк. Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)).

Вторая строка содержит \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(0 \leq c_i \leq n\)). Гарантируется, что для данного массива \(C\) существует подходящий массив \(A\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(a_i\) равно \(0\) или \(1\)). Если существуют несколько ответов, выведите любой.

Примечание

Рассмотрим первый пример. Начнем с массива \(A=[1,1,0,1]\) и построим массивы \(B_i\):

  • \(B_1=[\color{blue}{1},1,0,1]\);
  • \(B_2=[\color{blue}{1},\color{blue}{1},0,1]\);
  • \(B_3=[\color{blue}{0},\color{blue}{1},\color{blue}{1},1]\);
  • \(B_4=[\color{blue}{0},\color{blue}{1},\color{blue}{1},\color{blue}{1}]\)
Затем просуммируем каждый столбик и получим \(C=[1+1+0+0,1+1+1+1,0+0+1+1,1+1+1+1]=[2,4,2,4]\).

A. Ранклист

Бинарный поиск реализация сортировки *1100

Завершилось очередное соревнование по программированию. К Вам в руки попала таблица с финальными результатами этого соревнования. Для каждой команды в ней было указано количество задач, решенных данной командой, а также суммарное штрафное время данной команды по всем решенным ей задачам. Однако ни для одной команды в этой таблице не было указано ее финальное место.

Вам известны правила, по которым можно сравнить результаты двух заданных команд. Пусть команда a решила pa задач с суммарным штрафным временем ta, а команда b решила pb задач с суммарным штрафным временем tb. Тогда команда a займет более высокое итоговое место, чем команда b, если она решила больше задач на соревновании, либо она решила такое же количество задач, но с меньшим суммарным временем. Другими словами, команда a окажется выше команды b в финальной таблице результатов, если pa > pb, либо pa = pb и при этом ta < tb.

При этом считается, что команды, решившие одинаковое количество задач с одинаковым штрафным временем, делят между собой все соответствующие места. Более формально, пусть есть группа из x команд, которые решили одинаковое количество задач с одинаковым штрафным временем. Пусть также y команд выступили лучше команд из этой группы. Тогда все команды из группы разделят между собой y + 1, y + 2, ..., y + x места. Команды, результат которых хуже чем у команд из группы, получат свои места в итоговой таблице, начиная с y + x + 1 места.

Вашей задачей будет посчитать, какое количество команд из заданного списка разделило между собой k-ое место.

Входные данные

В первой строке заданы два целых числа n и k (1 ≤ k ≤ n ≤ 50). Далее в n строках следует описание команд: i-ая строка содержит два целых числа pi и ti (1 ≤ pi, ti ≤ 50) — количество решенных задач и суммарное штрафное время i-ой команды, соответственно. Все числа в строках разделены пробелами.

Выходные данные

В единственной строке выведите искомое количество команд, занявших k-ое место в итоговой таблице результатов.

Примечание

Итоговая таблица для первого примера:

  • 1-3 места — 4 решенных задачи, штрафное время равно 10
  • 4 место — 3 решенных задачи, штрафное время равно 20
  • 5-6 места — 2 решенные задачи, штрафное время равно 1
  • 7 место — 1 решенная задача, штрафное время равно 10

По таблице видно, что второе место разделили команды, решившие 4 задачи со штрафным временем 10. Всего есть 3 такие команды.

Итоговая таблица для второго примера:

  • 1 место — 5 решенных задач, штрафное время равно 3
  • 2-5 места — 3 решенные задачи, штрафное время равно 1

По таблице видно, что четвертое место разделили команды, решившие 3 задачи со штрафным временем 1. Всего есть 4 такие команды.

D. Максимальное произведение наносит ответный удар

математика Перебор реализация *1600

Дан массив \(a\), состоящий из \(n\) целых чисел. Для каждого \(i\) (\(1 \le i \le n\)) верно неравенство: \(-2 \le a_i \le 2\).

Вы можете удалить любое количество (возможно, \(0\)) элементов из начала массива и любое количество (возможно, \(0\)) элементов из конца массива. При этом разрешается удалить весь массив.

Вам нужно ответить на вопрос: сколько элементов нужно удалить из начала массива и сколько элементов нужно удалить из конца массива, чтобы в результате получился массив, произведение элементов которого максимально. Если существует более одного способа получить массив с максимальным произведением элементов, разрешается вывести любой из них.

Произведение чисел на пустом массиве (массиве длины \(0\)) следует считать равным \(1\).

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка описания каждого набора содержит целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину массива \(a\).

В следующей строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(|a_i| \le 2\)) — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два неотрицательных целых числа \(x\) и \(y\) (\(0 \le x + y \le n\)) — такие, что произведение чисел массива после удаления \(x\) элементов с начала и \(y\) элементов с конца, будет максимальным.

Если есть несколько способов получения максимального произведения, разрешается вывести любой. Произведение чисел на пустом массиве считать равным \(1\).

Примечание

В первом наборе входных данных примера максимальное значение произведения равно \(2\). Таким образом, можно либо удалить три первых элемента (получим массив \([2]\)), либо два последних и один первый элементы (также получим массив \([2]\)), либо два последних (получим массив \([1, 2]\)). Таким образом, в первом наборе подходят ответы: «3 0», «1 2» или «0 2».

Во втором наборе максимальное значение произведения равно \(1\). Тогда можно удалить все элементы из массива, так как значение произведения на пустом массиве будет равно \(1\). Таким образом, подходит ответ «3 0», но есть и другие возможные ответы.

В третьем наборе можно удалить два первых элемента массива. Тогда получим массив: \([-2, 2, -1]\). Произведение элементов полученного массива равно: \((-2) \cdot 2 \cdot (-1) = 4\). Это значение является максимально возможным из тех, которые можно получить. Таким образом, для этого набора входных данных подходит ответ «2 0».

E. Матрица и сдвиги

жадные алгоритмы Конструктив Перебор реализация *1600

Вам задана двоичная матрица \(A\) размера \(n \times n\). Строки пронумерованы сверху вниз от \(1\) до \(n\), столбцы пронумерованы слева направо от \(1\) до \(n\). Ячейка, находящаяся на пересечении строки \(i\) и столбца \(j\) называется \(A_{ij}\). Рассмотрим набор из \(4\) операций:

  1. Циклически сдвинуть все строки вверх. Строка с номером \(i\) будет записана на место строки \(i-1\) (\(2 \le i \le n\)), строка с номером \(1\) будет записана на место строки \(n\).
  2. Циклически сдвинуть все строки вниз. Строка с номером \(i\) будет записана на место строки \(i+1\) (\(1 \le i \le n - 1\)), строка с номером \(n\) будет записана на место строки \(1\).
  3. Циклически сдвинуть все столбцы влево. Столбец с номером \(j\) будет записан на место столбца \(j-1\) (\(2 \le j \le n\)), столбец с номером \(1\) будет записан на место столбца \(n\).
  4. Циклически сдвинуть все столбцы вправо. Столбец с номером \(j\) будет записан на место столбца \(j+1\) (\(1 \le j \le n - 1\)), столбец с номером \(n\) будет записан на место столбца \(1\).
Слева изображена матрица \(3 \times 3\) до применения к ней операции \(3\), справа — после.

Вы можете провести над матрицей произвольное (возможно, нулевое) количество операций, операции можно проводить в любом порядке.

После этого вы можете осуществить произвольное (возможно, нулевое) количество новых xor-операций:

  • Выбрать любую ячейку \(A_{ij}\) и записать в нее значение выражения \(A_{ij} \oplus 1\). Другими словами, в ячейку \(A_{ij}\) необходимо будет записать значение \((A_{ij} + 1) \bmod 2\).

Каждое применение этой xor-операции стоит один бурль. Заметим, что \(4\) операции сдвигов — бесплатные. Эти \(4\) операции можно проводить только до осуществления xor-операций.

Выведите минимальное количество бурлей, сколько придётся заплатить, чтобы сделать матрицу \(A\) единичной. Единичной называется такая матрица, на главной диагонали которой стоят единицы, а остальные её элементы являются нулями (то есть, \(A_{ij} = 1\) при \(i = j\) и \(A_{ij} = 0\) иначе).

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных. Перед каждым набором входных данных во входных данных записана пустая строка.

В первой строке каждого набора входных данных записано единственное число \(n\) (\(1 \le n \le 2000\))

Затем следует \(n\) строк, каждая из которых содержит ровно \(n\) символов и состоит только из нулей и единиц. Эти строки описывают значения в ячейках матрицы.

Гарантируется, что сумма значений \(n^2\) по всем наборам входных данных не превышает \(4 \cdot 10^6\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество бурлей, сколько придётся заплатить, чтобы сделать матрицу \(A\) единичной. Иными словами, выведите минимальное количество xor-операций, которое потребуется совершить после применения циклических сдвигов к матрице, для того, чтобы матрица \(A\) стала единичной.

Примечание

В первом наборе входных данных можно действовать следующим образом: сначала циклически сдвинуть все строки вниз, тогда на главной диагонали матрицы будут стоять одни единицы. Затем необходимо будет применить xor-операцию к единственной единице, которая окажется не на главной диагонали.

Во втором наборе входных данных можно получить единичную матрицу, дважды применив к матрице операцию \(2\) — циклический сдвиг строк вверх.

F1. Перспективные подстроки (простая версия)

математика Перебор реализация Строки *1700

Это простая версия задачи F. Единственное различие между простой и сложной версиями заключается в ограничениях.

Будем называть непустую строку сбалансированной, если она содержит одинаковое количество знаков плюс и минус. Например: строки «+--+» и «++-+--» являются сбалансированными, а строки «+--», «--» и «» не являются сбалансированными.

Будем называть строку перспективной, если строку можно сделать сбалансированной при помощи нескольких(возможно нуля) применений следующей операции:

  • заменим два соседних знака минуса на один знак плюс.

В частности, всякая сбалансированная строка является перспективной. Однако обратное неверно: не всякая перспективная строка — сбалансирована.

Например: строка «-+---» является перспективной, так как можно заменить два соседних минуса на плюс и получить сбалансированную строку «-++-», либо получить другую сбалансированную строку «-+-+».

Сколько непустых подстрок данной строки \(s\) являются перспективными? Каждая непустая перспективная подстрока должна быть учтена в ответе столько раз, сколько раз она встречается в строке \(s\).

Напомним, что подстрока — это последовательность подряд идущих символов строки. Например, для строки «+-+» её подстроками являются строки «+-», «-+», «+», «+-+» (строка является подстрокой самой себя) и некоторые другие. Но следующие строки её подстроками не являются: «--», «++», «-++».

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Каждый набор входных данных состоит из двух строк. В первой строке дано число \(n\) (\(1 \le n \le 3000\)) — длина строки \(s\).

Во второй строке набора дана строка \(s\) длины \(n\), состоящая только из знаков «+» и «-».

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3000\).

Выходные данные

Для каждого набора входных данных выведите единственное число — количество непустых перспективных подстрок строки \(s\). Каждая непустая перспективная подстрока должна быть учтена в ответе столько раз, сколько раз она встречается в строке \(s\).

Примечание

Ниже перечислены перспективные подстроки для первых трёх наборов входных данных примера:

  1. \(s[1 \dots 2]\)+-», \(s[2 \dots 3]\)-+»;
  2. \(s[1 \dots 2]\)-+», \(s[2 \dots 3]\)+-», \(s[1 \dots 5]\)-+---», \(s[3 \dots 5]\)---»;
  3. \(s[1 \dots 3]\)---», \(s[2 \dots 4]\)---».

F2. Перспективные подстроки (сложная версия)

математика реализация Строки Структуры данных *2100

Это сложная версия задачи F. Единственное различие между простой и сложной версиями заключается в ограничениях.

Будем называть непустую строку сбалансированной, если она содержит одинаковое количество знаков плюс и минус. Например: строки «+--+» и «++-+--» являются сбалансированными, а строки «+--», «--» и «» не являются сбалансированными.

Будем называть строку перспективной, если строку можно сделать сбалансированной при помощи нескольких(возможно нуля) применений следующей операции:

  • заменим два соседних знака минуса на один знак плюс.

В частности, всякая сбалансированная строка является перспективной. Однако обратное неверно: не всякая перспективная строка — сбалансирована.

Например: строка «-+---» является перспективной, так как можно заменить два соседних минуса на плюс и получить сбалансированную строку «-++-», либо получить другую сбалансированную строку «-+-+».

Сколько непустых подстрок данной строки \(s\) являются перспективными? Каждая непустая перспективная подстрока должна быть учтена в ответе столько раз, сколько раз она встречается в строке \(s\).

Напомним, что подстрока — это последовательность подряд идущих символов строки. Например, для строки «+-+» её подстроками являются строки «+-», «-+», «+», «+-+» (строка является подстрокой самой себя) и некоторые другие. Но следующие строки её подстроками не являются: «--», «++», «-++».

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Каждый набор входных данных состоит из двух строк. В первой строке дано число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина строки \(s\).

Во второй строке набора дана строка \(s\) длины \(n\), состоящая только из знаков «+» и «-».

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное число — количество непустых перспективных подстрок строки \(s\). Каждая непустая перспективная подстрока должна быть учтена в ответе столько раз, сколько раз она встречается в строке \(s\).

Примечание

Ниже перечислены перспективные подстроки для первых трёх наборов входных данных примера:

  1. \(s[1 \dots 2]\)+-», \(s[2 \dots 3]\)-+»;
  2. \(s[1 \dots 2]\)-+», \(s[2 \dots 3]\)+-», \(s[1 \dots 5]\)-+---», \(s[3 \dots 5]\)---»;
  3. \(s[1 \dots 3]\)---», \(s[2 \dots 4]\)---».

A. Organizing SWERC

Перебор реализация

Gianni, SWERC's chief judge, received a huge amount of high quality problems from the judges and now he has to choose a problem set for SWERC.

He received \(n\) problems and he assigned a beauty score and a difficulty to each of them. The \(i\)-th problem has beauty score equal to \(b_i\) and difficulty equal to \(d_i\). The beauty and the difficulty are integers between \(1\) and \(10\).

If there are no problems with a certain difficulty (the possible difficulties are \(1,2,\dots,10\)) then Gianni will ask for more problems to the judges.

Otherwise, for each difficulty between \(1\) and \(10\), he will put in the problem set one of the most beautiful problems with such difficulty (so the problem set will contain exactly \(10\) problems with distinct difficulties). You shall compute the total beauty of the problem set, that is the sum of the beauty scores of the problems chosen by Gianni.

Input

Each test contains multiple test cases. The first line contains an integer \(t\) (\(1\le t\le 100\)) — the number of test cases. The descriptions of the \(t\) test cases follow.

The first line of each test case contains the integer \(n\) (\(1\le n\le 100\)) — how many problems Gianni received from the judges.

The next \(n\) lines contain two integers each. The \(i\)-th of such lines contains \(b_i\) and \(d_i\) (\(1\le b_i, d_i\le 10\)) — the beauty score and the difficulty of the \(i\)-th problem.

Output

For each test case, print the total beauty of the problem set chosen by Gianni. If Gianni cannot create a problem set (because there are no problems with a certain difficulty) print the string MOREPROBLEMS (all letters are uppercase, there are no spaces).

Note

In the first test case, Gianni has received only \(3\) problems, with difficulties \(3, 4, 7\) which are not sufficient to create a problem set (for example because there is not a problem with difficulty \(1\)).

In the second test case, Gianni will create a problem set by taking the problems \(2\), \(3\), \(4\), \(5\), \(7\), \(8\), \(9\), \(10\), \(11\) (which have beauty equal to \(10\) and all difficulties from \(1\) to \(9\)) and one of the problems \(1\) and \(6\) (which have both beauty \(3\) and difficulty \(10\)). The total beauty of the resulting problem set is \(10\cdot 9 + 3 = 93\).

D. Evolution of Weasels

жадные алгоритмы реализация Строки

A wild basilisk just appeared at your doorstep. You are not entirely sure what a basilisk is and you wonder whether it evolved from your favorite animal, the weasel.

How can you find out whether basilisks evolved from weasels? Certainly, a good first step is to sequence both of their DNAs. Then you can try to check whether there is a sequence of possible mutations from the DNA of the weasel to the DNA of the basilisk.

Your friend Ron is a talented alchemist and has studied DNA sequences in many of his experiments. He has found out that DNA strings consist of the letters A, B and C and that single mutations can only remove or add substrings at any position in the string (a substring is a contiguous sequence of characters). The substrings that can be removed or added by a mutation are AA, BB, CC, ABAB or BCBC. During a sequence of mutations a DNA string may even become empty.

Ron has agreed to sequence the DNA of the weasel and the basilisk for you, but finding out whether there is a sequence of possible mutations that leads from one to the other is too difficult for him, so you have to do it on your own.

Input

Each test contains multiple test cases. The first line contains an integer \(t\) (\(1\le t\le 100\)) — the number of test cases. The descriptions of the \(t\) test cases follow.

The first line of each test case contains a string \(u\) (\(1\le |u|\le 200\)) — the DNA of the weasel.

The second line of each test case contains a string \(v\) (\(1\le |v|\le 200\)) — the DNA of the basilisk.

The values \(|u|\), \(|v|\) denote the lengths of the strings \(u\) and \(v\). It is guaranteed that both strings \(u\) and \(v\) consist of the letters A, B and C.

Output

For each test case, print YES if there is a sequence of mutations to get from \(u\) to \(v\) and NO otherwise.

F. Antennas

графы графы кратчайшие пути кратчайшие пути поиск в глубину и подобное реализация реализация Структуры данных

There are \(n\) equidistant antennas on a line, numbered from \(1\) to \(n\). Each antenna has a power rating, the power of the \(i\)-th antenna is \(p_i\).

The \(i\)-th and the \(j\)-th antenna can communicate directly if and only if their distance is at most the minimum of their powers, i.e., \(|i-j| \leq \min(p_i, p_j)\). Sending a message directly between two such antennas takes \(1\) second.

What is the minimum amount of time necessary to send a message from antenna \(a\) to antenna \(b\), possibly using other antennas as relays?

Input

Each test contains multiple test cases. The first line contains an integer \(t\) (\(1\le t\le 100\,000\)) — the number of test cases. The descriptions of the \(t\) test cases follow.

The first line of each test case contains three integers \(n\), \(a\), \(b\) (\(1 \leq a, b \leq n \leq 200\,000\)) — the number of antennas, and the origin and target antenna.

The second line contains \(n\) integers \(p_1, p_2, \dots, p_n\) (\(1 \leq p_i \leq n\)) — the powers of the antennas.

The sum of the values of \(n\) over all test cases does not exceed \(200\,000\).

Output

For each test case, print the number of seconds needed to trasmit a message from \(a\) to \(b\). It can be shown that under the problem constraints, it is always possible to send such a message.

Note

In the first test case, we must send a message from antenna \(2\) to antenna \(9\). A sequence of communications requiring \(4\) seconds, which is the minimum possible amount of time, is the following:

  • In \(1\) second we send the message from antenna \(2\) to antenna \(1\). This is possible since \(|2-1|\le \min(1, 4) = \min(p_2, p_1)\).
  • In \(1\) second we send the message from antenna \(1\) to antenna \(5\). This is possible since \(|1-5|\le \min(4, 5) = \min(p_1, p_5)\).
  • In \(1\) second we send the message from antenna \(5\) to antenna \(10\). This is possible since \(|5-10|\le \min(5, 5) = \min(p_5, p_{10})\).
  • In \(1\) second we send the message from antenna \(10\) to antenna \(9\). This is possible since \(|10-9|\le \min(5, 1) = \min(p_{10}, p_9)\).

F. Antennas

графы графы кратчайшие пути кратчайшие пути поиск в глубину и подобное реализация реализация Структуры данных

There are \(n\) equidistant antennas on a line, numbered from \(1\) to \(n\). Each antenna has a power rating, the power of the \(i\)-th antenna is \(p_i\).

The \(i\)-th and the \(j\)-th antenna can communicate directly if and only if their distance is at most the minimum of their powers, i.e., \(|i-j| \leq \min(p_i, p_j)\). Sending a message directly between two such antennas takes \(1\) second.

What is the minimum amount of time necessary to send a message from antenna \(a\) to antenna \(b\), possibly using other antennas as relays?

Input

Each test contains multiple test cases. The first line contains an integer \(t\) (\(1\le t\le 100\,000\)) — the number of test cases. The descriptions of the \(t\) test cases follow.

The first line of each test case contains three integers \(n\), \(a\), \(b\) (\(1 \leq a, b \leq n \leq 200\,000\)) — the number of antennas, and the origin and target antenna.

The second line contains \(n\) integers \(p_1, p_2, \dots, p_n\) (\(1 \leq p_i \leq n\)) — the powers of the antennas.

The sum of the values of \(n\) over all test cases does not exceed \(200\,000\).

Output

For each test case, print the number of seconds needed to trasmit a message from \(a\) to \(b\). It can be shown that under the problem constraints, it is always possible to send such a message.

Note

In the first test case, we must send a message from antenna \(2\) to antenna \(9\). A sequence of communications requiring \(4\) seconds, which is the minimum possible amount of time, is the following:

  • In \(1\) second we send the message from antenna \(2\) to antenna \(1\). This is possible since \(|2-1|\le \min(1, 4) = \min(p_2, p_1)\).
  • In \(1\) second we send the message from antenna \(1\) to antenna \(5\). This is possible since \(|1-5|\le \min(4, 5) = \min(p_1, p_5)\).
  • In \(1\) second we send the message from antenna \(5\) to antenna \(10\). This is possible since \(|5-10|\le \min(5, 5) = \min(p_5, p_{10})\).
  • In \(1\) second we send the message from antenna \(10\) to antenna \(9\). This is possible since \(|10-9|\le \min(5, 1) = \min(p_{10}, p_9)\).

I. Ice Cream Shop

Перебор реализация сортировки

On a beach there are \(n\) huts in a perfect line, hut \(1\) being at the left and hut \(i+1\) being \(100\) meters to the right of hut \(i\), for all \(1 \le i \le n - 1\). In hut \(i\) there are \(p_i\) people.

There are \(m\) ice cream sellers, also aligned in a perfect line with all the huts. The \(i\)-th ice cream seller has their shop \(x_i\) meters to the right of the first hut. All ice cream shops are at distinct locations, but they may be at the same location as a hut.

You want to open a new ice cream shop and you wonder what the best location for your shop is. You can place your ice cream shop anywhere on the beach (not necessarily at an integer distance from the first hut) as long as it is aligned with the huts and the other ice cream shops, even if there is already another ice cream shop or a hut at that location. You know that people would come to your shop only if it is strictly closer to their hut than any other ice cream shop.

If every person living in the huts wants to buy exactly one ice cream, what is the maximum number of ice creams that you can sell if you place the shop optimally?

Input

The first line contains two integers \(n\) and \(m\) (\(2 \le n \le 200\,000\), \(1 \le m \le 200\,000\)) — the number of huts and the number of ice cream sellers.

The second line contains \(n\) integers \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le 10^9\)) — the number of people in each hut.

The third line contains \(m\) integers \(x_1, x_2, \ldots, x_m\) (\(0 \le x_i \le 10^9\), \(x_i \ne x_j\) for \(i \ne j\)) — the location of each ice cream shop.

Output

Print the maximum number of ice creams that can be sold by choosing optimally the location of the new shop.

Note

In the first sample, you can place the shop (coloured orange in the picture below) \(150\) meters to the right of the first hut (for example) so that it is the closest shop to the first two huts, which have \(2\) and \(5\) people, for a total of \(7\) sold ice creams.

In the second sample, you can place the shop \(170\) meters to the right of the first hut (for example) so that it is the closest shop to the last two huts, which have \(7\) and \(8\) people, for a total of \(15\) sold ice creams.

O. Circular Maze

графы Перебор поиск в глубину и подобное реализация

You are given a circular maze such as the ones shown in the figures.

Determine if it can be solved, i.e., if there is a path which goes from the center to the outside of the maze which does not touch any wall. The maze is described by \(n\) walls. Each wall can be either circular or straight.
  • Circular walls are described by a radius \(r\), the distance from the center, and two angles \(\theta_1, \theta_2\) describing the beginning and the end of the wall in the clockwise direction. Notice that swapping the two angles changes the wall.
  • Straight walls are described by an angle \(\theta\), the direction of the wall, and two radii \(r_1 < r_2\) describing the beginning and the end of the wall.

Angles are measured in degrees; the angle \(0\) corresponds to the upward pointing direction; and angles increase clockwise (hence the east direction corresponds to the angle \(90\)).

Input

Each test contains multiple test cases. The first line contains an integer \(t\) (\(1\le t\le 20\)) — the number of test cases. The descriptions of the \(t\) test cases follow.

The first line of each test case contains an integer \(n\) (\(1 \leq n \leq 5000\)) — the number of walls.

Each of the following \(n\) lines each contains a character (C for circular, and S for straight) and three integers:

  • either \(r, \theta_1, \theta_2\) (\(1 \leq r \leq 20\) and \(0 \leq \theta_1,\theta_2 < 360\) with \(\theta_1 \neq \theta_2\)) if the wall is circular,
  • or \(r_1\), \(r_2\) and \(\theta\) (\(1 \leq r_1 < r_2 \leq 20\) and \(0 \leq \theta < 360\)) if the wall is straight.

It is guaranteed that circular walls do not overlap (but two circular walls may intersect at one or two points), and that straight walls do not overlap (but two straight walls may intersect at one point). However, circular and straight walls can intersect arbitrarily.

Output

For each test case, print YES if the maze can be solved and NO otherwise.

Note

The two sample test cases correspond to the two mazes in the picture.

B. Mike's Sequence

*особая задача математика разделяй и властвуй реализация

You won't find this sequence on OEIS.

Input

One integer \(r\) (\(-45 \le r \le 2999\)).

Output

One integer.

C. Pōja Verdon

*особая задача математика реализация

Aenar has an array \(a\) consisting of \(n\) integers.

Input

The first line is the integer \(n\) (\(1 \le n \le 100\)).

The second line contains \(n\) integers \(a_i\) (\(0 \le a_i \le 3979\)) — the contents of the array.

Output

Output a single number.

E. Are You Safe?

*особая задача реализация

Seven boys and seven girls from Athens were brought before King Minos. The evil king laughed and said "I hope you enjoy your stay in Crete".

With a loud clang, the doors behind them shut, and darkness reigned. The terrified children huddled together. In the distance they heard a bellowing, unholy roar.

Bravely, they advanced forward, to their doom.

Input

\(n\) (\(1 \le n \le 100\)) — the dimensions of the labyrinth.

Each of the next \(n\) lines contains a string of lowercase English letters of length \(n\).

E. МинимизатOR

битмаски жадные алгоритмы Перебор разделяй и властвуй реализация Структуры данных *2500

Дан массив \(a\) из \(n\) неотрицательных целых чисел, пронумерованных от \(1\) до \(n\).

Назовём стоимостью массива \(a\) величину, равную \(\displaystyle \min_{i \neq j} a_i | a_j\), где \(|\) обозначает операцию побитового ИЛИ.

Есть \(q\) запросов. Каждый запрос состоит из двух чисел \(l\) и \(r\) (\(l < r\)). Для каждого запроса необходимо вывести стоимость массива \(a_{l}, a_{l + 1}, \ldots, a_{r}\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 10^5\)) — длина массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i < 2^{30}\)) — элементы массива \(a\).

Третья строка каждого набора входных данных содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

Каждая из следующих \(q\) строк содержит два целых числа \(l_j\) и \(r_j\) (\(1 \le l_j < r_j \le n\)) — описание \(j\)-го запроса.

Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) чисел, где \(j\)-е число равно стоимости массива \(a_{l_j}, a_{l_j + 1}, \ldots, a_{r_j}\).

Примечание

В первом наборе входных данных массив \(a\) выглядит так:

\(110_2, 001_2, 011_2, 010_2, 001_2\).

Поэтому ответы на запросы будут следующими:

  • \([1; 2]\): \(a_1 | a_2 = 110_2 | 001_2 = 111_2 = 7\);
  • \([2; 3]\): \(a_2 | a_3 = 001_2 | 011_2 = 011_2 = 3\);
  • \([2; 4]\): \(a_2 | a_3 = a_3 | a_4 = a_2 | a_4 = 011_2 = 3\);
  • \([2; 5]\): \(a_2 | a_5 = 001_2 = 1\).

Во втором наборе входных данных массив \(a\) выглядит так:

\(00_2, 10_2, 01_2, \underbrace{11\ldots 1_2}_{30}\) (\(a_4 = 2^{30} - 1\)).

Поэтому ответы на запросы будут следующими:

  • \([1; 2]\): \(a_1 | a_2 = 10_2 = 2\);
  • \([2; 3]\): \(a_2 | a_3 = 11_2 = 3\);
  • \([1; 3]\): \(a_1 | a_3 = 01_2 = 1\);
  • \([3; 4]\): \(a_3 | a_4 = 01_2 | \underbrace{11\ldots 1_2}_{30} = 2^{30} - 1 = 1073741823\).

F. Инь и Ян

реализация *3500

Дана прямоугольная сетка, состоящая из \(n\) строк и \(m\) столбцов. \(n\) и \(m\) делятся на \(4\). Некоторые клетки уже покрашены в черный или белый. Гарантируется, что никакие две покрашенные клетки не являются соседями по стороне или углу.

Покрасьте оставшиеся клетки таким образом, чтобы и черные, и белые клетки стали ортогонально связными, или определите, что это невозможно.

Рассмотрим граф, в котором вершины — черные клетки. Две вершины соединены ребром, если соответствующие черные клетки являются соседями по стороне. Если получившийся граф связен, черные клетки считаются ортогонально связными. Аналогично для белых клеток.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 4000\)) — количество наборов входных данных. Далее следует их описание.

Первая строка каждого набора содержит два целых числа \(n\), \(m\) (\(8 \le n, m \le 500\), \(n\) и \(m\) делятся на \(4\)) — количество строк и столбцов.

Каждая из следующих \(n\) строк содержит \(m\) символов. Каждый символ — 'B', 'W' или '.' — кодирует черную, белую или пустую клетку соответственно. Никакие две покрашенные (черные или белые) клетки не являются соседями по стороне или углу.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(250\,000\).

Выходные данные

Для каждого набора входных данных выведите «NO», если решения не существует. В ином случае выведите «YES» и сетку в том же формате. Если существует несколько решений, выведите любое.

Примечание

Решение для первого набора входных данных:

Второй набор: можно показать, что черная и белая части не могут быть соединены одновременно. Таким образом, ответ «NO»

A. Смена направления

математика реализация *800

Дана сетка, состоящая из \(n\) строк и \(m\) столбцов. Строки и столбцы пронумерованы от \(1\) до \(n\) и от \(1\) до \(m\) соответственно. Пересечение \(a\)-й строки и \(b\)-го столбца обозначим за \((a, b)\).

Изначально вы находитесь в верхнем левом углу \((1, 1)\). Ваша цель — добраться до нижнего правого угла \((n, m)\)

Из клетки \((a, b)\) вы можете двигаться в четырех направлениях: вверх в клетку \((a-1, b)\), вниз в \((a+1, b)\), влево в \((a, b-1)\) или вправо в \((a, b+1)\)

Вам запрещается двигаться в одном направлении дважды подряд, вы не можете покидать пределы сетки. За какое минимальное количество шагов можно добраться до \((n, m)\)?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10^9\)) — размер сетки.

Выходные данные

Для каждого набора входных данных выведите одно целое число: \(-1\), если нельзя добраться до \((n, m)\) при заданных ограничениях, в ином случае — минимальное количество шагов.

Примечание

\(1\)-й набор входных данных: \(n=1\), \(m=1\), изначально вы находитесь в \((1, 1)\), поэтому \(0\) шагов необходимо, чтобы добраться до \((n, m) = (1, 1)\) .

\(2\)-й набор: нужно сделать один шаг вниз, чтобы достичь \((2, 1)\).

\(3\)-й набор: невозможно достичь \((1, 3)\), не сделав подряд два шага вправо или не покидая пределы сетки.

\(4\)-й набор: оптимальная последовательность шагов выглядит например так: \((1, 1) \to (1, 2) \to (2, 2) \to (2, 1) \to (3, 1) \to (3, 2) \to (4, 2)\). Можно доказать, что это оптимальное решение. Таким образом, ответ равен \(6\).

A. Дивизон?

реализация *800

На Codeforces пользователи разделены на \(4\) дивизиона по их рейтингу:

  • Для 1-го дивизиона: \(1900 \leq \mathrm{rating}\)
  • Для 2-го ивизиона: \(1600 \leq \mathrm{rating} \leq 1899\)
  • Для 3-го дивизиона: \(1400 \leq \mathrm{rating} \leq 1599\)
  • Для 4-го дивизиона: \(\mathrm{rating} \leq 1399\)

Учитывая \(\mathrm{rating}\), выведите, к какому дивизиону относится \(\mathrm{rating}\).

Входные данные

Первая строка ввода содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных в тесте.

Описание каждого набора состоит из одной строки, содержащей одно целое число \(\mathrm{rating}\) (\(-5000 \leq \mathrm{rating} \leq 5000\)).

Выходные данные

Для каждого набора входных данных выведите единственную строку, содержащую дивизион в формате «Division X», где \(X\) — целое число от \(1\) до \(4\), представляющее дивизион для соответствующего рейтинга.

Примечание

Для наборов входных данных \(1-4\) соответствующие оценки составляют \(-789\), \(1299\), \(1300\), \(1399\), поэтому все они находятся в дивизионе \(4\).

Для пятого набора соответствующая оценка составляет \(1400\), поэтому он находится в дивизионе \(3\).

Для шестого набора соответствующий рейтинг составляет \(1679\), поэтому он находится в дивизионе \(2\).

Для седьмого набора соответствующий рейтинг составляет \(2300\), поэтому он находится в дивизионе \(1\).

B. Тройка

реализация сортировки *800

Вам задан массив \(a\) из \(n\) элементов. Найдите любое число, которое встречается в этом массиве хотя бы три раза, или выведите -1, если таких чисел нет.

Входные данные

В первой строке задано целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 2\cdot10^5\)) — количество элементов в массиве.

Вторая строка набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq n\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите любое целое число, которое встречается в массиве хотя бы три раза, или -1, если такого числа нет.

Примечание

В первом наборе входных данных в массиве всего один элемент, поэтому не существует числа, которое встречается хотя бы три раза. Следовательно, ответ равен -1.

Во втором наборе входных данных все три элемента массива равны \(2\), поэтому \(2\) встречается трижды. Следовательно, в качестве ответа надо вывести \(2\).

В третьем наборе входных данных \(2\) встречается четыре раза, поэтому \(2\) — ответ.

В четвертом наборе входных данных \(4\) встречается три раза, поэтому \(4\) — ответ.

В пятом наборе входных данных каждое из чисел \(1\), \(2\) и \(3\) встречается хотя бы три раза, поэтому любое из них может быть ответом.

В шестом наборе входных данных все элементы массива различны, поэтому ни одно число не встречается хотя бы три раза, и ответ равен -1.

C. Чётные и нечётные инкременты

жадные алгоритмы жадные алгоритмы математика реализация *800

Дан массив \(a=[a_1,a_2,\dots,a_n]\), состоящий из \(n\) положительных целых чисел. Вы можете делать с ним два вида операций:

  1. Прибавить \(1\) к каждому элементу с нечётным индексом. То есть произойдут следующие присвоения: \(a_1 := a_1 +1, a_3 := a_3 + 1, a_5 := a_5+1, \dots\).

  2. Прибавить \(1\) к каждому элементу с чётным индексом. То есть произойдут следующие присвоения: \(a_2 := a_2 +1, a_4 := a_4 + 1, a_6 := a_6+1, \dots\).

Определите, возможно ли после какого-либо количества операций сделать так, чтобы после них массив содержал только чётные или только нечётные числа. Другими словами, определите, можете ли вы сделать так, чтобы все элементы массива имели одинаковую четность после какого-либо количества операций.

Обратите внимание, что вы можете выполнять операции обоих типов любое количество раз (в том числе ни одного). Операции разных типов могут выполняться разное количество раз.

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных в тесте.

Первая строка каждого набора содержит единственное целое число \(n\) (\(2 \leq n \leq 50\)) — длину массива.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq 10^3\)) — элементы массива.

Обратите внимание, что после выполнения операций элементы массива могут стать больше, чем \(10^3\).

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите «YES», если после некоторого количества операций возможно сделать так, чтобы массив содержал только чётные или только нечётные числа, и «NO» иначе.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом примере мы можем увеличить элементы на чётных позициях, после чего получим массив \([1, 3, 1]\), содержащий только нечётные числа, так что ответ «YES».

Во втором примере можно показать, что после любого количества операций мы не сможем привести все элементы к одной чётности, так что ответ «NO».

В третьем примере все элементы уже одной чётности и ответ «YES».

В четвёртом примере мы можем применить одну операцию и увеличить элементы на нечётных позициях на \(1\), после чего получим массив \([1001, 1, 1001, 1, 1001]\), все элементы которого нечётные, так что ответ «YES».

D. Разноцветная печать

реализация *1100

Вам дан ряд из \(n\) клеток, изначально каждая клетка белого цвета. С помощью печати, вы можете покрасить любые две соседние клетки так, что одна из них становится красной, а другая синей. Печать можно поворачивать, то есть вы можете покрасить клетки обоими способами: как \(\color{blue}{\texttt{B}}\color{red}{\texttt{R}}\), так и \(\color{red}{\texttt{R}}\color{blue}{\texttt{B}}\).

Во время каждого применения печати она должна находиться над заданными \(n\) клетками (то есть она не может частично находится вне этих клеток). На одну и ту же клетку печать может быть применена многократно. Каждое следующее применение печати перекрашивает обе клетки, которые под печатью.

Например, один из способов сделать рисунок \(\color{blue}{\texttt{B}}\color{red}{\texttt{R}}\color{blue}{\texttt{B}}\color{blue}{\texttt{B}}\texttt{W}\) выглядит так: \(\texttt{WWWWW} \to \texttt{WW}\color{brown}{\underline{\color{red}{\texttt{R}}\color{blue}{\texttt{B}}}}\texttt{W} \to \color{brown}{\underline{\color{blue}{\texttt{B}}\color{red}{\texttt{R}}}}\color{red}{\texttt{R}}\color{blue}{\texttt{B}}\texttt{W} \to \color{blue}{\texttt{B}}\color{brown}{\underline{\color{red}{\texttt{R}}\color{blue}{\texttt{B}}}}\color{blue}{\texttt{B}}\texttt{W}\). Здесь \(\texttt{W}\), \(\color{red}{\texttt{R}}\), и \(\color{blue}{\texttt{B}}\) обозначают белую, красную, и синюю клетки, соответственно, а клетки, к которым приложили печать подчёркнуты.

Дан конечный рисунок. Возможно ли сделать его, использовав печать ноль или больше раз?

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит единственное целое число \(n\) (\(1 \leq n \leq 10^5\)) — длина рисунка.

Вторая строка каждого набора содержит строку \(s\) — рисунок, который нужно получить. Гарантируется, что длина \(s\) равна \(n\) и \(s\) состоит только из символов \(\texttt{W}\), \(\texttt{R}\), и \(\texttt{B}\), обозначающие белую, красную, и синюю клетки, соответственно.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите «YES», если возможно получить рисунок, используя печать, и «NO» иначе.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Первый пример разобран в условии.

Во втором, третьем и четвёртом примерах невозможно покрасить одну клетку, так что ответ «NO».

В пятом примере можно поркасить следующим образом: \(\texttt{WWW} \to \texttt{W}\color{brown}{\underline{\color{red}{\texttt{R}}\color{blue}{\texttt{B}}}} \to \color{brown}{\underline{\color{blue}{\texttt{B}}\color{red}{\texttt{R}}}}\color{blue}{\texttt{B}}\).

В шестом примере можно поркасить следующим образом: \(\texttt{WWW} \to \texttt{W}\color{brown}{\underline{\color{red}{\texttt{R}}\color{blue}{\texttt{B}}}} \to \color{brown}{\underline{\color{red}{\texttt{R}}\color{blue}{\texttt{B}}}}\color{blue}{\texttt{B}}\).

В седьмом примере печать не нужно использовать вовсе.

G. Падение

поиск в глубину и подобное реализация *1200

Дана матрица из \(n\) строк и \(m\) столбцов, каждая ячейка которой имеет один из трех типов:

  • Пустая ячейка (обозначается как «.»).
  • Камень (обозначается как «*»).
  • Препятствие (обозначается как строчная буква латинского алфавита «o»).

Каждый камень начинает падать, пока не окажется на полу (в нижней строке матрицы), в ячейке над препятствием, или в ячейке над другим камнем, который уже закончил падение. (Другими словами, все камни начинают падать и падают, пока под ними пустые ячейки.)

Просимулируйте процесс и выведите состояние матрицы после того, как все камни закончат падать.

Входные данные

В первой строке задано целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют сами наборы входных данных.

В первой строке каждого набора входных данных заданы два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 50\)) — количество строк и столбцов в матрице.

Затем следуют \(n\) строк, каждая из которых содержит \(m\) символов. Каждый из этих символов — «.», «*» или «o» (пустая клетка, камень и препятствие соответственно).

Выходные данные

Для каждого набора входных данных выведите матрицу из \(n\) строк и \(m\) столбцов, описывающую результат процесса.

Не обязательно выводить новую строку после каждого набора входных данных; в примерах из условия она выводится для наглядности.

A. Волшебники и троллейбусы

математика реализация *1600

В некоторой стране живут волшебники. Они любят ездить на троллейбусах.

В одном городе этой страны есть троллейбусное депо с n троллейбусами. Каждый день троллейбусы выезжают из депо один за другим и едут до конечной станции. Конечная станция находится на расстоянии d метров от депо. Про i-ый троллейбус известно, что он выезжает в момент времени ti секунд, может ехать со скоростью не более vi метров в секунду и ускоряться с ускорением, не превосходящем a метров в секунду за секунду. Замедляться троллейбус может сколь угодно быстро (магия!). Менять свое ускорение троллейбус может также сколь угодно быстро. Обратите внимание, что максимальное ускорение у всех троллейбусов одинаковое.

Несмотря на волшебство, троллейбусы все еще питаются от электрической цепи и не могут обгонять друг друга (во всем виноваты, конечно же, провода). Если один троллейбус догоняет другой, то они едут вплотную друг за другом, пока не приедут на конечную станцию. При этом водители едут так, чтобы приехать на конечную станцию как можно быстрее.

Вам, как главе клуба любителей троллейбусов, предстоит определить для каждого троллейбуса минимальное время, к которому он может доехать до конечной станции. Во время приезда на конечную станцию не обязательно иметь нулевую скорость. При выезде из депо скорость троллейбуса считается равной нулю. С точки зрения физики, троллейбусы можно считать материальными точками, а также следует пренебречь воздействием на скорость троллейбуса всего, кроме ускорения и замедления, обеспечиваемого двигателем.

Входные данные

В первой строке входных данных записаны три целых числа через пробел n, a, d (1 ≤ n ≤ 105, 1 ≤ a, d ≤ 106) — количество троллейбусов, максимальное ускорение троллейбусов и расстояние от депо до конечной станции, соответственно.

В следующих n строках записаны пары целых чисел ti vi (0 ≤ t1 < t2... < tn - 1 < tn ≤ 106, 1 ≤ vi ≤ 106) — время отправления из депо i-го троллейбуса и его максимальная скорость, соответственно. Числа в строках разделяются пробелами.

Выходные данные

Для каждого троллейбуса выведите время приезда на конечную станцию в отдельной строке. Времена для троллейбусов выводите в порядке задания троллейбусов во входном файле. Ответ будет засчитан, если абсолютная или относительная погрешность не превосходит 10 - 4.

Примечание

В первом примере второй троллейбус догонит первый, это произойдет на расстоянии 510.5 метров от депо. Оставшиеся 9489.5 метров они проедут вместе со скоростью 10 метров в секунду. В итоге оба троллейбуса прибудут на конечную станцию к моменту времени 1000.5 секунд. Третий троллейбус их не догонит. Он приедет на конечную станцию к моменту времени 11000.05 секунд.

A. Профессор Слим

жадные алгоритмы реализация сортировки *800

Однажды профессор Слим решил покинуть королевство GUC и переехать в королевство GIU. Чтобы быть принятым в GIU, он должен сначала пройти несложный онлайн-тест. Жители GUC были счастливы расстроены, что профессор уезжает, поэтому они решили взломать систему и поменять задачу в тесте на более сложную. После долгих обсуждений они сошлись на следующей задаче.

Дан массив из \(n\) целых чисел \(a_1,a_2,\ldots,a_n\), где \(a_{i} \neq 0\), проверьте, можно ли сделать этот массив отсортированным, применив следующую операцию несколько (возможно, ноль) раз. Массив называется отсортированным, если его элементы расположены в порядке неубывания.

  1. выберете два индекса \(i\) и \(j\) (\(1 \le i,j \le n\)) такие, что числа \(a_i\) и \(a_j\) различного знака. Другими словами, одно из этих чисел должно быть положительно, а другое отрицательно.
  2. поменяйте местами знаки чисел \(a_{i}\) и \(a_{j}\). Например, если \(a_i=3\), а \(a_j=-2\), то они изменятся на \(a_i=-3\) и \(a_j=2\).

Профессор Слим понял, что задача все еще простая и не стоит его времени, поэтому он предоставил вам возможность решить ее.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 10^{5}\)) — длину массива \(a\).

Следующая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_{i} \le 10^9\), \(a_{i} \neq 0\)) — массив \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если массив может быть отсортирован в порядке неубывания, иначе выведите «NO». Можно выводить каждую букву в любом регистре (верхнем или нижнем).

Примечание

В первом наборе нет способа сделать массив отсортированным.

Во втором наборе массив уже отсортирован.

В третьем наборе можно поменять знаки \(1\)-го и \(5\)-го элементов, а затем знаки \(3\)-го и \(6\)-го элементов, после чего массив будет отсортирован.

В четвертом примере нет способа сделать массив отсортированным.

B. Общажные войны

Перебор реализация Строки *1100

Хоссам решил проникнуть в комнату Хемоса, пока он спит, и сменить пароль на его ноутбуке. Он уже знает исходный пароль, равный строке \(s\) длины \(n\). Он также знает, что существуют \(k\) особых букв в алфавите: \(c_1,c_2,\ldots, c_k\).

Хоссам написал программу, которая делает следующее.

  1. Программа рассматривает текущий пароль \(s\) некоторой длины \(m\).
  2. Затем она находит все такие позиции \(i\) (\(1\le i<m\)), что \(s_{i+1}\) — одна из \(k\) особых букв.
  3. После этого она удаляет все символы на таких позициях из пароля \(s\) даже если \(s_{i}\) — особая буква. Если таких позиций нет, программа выдает ошибку с очень громким звуком.

Например, пусть строка \(s\) равна «abcdef», а особые буквы — «b» и «d». Если Хоссам запустит программу один раз, символы на позициях \(1\) и \(3\) будут удалены, так как они находятся перед особыми символами, и пароль станет равным «bdef». Если он запустит программу еще раз, она удалит символ на позиции \(1\), и пароль станет «def». Хоссам поступит разумно, если не будет запускать программу в третий раз.

Хоссам хочет узнать, сколько максимум раз он может запустить программу на ноутбуке Хемоса, не разбудив его сигналом ошибки. Можете помочь ему?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 10^5\)) — исходную длину пароля.

Следующая строка содержит строку \(s\), состоящую из \(n\) строчных букв латинского алфавита — исходный пароль.

Следующая строка содержит целое число \(k\) (\(1 \le k \le 26\)), а затем \(k\) различных строчных букв латинского алфавита \(c_1,c_2,\ldots,c_k\) — особые буквы.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите максимальное количество раз, которое Хоссам может запустить программу, не вызвав ошибку.

Примечание

В первом наборе входных данных программу можно запустить \(5\) раз: \(\text{iloveslim} \to \text{ilovslim} \to \text{iloslim} \to \text{ilslim} \to \text{islim} \to \text{slim}\)

Во втором наборе входных данных программу можно запустить \(2\) раза: \(\text{joobeel} \to \text{oel} \to \text{el}\)

В третьем наборе входных данных программу можно запустить \(3\) раза: \(\text{basiozi} \to \text{bioi} \to \text{ii} \to \text{i}\).

В четвертом наборе входных данных программу можно запустить \(5\) раз: \(\text{khater} \to \text{khatr} \to \text{khar} \to \text{khr} \to \text{kr} \to \text{r}\)

В пятом наборе входных данных программу можно запустить только раз: \(\text{abobeih} \to \text{h}\)

В шестом наборе программу нельзя запустить ни разу, так как пароль не содержит особых символов.

C. Где пицца?

графы математика поиск в глубину и подобное реализация снм Структуры данных *1400

Хоссам в попытках найти пиццу наткнулся на две перестановки \(a\) и \(b\) длины \(n\).

Вспомним, что перестановкой называется массив из \(n\) различных чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, а \([1,2,2]\) — не перестановка (\(2\) встречается дважды), и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве есть число \(4\)).

Хоссам позабыл про пиццу и начал играть с этими перестановками. В процессе игры некоторые элементы первой перестановки смешались с элементами второй, но к удивлению Хоссама в итоге получилась тоже перестановка длины \(n\).

Более конкретно, он смешал перестановки, получив массив \(c\) следующим образом.

  • Для всех \(i\) (\(1\le i\le n\)), он сделал \(c_i=a_i\) или \(c_i=b_i\).
  • Массив \(c\) является перестановкой.

Вы знаете две перестановки \(a\) и \(b\) и значения на некоторых позициях в \(c\). Пожалуйста, посчитайте количество различных перестановок \(c\), не противоречащих описанному процессу и известным значениям. Так как ответ может быть большим, выведите его по модулю \(10^9+7\).

Гарантируется, что существует хотя бы одна перестановка \(c\), удовлетворяющая всем ограничениям.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\le n\le 10^5\)) — длину перестановок.

Следующая строка содержит \(n\) различных чисел \(a_1,a_2,\ldots,a_n\) (\(1\le a_i\le n\)) — первую перестановку.

Следующая строка содержит \(n\) различных чисел \(b_1,b_2,\ldots,b_n\) (\(1\le b_i\le n\)) — вторую перестановку.

Следующая строка содержит \(n\) целых чисел \(d_1,d_2,\ldots,d_n\) (\(d_i\) равно \(0\), \(a_i\), или \(b_i\)) — описание известных значений \(c\). Если \(d_i=0\), то про значение \(c_i\) ничего не известно. Иначе \(c_i=d_i\).

Гарантируется, что существует хотя бы одна перестановка \(c\), удовлетворяющая всем ограничениям.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите количество различных перестановок \(c\) по модулю \(10^9+7\).

Примечание

В первом наборе входных данных подходят \(4\) перестановки: \([2,3,1,4,5,6,7]\), \([2,3,1,7,6,5,4]\), \([2,3,1,4,6,5,7]\), \([2,3,1,7,5,6,4]\).

Во втором наборе входных данных подходит только одна перестановка: \([1]\).

В третьем наборе входных данных подходят \(2\) перестановки: \([6,5,2,1,4,3]\), \([6,5,3,1,4,2]\).

В четвертом наборе входных данных подходят \(2\) перестановки: \([1,2,8,7,4,3,6,5]\), \([1,6,4,7,2,3,8,5]\).

В пятом наборе входных данных подходит только одна перестановка: \([1,9,2,3,4,10,8,6,7,5]\).

D. Очень подозрительно

Бинарный поиск геометрия жадные алгоритмы математика Перебор реализация *1700

Хоссам и его друзья владеют плоскостью, разбитой бесконечной сеткой на правильные шестиугольники, как показано на рисунке ниже. Им нравятся равносторонние треугольники, поэтому они хотят создать на плоскости \(n\) равносторонних треугольников, добавив несколько прямых. Считаться будут только треугольники, внутри которых ничего нет (то есть внутри которых не проходит ни одна прямая и ни одна сторона шестиугольника).

Вы можете добавлять прямые, параллельные сторонам шестиугольников. Вам дано число \(n\), какое минимальное число прямых нужно добавить, чтобы создать хотя бы \(n\) равносторонних треугольников?

Добавление двух красных прямых создает два желтых треугольника.
Входные данные

Первая строка содержит одно цело число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных состоит из одного целого числа \(n\) (\(1 \le n \le 10^{9}\)) — требуемого количества треугольников.

Выходные данные

Для каждого набора выведите минимальное количество прямых, необходимое для создания \(n\) или больше равносторонних треугольников.

Примечание

В первом и втором примере нужны две прямые. После добавления первой не будет ни одного трекгольника независимо от места создания. После добавления второй можно одновременно создать два треугольника.

В третьем наборе входных данных нужно минимум три прямых, как показано ниже.

A. Построение строки

реализация *800

Вам дана строка \(s\). Вы должны определить, можно ли получить строку \(s\) из строк aa, aaa, bb и/или bbb их конкатенацией. Строки aa, aaa, bb и/или bbb можно использовать в любом порядке любое количество раз.

Например:

  • aaaabbb можно получить как aa \(+\) aa \(+\) bbb;
  • bbaaaaabbb можно получить как bb \(+\) aaa \(+\) aa \(+\) bbb;
  • aaaaaa можно получить как aa \(+\) aa \(+\) aa;
  • abab нельзя получить из строк aa, aaa, bb и/или bbb.
Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из единственной строки \(s\) (\(1 \le |s| \le 50\)), состоящей из символов a и/или b.

Выходные данные

Для каждого набора входных данных выведите YES, если возможно построить строку \(s\). Иначе выведите NO.

Вы можете выводить каждую букву в любом регистре (YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

Примечание

Первые четыре набора входных данных разобраны в условии.

A. Рубка бревен

игры математика реализация *800

Есть \(n\) бревен, длина \(i\)-го бревна составляет \(a_i\) метров. Поскольку рубить бревна  — утомительная работа, errorgorn и maomao90 решили сыграть в игру.

errorgorn и maomao90 будут по очереди рубить бревна, причем errorgorn рубит первым. В свой ход игрок выбирает бревно и рубит его на \(2\) части. Если длина выбранного бревна \(x\), а длины получившихся кусков \(y\) и \(z\), то должно выполняться условие \(x=y+z\), а \(y\) и \(z\) должны быть целыми положительными числами. Например, бревно длиной \(3\) можно разрубить на бревна с длинами \(2\) и \(1\), но не на бревна с длинами \(3\) и \(0\), \(2\) и \(2\), или \(1.5\) и \(1.5\).

Игрок, который не сможет выбрать бревно и разрубить его, проиграет. Кто победит, если и errorgorn, и maomao90 играют оптимально?

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\))  — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 50\))  — количество бревен.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2, \ldots, a_n\) (\(1 \leq a_i \leq 50\))  — длины бревен.

Обратите внимание, что ограничения на сумму \(n\) по всем наборам входных данных нет.

Выходные данные

Для каждого набора входных данных выведите «errorgorn», если победил errorgorn, или «maomao90», если победил maomao90. (Выводите без кавычек).

Примечание

В первом наборе входных данных победителем будет errorgorn. Оптимальным ходом будет разрезать бревно длиной \(4\) на \(2\) бревна длиной \(2\). После этого останется только \(4\) бревен длины \(2\) и \(1\) бревен длины \(1\).

После этого единственный ход, который может сделать любой игрок, это разрубить любое бревно длиной \(2\) на \(2\) бревна длиной \(1\). После \(4\) ходов наступит очередь maomao90, и он не сможет сделать ход. Поэтому победителем будет errorgorn.

Во втором наборе входных данных errorgorn не сможет сделать ход в свой первый ход и сразу же проиграет, в результате чего победителем станет maomao90.

B. Я люблю AAAB

Конструктив реализация *800

Назовем строку хорошей, если ее длина не менее \(2\) и все её символы равны \(\texttt{A}\), кроме последнего символа, который равен \(\texttt{B}\). Таким образом, хорошими строками являются \(\texttt{AB},\texttt{AAB},\texttt{AAAB},\ldots\). Обратите внимание, что \(\texttt{B}\)  — это не хорошая строка.

Вам дана изначально пустая строка \(s_1\).

Вы можете выполнить следующую операцию любое количество раз:

  • Выберите любую позицию \(s_1\) и вставьте в эту позицию хорошую строку.

Вам дана строка \(s_2\). Можно ли после некоторого количества операций превратить \(s_1\) в \(s_2\)?

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственную строку \(s_2\) (\(1 \leq |s_2| \leq 2 \cdot 10^5\)).

Гарантируется, что \(s_2\) состоит только из символов \(\texttt{A}\) и \(\texttt{B}\).

Гарантируется, что сумма \(|s_2|\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если мы можем превратить \(s_1\) в \(s_2\) после некоторого количества операций, и «NO» (без кавычек) в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут засчитаны как положительный ответ).

Примечание

В первом наборе входных данных мы можем преобразовать \(s_1\) следующим образом: \(\varnothing \to \color{red}{\texttt{AAB}} \to \texttt{A}\color{red}{\texttt{AB}}\texttt{AB}\).

В третьем наборе входных данных мы можем преобразовать \(s_1\) следующим образом: \(\varnothing \to \color{red}{\texttt{AAAAAAAAB}}\).

Во втором и четвертом наборах входных данных можно показать, что невозможно превратить \(s_1\) в \(s_2\).

C. Неравный массив

жадные алгоритмы Конструктив реализация *1100

Вам дан массив \(a\) длины \(n\). Определим равность массива как количество индексов \(1 \le i \le n - 1\) таких, что \(a_i = a_{i + 1}\). Мы можем выполнять следующую операцию:

  • Выберите любые два целых числа \(i\) и \(x\) такие, что \(1 \le i \le n - 1\) и \(1 \le x \le 10^9\). После этого, сделайте \(a_i\) и \(a_{i + 1}\) равными \(x\).

Найдите минимальное количество операций, необходимых для того, чтобы равность массива стала меньше или равна \(1\).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10 ^ 5\))  — длину массива \(a\).

Вторая строка каждого тестового примера содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\))  — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10 ^ 5\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество необходимых операций.

Примечание

В первом наборе входных данных мы можем выбрать \(i=2\) и \(x=2\), получив \([1, 2, 2, 1, 1]\). Затем мы можем выбрать \(i=3\) и \(x=3\), получив \([1, 2, 3, 3, 1]\).

Во втором наборе входных данных мы можем выбрать \(i=3\) и \(x=100\), получив \([2, 1, 100, 100, 2]\).

D. Циклический сдвиг

жадные алгоритмы Конструктив реализация *1700

Дан массив \(a\) длины \(n\). Вы можете выполнить следующую операцию любое количество раз:

  • Выберите два индекса \(l\) и \(r\) такие, что \(1 \le l < r \le n\) и \(a_l = a_r\). После этого, присвоим \(a[l \ldots r] = [a_{l+1}, a_{l+2}, \ldots, a_r, a_l]\).

Вам также дан другой массив \(b\) длины \(n\), который является перестановкой \(a\). Определите, можно ли преобразовать массив \(a\) в массив \(b\), применив описанную выше операцию некоторое количество раз.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10 ^ 5\))  — длину массивов \(a\) и \(b\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\))  — элементы массива \(a\).

Третья строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le n\))  — элементы массива \(b\).

Гарантируется, что \(b\) является перестановкой \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10 ^ 5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если возможно преобразовать массив \(a\) в \(b\), и «NO» (без кавычек) в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут засчитаны как положительный ответ).

Примечание

В первом наборе входных данных мы можем выбрать \(l=2\) и \(r=5\), получив \([1, 3, 3, 2, 2]\).

Во втором наборов входных данных мы можем выбрать \(l=2\) и \(r=4\), получив \([1, 4, 2, 2, 1]\). Затем мы можем выбрать \(l=1\) и \(r=5\), получив \([4, 2, 2, 1, 1]\).

В третьем наборе входных данных можно доказать, что преобразовать массив \(a\) в \(b\) с помощью данных операций невозможно.

C. Бесконечная замена

Комбинаторика реализация Строки *1000

Дана строка \(s\), состоящая только из латинских букв 'a', и строка \(t\), состоящая из строчных латинских букв.

За один ход вы можете заменить любую букву 'a' в строке \(s\) на строку \(t\). Обратите внимание, что после замены в строке \(s\) могут оказаться буквы, отличные от 'a'.

Можно проделать произвольное количество ходов (включая ноль). Сколько различных строк можно получить? Выведите это число или скажите, что оно бесконечно большое.

Две строки считаются различными, если у них различается длина, или они различаются в какой-либо позиции.

Входные данные

В первой строке записано одно целое число \(q\) (\(1 \le q \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора записана непустая строка \(s\), состоящая только из латинских букв 'a'. Длина строки \(s\) не превосходит \(50\).

Во второй строке записана непустая строка \(t\), состоящая из строчных латинских букв. Длина \(t\) не превосходит \(50\).

Выходные данные

На каждый набор входных данных выведите количество различных строк \(s\), которые можно получить после применения произвольного количества ходов (включая ноль). Если это число бесконечно большое, то выведите -1. Иначе выведите это число.

Примечание

В первом примере можно заменить любую букву 'a' на строку «a», но это не изменит строку. Так что вне зависимости от того, сколько ходов вы проделаете, вы не сможете получить строку отличную от начальной.

Во втором примере можно заменить вторую букву 'a' на «abc». Строка \(s\) становится равна «aabc». Затем снова вторую букву 'a'. Строка \(s\) становится равна «aabcbc». И так далее, производя бесконечно много различных строк.

В третьем примере можно либо оставить строку \(s\) как есть, проделав ноль ходов, либо заменить единственную 'a' на «b». Строка \(s\) становится равна «b», так что над ней больше нельзя проделать ходы.

D. A-B-C Сортировка

Конструктив реализация сортировки *1200

Вам заданы три массива \(a\), \(b\) и \(c\). Первоначально, массив \(a\) состоит из \(n\) элементов, массивы \(b\) и \(c\) — пустые.

Вы выполняете над ними следующий алгоритм, состоящий из двух шагов:

  • Шаг \(1\): пока \(a\) не пуст, вы забираете из \(a\) последний элемент и перемещаете его в середину массива \(b\). Если \(b\) в данный момент нечетной длины, то вы сами можете выбрать: вставить число из \(a\) слева или справа от центрального элемента в \(b\). В результате \(a\) станет пустым, а \(b\) будет состоять из \(n\) элементов.
  • Шаг \(2\): пока \(b\) не пуст, вы забираете из \(b\) центральный элемент и перемещаете его в конец массива \(c\). Если \(b\) в данный момент четной длины, то вы сами можете выбрать какой из двух центральных элементов забрать. В результате \(b\) станет пустым, а \(c\) теперь состоит из \(n\) элементов.
Обратитесь к Примечанию за примерами.

Можете ли вы получить отсортированный в порядке неубывания массив \(c\)?

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина массива \(a\).

Во второй строке каждого набора заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^6\)) — сам массив \(a\).

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, выведите YES (регистр не важен), если вы можете получить отсортированный по неубыванию массив \(c\). В противном случае выведите NO (регистр не важен).

Примечание

В первом наборе входных данных, мы можем сделать следующие преобразования массива \(a = [3, 1, 5, 3]\):

Шаг \(1\):

\(a\)\([3, 1, 5, 3]\)\(\Rightarrow\)\([3, 1, 5]\)\(\Rightarrow\)\([3, 1]\)\(\Rightarrow\)\([3]\)\(\Rightarrow\)\([]\)
\(b\)\([]\)\([\underline{3}]\)\([3, \underline{5}]\)\([3, \underline{1}, 5]\)\([3, \underline{3}, 1, 5]\)

Шаг \(2\):

\(b\)\([3, 3, \underline{1}, 5]\)\(\Rightarrow\)\([3, \underline{3}, 5]\)\(\Rightarrow\)\([\underline{3}, 5]\)\(\Rightarrow\)\([\underline{5}]\)\(\Rightarrow\)\([]\)
\(c\)\([]\)\([1]\)\([1, 3]\)\([1, 3, 3]\)\([1, 3, 3, 5]\)
В результате массив \(c = [1, 3, 3, 5]\) и он отсортирован.

F. Упорядочивание рабочего стола

жадные алгоритмы реализация Структуры данных *1800

Ваш друг Иван попросил вас помочь упорядочить его рабочий стол. Рабочий стол может быть представлен как прямоугольная матрица размера \(n \times m\), состоящая из символов '.' (пустая клетка рабочего стола) и '*' (иконка).

Рабочий стол называется хорошим, если все его иконки находятся на каком-то префиксе столбцов и, возможно, префиксе следующего столбца (и не существует иконок за пределами данной фигуры). Другими словами, какое-то количество первых столбцов будет заполнено иконками, а также, возможно, какое-то количество первых клеток следующего (после последнего полного столбца) столбца будет также заполнено иконками (и все иконки на рабочем столе будут принадлежать этой фигуре). Это выглядит довольно похоже на расположение иконок на рабочем столе в реальной жизни.

За один ход вы можете взять одну иконку и передвинуть ее в любую пустую клетку рабочего стола.

Иван любит добавлять иконки на свой рабочий стол, а также удалять их, поэтому он просит вас ответить на \(q\) запросов: чему равно минимальное количество ходов, необходимое для того, чтобы сделать рабочий стол хорошим после добавления/удаления одной иконки?

Заметьте, что запросы остаются навсегда и меняют состояние рабочего стола.

Входные данные

Первая строка входных данных содержит три целых числа \(n\), \(m\) и \(q\) (\(1 \le n, m \le 1000; 1 \le q \le 2 \cdot 10^5\)) — количество строк в рабочем столе, количество столбцов в рабочем столе и количество запросов, соответственно.

Следующие \(n\) строк содержат описание рабочего стола. В \(i\)-й из них находится \(m\) символов '.' и '*' — описание \(i\)-й строки рабочего стола.

Следующие \(q\) строк описывают запросы. В \(i\)-й из них находятся два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i \le n; 1 \le y_i \le m\)) — позиция клетки, которая меняет свое состояние (если эта клетка содержала иконку, то эта иконка удаляется, иначе в этой клетке появляется иконка).

Выходные данные

Выведите \(q\) целых чисел. \(i\)-е из них должно быть равно минимальному количеству ходов, необходимому для того, чтобы сделать рабочий стол хорошим после применения первых \(i\) запросов.

B. Сделай возрастающую

жадные алгоритмы реализация *900

Заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\). Над ними можно совершать следующую операцию:

  • выбрать произвольный элемент \(a_i\) (\(1 \le i \le n\)) и поделить его на \(2\) (округляем вниз). Другими словами, можно заменить любой выбранный элемент \(a_i\) на значение \(\left \lfloor \frac{a_i}{2}\right\rfloor\) (где \(\left \lfloor x \right\rfloor\) — округление вниз вещественного числа \(x\)).

Выведите минимальное количество операций, которое необходимо совершить, чтобы последовательность чисел стала строго возрастающей (то есть, чтобы было выполнено условие \(a_1 \lt a_2 \lt \dots \lt a_n\)). Или определите, что такую последовательность получить невозможно. Обратите внимание на то, что элементы нельзя менять местами. Единственная возможная операция описана выше.

Например, пусть \(n = 3\) и задана последовательность чисел \([3, 6, 5]\). Тогда достаточно совершить над ней две операции:

  • записать вместо числа \(a_2=6\) число \(\left \lfloor \frac{6}{2}\right\rfloor = 3\) и получить последовательность \([3, 3, 5]\);
  • затем записать вместо числа \(a_1=3\) число \(\left \lfloor \frac{3}{2}\right\rfloor = 1\) и получить последовательность \([1, 3, 5]\).

Полученная последовательность является строго возрастающей, так как \(1 \lt 3 \lt 5\).

Входные данные

В первой строке записано единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных содержится единственное целое число \(n\) (\(1 \le n \le 30\)).

Во второй строке каждого набора входных данных записано ровно \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 2 \cdot 10^9\)).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите единственное число — минимальное количество операций, которое нужно совершить над последовательностью, чтобы она стала строго возрастающей. Если строго возрастающую последовательность невозможно получить, то выведите «-1».

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе входных данных получить строго возрастающую последовательность невозможно.

В третьем наборе входных данных последовательность уже является строго возрастающей.

C. Детективная задача

реализация *1100

Поликарп купил новую дорогую картину и решил показать своим \(n\) друзьям. Он повесил её у себя в комнате. Туда поочерёдно зашли и вышли \(n\) его друзей. В один момент в комнате было не больше одного человека. Иными словами, сначала зашёл и вышел первый друг, затем второй и так далее.

Известно, что в начале (до посещения друзей) в комнате висела картина. В конце (после \(n\)-го друга) оказалось, что она исчезла. В какой именно момент она пропала — информации нет.

Поликарп поочерёдно опросил друзей. У каждого он спросил: была ли картина, когда тот вошёл в комнату. Каждый друг ответил одно из трёх:

  • нет (ответ кодируется символом 0);
  • да (ответ кодируется символом 1);
  • не помню (ответ кодируется символом ?).

Все, кроме вора, либо не помнят, либо сказали правду. Вор может сказать что угодно (любой из трёх вариантов).

Поликарп не может понять, кто вор. Он просит вас узнать количество тех, кого можно считать вором в соответствии показаниями.

Входные данные

В первой строке записано единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке каждого наборов содержится одна непустая строка \(s\) (ей длина не превосходит \(2 \cdot 10^5\)) — описания ответов друзей, где \(s_i\) обозначает ответ \(i\)-го друга. Каждый символ в строке это либо 0, либо 1, либо ?.

Заданная строка описывает в самом деле произошедшую ситуацию. В частности, на основании показаний хотя бы одного друга можно заподозрить в краже картины.

Гарантируется, что сумма длин строк по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Вывести одно положительное (строго большее нуля) число – количество друзей, которые могли украсть картину на основании данных показаний.

Примечание

В первом случае ответ равен \(1\), так как у нас был ровно \(1\) друг.

Во втором случае аналогично.

В третьем случае подозреваемыми являются третий и четвёртый друг (считаем с единицы). Можно показать, что никто другой не мог быть вором.

В четвёртом случае нам абсолютно ничего не известно, поэтому подозреваем всех.

D. Вертикальные пути

графы Деревья реализация *1300

Задано корневое дерево из \(n\) вершин. Вершины пронумерованы от \(1\) до \(n\). Корнем может быть любая из вершин.

Дерево — это связный неориентированный граф без циклов. Корневое дерево — дерево с выделенной вершиной, которую называют корнем.

Дерево задано массивом предков \(p\), содержащим \(n\) целых чисел: \(p_i\) — предок вершины с номером \(i\). Предком вершины \(u\) называется такая вершина, которая является следующей вершиной на кратчайшем пути от \(u\) к корню. Например, на простом пути из \(5\) в \(3\) (корень), следующая вершина будет \(1\), таким образом, предком вершины \(5\) является вершина \(1\).

У корня предка нет, для него в качестве \(p_i\) используется значение \(i\) (таким образом, корень — единственная вершина, для которой \(p_i=i\)).

Найдите такой набор путей, что:

  • каждая вершина принадлежит ровно одному пути, каждый путь может содержать одну или более вершину;
  • в каждом пути каждая очередная вершина — это сын текущей вершины (то есть пути всегда ведут вниз — от родителя к сыну);
  • количество путей минимально.

Например, если \(n=5\) и \(p=[3, 1, 3, 3, 1]\), то дерево можно разбить на три пути:

  1. \(3 \rightarrow 1 \rightarrow 5\) (путь из \(3\) вершин),
  2. \(4\) (путь из \(1\) вершины),
  3. \(2\) (путь из \(1\) вершины).
Пример разбиения корневого дерева на три пути для \(n=5\), корень дерева — вершина \(3\).
Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Каждый набор входных данных состоит из двух строк.

В первой из них записано целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Во второй записано \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\)). Гарантируется, что массив \(p\) кодирует некоторое корневое дерево.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных на первой строке выведите целое число \(m\) — минимальное количество непересекающихся путей, идущих сверху вниз, которыми можно покрыть все вершины дерева.

Затем выведите \(m\) пар строк, содержащих описания путей. В первую из них выведите длину пути, во второй — последовательность вершин, задающих этот путь в порядке сверху вниз. Вы можете выводить пути в любом порядке.

Если ответов несколько, выведите любой из них.

A. Счастливый?

реализация *800

Номер билета — это строка, которая состоит ровно из шести цифр. Номер билета является счастливым, если сумма первых трёх цифр равна сумме последних трёх цифр. Задан номер билета, проверьте счастливый он или нет. Обратите внимание, что в номере могут быть лидирующие нули.

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов, каждый из них — это одна строка, которая содержит шесть цифр.

Выходные данные

Выведите \(t\) строк, которые содержат ответы. Выводите:

  • YES, если соответствующий номер билета счастливый;
  • NO в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных примера сумма первых трёх цифр равна \(2 + 1 + 3 = 6\), сумма последних трёх цифр равна \(1 + 3 + 2 = 6\). Суммы равны. Следовательно, ответ равен «YES».

Во втором наборе входных данных примера сумма первых трёх цифр равна \(9 + 7 + 3 = 19\), сумма последних трёх цифр равна \(8 + 9 + 4 = 21\). Суммы не равны. Следовательно, ответ равен «NO».

В третьем наборе входных данных примера сумма первых трёх цифр равна \(0 + 4 + 5 = 9\), сумма последних трёх цифр равна \(2 + 0 + 7 = 9\). Суммы равны. Следовательно, ответ равен «YES».

C. Самые похожие слова

жадные алгоритмы математика Перебор реализация реализация Строки *800

Вам даны \(n\) слов одинаковой длины \(m\), состоящие из строчных букв латинского алфавита, \(i\)-е слово обозначается \(s_i\).

За один ход вы можете выбрать любую позицию в любом отдельном слове и заменить букву в этой позиции на предыдущую или следующую букву в алфавитном порядке. Например:

  • вы можете заменить 'e' на 'd' или на 'f';
  • 'a' может быть заменена только на 'b';
  • 'z' может быть заменена только на 'y'.

Разница между двумя словами — это минимальное число ходов, необходимое для того, чтобы сделать их равными. Например, разница между «best» и «cost» составляет \(1 + 10 + 0 + 0 = 11\).

Найдите минимальную разницу между \(s_i\) и \(s_j\) такую, что \((i < j)\). Другими словами, найдите минимальную разницу по всем возможным парам из \(n\) слов.

Входные данные

Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит \(2\) целых числа \(n\) и \(m\) (\(2 \leq n \leq 50\), \(1 \leq m \leq 8\)) — количество слов и их длина соответственно.

Затем следуют \(n\) строк, \(i\)-я из которых содержит слово \(s_i\) длины \(m\), состоящее из строчных латинских букв.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальную разница среди всех возможных пар заданных строк.

Примечание

Для второго набора входных данных можно показать, что наилучшей парой является («abb», «bef»), которая имеет разницу, равную \(8\), что можно получить следующим образом: заменить первый символ первой строки на 'b' за один ход, заменить второй символ второй строки на 'b' за \(3\) хода и заменить третий символ второй строки на 'b' за \(4\) хода, что в сумме дает \(1 + 3 + 4 = 8\) ходов.

В третьем наборе существует только одна возможная пара, и можно показать, что минимальное количество ходов, необходимое для того, чтобы строки стали равными, равно \(35\).

В четвертом наборе есть пара строк, которые уже равны, поэтому ответ равен \(0\).

C. Самые похожие слова

жадные алгоритмы математика Перебор реализация реализация Строки *800

Вам даны \(n\) слов одинаковой длины \(m\), состоящие из строчных букв латинского алфавита, \(i\)-е слово обозначается \(s_i\).

За один ход вы можете выбрать любую позицию в любом отдельном слове и заменить букву в этой позиции на предыдущую или следующую букву в алфавитном порядке. Например:

  • вы можете заменить 'e' на 'd' или на 'f';
  • 'a' может быть заменена только на 'b';
  • 'z' может быть заменена только на 'y'.

Разница между двумя словами — это минимальное число ходов, необходимое для того, чтобы сделать их равными. Например, разница между «best» и «cost» составляет \(1 + 10 + 0 + 0 = 11\).

Найдите минимальную разницу между \(s_i\) и \(s_j\) такую, что \((i < j)\). Другими словами, найдите минимальную разницу по всем возможным парам из \(n\) слов.

Входные данные

Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит \(2\) целых числа \(n\) и \(m\) (\(2 \leq n \leq 50\), \(1 \leq m \leq 8\)) — количество слов и их длина соответственно.

Затем следуют \(n\) строк, \(i\)-я из которых содержит слово \(s_i\) длины \(m\), состоящее из строчных латинских букв.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальную разница среди всех возможных пар заданных строк.

Примечание

Для второго набора входных данных можно показать, что наилучшей парой является («abb», «bef»), которая имеет разницу, равную \(8\), что можно получить следующим образом: заменить первый символ первой строки на 'b' за один ход, заменить второй символ второй строки на 'b' за \(3\) хода и заменить третий символ второй строки на 'b' за \(4\) хода, что в сумме дает \(1 + 3 + 4 = 8\) ходов.

В третьем наборе существует только одна возможная пара, и можно показать, что минимальное количество ходов, необходимое для того, чтобы строки стали равными, равно \(35\).

В четвертом наборе есть пара строк, которые уже равны, поэтому ответ равен \(0\).

D. X-сумма

жадные алгоритмы Перебор реализация *1000

Дедушка Тимура подарил ему шахматную доску, чтобы он попрактиковался. Эта доска \(a\) состоит из \(n\) строк и \(m\) столбцов. На каждой клетке написано неотрицательное целое число.

Задача Тимура поставить слона так, чтобы сумма на клетках, атакованных им, была максимальна. Слон атакует во всех направлениях по диагонали. Расстояние, на которое атакует слон, не ограничено. Обратите внимание, что клетка, в которой стоит слон, также считается атакованной. Помогите ему найти максимальную сумму, которую он может получить.

Входные данные

Первая строка входных данных содержит число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте. Далее следуют описания самих наборов.

Первая строка каждого набора содержит два числа \(n\) и \(m\) (\(1 \le n \le 200\), \(1 \leq m \leq 200\)).

Следующие \(n\) строк содержат по \(m\) целых чисел, \(j\)-й элемент \(i\)-й строки \(a_{ij}\) — это число, записанное в \(j\)-й клетке \(i\)-й строки \((0\leq a_{ij} \leq 10^6)\)

Гарантируется, что сумма \(n\cdot m\) по всем наборам не превосходит \(4\cdot10^4\).

Выходные данные

Для каждого набора входных данных выведите одно число — максимальную сумму по всем возможным размещениям слона.

Примечание

В первом примере лучшая сумма достигается в этой позиции:

F. Самый длинный страйк

жадные алгоритмы реализация сортировки Структуры данных *1300

Дан массив \(a\) длины \(n\) и целое число \(k\), вам нужно найти два любых числа \(l\) и \(r\) (\(l \leq r\)) таких, что:

  • Для каждого \(x\) \((l \leq x \leq r)\), \(x\) содержится в \(a\) хотя бы \(k\) раз (т.е. \(k\) или более элементов массива равны \(x\)).
  • Значение \(r-l\) максимально среди возможных.

Если не существует подходящих чисел, выведите -1.

Например, если \(a=[11, 11, 12, 13, 13, 14, 14]\) и \(k=2\), то:

  • для \(l=12\), \(r=14\) первое условие не выполнено, так как \(12\) содержится менее \(k=2\) раз.
  • для \(l=13\), \(r=14\) первое условие выполнено, так как \(13\) содержится хотя бы \(k=2\) раз в \(a\) и \(14\) содержится хотя бы \(k=2\) раз в \(a\).
  • для \(l=11\), \(r=11\) первое условие выполнено, так как \(11\) содержится хотя бы \(k=2\) раз в \(a\).

Пара \(l\) и \(r\) для которой выполнено первое условие и \(r-l\) максимально — это пара \(l = 13\), \(r = 14\).

Входные данные

Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Затем следуют описания наборов.

Первая строка каждого набора содержит целые числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \leq k \leq n\)) — длина массива \(a\) и минимальное количество раз, которое должно встретиться каждое число в диапазоне \([l, r]\), соответственно.

Затем следует единственная строка, состоящая из \(n\) целых чисел — элементов массива \(a\) (\(1 \leq a_i \leq 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(2\) числа, \(l\) и \(r\) которые удовлетворяют условиям, или «-1» если таких не существует.

Если ответов может быть несколько, выведите любой.

B. Tokitsukaze и собрание

математика реализация Структуры данных *1700

Tokitsukaze устраивает собрание. В зале собрания \(n\) рядов и \(m\) столбцов сидений.

На собрании присутствует ровно \(n \cdot m\) студентов, в том числе несколько непослушных студентов и несколько серьезных студентов. Студенты нумеруются от \(1\) до \(n\cdot m\). Студенты входят в зал по порядку. Когда \(i\)-й студент войдет в зал, он сядет в \(1\)-й столбец \(1\)-го ряда, а уже сидящие студенты отодвинутся на одно место назад. В частности, студент, сидящий в \(j\)-м (\(1\leq j \leq m-1\)) столбце \(i\)-го ряда, переместится в \((j+1)\)-й столбец \(i\)-го ряда, а ученик, сидящий в \(m\)-м столбце \(i\)-го ряда, переместится в \(1\)-й столбец \((i+1)\)-го ряда.

Например, есть конференц-зал с \(2\) рядами и \(2\) столбцами мест, как показано ниже:

В зал войдут \(4\) студента по порядку, представленному в виде двоичной строки «1100», из которых '0' представляет непослушных студентов, а '1' представляет серьезных. Порядок смены мест в зале собрания:

Обозначим ряд или столбец как хорошие тогда и только тогда, когда в этом ряду или столбце есть хотя бы один серьезный студент. Пожалуйста, предскажите количество хороших рядов и столбцов сразу после того, как \(i\)-й студент войдет в зал, для всех \(i\).

Входные данные

Первая строка содержит единственное положительное целое число \(t\) (\(1 \leq t \leq 10\,000\)) — количество наборов входных данных.

Для каждого набора входных данных в первой строке записаны два целых числа \(n\), \(m\) (\(1 \leq n,m \leq 10^6\); \(1 \leq n \cdot m \leq 10^6\)), обозначающие наличие \(n\) рядов и \(m\) столбцов мест в зале.

Вторая строка содержит двоичную строку \(s\) длины \(n \cdot m\), состоящую только из нулей и единиц. Если \(s_i\) равно '0', то \(i\)-й студент является непослушным, а если \(s_i\) равно '1', то \(i\)-й студен является серьезным.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите в одной строке \(n \cdot m\) целых чисел — количество хороших рядов и столбцов сразу после того, как \(i\)-й студент войдет в конференц-зал.

Примечание

Первый набор входных данных показан в условии.

После того, как \(1\)-й студент входит в зал, остается \(2\) хороших ряда и столбца: \(1\)-й ряд и \(1\)-й столбец.

После того, как \(2\)-й студент входит в зал, остается \(3\) хороших ряда и столбца: \(1\)-й ряд, \(1\)-й столбец и \(2\)-й столбец.

После того, как \(3\)-й студент входит в зал, все \(4\) ряда и столбца хорошие.

После того, как \(4\)-й студент входит в зал, остается \(3\) хороших ряда и столбца: \(2\)-й ряд, \(1\)-й столбец и \(2\)-й столбец.

A. Tokitsukaze и полная нулевая последовательность

реализация *800

У Tokitsukaze есть последовательность \(a\) длины \(n\). Для каждой операции она выбирает два числа \(a_i\) и \(a_j\) (\(i \ne j\); \(1 \leq i,j \leq n\)).

  • Если \(a_i = a_j\), измените одно из них на \(0\).
  • В противном случае измените их оба на \(\min(a_i, a_j)\).

Tokitsukaze хочет узнать, за какое минимальное количество операций можно изменить все числа в последовательности на \(0\). Можно доказать, что ответ всегда существует.

Входные данные

Первая строка содержит единственное положительное целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Для каждого набора входных данных в первой строке записано одно целое число \(n\) (\(2 \leq n \leq 100\)) — длина последовательности \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 100\)) — последовательность \(a\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, чтобы изменить все числа в последовательности на \(0\).

Примечание

В первом наборе входных данных один из возможных способов изменить все числа в последовательности на \(0\):

В \(1\)-й операции \(a_1 < a_2\), после операции \(a_2 = a_1 = 1\). Теперь последовательность \(a\) равна \([1,1,3]\).

В \(2\)-й операции \(a_1 = a_2 = 1\), после операции \(a_1 = 0\). Теперь последовательность \(a\) равна \([0,1,3]\).

В \(3\)-й операции \(a_1 < a_2\), после операции \(a_2 = 0\). Теперь последовательность \(a\) равна \([0,0,3]\).

В \(4\)-й операции \(a_2 < a_3\), после операции \(a_3 = 0\). Теперь последовательность \(a\) равна \([0,0,0]\).

Таким образом, минимальное количество операций составляет \(4\).

B1. Tokitsukaze и хорошая 01-строка (упрощенная версия)

реализация *800

Это упрощенная версия задачи. Единственная разница между двумя версиями состоит в том, что более сложная версия дополнительно требует минимального количества подотрезков.

У Tokitsukaze есть бинарная строка \(s\) длины \(n\), состоящая только из нулей и единиц, \(n\) является четным.

Tokitsukaze делит \(s\) на минимальное количество непрерывных подотрезков, так чтобы в каждом подотрезке все биты были одинаковы. После этого \(s\) считается хорошей, если длины всех подотрезков четны.

Например, если \(s\) равна «11001111», она будет разделена на «11», «00» и «1111». Их длины равны \(2\), \(2\), \(4\) соответственно, все числа четные, поэтому «11001111» хорошая. Другой пример, если \(s\) равна «1110011000», она будет разделена на «111», «00», «11» и «000», а их длины равны \(3\), \(2\), \(2\), \(3\). Очевидно, что «1110011000» не является хорошей.

Tokitsukaze хочет улучшить \(s\), изменив значения некоторых позиций в \(s\). В частности, она может выполнить следующую операцию любое количество раз: изменить значение \(s_i\) на «0» или «1»(\(1 \leq i \leq n\)). Можете ли вы назвать ей минимальное количество операций, чтобы сделать \(s\) хорошей?

Входные данные

Первая строка содержит единственное положительное целое число \(t\) (\(1 \leq t \leq 10\,000\)) — количество наборов входных данных.

Для каждого набора входных данных первая строка содержит единственное целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — длина \(s\), гарантируется, что \(n\) четно.

Вторая строка содержит бинарную строку \(s\) длины \(n\), состоящую только из нулей и единиц.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в одной строке одно целое число — минимальное количество операций, чтобы \(s\) стала хорошей.

Примечание

В первом наборе входных данных один из способов сделать \(s\) хорошей следующий.

Измените \(s_3\), \(s_6\) и \(s_7\) на «0», после чего \(s\) станет «1100000000», ее можно разделить на «11» и «00000000», длина которых составляют \(2\) и \(8\) соответственно. Есть и другие способы за \(3\) операции сделать \(s\) хорошей, например, можно получить в итоге «1111110000», «1100001100», «1111001100».

Во втором, третьем и четвертом наборах входных данных \(s\) изначально хорошая, поэтому никаких действий не требуется.

B2. Tokitsukaze и хорошая 01-строка (усложненная версия)

дп жадные алгоритмы реализация *1800

Это усложненная версия задачи. Единственная разница между двумя версиями состоит в том, что более сложная версия дополнительно требует минимального количества подотрезков.

У Tokitsukaze есть двоичная строка \(s\) длины \(n\), состоящая только из нулей и единиц, \(n\) является четным.

Теперь Tokitsukaze делит \(s\) на минимальное количество непрерывных подотрезков, так чтобы в каждом подотрезке все биты были одинаковы. После этого \(s\) считается хорошей, если длины всех подотрезков четны.

Например, если \(s\) равна «11001111», она будет разделена на «11», «00» и «1111». Их длины равны \(2\), \(2\), \(4\) соответственно, все числа четные, поэтому «11001111» хорошая. Другой пример, если \(s\) равна «1110011000», она будет разделена на «111», «00», «11» и «000», а их длины равна \(3\), \(2\), \(2\), \(3\). Очевидно, что «1110011000» не является хорошей.

Tokitsukaze хочет улучшить \(s\), изменив значения некоторых позиций в \(s\). В частности, она может выполнить операцию любое количество раз: изменить значение \(s_i\) на «0» или «1» (\(1 \leq i \leq n\)). Можете ли вы назвать ей минимальное количество операций, чтобы сделать \(s\) хорошей? При этом она также хочет знать минимальное количество подотрезков, на которые можно разделить \(s\), среди всевозможных решений, которые используют минимальное количество операций.

Входные данные

Первая строка содержит единственное положительное целое число \(t\) (\(1 \leq t \leq 10\,000\)) — количество наборов входных данных.

Для каждого набора входных данных первая строка содержит единственное целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — длина \(s\), гарантируется, что \(n\) четно.

Вторая строка содержит двоичную строку \(s\) длины \(n\), состоящую только из нулей и единиц.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в одной строке два целых числа — минимальное количество операций, чтобы сделать \(s\) хорошей, и минимальное количество подотрезков, на которые можно разделить \(s\), среди всевозможных решений, которые используют минимальное количество операций.

Примечание

В первом наборе входных данных один из способов сделать \(s\) хорошей следующий.

Измените \(s_3\), \(s_6\) и \(s_7\) на «0», после чего \(s\) станет «1100000000», ее можно разделить на «11» и «00000000», длина которых составляет \(2\) и \(8\) соответственно, количество ее подотрезков равно \(2\). Существуют и другие способы использовать \(3\) операции, чтобы сделать \(s\) хорошей, например можно в итоге получить «1111110000», «1100001100», «1111001100», число подотрезков которых равно \(2\), \(4\), \(4\) соответственно. Легко заметить, что минимальное количество подотрезков среди всего минимального числа решений операций равно \(2\).

Во втором, третьем и четвертом наборах входных данных \(s\) изначально хорошая, поэтому никаких действий не требуется.

B. Задача каменного века

реализация Структуры данных *1200

Когда-то давно Миша и Миша решили придумать интересную задачу на очередной этап РОИ (редкая олимпиада по информатике). Один из них придумал прототип задачи, но другой своровал идею и предложил задачу на другой этап этой же олимпиады. С тех пор первый Миша ждал возможности предложить оригинальную идею на какую-либо другую олимпиаду... Ждал Миша до этого момента!

Вам дан массив \(a\) из \(n\) целых чисел. Также даны \(q\) запросов двух типов:

  • Заменить \(i\)-й элемент массива на число \(x\).
  • Заменить каждый элемент массива на число \(x\).

После выполнения каждого запроса вы должны вычислить сумму всех элементов в массиве.

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество элементов в массиве и количество запросов, соответственно.

Вторая строка содержит \(n\) целых чисел \(a_1, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — элементы массива \(a\).

Каждая из следующих \(q\) строк содержит описание очередного запроса. Описание запроса начинается с целого числа \(t\) (\(t \in \{1, 2\}\)), которое обозначает тип запроса:

  • Если \(t = 1\), далее следуют два целых числа \(i\) и \(x\) (\(1 \le i \le n\), \(1 \le x \le 10^9\)) — позиция элемента, который нужно изменить, и его новое значение.
  • Если \(t = 2\), далее следует целое число \(x\) (\(1 \le x \le 10^9\)) — число, на которое нужно заменить каждый элемент массива.
Выходные данные

Выведите \(q\) целых чисел, каждое в отдельной строке. В \(i\)-й строке нужно вывести сумму всех элементов массива после выполнения первых \(i\) запросов.

Примечание

Рассмотрим массив из примера и результат выполнения каждого запроса:

  1. Изначально массив равен \([1, 2, 3, 4, 5]\).
  2. После выполнения первого запроса массив равен \([5, 2, 3, 4, 5]\). Сумма всех элементов равна \(19\).
  3. После выполнения второго запроса массив равен \([10, 10, 10, 10, 10]\). Сумма всех элементов равна \(50\).
  4. После выполнения третьего запроса массив равен \([10, 10, 10, 10, 11\)]. Сумма всех элементов равна \(51\).
  5. После выполнения четвертого запроса массив равен \([10, 10, 10, 1, 11]\). Сумма всех элементов равна \(42\).
  6. После выполнения пятого запроса массив равен \([1, 1, 1, 1, 1]\). Сумма всех элементов равна \(5\).

C. Ладьи-защитники

реализация Структуры данных *1400

У вас есть квадратная шахматная доска размера \(n \times n\). Строки пронумерованы сверху вниз числами от \(1\) до \(n\), а столбцы — слева направо числами от \(1\) до \(n\). Таким образом, каждая клетка доски задается парой целых чисел \((x, y)\) (\(1 \le x, y \le n\)), где \(x\) — номер строки, а \(y\) — номер столбца.

От вас требуется выполнить \(q\) запросов трех типов:

  • Поставить новую ладью в клетку \((x, y)\).
  • Убрать ладью из клетки \((x, y)\), куда ранее была поставлена ладья.
  • Проверить, верно ли, что каждая клетка подпрямоугольника \((x_1, y_1) - (x_2, y_2)\) доски атакована хотя бы одной ладьей.

Подпрямоугольником называется множество клеток доски \((x, y)\), для которых верно, что \(x_1 \le x \le x_2\) и \(y_1 \le y \le y_2\).

Напомним, что клетка \((a, b)\) атакована ладьей, находящейся в клетке \((c, d)\), если \(a = c\) или \(b = d\). В частности, клетка, в которой находится ладья, атакована этой ладьей.

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n \le 10^5\), \(1 \le q \le 2 \cdot 10^5\)) — размер доски и также количество запросов, соответственно.

Каждая из следующих \(q\) строк содержит в себе описание очередного запроса. Описание запроса начинается с целого числа \(t\) (\(t \in \{1, 2, 3\}\)), которое обозначает тип запроса:

  • Если \(t = 1\), далее следуют два целых числа \(x\) и \(y\) (\(1 \le x, y \le n\)) — координаты клетки, на которую нужно поставить новую ладью. Гарантируется, что в момент данного запроса в клетке \((x, y)\) не стоит ладья.
  • Если \(t = 2\), далее следуют два целых числа \(x\) и \(y\) (\(1 \le x, y \le n\)) — координаты клетки, с которой нужно убрать ладью. Гарантируется, что в момент данного запроса в клетке \((x, y)\) стоит ладья.
  • Если \(t = 3\), далее следуют четыре целых числа \(x_1, y_1, x_2\) и \(y_2\) (\(1 \le x_1 \le x_2 \le n\), \(1 \le y_1 \le y_2 \le n\)) — подпрямоугольник, для которого нужно проверить, верно ли, что каждая его клетка атакована хотя бы одной ладьей.

Гарантируется, что среди \(q\) запросов есть хотя бы один запрос третьего типа.

Выходные данные

Для каждого запроса третьего типа в отдельной строке выведите «Yes» (без кавычек), если каждая клетка данного подпрямоугольника атакована хотя бы одной ладьей.

В противном случае выведите «No» (без кавычек).

Примечание

Рассмотрим пример. После первых двух запросов доска будет выглядеть следующим образом (буквой \(R\) обозначены клетки, в которых находится ладья, а зеленым выделен прямоугольник запроса третьего типа):

Доска после выполнения третьего и четвертого запросов:

Доска после выполнения пятого и шестого запросов:

Доска после выполнения седьмого и восьмого запросов:

Доска после выполнения последних двух запросов:

A. Волшебники и митинг

математика реализация *900

В некоторой стране живут волшебники. Они хотят организовать митинг.

В городе живет n человек. Из них x — волшебники, которые обязательно придут на митинг. Остальные жители города (n - x человек) не поддерживают волшебников и не собираются идти на митинг. Известно, что руководство города примет во внимание митинг, только если на него придут не менее y процентов людей от жителей города. Не долго думая, волшебники решили создать управляемых клонов, которые заменят жителей города на митинге.

В конечном итоге, на митинг придут только волшебники и созданные ими клоны. Руководство города не заметит подмены, поэтому, при подсчете процентов, руководство будет думать, что в городе живет только n человек и нет никаких клонов.

Помогите волшебникам, найдите минимальное количество клонов, которое придется создать, чтобы на митинге было не менее y процентов людей от жителей города.

Входные данные

В первой строке через пробел записаны три целых числа, n, x, y (1 ≤ n, x, y ≤ 104, x ≤ n) — количество жителей в городе, количество волшебников и требуемый руководством процент, соответственно.

Обратите внимание, что y может быть больше 100 процентов, то есть руководство хочет видеть на митинге больше людей, чем живут в городе ( > n).

Выходные данные

Выведите единственное число — ответ на задачу, минимальное количество клонов, которое придется создать, чтобы на митинге было не менее y процентов людей от числа n (числа настоящих жителей города).

Примечание

В первом примере необходимо чтобы на митинг пришло 14% от 10 людей. Так как количество людей должно быть целым, то должно прийти хотя бы 2 человека. В городе живет только один волшебник, который пойдет на митинг. Этого не достаточно, поэтому надо создать одного клона.

Во втором примере на митинг должно прийти 10 человек. В городе живет 10 волшебников. Они все пойдут на митинг, поэтому клонов создавать не надо.

B. Волшебники и минимальное заклинание

реализация Строки *1700

Давайте немного окунемся в одну из самых интересных областей магии — написание заклинаний. Обучение этой интересной, но сложной науке — дело крайне хлопотное, поэтому сегодня Вы не будете учить магические слова, а лишь познакомитесь с основными правилами написания заклинаний.

Каждое заклинание состоит из нескольких строк. Строка, первым непробельным символом которой является символ «#», называется усиливающей строкой и отвечает за мощь заклинания. Остальные строки являются обычными и определяют действие заклинания.

Вам на глаза попался текст некоторого заклинания. Заклинание оказалось слишком длинным, чтобы вы смогли понять его смысл. Поэтому Вы хотите сделать его как можно короче, не меняя смысла.

Единственный способ сократить заклинание, известный вам, — это удаление некоторых пробелов и переводов строк. Известно, что в тексте любого заклинания пробелы несут какую-то смысловую нагрузку только в усиливающих строках, поэтому все пробелы в остальных строках необходимо удалить. Переводы строк также не важны, если ни одна из двух разделяемых строк не является усиливающей. Таким образом, если две подряд идущие строки не являются усиливающими, то их необходимо соединить в одну (то есть к первой строке приписать вторую). Удалять пробелы в усиливающих строках и объединять их с чем-либо запрещено.

Обратите внимание, что пустые строки должны обрабатываться так же, как и все остальные: они должны быть объединены с соседними строками, не являющимися усиливающими, или сохранены в выходных данных, если они окружены с обеих сторон усиливающими (то есть строчка выше, если такая есть, является усиливающей, и строчка ниже, если такая есть, тоже является усиливающей).

Пока это все удаления лишних символов, которые надо сделать (да-да, перевод строки тоже символ).

На вход вам дан текст заклинания, который необходимо уменьшить. Удалите из него лишние символы и выведите результат.

Входные данные

На вход дано несколько строк. Все символы в строках имеют коды от 32 до 127 (включительно). Обращаем ваше внимание, что строки могут начинаться или заканчиваться одним или более пробелами. Объем ввода не превосходит 1048576( = 220) байт. Переводы строк входят в этот объем.

Переводом строки в операционной системе Windows, используемой на тестирующем компьютере, является последовательность символов с кодами #13#10. Гарантируется, что после каждой строки входных данных находится перевод строки. В частности последними символами входных данных является перевод строки. Обратите внимание, что перевод строки является концом строки, а не началом следующей.

Гарантируется, что во входных данных есть хотя бы один символ отличный от перевода строки.

Рекомендуется организовывать ввод-вывод построчно, в таком случае переводы строк корректно обработаются средствами языка.

Выходные данные

Выведите заклинание, из которого удалены все лишние символы. Обращаем ваше внимание, что после каждой строки вывода также должен идти перевод строки.

Осторожно, в задаче в качестве проверки ответа на правильность используется побайтовое сравнение ответа с ответом жюри. Поэтому все пробелы и переводы строк имеют значение.

Примечание

В первом примере усиливающими строками являются 1 и 7. Поэтому строки со 2 по 6 объединены, из них удалены все пробелы.

Во втором примере усиливающими являются 1 и 3 строки. Поэтому не объединено ничего.

B. Роботы

реализация *800

Задано поле, разделенное на \(n\) строк и \(m\) столбцов. Некоторые ячейки пустые (обозначаются E), остальные содержат роботов (обозначаются R).

Вы можете посылать команду всем роботам одновременно. Команда может быть одного из четырех типов:

  • пойти наверх;
  • пойти направо;
  • пойти вниз;
  • пойти налево.

Когда вы посылаете команду, все роботы одновременно пытаются пойти в выбранном вами направлении. Если робот пытается выйти за пределы поля, то он взрывается; иначе, каждый робот передвигается в соседнюю клетку в выбранном направлении.

Вы можете посылать произвольное количество команд (возможно, ноль) в произвольном порядке. Ваша цель — привести хотя бы одного робота в верхний левый угол поля. Можете ли вы это сделать, не дав ни одному роботу взорваться?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных.

Каждый набор начинается со строки, содержащей два целых числа \(n\) and \(m\) (\(1 \le n, m \le 5\)) — количество строк и количество столбцов, соответственно. Затем следуют \(n\) строк; каждая содержит \(m\) символов. Каждый символ — это либо E (пустая клетка), либо R (робот).

Дополнительное ограничение на входные данные: в каждом наборе входных данных на поле есть хотя бы один робот.

Выходные данные

Если возможно привести хотя бы одного робота в верхний левый угол поля, не дав ни одному роботу взорваться, то выведите YES. Иначе выведите NO.

Примечание

Пояснение к примеру:

  1. в первом наборе достаточно послать команду налево;
  2. во втором наборе, если вы пошлете любую команду, то хотя бы один робот взорвется;
  3. в третьем наборе достаточно послать команду налево;
  4. в четвертом наборе робот уже стоит в верхнем левом углу;
  5. в пятом наборе последовательность «идти наверх, идти налево, идти наверх» приведет одного робота в верхний левый угол;
  6. в шестом наборе, если вы попытаетесь привести любого робота в верхний левый угол, то хотя бы один другой робот взорвется.

B. Карточный фокус

математика реализация *800

Монокарп только что выучил новый карточный фокус, и ему не терпится его вам показать. Он показывает вам всю колоду из \(n\) карт. Вы видите, что значения на картах от самой верхней к самой нижней — это целые числа \(a_1, a_2, \dots, a_n\), и все значения различны.

Затем он просит вас перемешать колоду \(m\) раз. На \(j\)-м перемешивании вы должны взять \(b_j\) карт сверху колоды и переместить их под оставшиеся \((n - b_j)\) карт, не меняя порядка ни в одной из частей.

Затем с помощью какой-то магии Монокарп называет вам карту на вершине колоды. Однако, вы не очень-то верите в его магию. Вы утверждаете, что знаете карту на вершине колоды и сами. Можете ли вы удивить Монокарпа и назвать ему карту на вершине колоды до того, как он покажет ее вам?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора записано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество карт в колоде.

Во второй строке записаны \(n\) попарно различных целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — значения на картах.

В третьей строке записано одно целое число \(m\) (\(1 \le m \le 2 \cdot 10^5\)) — количество перемешиваний.

В четвертой строке записаны \(m\) целых чисел \(b_1, b_2, \dots, b_m\) (\(1 \le b_j \le n - 1\)) — количество карт, которые перемещаются в \(j\)-м перемешивании.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — значение карты на вершине колоды после \(m\) перемешиваний.

Примечание

В первом наборе входных данных каждое перемешивание по факту меняет местами две карты. После трех перемешиваний колода примет вид \([2, 1]\).

Во втором наборе входных данных второе перемешивание отменяет действие первого. Сначала три верхние карты перемещаются под последнюю карту, затем эта карта перемещается обратно под оставшиеся три карты. Поэтому колода остается неизменна от начальной — на ее вершине карта со значением \(3\).

C. Двойная сортировка

реализация сортировки *1200

Заданы два массива \(a\) и \(b\), оба состоящие из \(n\) целых чисел.

За один ход можно выбрать две позиции \(i\) и \(j\) (\(1 \le i, j \le n\); \(i \neq j\)) и поменять местами \(a_i\) с \(a_j\) и \(b_i\) с \(b_j\). Перестановки обязательно делать в обоих массивах.

Разрешается сделать не более \(10^4\) ходов (возможно, ноль). Можете ли вы сделать оба массива отсортированными по неубыванию в конце? Если можете, то выведите любую последовательность ходов, которая делает оба массива отсортированными.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(2 \le n \le 100\)) — количество элементов в обоих массивах.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — первый массив.

В третьей строке записаны \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le n\)) — второй массив.

Выходные данные

На каждый набор входных данных выведите ответ. Если невозможно сделать оба массива отсортированными по неубыванию за не более чем \(10^4\) ходов, то выведите -1. Иначе сначала выведите количество ходов \(k\) \((0 \le k \le 10^4)\). Затем выведите \(i\) и \(j\) для каждого хода \((1 \le i, j \le n\); \(i \neq j)\).

Если существует несколько ответов, то выведите любой из них. Не требуется минимизировать количество ходов.

C. LIS или перевернутая LIS?

жадные алгоритмы Конструктив математика реализация *1400

Вам дан массив \(a\) из \(n\) целых положительных чисел.

Пусть \(\text{LIS}(a)\) обозначает длину самой длинной строго возрастающей подпоследовательности \(a\). Например,

  • \(\text{LIS}([2, \underline{1}, 1, \underline{3}])\) = \(2\).
  • \(\text{LIS}([\underline{3}, \underline{5}, \underline{10}, \underline{20}])\) = \(4\).
  • \(\text{LIS}([3, \underline{1}, \underline{2}, \underline{4}])\) = \(3\).

Мы определяем массив \(a'\) как массив, полученный после разворота массива \(a\), т.е. \(a' = [a_n, a_{n-1}, \ldots , a_1]\).

Красота массива \(a\) определяется как \(min(\text{LIS}(a),\text{LIS}(a'))\).

Ваша задача  — определить максимально возможную красоту массива \(a\), если вы можете произвольно переставить местами элементы массива \(a\).

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) \((1 \leq t \leq 10^4)\)  — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) \((1 \leq n \leq 2\cdot 10^5)\)  — длину массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2, \ldots ,a_n\) \((1 \leq a_i \leq 10^9)\)  — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число  — максимально возможную красоту \(a\) после перестановки его элементов произвольным способом.

Примечание

В первом наборе входных данных \(a\) = \([6, 6, 6]\) и \(a'\) = \([6, 6, 6]\). \(\text{LIS}(a) = \text{LIS}(a')\) = \(1\). Следовательно, красота равна \(min(1, 1) = 1\).

Во втором наборе входных данных \(a\) может быть перестроено в \([2, 5, 4, 5, 4, 2]\). Тогда \(a'\) = \([2, 4, 5, 4, 5, 2]\). \(\text{LIS}(a) = \text{LIS}(a') = 3\). Следовательно, красота равна \(3\), и можно показать, что это максимально возможная красота.

В третьем наборе входных данных \(a\) может быть перестроено в \([1, 2, 3, 2]\). Тогда \(a'\) = \([2, 3, 2, 1]\). \(\text{LIS}(a) = 3\), \(\text{LIS}(a') = 2\). Следовательно, красота равна \(min(3, 2) = 2\) и можно показать, что \(2\)  — это максимально возможная красота.

D. Остовное дерево на окружности

Деревья Конструктив реализация *2000

Дано \(n\) вершин, расположенных на окружности, пронумерованных от \(1\) до \(n\) по часовой стрелке. Вам также дана бинарная строка \(s\) длины \(n\).

Ваша задача  — построить дерево на заданных \(n\) вершинах, удовлетворяющее двум условиям ниже, или сообщить, что такого дерева не существует:

  • Для каждой вершины \(i\) \((1 \le i \le n)\), степень вершины четная, если \(s_i = 0\) и нечетная, если \(s_i = 1\).
  • Никакие два ребра дерева не пересекаются внутри окружности. Разрешается, чтобы ребра пересекались на окружности.

Обратите внимание, что все ребра рисуются как отрезки прямых линий. Например, ребро \((u, v)\) в дереве рисуется как отрезок прямой, соединяющий \(u\) и \(v\) на окружности.

Дерево с \(n\) вершинами  — это связный граф с \(n - 1\) ребрами.

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) \((1 \leq t \leq 2\cdot 10^4)\)  — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) \((2 \leq n \leq 2\cdot 10^5)\)  — количество вершин.

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если не существует дерева, удовлетворяющего заданным условиям, выведите «NO» (без кавычек), иначе выведите «YES», а затем выведите описание дерева.

Вы можете выводить каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs», «yEs» будут распознаны как положительный ответ).

Если существует дерево, то выведите \(n - 1\) строк, каждая из которых содержит два целых числа \(u\) и \(v\) \((1 \leq u,v \leq n, u \neq v)\), обозначающих ребро между \(u\) и \(v\) в дереве. Если существует несколько возможных ответов, выведите любой из них.

Примечание

В первом наборе входных данных дерево выглядит следующим образом:

Во втором наборе входных данных существует только одно возможное дерево с ребром между \(1\) и \(2\), и оно не удовлетворяет ограничениям на степени.

В третьем наборе входных данных,

Дерево слева удовлетворяет ограничениям на степени, но ребра пересекаются внутри, поэтому оно не является допустимым деревом, в то время как дерево справа является допустимым.

C. Перестановка столбцов

жадные алгоритмы Конструктив Перебор реализация сортировки *1400

Как известно каждому участнику проекта crowdforces, Тётя Люсине — чуть ли не самый активный человек на земле. Её голова всё время забита какими-то новыми on-ramp задачами. Конечно, даже ей не всегда удаётся придумать что-то хорошее, и в этот раз у неё получилась таска со сказкой, а именно — про таблицы. Ни один ревьювер потом не смог решить эту задачу, а вы сможете?

Дана таблица с \(n\) строками и \(m\) столбцами, где в каждой ячейке написано целое положительное число. Назовём таблицу хорошей, если последовательность чисел в каждой строке является отсортированной в порядке неубывания. Иными словами, для каждого \(1 \le i \le n\) и \(2 \le j \le m\) выполняется следующее условие: \(a_{i,j} \ge a_{i, j-1}\).

Необходимо ровно один раз выбрать столбцы с номерами \(i\) и \(j\) (не обязательно различными), \(1 \le i, j \le m\), и поменять их местами.

Необходимо определить, можно ли после этого получить хорошую таблицу, и вывести соответствующие столбцы, если это возможно.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 2 \cdot 10^5\)) — количество строк и столбцов таблицы соответственно.

Каждая из следующих \(n\) строк содержит по \(m\) целых чисел, \(j\)-й элемент \(i\)-й строки равен \(a_{i,j}\) — это число, записанное в \(j\)-й ячейке \(i\)-й строки (\(1 \le a_{i,j} \le 10^9\)).

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Если есть несколько правильных ответов, вы можете вывести любой из них.

Выходные данные

Если после перестановки невозможно получить хорошую таблицу, то выведите одно число \(-1\).

В противном случае выведите \(2\) числа — номера столбцов, которые необходимо переставить, чтобы получить хорошую таблицу.

Если существуют несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных таблица уже является хорошей, поэтому мы можем, например, переставить первый столбец с самим собой.

Во втором наборе входных данных нельзя сделать данную таблицу хорошей.

В третьем наборе входных данных необходимо поменять местами первый и второй столбец, тогда таблица станет хорошей.

B. Лингвистика

жадные алгоритмы реализация сортировки Строки *2000

Алина обнаружила странный язык, который содержит всего \(4\) слова: \(\texttt{A}\), \(\texttt{B}\), \(\texttt{AB}\), \(\texttt{BA}\). Оказалось, что в этом языке нет пробелов: предложение записывается путем объединения (конкатенации) его слов в одну строку.

Алина нашла одно такое предложение \(s\) и ей интересно: возможно ли, что оно состоит ровно из \(a\) слов \(\texttt{A}\), \(b\) слов \(\texttt{B}\), \(c\) слов \(\texttt{AB}\) и \(d\) слов \(\texttt{BA}\)?

Другими словами, определите, можно ли объединить (конкатенировать) эти слова \(a+b+c+d\) в некотором порядке так, чтобы получилась строка \(s\). Каждое из слов \(a+b+c+d\) должно быть использовано в конкатенации ровно один раз, но вы можете выбрать порядок, в котором они будут конкатенироваться.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит четыре целых числа \(a\), \(b\), \(c\), \(d\) (\(0\le a,b,c,d\le 2\cdot 10^5\)) — количество раз, которое слова \(\texttt{A}\), \(\texttt{B}\), \(\texttt{AB}\), \(\texttt{BA}\) соответственно должны быть использованы в предложении.

Вторая строка содержит строку \(s\) (\(s\) состоит только из символов \(\texttt{A}\) и \(\texttt{B}\), \(1\le |s| \le 2\cdot 10^5\), \(|s|=a+b+2c+2d\))  — предложение. Обратите внимание, что условие \(|s|=a+b+2c+2d\) (здесь \(|s|\) обозначает длину строки \(s\)) эквивалентно тому, что \(s\) имеет длину, равную длине конкатенации слов \(a+b+c+d\).

Сумма длин \(s\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(\texttt{YES}\), если возможно, что предложение \(s\) состоит ровно из \(a\) слов \(\texttt{A}\), \(b\) слов \(\texttt{B}\), \(c\) слов \(\texttt{AB}\) и \(d\) слов \(\texttt{BA}\), и \(\texttt{NO}\) в противном случае. Вы можете выводить каждую букву в любом регистре.

Примечание

В первом наборе входных данных предложение \(s\)  — это \(\texttt{B}\). Очевидно, что оно не может состоять из одного слова \(\texttt{A}\), поэтому ответ  — \(\texttt{NO}\).

Во втором наборе входных данных предложение \(s\)  — \(\texttt{AB}\), и возможно, что оно состоит из одного слова \(\texttt{AB}\), поэтому ответ  — \(\texttt{YES}\).

В третьем наборе входных данных предложение \(s\)  — \(\texttt{ABAB}\), и возможно, что оно состоит из одного слова \(\texttt{A}\), одного слова \(\texttt{B}\) и одного слова \(\texttt{BA}\), так как \(\texttt{A} + \texttt{BA} + \texttt{B} = \texttt{ABAB}\).

В четвертом наборе входных данных предложение \(s\)  — \(\texttt{ABAAB}\), и возможно, что оно состоит из одного слова \(\texttt{A}\), одного слова \(\texttt{AB}\) и одного слова \(\texttt{BA}\), так как \(\texttt{A} + \texttt{BA} + \texttt{AB} = \texttt{ABAAB}\).

В пятом наборе входных данных предложение \(s\)  — \(\texttt{BAABBABBAA}\), и возможно, что оно состоит из одного слова \(\texttt{A}\), одного слова \(\texttt{B}\), двух слов \(\texttt{AB}\) и двух слов \(\texttt{BA}\), так как \(\texttt{BA} + \texttt{AB} + \texttt{B} + \texttt{AB} + \texttt{BA} + \texttt{A}= \texttt{BAABBABBAA}\).

D. Милые числа

Бинарный поиск математика Перебор реализация снм Структуры данных *2900

Ran Yakumo симпатичная девочка, которая любит решать милые математические задачи.

Пусть \(f(x)\) будет минимальным квадратом строго большим, чем \(x\), и \(g(x)\) будет максимальным квадратом, не строго меньшим, чем \(x\). Например, \(f(1)=f(2)=g(4)=g(8)=4\).

Натуральное целое число \(x\) называется милым, если \(x-g(x)<f(x)-x\). Например, \(1,5,11\) это милые целые числа, а \(3,8,15\) нет.

Ran Yakumo дает вам массив \(a\) длины \(n\). Она хочет, чтобы вы нашли минимальное неотрицательное целое число \(k\), такое что \(a_i + k\) является милым числом для любого элемента массива \(a\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^6\)) — длина \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1 \leq a_1 \leq a_2 \leq \ldots \leq a_n \leq 2\cdot 10^6\)) — массив \(a\).

Выходные данные

Выведите одно целое число \(k\) — ответ на задачу.

Примечание

В первом тесте \(3\) не является красивым целым числом, поэтому \(k\ne 0\).

\(2,4,9,11\) являются милыми целыми числами, поэтому \(k=1\).

A. Минимизируй строку

жадные алгоритмы Перебор реализация сортировки *800

Кузнецов любит искусство, поэзию и музыку. И строки, состоящие из строчных латинских букв.

Недавно Кузнецов нашел две строки \(a\) и \(b\) длины \(n\) и \(m\) соответственно. Они состоят из строчных английских букв и ни один символ не содержится одновременно в обеих строках.

Пусть еще одна строка \(c\) изначально пуста. Кузнецов может делать следующие два типа операций:

  • Выбрать любой символ из строки \(a\), удалить его из строки \(a\) и добавить в конец строки \(c\).
  • Выбрать любой символ из строки \(b\), удалить его из строки \(b\) и добавить в конец строки \(c\).

Однако Кузнецов не может сделать более \(k\) операций одного типа подряд. Кузнецов должен выполнять операции до того момента, как строка \(a\) либо строка \(b\) станет пустой. Какое лексикографически наименьшее значение \(c\) возможное после того, как Кузнецов закончит выполнение операций?

Строка \(x\) лексикографически меньше строки \(y\) тогда и только тогда, когда выполняется одно из следующих условий:

  • \(x\) является префиксом \(y\), но \(x \neq y\);
  • в первой позиции, где \(x\) и \(y\) различаются, в строке \(x\) находится буква, которая стоит в алфавите раньше, чем соответствующая буква в \(y\).
Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 100\))  — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора задано три целых числа \(n\), \(m\) и \(k\) (\(1\leq n,m,k \leq 100\)) — параметры из условия.

Во второй строке каждого набора задана строка \(a\) длины \(n\).

Во третьей строке каждого набора задана строка \(b\) длины \(m\).

Строки состоят из строчных букв латинского алфавита. Гарантируется, что ни одна буква не встречается одновременно в строках \(a\) и \(b\).

Выходные данные

Для каждого набора входных данных выведите одну строку \(c\) — ответ на задачу.

Примечание

В первом наборе входных данных оптимально взять две буквы «a» из строки \(a\) и добавить их к строке \(c\). Теперь запрещается выполнять операцию со строкой \(a\), следовательно, необходимо взять один символ «b» из строки \(b\). Следуя этой логике, мы получаем, что \(c\) становится «aabaabaa» в момент, когда строка \(a\) становится пуста.

Во втором наборе входных данных оптимально взять как можно больше «a» из строки \(a\), а затем взять как можно больше «b» из строки \(b\). В конце мы берем два символа «c» из строки \(a\), делая ее пустой.

B. Декременты массива

жадные алгоритмы реализация *800

У Кристины есть два массива \(a\) и \(b\), содержащие по \(n\) неотрицательных целых чисел. Она может произвольное количество раз совершить над массивом \(a\) следующую операцию:

  • Вычесть единицу из каждого ненулевого элемента массива, то есть заменить значение каждого элемента \(a_i\) такого, что \(a_i > 0\), на значение \(a_i - 1\) (\(1 \le i \le n\)). Если \(a_i\) был равен \(0\), то его значение не изменяется.

Определите, может ли Кристина за некоторое число операций (возможно, нулевое) получить массив \(b\) из массива \(a\)? Другими словами, можно ли сделать так, чтобы после некоторого числа операций для каждого \(1 \le i \le n\) было выполнено \(a_i = b_i\)?

Например, пусть \(n = 4\), \(a = [3, 5, 4, 1]\) и \(b = [1, 3, 2, 0]\). В этом случае можно применить операцию два раза:

  • после первого применения операции получим \(a = [2, 4, 3, 0]\);
  • после второго применения операции получим \(a = [1, 3, 2, 0]\).

Таким образом, за две операции можно получить массив \(b\) из массива \(a\).

Входные данные

В первой строке записано единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных содержится единственное целое число \(n\) (\(1 \le n \le 5 \cdot 10^4\)).

Во второй строке каждого набора входных данных записано ровно \(n\) неотрицательных целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^9\)).

В третьей сроке каждого набора входных данных записано ровно \(n\) неотрицательных целых чисел \(b_1, b_2, \dots, b_n\) (\(0 \le b_i \le 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных в тесте не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите:

  • YES, если при помощи совершения некоторого числа операций можно получить массив \(b\) из массива \(a\);
  • NO в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

Первый набор входных данных разобран в условии задачи.

Во втором наборе входных данных достаточно один раз применить операцию к массиву \(a\).

В третьем наборе входных данных получить массив \(b\) из массива \(a\) невозможно.

C. Восстановление длительности выполнения заданий

жадные алгоритмы реализация Структуры данных *800

Недавно Поликарп выполнил \(n\) последовательно пришедших заданий.

Для каждого выполненного задания известно время \(s_i\), когда оно было дано, никакие два задания не были даны в одно и то же время. Также дано время \(f_i\), когда задание было выполнено. Для каждого задания есть неизвестная величина \(d_i\) (\(d_i>0\)) — длительность выполнения задания.

Известно, что задания были выполнены в том порядке, в котором пришли. Поликарп выполнял задания следующим образом:

  • Как только пришло самое первое задание, Поликарп сразу начал его выполнять.
  • Если приходило новое задание, пока Поликарп еще не закончил выполнять предыдущее, он ставил новое задание в конец очереди.
  • Когда Поликарп заканчивал выполнять очередное задание и очередь была не пуста, он сразу брал из головы очереди новое задание (если очередь пуста — он просто ожидал следующего задания).

Найдите \(d_i\) (длительность выполнения) каждого задания.

Входные данные

В первой строке записано единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных содержится одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)).

Во второй строке каждого набора входных данных записано ровно \(n\) целых чисел \(s_1 < s_2 < \dots < s_n\) (\(0 \le s_i \le 10^9\)).

В третьей строке каждого набора входных данных записано ровно \(n\) целых чисел \(f_1 < f_2 < \dots < f_n\) (\(s_i < f_i \le 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого из \(t\) наборов входных данных выведите \(n\) положительных целых чисел \(d_1, d_2, \dots, d_n\) — длительности выполнения каждого задания.

Примечание

Первый набор входных данных:

В начале очередь пуста: \([ ]\). И туда сразу приходит первое задание. В момент времени \(2\) Поликарп заканчивает делать первое задание, соответственно, длительность выполнения первого задания — \(2\). Очередь пуста, поэтому Поликарп просто ждёт.

В момент времени \(3\) приходит второе задание. А в момент времени \(7\) приходит третье задание, и теперь очередь выглядит так: \([7]\).

В момент времени \(10\) Поликарп заканчивает делать второе задание, в итоге длительность выполнения второго задания — \(7\).

И в момент времени \(10\) Поликарп сразу начинает делать третье задание и заканчивает в момент времени \(11\). В итоге длительность выполнения третьего задания — \(1\).

Пример первого набора входных данных.

D. Черно-белая полоса

реализация *1000

У вас есть полоска клетчатой бумаги длины \(n\). Каждая клетка либо белая, либо чёрная.

Сколько минимум клеток надо перекрасить из белого цвета в чёрный, чтобы на полоске существовал отрезок из \(k\) последовательных клеток чёрного цвета?

Если входные данные таковы, что отрезок \(k\) чёрных последовательных клеток уже существует, то выведите 0.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания \(t\) наборов входных данных.

Первая строка набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2\cdot10^5\)). Вторая строка состоит из букв 'W' (белый цвет) и 'B' (чёрный цвет). Длина строки равна \(n\).

Гарантируется, что сумма значений \(n\) не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого из \(t\) наборов входных данных выведите целое число — минимальное количество клеток, которые надо перекрасить из белого в чёрный цвет, чтобы существовал отрезок из \(k\) подряд идущих чёрных клеток.

Примечание

В первом наборе входных данных примера \(s\)BBWBW» и \(k=3\). Достаточно перекрасить \(s_3\) и получить \(s\)BBBBW». В этой строке содержится отрезок длины \(k=3\) из букв 'B'.

Во втором наборе входных данных примера \(s\)BBWBW» и \(k=5\). Достаточно перекрасить \(s_3\) и \(s_5\) и получить \(s\)BBBBB». В этой строке содержится отрезок длины \(k=5\) из букв 'B'.

Во третьем наборе входных данных примера \(s\)BBWBW» и \(k=1\). В \(s\) уже содержится отрезок длины \(k=1\) из букв 'B'.

B. Обмен обувью

жадные алгоритмы Конструктив реализация *1000

Группе студентов наскучило носить одну и ту же обувь каждый день, поэтому они решили обменяться обувью. В этой задаче пара обуви неразделима и понимается как один объект.

В группе \(n\) студентов, и вам дан массив \(s\) в неубывающем порядке, где \(s_i\) — размер обуви \(i\)-го студента. Обмен обувью называется корректным, если никто не получит свою обувь, и каждый студент получит обувь не меньшего размера, чем его собственная.

Вам нужно вывести перестановку \(p\) целых чисел \(\{1,2,\ldots,n\}\), описывающую корректный обмен обувью: \(i\)-й студент получит обувь \(p_i\)-го студента (\(p_i \ne i\)). Если решения не существует, выведите \(-1\).

Перестановкой называется массив, состоящий из \(n\) различных чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, а \([1,2,2]\) — не перестановка (\(2\) встречается дважды), и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве есть \(4\)).

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(1\leq n\leq10^5\)) — количество студентов.

Вторая строка содержит \(n\) целых чисел \(s_1, s_2,\ldots,s_n\) (\(1\leq s_i\leq10^9\); для всех \(1\le i<n\) выполняется \(s_i\le s_{i+1}\)) — размеры обуви.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ в следующем формате.

Если корректного обмена не существует, выведите \(-1\).

Если корректный ответ существует, выведите \(n\) целых чисел: перестановку \(p\) чисел \(1,2,\ldots,n\), описывающую корректный обмен обувью, где \(i\)-й студент получит обувь \(p_i\)-го студента. Если существуют несколько решений, выведите любое.

Примечание

В первом примере любая перестановка \(p\) чисел \(1,\ldots,n\), где \(p_i\ne i\), описывает корректный обмен, так как у всех одинаковый размер обуви, и все могут носить обувь любого.

Во втором примере можно показать, что нет корректного обмена обувью.

D. Максимум не меньше суммы

Бинарный поиск Конструктив разделяй и властвуй реализация Структуры данных *1800

Вам дан массив \(a\) из \(n\) целых чисел. Вам нужно проверить, верно ли, что неравенство \(\)\max(a_i, a_{i + 1}, \ldots, a_{j - 1}, a_{j}) \geq a_i + a_{i + 1} + \dots + a_{j - 1} + a_{j}\(\) выполняется для всех пар индексов \((i, j)\), где \(1 \leq i \leq j \leq n\).

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данныхх содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\))  — размер массива.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если условие для данного массива выполнено, и «NO» в противном случае. Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В примерах \(1\) и \(2\) данное неравенство выполняется для всех пар \((i, j)\).

В примере \(3\) неравенство не выполняется для пары \((1, 2)\), так как \(\max(2, 3) < 2 + 3\).

A. Марафон

реализация *800

Тимур и три других человека участвуют в марафоне. Вам даны 4 различных целых числа \(a\), \(b\), \(c\), \(d\).

Значение \(a\) соответствует расстоянию, которое пробежал Тимур, значения \(b\), \(c\), \(d\) соответствуют расстояниям, которые пробежали три других участника.

Выведите число участников, пробежавших большее расстояние, чем Тимур.

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов, каждое из них содержит ровно четыре различных целых числа \(a\), \(b\), \(c\), \(d\) (\(0 \leq a, b, c, d \leq 10^4\)).

Выходные данные

Для каждого набора данных выведите единственное число — количество участников, пробежавших большее расстояние, чем Тимур.

Примечание

В первом наборе данных всего \(2\) пробежали больше Тимура — те, кто пробежал расстояния, равные \(3\) и \(4\) соответственно. Последний участник пробежал меньше Тимура.

Во втором наборе данных никто не пробежал больше Тимура, так как Тимур пробежал \(10000\), в то время как остальные пробежали расстояния, равные \(0\), \(1\), и \(2\) соответственно.

В третьем наборе только один человек пробежал больше Тимура — тот, кто пробежал расстояние \(600\), так как Тимур пробежал \(500\).

C. Где слон?

реализация *800

У Михая есть шахматная доска размером \(8 \times 8\), у которой ряды пронумерованы от \(1\) до \(8\) сверху вниз и столбцы пронумерованы от \(1\) до \(8\) слева направо.

Михай поставил ровно одного слона на свою шахматную доску. Слон не находится на краях доски. (другими словами, ряд и столбец позиции слона находятся между \(2\) и \(7\) включительно.)

Слон атакует по всем направлениям по диагонали, без ограничения на дистанцию на которой он атакует. Обратите внимание, что клетка на которой расположен слон тоже считается атакованной.

Пример слона на доске. Атакованные клетки отмечены красным.

Михай отметил все атакованные клетки, но забыл где находится слон. Помогите Михаю найти позицию слона!

Входные данные

Первая строка содержит единственное число \(t\) (\(1 \leq t \leq 36\)) — количество наборов входных данных. Далее следуют описание наборов. Перед каждым набором во входных данных записана пустая строка.

Каждый набор состоит из \(8\) строк, в каждой по \(8\) символов. Каждый символ является или '#' или '.', обозначая атакованную клетку, или не атакованную соответственно.

Выходные данные

Для каждого набора выведите два числа \(r\) и \(c\) (\(2 \leq r, c \leq 7\)) — ряд и столбец, на которых располагается слон.

Гарантируется, что входные данные даны таким образом, что всегда существует единственное расположение слона, не находящееся на краях доски.

Примечание

Первый пример показан в условии. Так как слон находится на пересечении ряда \(4\) и столбца \(3\), правильным ответом является 4 3.

D. Часы

Перебор реализация *1100

У Виктора есть 24-часовые часы, показывающие время в формате «HH:MM» (00 \(\le\) HH \(\le\) 23, 00 \(\le\) MM \(\le\) 59). Он будет смотреть на часы каждые \(x\) минут, начиная со времени \(s\).

Посчитайте как много различных палиндромов Виктор увидит, смотря на часы каждые \(x\) минут, начиная с момента времени \(s\).

Например, если Виктор начнет смотреть на часы в 03:12 и затем будет смотреть на них каждые \(360\) минут (то есть каждые \(6\) часов), то он увидит на часах 03:12, 09:12, 15:12, 21:12, 03:12, и далее время будет повторяться. В этом случае время 21:12 будет единственным палиндромом, который Виктор увидит, так что ответом будет \(1\).

Палиндромом является строка, которая читается с конца так же, как и с начала. Например, времена 12:21, 05:50, 11:11 являются палиндромами, а 13:13, 22:10, 02:22 — нет.

Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют описания наборов.

Единственная строка каждого набора входных данных содержит строку \(s\) длиной \(5\) символов в формате «HH:MM», где «HH» может быть от «00» до «23» и «MM» может быть от «00» до «59» (и «HH», и «MM» содержат ровно два символа), а так же число \(x\) (\(1 \leq x \leq 1440\)) — количество минут, между моментами времени, когда Виктор смотрит на часы.

Выходные данные

Для каждого набора выведите единственное число  — количество различных палиндромов, которые увидит Виктор, если будет смотреть на часы каждые \(x\) минут, начиная со времени \(s\).

Примечание

Первый пример объяснён в условии.

E. Двоичный дек

Бинарный поиск реализация *1200

У Славика есть массив длины \(n\), состоящий только из нулей и единиц. За одну операцию он может удалить либо первый, либо последний элемент массива.

Какое минимальное число операций нужно совершить Славику, чтобы сумма оставшихся элементов в массиве равнялась в точности \(s\) после совершения всех операций? В случае, если число \(s\) не может быть получено как сумма элементов массива после любого числа операций, выведите «-1».

Входные данные

Первая строка содержит единственное число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два числа \(n\) и \(s\) (\(1 \leq n, s \leq 2 \cdot 10^5\)) — длина массива и необходимая сумма элементов.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_i\) (\(0 \leq a_i \leq 1\)) — элементы массива.

Гарантируется что сумма \(n\) по всем наборам данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное число — минимальное количество операций, необходимое чтобы сумма всех элементов массива равнялась \(s\). Выведите «-1», если получить массив с суммой элементов \(s\) невозможно.

Примечание

В первом наборе сумма элементов во всем массиве уже равна \(1\), поэтому никаких операций больше не требуется.

Во втором наборе сумма элементов равна \(2\), а нам нужна сумма \(1\), поэтому мы можем удалить из массива первый элемент, после чего массив превратится в \([1, 0]\), сумма элементов которого будет равна \(1\).

В третьем наборе сумма элементов массива изначально равна \(5\), а нам нужна сумма \(3\). Мы можем получить такую сумму удалив первые 2 элемента, после чего удалив последний элемент, сделав всего 3 операции. Массив станет \([0, 1, 1, 1, 0, 0]\), сумма элементов которого будет \(3\).

A. Жуть

жадные алгоритмы реализация *800

Определим дисбаланс бинарной строки \(T\) как абсолютную разницу между количеством нулей и единиц в ней. (например, \(T=\) 010001 содержит \(4\) нулей и \(2\) единиц, поэтому дисбаланс \(T\) равен \(|4-2| = 2\)).

Определим жуткость некоторой бинарной строки \(S\) как максимальный дисбаланс среди всех ее префиксов (например, жуткость \(S=\) 01001 равна \(2\), потому что дисбаланс префикса \(S[1 \ldots 4]\) равен \(2\), а остальные префиксы имеют дисбаланс меньше или равный \(2\)).

Для данных двух целых чисел \(a\) и \(b\), постройте бинарную строку, состоящую из \(a\) нулей и \(b\) единиц, с минимально возможной жуткостью.

Входные данные

Первая строка содержит одно целое число \(t\) \((1\le t\le 1000)\)  — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(a\) и \(b\) (\( 1 \le a, b \le 100\))  — количество нулей и единиц соответственно.

Выходные данные

Для каждого набора входных данных выведите бинарную строку, состоящую из \(a\) нулей и \(b\) единиц с минимально возможной жуткостью. Если ответов несколько, выведите любой из них.

Примечание

В первом наборе входных данных дисбаланс \(S[1 \ldots 1]\) равен \(1\), а дисбаланс \(S[1 \ldots 2]\) равен \(0\).

Во втором наборе входных данных минимально возможная жуткость равна \(1\), а один из других ответов 101.

В третьем наборе входных данных минимально возможная жуткость составляет \(3\), а один из других ответов 0001100.

C. Fishingprince играет с массивом

жадные алгоритмы Конструктив математика реализация *1400

Fishingprince играет с массивом чисел \([a_1,a_2,\dots,a_n]\). Также у него есть волшебное число \(m\).

Он может производить с массивом следующие операции:

  • Выбрать \(1\le i\le n\), такое что \(a_i\) делится на \(m\) (то есть существует такое целое \(t\), что \(m \cdot t = a_i\)). Затем заменить \(a_i\) на \(m\) копий числа \(\frac{a_i}{m}\). Порядок остальных элементов при этом не изменяется. Например, если \(m=2\), \(a=[2,3]\) и \(i=1\), то \(a\) станет равным \([1,1,3]\).
  • Выбрать \(1\le i\le n-m+1\), такое что \(a_i=a_{i+1}=\dots=a_{i+m-1}\). Затем заменить эти \(m\) элементов одним числом \(m \cdot a_i\). Порядок остальных элементов при этом не изменяется. Например, если \(m=2\), \(a=[3,2,2,3]\) и \(i=2\), то \(a\) станет равным \([3,4,3]\).

Обратите внимание, что длина массива может изменяться в процессе выполнения операций. Значение \(n\), используемое выше, всегда определяется как текущая длина массива (и может отличаться от \(n\), заданного во входных данных).

У Fishingprince'а есть ещё один массив, \([b_1,b_2,\dots,b_k]\). Определите, может ли он превратить массив \(a\) в массив \(b\) за несколько (возможно, ноль) операций.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка набора входных данных содержит два целых числа: \(n\) и \(m\) (\(1\le n\le 5\cdot 10^4\), \(2\le m\le 10^9\)).

Вторая строка набора входных данных содержит \(n\) целых чисел: \(a_1,a_2,\ldots,a_n\) (\(1\le a_i\le 10^9\)).

Третья строка набора входных данных содержит одно целое число \(k\) (\(1\le k\le 5\cdot 10^4\)).

Четвёртая строка набора входных данных содержит \(k\) целых чисел: \(b_1,b_2,\ldots,b_k\) (\(1\le b_i\le 10^9\)).

Гарантируется, что сумма значений \(n+k\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите Yes, если существует способ преобразовать \(a\) в \(b\), и No иначе. Вы можете выводить каждый символ в любом регистре (верхнем или нижнем).

Примечание

В первом наборе входных данных можно применить операцию второго типа для \(i=2\): \([1,\color{red}{2,2},4,2]\to [1,\color{red}{4},4,2]\).

Во втором наборе входных данных можно:

  • выполнить операцию второго типа для \(i=2\): \([1,\color{red}{2,2},8,2,2]\to [1,\color{red}{4},8,2,2]\).
  • выполнить операцию второго типа для \(i=4\): \([1,4,8,\color{red}{2,2}]\to [1,4,8,\color{red}{4}]\).
  • выполнить операцию первого типа для \(i=3\): \([1,4,\color{red}{8},4]\to [1,4,\color{red}{4,4},4]\).
  • выполнить операцию второго типа для \(i=2\): \([1,\color{red}{4,4},4,4]\to [1,\color{red}{8},4,4]\).
  • выполнить операцию второго типа для \(i=3\): \([1,8,\color{red}{4,4}]\to [1,8,\color{red}{8}]\).
  • выполнить операцию второго типа для \(i=2\): \([1,\color{red}{8,8}]\to [1,\color{red}{16}]\).

H. Максимальное произведение?

дп жадные алгоритмы Комбинаторика математика Перебор реализация *3500

Вам дано положительное целое число \(k\). Для мультимножества целых чисел \(S\) определим \(f(S)\) следующим образом:

  • Если количество элементов в \(S\) меньше чем \(k\), то \(f(S)=0\).
  • Иначе определим \(f(S)\) как максимально возможное произведение при выборе ровно \(k\) элементов из \(S\).

Более формально, пусть \(|S|\) означает число элементов в \(S\). Тогда,

  • Если \(|S|<k\), то \(f(S)=0\).
  • Иначе \(f(S)=\max\limits_{T\subseteq S,|T|=k}\left(\prod\limits_{i\in T}i\right)\).

Вам дано мультимножество целых чисел \(A\). Вычислите \(\sum\limits_{B\subseteq A} f(B)\) по модулю \(10^9+7\).

Обратите внимание, что в этой задаче элементы считаются различными, если они имеют различные индексы, но необязательно различные значения. То есть мультимножество, состоящее из \(n\) элементов, всегда содержит \(2^n\) различных подмножеств вне зависимости от того, равны ли в нём какие-то элементы или нет.

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\), где \(n\) — количество элементов в \(A\) (\(1\le k\le n\le 600\)).

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,\dots,a_n\), задающих элементы \(A\) (\(-10^9\le a_i\le 10^9\)).

Выходные данные

Выведите \(\sum\limits_{B\subseteq A} f(B)\) по модулю \(10^9+7\).

Примечание

Рассмотрим первый тестовый пример. Из определения,

  • \(f(\varnothing)=0\)
  • \(f(\{-1\})=0\)
  • \(f(\{2\})=0\)
  • \(f(\{4\})=0\)
  • \(f(\{-1,2\})=-2\)
  • \(f(\{-1,4\})=-4\)
  • \(f(\{2,4\})=8\)
  • \(f(\{-1,2,4\})=8\)

Таким образом, вывести необходимо \((0+0+0+0-2-4+8+8)\bmod (10^9+7)=10\).

Во втором тестовом примере мультимножество, хоть и состоит из трёх равных элементов, содержит \(8\) различных подмножеств: \(\varnothing,\{1\},\{1\},\{1\},\{1,1\},\{1,1\},\{1,1\},\{1,1,1\}\).

A. Прогулка по аллее

жадные алгоритмы реализация *800

Вы прогуливаетесь по аллее, находящейся недалеко от вашего дома. На аллее в ряд стоит \(n+1\) лавочек, пронумерованных от \(1\) до \(n+1\) слева направо. Дистанция между лавочками \(i\) и \(i+1\) равна \(a_i\) метров.

Изначально у вас есть \(m\) единиц энергии. Для того чтобы пройти \(1\) метр дистанции, вы тратите \(1\) единицу энергии. Вы не можете идти, если у вас нет энергии. Также вы можете восстанавливать вашу энергию, когда сидите на лавочках (и это единственный способ восстановить энергию). Когда вы сидите, вы восстанавливаете любое целое количество энергии, которое хотите (если вы сидите дольше, вы восстанавливаете больше энергии). Заметьте, что количество вашей энергии может превышать \(m\).

Ваша задача — найти минимальное количество энергии, которое вам необходимо восстановить (сидя на лавочках) для того, чтобы достичь лавочки \(n+1\), начиная у лавочки \(1\) (и закончить вашу прогулку).

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 100\); \(1 \le m \le 10^4\)).

Вторая строка набора тестовых данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 100\)), где \(a_i\) равно дистанции между лавочками \(i\) и \(i+1\).

Выходные данные

Для каждого набора тестовых данных выведите одно целое число — минимальное количество энергии, которое вам необходимо восстановить (сидя на лавочках) для того, чтобы достичь лавочки \(n+1\), начиная у лавочки \(1\) (и закончить вашу прогулку) в соответствующем наборе тестовых данных.

Примечание

В первом наборе тестовых данных примера вы можете дойти до лавочки \(2\), потратив \(1\) единицу энергии, затем восстановить \(2\) единицы энергии на второй лавочке, дойти до лавочки \(3\), потратив \(2\) единицы энергии, восстановить \(1\) единицу энергии и дойти до лавочки \(4\).

В третьем наборе тестовых данных примера у вас уже достаточно энергии для того, чтобы дойти до лавочки \(6\), не отдыхая на лавочках вообще.

C. Любимая задача awoo

Бинарный поиск жадные алгоритмы Конструктив реализация Строки Структуры данных *1400

Заданы две строки \(s\) и \(t\), обе длины \(n\). Каждый символ в обеих строках — 'a', 'b' или 'c'.

За один ход разрешается совершить одно из следующих действий:

  • выбрать вхождение «ab» в \(s\) и заменить его на «ba»;
  • выбрать вхождение «bc» в \(s\) и заменить его на «cb».

Разрешается совершить произвольное количество ходов (включая ноль). Можно ли сделать строку \(s\) равной строке \(t\)?

Входные данные

В первой строке записано одно целое число \(q\) (\(1 \le q \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 10^5\)) — длина строк \(s\) и \(t\).

Во второй строке записана строка \(s\) длины \(n\). Каждый символ — 'a', 'b' или 'c'.

В третьей строке записана строка \(t\) длины \(n\). Каждый символ — 'a', 'b' или 'c'.

Сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

На каждый набор входных данных выведите «YES», если возможно сделать строку \(s\) равной строке \(t\), совершив произвольное количество ходов (возможно, ноль). В противном случае выведите «NO».

E. Раскраска

геометрия графы дп жадные алгоритмы Комбинаторика Конструктив математика Перебор реализация *2400

Заданы \(n\) точек на плоскости, координаты \(i\)-й из них — \((x_i, y_i)\). Ни у каких двух точек не совпадают координаты.

Расстояние между точками \(i\) и \(j\) определено как \(d(i,j) = |x_i - x_j| + |y_i - y_j|\).

Для каждой точки необходимо выбрать цвет — целое число от \(1\) до \(n\). Для каждой упорядоченной тройки различных точек \((a,b,c)\) должны выполняться следующие условия:

  • если \(a\), \(b\) и \(c\) покрашены в одинаковый цвет, то \(d(a,b) = d(a,c) = d(b,c)\);
  • если \(a\) и \(b\) покрашены в одинаковый цвет, а цвет \(c\) отличен от цвета \(a\), то \(d(a,b) < d(a,c)\) и \(d(a,b) < d(b,c)\).

Посчитайте количество различных способов выбрать цвета, чтобы удовлетворить данные условия.

Входные данные

В первой строке записано одно целое число \(n\) (\(2 \le n \le 100\)) — количество точек.

Затем следуют \(n\) строк. В \(i\)-й из них записаны два целых числа \(x_i\) и \(y_i\) (\(0 \le x_i, y_i \le 10^8\)).

Ни у каких двух точек не совпадают координаты (т. ею если \(i \ne j\), то либо \(x_i \ne x_j\), либо \(y_i \ne y_j\)).

Выходные данные

Выведите одно целое число — количество различных способов выбрать цвета точек. Так как оно может быть довольно велико, выведите его остаток от деления на \(998244353\).

Примечание

В первом тесте подходят следующие способы выбрать цвета:

  • \([1, 1, 1]\);
  • \([2, 2, 2]\);
  • \([3, 3, 3]\);
  • \([1, 2, 3]\);
  • \([1, 3, 2]\);
  • \([2, 1, 3]\);
  • \([2, 3, 1]\);
  • \([3, 1, 2]\);
  • \([3, 2, 1]\).

F. Слишком много ограничений

2-sat графы Конструктив реализация *2800

Ваша задача — построить массив \(a\), состоящий из \(n\) целых чисел, каждый элемент должен быть от \(1\) до \(k\).

Массив должен быть неубывающим (\(a_i \le a_{i+1}\) для всех \(i\) от \(1\) до \(n-1\)).

Также есть дополнительные ограничения на него. Каждое ограничение одного из трех следующих типов:

  • \(1~i~x\): \(a_i\) должно быть не равно \(x\);
  • \(2~i~j~x\): \(a_i + a_j\) должно быть меньше или равно \(x\);
  • \(3~i~j~x\): \(a_i + a_j\) должно быть больше или равно \(x\).

Постройте любой неубывающий массив, который удовлетворяет всем ограничениям, или скажите, что такого массива не существует.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны три целых числа \(n, m\) и \(k\) (\(2 \le n \le 2 \cdot 10^4\); \(0 \le m \le 2 \cdot 10^4\); \(2 \le k \le 10\)).

В \(i\)-й из следующих \(m\) строк записано описание ограничения. Каждое ограничение одного из трех следующих типов:

  • \(1~i~x\) (\(1 \le i \le n\); \(1 \le x \le k\)): \(a_i\) должно быть не равно \(x\);
  • \(2~i~j~x\) (\(1 \le i < j \le n\); \(2 \le x \le 2 \cdot k\)): \(a_i + a_j\) должно быть меньше или равно \(x\);
  • \(3~i~j~x\) (\(1 \le i < j \le n\); \(2 \le x \le 2 \cdot k\)): \(a_i + a_j\) должно быть больше или равно \(x\).

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^4\). Сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных определит, существует ли неубывающий массив, который удовлетворяет всем ограничениям. Если такого не существует, то выведите -1. Иначе выведите валидный массив — \(n\) целых чисел от \(1\) до \(k\).

B. Песочные вершины

жадные алгоритмы Конструктив реализация *800

Перед вами \(n\) кучек песка, и в \(i\)-й кучке ровно \(a_i\) песчинок. Назовем \(i\)-ю кучку слишком высокой, если \(1 < i < n\), и \(a_i > a_{i-1} + a_{i+1}\). Иными словами кучка слишком высокая, если в ней больше песка, чем в двух соседних вместе. (Обратите внимание, что кучки по краям не могут быть слишком высокими.)

Вам дано целое число \(k\). За одну операцию вы можете выбрать \(k\) последовательных кучек и добавить к каждой из них одну песчинку. Формально, выберите \(1 \leq l,r \leq n\) такие, что \(r-l+1=k\). Затем для всех \(l \leq i \leq r\) обновите \(a_i \gets a_i+1\).

Какое максимальное количество кучек одновременно может быть слишком высокими после нескольких (возможно, нуля) операций?

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(3 \leq n \leq 2 \cdot 10^5\); \(1 \leq k \leq n\)) — количество кучек песка и размер операции, соответственно.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — размеры кучек.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество кучек, которые одновременно могут быть слишком высокими после нескольких (возможно, нуля) операций.

Примечание

В первом примере можно выполнить следующие три операции:

  • Добавить одну песчинку в кучки \(1\) и \(2\): \([\color{red}{3}, \color{red}{10}, 2, 4, 1]\).
  • Добавить одну песчинку в кучки \(4\) и \(5\): \([3, 10, 2, \color{red}{5}, \color{red}{2}]\).
  • Добавить одну песчинку в кучки \(3\) и \(4\): \([3, 10, \color{red}{3}, \color{red}{6}, 2]\).
После этого кучки \(2\) и \(4\) слишком высокие, поэтому ответ в данном случае равен \(2\). Можно показать, что нельзя сделать более \(2\) кучек слишком высокими.

Во втором примере любая операция увеличивает все кучки на \(1\), поэтому количество слишком высоких кучек всегда будет \(0\).

В третьем примере можно увеличивать любую кучку на \(1\). Можно показать, что максимальное количество слишком высоких кучек равно \(1\).

F. Равный разворот

графы Конструктив математика реализация *2800

У вас есть массив \(a\) длины \(n\). Вы можете выполнять с ним следующую операцию:

  • Выберите два индекса \(l\) и \(r\) такие, что \(1 \le l \le r \le n\) и \(a_l = a_r\). После этого разверните подотрезок с \(l\)-го по \(r\)-й элемент, то есть замените \([a_l, a_{l + 1}, \ldots, a_{r - 1}, a_r]\) на \([a_r, a_{r-1}, \ldots, a_{l+1}, a_l]\).

Вам также дан массив \(b\) длины \(n\), который является перестановкой \(a\). Найдите последовательность из не более чем \(n^2\) операций, которая превращает массив \(a\) в \(b\), или определите, что такого массива не существует.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 500\)) — длину массивов \(a\) и \(b\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — элементы массива \(a\).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le n\)) — элементы массива \(b\).

Гарантируется, что \(b\) является перестановкой \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(500\).

Выходные данные

Для каждого набора входных данных выведите «NO» (без кавычек), если невозможно превратить \(a\) в \(b\), используя не более \(n^2\) операций.

Иначе выведите «YES» (без кавычек). Затем выведите целое число \(k\) (\(0 \leq k \leq n^2\)) — число операций, которое вы сделаете. Обратите внимание, что вам не нужно минимизировать число операций.

Затем выведите \(k\) строк. В \(i\)-й строке выведите два целых числа \(l_i\) и \(r_i\) (\(1 \leq l_i \leq r_i \leq n\)) — индексы для \(i\)-й операции.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут считаться положительным ответом).

Если существуют несколько решений, выведите любое из них.

Примечание

В первом примере можно выполнить следующие операции: \(\)[1,2,4,3,1,2,1,1] \xrightarrow[l=5,\,r=8]{} [1,2,4,3,1,1,2,1] \xrightarrow[l=1,\,r=6]{} [1,1,3,4,2,1,2,1].\(\)

Во втором примере можно выполнить следующие операции: \(\)[1,2,3,1,3,2,3] \xrightarrow[l=1,\,r=4]{} [1,3,2,1,3,2,3] \xrightarrow[l=3,\,r=6]{} [1,3,2,3,1,2,3].\(\)

Можно показать, что в третьем и четвертом примерах нельзя превратить \(a\) в \(b\).

B. Палиндромные числа

Конструктив математика реализация *1100

Однажды во время прогулки Алина увидела длинное число, которое кто-то написал на асфальте. Алина захотела найти положительное число такой же длины без ведущих нулей, чтобы сумма этих двух чисел была палиндромом.

Число называется палиндромом, если оно читается одинаково справа налево и слева направо. Например, числа \(121, 66, 98989\) являются палиндромами, а \(103, 239, 1241\) — нет.

После некоторых размышлений Алина поняла, что такое число всегда можно найти. Помогите Алине найти подходящее число!

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Затем следуют \(t\) наборов входных данных.

В первой строке каждого набора входных данных вводится одно целое число \(n\) (\(2 \leq n \leq 100\,000\)) — длина числа, которое увидела Алина.

Во второй строке каждого набора входных данных вводится одно положительное целое число длины \(n\). Гарантируется, что оно не содержит ведущих нулей.

Сумма значений \(n\) по всем наборам входных данных не превосходит \(100\,000\).

Выходные данные

Выведите ответ на каждый из \(t\) наборов входных — для каждого набора выведите положительное целое число без ведущих нулей длины \(n\), такое, что его сумма с числом из входных данных будет палиндромом.

Можно показать, что решение всегда существует. Если таких чисел несколько, вы можете вывести любое из них.

Примечание

В первом примере из условия \(99 + 32 = 131\) — палиндром. Число \(12\) также будет являться ответом, так как \(99 + 12 = 111\).

Во втором примере из условия \(1023 + 8646 = 9669\).

В третьем примере из условия \(385 + 604 = 989\).

A. Поляна

реализация *800

Вы находитесь на поляне размера \(2 \times 2\). Каждая клетка этой поляны может содержать траву, либо же быть пустой. Значение \(a_{i, j}\) равно \(1\), если клетка \((i, j)\) содержит траву и \(0\) иначе.

За один ход вы можете выбрать одну строку и один столбец и срезать всю траву в этой строке и в этом столбце. Другими словами, вы выбираете строку \(x\) и столбец \(y\), затем вы срезаете траву во всех клетках \(a_{x, i}\) и во всех клетках \(a_{i, y}\) для всех \(i\) от \(1\) до \(2\). После того как вы срежете траву в клетке, она становится пустой (то есть ее значение заменяется на \(0\)).

Ваша задача — найти минимальное количество ходов, необходимое для того, чтобы срезать траву во всех непустых клетках поляны (то есть сделать все \(a_{i, j}\) равными нулю).

Вам необходимо ответить на \(t\) независимых наборов тестовых данных.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 16\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов.

Набор тестовых данных состоит из двух строк, каждая из которых содержит два целых числа. Число в \(j\)-м столбце в \(i\)-й строке равно \(a_{i, j}\). Если \(a_{i, j} = 0\), тогда клетка \((i, j)\) пустая, а если \(a_{i, j} = 1\), тогда клетка \((i, j)\) содержит траву.

Выходные данные

Выведите одно целое число на набор тестовых данных — минимальное количество ходов, необходимое для того, чтобы срезать траву во всех непустых клетках поляны (то есть сделать все \(a_{i, j}\) равными нулю) в соответствующем наборе тестовых данных.

C. Организация расписания

Бинарный поиск жадные алгоритмы реализация *1400

Есть \(n\) работников и \(m\) заданий. Работники пронумерованы от \(1\) до \(n\). У каждого задания \(i\) есть значение \(a_i\) — номер работника, который специализируется на этом задании.

Каждое задание должен выполнить один из работников. Если работник специализируется на задании, то он выполняет его за \(1\) час. Иначе он тратит на него \(2\) часа.

Работники работают параллельно и независимо друг от друга. Каждый работник может одновременно работать только над одним заданием.

Назначьте работника на каждое задание так, чтобы все задания были завершены как можно раньше. Работа начинается в момент времени \(0\). К какому минимальному времени все задания могут быть завершены?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n \le m \le 2 \cdot 10^5\)) — количество работников и количество заданий.

Во второй строке записаны \(m\) целых чисел \(a_1, a_2, \dots, a_m\) (\(1 \le a_i \le n\)) — номер работника, специализирующегося на \(i\)-м задании.

Сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — минимальное время, к которому все задания могут быть завершены.

Примечание

В первом наборе первый работник работает над заданиями \(1\) и \(3\), а второй — над заданиями \(2\) и \(4\). Так как они оба специализируются на соответствующих заданиях, они их выполняют по \(1\) часу. Оба они выполняют \(2\) задания за \(2\) часа. Поэтому все задания оказываются выполнены за \(2\) часа.

Во втором наборе оптимально дать первому работнику задания \(1, 2\) и \(3\), а второму — задание \(4\). Первый работник потратит \(3\) часа, второй — \(2\) часа (так как он не специализируется на взятом задании).

В третьем наборе каждый работник может работать над заданием, на котором он специализируется. Так они выполнят все задания за \(1\) час.

F. Точки

Комбинаторика математика матрицы реализация Структуры данных *2500

Тройка точек \(i\), \(j\) и \(k\) на координатной прямой считается красивой, если \(i < j < k\) и \(k - i \le d\).

Вам задано множество точек на координатной прямой, изначально пустое. Вам нужно обрабатывать запросы трех типов:

  • добавить точку в множество;
  • удалить точку из множества;
  • посчитать количество красивых троек из точек, принадлежащих множеству.
Входные данные

В первой строке заданы два целых числа \(q\) и \(d\) (\(1 \le q, d \le 2 \cdot 10^5\)) — количество запросов и параметр, по которому определяется, является ли тройка красивой.

Во второй строке заданы \(q\) целых чисел \(a_1, a_2, \dots, a_q\) (\(1 \le a_i \le 2 \cdot 10^5\)). Число \(a_i\) обозначает \(i\)-й запрос следующим образом:

  • если точка \(a_i\) входит в множество, удалить ее; иначе добавить ее;
  • после удаления или добавления точки надо вывести количество красивых троек.
Выходные данные

Для каждого запроса выведите одно целое число — количество красивых троек после обработки запроса.

A. YES или YES?

Перебор реализация Строки *800

Дана строка \(s\) длины \(3\), состоящая из строчных и заглавных букв латинского алфавита. Ваша задача состоит в том, чтобы определить, равняется ли она строке «YES» (без кавычек), где каждая буква может быть как заглавной, так и строчной. Например, «yES», «Yes» и «yes» все являются допустимыми.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных. Далее следует описание каждого набора.

Единственная строка каждого набора входных данных содержит строку \(s\) длины три. Каждый символ \(s\) является строчной или заглавной буквой латинского алфавита.

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек) если \(s\) удовлетворяет условию, и «NO» в противном случае.

Вы можете выводить «Yes» и «No» в любом регистре (например, строки «yES», «yes» и «Yes» будут распознаны как правильный ответ).

Примечание

Первые пять наборов входных данных содержат строки «YES», «yES», «yes», «Yes», «YeS». Все они равны строке «YES», где каждый символ либо заглавный, либо строчный.

B. ICPC шарики

реализация Структуры данных *800

Во время соревнования ICPC шарики распределяются между командами следующим образом:

  • Когда команда решает задачу, она получает один шарик.
  • Первая команда, решившая определённую задачу, получает дополнительный шарик.
Всего в соревновании 26 задач, проиндексированных \(\textsf{A}\), \(\textsf{B}\), \(\textsf{C}\), ..., \(\textsf{Z}\). Вам известен порядок, в котором решались задачи во время соревнования, обозначенный строкой \(s\), где \(i\)-й символ строки обозначает, что задача с индексом \(s_i\) была решена одной из команд. Гарантируется, что никакая команда не может решить одну и ту же задачу дважды.

Посчитайте, какое суммарное количество шариков получили команды за время соревнования. Обратите внимание, что некоторые задачи могут быть не решены ни одной из команд.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание наборов.

Первая строка каждого набора входных данных содержит число \(n\) (\(1 \leq n \leq 50\)) — длину строки.

Вторая строка каждого набора содержит строку \(s\) длины \(n\), состоящую из заглавных букв латинского алфавита, обозначающую порядок, в котором решались задачи.

Выходные данные

Для каждого набора входных данных выведите одно число — суммарное количество шариков, полученных командами за время соревнования.

Примечание

В первом наборе входных данных были разданы \(5\) шаров:

  • Была решена задача \(\textsf{A}\). Решившая её команда получила \(2\) шара: один за решение задачи, второй за то, что она решила задачу \(\textsf{A}\) первой.
  • Была решена задача \(\textsf{B}\). Решившая её команда получила \(2\) шара: один за решение задачи, второй за то, что она решила задачу \(\textsf{B}\) первой.
  • Была решена задача \(\textsf{A}\). Решившая её команда получила \(1\) шар за решение задачи. Обратите внимание, что эта команда не получила дополнительный шарик, так как она не является первой командой, решившей задачу \(\textsf{A}\).
Суммарно команды получили \(2+2+1=5\) шариков.

Во втором наборе входных данных была решена только одна задача. Решившая её команда получила \(2\) шара: один за решение задачи, второй за то, что она решила задачу \(\textsf{A}\) первой.

C. Шифр

Перебор реализация Строки *800

Лука имеет шифр, представляющий собой последовательность из \(n\) колёсиков, каждое с написанной на нём цифрой \(a_i\). Известно, что он прокрутил \(i\)-е колёсико \(b_i\) раз. Каждое колёсико может крутиться:

  • вверх (обозначено символом \(\texttt{U}\)): прокрутка вверх увеличивает значение на \(i\)-м колёсике на \(1\). После прокрутки \(9\) вверх, значение становится равным \(0\).
  • вниз (обозначено символом \(\texttt{D}\)): прокрутка вниз уменьшает значение на \(i\)-м колёсике на \(1\). После прокрутки \(0\) вниз, значение становится равным \(9\).
Пример для \(n=4\). Текущая последовательность цифр: 0 0 0 0.

Лука знает конечные значения колёсиков и последовательность совершённых прокруток для каждого из них. Помогите ему восстановить изначальную последовательность цифр, чтобы взломать шифр!

Входные данные

Первая строка содержит число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит число \(n\) (\(1 \leq n \leq 100\)) — количество колёсиков.

Вторая строка содержит \(n\) чисел \(a_i\) (\(0 \leq a_i \leq 9\)) — значение на \(i\)-м колёсике после всех прокруток.

Далее следуют \(n\) строк, \(i\)-я из которых содержит число \(b_i\) (\(1 \leq b_i \leq 10\)) и \(b_i\) символов, каждый из которых является либо \(\texttt{U}\), либо \(\texttt{D}\) — количество совершённых прокруток \(i\)-го колёсика и описание прокруток соответственно. Символы \(\texttt{U}\) и \(\texttt{D}\) означают прокрутку вверх и вниз соответственно.

Выходные данные

Для каждого набора выведите \(n\) разделённых пробелом цифр  — изначальные значения на колёсиках шифра.

Примечание

В первом наборе можно показать, что изначальным шифром являлось \([2,1,1]\). В таком случае колёсики были прокручены следующим образом:

  • Первое колёсико: \(2 \xrightarrow[\texttt{D}]{} 1 \xrightarrow[\texttt{D}]{} 0 \xrightarrow[\texttt{D}]{} 9\).
  • Второе колёсико: \(1 \xrightarrow[\texttt{U}]{} 2 \xrightarrow[\texttt{D}]{} 1 \xrightarrow[\texttt{U}]{} 2 \xrightarrow[\texttt{U}]{} 3\).
  • Третье колёсико: \(1 \xrightarrow[\texttt{D}]{} 0 \xrightarrow[\texttt{U}]{} 1\).
Получившаяся последовательность \([9,3,1]\) совпадает с заданной во входных данных.

E. Симметричная решётка

реализация *1200

Вам дана квадратная матрица из \(n\) строк и \(n\) столбцов. В каждой ячейке содержится одно число: \(0\) или \(1\).

За одну операцию вы можете выбрать любую ячейку матрицы и инвертировать её значение (\(0 \to 1\) или \(1 \to 0\)).

Найдите за какое минимальное число операций можно получить квадрат который не меняется при поворотах на \(0^{\circ}\), \(90^{\circ}\), \(180^{\circ}\) и \(270^{\circ}\).

На картинке ниже показан пример всех поворотов одной матрицы.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание наборов.

Первая строка каждого набора входных данных содержит число \(n\) (\(1 \leq n \leq 100\)) — размер матрицы.

Следующие \(n\) строк каждого набора входных данных содержат строку длины \(n\), состоящую из значений \(a_{i,j}\) (\(0 \leq a_{i,j} \leq 1\)) — числа, записанные в каждой ячейке.

Выходные данные

Для каждого набора входных данных выведите одно число — минимальное количество операций необходимое чтобы получить квадратную матрицу, которая не меняется при поворотах на \(0^{\circ}\), \(90^{\circ}\), \(180^{\circ}\) и \(270^{\circ}\).

Примечание

В первом наборе входных данных, мы можем применить одну операцию чтобы сделать матрицу симметричной \(\begin{matrix}0 & 1 & 0\\ 1 & 1 & \color{red}{1}\\ 0 & 1 & 0\end{matrix}\). Теперь, любой поворот не меняет данную матрицу.

Во втором наборе входных данных, нет необходимости применять ни одной операции, любые допустимые повороты и так не меняют её.

B. Люк гурман

жадные алгоритмы Перебор реализация *1000

Люк любит поесть. Перед ним \(n\) стопок еды, выстроенных по прямой линии. В \(i\)-й стопке находится \(a_i\) единиц еды.

Люк будет идти от \(1\)-й стопки к \(n\)-й стопке, и он хочет съесть каждую стопку еды, не возвращаясь назад. Когда Люк достигает \(i\)-й стопки, он может съесть ее тогда и только тогда, когда \(|v - a_i| \leq x\), где \(x\) — фиксированное целое число, а \(v\) — пищевое желание Люка.

Прежде чем Люк начнет ходить, он может установить \(v\) в любое целое число. Кроме того, для каждого \(i\) (\(1 \leq i \leq n\)) Люк может изменить свое пищевой желание на любое целое число до того, как он съест \(i\)-ю стопку.

Найдите минимальное количество изменений, необходимое для того, чтобы съесть каждую стопку еды.

Обратите внимание, что первоначальный выбор \(v\) не считается изменением.

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует их описание.

Для каждого набора входных данных первая строка содержит два целых числа: \(n, x\) (\(1 \leq n \leq 2 \cdot 10^5\), \(1 \leq x \leq 10^9\)) — количество стопок, и максимальная разница между размером стопки и пищевым желанием Люка, при которой Люк может съесть стопку.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots , a_n\) (\(1 \leq a_i \leq 10^9\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите целое число — минимальное количество необходимых изменений.

Примечание

В первом наборе входных данных Люк может установить \(v\) в \(5\) до того, как он начнет ходить. И он может идти прямо, чтобы съесть каждую стопку еды, не меняя \(v\).

Во втором наборе входных данных Люк может установить \(v\) в \(3\) до того, как он начнет ходить. И он может поменять \(v\) на \(10\), прежде чем съест вторую стопку. После этого он может идти прямо, чтобы съесть оставшуюся еду, не меняя \(v\).

В четвертом наборе входных данных Люк может установить \(v\) в \(3\) до того, как начнет ходить. И он может поменять \(v\) на \(8\) до того, как съест шестую стопку. После этого он может идти прямо, чтобы съесть оставшуюся еду, не меняя \(v\).

В пятом наборе входных данных Люк может установить \(v\) в \(4\) до того, как начнет ходить. И он может поменять \(v\) на \(6\) до того, как съест четвертую стопку. Тогда он может поменять \(v\) на \(12\) до того, как съест седьмую стопку. После этого он может идти прямо, чтобы съесть оставшуюся еду, не меняя \(v\).

C. Вирус

жадные алгоритмы реализация сортировки *1200

На круге находятся \(n\) домов с номерами от \(1\) до \(n\). Для каждого \(1 \leq i \leq n - 1\) дом \(i\) и дом \(i + 1\) являются соседями; кроме того, дом \(n\) и дом \(1\) также являются соседями.

Изначально \(m\) из этих \(n\) домов заражены смертельным вирусом. Каждое утро Cirno может выбрать незараженный дом и навсегда защитить его от заражения.

Каждый день по порядку происходят следующие вещи:

  • Cirno выбирает незараженный дом и защищает его навсегда.
  • Заражаются все незараженные и незащищенные дома, у которых есть хотя бы один зараженный сосед.

Cirno хочет остановить распространение вируса. Найдите минимальное количество домов, которые в итоге будут заражены, если вы оптимально выберете дома для защиты.

Обратите внимание, что каждый день Cirno всегда выбирает дом для защиты до распространения вируса. Также защищенный дом не будет никогда заражен.

Входные данные

Вход состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует их описание.

Первая строка каждого набора входных данных состоит из двух целых положительных чисел \(n, m\) (\(5 \leq n \leq 10^9\), \(1 \leq m \leq \min(n, 10^5)\)) — количество домов в круге и количество домов, которые изначально заражены.

Вторая строка каждого набора входных данных состоит из \(m\) различных положительных целых чисел \(a_1, a_2, \cdots , a_m\) (\(1 \leq a_i \leq n\)) — индексы первоначально зараженных домов.

Гарантируется, что сумма \(m\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите целое число — минимальное количество зараженных домов в итоге.

Примечание

В первом наборе входных данных получить ответ можно следующим образом:

В начале первого дня заражены дома \(3\), \(6\), \(8\). Выберите дом \(2\) для защиты.

В начале второго дня заражены дома \(3\), \(4\), \(5\), \(6\), \(7\), \(8\), \(9\). Выберите дом \(10\) для защиты.

В начале третьего дня зараженных домов больше нет.

Во втором наборе входных данных получить ответ можно следующим образом:

В начале первого дня заражены дома \(2\), \(5\). Выберите дом \(1\) для защиты.

В начале второго дня заражены дома \(2\), \(3\), \(4\), \(5\), \(6\). Не осталось незащищенных и незараженных домов.

D. Специальный массив

Конструктив математика реализация хэши *1900

У Эрика есть массив \(b\) длины \(m\), затем он генерирует \(n\) дополнительных массивов \(c_1, c_2, \dots, c_n\), каждый длиной \(m\), из массива \(b\), следующим образом:

Изначально \(c_i = b\) для каждого \(1 \le i \le n\). Эрик тайно выбирает целое число \(k\) \((1 \le k \le n)\) и выбирает \(c_k\) в качестве специального массива.

Есть две операции, которые Эрик может выполнять над массивом \(c_t\):

  • Операция 1: Выберите два целых числа \(i\) и \(j\) (\(2 \leq i < j \leq m-1\)), вычтите \(1\) из \(c_t[i]\) и \(c_t[j]\) и добавьте \(1\) к \(c_t[i-1]\) и \(c_t[j+1]\). Эту операцию можно использовать только с неспециальным массивом, то есть когда \(t \neq k\).;
  • Операция 2: Выберите два целых числа \(i\) и \(j\) (\(2 \leq i < j \leq m-2\)), вычтите \(1\) из \(c_t[i]\) и \(c_t[j]\) и добавьте \(1\) к \(c_t[i-1]\) и \(c_t[j+2]\). Эту операцию можно использовать только для специального массива, то есть когда \(t = k\).

    Обратите внимание, что Эрик не может выполнить операцию, если какой-либо элемент массива после этой операции станет меньше \(0\).

Теперь Эрик делает следующее:

  • Для каждого неспециального массива \(c_i\) (\(i \neq k\)) Эрик использует только операцию 1 над ним по крайней мере один раз.
  • Для специального массива \(c_k\) Эрик использует над ним только операцию 2 по крайней мере один раз.

Наконец, Эрик отбрасывает массив \(b\).

По заданным массивам \(c_1, c_2, \dots, c_n\) ваша задача найти специальный массив, т.е. значение \(k\). Кроме того, вам нужно найти, сколько раз на нем использовалась операция \(2\).

Входные данные

Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует их описание.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(3 \leq n \leq 10^5\), \(7 \leq m \leq 3 \cdot 10^5\)) — количество массивов данных вам, и длина каждого массива.

Следующие \(n\) строк содержат по \(m\) целых чисел, \(c_{i,1}, c_{i,2}, \dots , c_{i,m}\).

Гарантируется, что каждый элемент изначального массива \(b\) находится в диапазоне \([0,10^6]\), поэтому \(0 \leq c_{i,j} \leq 3 \cdot 10^{11}\) для всех возможных пар \((i,j)\).

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

Гарантируется, что входные данные генерируется в соответствии с описанной выше процедурой.

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую два целых числа — индекс специального массива и количество раз, которое над ним выполнялась Операция 2. Можно показать, что при заданных в задаче ограничениях это значение уникально и не превышает \(10^{18}\), поэтому его можно представить в виде \(64\)-битного целого числа. Также можно показать, что индекс специального массива определяется однозначно.

В этой задаче взломы отключены.

Примечание

В первом наборе входных данных секретный массив \(b\) равен \([0, 1, 1, 1, 1, 1, 1, 1, 0]\). Массив \(c_1\) и массив \(c_2\) генерируются с использованием операции 1. Массив \(c_3\) генерируется с использованием операции 2.

Для массива \(c_1\) вы можете выбрать \(i=4\) и \(j=5\) и выполнить Операцию 1 один раз, чтобы сгенерировать его. Для массива \(c_2\) вы можете выбрать \(i=6\) и \(j=7\) и выполнить Операцию 1 один раз, чтобы сгенерировать его. Для массива \(c_3\) вы можете выбрать \(i=4\) и \(j=5\) и выполнить Операцию 2 один раз, чтобы сгенерировать его.

Во втором наборе входных данных секретный массив \(b\) равен \([20, 20, 20, 20, 20, 20, 20]\). Вы также можете обнаружить, что массив \(c_1\) и массив \(c_2\) генерируются с помощью Операции 1. Массив \(c_3\) создается с помощью Операции 2.

В третьем наборе входных данных секретный массив \(b\) равен \([20, 20, 20, 20, 20, 20, 20, 20, 20]\). Вы также можете обнаружить, что массив \(c_1\) и массив \(c_2\) генерируются с помощью Операции 1. Массив \(c_3\) создается с помощью Операции 2.

E. Посчитать секунды

графы дп Конструктив математика Перебор реализация *2200

У Cirno есть ориентированный ациклический граф с \(n\) вершинами и \(m\) ребрами. В графе ровно одна вершина, не имеющая исходящих ребер. На \(i\)-й вершине написано целое число \(a_i\).

Каждую секунду происходит следующее:

  • Пусть \(S\) — множество вершин \(x\), у которых \(a_x > 0\).
  • Для всех \(x \in S\) из \(a_x\) вычитается \(1\), а затем для каждой вершины \(y\) такой, что существует ребро из \(x\) в \(y\), \(1\) прибавляется к \(a_y\).

Найдите первый момент времени, когда все \(a_i\) станут равны \(0\). Так как ответ может быть очень большим, выведите его по модулю \(998\,244\,353\).

Входные данные

Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следует их описание.

Первая строка каждого набора входных данных содержит два целых числа \(n, m\) (\(1 \leq n, m \leq 1000\)) — количество вершин и ребер в графе.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^9\)) — числа, записанные в вершинах.

Следующие \(m\) строк содержит два целых числа \(x, y\) (\(1 \leq x, y \leq n\)), обозначающих ориентированное ребро из \(x\) в \(y\). Гарантируется, что граф является ориентированным ациклическим, без кратных ребер, и ровно одна вершина не имеет исходящих ребер.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных меньше или равны \(10\,000\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите целое число — первый момент времени, когда все \(a_i\) станут \(0\), по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных:

  • В момент времени \(0\) значения узлов равны \([1, 1, 1]\).
  • В момент времени \(1\) значения узлов равны \([0, 1, 1]\).
  • В момент времени \(2\) значения узлов равны \([0, 0, 1]\).
  • В момент времени \(3\) значения узлов равны \([0, 0, 0]\).
Так что ответ равен \(3\).

Во втором наборе входных данных:

  • В момент времени \(0\) значения узлов равны \([1, 0, 0, 0, 0]\).
  • В момент времени \(1\) значения узлов равны \([0, 1, 0, 0, 1]\).
  • В момент времени \(2\) значения узлов равны \([0, 0, 1, 0, 0]\).
  • В момент времени \(3\) значения узлов равны \([0, 0, 0, 1, 0]\).
  • В момент времени \(4\) значения узлов равны \([0, 0, 0, 0, 1]\).
  • В момент времени \(5\) значения узлов равны \([0, 0, 0, 0, 0]\).
Итак, ответ равен \(5\).

В третьем наборе входных данных:

Первый момент времени, когда все \(a_i\) становятся \(0\), равен \(6\cdot 998244353 + 4\).

B. Марк-уборщик

жадные алгоритмы Конструктив реализация *900

Марк убирает ряд из \(n\) комнат, \(i\)-я комната имеет неотрицательный уровень запыленности \(a_i\). У него есть волшебная чистящая машина, которая может выполнять следующую трехэтапную операцию:

  • Марк выбирает два таких индекса \(i<j\), что уровни пыли \(a_i\), \(a_{i+1}\), \(\dots\), \(a_{j-1}\) строго больше \(0\).
  • Машина изменяет \(a_i\) на новое значение \(a_i-1\).
  • Машина изменяет \(a_j\) на новое значение \(a_j+1\).

Цель Марка — сделать \(a_1 = a_2 = \ldots = a_{n-1} = 0\), тогда он сможет перейти к уборке комнаты \(n\). Требуется определить минимальное количество операций, необходимых для достижения его цели.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\leq t\leq 10^4\)) — количество наборов входных данных в тесте.

Первая строка каждого набора содержит одно целое число \(n\) (\(2\leq n\leq 2\cdot 10^5\)) — количество комнат.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1\), \(a_2\), ..., \(a_n\) (\(0\leq a_i\leq 10^9\)) — уровень пыли в каждой из комнат.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите строку, содержащую одно целое число — минимальное количество операций. Можно доказать, что существует последовательность операций, удовлетворяющая требованию задачи.

Примечание

В первом наборе входных данных примера возможна следующая последовательность операций:

  • выбрать \(i=1\) и \(j=2\), получить массив \([1,1,0]\);
  • выбрать \(i=1\) и \(j=3\), получить массив \([0,1,1]\);
  • выбрать \(i=2\) и \(j=3\), получить массив \([0,0,2]\).

После этого \(a_1=a_2=0\).

Во втором наборе входных данных примера возможна следующая последовательность операций:

  • выбрать \(i=4\) и \(j=5\), получить массив \([0,2,0,1,1]\).
  • выбрать \(i=2\) и \(j=3\), получить массив \([0,1,1,1,1]\).
  • выбрать \(i=2\) и \(j=5\), получить массив \([0,0,1,1,2]\).
  • выбрать \(i=3\) и \(j=5\), получить массив \([0,0,0,1,3]\).
  • выбрать \(i=4\) и \(j=5\), получить массив \([0,0,0,0,4]\).

После пятой операции массив удовлетворяет требованиям задачи.

C. Марк и неоконченное эссе

Перебор реализация *1400

Однажды ночью Марк вспомнил, что к завтрашнему дню ему нужно было написать сочинение. Он еще не начинал работу. Чтобы успеть в срок, Марк решил случайным образом скопировать и вставить подстроки из аннотации.

Формально, аннотация представляет собой строку \(s\) начальной длины \(n\). Марк выполнит операцию копирования и вставки \(c\) раз. Каждая операция описывается двумя целыми числами \(l\) и \(r\), что означает, что Марк будет добавлять буквы \(s_l s_{l+1} \ldots s_r\) в конец строки \(s\). Обратите внимание, что после этой операции длина \(s\) увеличивается.

Конечно, Марк должен иметь возможность проанализировать написанное. После окончания копирования Марк задаст \(q\) запросов: по заданному целому \(k\) определите \(k\)-ю букву итоговой строки \(s\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 1000\)) — количество наборов входных данных в тесте.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(c\) и \(q\) (\(1\leq n\leq 2\cdot 10^5\), \(1\leq c\leq 40\) и \(1\leq q\leq 10^4\)) — длина исходной строки \(s\), количество операций копирования-вставки и количество запросов соответственно.

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\). Гарантируется, что \(s\) содержит только строчные латинские буквы.

Следующие \(c\) строк описывают операции копирования-вставки. Каждая строка содержит два целых числа \(l\) и \(r\) (\(1\leq l\leq r\leq 10^{18}\)). Гарантируется, что \(r\) не превышает текущей длины \(s\).

Последние \(q\) строк каждого набора входных данных содержат запросы. Каждая строка содержит одно целое число \(k\) (\(1\leq k\leq 10^{18}\)). Гарантируется, что \(k\) не превышает длины итоговой строки \(s\).

Гарантируется, что суммы \(n\) и \(q\) по всем наборам входных данных не превосходят \(2\cdot 10^5\) и \(10^4\) соответственно.

Выходные данные

Для каждого запроса выведите \(k\)-ю букву конечной строки \(s\).

Примечание

В первом наборе входных данных примера процесс копирования-вставки выглядит следующим образом:

  • первым действием является дописывание строки \(\texttt{mark}\), что дает строку \(\texttt{mark}\color{red}{\texttt{mark}}\);
  • вторым действием является дописывание строки \(\texttt{mar}\), что дает строку \(\texttt{markmark}\color{red}{\texttt{mar}}\);
  • третье действие — дописывание строки \(\texttt{rkmark}\), в результате чего получается строка \(\texttt{markmarkmar}\color{red}{\texttt{rkmark}}\).

Во втором наборе входных данных примера процесс копирования-вставки выглядит следующим образом:

  • первое действие — дописывание строки \(\texttt{re}\), что дает строку \(\texttt{creamii}\color{red}{\texttt{re}}\);
  • второе действие — дописывание строки \(\texttt{ea}\), что дает строку \(\texttt{creamiire}\color{red}{\texttt{ea}}\);
  • третье действие — дописывание строки \(\texttt{reamiire}\), что дает строку \(\texttt{creamiireea}\color{red}{\texttt{reamiire}}\).

C. Qpwoeirut и город

дп жадные алгоритмы Потоки реализация *1400

Qpwoeirut занялся архитектурой и решил перестроить свой город.

Город состоит из \(n\) зданий, расположенных в ряд. Здание \(i\) (\(1 \le i \le n\)) имеет высоту \(h_i\) этажей. Вы можете считать, что все этажи в этой задаче имеют одинаковую высоту. Иными словами, здание \(i\) выше здания \(j\) тогда и только тогда, когда количество этажей \(h_i\) в здании \(i\) больше количества этажей \(h_j\) в здании \(j\).

Здание \(i\) классное, если оно выше (\(i-1\))-го здания и (\(i+1\))-го здания одновременно (и оба этих здания существуют). В частности, \(1\)-е и \(n\)-е здания не могут быть классными.

Qpwoeirut хочет максимизировать количество классных зданий. Чтобы сделать это, он может строить новые этажи на уже существующих зданиях, тем самым делая их выше. Обратите внимание, что Qpwoeirut не может удалять уже существующие этажи.

Так как новые этажи очень дорогие, Qpwoeirut хочет минимизировать количество новых этажей. Найдите минимальное количество этажей, которое ему придётся построить, чтобы максимизировать количество классных зданий.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано одно число \(n\) (\(3 \le n \le 10^5\)) — количество зданий в городе.

Во второй строке даны \(n\) целых чисел \(h_1, h_2, \ldots, h_n\) (\(1 \le h_i \le 10^9\)) — высоты зданий в этажах.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число: минимальное количество этажей, которое Qpwoeirut должен построить, чтобы максимизировать количество классных зданий.

Примечание

В первом наборе входных данных оптимально построить \(2\) новых этажа на втором здании, в результате чего оно станет выше обоих соседних зданий. Высоты зданий будут равны \([2, \underline{3}, 2]\).

Во втором наборе входных данных количество классных зданий уже максимально, поэтому Qpwoeirut может ничего не делать.

В третьем наборе входных данных оптимально построить \(2\) этажа на третьем здании и \(1\) этаж на пятом здании. Количество классных зданий будет равно двум. Высоты зданий будут равны \([3, 1, \underline{6}, 5, \underline{6}, 2]\).

Можно показать, что нельзя сделать более \(2\) классных зданий или сделать \(2\) классных здания, построив не более \(3\) этажей.

В четвёртом наборе входных данных можно сделать классным второе либо третье здание. В обоих случаях надо построить \(3\) новых этажа. Высоты зданий будут равны \([4, 2, \underline{4}, 3, 5, 3, 6, 1]\) либо \([4, \underline{5}, 1, 3, 5, 3, 6, 1]\).

A. Дореми и её IQ

Бинарный поиск жадные алгоритмы Конструктив реализация *1600

Дореми попросили протестировать \(n\) контестов. Контест \(i\) может быть протестирован только в день \(i\). Сложность контеста \(i\) равна \(a_i\). В начале показатель IQ Дореми равен \(q\). В день \(i\) Дореми решает, протестирует ли она контест \(i\) или нет. Она может протестировать контест только в случае, если её текущий показатель IQ строго больше \(0\).

Если Дореми решает протестировать контест \(i\) в день \(i\), то происходит следующее:

  • если \(a_i>q\), то Дореми чувствует себя недостаточно умной, поэтому \(q\) уменьшается на \(1\);
  • иначе ничего не изменяется.
При решении не тестировать контест ничего не происходит.

Дореми хочет протестировать как можно больше контестов. Помогите Дореми найти оптимальное решение.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных в тесте. Далее следует описание наборов.

Первая строка каждого набора содержит целые числа \(n\) и \(q\) (\(1 \le n \le 10^5\), \(1 \le q \le 10^9\)) — число контестов и показатель IQ Дореми в начале.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1,a_2,\cdots,a_n\) (\(1 \le a_i \le 10^9\)) — сложность каждого контеста.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора выведите бинарную строку \(s\), где \(s_i=1\) если Дореми должна протестировать контест \(i\), и \(s_i=0\) иначе. Число единиц в строке должно быть максимально возможным, и при этом она не должна тестировать контест, когда её показатель IQ меньше либо равен нулю.

Если существуют несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных Дореми тестирует единственный имеющийся контест. Её показатель IQ не уменьшается.

Во втором наборе входных данных Дореми тестирует оба имеющихся контеста. Её показатель IQ уменьшается на \(1\) после тестирования контеста \(2\).

В третьем наборе входных данных Дореми тестирует контесты \(1\) и \(2\). Её показатель IQ уменьшается до \(0\) после тестирования контеста \(2\), поэтому она не может протестировать контест \(3\).

B. Разностный массив

Перебор реализация сортировки Структуры данных *1900

Вам дан массив \(a\) состоящий из \(n\) неотрицательных целых чисел. Гарантируется, что \(a\) отсортирован от меньших к большим.

За одну операцию мы создаем новый массив \(b_i=a_{i+1}-a_{i}\) для всех \(1 \le i < n\). Затем сортируем \(b\) от меньших к большим, заменяем \(a\) на \(b\) и уменьшаем \(n\) на \(1\).

После применения \(n-1\) операции \(n\) становится равным \(1\). Вам нужно вывести единственное целое число в массиве \(a\) (то есть вывести \(a_1\)).

Входные данные

Входные данные состоят из нескольких наборов. Первая строка содержит единственное целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Затем следуют описания наборов.

Первая строка каждого набора содержит одно целое число \(n\) (\(2\le n\le 10^5\)) — длина массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,\dots,a_n\) (\(0\le a_1\le \ldots\le a_n \le 5\cdot 10^5\)) — массив \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2.5\cdot 10^5\) и сумма \(a_n\) по всем наборам не превосходит \(5\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ в отдельной строке.

Примечание

Чтобы упростить примечание, обозначим как \(\operatorname{sort}(a)\) массив, получаемый из \(a\) сортировкой от меньших к большим.

В первом наборе изначально \(a=[1,10,100]\). После первой операции \(a=\operatorname{sort}([10-1,100-10])=[9,90]\). После второй операции \(a=\operatorname{sort}([90-9])=[81]\).

Во втором наборе изначально \(a=[4,8,9,13]\). После первой операции \(a=\operatorname{sort}([8-4,9-8,13-9])=[1,4,4]\). После второй операции \(a=\operatorname{sort}([4-1,4-4])=[0,3]\). После последней операции \(a=\operatorname{sort}([3-0])=[3]\).

A. Три двери

жадные алгоритмы математика Перебор реализация *800

Перед вами три двери, пронумерованные от \(1\) до \(3\) слева направо. На каждой двери висит замок, который может быть открыть только ключом, на котором написано то же число, что и на двери.

Есть три ключа — по одному от каждой двери. Два из них спрятаны за дверьми так, что за каждой дверью не более одного ключа. То есть за двумя дверьми лежит по одному ключу, за одной дверью ключа нет. Чтобы получить ключ, спрятанный за дверью, надо сначала открыть эту дверь. Оставшийся ключ у вас в руках.

Можете ли вы открыть все двери?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 18\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(x\) (\(1 \le x \le 3\)) — номер на ключе у вас в руках.

Во второй строке записаны три целых числа \(a, b\) и \(c\) (\(0 \le a, b, c \le 3\)) — номер на ключе за каждой дверью. Если за дверью нет ключа, то номер равен \(0\).

Значения \(1, 2\) и \(3\) встречаются ровно по одному разу \(x, a, b\) и \(c\).

Выходные данные

На каждый набор входных данных выведите «YES», если можно открыть все двери. Иначе выведите «NO».

B. Also Try Minecraft

дп реализация Структуры данных *900

Вы занимаетесь бета-тестированием нового секретного обновления игры Terraria. Это обновление добавит в игру квесты!

Для простоты карту мира можно представить как массив длины \(n\), где \(i\)-й столбец мира имеет высоту \(a_i\).

Вам необходимо протестировать \(m\) квестов. Квест с номером \(j\) представлен двумя целыми числами \(s_j\) и \(t_j\). В этом квесте вам необходимо добраться из столбца \(s_j\) до столбца \(t_j\). В начале квеста вы появляетесь в столбце \(s_j\).

За один ход вы можете перейти из столбца \(x\) в столбец \(x-1\) или в столбец \(x+1\). В этой версии у вас есть Spectre Boots, которые позволяют вам летать. Так как это бета-версия, эти ботинки работают неправильно, поэтому они позволяют вам летать только тогда, когда вы движетесь вверх, и имеют бесконечную длительность полета. Когда вы перемещаетесь из столбца с высотой \(p\) в столбец с высотой \(q\), вы получаете какое-то количество урона от падения. Если высота \(p\) больше высоты \(q\), вы получаете \(p - q\) единиц урона от падения, иначе вы летите вверх и получаете \(0\) единиц урона.

Для каждого из заданных квестов определите минимальное количество урона от падения, которое вы можете получить, выполняя этот квест.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 10^5; 1 \le m \le 10^5\)) — количество столбцов в мире и количество квестов, которые вам надо протестировать, соответственно.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)), где \(a_i\) равно высоте \(i\)-го столбца мира.

Следующие \(m\) строк описывают квесты. В \(j\)-й из них содержатся два целых числа \(s_j\) и \(t_j\) (\(1 \le s_j, t_j \le n; s_j \ne t_j\)), которые значат, что вам необходимо переместиться из столбца \(s_j\) в столбец \(t_j\) в течение \(j\)-го квеста.

Заметьте, что \(s_j\) может быть больше, чем \(t_j\).

Выходные данные

Выведите \(m\) строк. В \(j\)-й из них должно находиться минимальное количество урона от падения, который вы можете получить во время выполнения \(j\)-го квеста.

C. Восстанови ПСП

жадные алгоритмы Конструктив реализация Строки *1800

Скобочная последовательность — это строка, содержащая только символы «(» и «)». Правильная скобочная последовательность (или, коротко говоря, ПСП) — это скобочная последовательность, которая может быть преобразована в правильное арифметическое выражение путем вставки символов «1» и «+» между исходными символами последовательности. Например:

  • скобочные последовательности «()()» и «(())» являются правильными (возможные выражения: «(1)+(1)» и «((1+1)+1)»);
  • скобочные последовательности «)(», «(» и «)» не являются правильными.

В начале была некоторая ПСП. Некоторые скобки заменили на знаки вопроса. Верно ли, что существует единственный способ заменить знаки вопроса на скобки так, чтобы получилась ПСП?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^4\)) — количество наборов входных данных.

В единственной строке каждого набора входных данных записана ПСП с некоторыми скобками замененными на знаки вопроса. Каждый символ — это '(', ')' или '?'. Из данной последовательности можно восстановить хотя бы одну ПСП.

Суммарная длина последовательностей по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите «YES», если способ заменить знаки вопроса на скобки так, чтобы получилась ПСП, единственный. Если существует больше одного способа, то выведите «NO».

Примечание

В первом наборе входных данных единственная возможная оригинальная ПСП — это «(())».

Во втором наборе существует несколько способов восстановить ПСП.

В третьем и четвертом наборах единственная возможная ПСП — это «()».

В пятом наборе оригинальная ПСП может быть «((()()))» или «(())()()».

C. A Piece of Cake

*особая задача реализация *2000

How to make a cake you'll never eat.

Ingredients.

  • 2 carrots
  • 0 calories
  • 100 g chocolate spread
  • 1 pack of flour
  • 1 egg

Method.

  1. Put calories into the mixing bowl.
  2. Take carrots from refrigerator.
  3. Chop carrots.
  4. Take chocolate spread from refrigerator.
  5. Put chocolate spread into the mixing bowl.
  6. Combine pack of flour into the mixing bowl.
  7. Fold chocolate spread into the mixing bowl.
  8. Add chocolate spread into the mixing bowl.
  9. Put pack of flour into the mixing bowl.
  10. Add egg into the mixing bowl.
  11. Fold pack of flour into the mixing bowl.
  12. Chop carrots until choped.
  13. Pour contents of the mixing bowl into the baking dish.

Serves 1.

Входные данные

В единственной строке входных данных задан набор целых чисел a0, a1, ... (1 ≤ a0 ≤ 100, 0 ≤ ai ≤ 1000 для i ≥ 1).

Выходные данные

Выведите ответ — единственное целое число.

F. фювбюая

*особая задача Перебор реализация теория чисел *1600

фювбюая - мвю яаюбвюф жшбыю, жлф чфаъпылэюф ювапцфэшф осыофвбо уагтшь яаюбвкь жшбыюь.

Входные данные

эпщушвф фювбюая эюьфа n сеюуэкф упээкф бюбвюов шч фушэбвсфээютю ёфыютю n (1 ≤ n ≤ 11184) — эюьфап шбъюьютю фювбюаяп. эгьфапёшо эпжшэпфвбо б фушэшёк.

Выходные данные

сксфушвф фушэбвсфээюф жшбыю.

H. Ломаная

*особая задача реализация *1700

Входные данные

Входные данные содержат два целых числа a, b (1 ≤ a ≤ 10, 0 ≤ b ≤ 2a - 1), разделенных пробелом.

Выходные данные

Выведите два целых числа, разделенных пробелом.

B. Дождь

Бинарный поиск геометрия жадные алгоритмы математика Перебор реализация Структуры данных *2100

Вы владеете полем, который можно представить как бесконечную числовую прямую, все позиции на которой отмечены целыми числами.

В следующие \(n\) дней будет идти дождь. В \(i\)-й день центр дождя будет располагаться в точке \(x_i\), а интенсивность дождя будет равна \(p_i\). Из-за дождей будет собираться дождевая вода; пусть \(a_j\) будет обозначать объем воды, накопившийся в точке \(j\). Изначально \(a_j\) равно \(0\), после дождя в \(i\)-й день это значение увеличится на \(\max(0,p_i-|x_i-j|)\).

Поле затопит, если в некоторый момент будет существовать точка \(j\), в которой накопится \(a_j>m\) воды.

Вы можете использовать заклинание и отменить дождь в ровно один из дней, т. е. установить \(p_i=0\). Для каждого \(i\) от \(1\) до \(n\) определите, если вы отмените дождь в \(i\)-й день, верно ли, что затопления не случится?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 2 \cdot 10^5\), \(1 \leq m \leq 10^9\)) — количество дней и максимальный объем воды, который может находиться в одной точке, не вызывая затопления.

Далее следуют \(n\) строк. \(i\)-я из этих строк содержит два целых числа \(x_i\) и \(p_i\) (\(1 \leq x_i,p_i \leq 10^9\)) — положение центра и интенсивность дождя в \(i\)-й день.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите бинарную строку \(s\) длины \(n\). \(i\)-й символ строки \(s\) должен быть равен 1, если в случае отмены дождя в \(i\)-й день затопления не случится, и 0, если в случае отмены дождя в \(i\)-й день затопление произойдет.

Примечание

В первом наборе входных данных, если не использовать заклинание, собравшаяся вода будет выглядеть следующим образом:

Если отменить дождь в третий день, затопление будет предотвращено, и собравшаяся вода будет выглядеть следующим образом:

Во втором примере изначально нет затопления, поэтому можно отменить дождь в любой день.

В третьем примере нет способа избежать затопления.

A. Чудесная перестановка

жадные алгоритмы реализация *800

God's Blessing on This PermutationForces!
A Random Pebble

Дана перестановка \(p_1,p_2,\ldots,p_n\) длины \(n\) и целое положительное число \(k \le n\).

За одну операцию вы можете выбрать два целых числа \(i\) и \(j\) (\(1 \le i < j \le n\)) и поменять местами \(p_i\) и \(p_j\).

Найдите минимальное количество операций, необходимых для того, чтобы сделать сумму \(p_1 + p_2 + \ldots + p_k\) минимально возможной.

Перестановкой является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 100\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_1,p_2,\ldots,p_n\) (\(1 \le p_i \le n\)). Гарантируется, что данные числа образуют перестановку длины \(n\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы сделать сумму \(p_1 + p_2 + \ldots + p_k\) минимально возможной.

Примечание

В первом наборе входных данных сумма \(p_1 + p_2 + \ldots + p_k\) изначально равна \(2\), но минимально возможное значение равно \(1\). Его можно достичь, поменяв местами \(p_1\) и \(p_3\), тогда результирующая перестановка будет равна \([1, 3, 2]\).

Во втором наборе входных данных сумма уже минимально возможная, поэтому ответ — \(0\).

A. Задача коммивояжера

геометрия жадные алгоритмы реализация *800

Вы живете на бесконечной плоскости с введенными декартовыми координатами. За один шаг вы можете пойти в одну из четырех соседних точек (налево, направо, наверх или вниз).

Более формально, если вы стоите в точке \((x, y)\), вы можете:

  • пойти налево и переместиться в точку \((x - 1, y)\), или
  • пойти направо и переместиться в точку \((x + 1, y)\), или
  • пойти наверх и переместиться в точку \((x, y + 1)\), или
  • пойти вниз и переместиться в точку \((x, y - 1)\).

На плоскости расположены \(n\) коробок. \(i\)-я из этих коробок находится в точке с координатами \((x_i,y_i)\). Гарантируется, что коробки находятся либо на оси \(x\), либо на оси \(y\), то есть \(x_i=0\), или \(y_i=0\).

Вы можете подобрать коробку если находитесь в одной точке с ней. Найдите минимальное число шагов, необходимое, чтобы собрать все коробки, при условии что вы начинаете и заканчиваете в точке \((0,0)\).

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Вторая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество коробок.

\(i\)-я из следующих \(n\) строк содержит два целых числа \(x_i\) и \(y_i\) (\(-100 \le x_i, y_i \le 100\)) — координаты \(i\)-й коробки. Гарантируется, что или \(x_i=0\), или \(y_i=0\).

Обратите внимание, что сумма значений \(n\) по всем наборам входных данных не ограничена.

Выходные данные

Для каждого набора входных данных выведите одно число — минимальное необходимое число шагов.

Примечание

В первом примере одна из оптимальных последовательностей шагов показана ниже.

\(\)(0,0) \to (1,0) \to (1,1) \to (1, 2) \to (0,2) \to (-1,2) \to (-1,1) \to (-1,0) \to (-1,-1) \to (-1,-2) \to (0,-2) \to (0,-1) \to (0,0)\(\)

Во втором примере одна из оптимальных последовательностей шагов показана на рисунке ниже.

\(\)(0,0) \to (0,1) \to (0,2) \to (-1, 2) \to (-2,2) \to (-3,2) \to (-3,1) \to (-3,0) \to (-3,-1) \to (-2,-1) \to (-1,-1) \to (0,-1) \to (0,0)\(\)

В третьем примере можно собрать все коробки не делая шагов.

A. Все любят спать

математика реализация *900

Влад, как и все, очень любит спать.

Ежедневно Влад должен сделать \(n\) дел, каждое в определённое время. Для каждого из этих дел у него установлен будильник, \(i\)-й из них срабатывает в \(h_i\) часов \(m_i\) минут каждый день (\(0 \le h_i < 24, 0 \le m_i < 60\)). Влад использует \(24\)-часовой формат времени, поэтому после \(h=12, m=59\) наступает \(h=13, m=0\), а после \(h=23, m=59\) наступает \(h=0, m=0\).

В этот раз Влад лёг спать в \(H\) часов \(M\) минут (\(0 \le H < 24, 0 \le M < 60\)) и просит вас ответить: сколько ему удастся поспать до ближайшего следующего будильника.

Если какой-либо будильник зазвонит в момент времени, когда он лёг спать, то спать он будет отрезок времени длины \(0\).

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных в тесте.

Первая строка набора содержит три целых числа \(n\), \(H\) и \(M\) (\(1 \le n \le 10, 0 \le H < 24, 0 \le M < 60\)) — количество будильников и время, в которое Влад лёг спать.

Следующие \(n\) строк содержат по два числа \(h_i\) и \(m_i\) (\(0 \le h_i < 24, 0 \le m_i < 60\)) — время срабатывания \(i\)-го будильника. Допустимо, что два или больше будильника сработают в один момент времени.

Числа, описывающие время не содержат ведущих нулей.

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите два числа — количество часов и минут, которые поспит Влад, соответственно. Если какой-либо будильник зазвонит в момент времени, когда он лёг спать, то ответ будет равен 0 0.

B. Удали префикс

жадные алгоритмы реализация Структуры данных *800

Поликарпу подарили некоторую последовательность целых чисел \(a\) длины \(n\) (\(1 \le a_i \le n\)). Последовательность может порадовать Поликарпа, только если она состоит из различных чисел. Для того чтобы сделать свою последовательность такой, Поликарп собирается сделать некоторое (возможно, нулевое) количество ходов.

За один ход он может:

  • удалить первый (крайний левый) элемент последовательности.

Например, за один ход из последовательности \([3, 1, 4, 3]\) получится последовательность \([1, 4, 3]\), которая состоит из различных чисел.

Определите, какое минимальное количество ходов ему надо сделать, чтобы в оставшейся последовательности все элементы были различны. Иными словами, найдите длину наименьшего префикса заданной последовательности \(a\), после удаления которого все значения в последовательности будут уникальны.

Входные данные

В первой строке входных данных записано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк.

В первой из них записано целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина заданной последовательности \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — элементы заданной последовательности \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ на отдельной строке — минимальное количество элементов, которые надо удалить из начала последовательности, чтобы все оставшиеся элементы оказались различны.

Примечание

Ниже перечислены последовательности, которые останутся после удаления префиксов:

  • \([1, 4, 3]\);
  • \([1]\);
  • \([1]\);
  • \([6, 5, 4, 3, 2, 1]\);
  • \([2, 1]\).

Легко увидеть, что все оставшиеся последовательности содержат только различные элементы. В каждом наборе входных данных был удалён самый короткий из подходящих префиксов.

F. Построй дерево и точка

Деревья Конструктив реализация *1900

Деревом называется связный неориентированный граф без циклов. Обратите внимание, что в этой задаче речь идёт о некорневых деревьях.

Заданы четыре положительных целых числа \(n, d_{12}, d_{23}\) и \(d_{31}\). Постройте такое дерево, что:

  • оно содержит \(n\) вершин, пронумерованных от \(1\) до \(n\),
  • расстояние (длина кратчайшего пути) от вершины \(1\) до вершины \(2\) равно \(d_{12}\),
  • расстояние от вершины \(2\) до вершины \(3\) равно \(d_{23}\),
  • расстояние от вершины \(3\) до вершины \(1\) равно \(d_{31}\).

Выведите любое дерево, которое удовлетворяет всем требованиям выше, или определите, что такого дерева не существует.

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют \(t\) наборов входных данных, каждый записан в отдельной строке.

Каждый набор состоит из четырёх положительных целых чисел \(n, d_{12}, d_{23}\) и \(d_{31}\) (\(3 \le n \le 2\cdot10^5; 1 \le d_{12}, d_{23}, d_{31} \le n-1\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных теста не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите YES, если искомое дерево существует, и NO в противном случае. В случае положительного ответа выведите ещё \(n-1\) строку, каждая содержит описание ребра дерева — пару положительных целых чисел \(x_i, y_i\), которая обозначает, что \(i\)-е ребро соединяет вершины \(x_i\) и \(y_i\). Ребра и вершины ребер можно выводить в произвольном порядке. Если искомых деревьев несколько, выведите любое из них.

C. Моноблок

Комбинаторика математика реализация Структуры данных *1700

Сережа решил срочно купить новый моноблок. Сейчас он использует VPN и поэтому, чтобы попасть на сайт, надо решить вот такую капчу.

Крутостью массива назовем минимальное количество блоков подряд идущих одинаковых чисел, на которые он разбивается.

Например, крутость массива

  • \([1, 1, 1]\) это \(1\);
  • \([5, 7]\) это \(2\), ведь его можно разбить на два блока: \([5]\) и \([7]\);
  • \([1, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9]\) это 3, потому что его можно разбить на блоки \([1]\), \([7, 7, 7, 7, 7, 7, 7]\) и \([9, 9, 9, 9, 9, 9, 9, 9, 9]\).

Вам дан массив \(a\) длины \(n\), а также \(m\) запросов, состоящих из двух целых чисел \(i\) и \(x\). Запрос \(i\), \(x\) означает, что теперь \(i\)-й элемент массива \(a\) равен \(x\).

После каждого запроса выведите сумму крутостей всех непустых подотрезков массива \(a\). Другими словами, после каждого запроса вам надо вычислять \(\)\sum\limits_{l = 1}^n \sum\limits_{r = l}^n g(l, r),\(\) где \(g(l, r)\) это крутость массива \(b = [a_l, a_{l + 1}, \ldots, a_r]\).

Входные данные

В первой строке вводятся \(n\) и \(m\) (\(1 \leq n, m \leq 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — массив \(a\).

В каждой из следующих \(m\) строк вам дает описание запросов. Каждая строка содержит два целых числа \(i\) и \(x\) (\(1 \leq i \leq n\), \(1 \leq x \leq 10^9\)).

Выходные данные

После каждого запроса выведите ответ на задачу в отдельной строке.

Примечание

После первого запроса массив \(a\) равен \([1, 2, 2, 4, 5]\), ответ равен \(29\), потому что подрезки массива можно разбить на блоки:

  1. \([1; 1]\): \([1]\), 1 блок;
  2. \([1; 2]\): \([1] + [2]\), 2 блока;
  3. \([1; 3]\): \([1] + [2, 2]\), 2 блока;
  4. \([1; 4]\): \([1] + [2, 2] + [4]\), 3 блока;
  5. \([1; 5]\): \([1] + [2, 2] + [4] + [5]\), 4 блока;
  6. \([2; 2]\): \([2]\), 1 блок;
  7. \([2; 3]\): \([2, 2]\), 1 блок;
  8. \([2; 4]\): \([2, 2] + [4]\), 2 блока;
  9. \([2; 5]\): \([2, 2] + [4] + [5]\), 3 блока;
  10. \([3; 3]\): \([2]\), 1 блок;
  11. \([3; 4]\): \([2] + [4]\), 2 блока;
  12. \([3; 5]\): \([2] + [4] + [5]\), 3 блока;
  13. \([4; 4]\): \([4]\), 1 блок;
  14. \([4; 5]\): \([4] + [5]\), 2 блока;
  15. \([5; 5]\): \([5]\), 1 блок;
что в сумме равняется \(1 + 2 + 2 + 3 + 4 + 1 + 1 + 2 + 3 + 1 + 2 + 3 + 1 + 2 + 1 = 29\).

C. Робот в коридоре

дп жадные алгоритмы реализация Структуры данных Тернарный поиск *2000

Задано поле, состоящее из \(2\) строк и \(m\) столбцов. Строки занумерованы от \(1\) до \(2\) сверху вниз. Столбцы занумерована от \(1\) до \(m\) слева направо.

Робот начинает в клетке \((1, 1)\). За одну секунду он может проделать любое из двух действий:

  • перейти в соседнюю по стороне клетку: наверх, направо, вниз или налево;
  • остаться в той же клетке.

Роботу запрещено выходить за пределы поля.

Изначально все клетки, кроме клетки \((1, 1)\) заблокированы. Каждая клетка \((i, j)\) содержит значение \(a_{i,j}\) — момент, когда данная клетка будет разблокирована. Робот может перейти в клетку \((i, j)\), если до начала хода прошло хотя бы \(a_{i,j}\) секунд.

Робот должен посетить все клетки, не входя ни в какую клетку дважды или больше (считается, что робот вошел в клетку \((1, 1)\) на старте). Он может закончить в любой клетке.

Какое минимальное время у него это может занять?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора записано одно целое число \(m\) (\(2 \le m \le 2 \cdot 10^5\)) — количество столбцов поля.

В \(i\)-й из следующих \(2\) строк записаны \(m\) целых чисел \(a_{i,1}, a_{i,2}, \dots, a_{i,m}\) (\(0 \le a_{i,j} \le 10^9\)) — момент времени, в который каждая клетка будет разблокирована. \(a_{1,1} = 0\). Если \(a_{i,j} = 0\), то клетка \((i, j)\) разблокирована с самого начала.

Сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — минимальное количество секунд, которые могут потребоваться роботу, чтобы посетить все клетки, не входя ни в какую клетку дважды или больше.

B. Мадока и подпольные соревнования

Конструктив реализация *1100

Мадока решила участвовать в подпольном соревновании по спортивному программированию. И в нем была ровно одна задача:

Квадратная таблица размера \(n \times n\), где \(n\) кратно \(k\), называется хорошей, если в ней записаны только символы '.' и 'X', а также в любой подтаблице размера \(1 \times k\) или \(k \times 1\) есть хотя бы один символ 'X'. Иными словами, среди любых \(k\) подряд идущих по вертикали или по горизонтали клеток должна быть хотя бы одна, в которой записан символ 'X'.

Нужно вывести любую хорошую таблицу, в которой минимально возможное количество символов 'X', а также в клетке \((r, c)\) записан символ 'X'. Строки нумеруются от \(1\) до \(n\) сверху вниз, столбцы нумеруются от \(1\) до \(n\) слева направо.

Входные данные

В первой строке входных данных находится единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В единственной строке каждого набора входных данных содержатся четыре целых числа \(n\), \(k\), \(r\), \(c\) (\(1 \le n \le 500, 1 \le k \le n, 1 \le r, c \le n\)) — размер таблицы, число \(k\) и координаты клетки, которой обязательно должен быть записан символ 'X'. Гарантируется, что \(n\) кратно \(k\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(500\).

Выходные данные

Для каждого набора входных данных выведите \(n\) строк, каждая из которых состоит из \(n\) символов '.' и 'X', — искомую таблицу. Если ответов несколько, то можете вывести любой.

Примечание

Разберём первый набор входных данных.

В качестве правильного ответа можно вывести следующие таблицы:

X..
..X
.X.
или
..X
X..
.X.
Можно показать, что меньше \(3\) символов 'X' в ответе быть не может.

Обратите внимание, что следующая таблица не подходит, потому что в клетке \((3, 2)\) не записан символ 'X':

X..
.X.
..X

Во втором наборе входных данных единственной подходящей таблицей является:

XX
XX
В каждой подтаблице размера \(1 \times 1\) должен быть символ 'X', поэтому все символы в таблице должны быть равны 'X'.

F. Мадока и первая сессия

графы Конструктив Паросочетания Потоки реализация *2500

О нет, на первой же сессии Мадоке попался билет со следующей сложной задачей:

Дано число \(n\) и \(m\) пар чисел (\(v_i, u_i\)). А также есть массив \(b_1, b_2, \ldots, b_n\), изначально заполненный нулями.

Затем для каждого индекса \(i\), где \(1 \leq i \leq m\), выполняется либо \(b_{v_i} := b_{v_i} - 1\) и \(b_{u_i} := b_{u_i} + 1\), либо \(b_{v_i} := b_{v_i} + 1\) и \(b_{u_i} := b_{u_i} - 1\). Обратите внимание, что ровно одна из этих операций должна быть выполнена для каждого \(i\).

Также дан массив \(s\) размера \(n\), состоящий только из \(0\) и \(1\). И массив \(a_1, a_2, \ldots, a_n\), где гарантируется, что если \(s_i = 0\), то \(a_i = 0\).

Помогите Мадоке и определите, можно ли выполнить операции выше таким образом, чтобы для каждого \(i\), где \(s_i = 1\), выполнялось \(a_i = b_i\). И если возможно, то как это сделать.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 10000, 1 \leq m \leq 10000\)) — длина массива \(a\) и количество пар чисел.

Вторая строка содержит \(n\) целых чисел \(s_1, s_2, \ldots s_n\) (\(0 \le s_i \le 1\)) — элементы массива \(s\).

Третья строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(|a_i| \leq m\)) — элементы массива \(a\). Гарантируется, что если \(s_i = 0\), то \(a_i = 0\).

\(i\)-я из следующих \(m\) строк содержат два целых числа \(v_i\) и \(u_i\) (\(1 \leq v_i, u_i \leq n, v_i \ne u_i\)) — индексы элементов массива \(b\), к которым применяется операция. Также гарантируется, что не существует таких двух индексов \(i\) и \(j\), где \(1 \le i < j \le m\), что \((v_i, u_i) = (v_j, u_j)\) или \((v_i, u_i) = (u_j, v_j)\).

Выходные данные

Выведите в первой строке «YES», если можно выполнить операции нужным образом, и «NO» в противном случае.

Вы можете выводить каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ).

В случае, если вы вывели «YES», выведите \(m\) пар целых чисел. Если для пары \((v_i, u_i)\) нужно выполнить \(b_{v_i} := b_{v_i} - 1\) и \(b_{u_i} := b_{u_i} + 1\), выведите \((v_i, u_i)\). Иначе выведите \((u_i, v_i)\). Если существует несколько способов получить правильный ответ, можно вывести любой из них.

Пары можно выводить в любом порядке.

Примечание

В первом примере массив \(b\) будет меняться следующим образом: \([0,0,0,0,0] \rightarrow [-1,0,0,1,0] \rightarrow [-2,0,0,1,1] \rightarrow [-2,0,1,0,1] \rightarrow [-2,0,2,0,0] \rightarrow [-2,0,2,1,-1]\). \(a_i = b_i\) для всех индексов \(i\) от \(1\) до \(5\).

Во втором примере нам достаточно, чтобы в конце \(b_2 = 1\), поскольку только \(s_2 = 1\).

В третьем примере входных данных нельзя выполнить операции нужным образом.

B. Фибоначчиевы строки

жадные алгоритмы математика реализация теория чисел *2000

Во всех школах Бурятии в \(1\) классе всем рассказывают теорию фибоначчиевых строк.

«Блок — это подотрезок строки, все буквы которого одинаковы, а слева и справа он ограничен концами строки или отличными от букв в блоке буквами. Строка называется фибоначчиевой, если при разбиении её на блоки их длины в порядке следования в строке составляют последовательность чисел Фибоначчи (\(f_0 = f_1 = 1\), \(f_i = f_{i-2} + f_{i-1}\)), начиная с нулевого члена последовательности. Строка называется полуфибоначчиевой, если хотя бы одна из перестановок её букв является фибоначчиевой строкой.»

Бурёнка решила поступать в Бурятский государственный университет, но на вступительном экзамене ей дали непростую задачу. Ей дали строку, состоящую из букв бурятского алфавита (в котором ровно \(k\) букв), и спросили, является ли данная ей строка полуфибоначчиевой. Так как строка могла быть очень длинной, ей сообщили только число вхождений каждой буквы алфавита (\(c_i\) для \(i\)-й буквы) в эту строку. К сожалению, Бурёнка уже не помнит теорию фибоначчиевых строк, поэтому без вашей помощи она не поступит в университет.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(k\) (\(1 \leq k \leq 100\)) — количество букв в алфавите.

Вторая строка каждого набора входных данных содержит \(k\) целых чисел \(c_1, c_2, \ldots, c_k\) (\(1 \leq c_i \leq 10^9\)) — число вхождений каждой из букв в строку.

Выходные данные

Для каждого набора входных данных выведите строку «YES», если соответствующая строка является полуфибоначчиевой, и «NO», если не является.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», «Yes» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных строка из одного символа является полуфибоначчиевой, являясь сама по себе фибоначчиевой строкой.

Во втором наборе входных данных строка из двух различных символов является фибоначчиевой.

В третьем наборе входных данных строка «abb» (пусть первая буква — a, вторая — b) не является полуфибоначчиевой строкой, так как все перестановки её букв («abb», «bab» и «bba») не являются фибоначчиевыми строками.

В четвёртом наборе входных данных две перестановки букв строки «abaccac» (первая буква — a, вторая — b, третья — c) являются фибоначчиевыми строками — «abaaccc» и «cbccaaa».

E. Импрессионизм

графы Конструктив математика реализация *3500

У Бурёнки есть две картины \(a\) и \(b\), представляющие собой таблицы одинакового размера \(n \times m\). Каждая клетка каждой картины имеет цвет — число от \(0\) до \(2 \cdot 10^5\), при этом ни в какой строке и никаком столбце каждой из двух картин нет повторяющихся цветов, за исключением цвета \(0\).

Бурёнка хочет получить из картины \(a\) картину \(b\). Для достижения своей цели Бурёнка может сделать одну из \(2\) операций: поменять местами две любые строки картины \(a\) или любые два её столбца. Сообщите Бурёнке, может ли она исполнить желаемое и если да, то подскажите ей последовательность действий.

Нумерация строк — от \(1\) до \(n\) сверху вниз, столбцов — от \(1\) до \(m\) слева направо.

Входные данные

В первой строке содержатся два целых числа \(n\) и \(m\) (\(1 \leq n \cdot m \leq 2 \cdot 10^5\)) — размеры картин.

В \(i\)-й из следующих \(n\) строк записаны \(m\) целых чисел \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, m}\) (\(0 \leq a_{i,j} \leq 2 \cdot 10^5\)) — цвета в \(i\)-й строке рисунка \(a\). Гарантируется, что нет одинаковых чисел в одной строке или одном столбце, за исключением числа \(0\).

В \(i\)-й из следующих \(n\) строк записаны \(m\) целых чисел \(b_{i, 1}, b_{i, 2}, \ldots, b_{i, m}\) (\(0 \leq b_{i,j} \leq 2 \cdot 10^5\)) — цвета в \(i\)-й строке рисунка \(b\). Гарантируется, что нет одинаковых чисел в одной строке или одном столбце, за исключением числа \(0\).

Выходные данные

В первой строке выведите число \(-1\), если добиться желаемого невозможно, иначе выведите число действий в вашем решении \(k\) (\(0 \le k \le 2 \cdot 10^5\)). Можно доказать, что если решение существует, то существует решение, где \(k \le 2 \cdot 10^5\).

В следующих \(k\) строках выведите операции. Сначала выведите тип операции (\(1\) — поменять местами строки, \(2\) — столбцы), а потом два номера строк или столбцов, к которым применяется операция.

Обратите внимание, что вам не нужно минимизировать число операций.

C. Турнир по борьбе

Бинарный поиск реализация Структуры данных *1400

Бурёнка пришла смотреть самое интересное спортивное событие года — турнир по борьбе, организованный её другом Тоней.

В турнире участвует \(n\) спортсменов, им были выданы номера от \(1\) до \(n\). Для спортсмена с \(i\)-м номером Бурёнка определила его силу — целое число \(a_i\), где \(1 \leq a_i \leq n\). Все силы различны, то есть массив сил \(a\) является перестановкой длины \(n\). Известно, что если \(a_i > a_j\), то \(i\)-й участник всегда побеждает \(j\)-го

Турнир проходит так: сначала все \(n\) спортсменов встают в очередь по возрастанию своих номеров, а затем происходит бесконечно много туров. В каждом туре происходит ровно один поединок между первыми двумя спортсменами из очереди. Победитель возвращается в начало очереди, а проигравший встаёт в её конец.

Бурёнка решила задать Тоне \(q\) вопросов. В каждом вопросе Бурёнка спрашивает, сколько побед \(i\)-й спортсмен одержит за первые \(k\) туров соревнования для некоторых \(i\) и \(k\). Тоня не очень хорош в аналитике, поэтому просит вас помочь ему с ответом на все вопросы.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(2 \leq n \leq 10^5\), \(1 \leq q \leq 10^5\)) — количество участников турнира и число вопросов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — массив \(a\), являющийся перестановкой.

Следующие \(q\) строк набора входных данных содержат вопросы. Каждая строка содержит два целых числа \(i\) и \(k\) (\(1 \leq i \leq n\), \(1 \leq k \leq 10^9\)) — номер участника и число туров.

Гарантируется, что сумма значений \(n\) и сумма значений \(q\) по всем наборам входных данных не превосходят \(10^5\).

Выходные данные

На каждый вопрос Бурёнки выведите единственную строку, содержащую одно целое число — ответ на вопрос.

Примечание

В первом наборе входных данных первый по номеру спортсмен имеет силу \(3\), в первом туре он победит спортсмена с номером \(2\) и силой \(1\), а во втором — спортсмена с номером \(3\) и силой \(2\).

Во втором наборе входных данных перечислим силы спортсменов, дерущихся в первых \(5\) боях: \(1\) и \(3\), \(3\) и \(4\), \(4\) и \(2\), \(4\) и \(1\), \(4\) и \(3\). Участник с номером \(4\) в первых \(5\) турах одержал \(0\) побед (его сила равна \(2\)). Участник с номером \(3\) имеет силу \(4\) и в первых двух боях одержал \(1\) победу, проведя \(1\) бой.

A. Телефонный код

*особая задача Перебор реализация *800

У Поликарпа есть n друзей в городе Тарасове. Поликарп знает телефонные номера всех друзей: это строки s1, s2, ..., sn. Все эти строки состоят только из цифр и имеют одинаковую длину.

Однажды Поликарпу понадобилось узнать телефонный код города Тарасова. Он предположил, что кодом города является наидлиннейший общий префикс всех телефонных номеров его друзей. Другими словами, это максимальная по длине строка c, которая является префиксом (началом) каждой строки si для всех i (1 ≤ i ≤ n). Помогите Поликарпу определить длину кода города.

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 3·104) — количество друзей Поликарпа. Далее следует n строк s1, s2, ..., sn — номера друзей Поликарпа. Гарантируется, что все строки состоят только из цифр и имеют одинаковую длину от 1 до 20, включительно. Также гарантируется, что все строки различны.

Выходные данные

Выведите количество цифр в искомом коде города.

Примечание

Префиксом строки t называется строка, полученная удалением нуля или более цифр из конца строки t. Например, строка «00209» имеет 6 префиксов: «» (пустой префикс), «0», «00», «002», «0020», «00209».

В первом примере кодом города является строка «00».

Во втором примере кодом города является пустая строка.

В третьем примере кодом города является строка «770123456789».

B. Период псевдослучайной последовательности

*особая задача реализация теория чисел *1200

Недавно Поликарп заинтересовался последовательностями псевдослучайных чисел. Он узнал, что во многих языках программирования такие последовательности генерируются одинаковым образом: (для i ≥ 1). Здесь a, b, m — константы, фиксированные для данной реализации генератора псевдослучайных чисел, r0 — так называемый randseed (это значение может быть установлено из программы с помощью функций вроде RandSeed(r) или srand(n)), а обозначает операцию взятия остатка от деления.

Например, если a = 2, b = 6, m = 12, r0 = 11, то генерируемая последовательность будет иметь вид: 4, 2, 10, 2, 10, 2, 10, 2, 10, 2, 10, ....

Поликарп понял, что любая такая последовательность рано или поздно зациклится, но цикл может встретиться не сразу, то есть существует предпериод и период. В примере выше длина предпериода равна 1, а периода — 2.

Ваша задача — найти период такой последовательности по заданным a, b, m и r0. Формально, необходимо найти минимальное натуральное t, для которого существует такое натуральное k, что для любого i ≥ k: ri = ri + t.

Входные данные

В единственной строке входных данных записаны через пробел четыре целых числа a, b, m и r0 (1 ≤ m ≤ 105, 0 ≤ a, b ≤ 1000, 0 ≤ r0 < m).

Выходные данные

Выведите единственное целое число — искомый период последовательности.

Примечание

Первый пример разобран выше.

Во втором примере последовательность имеет вид (начиная с первого элемента): 0, 3, 4, 1, 0, 3, 4, 1, 0, ...

В третьем примере последовательность имеет вид (начиная с первого элемента): 33, 24, 78, 78, 78, 78, ...

C. Маршрутка

*особая задача реализация сортировки *1500

Рядом с университетом находится остановка маршрутки. Пары закончились, и n студентов приходят на остановку. i-ый студент появляется на остановке в момент времени ti (все ti различны).

Будем считать, что остановка находится в точке координатной прямой x = 0, а маршрутка ходит вдоль луча Ox, то есть в сторону положительного направления координатной прямой и обратно. i-ому студенту нужно попасть в точку с координатой xi (xi > 0).

Маршрутка перемещается по следующему алгоритму. Изначально она находится в точке 0. Студенты последовательно приходят на остановку и садятся в нее. Как только в маршрутку сядет m студентов или сядет последний студент из n, она отправится в сторону положительного направления координатной прямой. Маршрутка двигается со скоростью 1 единица расстояния в 1 единицу времени, то есть за время y она проезжает расстояние y.

Каждый раз, когда маршрутка проезжает точку, в которой нужно выйти хотя бы одному студенту, она останавливается, и эти студенты выходят. На высадку студентов тратится 1 + [k / 2] единиц времени, где k — количество студентов, которые выходят в этой точке. Запись [k / 2] обозначает целую часть при делении k на 2. Как только из маршрутки выходит последний студент, она разворачивается и едет без остановок обратно в точку x = 0. Там она вновь наполняется студентами, и история повторяется.

Если студенты приходят на остановку, когда маршрутки там нет, они встают в очередь и садятся в маршрутку в том порядке, в котором они пришли. Посадка любого количества студентов и остальные действия происходит мгновенно, а других пассажиров нет.

Напишите программу, которая определит для каждого студента момент времени, когда он вышел из маршрутки. Моментом выхода студента из маршрутки считайте момент ее остановки в точке выхода студента (несмотря на то, что высадка группы студентов произойдет не мгновенно).

Входные данные

В первой строке записаны через пробел два целых числа n, m (1 ≤ n, m ≤ 105) — количество студентов и количество мест в маршрутке, соответственно. Далее в n строках описаны студенты, по одному в строке. Каждая строка содержит пару целых чисел ti, xi (1 ≤ ti ≤ 105, 1 ≤ xi ≤ 104). Строки заданы в порядке строгого возрастания ti. Значения xi могут совпадать.

Выходные данные

Выведите n чисел w1, w2, ..., wn, wi — момент времени, когда i-ый студент вышел из маршрутки. Числа выводите в одну строку и разделяйте единичными пробелами.

Примечание

В первом примере маршрутка ждет первого студента 3 единицы времени и отвозит его до места назначения за 5 единиц времени. То есть студент выходит из маршрутки в момент времени 3 + 5 = 8.

Во втором примере вместимость маршрутки равна 1, поэтому сначала она повезет одного первого студента. Этот студент — такой же, как студент в первом примере, то есть маршрутка доезжает до его места назначения в момент времени 8, тратит на высадку 1 + [1 / 2] = 1 единицу времени, и возвращается назад еще за 5 единиц времени. Таким образом, маршрутка возвращается назад в момент времени 14. К этому моменту второй студент уже подошел к остановке, поэтому он садится в маршрутку, 5 единиц времени едет до места назначения, и приезжает в момент 14 + 5 = 19.

В третьем примере маршрутка ждет четвертого студента 6 единиц времени, затем едет 5 единиц времени, затем высаживает студентов за 1 + [4 / 2] = 3 единиц времени, возвращается за 5 единиц времени, везет пятого студента 1 единицу времени.

C. Уголки

жадные алгоритмы реализация *1200

Вам дана таблица из \(n\) строк и \(m\) столбцов, в каждой клетке которой записано число \(0\) или число \(1\).

Уголком будем называть любой квадратик \(2 \times 2\) без одной угловой клетки. Вы хотите добиться того, что в таблице не останется ни одной единицы. За одну операцию вы можете выбрать любой уголок, который содержит хотя бы одну \(1\), и заменить все числа в уголке на нули.

Вам очень нравится ваша таблица, поэтому вы хотите определить, какое максимальное количество операций вы можете сделать перед тем, как в таблице останутся лишь нули.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 500\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных находятся два целых числа \(n\) и \(m\) (\(2 \leq n, m \leq 500\)) — размеры таблицы.

В каждой из следующих \(n\) строк бинарная строка длины \(m\) — описание таблицы.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превышают \(1000\).

Выходные данные

Для каждого набора входных данных выведите единственное число — искомое максимальное количество операций.

Примечание

В первом тестовом случае одним из возможных способов оптимально выполнить операции является следующий (жирным шрифтом выделяется треугольник, на котором была выполнена операция):

  • Матрица до выполнения каких либо операций:
    101
    111
    011
    110
  • Матрица после выполнения \(1\) операции:
    100
    101
    011
    110
  • Матрица после выполнения \(2\) операций:
    100
    100
    011
    110
  • Матрица после выполнения \(3\) операций:
    100
    100
    010
    110
  • Матрица после выполнения \(4\) операций:
    100
    000
    010
    110
  • Матрица после выполнения \(5\) операций:
    100
    000
    010
    100
  • Матрица после выполнения \(6\) операций:
    100
    000
    000
    100
  • Матрица после выполнения \(7\) операций:
    000
    000
    000
    100
  • Матрица после выполнения \(8\) операций:
    000
    000
    000
    000

В третьем тестовом случае из примера мы не можем выполнить ни одной операции, так как в изначальной таблице нет единиц.

В четвертом тестовом случае из примера вне зависимости от выбора первого уголка у нас всегда останется единственная единичка. Поэтому всего мы применим \(2\) операции.

E. Миша и раскраски

жадные алгоритмы Конструктив математика реализация Структуры данных *2700

Недавно Миша нашел квадратную матрицу \(n \times n\), где в клетке на пересечении строки \(i\) и столбца \(j\) записано число \(a_{i, j}\). После этого Миша решил немного изменить матрицу, чтобы количество различных чисел в ней стало ровно \(k\). Для этого он может любое число раз (возможно, ноль) применить следующую операцию:

  1. выбрать любую квадратную подматрицу (выбираются \((x_1,y_1)\), \((x_2,y_2)\), такие что \(x_1 \leq x_2\), \(y_1 \leq y_2\), \(x_2 - x_1 = y_2 - y_1\), тогда подматрицей называется множество клеток с координатами \((x, y)\), такими что \(x_1 \leq x \leq x_2\), \(y_1 \leq y \leq y_2\)),
  2. выбрать число \(k\), где \(1 \leq k \leq n^2\),
  3. заменить все числа в выбранной подматрице на \(k\).

Пожалуйста, найдите минимальное количество операций, которые нужны, чтобы Миша достиг своей цели.

Входные данные

В первой строке находятся числа \(n\) и \(k\) (\(1 \leq n \leq 500, 1 \leq k \leq n^2\))— размер матрицы и требуемое количество различных чисел .

Далее следуют \(n\) строк. \(i\)-я из них содержит \(n\) целых чисел \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, n}\) (\(1 \leq a_{i,j} \leq n^2\)) — элементы \(i\)-й строки матрицы.

Выходные данные

Выведите одно число — искомое минимальное число операций.

Примечание

В первом примере ответ \(1\), так как можно заменить число в правом нижнем углу таблички на \(1\). Получится такая матрица:

111
112
341

Во втором примере ответ \(2\). Можно сначала заменить все значения матрицы на \(1\), а потом заменить число в любой клетке на \(2\). Получится такая матрица:

111
111
112

A. Изображение

жадные алгоритмы реализация *800

У вас есть файл с изображением размера \(2 \times 2\), состоящего из \(4\) пикселей. Каждый пиксель может иметь один из \(26\) различных цветов, обозначаемых строчными буквами латинского алфавита.

Вы хотите перекрасить некоторые пиксели изображения таким образом, чтобы все \(4\) пикселя имели одинаковый цвет. За один ход вы можете выбрать не более двух пикселей одного цвета и покрасить их в какой-то другой цвет (если вы выбираете какие-то два пикселя, они должны быть покрашены в один и тот же цвет).

Чему равно минимальное количество ходов, которое вам необходимо сделать, чтобы достичь цели?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов тестовых данных.

Каждый набор тестовых данных состоит из двух строк. Каждая из этих строк содержит две строчные буквы латинского алфавита без каких-либо разделителей, обозначающих ряд пикселей в изображении.

Выходные данные

Для каждого набора тестовых данных выведите одно число — минимальное количество ходов, необходимое для того, чтобы все \(4\) пикселя изображения имели одинаковый цвет.

Примечание

Давайте проанализируем наборы тестовых данных из примера.

В первом наборе вы можете покрасить левый нижний пиксель и правый верхний пиксель (которые имеют одинаковый цвет) в цвет r, таким образом все пиксели будут иметь этот цвет.

Во втором наборе тестовых данных достаточно двух ходов:

  • покрасить оба верхних пикселя, которые имеют одинаковый цвет c, в цвет b;
  • покрасить левый нижний пиксель в цвет b.

В третьем наборе тестовых данных все пиксели уже имеют одинаковый цвет.

В четвертом наборе тестовых данных вы можете оставить один любой пиксель неизменным и покрасить три остальных пикселя в его цвет за три хода.

В пятом наборе тестовых данных вы можете покрасить оба верхних пикселя в цвет x.

B. Смертоносный лазер

реализация *1000

Робот стоит в левом верхнем углу поля, состоящего из \(n\) строк и \(m\) столбцов, в клетке \((1, 1)\).

За один шаг он может перейти в клетку, соседнюю по стороне с текущей:

  • \((x, y) \rightarrow (x, y + 1)\);
  • \((x, y) \rightarrow (x + 1, y)\);
  • \((x, y) \rightarrow (x, y - 1)\);
  • \((x, y) \rightarrow (x - 1, y)\).

Робот не может выйти за пределы поля.

В клетке \((s_x, s_y)\) находится смертоносный лазер. Если робот встает в клетку на расстоянии меньше или равном \(d\) к лазеру, то его испепеляет. Расстояния между двумя клетками \((x_1, y_1)\) и \((x_2, y_2)\) равно \(|x_1 - x_2| + |y_1 - y_2|\).

Выведите наименьшее количество шагов, которые может сделать робот, чтобы дойти до клетки \((n, m)\), не испепелившись и не выходя за пределы поля. Если невозможно достичь клетки \((n, m)\), то выведите -1.

Лазер не находится ни в начальной, ни в конечной клетке. Начальная клетка всегда находится на расстоянии больше \(d\) от лазера.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В единственной строке каждого набора входных данных записаны пять целых чисел \(n, m, s_x, s_y, d\) (\(2 \le n, m \le 1000\); \(1 \le s_x \le n\); \(1 \le s_y \le m\); \(0 \le d \le n + m\)) — размер поля, клетка с лазером и испепеляющее расстояние лазера.

Лазер не находится ни в начальной, ни в конечной клетке (\((s_x, s_y) \neq (1, 1)\) и \((s_x, s_y) \neq (n, m)\)). Начальная клетка \((1, 1)\) всегда находится на расстоянии больше \(d\) от лазера (\(|s_x - 1| + |s_y - 1| > d\)).

Выходные данные

На каждый набор входных данных выведите одно целое число. Если возможно достичь \((n, m)\) из \((1, 1)\), не испепелившись и не выходя за пределы поля, то выведите наименьшее количество шагов, которые может сделать робот, чтобы ее достичь. Иначе выведите -1.

A. Проверка правописания

реализация *800

Тимуру очень нравится его имя. В качестве написания его имени он допускает любую перестановку букв строки Timur. Например, следующие строки — это корректные способы написания его имени: Timur, miurT, Trumi, mriTu. Обратите внимание, что написание содержит прописную букву T, а остальные буквы должны быть строчными.

Сегодня в качестве имени он написал строку \(s\) длины \(n\), которая состоит из прописных и строчных букв латинского алфавита. Он попросил вас проверить, является ли строка \(s\) правильным написанием его имени.

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) \((1 \leq n \leq 10)\) — длину заданной строки \(s\).

Вторая строка содержит \(s\), которая состоит только из прописных и строчных букв латинского алфавита.

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если строка \(s\) удовлетворяет условию, или «NO» (без кавычек), если нет.

Вы можете выводить ответ в любом регистре (например, вывод «yEs», «yes», «Yes» и «YES» всё ещё будет считаться корректным).

B. Дальтонизм

реализация *800

У Васи есть прямоугольное поле, которое состоит из \(2\) строк и \(n\) столбцов. Каждая ячейка имеет цвет: красный, зелёный или синий.

У Васи дальтонизм и он не отличает зелёный цвет от синего. Определите, одинаково ли Вася видит первую и вторую строку поля?

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее заданы описания наборов.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 100\)) — количество столбцов в заданном прямоугольном поле.

Следующие две строки содержат по \(n\) символов каждая: R, G или B, которые обозначают красный цвет, зелёный цвет или синий цвет соответственно — описание поля.

Выходные данные

Для каждого набора входных данных выведите «YES», если Вася видит две строки одинаково, или выведите «NO», если это не так.

Вы можете выводить ответ в любом регистре (например, вывод «yEs», «yes», «Yes» и «YES» всё ещё будет считаться корректным).

Примечание

В первом наборе входных данных примера Вася видит вторую клетку каждой строки одинаково, потому что вторая клетка первой строки зеленая, а вторая клетка второй строки синяя, эти два цвета он не различает. Остальные же клетки имеют одинаковый цвет. Таким образом, Вася видит эти строки одинаковыми.

Во втором наборе входных данных примера Вася видит две строки различными.

В третьем наборе входных данных каждый символ поля либо зелёный, либо синий. Таким образом, Вася видит строки одинаково.

C. Игра в слова

реализация Структуры данных *800

Три друга играют в игру. Каждый из них пишет \(n\) различных слов, каждое длины \(3\).

После этого они считают очки по следующим правилам:

  • если слово написано только одним игроком, то тот, кто его написал, получает 3 очка;
  • если слово написано двумя игроками, то каждый из них получает по 1 очку;
  • если слово написано всеми тремя игроками, то за него очки не начисляются.

Выведите финальное количество очков у каждого игрока.

Входные данные

В первой строке записано целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит целое число \(n\) (\(1 \leq n \leq 1000\)) — количество слов, написанных каждым игроком.

Следующие три строки содержат по \(n\) различных слов каждая — слова написанные каждым из игроков. Все эти слова состоят из \(3\) строчных букв латинского алфавита.

Выходные данные

Для каждого набора входных данных выведите через пробел три целых числа — количество очков у первого, второго и третьего из друзей. Выводите очки именно в таком порядке — \(i\)-м выводите количество очков у \(i\)-го из друзей.

Примечание

В первом наборе входных данных примера:

  • слово \(\texttt{abc}\) было написано первым и третьим другом — они получают по \(1\) очку;
  • слово \(\texttt{def}\) было написано только вторым другом — он получает \(3\) очка.

E. Считаем прямоугольники

дп Перебор реализация Структуры данных *1600

У вас есть \(n\) прямоугольников, \(i\)-й из них имеет высоту \(h_i\) и ширину \(w_i\).

Вам надо ответить на \(q\) запросов, которые задаются четырьмя числами: \(h_s \ w_s \ h_b \ w_b\).

Для каждого запроса выведите суммарную площадь всех таких прямоугольников, которые могут вместить в себя прямоугольник с высотой \(h_s\) и шириной \(w_s\) и при этом сами вмещаются в прямоугольник с высотой \(h_b\) и шириной \(w_b\). Иными словами, выведите \(\sum h_i \cdot w_i\) по всем \(i\), что \(h_s < h_i < h_b\) и \(w_s < w_i < w_b\).

Обратите внимание, что если у прямоугольников одинаковая ширина или высота, то ни один из них не может вместить в себя другой. Также обратите внимание, что вы не можете вращать прямоугольники.

Обратите внимание, что для некоторых наборов входных данных ответ не будет помещаться в 32-х битных целочисленный тип, вы должны использовать 64-битный целочисленный тип вашего языка (например, long long в C++).

Входные данные

В первой строке входных данных записано целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n, q\) (\(1 \leq n \leq 10^5\); \(1 \leq q \leq 10^5\)) — количество прямоугольников и количество запросов.

Затем следуют \(n\) строк, каждая содержит два целых числа \(h_i, w_i\) (\(1 \leq h_i, w_i \leq 1000\)) — высоту и ширину \(i\)-го прямоугольника.

Затем в \(q\) строках заданы запросы, каждая строка содержит четыре целых числа \(h_s, w_s, h_b, w_b\) (\(1 \leq h_s < h_b,\ w_s < w_b \leq 1000\)) — описание запроса.

Сумма значений \(q\) по всем набора входных данных не превосходит \(10^5\). Сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) строк, \(i\)-я должна содержать ответ на \(i\)-й запрос.

Примечание

В первом наборе входных данных только один запрос. Нам надо найти сумму площадей всех прямоугольников, которые вмещают прямоугольник \(1 \times 1\) и сами вмещаются в прямоугольник \(3 \times 4\).

Нам подходит только прямоугольник \(2 \times 3\), так как \(1 < 2\) (сравниваем высоты) и \(1 < 3\) (сравниваем ширины), то \(1 \times 1\) помещается в него. Аналогично, \(2 < 3\) (сравниваем высоты) и \(3 < 4\) (сравниваем ширины), то есть он помещается в \(3 \times 4\).

Прямоугольник \(3 \times 2\) слишком высок, чтобы поместиться в \(3 \times 4\) rectangle.

Суммарная площадь в ответа равна \(2 \cdot 3 = 6\).

F. L-фигуры

поиск в глубину и подобное реализация *1700

L-фигура это фигура на клетчатой бумаге, выглядящая как одна из четырех первых фигур на картинке ниже. L-фигура содержит ровно три закрашенных клетки (обозначаемых как *), которые могут быть повернуты в любую сторону.

Вам дана прямоугольная сетка из клеток. Определите, содержит ли она только L-фигуры, которые не соприкасаются друг с другом ни одним углом и ни одной стороной. Более формально:

  • Каждая закрашенная клетка в сетке является частью ровно одной L-фигуры и
  • нет двух L-фигур, которые бы соприкасались углом или стороной.

Например, последние две сетки на картинке выше не удовлетворяют требованиям, потому что есть две L-фигуры, соприкасающихся углами и стороной соответственно.

Входные данные

Входные данные состоят из множества тестовых случаев. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество тестовых случаев. Затем следуют описания тестовых случаев.

Первая строка каждого тестового случая содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 50\)) — количество строк и столбцов в сетке соответственно.

Затем следуют \(n\) строк, содержащих \(m\) символов. Каждый символ это либо «.», либо «*» — пустая или закрашенная клетка соответственно.

Выходные данные

Для каждого тестового случая выведите «YES» если сетка состоит только из L-фигур, не касающихся друг друга углами или сторонами, иначе «NO».

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» and «YES» будут считаться за положительный ответ).

H. Mainak и кровоточащий многоугольник

Бинарный поиск геометрия математика реализация *3500

У Mainak есть выпуклый многоугольник \(\mathcal P\) с \(n\) вершинами, пронумерованными как \(A_1, A_2, \ldots, A_n\) против часовой стрелки. Координаты \(i\)-й точки \(A_i\) даны как \((x_i, y_i)\), где \(x_i\) и \(y_i\) являются целыми числами.

Кроме того, известно, что внутренний угол при \(A_i\) является либо прямым углом, либо правильным тупым углом. Формально, известно, что:

  • \(90 ^ \circ \le \angle A_{i - 1}A_{i}A_{i + 1} < 180 ^ \circ\), \(\forall i \in \{1, 2, \ldots, n\}\), где мы условно считаем \(A_0 = A_n\) и \(A_{n + 1} = A_1\).

Друг Mainak настаивал на том, чтобы все точки \(Q\) такие, что существует хорда многоугольника \(\mathcal P\), проходящая через \(Q\), длины не больше \(1\), должны быть покрашены в \(\color{red}{\text{красный}}\).

Mainak хочет, чтобы вы нашли площадь цветной области, образованной \(\color{red}{\text{красными}}\) точками.

Формально, определите площадь области \(\mathcal S = \{Q \in \mathcal{P}\) | \(Q \text{ покрашено в } \color{red}{\text{красный}}\}\).

Напомним, что хордой многоугольника называется отрезок между двумя точками, лежащими на границе (т.е. вершинами или точками на сторонах) многоугольника.

Входные данные

Первая строка содержит целое число \(n\) (\(4 \le n \le 5000\)) — количество вершин многоугольника \(\mathcal P\).

\(i\)-я из следующих \(n\) строк содержит два целых числа \(x_i\) и \(y_i\) (\(-10^9 \le x_i, y_i \le 10^9\)) — координаты точки \(A_i\).

Гарантируется, что вершины образуют выпуклый многоугольник и перечислены в порядке против часовой стрелки. Также гарантируется, что все внутренние углы лежат в полуинтервале \([90 ^ \circ; 180 ^ \circ)\).

Выходные данные

Выведите площадь многоугольника, покрашенную в \(\color{red}{\text{красный}}\).

Ваш ответ будет считаться правильным, если его абсолютная или относительная погрешность не превосходит \(10^{-4}\).

Формально, пусть ваш ответ равен \(a\), и ответ жюри равен \(b\). Ваш ответ будет принят тогда и только тогда, когда \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-4}\).

Примечание

В первом примере многоугольник \(\mathcal P\) можно представить на декартовой плоскости как:

A. Разноцветные шары: перезагрузка

жадные алгоритмы Перебор реализация сортировки *800

Название — это отсылка на самый первый Educational Round нашего авторского коллектива, Educational Round 18.

Есть мешок, в котором лежат разноцветные шары. Всего есть \(n\) различных цветов шаров, пронумерованные от \(1\) до \(n\). В мешке лежат \(\mathit{cnt}_i\) шаров цвета \(i\). Суммарное количество шаров в мешке нечетное (т. е. \(\mathit{cnt}_1 + \mathit{cnt}_2 + \dots + \mathit{cnt}_n\) нечетное).

За один ход можно выбрать два шара разных цветов и вынуть их из мешка.

В какой-то момент все оставшиеся в мешке шары станут одного цвета. Тогда вы больше не можете делать ходы.

Найдите любой возможный цвет оставшихся шаров.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 20\)) — количество цветов.

Во второй строке записаны \(n\) целых чисел \(\mathit{cnt}_1, \mathit{cnt}_2, \dots, \mathit{cnt}_n\) (\(1 \le \mathit{cnt}_i \le 100\)) — количество шаров каждого цвета в мешке.

Суммарное количество шаров в мешке нечетное (т. е. \(\mathit{cnt}_1 + \mathit{cnt}_2 + \dots + \mathit{cnt}_n\) нечетное).

Выходные данные

На каждый набор входных данных выведите одно целое число — любой возможный цвет оставшихся шаров после того как вы сделали какие-либо ходы и больше не можете делать ходы.

Примечание

В первом наборе входных данных ваш первый и единственный ход может быть одним из следующих:

  • возьмем шары с цветами \(1\) и \(2\);
  • возьмем шары с цветами \(1\) и \(3\);
  • возьмем шары с цветами \(2\) и \(3\).

После хода останется ровно один шар. Его цвет может быть \(3, 2\) или \(1\) в зависимости от хода.

Во втором наборе не получится сделать ход вообще — есть всего один цвет шаров. Этот цвет \(1\).

В третьем примере можно удалять один шар цвета \(1\) и один шар цвета \(2\), пока не закончатся шары цвета \(1\). В конце останутся три шара цвета \(2\).

A. Шишки

математика реализация *1300

Никифор и Поликарп играют в игру камень-ножницы-бумага на щелбаны.

Напомним вам правила этой игры. В игру камень-ножницы-бумага играют двое. В каждом раунде игроки независимо друг от друга выбирают один из трех знаков, который изображают при помощи кисти руки: камень, ножницы или бумагу. Победитель определяется по следующим правилам: камень побеждает ножницы, ножницы побеждают бумагу, а бумага побеждает камень. Если игроки выбрали одинаковые знаки, то в данном раунде объявляется ничья.

Никифор и Поликарп уже сыграли ровно n раундов. При этом в каждом из раундов победитель щелкал по лбу проигравшему противнику, от чего у того на лбу появлялась шишка. В случае ничейного раунда игроки ничего не делали и продолжали играть дальше.

Оказалось, что Никифор действовал по следующей стратегии: перед началом игры он выбрал себе некоторую последовательность знаков A = (a1, a2, ..., am), после чего циклически показывал знаки из этой последовательности, начиная с первого из них. Циклически означает, что Никифор показывает знаки в следующем порядке a1, a2, ..., am, a1, a2, ..., am, a1, ... и так далее. Поликарп действовал по аналогичной стратегии, только, в качестве последовательности для выбора знаков, он выбрал свою последовательность B = (b1, b2, ..., bk).

Определите количество шишек на лбах обоих игроков после n раундов игры. Можно считать, что в начале игры шишек на лбах игроков не было.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 2·109) — количество раундов игры.

Во второй строке записана последовательность A в виде строки из m символов, а в третьей — последовательность B в виде строки из k символов (1 ≤ m, k ≤ 1000). Заданные строки состоят только из символов «R», «S» и «P». Символ «R» (от английского rock) означает знак камня, символ «S» (scissors) — ножниц, «P» (paper) — бумаги.

Выходные данные

Выведите два целых числа, разделяя их пробелом — количество шишек на лбу Никифора и количество шишек на лбу Поликарпа.

Примечание

В первом примере игра шла следующим образом:

  • R - R. Ничья.
  • P - S. Никифор проигрывает.
  • S - P. Поликарп проигрывает.
  • R - P. Никифор проигрывает.
  • P - R. Поликарп проигрывает.
  • S - S. Ничья.
  • R - P. Никифор проигрывает.

Итого у Никифора 3 поражения (3 шишки), а у Поликарпа только 2.

D. Наместничество

графы жадные алгоритмы Конструктив реализация *2500

В Троичном королевстве ровно n = 3k городов. Все они расположены на побережье реки Триссисипи, которая протекает через все королевство. Некоторые из городов расположены по одну сторону реки, а все остальные — по другую.

Между некоторыми городами построены мосты. Каждый мост соединяет два города, расположенные по разные стороны реки. Между любыми двумя городами имеется не более одного моста.

Недавно взошедший на престол король Тристан Третий занят распределением своих наместников между городами. Всего имеется k наместников и король хочет поручить каждому из них управлять ровно тремя городами. Однако никакому из наместников нельзя поручать управление городами, которые соединены мостом — ради своей выгоды наместник может установить слишком высокую пошлину на проезд по мосту, что плохо скажется на репутации короля.

Помогите королю Тристану Третьему распределить наместников между городами, если это возможно.

Входные данные

В первой строке даны два целых числа n и m — количество городов и мостов (3 ≤ n < 105, n = 3k, 0 ≤ m ≤ 105). В следующих m строках описаны мосты. i-ая строка содержит два целых числа ai и bi — номера городов, которые соединяет i-ый мост (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ i ≤ m).

Гарантируется, что никакой мост не соединяет город сам с собой, а также, что между любыми двумя городами не более одного моста.

Выходные данные

Если нужным образом распределить наместников нельзя, то в единственной строке выведите «NO» (без кавычек).

Иначе в первой строке выведите «YES» (без кавычек), а во второй — какой наместник должен управлять каждым из городов. i-ое число должно означать номер наместника (от 1 до k), который должен управлять i-ым городом из входных данных — всего n чисел.

Если возможных решений несколько — выведите любое.

B. Собрание на прямой

Бинарный поиск геометрия жадные алгоритмы математика реализация Тернарный поиск *1600

\(n\) людей живут на координатной прямой, \(i\)-й человек живет в точке \(x_i\) (\(1 \le i \le n\)). Они хотят выбрать точку \(x_0\) для встречи. \(i\)-й человек потратит \(|x_i - x_0|\) минут, чтобы добраться до места встречи. Также \(i\)-му человеку требуется \(t_i\) минут чтобы одеться, поэтому суммарно ему нужно \(t_i + |x_i - x_0|\) минут чтобы добраться до места встречи.

Здесь \(|y|\) обозначает модуль числа \(y\).

Эти люди просят вас выбрать позицию \(x_0\), которая минимизирует время, через которое все \(n\) людей доберутся до места встречи.

Входные данные

В первой строке задано единственное целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Затем следуют сами наборы входных данных.

Каждый набор входных данных состоит из трех строк.

В первой строке задано единственное целое число \(n\) (\(1 \le n \le 10^5\)) — количество людей.

Во второй строке заданы \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(0 \le x_i \le 10^{8}\)) — позиции людей.

В третьей строке заданы \(n\) целых чисел \(t_1, t_2, \dots, t_n\) (\(0 \le t_i \le 10^{8}\)), где \(t_i\) это время, которое нужно \(i\)-му человеку, чтобы одеться.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное вещественное число — оптимальная позиция \(x_0\). Можно показать, что существует единственная оптимальная позиция \(x_0\).

Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не превосходит \(10^{−6}\). Формально, пусть ваш ответ равен \(a\), а ответ жюри равен \(b\). Ваш ответ будет зачтен, если \(\frac{|a−b|}{max(1,|b|)} \le 10^{−6}\).

Примечание
  • В \(1\)-м наборе входных данных есть только один человек, поэтому целесообразно выбрать место встречи в его позиции. Тогда он доберется до него за \(3\) минуты, которые нужны ему, чтобы одеться.
  • Во \(2\)-м наборе входных данных есть \(2\) человека, которым не нужно время, чтобы одеться. Чтобы добраться до позиции \(2\), каждому из них потребуется по одной минуте.
  • В \(5\)-м наборе входных данных \(1\)-му человеку нужно \(4\) минуты, чтобы добраться до позиции \(1\) (\(4\) минуты, чтобы одеться, и \(0\) минут на сам путь); \(2\)-му человеку нужно \(2\) минуты, чтобы добраться до позиции \(1\) (\(1\) минута, чтобы одеться, и \(1\) минута на сам путь); \(3\)-му человеку нужно \(4\) минуты, чтобы добраться до позиции \(1\) (\(2\) минуты, чтобы одеться, и \(2\) минуты на сам путь).

A. Bestie

Комбинаторика Конструктив математика Перебор реализация теория чисел *1000

Вам дан массив \(a\), состоящий из \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Друзья попросили вас сделать наибольший общий делитель (НОД) всех элементов массива равным \(1\). За одну операцию вы можете сделать следующее:

  • Выбрать произвольный индекс в массиве \(1 \leq i \leq n\);
  • Сделать \(a_i = \gcd(a_i, i)\), где \(\gcd(x, y)\) обозначает НОД чисел \(x\) и \(y\). Стоимость такой операции равна \(n - i + 1\).

Вам нужно найти минимальную суммарную стоимость операций, которые нужно сделать, чтобы НОД всех элементов массива стал равен \(1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 5\,000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \leq n \leq 20\)) — длину массива.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — элементы массива.

Выходные данные

Для каждого набора входных данных выведите единственное целое число — минимальную суммарную стоимость операций, которые нужно сделать, чтобы НОД всех элементов массива стал равен \(1\).

Можно показать, что это всегда можно сделать.

Примечание

В первом наборе входных данных НОД всего массива уже равен \(1\), поэтому операции применять не нужно.

Во втором наборе входных данных можно выбрать \(i = 1\). После этой операции \(a_1 = \gcd(2, 1) = 1\). Стоимость этой операции равна \(1\).

В третьем наборе входных данных можно выбрать \(i = 1\), после этого массив \(a\) будет равен \([1, 4]\). НОД этого массива равен \(1\), а суммарная стоимость равна \(2\).

В четвертом наборе входных данных можно выбрать \(i = 2\), после этого массив \(a\) будет равен \([3, 2, 9]\). НОД этого массива равен \(1\), а суммарная стоимость равна \(2\).

В шестом наборе входных данных можно выбрать \(i = 4\) и \(i = 5\), после этого массив \(a\) будет равен \([120, 60, 80, 4, 5]\). НОД этого массива равен \(1\), а суммарная стоимость равна \(3\).

B. Угу

дп жадные алгоритмы Перебор реализация *900

Бинарной строкой называется строка, состоящая только из символов 0 и 1. Вам дана бинарная строка \(s_1 s_2 \ldots s_n\). Нужно сделать эту строку неубывающей за наименьшее количество операций. Иными словами, каждый символ должен быть не меньше предыдущего. За одну операцию вы можете сделать следующее:

  • Выбрать произвольный индекс в строке \(1 \leq i \leq n\);
  • Для всех \(j \geq i\) поменять значение в \(j\)-й позиции на противоположное, то есть если \(s_j = 1\), то сделать \(s_j = 0\), и наоборот.

За какое минимальное количество операций можно сделать строку неубывающей?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \leq n \leq 10^5\)) — длину строки.

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — минимальное количество операций, которое потребуется сделать, чтобы сделать строку неубывающей.

Примечание

В первом наборе входных данных строка уже неубывающая.

Во втором наборе входных данных можно выбрать \(i = 1\), и после этого \(s = \mathtt{01}\).

В третьем наборе входных данных можно выбрать \(i = 1\) и получить \(s = \mathtt{010}\), а после этого выбрать \(i = 2\). В результате получим \(s = \mathtt{001}\), то есть неубывающую строку.

В шестом наборе входных данных можно на первой итерации выбрать \(i = 5\) и получить \(s = \mathtt{100001}\). Затем выбрать \(i = 2\), тогда \(s = \mathtt{111110}\). Дальше выбираем \(i = 1\), и получаем неубывающую строку \(s = \mathtt{000001}\).

C2. Шейх (сложная версия)

Бинарный поиск битмаски жадные алгоритмы Перебор реализация *2100

Это сложная версия задачи. Единственное различие состоит в том, что в этой версии \(q = n\).

Вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\).

Стоимостью подотрезка массива \([l, r]\), \(1 \leq l \leq r \leq n\), назовем величину \(f(l, r) = \operatorname{sum}(l, r) - \operatorname{xor}(l, r)\), где \(\operatorname{sum}(l, r) = a_l + a_{l+1} + \ldots + a_r\), а \(\operatorname{xor}(l, r) = a_l \oplus a_{l+1} \oplus \ldots \oplus a_r\) (\(\oplus\) обозначает побитовое исключающее ИЛИ).

У вас будет \(q\) запросов. Каждый запрос задается парой чисел \(L_i\), \(R_i\), где \(1 \leq L_i \leq R_i \leq n\). Вам нужно найти подотрезок \([l, r]\), \(L_i \leq l \leq r \leq R_i\) с максимальным значением \(f(l, r)\). Если ответов несколько, то среди них нужно найти подотрезок с минимальной длиной, то есть минимальным значением \(r - l + 1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1 \leq n \leq 10^5\), \(q = n\)) — длину массива и количество запросов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^9\)) — элементы массива.

\(i\)-я из следующих \(q\) строк каждого набора входных данных содержит два целых числа \(L_i\) и \(R_i\) (\(1 \leq L_i \leq R_i \leq n\)) — границы, в которых нужно найти отрезок.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Гарантируется, что \(L_1 = 1\) и \(R_1 = n\).

Выходные данные

Для каждого набора входных данных выведите \(q\) пар чисел \(L_i \leq l \leq r \leq R_i\), таких что значение \(f(l, r)\) максимально, а среди таких длина \(r - l + 1\) минимальна. Если существует несколько правильных ответов, выведите любой из них.

Примечание

Во всех наборах входных данных рассматривается первый запрос.

В первом наборе входных данных \(f(1, 1) = 0 - 0 = 0\).

Во втором наборе входных данных \(f(1, 1) = 5 - 5 = 0\), \(f(2, 2) = 10 - 10 = 0\). Заметим, что \(f(1, 2) = (10 + 5) - (10 \oplus 5) = 0\), но нам среди максимальных значений \(f(l, r)\) нужно найти подотрезок с минимальной длиной. Поэтому правильными ответами будут только отрезки \([1, 1]\) и \([2, 2]\).

В четвертом наборе входных данных \(f(2, 3) = (12 + 8) - (12 \oplus 8) = 16\).

В пятом наборе входных данных есть два правильных ответа, так как \(f(2, 3) = f(3, 4)\) и их длины равны.

D1. Баланс (простая версия)

Перебор реализация Структуры данных теория чисел *1500

Это простая версия задачи. Единственное различие состоит в том, что в этой версии нет запросов удаления.

Изначально у вас есть множество, содержащее единственный элемент — \(0\). Вам нужно обработать \(q\) запросов следующих видов:

  • + \(x\) — добавить целое число \(x\) в множество. Гарантируется, что это число не принадлежит множеству до этого запроса;
  • ? \(k\) — найти \(k\text{-mex}\) множества.

В нашей задаче мы определяем \(k\text{-mex}\) множества целых чисел как наименьшее неотрицательное целое число \(x\), которое делится на \(k\) и которого нет в множестве.

Входные данные

В первой строке находится целое число \(q\) (\(1 \leq q \leq 2 \cdot 10^5\)) — количество запросов.

В следующих \(q\) строках находится описание запросов.

Запрос добавления числа \(x\) описывается как + \(x\) (\(1 \leq x \leq 10^{18}\)). Гарантируется, что число \(x\) не принадлежит множеству.

Запрос нахождения \(k\text{-mex}\) описывается как ? \(k\) (\(1 \leq k \leq 10^{18}\)).

Гарантируется, что хотя бы один запрос имеет тип ?.

Выходные данные

Для каждого запроса типа ? выведите единственное целое число — \(k\text{-mex}\) множества.

Примечание

В первом примере:

После первого и второго запроса в множестве будут элементы \(\{0, 1, 2\}\). Наименьшее неотрицательное число, которое делится на \(1\) и которого нет в множества, равно \(3\).

После четвертого запроса в множестве будут элементы \(\{0, 1, 2, 4\}\). Наименьшее неотрицательное число, которое делится на \(2\) и которого нет в множества, равно \(6\).

Во втором примере:

  • Изначально множество содержит только элемент \(\{0\}\).
  • После добавления числа \(100\) множество содержит элементы \(\{0, 100\}\).
  • \(100\text{-mex}\) множества равен \(200\).
  • После добавления числа \(200\) множество содержит элементы \(\{0, 100, 200\}\).
  • \(100\text{-mex}\) множества равен \(300\).
  • После добавления числа \(50\) множество содержит элементы \(\{0, 50, 100, 200\}\).
  • \(50\text{-mex}\) множества равен \(150\).

C. Сдвиг по фазе

графы жадные алгоритмы поиск в глубину и подобное реализация снм Строки *1400

Была строка \(s\), которую захотели зашифровать. Для этого взяли все \(26\) строчных латинских букв, расположили их в некотором порядке по кругу, после чего заменили каждую букву в \(s\) на ту, что является следующей по часовой стрелке, получив таким образом строку \(t\).

Вам дали строку \(t\). Определите лексикографически минимальную строку \(s\), из которой могла быть получена данная строка \(t\).

Строка \(a\) лексикографически меньше строки \(b\) такой же длины, если и только если:

  • в первой позиции, где \(a\) и \(b\) различны, в строке \(a\) находится буква, которая встречается в алфавите раньше, чем соответствующая буква в \(b\).
Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1 \le t \le 3 \cdot 10^4\)) — количество наборов входных данных. Описание наборов входных данных следует ниже.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — длину строки \(t\).

Следующая строка содержит строку \(t\) длины \(n\), состоящую из строчных букв латинского алфавита.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку — лексикографически минимальную строку \(s\), из которой могла получиться \(t\).

Примечание

В первом наборе входных данных мы не могли иметь строку «a», поскольку тогда буква a переходила бы сама в себя, что невозможно. В качестве ответа нам подходит лексикографически вторая строка «b».

Во втором наборе нам не подходит «aa», поскольку a переходила бы в себя, и не подходит «ab», поскольку круг переходов замкнулся бы на \(2\) буквах, а он должен состоять из всех \(26\). Следующая строка «ac» нам подходит.

Ниже приведены схемы для первых трех наборов входных данных. В круге пропущены неучаствующие буквы, их можно расставить произвольно в пропуски.

D. Одинаковые бинарные подпоследовательности

геометрия жадные алгоритмы Конструктив реализация Строки *2200

У Эврула есть бинарная строка \(s\) длины \(2n\). Бинарная строка — это строка, состоящая только из символов \(0\) и \(1\). Он хочет разбить \(s\) на две непересекающиеся одинаковые подпоследовательности. Для этого ему нужна ваша помощь.

Вы можете выполнить следующую операцию один раз.

  • Выберите любую подпоследовательность (возможно пустую) символов \(s\) и циклически сдвиньте ее направо на одну позицию.

Другими словами, выберите последовательность индексов \(b_1, b_2, \ldots, b_m\), где \(1 \le b_1 < b_2 < \ldots < b_m \le 2n\). После этого одновременно присвойте \(\)s_{b_1} := s_{b_m},\(\) \(\)s_{b_2} := s_{b_1},\(\) \(\)\ldots,\(\) \(\)s_{b_m} := s_{b_{m-1}}.\(\)

Можете ли вы разбить \(s\) на две непересекающиеся одинаковые подпоследовательности после того, как выполните указанную операцию ровно один раз?

Разбиением \(s\) на две непересекающиеся одинаковые подпоследовательности \(s^p\) и \(s^q\) называются два возрастающих массива индексов \(p_1, p_2, \ldots, p_n\) и \(q_1, q_2, \ldots, q_n\) такие, что каждое целое число от \(1\) до \(2n\) встречается \(p\) и \(q\) ровно один раз, при этом \(s^p = s_{p_1} s_{p_2} \ldots s_{p_n}\), \(s^q = s_{q_1} s_{q_2} \ldots s_{q_n}\), и \(s^p = s^q\).

Если невозможно выполнить операцию и разбиение, выведите \(-1\). Если можно выполнить операцию и разбить \(s\) на две непересекающиеся подпоследовательности \(s^p\) и \(s^q\) так, чтобы \(s^p = s^q\), выведите индексы подпоследовательности \(b\) и индексы \(s^p\), т. е. значения \(p_1, p_2, \ldots, p_n\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)), где \(2n\) — длина строки.

Вторая строка содержит бинарную строку \(s\) длины \(2n\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных следуйте следующему формату.

Если решения не существует, выведите \(-1\).

Иначе:

  • В первой строке выведите целое число \(m\) (\(0 \leq m \leq 2n\)) и затем \(m\) различных индексов в возрастающем порядке \(b_1\), \(b_2\), ..., \(b_m\).
  • Во второй строке выведите \(n\) различных индексов в возрастающем порядке \(p_1\), \(p_2\), ..., \(p_n\).

Если существуют несколько решений, выведите любое из них.

Примечание

В первом примере \(b\) пустая, поэтому строка \(s\) не меняется. Выберем \(s^p = s_1 s_2 = \mathtt{10}\), тогда \(s^q = s_3s_4 = \mathtt{10}\).

Во втором примере \(b=[3,5]\). Изначально \(s_3=\mathtt{0}\), и \(s_5=\mathtt{1}\). После выполнения операции мы одновременно присваиваем \(s_3=\mathtt{1}\) и \(s_5=\mathtt{0}\).

Поэтому \(s\) становится 101000 после выполнения операции.

Возьмем символы на позициях \([1,2,5]\) в \(s^p\), получим \(s_1=\mathtt{100}\). Символы на позициях \([3,4,6]\) будут в \(s^q\), получим \(s^q=100\). Это решение, потому что \(s^p=s^q\).

В четвертом примере можно показать, что невозможно выполнить разбиение строки после любой операции.

A. Эла распределяет книги

жадные алгоритмы реализация Строки *900

Эла очень любит читать, как и ее новые коллеги по DTL! В первый же день её работы в DTL коллега попросил её распределить книги по отсекам на книжной полке.

\(n\) книг должны быть распределены по \(k\) отсекам на книжной полке (\(n\) нацело делится на \(k\)). Каждой книге можно сопоставить одну строчную латинскую букву от 'a' до 'y' включительно, которая является начальной буквой в названии книги.

Эла должна положить ровно \(\frac{n}{k}\) книг в каждый отсек. Отсеки пронумерованы от \(1\) до \(k\). Положив книги, для каждого отсека она возьмет ровно одну букву — MEX мультимножества букв, соответствующих книгам в этом отсеке, и затем объединит полученные буквы в одну строку. Первая буква итоговой строки — это буква MEX мультимножества букв в первом отсеке, вторая буква итоговой строки — это буква MEX мультимножества букв во втором отсеке, и так далее. Обратите внимание, что в ограничениях этой задачи MEX всегда может быть определен для любого мультимножества букв, соответствующих книгам, потому что 'z' не может являться начальной буквой в названиях книг.

Какую лексикографически наибольшую результирующую строку может получить Эла?

Строка \(a\) лексикографически больше строки \(b\) тогда и только тогда, когда выполняется одно из следующих условий:

  • \(b\) является префиксом \(a\), но \(b \ne a\);
  • в первой позиции, где \(a\) и \(b\) различаются, в строке \(a\) стоит буква, которая представлена в алфавите позже, чем соответствующая буква в \(b\).

MEX мультимножества букв – это первая в алфавите буква, которая не входит в это мультимножество. Например, если мультимножество букв содержит \(7\) букв 'b', 'a', 'b', 'c', 'e', 'c', 'f', то MEX этого мультимножества будет 'd', поскольку 'd' не содержится в мультимножестве, и все буквы, предшествующие 'd' в алфавите, а именно 'a', 'b' и 'c', содержатся в мультимножестве.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\))  — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 200\); \(1 \le k \le n\)). Гарантируется, что \(n\) нацело делится на \(k\).

Вторая строка каждого набора входных данных содержит строку из \(n\) строчных латинских букв от 'a' до 'y' включительно. Каждая буква представляет начальную букву названия очередной книги.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(1000\).

Выходные данные

Для каждого набора входных данных выведите строку длины \(k\), которая является лексикографически наибольшей строкой, которую может получить Эла.

Примечание

В первом наборе входных данных книги можно распределить по \(3\) отсекам как показано ниже:

  • в первом отсеке находятся книги с индексами \(1, 2, 3, 7\): \(multiset_1 = \{\)'c', 'a', 'b', 'd'\(\}\) \(\rightarrow\) \(MEX(multiset_1) =\) 'e'
  • во втором отсеке находятся книги с индексами \(4, 5, 6, 9\) : \(multiset_2 = \{\)'c', 'c', 'a', 'b'\(\}\) \(\rightarrow\) \(MEX(multiset_2) =\) 'd'
  • в третьем отсеке находятся книги с индексами \(8, 10, 11, 12\): \(multiset_3 = \{\)'a', 'a' , 'a', 'c'\(\}\) \(\rightarrow\) \(MEX(multiset_3) =\) 'b'

Следовательно, ответ 'edb'. Можно доказать, что Эла никак не может расположить книги так, чтобы в результате получилась лексикографически большая строка.

B. Фитнес Элы и роскошные числа

Бинарный поиск математика реализация *1300

Работая в DTL, Эла тщательно следит за своим физическим и психическим здоровьем. Она начала заниматься различными видами спорта, такими как стрельба из лука, йога и футбол.

С тех пор, как Эла начала заниматься спортом, Эла переключается на новый вид спорта в те дни, которые она считает «роскошными». Пусть очередной день является \(x\)-м по порядку с начала занятий (дни нумеруются с единицы, то есть начальный день занятий является \(1\)-м). Этот день является «роскошным», если \(x\) нацело делится на \({\lfloor \sqrt{x} \rfloor}\)

Здесь \(\lfloor r \rfloor\) обозначает округление вниз действительного числа \(r\). Другими словами, это наибольшее целое число, не превышающее \(r\). \(x\)

Например: \(8\)-й, \(56\)-й, \(100\)-й дни — «роскошные», так как \(8\) делится на \(\lfloor \sqrt{8} \rfloor = \lfloor 2.8284 \rfloor = 2\), \(56\) делится на \(\lfloor \sqrt{56} \rfloor = \lfloor 7.4833 \rfloor = 7\) и \(100\) делится на \(\lfloor \sqrt{100} \rfloor = \lfloor 10 \rfloor = 10\). С другой стороны, \(5\)-й или \(40\)-й дни не являются таковыми, поскольку \(5\) не делится на \(\lfloor \sqrt{5} \rfloor = \lfloor 2.2361 \rfloor = 2\), а \(40\) не делится на \(\lfloor \sqrt{40} \rfloor = \lfloor 6.3246 \rfloor = 6\).

Будучи другом Элы, вы хотите заниматься с ней этими фитнес-мероприятиями, чтобы держать ее и себя в тонусе (и, конечно, повеселиться вместе). Ответьте на несколько вопросов, сколько раз Эла меняет вид спорта с \(l\) по \(r\) дни включительно?

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\ 000\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(l\) и \(r\) (\(1 \le l \le r \le 10^{18}\)) — границы интервала, на котором вам нужно узнать, сколько раз Эла поменяет вид спорта.

Выходные данные

Для каждого набора входных данных выведите ответ на задачу.

Примечание

В первом наборе входных данных есть \(5\) «роскошных» чисел на интервале \([8, 19]\): \(8, 9, 12, 15, 16\).

C. Эла и сверчки

игры Конструктив математика реализация *1500

Эла очень любит шахматы. Во время перерывов на работе она обычно вызывает своего коллегу по DTL на шахматные дуэли. Она не эксперт в классических шахматах, но ее очень интересуют разные нестандартные варианты шахмат, где нужно адаптироваться к новым правилам и проверить свое тактическое мышление, чтобы выиграть партию.

Задача, которая включает в себя нестандартный тип шахматных фигур, описанный ниже, гласит: даны \(3\) белых сверчка на доске \(n \cdot n\), расположенных в форме буквы «L» рядом друг с другом. Других фигур на доске нет. Эла хочет знать, может ли она за конечное количество ходов поставить какого-либо белого сверчка на клетку на горизонтали \(x\) и на вертикали \(y\)?

Расположение фигур в форме буквы «L» может быть только одним из следующих:

Для простоты опишем правила для сверчков на доске, где находятся только три белых сверчка. Он может перемещаться по горизонтали, вертикали или диагонали, но только перепрыгнув через ровно одного другого сверчка на клетку сразу за ним. Если поле сразу за сверчком, через которого он перепрыгивает, не занято, сверчок займет это поле. В противном случае (когда оно уже занято другим сверчком или отсутствует) сверчок не может сделать такой ход.

Для лучшего понимания, смотрите примеры ходов сверчка в описании к примеру.

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют наборы входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(4 \le n \le 10^5\)) — размер шахматной доски.

Вторая строка каждого набора входных данных содержит шесть чисел: \(r_1\), \(c_1\), \(r_2\), \(c_2\), \(r_3\), \(c_3\) (\(1 \le r_1, c_1, r_2, c_2, r_3, c_3 \le n\)) — координаты сверчков. Ввод гарантирует, что три сверчка расположены в форме буквы «L», одним из способов, которые показаны в условии.

Третья строка каждого набора входных данных содержит 2 числа: \(x\), \(y\) (\(1 \le x, y \le n\)) — координаты клетки, куда надо поставить сверчка.

Выходные данные

Для каждого набора входных данных выведите «YES», если Эла может поставить сверчка на требуемую клетку, и «NO» иначе

Примечание

Решение для первого примера. Сверчка нужно поставить в красную клетку. Обратите внимание, что в шахматах горизонтали нумеруются снизу вверх, как и на этой картинке.

D. Эла и волшебник

графы дп жадные алгоритмы кратчайшие пути Перебор реализация *2200

Эле нужно отправить большой пакет данных с компьютера \(1\) на компьютер \(n\) через сеть компьютеров. В настоящее время сеть работает слишком медленно, и пакет может не успеть вовремя. К счастью, добрый волшебник протянул ей руку помощи.

Сеть может быть представлена как неориентированный связный граф с \(n\) вершинами, каждая из которых представляет компьютер. Для их соединения используются \(m\) проводов. Провод \(i\) используется для соединения компьютеров \(u_i\) и \(v_i\) и имеет вес \(w_i\). Вышеупомянутый пакет при прохождении через провод \(i\) переместится с компьютера \(u_i\) на компьютер \(v_i\) (или наоборот) ровно за \(w_i\) микросекунд. Волшебник может использовать свое заклинание произвольное количество раз. Для каждого заклинания он выберет провод с индексом \(i\), соединяющий компьютеры \(u_i\) и \(v_i\), и переподключит его, выполнив следующие действия:

  • Выберет один из компьютеров, соединенный этим проводом. Без ограничения общности выберем \(v_i\).
  • Выберет компьютер, который в данный момент подключен к \(v_i\) (можно выбрать \(u_i\)), назовем его \(t_i\), отсоединит провод с индексом \(i\) от \(v_i\), и соединит им \(u_i\) и \(t_i\).

Переподключение провода \(i\) займет \(w_i\) микросекунд, а вес провода после этой операции не изменится. После переподключения компьютер может иметь какой-то провод, соединяющий его с самим собой. Переподключение также может сделать граф несвязным.

Задача Элы — как можно быстрее отправить пакет данных с компьютера \(1\) на компьютер \(n\). Обратите внимание, что волшебник может использовать свое заклинание сколько угодно раз (возможно, ноль). Чтобы обеспечить бесперебойную работу сети при передаче большого пакета, все заклинания могут использоваться только до начала передачи данных с компьютера \(1\).

Какое минимальное количество времени потребуется для передачи пакета данных с компьютера \(1\) на компьютер \(n\), с учетом времени, потраченного на применение заклинаний?

Входные данные

Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют наборы входных данных.

В первой строке каждого набора заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 500\), \(n - 1 \le m \le 250 000\)) — количество вершин и проводов соответственно.

\(i\)-я из следующих \(m\) строк содержит три числа \(u_i\), \(v_i\) и \(w_i\) (\(1 \le u_i, v_i \le n\), \(1 \le w_i \le 10^9\)) — номера двух компьютеров, соединенных \(i\)-м проводом, и его вес.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(500\) и сумма \(m\) по всем наборам не превышает \(250 000\). Граф в каждом наборе входных данных гарантированно будет связным и без петель, но он может содержать кратные ребра.

Выходные данные

Для каждого набора входных данных выведите одно целое число, обозначающее наименьшее количество времени, необходимое для передачи пакета данных с компьютера \(1\) на \(n\).

Примечание

Граф в первом наборе входных данных:

Эла может попросить волшебника использовать его заклинание на проводе с индексом \(7\), который соединяет компьютеры \(2\) и \(3\). Поскольку компьютер \(8\) подключена к компьютеру \(3\), волшебник может отключить провод \(7\) от компьютера \(3\) и подключить его к компьютеру \(8\) за \(3\) микросекунды (вес провода \(3\)).

После этого пакет можно отправить с компьютера \(1\) на компьютер \(8\) за \(6\) микросекунд. Следовательно, ответ \(3 + 6 = 9\) микросекунд.

A. Упоротая слава

жадные алгоритмы реализация сортировки *800

Герой очень хочет славы, поэтому он сражается с монстрами.

У героя есть \(n\) способностей. \(i\)-я способность имеет тип \(a_i\) (любой из огонь или мороз) и исходный урон \(b_i\).

Герой может использовать все \(n\) способностей в любом порядке (каждая способность будет использована только один раз). При использовании каждой способности, происходит следующее:

  • Если текущая способность следует сразу за способностью другого типа, то её урон удваивается.
Другими словами,
  1. Если способность типа огонь с исходным уроном \(c\) используется сразу после способности с типом огонь, тогда она нанесет \(c\) урона;
  2. Если способность типа огонь с исходным уроном \(c\) используется сразу после способности с типом мороз, тогда она нанесет \(2c\) урона;
  3. Если способность типа мороз с исходным уроном \(c\) используется сразу после способности с типом огонь, тогда она нанесет \(2c\) урона;
  4. Если способность типа мороз с исходным уроном \(c\) используется сразу после способности с типом мороз, тогда она нанесет \(c\) урона.

Ваша задача найти максимальный урон, который может нанести герой.

Входные данные

В первой строке задано целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Затем следуют описания наборов входных данных.

В первой строке задано целое число \(n\) (\(1 \leq n \leq 10^5\)), означающее количество способностей.

Во второй строке задано \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \leq a_i \leq 1\)), где \(a_i\) означает тип \(i\)-й способности. \(i\)-я способность имеет тип огонь, если \(a_i = 0\), и тип мороз, если \(a_i = 1\).

В третьей строке задано \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \leq b_i \leq 10^9\)), где \(b_i\) означает исходный урон \(i\)-й способности.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите максимальный урон, который может нанести герой.

Примечание

В первом наборе входных данных мы можем применить способности в порядке \([3, 1, 4, 2]\), и суммарный урон будет \(100 + 2 \times 1 + 2 \times 1000 + 10 = 2112\).

Во втором наборе входных данных мы можем применить способности в порядке \([1, 4, 2, 5, 3, 6]\), и суммарный урон будет \(3 + 2 \times 6 + 2 \times 4 + 2 \times 7 + 2 \times 5 + 2 \times 8 = 63\).

В третьем наборе входных данных мы можем применить способности в порядке \([1, 2, 3]\), и суммарный урон будет \(1000000000 + 1000000000 + 1000000000 = 3000000000\).

В четвертом примере всего одна способность с уроном \(1\), значит суммарный урон будет \(1\).

A. Неподвижный конь

реализация *800

Дана шахматная доска размера \(n \times m\). Строки пронумерованы от \(1\) до \(n\), столбцы пронумерованы от \(1\) до \(m\).

Назовем клетку изолированной, если конь, помещенный в эту клетку, не может сделать ход ни в какую другую клетку доски. Напомним, что шахматный конь двигается на две клетки в одном направлении и на одну клетку в перпендикулярном направлении:

Найдите любую изолированную клетку на доске. Если таких клеток нет, то выведите любую клетку на доске.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 64\)) — количество наборов входных данных.

В единственной строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 8\)) — количество строк и столбцов доски.

Выходные данные

На каждый набор входных данных выведите два целых числа — строка и столбец любой изолированной клетки на доске. Если таких клеток нет, то выведите любую клетку на доске.

Примечание

В первом наборе входных данных все клетки изолированные. Конь не может сделать ход из любой клетки в любую другую. Поэтому любая клетка будет правильным ответом.

Во втором наборе входных данных нет изолированных клеток. На нормальной шахматной доске у коня всегда есть хотя бы два хода из каждой клетки. Поэтому опять любая клетка будет правильным ответом.

В третьем наборе входных данных только центральная клетка доски изолированная. Конь может свободно двигаться по границе доски, но не может выйти из центра.

B. Список файлов

дп жадные алгоритмы реализация *1400

Системный администратор Евдоким снова «отличился». В результате ошибки в некотором скрипте список имен особо важных файлов был поврежден. Так как это были файлы файловой системы BerFS, то известно, что каждое имя файла имеет вид «name.ext», где:

  • name — это строка строчных латинских букв длины от 1 до 8 символов;
  • ext — это строка строчных латинских букв длины от 1 до 3 символов.

Например, «read.me», «example.txt» и «b.cpp» — корректные имена файлов, а «version.info», «ntldr» и «contestdata.zip» — нет.

Повреждение списка привело к тому, что все имена файлов оказались записанными друг за другом, без каких-либо разделителей.

Евдокиму необходимо срочно исправить ситуацию, разделив на части получившуюся строку так, что каждая часть будет корректным именем файла в BerFS. Так как Евдоким уже доказал, что он не силен в программировании, помогите ему. Получившийся список файлов может содержать одинаковые имена файлов.

Входные данные

Входные данные состоят из единственной строки s, длина которой от 1 до 4·105 символов. Строка может содержать только строчные латинские буквы («a» - «z») и точки («.»).

Выходные данные

Выведите «YES» (без кавычек) в первую строку, если возможно разбить s на части требуемым образом. В этом случае следующие строки должны содержать части искомого разбиения, по одной части в строке в порядке их следования в s. Искомое разбиение может содержать одинаковые имена файлов. Если решений несколько, выведите любое.

Если решения не существует, то выведите в единственную строку «NO» (без кавычек).

A. Сравни размеры футболок

реализация реализация Строки *800

Даны размеры двух футболок: \(a\) и \(b\). Размер футболки — это либо строка M, либо строка, состоящая из нескольких (возможно нуля) символов X и одного из символов: S или L.

Например, строки M, XXL, S, XXXXXXXS могут быть размерами некоторых футболок. А строки XM, LL, SX — не являются размерами.

Буква M обозначает средний размер (от англ. medium), S — маленький (small), L — большой (large). Буква X — степень величины размера (от англ. eXtra). Например, XXL — это экстра-экстра-большой (от больше чем XL, и меньше чем XXXL).

Вам нужно сравнить два заданных размера футболок \(a\) и \(b\).

Футболки сравниваются следующим образом:

  • любой маленький размер (не зависимо от количества букв X) меньше среднего и любого большого;
  • любой большой размер (не зависимо от количества букв X) больше среднего и любого маленького;
  • чем больше букв X перед S, тем меньше размер;
  • чем больше букв X перед L, тем больше размер.

Например:

  • XXXS < XS
  • XXXL > XL
  • XL > M
  • XXL = XXL
  • XXXXXS < M
  • XL > XXXS
Входные данные

В первой строке входных данных дано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки, в которой записаны размеры футболок \(a\) и \(b\). Длины строк, соответствующие размерам футболок не превышают \(50\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке результат сравнения футболок \(a\) и \(b\) (строки «<», «>» либо «=» без кавычек).

A. Сравни размеры футболок

реализация реализация Строки *800

Даны размеры двух футболок: \(a\) и \(b\). Размер футболки — это либо строка M, либо строка, состоящая из нескольких (возможно нуля) символов X и одного из символов: S или L.

Например, строки M, XXL, S, XXXXXXXS могут быть размерами некоторых футболок. А строки XM, LL, SX — не являются размерами.

Буква M обозначает средний размер (от англ. medium), S — маленький (small), L — большой (large). Буква X — степень величины размера (от англ. eXtra). Например, XXL — это экстра-экстра-большой (от больше чем XL, и меньше чем XXXL).

Вам нужно сравнить два заданных размера футболок \(a\) и \(b\).

Футболки сравниваются следующим образом:

  • любой маленький размер (не зависимо от количества букв X) меньше среднего и любого большого;
  • любой большой размер (не зависимо от количества букв X) больше среднего и любого маленького;
  • чем больше букв X перед S, тем меньше размер;
  • чем больше букв X перед L, тем больше размер.

Например:

  • XXXS < XS
  • XXXL > XL
  • XL > M
  • XXL = XXL
  • XXXXXS < M
  • XL > XXXS
Входные данные

В первой строке входных данных дано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки, в которой записаны размеры футболок \(a\) и \(b\). Длины строк, соответствующие размерам футболок не превышают \(50\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке результат сравнения футболок \(a\) и \(b\) (строки «<», «>» либо «=» без кавычек).

A. Сумма

реализация *800

Вам даны три целых числа \(a\), \(b\) и \(c\). Определите, является ли одно из них суммой двух других.

Входные данные

Первая строка содержит число \(t\) (\(1 \leq t \leq 9261\)) — количество наборов входных данных.

Описание каждого набора состоит из 3 чисел \(a\), \(b\), \(c\) (\(0 \leq a, b, c \leq 20\)).

Выходные данные

Для каждого набора выведите «YES», если одно из чисел равно сумме двух других, и «NO» в противном случае.

Вы можете вывести ответ в любом регистре (например, строки «YEs», «Yes», «Yes» и «YES» будут считаться как положительный ответ).

Примечание

В первом наборе \(1 + 3 = 4\).

Во втором наборе ни одно из чисел не является суммой двух других.

В третьем наборе \(9 + 11 = 20\).

B. Возрастающий

жадные алгоритмы реализация сортировки *800

Вам дан массив \(a\) из \(n\) целых положительных чисел. Определите, можно ли, переставив элементы, сделать массив строго возрастающим. Другими словами, определите, можно ли переставить элементы так, чтобы выполнялось условие \(a_1 < a_2 < \dots < a_n\).

Входные данные

Первая строка содержит число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит число \(n\) (\(1 \leq n \leq 100\)) — количество элементов в массиве.

Вторая строка каждого набора содержит \(n\) чисел \(a_i\) (\(1 \leq a_i \leq 10^9\)) — элементы массива.

Выходные данные

Для каждого набора выведите «YES» (без скобок), если массив удовлетворяет условию, и «NO» (без скобок) в противном случае.

Вы можете вывести ответ в любом регистре (например, строки «YEs», «Yes», «Yes» и «YES» будут считаться как положительный ответ).

Примечание

В первом наборе любая перестановка оставит массив \([1,1,1,1]\), который не является строго возрастающим.

Во втором наборе можно сделать массив \([1,3,4,7,8]\).

C. Полосы

реализация *900

В матрице размером \(8 \times 8\) некоторые строки были покрашены в красный цвет и некоторые столбцы — в синий в некотором порядке. Покраски проводились последовательно, одна за другой. Когда осуществлялась очередная покраска она красила все клетки, по которым проходила.

Определите, какой цвет был использован последним.

Красная полоса была нарисована после синей, потому ответ R.
Входные данные

Первая строка входных данных содержит число \(t\) (\(1 \leq t \leq 4000\)) — количество наборов входных данных. Далее следует описание наборов. Перед каждым набором находится пустая строка.

Каждый набор состоит из \(8\) строк, каждая из которых содержит \(8\) символов. Каждым из этих символов является либо 'R', либо 'B', либо '.', обозначая красный квадрат, синий квадрат и неокрашенный квадрат, соответственно.

Гарантируется, что заданное поле получено из бесцветного путем рисования красных строк и синих столбцов.

Как минимум одна покраска была осуществлена.

Выходные данные

Для каждого набора выведите 'R', если последней покрашенной полосой была красная, и 'B', если последней покрашенной полосой была синяя без кавычек).

Примечание

Первый пример показан на рисунке.

A. Пароль

Комбинаторика математика Перебор реализация *800

Монокарп забыл пароль от своего телефона. Пароль состоит ровно из \(4\) цифр от \(0\) до \(9\) (обратите внимание, что пароль может начинаться с цифры \(0\)).

Монокарп помнит, что в его пароле были ровно две различные цифры, причем каждая из этих цифр встречалась в пароле ровно по два раза. Также Монокарп помнит, какие цифры точно не могли быть в его пароле.

Посчитайте количество последовательностей из \(4\) цифр, которые могли бы быть паролем Монокарпа (то есть которые подходят под все описанные условия).

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 8\)) — количество цифр, которых точно нет в пароле Монокарпа.

Во второй строке записаны \(n\) целых различных чисел \(a_1, a_2, \dots a_n\) (\(0 \le a_i \le 9\)) — цифры, которых точно нет в пароле Монокарпа. Обратите внимание, что числа \(a_1, a_2, \dots, a_n\) заданы в порядке возрастания.

Выходные данные

На каждый набор входных данных выведите одно целое число — количество последовательностей из \(4\) цифр, которые подходят под все описанные условия.

Примечание

Возможные пароли в первом наборе входных данных: «3377», «3737», «3773», «7337», «7373», «7733».

A. Замена чисел

жадные алгоритмы реализация *800

Массив из целых чисел \(a_1, a_2, \ldots, a_n\) преобразуется в массив из строчных букв латинского алфавита с помощью следующей процедуры.

Пока в массиве есть хотя бы одно число:

  • Выбрать произвольное число \(x\) из массива \(a\), и произвольную букву латинского алфавита \(y\).
  • Заменить все все вхождения числа \(x\) на букву \(y\).

Например, если изначально был массив \(a = [2, 3, 2, 4, 1]\), то его могли преобразовать следующим образом:

  • Выбрать число \(2\) и букву c. После этого \(a = [c, 3, c, 4, 1]\).
  • Выбрать число \(3\) и букву a. После этого \(a = [c, a, c, 4, 1]\).
  • Выбрать число \(4\) и букву t. После этого \(a = [c, a, c, t, 1]\).
  • Выбрать число \(1\) и букву a. После этого \(a = [c, a, c, t, a]\).

После преобразования все получившиеся буквы объединяются в строку, в нашем примере получилось бы строка «cacta».

По данному массиву \(a\) и строке \(s\) определите, могла ли строка \(s\) получиться из массива \(a\) после описанного преобразования?

Входные данные

В первой строке входных данных задано целое число \(t\) \((1 \leq t \leq 10^3\)) — количество наборов входных данных.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных содержится целое число \(n\) (\(1 \leq n \leq 50\)) — длина массива \(a\) и строки \(s\).

Во второй строке каждого набора входных данных содержится ровно \(n\) целых чисел: \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 50\)) — элементы массива \(a\).

В третьей строке каждого набора входных данных содержится строка \(s\) длины \(n\), состоящая из строчных латинских букв.

Выходные данные

Для каждого набора входных данных выведите «YES», если из массива \(a\) можно получить строку \(s\), и «NO» иначе. Вы можете выводить каждую букву в любом регистре.

Примечание

Первый набор данных соответствует примеру, описанному в условии.

Во втором наборе входных данных можно выбрать число \(50\) и букву a.

В третьем наборе входных данных можно выбрать число \(11\) и букву a, после чего \(a = [a, 22]\). После этого выбрать число \(22\) и букву b и получить \(a = [a, b]\).

В пятом наборе входных данных можно по очереди заменить все числа на букву a.

B. Чётно-нечётные прибавления

математика реализация *800

Вам даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Обработайте \(q\) запросов двух типов:

  • запрос вида «0 \(x_j\)» — ко всем чётным элементам массива \(a\) прибавить число \(x_j\),
  • запрос вида «1 \(x_j\)» — ко всем нечётным элементам массива \(a\) прибавить число \(x_j\).

Обратите внимание, что при обработке запроса мы смотрим именно на чётность/нечётность значения \(a_i\), а не на его индекс.

После обработки каждого запроса выведите сумму элементов массива \(a\).

Обратите внимание, что для некоторых наборов входных данных ответ не будет помещаться в 32-х битных целочисленный тип, вы должны использовать 64-битный целочисленный тип вашего языка (например, long long в C++).

Входные данные

В первой строке входных данных задано целое число \(t\) \((1 \leq t \leq 10^4\)) — количество наборов входных данных.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных содержится два целых числа \(n\) и \(q\) (\(1 \leq n\), \(q \leq 10^5\)) — длина массива \(a\) и количество запросов.

Во второй строке каждого набора входных данных содержится ровно \(n\) целых чисел: \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — элементы массива \(a\).

В следующих \(q\) строках содержатся запросы в виде двух целых чисел \(type_j\) и \(x_j\) \((0 \leq type_j \leq 1\), \(1 \leq x_j \leq 10^4\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\). Аналогично, сумма значений \(q\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) чисел — сумму элементов массива \(a\) после обработки каждого запроса.

Примечание

В первом наборе входных данных массив \(a = [2]\) после первого запроса.

В третьем наборе входных данных массив \(a\) изменяется следующим образом: \([1, 3, 2, 4, 10, 48]\) \(\rightarrow\) \([7, 9, 2, 4, 10, 48]\) \(\rightarrow\) \([7, 9, 7, 9, 15, 53]\) \(\rightarrow\) \([7, 9, 7, 9, 15, 53]\) \(\rightarrow\) \([10, 12, 10, 12, 18, 56]\) \(\rightarrow\) \([22, 24, 22, 24, 30, 68]\) \(\rightarrow\) \([23, 25, 23, 25, 31, 69]\).

C. Светофор

Бинарный поиск реализация *1000

Вы попали на необычный перекресток со странным светофором. У этого светофора есть три возможных цвета: красный (r), желтый (y), зеленый (g). Известно, что светофор повторяет свои цвета каждые \(n\) секунд и в \(i\)-ю секунду горит цвет \(s_i\).

Таким образом, порядок цветов задаётся строкой. Например, если \(s=\)«rggry», то светофор горит так: красный-зеленый-зеленый-красный-желтый-красный-зеленый-зеленый-красный-желтый- ... и так далее.

Более формально, вам дана строка \(s_1, s_2, \ldots, s_n\) длины \(n\). В первую секунду горит цвет \(s_1\), во вторую \(s_2\), ..., в \(n\)-ю секунду горит цвет \(s_n\), в \(n + 1\)-ю секунду горит цвет \(s_1\) и так далее.

Вам нужно перейти дорогу, и это можно сделать только тогда, когда на светофоре горит зеленый цвет.

Вам известно, какой сейчас цвет на светофоре, но вы не знаете текущей момент времени. Вам нужно найти минимальное время, в течение которого вы точно (наверняка) сможете перейти дорогу.

Можно считать, что дорогу мы проходим моментально.

Например, в случае \(s=\)«rggry» и текущего света r возможны два варианта: либо зеленый свет наступит через через \(1\) секунду, либо через \(3\). Таким образом, ответ равен \(3\) — именно через столько секунд мы гарантированно сможем перейти дорогу, если текущий цвет r.

Входные данные

В первой строке входных данных дано единственное целое число \(t\) \((1 \leq t \leq 10^4\)) — количество наборов входных данных.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных содержится целое число \(n\) и символ \(c\) (\(1 \leq n \leq 2 \cdot 10^5\), \(c\) является одним из допустимых цветов светофора r, y или g)— длина строки \(s\) и текущий цвет светофора.

Во второй строке каждого набора входных данных содержится строка \(s\) длины \(n\), состоящая из символов r, y и g.

Гарантируется, что символ g встречается в строке \(s\) и что символ \(c\) встречается в строке \(s\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных теста не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество секунд, в течение которого можно гарантировано перейти дорогу.

Примечание

Первый набор входных данных разобран в условии.

Во втором наборе входных данных уже сейчас горит зеленый цвет, поэтому можно перейти дорогу сразу же.

В третьем наборе входных данных если изначально горел красный цвет на второй секунде, то ждать зеленого цвета пришлось бы одну секунду, а если бы горел красный цвет на первой секунде, то уже две.

В четвертом наборе входных данных дольше всего ждать зеленый цвет мы будем с пятой секунды.

C. Операции над перестановкой

жадные алгоритмы Конструктив математика реализация *1300

Вам дана перестановка \(a\) размера \(n\), и вы должны выполнить над ней \(n\) операций. В \(i\)-й операции вы должны выбрать непустой суффикс \(a\) и увеличить все его элементы на \(i\). Каким образом нужно выполнить операции, чтобы минимизировать количество инверсий в конечном массиве?

Обратите внимание, что вы можете выполнять операции с одним и тем же суффиксом любое количество раз.

Перестановкой размера \(n\) называется такой массив размера \(n\), где каждое целое число от \(1\) до \(n\) встречается ровно один раз. Суффиксом называются несколько последовательных элементов массива, включающие в себя последний элемент массива. Инверсией в массиве \(a\) называется пара индексов \((i, j)\) такая, что \(i > j\) и \(a_{i} < a_{j}\).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует их описание.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — размер массива.

Вторая строка содержит \(n\) различных целых чисел \(a_{1}, a_{2}, \dots, a_{n}\) (\(1 \le a_i \le n\)) — исходная перестановка \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел \(x_{1}, x_{2}, \ldots, x_{n}\) (\(1 \le x_{i} \le n\) для каждого \(1 \le i \le n\)), указывающее, что \(i\)-я операция должна быть применена к суффиксу начиная с индекса \(x_{i}\). Если ответов несколько, выведите любой из них.

Примечание

В первом наборе входных данных одно из оптимальных решений — на каждой операции увеличивать весь массив (то есть суффикс, начинающийся с индекса \(1\)). Итоговый массив \([11, 12, 13, 14]\) будет содержать \(0\) инверсий.

Во втором наборе входных данных \(a\) будет равно \([2, 4, 3, 5, 6]\), \([2, 4, 3, 7, 8]\), \([2, 4, 6, 10, 11]\), \([2, 8, 10, 14, 15]\) и \([7, 13, 15, 19, 20]\) после первой, второй, третьей, четвертой и пятой операций соответственно. Таким образом, итоговый массив \(a\) будет иметь ноль инверсий.

G. Подготовка к олимпиаде

Бинарный поиск геометрия дп Потоки реализация сортировки Структуры данных *3500

Антон решил подготовиться к очередной олимпиаде. Чтобы Антону было интереснее, Илья подготовил для него \(n\) задач. Сдать \(i\)-ю задачу можно только в первые \(d_{i}\) дней, причем сдавать несколько задач в один и тот же день нельзя. Илья оценил полезность \(i\)-й задачи как \(r_{i}\), и разделил задачи на три темы, тема \(i\)-й задачи равна \(type_{i}\).

Антон хочет решить ровно \(a\) задач на первую тему, ровно \(b\) на вторую тему и ровно \(c\) задач на третью тему (и каждая из этих задач должна быть решена не позже своего дедлайна). Скажите Антону, сможет ли он это сделать, и если сможет, то выведите максимальную суммарную полезность задач, которые он решит.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержатся четыре целых числа \(n, a, b, c\) (\(1 \le n \le 10^5\), \(0 \le a, b, c \le n\)).

В каждой из следующих \(n\) строк содержатся три целых числа \(r_i, type_i, d_i\) (\(0 \le r_i \le 10^{9}\), \(1 \le type_i \le 3\), \(1 \le d_i \le n\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное число: \(-1\), если решить нужный набор задач невозможно, и максимальную полезность решенных задач в противном случае.

Примечание

В первом наборе входных данных выгодно решить \(2\)-ю и \(4\)-ю задачи.

Во втором наборе входных данных ответа не существует.

В третьем наборе входных данных оптимально решить \(2\)-ю, \(3\)-ю и \(4\)-ю задачи.

В последнем наборе входных данных оптимально решить \(1\)-ю, \(2\)-ю и \(4\)-ю задачи.

B. Разнообразные подстроки

Перебор реализация Строки *1400

Непустая строка из цифр является разнообразной, если количество вхождений каждого символа в неё не превосходит количество различных символов в ней.

Например,

  • строка «7» разнообразная, так как 7 встречается в ней \(1\) раз, и количество различных символов в ней равно \(1\);
  • строка «77» не является разнообразной, так как 7 встречается в ней \(2\) раза, а количество различных символов в ней равно \(1\);
  • строка «1010» разнообразная, так как 0 и 1 встречаются в ней по \(2\) раза, и количество различных символов в ней равно \(2\);
  • строка «6668» не является разнообразной, так как 6 встречается в ней \(3\) раза, а количество различных символов в ней равно \(2\).

Вам дана строка \(s\) длины \(n\), состоящая из цифр от \(0\) до \(9\). Найдите, сколько из ее \(\frac{n(n+1)}{2}\) подстрок являются разнообразными.

Строка \(a\) является подстрокой \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов из начала и нескольких (возможно, ни одного или всех) символов из конца.

Обратите внимание, что если некоторая разнообразная строка встречается в \(s\) несколько раз, то каждое её вхождение должно быть подсчитано независимо. Например, в строке «77» есть две разнообразных подстроки, равных «7», поэтому ответ для строки «77» равен \(2\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано одно число \(n\) (\(1 \le n \le 10^5\)) — длина строки \(s\).

Во второй строке дана строка \(s\) длины \(n\). Гарантируется, что \(s\) состоит только из цифр от \(0\) до \(9\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число: количество разнообразных подстрок строки \(s\).

Примечание

В первом наборе входных данных подстрока «7» разнообразная.

Во втором наборе входных данных подстрока «7» разнообразная. Так как она встречается дважды, ответ равен \(2\).

В третьем наборе входных данных следующие подстроки являются разнообразными: «0» (\(2\) вхождения), «01», «010», «1» (\(2\) вхождения), «10» (\(2\) вхождения), «101» и «1010».

В четвёртом наборе входных данных следующие подстроки являются разнообразными: «0» (\(3\) вхождения), «01», «011», «0110», «1» (\(2\) вхождения), «10», «100», «110» и «1100».

В пятом наборе входных данных следующие подстроки являются разнообразными: «3», «39», «399», «6», «9» (\(4\) вхождения), «96» и «996».

В шестом наборе входных данных все \(15\) непустых подстрок строки «23456» являются разнообразными.

C. Префиксы с нулевой суммой

дп жадные алгоритмы Перебор реализация Структуры данных *1600

Красота массива \(v_1,v_2,\ldots,v_n\) равняется количеству индексов \(i\) (\(1 \le i \le n\)), таких что \(v_1+v_2+\ldots+v_i = 0\).

У вас есть массив \(a_1,a_2,\ldots,a_n\) длины \(n\). Вы можете применить к нему следующую операцию сколько угодно раз:

  • выбрать индекс \(i\) (\(1 \le i \le n\)), такой что \(a_i=0\);
  • после этого заменить \(a_i\) на произвольное целое число.

Какой максимальной красоты массив \(a\) вы можете получить?

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано одно число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина массива \(a\).

Во второй строке даны \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(-10^9 \le a_i \le 10^9\)) — массив \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число: максимальную красоту массива \(a\) после применения к нему операций.

Примечание

В первом наборе входных данных вы можете заменить \(a_2\) на \(-2\) за одну операцию. После этого массив \(a\) станет равен \([2,-2,1,-1,0]\) и будет иметь красоту \(3\):

  • \(a_1+a_2=2-2=0\);
  • \(a_1+a_2+a_3+a_4=2-2+1-1=0\);
  • \(a_1+a_2+a_3+a_4+a_5=2-2+1-1+0=0\).

Во втором наборе входных данных вы можете заменить \(a_3\) на \(-2\,000\,000\,000\), чтобы получить массив красоты \(1\).

В третьем наборе входных данных вы можете не делать операции.

A. Трусливые ладьи

жадные алгоритмы реализация *800

Дана шахматная доска размера \(n \times n\). На ней расположены \(m\) ладей таким образом, что:

  • никакие две ладьи не занимают одну клетку;
  • никакие две ладьи не атакуют друг друга.

Ладья атакует все клетки, которые находятся в ее строке или столбце.

Можно ли подвинуть ровно одну ладью (вы можете самостоятельно выбрать, какую именно) в другую клетку так, что никакие две ладьи все еще не будут атаковать друг друга? Ладья может сходить в любую клетку в ее строке или столбце, если никакая другая ладья не стоит на ее пути.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 2000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 8\)) — размер доски и количество ладей.

В \(i\)-й из следующих \(m\) строк записаны два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\)) — позиция \(i\)-й ладьи: \(x_i\) — это строка, а \(y_i\) — столбец.

Никакие две ладьи не занимают одну клетку. Никакие две ладьи не атакуют друг друга.

Выходные данные

На каждый набор входных данных выведите «YES», если можно подвинуть ровно одну ладью в другую клетку так, что никакие две ладьи все еще не будут атаковать друг друга. В противном случае выведите «NO».

Примечание

В первом наборе входных данных ладьи стоят в противоположных углах доски \(2 \times 2\). Каждая из них может сходить в соседний угол, но сходить туда означает попасть по атаку другой ладьи.

Во втором наборе входных данных одна ладья стоит в центре доски \(3 \times 3\). У нее есть \(4\) доступных хода, и каждый из них подходит, потому что нет другой ладьи, чтобы ее атаковать.

C. Игра с числами

Бинарный поиск жадные алгоритмы игры реализация Структуры данных *1400

Алиса и Боб играют в игру. У них есть массив положительных целых чисел \(a\) размера \(n\).

Перед началом игры Алиса выбирает целое число \(k \ge 0\). Игра длится \(k\) ходов, номера ходов нумеруются от \(1\) до \(k\). На \(i\)-м ходу Алиса должна удалить из массива элемент, который меньше либо равен \(k - i + 1\). После этого, если массив не пустой, Боб должен прибавить к некоторому элементу массива \(k - i + 1\). Обратите внимание, что и действие Алисы, и следующее за ним действие Боба — это две части одного и того же хода. Если Алиса не может удалить элемент на каком-то ходу — она проигрывает. Если \(k\)-й ход закончился, а Алиса еще не проиграла, то она выигрывает.

Ваша задача — определить максимальное значение \(k\), при котором Алиса может выиграть при оптимальной игре обоих игроков. Боб играет против Алисы, поэтому он пытается, если это возможно, заставить ее проиграть.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 100\)) — размер массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное значение \(k\), при котором Алиса может выиграть при оптимальной игре обоих игроков.

A. Robot Bicorn Attack

Перебор реализация *1400

Вася играет в Robot Bicorn Attack.

Игра состоит из трех раундов, за каждый из которых игроку дается некоторое неотрицательное целое число очков. Результатом игры является сумма полученных очков. Вася уже сыграл все три раунда и записал полученные очки один за другим (без ведущих нулей) в строку s. Затем Вася решил похвастаться перед друзьями своим достижением, однако, он забыл, сколько очков в каком раунде он набрал. Все, что он помнит — полученная строка s.

Помогите Васе найти какое наибольшее суммарное число очков он мог получить. Стоит учитывать, что Вася играл в Robot Bicorn Attack впервые, поэтому не мог набрать более 1000000 (106) очков за один раунд.

Входные данные

В единственной строке входного файла находится непустая строка s, полученная Васей. Строка состоит только из цифр. Длина строки не превосходит 30 символов.

Выходные данные

Выведите единственное число — наибольший суммарный результат, который мог получить Вася. Если Вася ошибся и данная строка не могла быть получена в соответствии с правилами, следует вывести число -1.

Примечание

В первом примере строку необходимо разбить на числа 1, 2 и 34.

Во втором примере строку необходимо разбить на числа 90, 0 и 0.

В третьем примере строка является некорректной, так как при любом разбиении строки на 3 числа получится число 00 или 09, а по условию ведущих нулей быть не должно.

B. Plane of Tanks: Pro

реализация *1400

Вася целый год играл с друзьями в Plane of Tanks. Теперь настало время разделить участников на несколько категорий в зависимости от показанных результатов.

В каждом раунде игры Plane of Tanks игроку начисляется неотрицательное целое число очков. Вася записал результаты каждого раунда за прошедший год. Всего у него получилось n записей.

Для определения категории игрока рассматривается его лучший показанный результат и лучшие результаты других игроков. Игрок относится к категории:

  • «нуб» («noob») — если более чем у 50% игроков результат лучше;
  • «случайный» («random») — если его результат не хуже чем у 50% игроков, но более 20% игроков имеют результат лучше;
  • «средний» («average») — если его результат не хуже чем у 80% игроков, но более 10% игроков имеют результат лучше;
  • «хардкорный» («hardcore») — если его результат не хуже чем у 90% игроков, но более 1% игроков имеют результат лучше;
  • «про» («pro») — если его результат не хуже чем у 99% игроков.

При подсчете процентов сам игрок учитывается, то есть, если всего принимали участие два игрока и один из них набрал 100 баллов, а второй 1000, то первый игрок выступил не хуже чем 50% игроков, а второй не хуже чем 100%.

Вася предоставил Вам результаты игр в Plane of Tanks за прошедший год. Помогите Васе определить для каждого игрока его категорию.

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 1000) — количество записей с результатами игроков.

Каждая из следующих n строк содержит имя игрока и количество очков, набранных игроком за раунд, разделенные пробелом. Имя содержит не менее 1 и не более 10 символов. В имени используются только строчные латинские буквы. Гарантируется, что у двух различных игроков различные имена. Количество очков, набранное игроком за раунд целое, неотрицательное и не превосходит 1000.

Выходные данные

В первую строку выведите число m — количество игроков, участвовавших хотя бы в одном из раундов.

Каждая из следующих m строк должна содержать имя игрока и категорию к которой относится игрок, разделенные пробелом. Категория может принимать одно из следующих значений: «noob», «random», «average», «hardcore» или «pro» (без кавычек). Имя каждого игрока должно быть выведено ровно один раз. Имена игроков с соответствующими им категориями можно выводить в произвольном порядке.

Примечание

В первом примере лучший результат, показанный игроком artem не хуже чем у 25% участников (результат его самого), поэтому он относится к категории «noob». vasya и kolya показали результат не хуже чем у 75% участников (они сами и artem), поэтому они относятся к категории «random». igor показал результат не хуже чем у 100% участников (все другие участники и он сам), поэтому он относится к категории «pro».

Во втором примере оба игрока набрали одинаковое число очков, поэтому показали результат не хуже чем у 100% участников, поэтому они относятся к категории «pro».

C. Geometry Horse

жадные алгоритмы реализация сортировки *1600

Вася играет в Geometry Horse.

Цель игры — уничтожить геометрические фигуры, находящиеся в игровом мире. За уничтожение фигуры начисляется определенное число очков в зависимости от типа фигуры и текущего множителя.

В данной игре имеется n видов геометрических фигур, для каждого вида известно количество фигур данного вида ki и стоимость одной фигуры данного вида ci. За уничтожение одной фигуры вида i игроку начисляется ci·f очков, где f — текущий множитель. Множитель может принимать целые значения от 1 до t + 1 включительно. Изначально множитель равен 1. После уничтожения pi (1 ≤ i ≤ t) фигур множитель становится равен i + 1, таким образом, фигура, уничтоженная по счету ровно (pi + 1)-ой, учитывается уже со множителем i + 1.

Ваша задача — определить, какое наибольшее число очков может набрать Вася, уничтожив все фигуры. Учтите, что Вася настолько силен, что может уничтожать фигуры в любом выбранном им порядке.

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 100) — количество типов геометрических фигур.

В каждой из следующих n строк содержатся два целых числа, записанных через пробел, ki и ci (1 ≤ ki ≤ 109, 0 ≤ ci ≤ 1000) — количество фигур i-го вида и стоимость одной фигуры i-го вида, соответственно.

В следующей строке содержится единственное целое число t (1 ≤ t ≤ 100) — ограничение на текущий множитель.

В следующей строке содержатся t целых чисел, записанных через пробел, pi (1 ≤ p1 < p2 < ... < pt ≤ 1012) — числа описывающие изменения множителя.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Выведите единственное число — наибольшее количество очков, которое может набрать Вася.

Примечание

В первом примере Вася сначала уничтожит три фигуры и получит 3·1·10 = 30 очков. Затем множитель станет равным 2 и Вася, уничтожив оставшиеся две фигуры, получит еще 2·2·10 = 40 очков. Всего Вася получит 70 очков.

Во втором примере все 8 фигур будут уничтожены с коэффициентом 1, поэтому всего Вася наберет (3·8 + 5·10)·1 = 74 очка.

F. Gnomes of Might and Magic

графы кратчайшие пути реализация Структуры данных *3000

Вася играет в популярную игру Gnomes of Might and Magic.

В этой игре Вася управляет королевством гномов, состоящим из нескольких замков, соединенных двусторонними дорогами. Сеть дорог королевства имеет специальный вид. В королевстве есть m главных замков: a1, a2, ... , am, которые образуют Путь Добра. Этот путь состоит из дорог между замками ai, ai + 1 (1 ≤ i < m), а так же дороги между am и a1. Никаких других дорог между замками Пути Добра нет.

Кроме того, для каждой пары соседних замков Пути Добра u и v существует ровно один Обход Зла — путь по дорогам королевства, ведущий из первого замка (u) во второй (v) и не имеющий с Путем Добра общих вершин, кроме вершин u и v. Известно, что никаких других дорог и замков в королевстве нет, то есть каждая дорога и каждый замок лежит либо на Пути Добра, либо на Обходе Зла (замки могут лежать и там, и там). Кроме того, никакие два Обхода Зла не имеют общих замков, отличных от замков Пути Добра.

В начале каждой недели в королевстве появляется один очень плохой гном, который встает на одну из дорог королевства и начинает грабить корованы, проходящие через эту дорогу. На одной дороге может скапливаться несколько очень плохих гномов. Вася бережет свои корованы, поэтому иногда отправляет Миссию Смерти из одного замка в другой.

Пусть Миссия Смерти должна попасть из замка s в замок t. Тогда она будет двигаться из замка s к замку t, уничтожая всех очень плохих гномов, находящихся на дорогах пути, по которому она следует. Вася настолько крут, что его Миссия Смерти может уничтожить любое число гномов на своем пути. Однако, Вася очень добрый, поэтому всегда выбирает такой путь между замками s и t, следуя которому придется уничтожить наименьшее число гномов. Если таких путей несколько то среди них Вася выбирает путь, содержащий наименьшее число дорог. Если и таких путей несколько, то среди них Вася выбирает лексикографически минимальный.

Помогите Васе, промоделируйте жизнь королевства в игре Gnomes of Might and Magic.

Под путем понимается последовательность замков такая, что каждая пара соседних замков пути соединена дорогой. При этом путь x1, x2, ... , xp лексикографически меньше пути y1, y2, ... , yq, если либо p < q и x1 = y1, x2 = y2, ... , xp = yp, либо существует такое число r (r < p, r < q), что x1 = y1, x2 = y2, ... , xr = yr и xr + 1 < yr + 1.

Входные данные

В первой строке находятся два целых числа n и m (3 ≤ m ≤ n ≤ 100000) — количество замков в королевстве и количество замков на Пути Добра, соответственно.

Во второй строке находится m целых чисел — номера замков Пути Добра (замки нумеруются от 1 до n) в порядке следования по Пути, начиная с некоторого замка. Все замки Пути Добра различны.

Каждая из следующих m строк описывает один Обход Зла. Сначала в строке записано целое число ki (3 ≤ ki ≤ 100000) — количество замков на соответствующем Обходе Зла (с учетом двух замков, находящихся на пути добра), затем следует ki целых чисел — номера замков в порядке следования по данному Обходу. Все замки в одном Обходе Зла различны. Гарантируется, что первый и последний замки Обхода находятся на Пути Добра, а первые замки в Обходах Зла образуют Путь Добра и представлены в том же порядке, что и Путь во второй строке.

В следующей строке находится целое число q (1 ≤ q ≤ 100000) — количество событий в жизни королевства. Каждая из следующих q строк описывает одно событие. Событие описывается символом cj и двумя номерами замков sj и tj (символ и номера замков разделены единичным пробелом). Если символ cj равен «+» (плюс), то это означает, что на дороге между замками sj и tj встал (возможно, не первый) очень плохой гном. Если cj равен «?» (вопрос), то Вася направил Миссию Смерти из замка sj в замок tj. Гарантируется, что при запросе «+» дорога между замками sj и tj существует. События даны в хронологическом порядке, начиная с самого раннего. Изначально очень плохих гномов на дорогах нет.

Все числа во всех строках разделены единичными пробелами. Гарантируется, что все заданные Обходы Зла и Путь Добра соответствуют ограничениям, описанным в условии задачи.

Выходные данные

Для каждого запроса «?» необходимо вывести единственное число на отдельной строчке — количество очень плохих гномов, уничтоженных соответствующей Миссией Смерти. Ответы на запросы нужно выводить в хронологическом порядке.

Примечание

В примере после первых 4 запросов существует только один путь из замка 1 в замок 2, не содержащий дорог с очень плохими гномами: 1 6 3 5 2.

После того, как гном встал на дорогу (2, 5), следующая Миссия Смерти движется по пути 1 2 и уничтожает гнома, находившегося на дороге (1, 2). Следующая Миссия смерти идет по этому же пути, уже свободному от гномов.

После того, как еще один гном встал на дорогу (1, 2), следующая Миссия Смерти идет по пути 1 2 и уничтожает этого гнома.

A. Косвенная сортировка

Конструктив математика реализация *800

Вам дана перестановка \(a_1, a_2, \ldots, a_n\) размера \(n\), где каждое целое число от \(1\) до \(n\) встречается ровно один раз.

Вы можете выполнить следующую операцию любое количество раз (возможно, ноль):

  • Выбрать любые три индекса \(i, j, k\) (\(1 \le i < j < k \le n\)).
  • Если \(a_i > a_k\), заменить \(a_i\) на \(a_i + a_j\). В противном случае поменять местами \(a_j\) и \(a_k\).

Определите, можно ли отсортировать массив \(a\) в порядке неубывания.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(3 \le n \le 10\)) — длину массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\dots,a_n\) (\(1 \le a_i \le n\), \(a_i \neq a_j\), если \(i \neq j\)) — элементы массива \(a\).

Выходные данные

Для каждого набора входных данных выведите «Yes» (без кавычек), если массив можно отсортировать в неубывающем порядке, и «No» (без кавычек) в противном случае.

Вы можете вывести «Yes» и «No» в любом регистре (например, строки «YES», «yEs» и «yes» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных массив \([1,2,3]\) уже отсортирован в порядке неубывания.

Во втором наборе входных данных мы можем выбрать \(i = 1,j = 2,k = 3\). Так как \(a_1 \le a_3\), поменяем местами \(a_2\) и \(a_3\), тогда массив станет \([1,2,3]\), который отсортирован в порядке неубывания.

В седьмом наборе входных данных мы можем последовательно выполнять следующие операции:

  • Выберем \(i = 5,j = 6,k = 7\). Поскольку \(a_5 \le a_7\), поменяем местами \(a_6\) и \(a_7\), тогда массив станет \([1,2,6,7,4,5,3]\).
  • Выберем \(i = 5,j = 6,k = 7\). Поскольку \(a_5 > a_7\), заменим \(a_5\) на \(a_5+a_6=9\), тогда массив станет \([1,2,6,7,9,5,3]\).
  • Выберем \(i = 2,j = 5,k = 7\). Поскольку \(a_2 \le a_7\), поменяем местами \(a_5\) и \(a_7\), тогда массив станет \([1,2,6,7,3,5,9]\).
  • Выберем \(i = 2,j = 4,k = 6\). Поскольку \(a_2 \le a_6\), поменяем местами \(a_4\) и \(a_6\), тогда массив станет \([1,2,6,5,3,7,9]\).
  • Выберем \(i = 1,j = 3,k = 5\). Поскольку \(a_1 \le a_5\), поменяем местами \(a_3\) и \(a_5\), тогда массив станет \([1,2,3,5,6,7,9]\), который отсортирован в порядке неубывания.

В третьем, четвертом, пятом и шестом наборах входных данных можно показать, что массив нельзя отсортировать в порядке неубывания.

B. Максимальная подстрока

жадные алгоритмы Перебор реализация *800

Бинарной строкой называется строка, состоящая только из символов 0 и 1. Вам дана бинарная строка \(s\).

Для некоторой непустой подстроки\(^\dagger\) \(t\) строки \(s\), состоящей из \(x\) символов 0 и \(y\) символов 1, определим её стоимость как:

  • \(x \cdot y\), если \(x > 0\) и \(y > 0\);
  • \(x^2\), если \(x > 0\) и \(y = 0\);
  • \(y^2\), если \(x = 0\) и \(y > 0\).

Вам дана бинарная строка \(s\) длины \(n\), найдите максимальную стоимость среди всех её непустых подстрок.

\(^\dagger\) Строка \(a\) является подстрокой \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов из начала и нескольких (возможно, ни одного или всех) символов из конца.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину строки \(s\).

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — максимальную стоимость среди всех подстрок.

Примечание

В первом наборе входных данных мы можем взять подстроку \(111\). Она содержит \(3\) символа 1 и \(0\) символов 0. Таким образом, \(a = 3\), \(b = 0\), и её стоимость равна \(3^2 = 9\).

Во втором наборе входных данных мы можем взять всё строку. Она содержит \(4\) символа 1 и \(3\) символа 0. Таким образом, \(a = 4\), \(b = 3\), и её стоимость равна \(4 \cdot 3 = 12\).

В третьем наборе входных данных мы можем взять подстроку \(1111\), и её стоимость равна \(4^2 = 16\).

В четвёртом наборе входных данных мы можем взять всю строку. Её стоимость равна \(4 \cdot 3 = 12\).

В пятом наборе входных данных мы можем взять подстроку \(000\). Её стоимость равна \(3 \cdot 3 = 9\).

В шестом наборе входных данных мы можем взять только подстроку \(0\). Её стоимость равна \(1 \cdot 1 = 1\).

C. Дополненный XOR

Конструктив реализация *1400

У вас есть две бинарные строки \(a\) и \(b\) длины \(n\). Вы хотите сделать все элементы обеих строк равными \(0\). К сожалению, вы можете изменять содержимое этих строк, используя только следующую операцию:

  • Вы выбираете два индекса \(l\) и \(r\) (\(1 \le l \le r \le n\));
  • Для каждого \(i\), соответствующего \(l \le i \le r\), заменить \(a_i\) на противоположное. То есть \(a_i := 1 - a_i\);
  • Для каждого \(i\), удовлетворяющего либо \(1 \le i < l\), либо \(r < i \le n\), заменить \(b_i\) на противоположное. То есть \(b_i := 1 - b_i\).

Ваша задача — определить, возможно ли это, и если да, то найти такую подходящую последовательность операций. Количество операций не должно превышать \(n + 5\). Можно доказать, что если такая последовательность операций существует, то существует и последовательность с не более чем \(n + 5\) операциями.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — длину строк.

Вторая строка каждого набора входных данных содержит бинарную строку \(a\), состоящую только из символов 0 и 1, длины \(n\).

Третья строка каждого набора входных данных содержит бинарную строку \(b\), состоящую только из символов 0 и 1, длины \(n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите сначала «YES», если возможно сделать все элементы обеих строк равными \(0\). В противном случае выведите «NO». Если ответ «YES», в следующей строке выведите одно целое число \(k\) (\(0 \le k \le n + 5\)) — количество операций. Далее должны следовать \(k\) строк, каждая из которых содержит два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)) — описание операции.

Если правильных ответов несколько, выведите любой из них.

Примечание

В первом наборе входных данных мы можем выполнить одну операцию с \(l = 2\) и \(r = 2\). Итак, \(a_2 := 1 - 1 = 0\) и строка \(a\) стала равной 000. \(b_1 := 1 - 1 = 0\), \(b_3 := 1 - 1 = 0\) и строка \(b\) стала равной 000.

Во втором и третьем наборах входных данных можно доказать, что невозможно сделать все элементы обеих строк равными \(0\).

В четвертом наборе входных данных мы можем выполнить операцию с \(l = 1\) и \(r = 2\), тогда строка \(a\) станет равной 01, а строка \(b\) не изменится. Затем выполняем операцию с \(l = 2\) и \(r = 2\), тогда \(a_2 := 1 - 1 = 0\) и \(b_1 = 1 - 1 = 0\). Итак, обе строки \(a\) и \(b\) стали равны 00.

В пятом наборе входных данных мы можем выполнить операцию с \(l = 1\) и \(r = 1\). Затем строка \(a\) стала равной 011, а строка \(b\) стала равной 100. Тогда мы можем выполнить операцию с \(l = 2\) и \(r = 3\), чтобы обе строки \(a\) и \(b\) стали равны 000.

A. Да-да?

реализация Строки *800

Вы разговаривали с Поликарпом и задали ему вопрос. Вы знаете, что когда он хочет ответить «да», он повторяет Yes много раз подряд.

Из-за шума вы услышали только часть ответа — некоторую его подстроку. То есть, если он ответил YesYes, то вы могли услышать esY, YesYes, sYes, e, но не могли Yess, YES или se.

Определите, правда ли, что заданная строка \(s\) является подстрокой YesYesYes... (Yes, повторенного много раз подряд).

Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте.

Каждый набор входных данных описывается одной строкой из латинских букв \(s\) (\(1 \le |s| \le 50\)) — частью ответа Поликарпа, которую вы услышали, где \(|s|\) — длина строки \(s\).

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите «YES», если заданная строка \(s\) является подстрокой строки YesYesYes...Yes (кол-во слов Yes произвольное), и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

A. По середине

реализация сортировки *800

Даны три различных целых числа \(a\), \(b\), и \(c\). Найдите среднее из них. Другими словами, найдите среди заданных трёх чисел число не являющееся ни минимумом, ни максимумом.

Например, средним число среди \(5,2,6\) будет \(5\), так как минимумом является \(2\), а максимумом \(6\).

Входные данные

Первая строка содержит одно число \(t\) (\(1 \leq t \leq 6840\)) — количество наборов входных данных.

Первая строка каждого набора содержит три различных целых числа \(a\), \(b\), \(c\) (\(1 \leq a, b, c \leq 20\)).

Выходные данные

Для каждого набора выведите одно целое число — среднее среди трёх данных чисел.

B. Любимая задача Atilla

жадные алгоритмы реализация Строки *800

Для того чтобы написать строку, Atilla должен сначала выучить все буквы, которые содержатся в строке.

Он хочет написать сообщение \(s\). Он просит вас узнать минимальный размер алфавита, который ему предстоит выучить, чтобы он смог написать эту всю эту строку.

Алфавит размером \(x\) (\(1 \leq x \leq 26\)) содержит только первые \(x\) латинских букв. Например, алфавит размера \(4\) содержит только символы \(\texttt{a}\), \(\texttt{b}\), \(\texttt{c}\) и \(\texttt{d}\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \leq n \leq 100\)) — длину заданной строки.

Затем следует строка \(s\) длиной \(n\), состоящая из строчных латинских букв.

Выходные данные

Для каждого набора выведите одно целое число — минимальный размер алфавита, необходимого для того, чтобы Atilla смог написать строку \(s\).

Примечание

Для первого набора нужен только символ \(\texttt{a}\), поэтому достаточно алфавита размером \(1\), который содержит только \(\texttt{a}\).

Для второго набора нужны символы \(\texttt{d}\), \(\texttt{o}\), \(\texttt{w}\), \(\texttt{n}\). Минимальный размер алфавита, который содержит их все, равен \(23\) (такой алфавит можно представить в виде строки \(\texttt{abcdefghijklmnopqrstuvw}\)).

C. Преимущество

реализация сортировки Структуры данных *800

В соревновании участвуют \(n\) участников, причем участник \(i\) имеет силу \(s_i\).

Каждый участник хочет узнать, какое преимущество он имеет перед лучшим участником соревнования помимо него самого. Другими словами, каждый участник \(i\) хочет знать разность между \(s_i\) и \(s_j\), где \(j\) — сильнейший участник соревнования, не считая \(i\). Обратите внимание, что разность может быть отрицательной.

Поэтому они просят вас о помощи! Для каждого \(i\) (\(1 \leq i \leq n\)) выведите разность между \(s_i\) и максимальной силой участника, отличного от \(i\).

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов. Далее следуют их описания.

Первая строка каждого набора содержит целое число \(n\) (\(2 \leq n \leq 2\cdot10^5\)) — длину массива.

Следующая строка содержит \(n\) положительных целых чисел \(s_1\), \(s_2\), ..., \(s_n\) (\(1 \leq s_i \leq 10^9\)) — силы участников.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2\cdot10^5\).

Выходные данные

Для каждого набора выведите \(n\) целых чисел, разделенных пробелами. Для каждого \(i\) (\(1 \leq i \leq n\)) выведите разность между \(s_i\) и максимальной силой любого другого участника.

Примечание

Для первого примера:

  • Первый участник имеет силу \(4\), а максимальная сила среди остальных участников соревнования равна \(7\), поэтому ответ для первого участника равен: \(4 - 7 = -3\).
  • Второй участник имеет силу \(7\), а максимальная сила среди остальных участников соревнования равна \(5\), поэтому ответ для второго участника: \(7 - 5 = 2\).
  • Третий участник имеет силу \(3\), а максимальная сила среди остальных участников соревнования равна \(7\), поэтому ответ для третьего участника: \(3 - 7 = -4\).
  • Четвертый участник имеет силу \(5\), а максимальная сила среди остальных участников соревнования равна \(7\), поэтому ответ для четвертого участника: \(5 - 7 = -2\).

D. Долины с трудностями

реализация *1000

Вам дан массив \(a[0 \dots n-1]\) из \(n\) целых чисел. Этот массив называется «долиной», если существует ровно один подмассив \(a[l \dots r]\) такой, что:

  • \(0 \le l \le r \le n-1\),
  • \(a_l = a_{l+1} = a_{l+2} = \dots = a_r\),
  • \(l = 0\) или \(a_{l-1} > a_{l}\),
  • \(r = n-1\) или \(a_r < a_{r+1}\).

Вот три примера:

На первом изображении показан массив [\(3, 2, 2, 1, 2, 2, 3\)], он является долиной, потому что только подмассив с индексами \(l=r=3\) удовлетворяет условию.

На втором изображении показан массив [\(1, 1, 1, 2, 3, 3, 4, 5, 6, 6, 6\)], он является долиной, потому что только подмассив с индексами \(l=0, r=2\) удовлетворяет условию.

На третьем изображении показан массив [\(1, 2, 3, 4, 3, 2, 1\)], он не является долиной, потому что два подмассива \(l=r=0\) и \(l=r=6\) удовлетворяют условию.

Определите, является ли данный массив долиной или нет.

Обратите внимание, что мы считаем массив индексированным с \(0\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \leq n \leq 2\cdot10^5\)) — длину массива.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_i\) (\(1 \leq a_i \leq 10^9\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2\cdot10^5\).

Выходные данные

Для каждого набора выведите «YES» (без кавычек), если массив является долиной, и «NO» (без кавычек) в противном случае.

Вы можете вывести ответ в любом случае (например, строки «YEs», «Yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Первые три набора входных данных примера разобраны в условии.

B. Уничтожение кольца

жадные алгоритмы Конструктив реализация *1000

Определим циклическую последовательность размера \(n\) как массив \(s\) длины \(n\), в котором \(s_n\) является соседним с \(s_1\).

У Muxii есть кольцо, представленное циклической последовательностью \(a\) размера \(n\).

Сама сущность кольца ненавидит равные соседние элементы. Поэтому, если два соседних элемента в последовательности равны в любой момент времени, один из них будет немедленно стерт. Изначально последовательность не содержит равных соседних элементов.

Muxii может выполнять следующие операции, пока последовательность не станет пустой:

  • Выбрать элемент в \(a\) и стереть его.

Например, если кольцо имеет вид \([1, 2, 4, 2, 3, 2]\), и Muxii стирает элемент \(4\), то кольцо сотрёт один из элементов, равных \(2\), и кольцо примет вид \([1, 2, 3, 2]\).

Muxii хочет найти максимальное количество операций, которые он может выполнить.

Заметим, что в кольце размером \(1\) его единственный элемент не считается соседним с самим собой (поэтому он не стирается сразу).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\leq n\leq 100\)) — размер циклической последовательности.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1\leq a_i\leq n\)) — саму последовательность.

Гарантируется, что \(a_i\ne a_{i+1}\) для \(1\leq i<n\).

Гарантируется, что \(a_n\ne a_1\) при \(n>1\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество операций, которые может выполнить Muxii.

Примечание

В первом наборе входных данных вы можете сначала стереть второй элемент, а затем стереть оставшиеся элементы по одному в любом порядке. Всего можно выполнить эту операцию \(4\) раза. Обратите внимание, что если сначала стереть первый элемент, то последовательность превратится в \([2,3,2]\), а затем сразу станет \([2,3]\).

Во втором наборе входных данных можно сначала стереть первый элемент, тогда последовательность превратится в \([2,1]\). Затем можно стереть все оставшиеся элементы по одному в любом порядке.

B. Сделайте массив хорошим

Конструктив реализация сортировки теория чисел *1100

Массив \(b\) из \(m\) положительных целых чисел называется хорошим, если для всех пар \(i\) и \(j\) (\(1 \leq i,j \leq m\)), значение \(\max(b_i,b_j)\) делится на \(\min(b_i,b_j)\).

Вам дан массив \(a\) из \(n\) положительных целых чисел. Вы можете выполнять следующую операцию:

  • Выберите индекс \(i\) (\(1 \leq i \leq n\)) и целое число \(x\) (\(0 \leq x \leq a_i\)), затем добавьте \(x\) к \(a_i\). Другими словами, \(a_i := a_i+x\).
  • После этой операции должно выполняться \(a_i \leq 10^{18}\).

Постройте последовательность из не более чем \(n\) операций, после которой массив \(a\) будет хорошим. Можно показать, что в ограничениях задачи такая последовательность операций всегда существует.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — длину массива \(a\).

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1 \leq a_i \leq 10^9\)) — массив \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных сначала выведите целое число \(p\) (\(0 \leq p \leq n\)) — количество операций в вашем решении.

Для каждой из следующих \(p\) строк, выведите два целых числа через пробел — \(i\) и \(x\).

Вам не нужно минимизировать число операций. Можно показать, что решение всегда существует.

Примечание

В первом примере массив \(a\) становится после операций равным \([5,5,5,5]\). Легко видеть, что \([5,5,5,5]\) — хороший.

Во втором примере массив \(a\) изначально хороший.

В третьем примере массив \(a\) становится после операций равным \([10,5,350,5,10]\), что является хорошим массивом.

В четвертом примере после выполнения операций массив \(a\) становится равным \([60,10,20]\), что является хорошим массивом.

B. Испепеление

Бинарный поиск математика Перебор реализация сортировки Структуры данных *1200

Для уничтожения человечества, Ассоциация Монстров отправила \(n\) монстров на Землю. \(i\)-й монстр имеет здоровье \(h_i\) и силу \(p_i\).

С его одной атакой, настоящей спиральной испепеляющей пушкой, Генос может нанести \(k\) урона всем живым монстрам. Другими словами, Генос может уменьшить здоровье всех монстров на \(k\) (если \(k > 0\)) одной атакой.

Однако после каждой атаки Геноса монстры продвигаются вперед. Совместными усилиями они уменьшают урон от атаки Геноса на силу \(^\dagger\)самого слабого монстра \(^\ddagger\)оставшегося в живых. Иными словами, минимальное значение \(p_i\) по всем живым в текущий момент монстрам вычитается из \(k\) после каждой атаки.

\(^\dagger\)Самый слабый монстр — это тот, у кого наименьшая сила.

\(^\ddagger\)Монстр жив, если его здоровье строго больше \(0\).

Удастся ли Геносу убить всех монстров?

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Описания данных следуют далее.

Первая строка каждого набора входных данных содержит два целых числа, \(n\) и \(k\) (\(1 \le n, k \le 10^5\)) — количество монстров и начальный урон от атаки Геноса. Затем следуют две строки, каждая из которых содержит \(n\) целых чисел, описывающих массивы \(h\) и \(p\) (\(1 \le h_i, p_i \le 10^9\)).

Гарантируется, что сумма \(n\)по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ — «YES» (без кавычек) если Генос может убить всех монстров и «NO» в противном случае.

Примечание

В первом примере, после первой атаки Геноса, \(h\) и \(k\) станут:

  • \(h: [11,0,6,2,3,0]\)
  • \(k: 7-1 = 6\)
После второй атаки:
  • \(h: [5,0,0,0,0,0]\)
  • \(k: 6-2 = 4\)
После третьей атаки:
  • \(h: [1,0,0,0,0,0]\)
  • \(k: 4-2 = 2\)
После четвертой атаки:
  • \(h: [0,0,0,0,0,0]\)
Поскольку Генос может убить всех монстров, ответ YES.

D. Допустимые битонические перестановки

дп Комбинаторика математика реализация теория чисел *2200

Вам дано пять целых чисел \(n\), \(i\), \(j\), \(x\), и \(y\). Найдите количество битонических перестановок \(B\), чисел от \(1\) до \(n\), таких, что \(B_i=x\), и \(B_j=y\). Так как ответ может быть очень большим, выведите его по модулю \(10^9+7\).

Битоническая перестановка — это перестановка чисел, такая, что элементы перестановки сначала увеличиваются до определенного индекса \(k\), \(2 \le k \le n-1\), а затем уменьшайте до конца. Обратитесь к примечаниям для получения дополнительных разъяснений.

Входные данные

В первой строке содержится одно целое число \(t\) (\(1 \le t \le 100\)) —количество наборов входных данных.

В единственной строке набора входных данных содержатся целые числа, \(n\), \(i\), \(j\), \(x\), и \(y\) (\(3 \le n \le 100\) и \(1 \le i,j,x,y \le n\)).

Гарантируется, что \(i < j\) и \(x \ne y\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую количество битонических перестановок, удовлетворяющих вышеуказанным условиям по модулю \(10^9+7\).

Примечание

Перестановка — это массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в любом порядке. Например, \([2,3,1,5,4]\) это перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но \(4\) встречается в массиве).

Массив из \(n \ge 3\) элементов битонический, если его элементы сначала увеличиваются до индекса \(k\), \(2 \le k \le n-1\), а затем уменьшается до конца. Например, \([2,5,8,6,1]\) это битонический массив с \(k=3\), но \([2,5,8,1,6]\) не битонический массив (элементы сначала возрастают до \(k=3\), затем убывают, а затем возрастают снова).

Битоническая перестановка — это перестановка, в которой элементы следуют вышеупомянутому битоническому свойству. Например, \([2,3,5,4,1]\) является битонической перестановкой, но \([2,3,5,1,4]\) не является битонической перестановкой (поскольку это не битонический массив) и \([2,3,4,4,1]\)также не является битонической перестановкой (поскольку это не перестановка).

Объяснение примера из условий

Для \(n=3\), возможные перестановки это \([1,2,3]\), \([1,3,2]\), \([2,1,3]\), \([2,3,1]\), \([3,1,2]\), и \([3,2,1]\). Среди приведенных перестановок битоническими перестановками являются \([1,3,2]\) и \([2,3,1]\).

В первом тестовом примере ожидаемая перестановка должна иметь вид \([2,?,3]\), который не удовлетворяет ни одной из двух битонических перестановок с \(n=3\), следовательно, ответ равен 0.

Во втором тестовом примере ожидаемая перестановка должна иметь вид \([?,3,2]\), который удовлетворяет только битонической перестановке \([1,3,2]\), следовательно, ответ 1.

H. Hospital Queue

Бинарный поиск графы жадные алгоритмы реализация *2200

There are \(n\) people (numbered from \(1\) to \(n\)) signed up for a doctor's appointment. The doctor has to choose in which order he will appoint these people. The \(i\)-th patient should be appointed among the first \(p_i\) people. There are also \(m\) restrictions of the following format: the \(i\)-th restriction is denoted by two integers \((a_i, b_i)\) and means that the patient with the index \(a_i\) should be appointed earlier than the patient with the index \(b_i\).

For example, if \(n = 4\), \(p = [2, 3, 2, 4]\), \(m = 1\), \(a = [3]\) and \(b = [1]\), then the only order of appointment of patients that does not violate the restrictions is \([3, 1, 2, 4]\). For \(n =3\), \(p = [3, 3, 3]\), \(m = 0\), \(a = []\) and \(b = []\), any order of appointment is valid.

For each patient, calculate the minimum position in the order that they can have among all possible orderings that don't violate the restrictions.

Input

The first line contains two integers \(n\) and \(m\) (\(1 \le n \le 2000\); \(0 \le m \le 2000\)).

The second line contains \(n\) integers \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\)).

Then \(m\) lines follow. The \(i\)-th of them contains two integers \(a_i\) and \(b_i\) (\(1 \le a_i, b_i \le n\); \(a_i \ne b_i\)). All pairs of \((a_i, b_i)\) are distinct (i. e. if \(i \ne j\), then either \(a_i \ne a_j\), \(b_i \ne b_j\), or both).

Additional constraint on the input: there is at least one valid order of patients.

Output

Print \(n\) integers, where \(i\)-th integer is equal to the minimum position of \(i\)-th patient in the order, among all valid orders. Positions in the order are numbered from \(1\) to \(n\).

Note

In the first example, \([3, 1, 2, 4]\) the only one valid order, so the minimum position of each patient is equal to their position in this order.

In the second example, any order is valid, so any patient can be appointed first.

In the third example, there are three valid orders: \([4, 2, 3, 1, 5]\), \([3, 4, 2, 1, 5]\) and \([4, 3, 2, 1, 5]\).

I. Infinite Chess

кратчайшие пути реализация *2800

The black king lives on a chess board with an infinite number of columns (files) and \(8\) rows (ranks). The columns are numbered with all integer numbers (including negative). The rows are numbered from \(1\) to \(8\).

Initially, the black king is located on the starting square \((x_s, y_s)\), and he needs to reach some target square \((x_t, y_t)\). Unfortunately, there are also white pieces on the board, and they threaten the black king. After negotiations, the white pieces agreed to let the black king pass to the target square on the following conditions:

  • each turn, the black king makes a move according to the movement rules;
  • the black king cannot move to a square occupied by a white piece;
  • the black king cannot move to a square which is under attack by any white piece. A square is under attack if a white piece can reach it in one move according to the movement rules;
  • the white pieces never move.

Help the black king find the minimum number of moves needed to reach the target square while not violating the conditions. The black king cannot leave the board at any time.

The black king moves according to the movement rules below. Even though the white pieces never move, squares which they can reach in one move are considered to be under attack, so the black king cannot move into those squares.

Below are the movement rules. Note that the pieces (except for the knight) cannot jump over other pieces.

  • a king moves exactly one square horizontally, vertically, or diagonally.
  • a rook moves any number of vacant squares horizontally or vertically.
  • a bishop moves any number of vacant squares diagonally.
  • a queen moves any number of vacant squares horizontally, vertically, or diagonally.
  • a knight moves to one of the nearest squares not on the same rank, file, or diagonal (this can be thought of as moving two squares horizontally then one square vertically, or moving one square horizontally then two squares vertically — i. e. in an "L" pattern). Knights are not blocked by other pieces, they can simply jump over them.

There are no pawns on the board.

King and knight possible moves, respectively. Dotted line shows that knight can jump over other pieces.
Queen, bishop, and rook possible moves, respectively.
Input

The first line contains two integers \(x_s\) and \(y_s\) (\(1 \le x_s \le 10^8\); \(1 \le y_s \le 8\)) — the starting coordinates of the black king.

The second line contains two integers \(x_t\) and \(y_t\) (\(1 \le x_t \le 10^8\); \(1 \le y_t \le 8\)) — the coordinates of the target square for the black king.

The third line contains one integer \(n\) (\(0 \le n \le 2000\)) — the number of white pieces on the board.

Then \(n\) lines follow, the \(i\)-th line contains one character \(t_i\) and two integers \(x_i\) and \(y_i\) (\(1 \le x_i \le 10^8\); \(1 \le y_i \le 8\)) — the type and the coordinates of the \(i\)-th white piece. The types of pieces are represented by the following uppercase Latin letters:

  • K — king
  • Q — queen
  • R — rook
  • B — bishop
  • N — knight

There can be any number of white pieces of any type listed above on the board, for example, \(3\) white kings or \(4\) white queens. There are no pawns on the board.

Additional constrains on the input:

  • no square is occupied by more than one white piece;
  • the starting square for the black king is different from the square he wants to reach, and neither of these two squares is occupied or is under attack by any white piece.
Output

Print one integer — the minimum number of moves needed for the black king to reach the target square while not violating the conditions, or \(-1\) if it is impossible.

Note

The image below demonstrates the solution for the second example. Here, the letters K, R, s, and t represent the white king, the white rook, the starting square, and the target square, respectively. Bold crosses mark the squares which are under attack by the white pieces. Bold dots show the shortest path for the black king.

L. Project Manager

Перебор реализация Структуры данных *2400

There are \(n\) employees at Bersoft company, numbered from \(1\) to \(n\). Each employee works on some days of the week and rests on the other days. You are given the lists of working days of the week for each employee.

There are regular days and holidays. On regular days, only those employees work that have the current day of the week on their list. On holidays, no one works. You are provided with a list of days that are holidays. The days are numbered from \(1\) onwards, day \(1\) is Monday.

The company receives \(k\) project offers they have to complete. The projects are numbered from \(1\) to \(k\) in the order of decreasing priority.

Each project consists of multiple parts, where the \(i\)-th part must be completed by the \(a_i\)-th employee. The parts must be completed in order (i. e. the \((i+1)\)-st part can only be started when the \(i\)-th part is completed). Each part takes the corresponding employee a day to complete.

The projects can be worked on simultaneously. However, one employee can complete a part of only one project during a single day. If they have a choice of what project to complete a part on, they always go for the project with the highest priority (the lowest index).

For each project, output the day that project will be completed on.

Input

The first line contains three integers \(n, m\) and \(k\) (\(1 \le n, m, k \le 2 \cdot 10^5\)) — the number of employees, the number of holidays and the number of projects.

The \(i\)-th of the next \(n\) lines contains the list of working days of the \(i\)-th employee. First, a single integer \(t\) (\(1 \le t \le 7\)) — the number of working days. Then \(t\) days of the week in the increasing order. The possible days are: "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday".

The next line contains \(m\) integers \(h_1, h_2, \dots, h_m\) (\(1 \le h_1 < h_2 < \dots < h_m \le 10^9\)) — the list of holidays.

The \(j\)-th of the next \(k\) lines contains a description of the \(j\)-th project. It starts with an integer \(p\) (\(1 \le p \le 2 \cdot 10^5\)) — the number of parts in the project. Then \(p\) integers \(a_1, a_2, \dots, a_p\) (\(1 \le a_x \le n\)) follow, where \(p_i\) is the index of the employee that must complete the \(i\)-th part.

The total number of parts in all projects doesn't exceed \(2 \cdot 10^5\).

Output

Print \(k\) integers — the \(j\)-th value should be equal to the day the \(j\)-th project is completed on.

A. Суперкруглые числа

Перебор реализация *800

Назовем целое положительное число суперкруглым, если в нем только одна цифра отлична от нуля. Например, числа \(5000\), \(4\), \(1\), \(10\), \(200\) — суперкруглые; \(42\), \(13\), \(666\), \(77\), \(101\) — не суперкруглые.

Вам дано целое число \(n\). Найдите количество таких суперкруглых чисел \(x\), что \(1 \le x \le n\).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Затем следуют \(t\) строк. В \(i\)-й из них задано одно целое число \(n\) (\(1 \le n \le 999999\)) — описание \(i\)-го набора входных данных.

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество таких суперкруглых \(x\), что \(1 \le x \le n\).

B. Notepad#

реализация *1000

Вы хотите набрать строку \(s\), состоящую из \(n\) строчных латинских букв, в вашем любимом текстовом редакторе Notepad#.

Notepad# поддерживает два типа операций:

  • дописать любую букву в конец строки;
  • скопировать непрерывную подстроку уже напечатанной строки и вставить эту подстроку в конец строки.

Можете ли вы набрать строку \(s\) строго меньше, чем за \(n\) операций?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина строки \(s\).

Во второй строке записана строка \(s\), состоящая из \(n\) строчных латинских букв.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите «YES», если вы можете набрать строку \(s\) строго меньше, чем за \(n\) операций. В противном случае выведите «NO».

Примечание

В первом наборе входных данных можно начать с набора «codef» (\(5\) операций), затем скопировать «o» (\(1\) операций) из уже набранной части, затем завершить набором «rces» (\(4\) операции). Это будет \(10\) операций, что не строго меньше \(n\). Существуют и другие способы набрать «codeforces». Однако, что бы вы ни делали, нельзя это сделать меньше, чем за \(n\) операций.

Во втором наборе входных данных можно набрать «labac» (\(5\) операций), затем скопировать «aba» (\(1\) операция), завершив строку за \(6\) операций.

C. Гамильтонова стена

дп реализация *1300

Сэр Монокарп Гамильтон планирует покрасить свою стену. Стену можно представить как сетку, состоящую из \(2\) строк и \(m\) столбцов. Изначально стена полностью белая.

Монокарп хочет нарисовать на стене черное изображение. В частности он хочет, чтобы клетка \((i, j)\) (\(j\)-я клетка в \(i\)-й строке) была покрашена в черный, если \(c_{i, j} =\) 'B', и была оставлена белой, если \(c_{i, j} =\) 'W'. Кроме того он хочет, чтобы в каждом столбце была хотя бы одна черная клетка, поэтому для каждого \(j\) выполняется следующее условие: \(c_{1, j}\), \(c_{2, j}\) или они обе равны 'B'.

Чтобы картинка получилась ровной, Монокарп хочет поставить кисть в какую-нибудь клетку \((x_1, y_1)\) и провести ей по пути \((x_1, y_1), (x_2, y_2), \dots, (x_k, y_k)\) так, чтобы:

  • для каждого \(i\) \((x_i, y_i)\) и \((x_{i+1}, y_{i+1})\) имели общую сторону;
  • все чёрные клетки встречались в пути ровно по одному разу;
  • в пути не встречались белые клетки.

Определите, может ли Монокарп покрасить стену.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(m\) (\(1 \le m \le 2 \cdot 10^5\)) — количество столбцов в стене.

В \(i\)-й из следующих двух строк записана строка \(c_i\), состоящая из \(m\) символов, где каждый символ — это 'B' или 'W'. \(c_{i, j}\) равно 'B', если клетка \((i, j)\) должна быть покрашена черным, и 'W', если клетка \((i, j)\) должна быть оставлена белой.

Кроме того, для каждого \(j\) выполняется следующее условие: \(c_{1, j}\), \(c_{2, j}\) или они обе равны 'B'.

Сумма \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите «YES», если Монокарп может покрасить стену. В противном случае выведите «NO».

Примечание

В первом наборе входных данных Монокарп может провести кистью по пути \((2, 1)\), \((2, 2)\), \((1, 2)\), \((1, 3)\). Все черные клетки встречаются в пути ровно один раз, никакая белая клетка не встречается в пути.

Во втором наборе входных данных Монокарп может воспользоваться путем \((1, 1)\), \((2, 1)\).

В третьем наборе входных данных:

  • путь \((1, 1)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((1, 3)\), \((2, 4)\), \((2, 5)\), \((1, 5)\) не подходит, потому что пара клеток \((1, 3)\) и \((2, 4)\) не имеют общую сторону;
  • путь \((1, 1)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((1, 3)\), \((2, 3)\), \((2, 4)\), \((2, 5)\), \((1, 5)\) не подходит, потому что клетка \((2, 3)\) посещается дважды;
  • путь \((1, 1)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((2, 4)\), \((2, 5)\), \((1, 5)\) не подходит, потому что черная клетка \((1, 3)\) не встречается в пути;
  • путь \((1, 1)\), \((2, 1)\), \((2, 2)\), \((2, 3)\), \((2, 4)\), \((2, 5)\), \((1, 5)\), \((1, 4)\), \((1, 3)\) не подходит, потому что белая клетка \((1, 4)\) встречается в пути.

A. Разрежь треугольник

реализация *800

Дан невырожденный треугольник (невырожденный треугольник — это треугольник, площадь которого не равна нулю). Вершины треугольника находятся в точках \((x_1, y_1)\), \((x_2, y_2)\) и \((x_3, y_3)\).

Вы должны провести прямую, которая разрежет треугольник на ровно два невырожденных треугольника. Кроме того, прямая, которую вы проведете, должна быть либо горизонтальной, либо вертикальной.

Можете ли вы провести прямую так, чтобы выполнить все условия?

На следующей картинке изображены несколько способов провести прямую так, чтобы она удовлетворяла всем условиям:

На следующей картинке изображены некорректные способы провести прямую (первая прямая разрезает треугольник на треугольник и четырехугольник; вторая вообще не разрезает треугольник; третья не является ни горизонтальной, ни вертикальной):

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из четырех строк. Первая из них — пустая. В \(i\)-й из следующих трех строк заданы два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le 10^8\)) — координаты \(i\)-й вершины треугольника.

Дополнительное ограничение на входные данные: в каждом наборе входных данных у треугольника ненулевая площадь (то есть он является невырожденным).

Выходные данные

Для каждого набора входных данных выведите YES, если можно разрезать треугольник описанным в условии способом. В противном случае выведите NO. Каждую букву можно выводить в любом регистре (например, YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

C. Поэлементное ограничение

жадные алгоритмы Конструктив реализация сортировки *1300

Вам дан массив целых чисел \(a\) длины \(n\).

Найдите две перестановки\(^\dagger\) \(p\) и \(q\) длины \(n\) такие, что \(\max(p_i,q_i)=a_i\) для всех \(1 \leq i \leq n\) или сообщите, что таких \(p\) и \(q\) не существует.

\(^\dagger\) Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но в массиве присутствует \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержится одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина перестановки.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1 \leq a_i \leq n\)) — массив \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если не существует \(p\) и \(q\), удовлетворяющих условиям, выведите «NO» (без кавычек).

В противном случае выведите «YES» (без кавычек), затем выведите \(2\) строки. Первая строка должна содержать \(n\) целых \(p_1,p_2,\ldots,p_n\), а вторая строка должна содержать \(n\) целых \(q_1,q_2,\ldots,q_n\).

Если существует несколько решений, вы можете вывести любое из них.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных \(p=q=[1]\). Это верно, так как \(a_1 = max(p_1,q_1) = 1\).

Во втором наборе \(p=[1,3,4,2,5]\) и \(q=[5,2,3,1,4]\). Эти массивы удовлетворяют условию, так как:

  • \(a_1 = \max(p_1, q_1) = \max(1, 5) = 5\),
  • \(a_2 = \max(p_2, q_2) = \max(3, 2) = 3\),
  • \(a_3 = \max(p_3, q_3) = \max(4, 3) = 4\),
  • \(a_4 = \max(p_4, q_4) = \max(2, 1) = 2\),
  • \(a_5 = \max(p_5, q_5) = \max(5, 4) = 5\).

В третьем наборе можно показать, что таких \(p\) и \(q\) не существует.

B1. Копирование файлов I

*особая задача математика Перебор реализация *1000

В этой версии задачи размеры копируемых файлов не превышают \(1000\) байт.

Вы копируете с одного сервера на другой \(n\) файлов размером \(a_1, a_2, \ldots, a_n\) байт. Файлы копируются последовательно в заданном порядке.

При копировании вы видите два прогресс-бара: первый показывает процент скопированных данных в текущем файле, а второй — общий процент скопированных данных по всем \(n\) файлам. Оба процента отображаются округлёнными вниз до целого числа. Значения на прогресс-барах обновляются после копирования каждого байта.

Формально, после копирования байта номер \(x\) из файла номер \(i\) первый прогресс-бар показывает \(\lfloor \frac{100 \cdot x}{a_i} \rfloor\) процентов, а второй — \(\lfloor \frac{100 \cdot (a_1 + a_2 + \ldots + a_{i - 1} + x)}{a_1 + a_2 + \ldots + a_n} \rfloor\) процентов. В самом начале копирования оба прогресс-бара показывают \(0\) процентов.

Найдите все такие целые числа от \(0\) до \(100\) включительно, что существует момент времени, в который оба прогресс-бара одновременно показывают это число. Выведите эти числа в порядке возрастания.

Входные данные

В первой строке задано одно целое число \(n\) (\(1 \le n \le 100\)) — число копируемых файлов.

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 1000\)) — размеры файлов в байтах в том порядке, в котором они будут копироваться.

Выходные данные

Выведите в возрастающем порядке все числа от \(0\) до \(100\) включительно такие, что существует момент времени, в который на обоих прогресс-барах одновременно показывается это число.

Примечание

В первом тесте копируется всего один файл, поэтому оба прогресс-бара всегда показывают одинаковые значения.

Во втором тесте первый прогресс-бар сразу же уйдёт вперёд, потом сбросится в ноль и начнёт догонять второй прогресс-бар заново. В конце копирования прогресс-бары некоторое время будут показывать одно и то же число.

A1. Хорошие элементы матрицы

реализация *800

Умный Бобер из ABBYY увлекся изучением квадратных матриц. Сейчас он занят исследованием матрицы размера n × n, где n — нечетно. Умный Бобер считает хорошими следующие элементы матрицы:

  • Элементы главной диагонали.
  • Элементы побочной диагонали.
  • Элементы «средней» строки — строки, ниже которой и выше которой находится ровно по строк.
  • Элементы «среднего» столбца — столбца, левее которого и правее которого находится ровно по столбцов.
На рисунке изображена матрица 5 × 5. Зеленым цветом отмечены хорошие элементы.

Помогите Умному Бобру подсчитать сумму хороших элементов заданной матрицы.

Входные данные

Первая строка входных данных содержит единственное целое нечетное число n. Следующие n строк входных данных содержат по n целых чисел aij (0 ≤ aij ≤ 100), разделенных единичными пробелами, — элементы заданной матрицы.

Ограничения на входные данные для получения 30 баллов:

  • 1 ≤ n ≤ 5

Ограничения на входные данные для получения 100 баллов:

  • 1 ≤ n ≤ 101
Выходные данные

Выведите единственное целое число — сумму хороших элементов матрицы.

Примечание

В первом примере хорошими будут все элементы матрицы. Хорошие элементы матрицы из второго примера изображены на рисунке.

D. Косия и игра

графы игры Конструктив Паросочетания поиск в глубину и подобное Потоки реализация снм Структуры данных *2000

Косия и Махиру играют в игру с тремя массивами \(a\), \(b\) и \(c\) длины \(n\). Каждый элемент \(a\), \(b\) и \(c\) — целое число от \(1\) до \(n\) включительно.

Игра состоит из \(n\) раундов. В \(i\)-м раунде они делают следующие ходы:

  • Пусть \(S\) — мультимножество \(\{a_i, b_i, c_i\}\).
  • Косия удаляет один из элементов \(S\) по своему выбору.
  • Затем Махиру выбирает одно из двух оставшихся в \(S\) чисел.

Пусть \(d_i\) — число, выбранное Махиру в \(i\)-м раунде. Если \(d\) является перестановкой\(^\dagger\), Косия выигрывает. Иначе выигрывает Махиру.

Сейчас выбраны только массивы \(a\) и \(b\). Являясь ярым поклонником Косии, вы хотите выбрать массив \(c\) так, чтобы Косия выиграла. Вычислите количество таких \(c\) по модулю \(998\,244\,353\).

Обратите внимание, что Косия и Махиру играют оптимально.

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 2 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq {10}^5\)) — размеры массивов.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq n\)).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \leq b_i \leq n\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \({10}^5\).

Выходные данные

Выведите одно целое число — количество массивов \(c\), при которых выигрывает Косия, по модулю \(998\,244\,353\).

Примечание

В первом примере есть \(6\) массивов \(c\), при которых выигрывает Косия: \([1, 2, 3]\), \([1, 3, 2]\), \([2, 2, 3]\), \([2, 3, 2]\), \([3, 2, 3]\), \([3, 3, 2]\).

Во втором примере можно показать, что нет массивов \(c\), при которых выигрывает Косия.

E. Хоссам и буква

дп Перебор реализация *2500

Хоссам купил новый участок земли длины \(n\) и ширины \(m\), он поделил его на \(n \cdot m\) квадратов, каждый из которых имеет размер \(1\times1\).

Так как имя Хоссам начинается с латинской буквы 'H', он хочет нарисовать большую букву 'H' путем построения стен размера \(1\times1\) на некоторых квадратах земли. Каждый квадрат земли \(1\times1\) может быть одного из трех типов: идеальный, средний, или плохой.

Процесс возведения стен для формирования буквы 'H' имеет следующие ограничения:

  • Буква должна состоять из одной горизонтальной и двух вертикальных линий.
  • Вертикальные линии не должны находиться в одном и том же или соседних столбцах.
  • Вертикальные линии должны начинаться в одной строке и заканчиваться в одной строке (и, следовательно, иметь одинаковую длину).
  • Горизонтальная линия должна соединять вертикальные линии, но не должна пересекать их.
  • Горизонтальная линия может находиться в любом ряду между вертикальными линиями (не только в середине), кроме верхней и нижней. (С горизонтальной линией в верхнем ряду буква выглядит как 'n', а в нижнем ряду как 'U'.)
  • Запрещается возводить стены в квадратах плохого качества.
  • Вы можете использовать не более одного квадрата среднего качества.
  • Вы можете использовать любое количество квадратов идеального качества.

Найдите максимальное количество стен, которые можно использовать для рисования буквы 'H'.

Смотрите примечание для получения дополнительных разъяснений.

Входные данные

Первая строка ввода содержит два целых числа \(n\), \(m\) (\(1 \le n, m \le 400\)).

Следующие \(n\) строк содержат \(m\) символов, описывающих участок. Символ '.' кодирует квадрат превосходного качества, 'm' — среднего качества, '#' — плохого качества.

Выходные данные

Выведите одно целое число — максимальное число стен в букве 'H'.

Если никак не возможно написать букву 'H', выведите \(0\).

Примечание

В первом тестовом примере никак не возможно написать букву 'H'.

Во втором примере, картинка показывает участок и некоторые допустимые буквы 'H'. Идеальные, средние, и плохие квадраты выделены белым, желтым, и черным цветом соответственно.

A. A+B?

реализация *800

Вам дано выражение \(a{+}b\), где \(a\) и \(b\) — целые числа от \(0\) до \(9\). Вы должны вычислить его и вывести результат.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки вида \(a{+}b\) (\(0 \le a, b \le 9\), \(a\) и \(b\) — целые числа). Числа не отделены от символа \(+\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — результат выражения.

B. Поворот матрицы

Перебор реализация *800

У вас есть матрица \(2 \times 2\), заполненная различными целыми числами. Вы хотите, чтобы ваша матрица стала красивой. Матрица является красивой, если выполняются следующие условия:

  • в каждой строке первый элемент меньше второго;
  • в каждом столбце первый элемент меньше второго.

Вы можете совершать следующую операцию любое количество раз: повернуть матрицу на \(90\) градусов по часовой стрелке, так, что левый верхний элемент сдвигается в правую верхнюю ячейку, правый верхний элемент сдвигается в правую нижнюю ячейку, и так далее:

Определите, можно ли сделать матрицу красивой, выполнив ноль или более операций.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк; каждая из этих строк содержит по два целых числа — элементы соответствующей строки матрицы. В каждой матрице все элементы — различные целые числа от \(1\) до \(100\).

Выходные данные

Для каждого набора входных данных выведите YES, если матрица может стать красивой. В противном случае выведите NO. Каждую букву можно выводить в любом регистре (YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

F. Копия копии копии

графы Конструктив поиск в глубину и подобное реализация сортировки *2000

Все началось с черно-белой картинки, которую можно представить как матрицу \(n \times m\) такую, что все ее элементы равны \(0\) или \(1\). Строки пронумерованы от \(1\) до \(n\), столбцы пронумерованы от \(1\) до \(m\).

Над картинкой проделали несколько операций (возможно, ноль), каждая — одного из двух типов:

  • выбрать ячейку такую, что она не находится на границе (строка не \(1\) и не \(n\), столбец не \(1\) и не \(m\)) и она окружена четырьмя ячейками противоположного цвета (четырьмя нулями, если она единица, и наоборот), и перекрасить ее саму в противоположный цвет;
  • сделать копию текущей картинки.

Обратите внимание, что порядок операций мог быть произвольным, они могут не чередоваться.

Вам сообщили результат: все \(k\) копий, которые были сделаны. Кроме того, вам сообщили первоначальную картинку. Однако, все эти \(k+1\) картинки были перемешаны.

Восстановите последовательность операций. Если существует несколько ответов, то выведите любой из них. Тесты построены из реальной последовательности операций, т. е. хотя бы один ответ всегда существует.

Входные данные

В первой строке записаны три целых числа \(n, m\) и \(k\) (\(3 \le n, m \le 30\); \(0 \le k \le 100\)) — количество строк, количество столбцов и количество сделанных копий, соответственно.

Затем следуют \(k+1\) картинок — \(k\) копий и первоначальная. Их порядок произвольный.

Каждая картинка состоит из \(n\) строк, в каждой по \(m\) символов, каждый символ — это \(0\) или \(1\). Перед каждой картинкой идет пустая строка.

Выходные данные

В первой строке выведите одно целое число — номер первоначальной картинки. Картинки пронумерованы от \(1\) до \(k+1\) в порядке, в котором они заданы во входных данных.

Во второй строке выведите одно целое число \(q\) — количество операций.

В каждой из следующих \(q\) строк должна быть записана одна операция. Операции должны быть перечислены в том порядке, в котором они применялись. Каждая операция может быть одного из двух типов:

  • \(1\) \(x\) \(y\) — перекрасить ячейку \((x, y)\) (\(y\)-я ячейка в \(x\)-й строке, она не должна лежать на границу и должна быть окружена четырьмя клетками противоположного от себя цвета);
  • \(2\) \(i\) — сделать копию текущей картинки и присвоить ей номер \(i\) (картинка под номером \(i\) должна совпадать с текущей картинкой).

Каждый номер от \(1\) до \(k+1\) должен встречаться в выводе ровно один раз — один из них — это номер первоначальной картинки, остальные \(k\) — аргументы операций второго типа.

Если существует несколько ответов, то выведите любой из них. Тесты построены из реальной последовательности операций, т. е. хотя бы один ответ всегда существует.

G. Поднятие рейтинга

Бинарный поиск жадные алгоритмы математика реализация сортировки *2200

Монокарп играет в шахматы на одном популярном сайте. На этом сайте у него есть \(n\) соперников. Рейтинг \(i\)-го соперника равен \(a_i\). Изначальный рейтинг Монокарпа равен \(x\). Монокарп хочет достичь рейтинга \(y\) (\(y > x\)).

Когда Монокарп играет партию, он побеждает, если его текущий рейтинг больше или равен рейтинга противника. В случае победы рейтинг Монокарпа повышается на \(1\), в случае поражения — понижается на \(1\). Рейтинг его противника не меняется.

Монокарп хочет за минимальное кол-во партий достигнуть рейтинга \(y\). Но сайт не позволяет ему легко набирать рейтинг в играх против слабых игроков, требуя, чтобы Монокарп играл со всеми противниками примерно равное количество партий. Формально, Монокарп может сыграть партию с противником \(i\) только если нет другого противника \(j\) такого, что Монокарп сыграл против \(i\) больше раз, чем против \(j\).

Посчитайте минимальное кол-во партий, которое нужно сыграть Монокарпу, чтобы достичь рейтинга \(y\), или скажите, что это невозможно. Заметьте, что рейтинги противников Монокарпа остаются неизменными, в отличие от рейтинга самого Монокарпа.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора заданы три целых числа \(n\), \(x\) и \(y\) (\(1 \le n \le 2 \cdot 10^5\); \(1 \le x < y \le 10^{12}\)) — количество противников Монокарпа, его первоначальный и желаемый рейтинги.

Во второй строке каждого набора заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^{12}\)) — рейтинги противников Монокарпа.

Гарантируется, что сумма \(n\) по всем \(t\) наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — минимальное количество партий, которые нужно сыграть Монокарпу, чтобы получить рейтинг \(y\), или \(-1\), если достичь данного рейтинга невозможно.

Примечание

В первом наборе входных данных, Монокарп может использовать следующую стратегию:

  1. Монокарп играет против \(2\)-го соперника и увеличивает рейтинг (\(2 \to 3\));
  2. Монокарп играет против \(1\)-го соперника и увеличивает рейтинг (\(3 \to 4\));
  3. Монокарп играет против \(4\)-го соперника и увеличивает рейтинг (\(4 \to 5\));
  4. Монокарп играет против \(5\)-го соперника и увеличивает рейтинг (\(5 \to 6\));
  5. Теперь Монокарп должен сыграть с оставшимися тремя соперниками. Он проиграет \(3\) раза и получит рейтинг \(3\) (\(6 \to 5 \to 4 \to 3\));
  6. После этого Монокарп повторит шаги 1-5 два раза. После \(14\) партий получится, что он сыграл дважды к каждым противников и его финальный рейтинг равен \(4\).
  7. Монокарп играет против \(1\)-го соперника и увеличивает рейтинг (\(4 \to 5\));
  8. Монокарп играет против \(2\)-го соперника и увеличивает рейтинг (\(5 \to 6\));
  9. Монокарп играет против \(4\)-го соперника и увеличивает рейтинг (\(6 \to 7\));
  10. Монокарп играет против \(5\)-го соперника и увеличивает рейтинг (\(7 \to 8\));
  11. Монокарп играет против \(7\)-го соперника и увеличивает рейтинг (\(8 \to 9\));
  12. Монокарп играет против \(3\)-го соперника и увеличивает рейтинг (\(9 \to 10\));
В результате Монокарп сыграл дважды с \(6\)-м противником и трижды со всеми остальными, получив рейтинг \(10\) за \(14 + 6 = 20\) партий.

Во втором наборе можно показать, что какие бы партии не сыграл Монокарп, он не сможет получить рейтинг выше \(4\).

D. Одинаковое число единиц

жадные алгоритмы Конструктив Перебор реализация *1600

ChthollyNotaSeniorious получил специальный подарок от AquaMoon: \(n\) бинарных массивов длины \(m\). AquaMoon говорит ему, что за одну операцию он может выбрать любые два массива и любую позицию \(pos\) от \(1\) до \(m\) и поменять местами элементы на позициях \(pos\) в этих массивах.

Его увлекла эта игра, и он хочет найти минимальное количество операций, которые необходимо выполнить, чтобы количество \(1\) во всех массивах было одинаковым. Он пригласил вас принять участие в этой интересной игре, поэтому, пожалуйста, попробуйте найти его!

Если это возможно, пожалуйста, выведите конкретные шаги обмена в формате, описанном в разделе выходных данных. В противном случае, пожалуйста, выведите \(-1\).

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \leq t \leq 2\cdot 10^4\))  — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 10^5\), \(2 \leq m \leq 10^5\)).

В \(i\)-й из следующих \(n\) строк содержится \(m\) целых чисел \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, m}\) \((0 \le a_{i, j} \le 1)\)  — элементы \(i\)-го массива.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превышает \(10^6\).

Выходные данные

Для каждого набора входных данных, если цель недостижима, выведите \(-1\).

В противном случае в первой строке выведите \(k\) \((0 \le k \le mn)\)  — минимальное необходимое количество операций.

\(i\)-я из следующих \(k\) строк должна содержать \(3\) целых числа \(x_i, y_i, z_i\) \((1 \le x_i, y_i \le n, 1 \le z_i \le m)\), которые описывают операцию, которая меняет местами \(a_{x_i, z_i}, a_{y_i, z_i}\): меняет местами \(z_i\)-е числа \(x_i\)-го и \(y_i\)-го массивов.

Примечание

В первом наборе входных данных достаточно выполнить одну операцию: поменять местами первый элемент во второй и первой строках. Массивы станут \([0, 1, 1, 0], [1, 0, 1, 0], [1, 0, 0, 1]\), каждый из которых содержит ровно две \(1\).

F1. Фокусник и свиньи (простая версия)

Перебор реализация Структуры данных *2400

Это простая версия задачи. Единственное различие между двумя версиями  — это ограничения на \(n\) и \(x\). Вы можете делать взломы, только если обе версии задачи решены.

Little09 давно интересуется магией, и как же ему повезло, что он встречает фокусника! Фокусник выполнит \(n\) операций, каждая из которых является одной из следующих трех:

  • \(1\ x\): Создать свинью с \(x\) очками здоровья.
  • \(2\ x\): Уменьшить очки здоровья всех живых свиней на \(x\).
  • \(3\): Повторить все предыдущие операции. Формально, предполагая, что это \(i\)-я операция в последовательности операций, выполните по очереди первые \(i-1\) операций (включая операции «Повторить»).

Свинья умирает, когда ее очки здоровья становятся меньше или равны \(0\).

Little09 хочет знать, сколько живых свиней осталось после всех операций. Пожалуйста, выведите ответ по модулю \(998\,244\,353\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1\leq n\leq 2\cdot 10^5\))  — количество операций.

Каждая из следующих \(n\) строк содержит операцию, заданную в форме, описанной в условии задачи. Гарантируется, что \(1\leq x\leq 2\cdot 10^5\) в операциях первых двух типов.

Выходные данные

Выведите одно целое число  — количество живых свиней после всех операций, по модулю \(998\,244\,353\).

Примечание

В первом примере операции эквивалентны повторению следующего четыре раза: создать свинью с \(8\) очками здоровья, а затем уменьшить очки здоровья всех живых свиней на \(3\). Легко видеть, что в конце остаются две живые свиньи с \(2\) и \(5\) очками здоровья.

F2. Фокусник и свиньи (сложная версия)

Бинарный поиск Перебор реализация Структуры данных *2700

Это сложная версия задачи. Единственное различие между двумя версиями  — это ограничения на \(n\) и \(x\). Вы можете делать взломы, только если обе версии задачи решены.

Little09 давно интересуется магией, и как же ему повезло, что он встречает фокусника! Фокусник выполнит \(n\) операций, каждая из которых является одной из следующих трех:

  • \(1\ x\): Создать свинью с \(x\) очками здоровья.
  • \(2\ x\): Уменьшить очки здоровья всех живых свиней на \(x\).
  • \(3\): Повторить все предыдущие операции. Формально, предполагая, что это \(i\)-я операция в последовательности операций, выполните по очереди первые \(i-1\) операций (включая операции «Повторить»).

Свинья умирает, когда ее очки здоровья становятся меньше или равны \(0\).

Little09 хочет знать, сколько живых свиней осталось после всех операций. Пожалуйста, выведите ответ по модулю \(998\,244\,353\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1\leq n\leq 8\cdot 10^5\))  — количество операций.

Каждая из следующих \(n\) строк содержит операцию, заданную в форме, описанной в условии задачи. Гарантируется, что \(1\leq x\leq 10^9\) в операциях первых двух типов.

Выходные данные

Выведите одно целое число  — количество живых свиней после всех операций, по модулю \(998\,244\,353\).

Примечание

В первом примере операции эквивалентны повторению следующего четыре раза: создать свинью с \(8\) очками здоровья, а затем уменьшить очки здоровья всех живых свиней на \(3\). Легко видеть, что в конце остаются две живые свиньи с \(2\) и \(5\) очками здоровья.

A1. Садовник и капибары (простая версия)

Конструктив Перебор реализация *800

Это простая версия задачи. Различия между версиями заключаются в ограничениях на длину строки. Вы можете делать взломы, только если обе версии задачи сданы.

Казимир Казимирович — марсианский садовник. У него есть огромный сад, в котором растут двоичные сбалансированные яблони.

Недавно Казимир решил завести себе трех капибар. Садовник даже придумал им имена и записал их на листе бумаги. Имя каждой из капибар — непустая строка, состоящая из строчных букв «a» и «b».

Обозначим имена капибар строками \(a\), \(b\) и \(c\). Тогда Казимир записал непустые строки \(a\), \(b\) и \(c\) подряд без пробелов. Например, если капибар звали «aba», «ab» и «bb», то записанная садовником строка будет выглядеть как «abaabbb».

Садовник запомнил интересное свойство: либо строка \(b\) лексикографически не меньше строк \(a\) и \(c\) одновременно, либо строка \(b\) лексикографически не больше строк \(a\) и \(c\) одновременно. Иными словами, либо выполнено \(a \le b\) и \(c \le b\), либо выполнено \(b \le a\) и \(b \le c\) (а возможно, и оба условия одновременно). Здесь \(\le\) обозначает лексикографическое «меньше или равно» для строк. Таким образом, \(a \le b\) значит, что строки должны быть либо равны, либо строка \(a\) должна стоять раньше в словаре, чем строка \(b\). Более подробное объяснение этой операции см. в разделе «Примечание».

Сегодня садовник взглянул на свои записи и понял, что не может восстановить имена, поскольку они записаны без пробелов. Он уже не уверен, сможет ли восстановить оригинальные строки \(a\), \(b\) и \(c\), поэтому ему хочется найти любую тройку имен, которая удовлетворяет описанному выше свойству.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В единственной строке набора входных данных находится строка \(s\) (\(3 \le |s| \le 100\)) — имена капибар, записанные слитно. Строка состоит только из латинских букв «a» и «b».

Гарантируется, что сумма длин строк по всем наборам тестовых данных не превосходит \(500\).

Выходные данные

Для каждого набора входных данных выведите на отдельной строке три строки \(a\), \(b\) и \(c\), разделенные пробелами — имена, при записи которых без пробелов получается строка \(s\). При этом должно выполняться либо \(a \le b\) и \(c \le b\), либо \(b \le a\) и \(b \le c\).

Если способов восстановить имена несколько, то выведите любой из них. Если имена восстановить невозможно, то выведите «:(» (без кавычек).

Примечание

Строка \(x\) лексикографически меньше строки \(y\), если и только если выполняется один из следующих пунктов:

  • \(x\) — префикс \(y\), но \(x \ne y\);
  • в первой позиции, где \(x\) и \(y\) различны, в строке \(x\) находится буква «a», а в строке \(y\) — буква «b».

Теперь перейдем к примерам.

В первом наборе входных данных один из возможных способов разбить строку \(s\) на три строки — это «b», «bb», «a».

В третьем наборе входных данных можно заметить, что разбиение удовлетворяет двум условиям сразу (т. е. \(a \le b\), \(c \le b\), \(b \le a\) и \(b \le c\) верны одновременно).

E. Уравнивание людей

жадные алгоритмы реализация *2100

Мальчик Петя и его друг, Petya++, отправились на BFDMONCON, где сегодня проходит конкурс костюмов.

Проходя по фестивалю, они наткнулись на научный стенд имени профессора Оука и Гольфболла, где им предложили решить интересную задачу.

Дана последовательность из чисел \(a_1, a_2, \dots, a_n\) и вы можете производить несколько операций над этой последовательностью.

Каждая операция должна выглядеть следующим образом. Вы выбираете некоторую подпоследовательность\(^\dagger\). Далее вы называете все числа, находящиеся на нечетных позициях в этой подпоследовательности — северными, а все числа, находящиеся на четных позициях в этой подпоследовательности — южными. При этом учитывается лишь позиция числа в подпоследовательности, а не в исходной последовательности.

Например, рассмотрим последовательность \(1, 4, 2, 8, 5, 7, 3, 6, 9\) и ее подпоследовательность (выделена жирным) \(1, \mathbf{4}, \mathbf{2}, 8, \mathbf{5}, 7, 3, \mathbf{6}, 9\). Тогда числа \(4\) и \(5\) будут северными, а числа \(2\) и \(6\) — южными.

После этого можно выполнить одно из следующих действий:

  • прибавить \(1\) ко всем северным числам и отнять \(1\) от всех южных; или
  • прибавить \(1\) ко всем южным числам и отнять \(1\) от всех северных.

Таким образом, из последовательности \(1, \mathbf{4}, \mathbf{2}, 8, \mathbf{5}, 7, 3, \mathbf{6}, 9\) при выборе описанной выше подпоследовательности можно получить либо \(1, \mathbf{5}, \mathbf{1}, 8, \mathbf{6}, 7, 3, \mathbf{5}, 9\), либо \(1, \mathbf{3}, \mathbf{3}, 8, \mathbf{4}, 7, 3, \mathbf{7}, 9\).

Затем операция заканчивается. Обратите также внимание, что все операции являются независимыми, т. е. по окончании одной операции числа больше не называются северными или южными.

Необходимо с помощью описанных выше операций превратить все числа последовательности в нули. Поскольку до конкурса костюмов осталось совсем немного времени, ребята хотят узнать, какое минимальное количество операций для этого придется совершить.

Увы, ребятам такая задача оказалась не по силам, поэтому они позвали Вас на помощь.

\(^\dagger\) Последовательность \(c\) является подпоследовательностью \(d\), если \(c\) может быть получена из \(d\) удалением нескольких (возможно, ни одного или всех) элементов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 2\cdot 10^5\)) — количество чисел в последовательности.

Во второй строке находится \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)) — описание самой последовательности.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите по одному целому числу в отдельной строке — минимальное количество операций, необходимое, чтобы последовательность состояла только из нулей.

Примечание

В первом тестовом примере последовательность операций выглядит так: \(\mathbf{1}, 2, \mathbf{-3} \longrightarrow 0, \mathbf{2}, \mathbf{-2} \longrightarrow 0, \mathbf{1}, \mathbf{-1} \longrightarrow 0, 0, 0\).

Во втором тестовом примере последовательность выглядит так: \(\mathbf{1}, 0, 0, \mathbf{-1}, -1 \longrightarrow 0, 0, 0, 0, \mathbf{-1} \longrightarrow 0, 0, 0, 0, 0\).

В четвертом тестовом примере достаточно выбрать всю последовательность в качестве подпоследовательности, а затем отнять единицу от северных чисел и прибавить единицу к южным. Таким образом, последовательность занулится за одну операцию.

В пятом тестовом примере не нужно делать никаких операций, поскольку последовательность уже и так состоит из нулей.

A. Сумма-перевёртыш

жадные алгоритмы реализация *800

Вам дан массив из \(n\) целых чисел \(a_1, a_2, \ldots, a_n\). Каждое число равно либо \(1\), либо \(-1\). Вы должны выполнить следующую операцию над массивом \(a\) ровно один раз:

  • Выбрать индекс \(i\) (\(1 \leq i < n\)) и перевернуть знаки \(a_i\) и \(a_{i+1}\). Здесь переворачивание знака означает, что \(-1\) будет заменено на \(1\), а \(1\) станет \(-1\).

Какое максимально возможное значение \(a_1 + a_2 + \ldots + a_n\) можно получить после применения вышеописанной операции?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого теста содержит одно целое число \(n\) (\(2 \le n \le 10^5\)) — длину массива \(a\).

Следующая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(a_i = 1\) либо \(a_i = -1\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите максимально возможную сумму массива \(a\), которую вы можете получить в результате применения одной операции.

Примечание

В первом случае мы можем выбрать индекс \(4\) и перевернуть знаки \(a_4\) и \(a_5\). После этой операции сумма будет равна \(-1+1+1+1+1 = 3\). Можно показать, что мы не можем сделать сумму больше этого значения.

В третьем наборе единственным вариантом является выбор индекса \(1\).

C. Равные частоты

жадные алгоритмы Конструктив Перебор реализация сортировки Строки *1600

Назовём строку сбалансированной, если все символы, которые в ней присутствуют, входят в неё одинаковое число раз. Например, «coder», «appall» и «ttttttt» — сбалансированные строки, а «wowwow» и «codeforces» — нет.

Вам дана строка \(s\) длины \(n\), состоящая из строчных латинских букв. Найдите сбалансированную строку \(t\) той же длины \(n\), состоящую из строчных латинских букв и отличающуюся от строки \(s\) в как можно меньшем числе позиций. Другими словами, число индексов \(i\) таких, что \(s_i \ne t_i\), должно быть минимальным возможным.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — длину строки \(s\).

Вторая строка содержит строку \(s\) длины \(n\), состоящую из строчных латинских букв.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите наименьшее число позиций, в которых строка \(s\) и сбалансированная строка \(t\) могут отличаться, и далее выведите саму такую строку \(t\).

Если существует несколько решений, выведите любое из них. Можно показать, что хотя бы одна сбалансированная строка всегда существует.

Примечание

В первом наборе входных данных заданная строка «hello» не является сбалансированной: буквы «h», «e» и «o» встречаются в ней по одному разу, а буква «l» — два раза. С другой стороны, строка «helno» сбалансирована: в ней присутствуют пять разных букв, и каждая из них встречается ровно один раз. Строки «hello» и «helno» отличаются всего в одной позиции — в четвёртом символе. Возможны и другие решения.

Во втором наборе входных данных строка «codefofced» сбалансирована, так как в ней присутствуют только буквы «c», «o», «d», «e» и «f», и каждая из них встречается ровно два раза.

В третьем наборе входных данных строка «eeeee» сбалансирована, так как в ней присутствует только буква «e».

В четвёртом наборе входных данных заданная строка «appall» уже сбалансирована.

E. Сжатие прямоугольников

Бинарный поиск жадные алгоритмы Перебор реализация Структуры данных *2300

Перед вами прямоугольная таблица высоты \(2\) и ширины \(10^9\), состоящая из единичных клеток. На таблице расположено \(n\) прямоугольников, причём границы прямоугольников проходят по границам клеток. \(i\)-й прямоугольник покрывает все клетки в строках с \(u_i\) по \(d_i\) включительно и столбцах с \(l_i\) по \(r_i\) включительно (\(1 \le u_i \le d_i \le 2\); \(1 \le l_i \le r_i \le 10^9\)). Данные прямоугольники могут произвольным образом пересекаться, вкладываться и совпадать.

Вам нужно каждый прямоугольник либо удалить, либо заменить на любой свой непустой подпрямоугольник. Во втором случае подпрямоугольник должен целиком содержаться в исходном прямоугольнике, а его границы всё также должны проходить по границам клеток. При этом разрешается, чтобы подпрямоугольник совпал с исходным прямоугольником.

Требуется, чтобы никакие два (неудаленных) прямоугольника после замены не имели общих клеток, а суммарная площадь, покрытая новыми прямоугольниками, была как можно больше.

Рисунок для первого набора входных данных. Сверху изображены данные прямоугольники, снизу — изменённые. Прямоугольник номер \(4\) был удалён.
Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество прямоугольников.

Каждая из следующих \(n\) строк содержит четыре целых числа \(u_i, l_i, d_i, r_i\) (\(1 \le u_i \le d_i \le 2\); \(1 \le l_i \le r_i \le 10^9\)) — координаты клеток, находящихся в левом верхнем и правом нижнем углу прямоугольника соответственно.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных сначала выведите целое число \(s\) — максимальную возможную площадь, покрытую новыми прямоугольниками. Далее в \(n\) строках выведите ваше решение для покрытия такой площади.

В \(i\)-й из этих строк выведите четыре целых числа \(u'_i, l'_i, d'_i, r'_i\). Если вы удаляете \(i\)-й прямоугольник, выведите \(u'_i = l'_i = d'_i = r'_i = 0\). Иначе эти числа обозначают новые координаты клеток в левом верхнем и правом нижнем углу \(i\)-го прямоугольника соответственно. Они должны удовлетворять следующим неравенствам: \(u_i \le u'_i \le d'_i \le d_i\); \(l_i \le l'_i \le r'_i \le r_i\).

Если существует несколько решений, выведите любое из них.

Примечание

На рисунке в условии задачи изображен первый набор входных данных.

D. Различные массивы

дп Перебор реализация *2000

Вам дан массив \(a\), состоящий из \(n\) целых чисел.

Вы должны выполнить последовательность из \(n-2\) операций над этим массивом:

  • во время первой операции вы либо прибавляете \(a_2\) к \(a_1\) и вычитаете \(a_2\) из \(a_3\), либо прибавляете \(a_2\) к \(a_3\) и вычитаете \(a_2\) из \(a_1\);
  • во время второй операции вы либо прибавляете \(a_3\) к \(a_2\) и вычитаете \(a_3\) из \(a_4\), либо прибавляете \(a_3\) к \(a_4\) и вычитаете \(a_3\) из \(a_2\);
  • ...
  • во время последней операции вы либо прибавляете \(a_{n-1}\) к \(a_{n-2}\) и вычитаете \(a_{n-1}\) из \(a_n\), либо прибавляете \(a_{n-1}\) к \(a_n\) и вычитаете \(a_{n-1}\) из \(a_{n-2}\).

То есть во время \(i\)-й операции вы прибавляете элемент \(a_{i+1}\) к одному из его соседей и вычитаете его из другого соседа.

Например, если у вас есть массив \([1, 2, 3, 4, 5]\), один из способов провести над ним последовательность операций — следующий:

  • вычесть \(2\) из \(a_3\) и прибавить к \(a_1\), массив станет \([3, 2, 1, 4, 5]\);
  • вычесть \(1\) из \(a_2\) и прибавить к \(a_4\), массив станет \([3, 1, 1, 5, 5]\);
  • вычесть \(5\) из \(a_3\) и прибавить к \(a_5\), массив станет \([3, 1, -4, 5, 10]\).

В итоге получится массив \([3, 1, -4, 5, 10]\).

Назовем массив достижимым, если его можно получить в результате применения всей последовательности операций к массиву \(a\). Посчитайте количество достижимых массивов, а затем выведите остаток от деления этого количества на \(998244353\).

Входные данные

В первой строке задано одно целое число \(n\) (\(3 \le n \le 300\)).

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 300\)).

Выходные данные

Выведите одно целое число — количество достижимых массивов, взятое по модулю \(998244353\).

G. Радиус взвешенного дерева

Деревья разделяй и властвуй реализация Структуры данных *2800

Вам задано дерево из \(n\) вершин и \(n - 1\) ребра. Первоначальный вес \(i\)-й вершины равен \(a_i\).

Назовем расстоянием \(d_v(u)\) от вершины \(v\) до вершины \(u\) количество ребер на пути из \(v\) в \(u\). Заметим, что \(d_v(u) = d_u(v)\) и \(d_v(v) = 0\).

Назовем взвешенным расстоянием \(w_v(u)\) от \(v\) до \(u\) значение \(w_v(u) = d_v(u) + a_u\). Заметим, что \(w_v(v) = a_v\) и \(w_v(u) \neq w_u(v)\), если \(a_u \neq a_v\).

Аналогично обычному расстоянию, назовем эксцентриситетом \(e(v)\) вершины \(v\) наибольшее взвешенное расстояние от \(v\) до какой-либо вершины (включая саму \(v\)), или \(e(v) = \max\limits_{1 \le u \le n}{w_v(u)}\).

Наконец, назовем радиусом \(r\) дерева наименьший из эксцентриситетов его вершин, или \(r = \min\limits_{1 \le v \le n}{e(v)}\).

Вам нужно обработать \(m\) запросов следующего вида:

  • \(v_j\) \(x_j\) — присвоить \(a_{v_j} = x_j\).

После обработки каждого запроса выведите радиус \(r\) текущего дерева.

Входные данные

В первой строке задано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Во второй строке заданы \(n\) целых чисел \(a_1, \dots, a_n\) (\(0 \le a_i \le 10^6\)) — первоначальные веса вершин.

В следующих \(n - 1\) строках заданы ребра дерева. В \(i\)-й строке заданы два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\); \(u_i \neq v_i\)) — соответствующее ребро. Заданные ребра образуют дерево.

В следующей строке задано одно целое число \(m\) (\(1 \le m \le 10^5\)) — количество запросов.

В следующих \(m\) строках заданы сами запросы — по одному в строке. В \(j\)-м запросе заданы два целых числа \(v_j\) и \(x_j\) (\(1 \le v_j \le n\); \(0 \le x_j \le 10^6\)) — вершина и ее новый вес.

Выходные данные

Выведите \(m\) целых чисел — радиус \(r\) дерева после обработки каждого запроса.

Примечание

После первого запроса дерево выглядит следующим образом:

Цветом на изображении отмечена вершина с наименьшим \(e(v)\), соответственно \(r = e(4) = 7\). Эксцентриситеты других вершин равны: \(e(1) = 8\), \(e(2) = 9\), \(e(3) = 9\), \(e(5) = 8\), \(e(6) = 8\).

Дерево после второго запроса:

Радиус \(r = e(1) = 4\).

После третьего запроса радиус \(r = e(2) = 5\):

A1. Нечередующаяся колода (простая версия)

реализация *800

Это простая версия задачи. В этой версии все карты одного цвета.

У Алисы есть \(n\) карт, все карты белые, карты сложены в колоду. Алиса раздает карты себе и Бобу, забирая по несколько карт сразу сверху стопки в таком порядке: одну карту себе, две карты Бобу, три карты Бобу, четыре карты себе, пять карт себе, шесть карт Бобу, семь карт Бобу, восемь карт себе и т. д.. Иными словами, на \(i\)-м шаге Алиса отдает верхние \(i\) карт из колоды одному из игроков, при этом на первом шаге она отдает карты себе, а затем чередует игроков через каждые два шага. Если на очередном шаге в колоде недостаточно карт, Алиса выдает все оставшиеся карты текущему игроку и процесс заканчивается.

Первые шаги Алисы для колоды из большого числа карт.

Сколько карт окажется у Алисы и Боба в конце?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^6\)) — количество карт.

Выходные данные

Для каждого набора входных данных выведите два числа — количество карт в конце у игроков — в таком порядке: карты у Алисы, карты у Боба.

A2. Чередующаяся колода (сложная версия)

реализация *800

Это сложная версия задачи. В этой версии карты бывают двух цветов.

У Алисы есть \(n\) карт, каждая карта либо черная, либо белая. Карты уложены в колоду, причем цвета карт чередуются, начиная с белой. Алиса раздает карты себе и Бобу, забирая по несколько карт сразу сверху стопки в таком порядке: одну карту себе, две карты Бобу, три карты Бобу, четыре карты себе, пять карт себе, шесть карт Бобу, семь карт Бобу, восемь карт себе и т. д.. Иными словами, на \(i\)-м шаге Алиса отдает верхние \(i\) карт из колоды одному из игроков, при этом на первом шаге она отдает карты себе, а затем чередует игроков через каждые два шага. Если на очередном шаге в колоде недостаточно карт, Алиса выдает все оставшиеся карты текущему игроку и процесс заканчивается.

Первые шаги Алисы для колоды из большого числа карт.

Сколько карт каждого цвета окажется у Алисы и Боба в конце?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^6\)) — количество карт.

Выходные данные

Для каждого набора входных данных выведите четыре числа — количество карт в конце у игроков — в таком порядке: белые карты у Алисы, черные карты у Алисы, белые у Боба, черные у Боба.

D. Игра на оси

графы Комбинаторика поиск в глубину и подобное реализация снм *1900

Есть \(n\) точек \(1,2,\ldots,n\), у каждой точки \(i\) написано число \(a_i\). Вы играете в игру на этих точках. Изначально вы находитесь в точке \(1\). Когда вы находитесь в точке \(i\), выполните следующий шаг:

  • Если \(1\le i\le n\), перейдите к точке \(i+a_i\);
  • В противном случае игра заканчивается.

Перед началом игры вы можете выбрать два целых числа \(x\) и \(y\), удовлетворяющих \(1\le x\le n\), \(-n \le y \le n\), и заменить число \(a_x\) на \(y\) (сделать \(a_x := y\)). Найдите количество различных пар \((x,y)\), при которых игра, которую вы начнете после замены, закончится за конечное число шагов.

Обратите внимание, что вам не нужно удовлетворять условию \(a_x\not=y\).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит целое число \(t\) (\(1\le t\le 10^4)\) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\le n\le 2\cdot 10^5\)) — количество точек.

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(-n \le a_i \le n\)) — числа на оси.

Гарантируется, что сумма \(n\) не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите строку, содержащую одно целое число — количество различных пар \((x,y)\), игра с которыми конечна.

Примечание

В первом наборе входных данных парами \((x,y)\), с которыми игра конечна, являются \((1,-1)\) и \((1,1)\), соответствующие маршрутам \(1\rightarrow 0\) и \(1\rightarrow 2\). Обратите внимание, что пара \((1,2)\) не подходит, так как при \(n=1\) равенство \(y=2\) нарушает \(-n\le y\le n\). \((1,0)\) также не подходит, так как вы всегда переходите от \(1\) к \(1\), и игра не заканчивается.

Во втором наборе входных данных подходящие пары равны \((1,-2),(1,-1),(1,2),(2,-2),(2,-1),(2,0),(2,1),(2,2)\).

В четвертом наборе входных данных подходящие пары \((1,-2),(1,-1),(1,1),(1,2),(2,-2),(2,1),(2,2)\).

F. Обратное преобразование

Конструктив математика реализация *2500

Ученый-перестановщик изучает самопреобразующуюся перестановку \(a\), состоящую из \(n\) элементов \(a_1,a_2,\ldots,a_n\).

Перестановка — это последовательность целых чисел от \(1\) до \(n\) длины \(n\), содержащая каждое число ровно один раз. Например, \([1]\), \([4, 3, 5, 1, 2]\) являются перестановками, а \([1, 1]\), \([4, 3, 1]\) — нет.

Перестановка изменяется каждый день. Каждый день каждый элемент \(x\) заменяется на \(a_x\), то есть \(a_x\) станет \(a_{a_x}\). Другими словами,

  • в первый день перестановка примет вид \(b\), где \(b_x = a_{a_x}\);
  • на второй день перестановка примет вид \(c\), где \(c_x = b_{b_x}\);
  • \(\ldots\)
Например, рассмотрим перестановку \(a = [2,3,1]\). В первый день она станет равна \([3,1,2]\). На второй день она станет равна \([2,3,1]\).

Вам дана перестановка \(a'\) на \(k\)-й день.

Определим \(\sigma(x) = a_x\) и определим \(f(x)\) как минимальное натуральное число \(m\) такое, что \(\sigma^m(x) = x\), где \(\sigma^m(x)\) обозначает \(\underbrace{\sigma(\sigma(\ldots \sigma}_{m \text{ раз}}(x) \ldots))\).

Например, если \(a = [2,3,1]\), то \(\sigma(1) = 2\), \(\sigma^2(1) = \sigma(\sigma(1)) = \sigma(2) = 3\), \(\sigma^3(1) = \sigma(\sigma(\sigma(1))) = \sigma(3) = 1\), поэтому \(f(1) = 3\). И если \(a=[4,2,1,3]\), то \(\sigma(2) = 2\), значит, \(f(2) = 1\); \(\sigma(3) = 1\), \(\sigma^2(3) = 4\), \(\sigma^3(3) = 3\), поэтому \(f(3) = 3\).

Найдите начальную перестановку \(a\) такую, что \(\sum\limits^n_{i=1} \dfrac{1}{f(i)}\) принимает минимально возможное значение.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5\); \(1 \le k \le 10^9\)) — длина \(a\) и последний день.

Вторая строка содержит \(n\) целых чисел \(a'_1,a'_2,\ldots,a'_n\) (\(1 \le a'_i \le n\)) — перестановка в \(k\)-й день.

Гарантируется, что сумма \(n\) не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если хотя бы одна перестановка \(a\), из которой получается \(a'\), существует, выведите «YES», и в следующей строке выведите \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) — начальную перестановку с минимальной суммой \(\sum\limits^n_{i=1} \dfrac{1}{f(i)}\). Если ответов с минимальной суммой несколько, выведите любой.

Если нет ни одной подходящей перестановки, выведите «NO».

Примечание

Во втором наборе входных данных начальная перестановка может быть равна \(a = [6,2,5,7,1,3,4]\), которая станет \([3,2,1,4,6,5,7]\) в первый день и \(a' = [1,2,3,4,5,6,7]\) во второй день (\(k\)-й день). Кроме того, среди всех перестановок, удовлетворяющих этому, она имеет минимальную \(\sum\limits^n_{i=1} \dfrac{1}{f(i)}\), которая равна \(\dfrac{1}{4}+\dfrac{1}{1}+\dfrac{1}{4}+\dfrac{1}{2}+\dfrac{1}{4}+\dfrac{1}{4}+\dfrac{1}{2}=3\).

В пятом наборе входных данных начальная перестановка может быть равна \(a = [4,2,1,3]\), которая станет \([3,2,4,1]\) в первый день, \([4,2,1,3]\) на второй день и так далее. Таким образом, в \(8\)-й день (\(k\)-й день) в итоге получится \(a' = [4,2,1,3]\). Для такой перестановки достигается минимальное значение \(\sum\limits^n_{i=1} \dfrac{1}{f(i)} = \dfrac{1}{3} + \dfrac{1}{1} + \dfrac{1}{3} + \dfrac{1}{3} = 2\).

A. Единицы и двойки

математика Перебор реализация *800

Вам дана последовательность \(a_1, a_2, \ldots, a_n\). Каждый элемент \(a\) равен \(1\) или \(2\).

Выясните, существует ли целое число \(k\) такое, что выполняются следующие условия:

  • \(1 \leq k \leq n-1\), и
  • \(a_1 \cdot a_2 \cdot \ldots \cdot a_k = a_{k+1} \cdot a_{k+2} \cdot \ldots \cdot a_n\).

Если существует несколько \(k\), удовлетворяющих данному условию, выведите наименьшее из них.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \leq n \leq 1000\)).

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 2\)).

Выходные данные

Для каждого набора входных данных, если не существует такого \(k\), выведите \(-1\). В противном случае выведите наименьшее возможное значение \(k\).

Примечание

Для первого набора входных данных \(k=2\) удовлетворяет условию, так как \(a_1 \cdot a_2 = a_3 \cdot a_4 \cdot a_5 \cdot a_6 = 4\). \(k=3\) также удовлетворяет данному условию, но нужно вывести наименьшее подходящее значение.

Для второго набора не существует \(k\), удовлетворяющего условию \(a_1 \cdot a_2 \cdot \ldots \cdot a_k = a_{k+1} \cdot a_{k+2} \cdot \ldots \cdot a_n\).

Для третьего набора \(k=1\), \(2\), \(3\) удовлетворяет заданному условию, поэтому ответ \(1\).

B. Сумма двух чисел

жадные алгоритмы Конструктив математика реализация Теория вероятностей *1100

Сумма цифр целого неотрицательного числа \(a\) — это результат суммирования его цифр при записи в десятичной системе счисления. Например, сумма цифр числа \(123\) равна \(6\), а сумма цифр числа \(10\) равна \(1\). Формально, сумма цифр числа \(\displaystyle a=\sum_{i=0}^{\infty} a_i \cdot 10^i\), где \(0 \leq a_i \leq 9\), определяется как \(\displaystyle\sum_{i=0}^{\infty}{a_i}\).

Дано целое число \(n\). Найдите два целых неотрицательных числа \(x\) и \(y\), которые удовлетворяют следующим условиям:

  • \(x+y=n\), и
  • сумма цифр числа \(x\) и сумма цифр числа \(y\) отличаются не более чем на \(1\).

Можно показать, что такие \(x\) и \(y\) всегда существуют.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит одно число \(n\) (\(1 \leq n \leq 10^9\)) — сумму искомых чисел.

Выходные данные

Для каждого набора входных данных выведите два целых числа \(x\) и \(y\). Если ответов несколько, выведите любой.

Примечание

Во втором наборе входных данных сумма цифр \(67\) и сумма цифр \(94\) равны \(13\).

В третьем наборе сумма цифр числа \(60\) равна \(6\), а сумма цифр числа \(7\) равна \(7\).

F. XOR, деревья и запросы

битмаски графы Деревья жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм *2500

Вам дано дерево с \(n\) вершинами. Вершины пронумерованы от \(1\) до \(n\).

Вам нужно будет назначить каждому ребру вес. Пусть вес \(i\)-го ребра будет \(a_i\) (\(1 \leq i \leq n-1\)). Вес каждого ребра должен быть целым числом от \(0\) до \(2^{30}-1\), включительно.

Вам дано \(q\) условий. Каждое условие состоит из трех целых чисел \(u\), \(v\) и \(x\). Это означает, что побитовое исключающее ИЛИ всех ребер на кратчайшем пути от \(u\) до \(v\) должно быть равно \(x\).

Выясните, существуют ли числа \(a_1, a_2, \ldots, a_{n-1}\), удовлетворяющие заданным условиям. Если существуют, выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ.

Если существует несколько решений таких, что \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) является наименьшим, выведите любое из них.

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(2 \le n \le 2.5 \cdot 10^5\), \(0 \le q \le 2.5 \cdot 10^5\)). В \(i\)-й из следующих \(n-1\) строк содержится два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\), \(x_i \neq y_i\)), то есть \(i\)-е ребро соединяет вершины \(x_i\) и \(y_i\) в дереве.

Гарантируется, что заданные ребра образуют дерево.

Следующие \(q\) строк содержат информацию об условиях.

Каждая строка содержит три целых числа \(u\), \(v\), \(x\) (\(1 \le u, v \le n\), \(u \neq v\), \(0 \le x \le 2^{30}-1\)), означающие, что побитовое исключающее ИЛИ всех ребер на кратчайшем пути от \(u\) до \(v\) должно быть \(x\).

Выходные данные

Если не существует \(a_1\), \(a_2\), ..., \(a_{n-1}\), которые удовлетворяют заданным условиям, выведите «No».

В противном случае в первой строке выведите «Yes».

Затем в следующей строке выведите \(n-1\) целых чисел, где \(i\)-е целое число — это вес \(i\)-го ребра. Если существует несколько решений, то выведите такое решение, при котором \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) будет наименьшим.

Если существует несколько решений, при которых \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\) принимает наименьшее значение, выведите любое.

При выводе «Yes» или «No» вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Для первого примера не существует набора весов ребер, удовлетворяющего заданному условию.

Для второго примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=2\) и \(a_4 \oplus a_5=7\). Может существовать несколько решений, например, \((a_1, a_2, a_3, a_4, a_5)=(1, 2, 1, 4, 3)\).

Для третьего примера два условия означают, что \(a_1 \oplus a_2 \oplus a_3=3\) и \(a_1 \oplus a_4 \oplus a_5=5\). Существует множество решений, удовлетворяющих данному условию.

\((a_1, a_2, a_3, a_4, a_5)=(1, 1, 3, 4, 0)\) удовлетворяет заданным условиям, но побитовое исключающее ИЛИ весов всех ребер равно \(7\), что не является наименьшим возможным значением \(a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1}\), поэтому это не является верным решением.

B. Serval и Инверсионная магия

Перебор реализация Строки *800

У Serval есть бинарная строка \(s\), которая может состоять только из символов 0 и 1, длины \(n\). \(i\)-й символ \(s\) обозначается как \(s_i\), где \(1\leq i\leq n\).

Serval может применять следующую операцию, названную Инверсионной магией, к строке \(s\):

  • Выбрать отрезок \([l, r]\) (\(1\leq l\leq r\leq n\)). Для \(l\leq i\leq r\), заменить \(s_i\) на 1, если \(s_i\) является 0, и заменить \(s_i\) на 0, если \(s_i\) является 1.

Например, пусть \(s\) равна 010100 и выбран отрезок \([2,5]\). Строка \(s\) будет равна 001010 после применения Инверсионной магии.

Serval хочет сделать \(s\) палиндромом после применения Инверсионной магии ровно один раз. Помогите ему определить, возможно ли это.

Строка является палиндромом тогда и только тогда, когда она одинаково читается слева направо и справа налево. Например, 010010 является палиндромом, но 10111 не является.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1\leq t\leq 10^4\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(2\leq n\leq 10^5\)) — длина строки \(s\).

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\). В строке \(s\) могут содержаться только символы 0 и 1.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входых данных выведите Yes, если \(s\) может стать палиндромом, после применения Инверсионной магии один раз, и No, если нет.

Вы можете вывести Yes и No в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных Serval может применить Инверсионную магию на отрезке \([1,4]\). Строка \(s\) станет равной 0110 после магии.

Во втором наборе входных данных Serval может применить Инверсионную магию на отрезке \([1,3]\). Строка \(s\) станет равной 01110 после магии.

В третьем наборе входных данных Serval не может сделать \(s\) палиндромом после применения Инверсионной магии ровно один раз.

C. Serval и массивы Toxel

дп Комбинаторика математика реализация *1500

Toxel любит массивы. Перед поездкой в Paldea Serval подарил ему массив \(a\). Этот массив состоит из \(n\) попарно различных элементов.

Чтобы получить больше массивов, Toxel выполнил \(m\) операций с исходным массивом. \(i\)-й операцией он изменил \(p_{i}\)-й элемент \((i-1)\)-го массива на \(v_{i}\), в результате чего получился \(i\)-й массив (исходный массив \(a\) имеет номер \(0\)). Во время изменений Toxel гарантировал, что элементы каждого массива по-прежнему попарно различны после каждой операции.

Наконец, Toxel получил \(m+1\) массив и обозначил их как \(A_{0}=a, A_{1},\ldots,A_{m}\). Для каждой пары \((i,j)\) (\(0\le i<j\le m\)), Toxel определил её значение как количество различных элементов в конкатенации \(A_{i}\) и \(A_{j}\). Теперь Toxel задается вопросом, какова сумма значений для всех пар массивов? Пожалуйста, помогите ему вычислить ответ.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1\le t\le10^{4}\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1\le n,m\le2\cdot10^{5}\)) — длину массива и количество операций.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_{1},a_{2},\dots,a_{n}\) (\(1\le a_{i}\le n+m\)). Гарантируется, что все \(a_i\) попарно различны.

Каждая из следующих \(m\) строк каждого набора входных данных содержит два целых числа \(p_{i}\) и \(v_{i}\) (\(1\le p_{i}\le n\), \(1\le v_{i}\le n+m\)) — позиция изменяемого элемента и его новое значение. Гарантируется, что элементы каждого массива по-прежнему попарно различны после каждой операции.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превосходят \(2\cdot10^{5}\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — сумму значений для всех пар массивов.

Примечание

В первом наборе входных данных массив изменяется следующим образом: \([1,2,3]\to[\underline{4},2,3]\to[4,\underline{5},3]\).

Конкатенацией \(0\)-го массива \(1\)-го массива является \(\require{cancel}[1,2,3,4,\cancel{2},\cancel{3}]\). Здесь есть \(4\) различных элемента.

Конкатенацией \(0\)-го массива и \(2\)-го массива является \(\require{cancel}[1,2,3,4,5,\cancel{3}]\). Здесь есть \(5\) различных элементов.

Конкатенацией \(1\)-го массива и \(2\)-го массива является \(\require{cancel}[4,2,3,\cancel{4},5,\cancel{3}]\). Здесь есть \(4\) различных элемента.

Зачёркнутые элементы являются повторяющимися в массиве.

Таким образом, ответ равен \(4+5+4=13\).

Во втором наборе входных данных обратите внимание, что массив может оставаться без изменений после операций.

D. Serval и сдвиг-сдвиг-сдвиг

битмаски Конструктив Перебор реализация *2200

У Serval есть два \(n\)-битных двоичных числа \(a\) и \(b\). Он хочет поделиться этими числами с Toxel.

Так как Toxel больше нравится число \(b\), Serval решил изменить \(a\) на \(b\) с помощью нескольких (возможно, нуля) операций. За одну операцию Serval может выбрать любое положительное целое число \(k\) от \(1\) до \(n\), и заменить \(a\) на одно из следующих чисел:

  • \(a\oplus(a\ll k)\)
  • \(a\oplus(a\gg k)\)

Другими словами, операция сдвигает каждый бит числа \(a\) налево или направо на \(k\) позиций, при этом переполненные биты удаляются, а недостающие биты дополняются \(0\). Побитовое исключающее ИЛИ результата сдвига и изначального \(a\) присваиваются обратно \(a\).

У Serval нет много времени. Он хочет применить не более \(n\) операций, чтобы изменить \(a\) на \(b\). Пожалуйста, помогите ему найти последовательность операций, или определите, что невозможно изменить \(a\) на \(b\) за не более \(n\) операций. Вам не нужно минимизировать количество операций.

В этой задаче \(x\oplus y\) обозначает побитовое исключающее ИЛИ чисел \(x\) и \(y\). \(a\ll k\) и \(a\gg k\) обозначают логический сдвиг влево и логический сдвиг вправо.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1\le t\le2\cdot10^{3}\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1\le n\le2\cdot10^{3}\)) — количество битов в числах \(a\) и \(b\).

Вторая и третья строка каждого набора входных данных содержат бинарную строку длины \(n\), обозначающую \(a\) и \(b\), соответственно. Строки содержат только символы 0 и 1.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot10^{3}\).

Выходные данные

Для каждого набора входных данных, если невозможно изменить \(a\) на \(b\) за не более \(n\) операций, выведите одно число \(-1\).

Иначе, в первой строке выведите количество операций \(m\) (\(0\le m\le n\)).

Если \(m>0\), во второй строке выведите \(m\) целых чисел \(k_{1},k_{2},\dots,k_{m}\) обозначающих операции. Если \(1\le k_{i}\le n\), это обозначает логический сдвиг влево \(a\) на \(k_{i}\) позиций. Если \(-n\le k_{i}\le-1\), это обозначает логический сдвиг вправо \(a\) на \(-k_{i}\) позиций.

Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных:

Первая операция изменяет \(a\) на \(\require{cancel}00111\oplus\cancel{001}11\underline{000}=11111\).

Вторая операция изменяет \(a\) на \(\require{cancel}11111\oplus\underline{00}111\cancel{11}=11000\).

Биты с зачеркиванием — это биты с переполнением, которые удаляются. Биты с подчеркиванием являются дополненными битами.

Во втором наборе входных данных \(a\) уже равно \(b\), поэтому никаких операций делать не нужно.

В третьем наборе входных данных можно показать, что \(a\) невозможно изменить на \(b\).

E. Serval и музыкальная игра

дп математика Перебор реализация теория чисел *2500

Serval любит играть в музыкальные игры. Он столкнулся с проблемой, играя в музыкальные игры, и оставил её решать вам.

Вам даны \(n\) положительных целых чисел \(s_1 < s_2 < \ldots < s_n\). \(f(x)\) определим как количество таких \(i\) (\(1\leq i\leq n\)), что существуют неотрицательные целые числа \(p_i, q_i\) такие, что:

\(\)s_i=p_i\left\lfloor{s_n\over x}\right\rfloor + q_i\left\lceil{s_n\over x}\right\rceil\(\)

Найдите \(\sum_{x=1}^{s_n} x\cdot f(x)\) по модулю \(998\,244\,353\).

Напомним, что \(\lfloor x\rfloor\) обозначает максимальное целое число не больше \(x\), и \(\lceil x\rceil\) обозначает минимальное целое число не меньше \(x\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1\leq t\leq 10^4\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1\leq n\leq 10^6\)).

Вторая строка каждого набора входных данных содержит \(n\) положительных целых чисел \(s_1,s_2,\ldots,s_n\) (\(1\leq s_1 < s_2 < \ldots < s_n \leq 10^7\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\), и сумма \(s_n\) по всем наборам входных данных не превосходит \(10^7\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — сумму \(x\cdot f(x)\) по всем возможным \(x\) по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных \(s_n=4\), \(f(x)\) вычисляется следующим образом:

  • \(f(1)=1\)
    • \(\left\lfloor s_n\over 1\right\rfloor=4\), \(\left\lceil s_n\over 1\right\rceil=4\).
    • Можно показать, что \(p_1,p_2\) и \(q_1,q_2\), которые удовлетворяют условиям, не существует.
    • Пусть \(p_3=1\) и \(q_3=0\), тогда \(s_3 = p_3\cdot\left\lfloor s_n\over 1\right\rfloor + q_3\cdot\left\lceil s_n\over 1\right\rceil = 1\cdot 4 + 0\cdot 4 = 4\).
  • \(f(2)=2\)
    • \(\left\lfloor s_n\over 2\right\rfloor=2\), \(\left\lceil s_n\over 2\right\rceil=2\).
    • Можно показать, что \(p_1\) и \(q_1\), которые удовлетворяют условиям, не существует.
    • Пусть \(p_2=1\) и \(q_2=0\), тогда \(s_2 = p_2\cdot\left\lfloor s_n\over 2\right\rfloor + q_2\cdot\left\lceil s_n\over 2\right\rceil = 1\cdot 2 + 0\cdot 2 = 2\).
    • Пусть \(p_3=0\) и \(q_3=2\), тогда \(s_3 = p_3\cdot\left\lfloor s_n\over 2\right\rfloor + q_3\cdot\left\lceil s_n\over 2\right\rceil = 0\cdot 2 + 2\cdot 2 = 4\).
  • \(f(3)=3\)
    • \(\left\lfloor s_n\over 3\right\rfloor=1\), \(\left\lceil s_n\over 3\right\rceil=2\).
    • Пусть \(p_1=1\) и \(q_1=0\), тогда \(s_1 = p_1\cdot\left\lfloor s_n\over 3\right\rfloor + q_1\cdot\left\lceil s_n\over 3\right\rceil = 1\cdot 1 + 0\cdot 2 = 1\).
    • Пусть \(p_2=0\) и \(q_2=1\), тогда \(s_2 = p_2\cdot\left\lfloor s_n\over 3\right\rfloor + q_2\cdot\left\lceil s_n\over 3\right\rceil = 0\cdot 1 + 1\cdot 2 = 2\).
    • Пусть \(p_3=0\) и \(q_3=2\), тогда \(s_3 = p_3\cdot\left\lfloor s_n\over 3\right\rfloor + q_3\cdot\left\lceil s_n\over 3\right\rceil = 0\cdot 1 + 2\cdot 2 = 4\).
  • \(f(4)=3\)
    • \(\left\lfloor s_n\over 4\right\rfloor=1\), \(\left\lceil s_n\over 4\right\rceil=1\).
    • Пусть \(p_1=1\) и \(q_1=0\), тогда \(s_1 = p_1\cdot\left\lfloor s_n\over 4\right\rfloor + q_1\cdot\left\lceil s_n\over 4\right\rceil = 1\cdot 1 + 0\cdot 1 = 1\).
    • Пусть \(p_2=1\) и \(q_2=1\), тогда \(s_2 = p_2\cdot\left\lfloor s_n\over 4\right\rfloor + q_2\cdot\left\lceil s_n\over 4\right\rceil = 1\cdot 1 + 1\cdot 1 = 2\).
    • Пусть \(p_3=2\) и \(q_3=2\), тогда \(s_3 = p_3\cdot\left\lfloor s_n\over 4\right\rfloor + q_3\cdot\left\lceil s_n\over 4\right\rceil = 2\cdot 1 + 2\cdot 1 = 4\).

Таким образом, ответ равен \(\sum_{x=1}^4 x\cdot f(x) = 1\cdot 1 + 2\cdot 2 + 3\cdot 3 + 4\cdot 3 = 26\).

Во втором наборе входных данных:

  • \(f(1)=f(2)=f(3)=1\)
  • \(f(4)=3\)
  • \(f(5)=f(6)=f(7)=f(8)=f(9)=4\)

Например, когда \(x=3\), \(f(3)=1\), потому что существуют \(p_4\) и \(q_4\):

\(\)9 = 1 \cdot\left\lfloor{9\over 3}\right\rfloor + 2 \cdot\left\lceil{9\over 3}\right\rceil\(\)

Можно показать, что невозможно найти \(p_1,p_2,p_3\) и \(q_1,q_2,q_3\), которые удовлетворяют условиям.

Когда \(x=5\), \(f(5)=4\), потому что существуют следующие \(p_i\) и \(q_i\):

\(\)1 = 1 \cdot\left\lfloor{9\over 5}\right\rfloor + 0 \cdot\left\lceil{9\over 5}\right\rceil\(\) \(\)2 = 0 \cdot\left\lfloor{9\over 5}\right\rfloor + 1 \cdot\left\lceil{9\over 5}\right\rceil\(\) \(\)7 = 3 \cdot\left\lfloor{9\over 5}\right\rfloor + 2 \cdot\left\lceil{9\over 5}\right\rceil\(\) \(\)9 = 3 \cdot\left\lfloor{9\over 5}\right\rfloor + 3 \cdot\left\lceil{9\over 5}\right\rceil\(\)

Таким образом, ответ равен \(\sum_{x=1}^9 x\cdot f(x) = 158\).

F. Serval и Brain Power

битмаски дп жадные алгоритмы Перебор реализация Строки *2700

Serval любит Brain Power и свою интеллектуальную задачу.

Serval называет строку \(T\) мощной тогда и только тогда, когда \(T\) можно получить конкатенацией некоторой строки \(T'\) несколько раз. Формально говоря, \(T\) является мощной тогда и только тогда, когда существует строка \(T'\) и целое число \(k\geq 2\) такие, что \(\)T=\underbrace{T'+T'+\dots+T'}_{k\text{ раз}}\(\)

Например, gogogo является мощной, потому что её можно получить конкатенацией go три раза, но power не является мощной.

У Serval есть строка \(S\), состоящая из строчных латинских букв. Ему любопытно узнать о самой длинной мощной подпоследовательности \(S\), и ему достаточно, чтобы вы узнали её длину. Если все непустые подпоследовательности \(S\) не являются мощными, ответ считается равным \(0\).

Строка \(a\) является подпоследовательностью строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов.

Входные данные

Первая строка содержит единственную строку \(S\) (\(|S|\leq 80\)), состоящую из строчных латинских букв.

Выходные данные

Выведите единственное целое число — длину самой длинной мощной подпоследовательности \(S\). Если все непустые подпоследовательности \(S\) не являются мощными, выведите \(0\).

Примечание

В первом примере все непустые подпоследовательности buaa перечислены ниже:

  • b
  • u
  • a (встречается дважды, buaa и buaa)
  • bu
  • ba (встречается дважды, buaa и buaa)
  • ua (встречается дважды, buaa и buaa)
  • aa
  • bua (встречается дважды, buaa и buaa )
  • baa
  • uaa
  • buaa

Так как aa \(=\) a \(+\) a, aa является мощной подпоследовательностью. Можно доказать, что aa является единственной мощной подпоследовательностью среди них. Поэтому ответ равен \(2\).

Во втором примере самой длинной мощной подпоследовательностью является codcod из codeforcesround. Поэтому ответ равен \(6\).

A. Поликарп и День числа Пи

математика реализация Строки *800

14 марта во всем мире отмечается день числа \(\pi\). Это очень важная математическая константа, равная отношению длины окружности к её диаметру.

Поликарпу рассказали в школе, что число \(\pi\) иррациональное, следовательно, имеет бесконечное число цифр в десятичной записи. Он захотел подготовиться ко Дню числа \(\pi\), запомнив это число как можно точнее.

Поликарп выписал все цифры, которые ему удалось запомнить. Например, если Поликарп запомнил \(\pi\) как \(3.1415\), он выписал 31415.

Поликарп очень торопился и мог ошибиться, поэтому вы решили проверить, сколько первых цифр числа \(\pi\) Поликарп помнит правильно на самом деле.

Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных в тесте.

Каждый набор входных данных описывается одной строкой из цифр \(n\), которую выписал Поликарп.

Строка \(n\) содержит до \(30\) цифр.

Выходные данные

Выведите \(t\) чисел, каждое из которых является ответом на соответствующий набор входных данных.

В качестве ответа выведите, сколько первых цифр числа \(\pi\) Поликарп помнит правильно.

C. Престановка

математика Перебор реализация *1000

Последовательность из \(n\) чисел называется перестановкой, если она содержит в себе все числа от \(1\) до \(n\) ровно по одному разу. Например, последовательности [\(3, 1, 4, 2\)], [\(1\)] и [\(2,1\)] являются перестановками, а [\(1,2,1\)], [\(0,1\)] и [\(1,3,4\)] — нет.

У Кристины была перестановка \(p\) из \(n\) элементов. Она записала ее на доску \(n\) раз таким образом, что:

  • записывая перестановку в \(i\)-й (\(1 \le i \le n)\) раз она пропускала элемент \(p_i\)
Таким образом, всего она записала на доску \(n\) последовательностей длины \(n-1\) каждая.

Например, пусть у Кристины была перестановка \(p\) = \([4,2,1,3]\) длины \(4\). Тогда она сделала следующее:

  1. Записала на доску последовательность \([2, 1, 3]\), пропустив элемент \(p_1=4\) из исходной перестановки.
  2. Записала на доску последовательность \([4, 1, 3]\), пропустив элемент \(p_2=2\) из исходной перестановки.
  3. Записала на доску последовательность \([4, 2, 3]\), пропустив элемент \(p_3=1\) из исходной перестановки.
  4. Записала на доску последовательность \([4, 2, 1]\), пропустив элемент \(p_4=3\) из исходной перестановки.

Вам известны \(n\) последовательностей, которые были записаны на доску, но Вы не знаете, в каком порядке они были записаны. Восстановите по ним исходную перестановку.

Таким образом, если Вам известны последовательности \([4, 2, 1]\), \([4, 2, 3]\), \([2, 1, 3]\), \([4, 1, 3]\), то исходная перестановка будет равна \(p\) = \([4, 2, 1, 3]\).

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(3 \le n \le 100\)).

Затем следует \(n\) строк, каждая из которых содержит ровно \(n-1\) целое число и описывает одну из последовательностей, выписанных на доску.

Гарантируется, что все последовательности могли быть получены из некоторой перестановки \(p\), а также что сумма \(n^2\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке перестановку \(p\) такую, что из нее могли быть получены заданные \(n\) последовательностей.

Гарантируется, что ответ существует и он единственный. Иными словами, для каждого набора входных данных обязательно найдется искомая перестановка.

Примечание

Первый набор входных данных разобран в условии задачи.

Во втором наборе входных данных последовательности выписаны в правильном порядке.

A. Проверка Codeforces

реализация Строки *800

Дана строчная буква из латинского алфавита, проверьте, встречается ли она в строке \(\texttt{codeforces}\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 26\)) — количество наборов входных данных.

Единственная строка каждого набора содержит символ \(c\) — строчную букву латинского алфавита.

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если \(c\) удовлетворяет условию, иначе выведите «NO» (без кавычек).

Вы можете выводить строки в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

B. Следование направлениям

геометрия реализация *800

Альперен стоит в точке \((0,0)\). Ему дана строка \(s\) длины \(n\) и он производит \(n\) перемещений: \(i\)-е перемещение происходит так:

  • если \(s_i = \texttt{L}\), он перемещается на одну клетку влево;
  • если \(s_i = \texttt{R}\), он перемещается на одну клетку вправо;
  • если \(s_i = \texttt{U}\), он перемещается на одну клетку вверх;
  • если \(s_i = \texttt{D}\), он перемещается на одну клетку вниз.
Если Альперен начинает в точке в центре, он может сделать четыре различных перемещения, как показано на рисунке.
В точке \((1,1)\) находится конфета (то есть на одну клетку вверх и на одну клетку вправо от начальной точки, в которой находится Альперен). Определите, доберется ли Альперен когда-нибудь до конфеты.
Alperen's path in the first test case.
Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит целое число \(n\) (\(1 \leq n \leq 50\)) — длину строки.

Вторая строка каждого набора содержит строку \(s\) длины \(n\) состоящую из символов \(\texttt{L}\), \(\texttt{R}\), \(\texttt{D}\), и \(\texttt{U}\), обозначающую перемещения Альперена.

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если Альперен доберется до конфеты, в противном случае, выведите «NO» (без кавычек).

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ).

Примечание

В первом наборе входных данных Альперен следует по пути \(\)(0,0) \overset{\texttt{U}}{\to} (0,1) \overset{\texttt{U}}{\to} (0,2) \overset{\texttt{U}}{\to} (0,3) \overset{\texttt{R}}{\to} (1,3) \overset{\texttt{D}}{\to} (1,2) \overset{\texttt{D}}{\to} \color{green}{\mathbf{(1,1)}} \overset{\texttt{L}}{\to} (0,1).\(\) Обратите внимание, что Альперену не обязательно находится в точке \((1,1)\) в конце своего пути, ему достаточно оказаться там хотя бы раз за весь путь.

Во втором наборе Альперен следует по пути \(\)(0,0) \overset{\texttt{U}}{\to} (0,1) \overset{\texttt{R}}{\to} \color{green}{\mathbf{(1,1)}}.\(\)

В третьем наборе Альперен следует по пути \(\)(0,0) \overset{\texttt{R}}{\to} (1,0) \overset{\texttt{R}}{\to} (2,0) \overset{\texttt{R}}{\to} (3,0) \overset{\texttt{U}}{\to} (3,1) \overset{\texttt{U}}{\to} (3,2) \overset{\texttt{D}}{\to} (3,1) \overset{\texttt{D}}{\to} (3,0) \overset{\texttt{D}}{\to} (3,-1).\(\)

В четвертом наборе Альперен следует по пути \(\)(0,0) \overset{\texttt{L}}{\to} (-1,0) \overset{\texttt{L}}{\to} (-2,0) \overset{\texttt{L}}{\to} (-3,0).\(\)

C. Приписать и дописать

реализация *800

Изначально у Тимура есть бинарная строка \(^{\dagger}\) \(s\) (возможно длины \(0\)). Он применил следующую операцию несколько раз (возможно ноль):

  • Приписать \(\texttt{0}\) к одному из концов строки и \(\texttt{1}\) к другому концу строки. Например, из строки \(\texttt{1011}\), мы можем получить или \(\color{red}{\texttt{0}}\texttt{1011}\color{red}{\texttt{1}}\), или \(\color{red}{\texttt{1}}\texttt{1011}\color{red}{\texttt{0}}\).

Вам дана строка, которая получилась у Тимура. Какая наименьшая возможная длина строки могла быть вначале (до выполнения всех операций)?

\(^{\dagger}\) Бинарная строка это строка (возможно пустая), содержащая только символы \(\texttt{0}\) или \(\texttt{1}\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит целое число \(n\) (\(1 \leq n \leq 2000\)) — длину строки Тимура после выполнения всех операций.

Вторая строка каждого набора содержит строку \(s\) длины \(n\), состоящую из символов \(\texttt{0}\) или \(\texttt{1}\), обозначающая финальную строку Тимура.

Выходные данные

Для каждого набора входных данных выведите единственное неотрицательное целое число — наименьшую возможную длину изначальной строки Тимура. Обратите внимание, что изначальная строка Тимура может быть пустой, в этом случае выведите \(0\).

Примечание

В первом наборе входных данных, кратчайшая изначальная строка Тимура это \(\texttt{0}\). К ней он применил следующую операцию: \(\texttt{0} \to \color{red}{\texttt{1}}\texttt{0}\color{red}{\texttt{0}}\).

Во втором наборе, кратчайшая изначальная строка Тимура это \(\texttt{11}\). К ней он применил следующую операцию: \(\texttt{11} \to \color{red}{\texttt{0}}\texttt{11}\color{red}{\texttt{1}}\).

В третьем наборе, кратчайшая изначальная строка Тимура это \(\texttt{10101}\) и он не применял к ней никаких операций.

В четвертом наборе, кратчайшая изначальная строка Тимура это пустая строка (обозначим её как \(\varepsilon\)). К ней он применил следующие операции: \(\varepsilon \to \color{red}{\texttt{1}}\texttt{}\color{red}{\texttt{0}} \to \color{red}{\texttt{0}}\texttt{10}\color{red}{\texttt{1}} \to \color{red}{\texttt{1}}\texttt{0101}\color{red}{\texttt{0}}\).

В пятом наборе, кратчайшая изначальная строка Тимура это \(\texttt{101}\). К ней он применил следующие операции: \(\texttt{101} \to \color{red}{\texttt{0}}\texttt{101}\color{red}{\texttt{1}} \to \color{red}{\texttt{1}}\texttt{01011}\color{red}{\texttt{0}}\).

D. Московские гориллы

Бинарный поиск дп жадные алгоритмы математика реализация *1800

Зимой обитателям Московского зоопарка очень скучно, в частности, это касается горилл. Вы решили развлечь их и принесли в зоопарк перестановку \(p\) длины \(n\).

Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но \(4\) присутствует в массиве).

У горилл оказалась своя перестановка \(q\) длины \(n\). Они предложили вам посчитать количество пар целых чисел \(l, r\) (\(1 \le l \le r \le n\)) таких, что \(\operatorname{MEX}([p_l, p_{l+1}, \ldots, p_r])=\operatorname{MEX}([q_l, q_{l+1}, \ldots, q_r])\).

\(\operatorname{MEX}\) последовательности это минимальное целое положительное число, отсутствующее в этой последовательности. Например, \(\operatorname{MEX}([1, 3]) = 2\), \(\operatorname{MEX}([5]) = 1\), \(\operatorname{MEX}([3, 1, 2, 6]) = 4\).

Вы не хотите рисковать своим здоровьем, поэтому не посмеете отказать гориллам.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина перестановок.

Вторая строка содержит \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)) — элементы перестановки \(p\).

Третья строка содержит \(n\) различных целых чисел \(q_1, q_2, \ldots, q_n\) (\(1 \le q_i \le n\)) — элементы перестановки \(q\).

Выходные данные

Выведите одно целое число — количество подходящих пар \(l\) и \(r\).

Примечание

В первом примере подходят два отрезка — \([1, 3]\), для которого \(\operatorname{MEX}\) в обоих массивах равен \(4\), и \([3, 3]\), для которого \(\operatorname{MEX}\) в обоих массивах равен \(1\).

Во втором примере, например, подходит отрезок \([1, 4]\), а отрезок \([6, 7]\) не подходит, потому что \(\operatorname{MEX}(5, 4) \neq \operatorname{MEX}(1, 4)\).

F. Ребрендинг

Перебор разделяй и властвуй реализация Структуры данных *2600

Костя и Женя - создатели группы «Бумага» - после выпуска легендарного альбома решили создать новое музыкальное объединение «Дневные грузчики», для этого им нужно найти двух новых людей.

Они пригласили на кастинг \(n\) человек. Кастинг продлится \(q\) дней. В \(i\)-й из дней Костя и Женя хотят найти двух человек на отрезке с \(l_i\) по \(r_i\), которые больше всего подходят их объединению. Так как «Дневные грузчики» занимаются современным искусством,  музыкальные навыки им не важны и они смотрят лишь на внешние признаки: им хочется, чтобы разница роста двух людей была как можно меньше.

Помогите им, и для каждого дня укажите минимальную разницу роста людей с кастинга на данном отрезке!

Входные данные

В первой строке вам дано два целых числа \(n\) и \(q\) (\(2 \leq n \leq 3 \cdot 10^5, 1 \leq q \leq 10^6\)) — количество людей, которые пришли на кастинг, а также количество дней кастинга.

Во второй строке вам даны \(n\) целых чисел \(a_1, a_2, a_3, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — рост каждого из кандидатов.

Также гарантируется, что все \(a_i\) различны.

В следующих \(q\) строках даны по два целых числа \(l_i\) и \(r_i\) (\(1 \leq l_i < r_i \leq n\)) — отрезок людей в \(i\)-й день кастинга.

Выходные данные

Выведите \(q\) строк. В \(i\)-й строке должна быть минимальная разница роста между двумя кандидатами на отрезке в \(i\)-й день кастинга.

Примечание

В первом примере минимальная разность на отрезке \([1, 2]\) составляет \(2\), на отрезке \([2, 3]\)\(1\), на отрезке \([1, 3]\) также \(1\).

В третьем примере минимальную разность на отрезке \([4, 6]\) составляют числа \(3\) и \(5\) (\(5 - 3 = 2\)). На отрезке \([1, 2]\) минимальную разность имеют числа \(2\) и \(6\) (\(6 - 2 = 4\)). На отрезке \([3, 6]\) минимальную разность имеют числа \(1\) и \(3\) (\(3 - 1 = 2\)). На отрезке \([1, 3]\) минимальную разность образуют числа \(1\) и \(2\) (\(2 - 1 = 1\)).

E. Разметка дерева расстояниями

Деревья дп жадные алгоритмы реализация Структуры данных хэши *2400

Вам задано невзвешенное дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\), и список из \(n-1\) целого числа \(a_1, a_2, \ldots, a_{n-1}\). Дерево — это связный неориентированный граф без циклов. Вы можете использовать каждый элемент списка, чтобы пометить одну из вершин дерева. Никакая вершина не должна быть помечена дважды. Вы можете пометить единственную оставшуюся непомеченной вершину любым целым числом.

Вершина \(x\) называется хорошей, если можно так пометить вершины, чтобы для каждой вершины \(i\) ее метка была равна расстоянию между \(x\) и \(i\). Расстояние между двумя вершинами \(s\) и \(t\) на дереве — это минимальное количество ребер на пути, который начинается в вершине \(s\) и заканчивается в вершине \(t\).

Найдите все хорошие вершины.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2\le n\le 2\cdot 10^5\)) — число вершин в дереве.

Вторая строка содержит \(n - 1\) целое число \(a_1,a_2,\ldots,a_{n-1}\) (\(0\le a_i < n\)) — заданный список.

Затем следуют \(n−1\) строк. Каждая из них содержит два целых числа \(u\) и \(v\) (\(1\le u,v\le n\)), обозначающие ребро между вершинами \(u\) и \(v\). Гарантируется, что ребра образуют дерево.

Выходные данные

В первой строке выведите количество хороших вершин.

Во второй строке выведите номера всех хороших вершин в порядке возрастания.

Примечание

На рисунке ниже показано дерево для первого примера:

На рисунке ниже показаны две возможные разметки, такие что \(2\) — хорошая вершина (слева) и \(4\) — хорошая вершина (справа).

Квадрат под каждой вершиной означает ее метку. Черные квадраты содержат числа, которые были в данном списке, а единственный белый квадрат содержит единственное число, которого не было в данном списке.

Во втором примере единственной хорошей вершиной является вершина \(3\).

В третьем примере хороших вершин нет.

A. Две башни

Перебор реализация Строки *800

Даны две башни, состоящие из кубиков двух цветов: красные и синие. Обе башни описываются строками, состоящими из символов B и/или R, задающими порядок кубиков в них снизу вверх, где B соответствует синему кубику, а R соответствует красному кубику.

Эти две башни задаются строками BRBB и RBR.

Можно выполнять следующую операцию произвольное количество раз: выбрать башню с хотя бы двумя кубиками и переместить ее верхний кубик на вершину другой башни.

Пара башен называется красивой, если все пары соседних кубиков различных цветов; т. е. никакой красный кубик не лежит на другом красном кубике и никакой синий кубик не лежит на другом синем кубике.

Ваша задача — проверить, можно ли совершить несколько (возможно, ноль) операций так, чтобы пара башен стала красивой.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из трех строк:

  • в первой строке записаны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 20\)) — количество кубиков в первой башне и количество кубиков во второй башне, соответственно;
  • во второй строке записана \(s\) — строка, состоящая из \(n\) символов B и/или R, задающая первую башню;
  • в третьей строке записана \(t\) — строка, состоящая из \(m\) символов B и/или R, задающая вторую башню.
Выходные данные

На каждый набор входных данных выведите YES, если возможно совершить несколько (возможно, ноль) операций так, чтобы пара башен стала красивой; иначе выведите NO.

Каждую букву можно выводить в любом регистре (YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

Примечание

В первом наборе входных данных можно переместить верхний кубик с первой башни на вторую башню (смотрите третью картинку).

Во втором наборе входных данных можно переместить верхний кубик со второй башни на первую башню \(6\) раз.

В третьем наборе входных данных пара башен уже красивая.

C. Дегустация чая

Бинарный поиск реализация Структуры данных *1500

Производитель чая рашил организовать огромную церемонию дегустации чая. \(n\) дегустаторов будут пробовать \(n\) сортов чая. И сорта чая, и дегустаторы пронумерованы от \(1\) до \(n\). Производитель подготовил \(a_i\) миллилитров \(i\)-го сорта чая. \(j\)-й дегустатор способен выпить \(b_j\) миллилитров чая за раз.

Дегустация будет происходить по этапам. На первом этапе \(i\)-й дегустатор попробует \(i\)-й сорт чая. \(i\)-й дегустатор выпивает \(\min(a_i, b_i)\) чая (сколько доступно \(i\)-го сорта чая и сколько \(i\)-й дегустатор способен выпить). \(a_i\) также уменьшается на это количество.

Затем все дегустаторы переходят к предыдущему сорту чая. Тогда на втором этапе \(i\)-й дегустатор пробует \((i-1)\)-й сорт чая. \(i\)-й дегустатор выпивает \(\min(a_{i-1}, b_i)\) чая. \(1\)-й дегустатор заканчивает дегустацию.

На третьем этапе \(i\)-й дегустатор пробует \((i-2)\)-й сорт чая. \(2\)-й дегустатор заканчивает дегустацию. Это продолжается, пока все дегустаторы не закончат дегустацию.

Рассмотрим процесс дегустации для \(n = 3\), \(a = [10, 20, 15]\), \(b = [9, 8, 6]\). В левом столбце записаны текущие количества каждого сорта чая. В правом столбце записаны текущие выпитые количества чая для каждого дегустатора. Стрелка указывает, какой дегустатор пьет каждый чай на текущем шаге. Число на стрелке — это количество — минимум из того, сколько доступно сорта чая, и того, сколько может выпить дегустатор.

Для каждого дегустатора выведите, сколько миллилитров чая он/она суммарно выпьет.

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество сортов чая и количество дегустаторов.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — количество каждого сорта чая.

В третьей строке записаны \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le 10^9\)) — количество чая, которое каждый дегустатор может выпить за раз.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите \(n\) целых чисел — \(i\)-е значение должно быть равно суммарному количеству чая, выпитому \(i\)-м дегустатором.

Примечание

Первый набор входных данных описан в условии. Здесь предоставлены оставшиеся количества каждого сорта чая после каждого этапа и количество выпитого каждым дегустатором чая:

  • \(a = [1, 12, 9]\), \(\mathit{ans} = [9, 8, 6]\)
  • \(a = [0, 6, 9]\), \(\mathit{ans} = [9, 9, 12]\)
  • \(a = [0, 6, 9]\), \(\mathit{ans} = [9, 9, 12]\)

Во втором наборе входных данных единственный дегустатор выпьет \(\min(5, 7)\) миллилитров чая единственного сорта.

Здесь предоставлены оставшиеся количества каждого сорта чая после каждого этапа и количество выпитого каждым дегустатором чая для третьего набора входных данных:

  • \(a = [10, 4, 3, 3]\), \(\mathit{ans} = [3, 4, 2, 1]\);
  • \(a = [6, 2, 2, 3]\), \(\mathit{ans} = [3, 8, 4, 2]\);
  • \(a = [4, 1, 2, 3]\), \(\mathit{ans} = [3, 8, 6, 3]\);
  • \(a = [3, 1, 2, 3]\), \(\mathit{ans} = [3, 8, 6, 4]\).

Здесь предоставлены оставшиеся количества каждого сорта чая после каждого этапа и количество выпитого каждым дегустатором чая для четвертого набора входных данных:

  • \(a = [999999999, 999999999, 0]\), \(\mathit{ans} = [1, 1, 1000000000]\);
  • \(a = [999999998, 0, 0]\), \(\mathit{ans} = [1, 2, 1999999999]\);
  • \(a = [0, 0, 0]\), \(\mathit{ans} = [1, 2, 2999999997]\).

A. Типичная задача с интервью

Перебор реализация Строки *800

FB-строка формируется следующим образом. Изначально она пустая. Рассмотрим все положительные целые числа, начиная с \(1\), в возрастающем порядке, и для каждого из них сделаем следующее:

  • если текущее число делится на \(3\), допишем F в конец FB-строки;
  • если текущее число делится на \(5\), допишем B в конец FB-строки.

Обратите внимание, что если число делится и на \(3\), и на \(5\), мы сначала приписываем F, потом B, не в обратном порядке.

Первые \(10\) символов FB-строки — это FBFFBFFBFB: первый символ F соответствует числу \(3\), следующий за ним символ (B) соответствует числу \(5\), следующий F соответствует числу \(6\), и так далее. Легко заметить, что эта строка бесконечна. Обозначим за \(f_i\) \(i\)-й символ FB-строки; например, \(f_1\) — это F, \(f_2\) — это B, \(f_3\) —- это F, \(f_4\) — это F, и так далее.

Нам дана строка \(s\), состоящая из символов F и/или B. Вы должны определить, является ли она подстрокой (непрерывной подпоследовательностью) FB-строки. Другими словами, проверьте, можно ли выбрать два целых числа \(l\) и \(r\) (\(1 \le l \le r\)) так, чтобы строка \(f_l f_{l+1} f_{l+2} \dots f_r\) была в точности равна \(s\).

Например:

  • FFB — подстрока FB-строки: можно выбрать \(l = 3\) и \(r = 5\), строка \(f_3 f_4 f_5\) — это в точности FFB;
  • BFFBFFBF — подстрока FB-строки: можно выбрать \(l = 2\) и \(r = 9\), строка \(f_2 f_3 f_4 \dots f_9\)— это в точности BFFBFFBF;
  • BBB — не подстрока FB-строки.
Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 2046\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк. В первой из них задано одно целое число \(k\) (\(1 \le k \le 10\)) — количество символов в \(s\). Во второй задана строка \(s\), состоящая из ровно \(k\) символов. Каждый символ \(s\) — либо F, либо B.

Выходные данные

Для каждого набора входных данных выведите YES, если \(s\) — подстрока FB-строки, или NO, если это не так.

Каждую букву можно выводить в любом регистре (например, YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

B. Хитрый шаблон

реализация Строки *1000

Заданы две строки \(a\) и \(b\), состоящие из строчных латинских букв.

Шаблон \(t\) — это строка, состоящая из строчных латинских букв и звездочек (символ '*'). Шаблон называется хитрым, если количество звездочек в нем меньше или равно количеству букв в нем.

Говорят, что строка \(s\) подходит под шаблон \(t\), если можно заменить каждую звездочку в \(t\) на строку из строчных лантинских букв (возможно, пустую) так, чтобы он стал равен \(s\).

Найдите такой хитрый шаблон, что и \(a\), и \(b\) подходят под него или скажите, что такого шаблона не существует. Если существуют несколько ответов, то выведите любой из них.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записана строка \(a\) (\(1 \le |a| \le 50\), где \(|a|\) — это длина \(a\)), состоящая из строчных латинских букв.

Во второй строке записана строка \(b\) (\(1 \le |b| \le 50\)), состоящая из строчных латинских букв.

Выходные данные

На каждый набор входных данных выведите «NO», если не существует хитрого шаблона, под который подходят и \(a\), и \(b\). Иначе в первой строке выведите «YES», а во второй строке выведите шаблон. Если существуют несколько ответов, то выведите любой из них.

Шаблон должен состоять только из строчных латинских букв и звездочек (символ '*'). Количество звездочек должно быть меньше или равно количеству букв.

Примечание

В первом наборе входных данных в шаблоне «*b» можно заменить единственную звездочку на «aaa» и получить «aaab» (что равно \(a\)) или на «zzz» и получить «zzzb» (что равно \(b\)).

В третьем наборе входных данных шаблон «*o*» не хитрый, так как в нем больше звездочек, чем букв. Не существует хитрых шаблонов, под которые подходят и \(a\), и \(b\).

В четвертом наборе входных данных в шаблоне «a*a*a*a» можно заменить все звездочки на пустые строки и получить «aaaa» (что равно \(a\)) или два из них на «a» и два на пустые строки и получить «aaaaaa» (что равно \(b\)).

В пятом наборе входных данных в шаблоне «abcd» нет звездочек, поэтому только «abcd» может подходить под него (что по счастливой случайности равно и \(a\), и \(b\)).

A. Li Hua и лабиринт

графы жадные алгоритмы Конструктив Потоки реализация *800

Имеется прямоугольный лабиринт размером \(n\times m\). Обозначим \((r,c)\) как клетку в \(r\)-й строке сверху и \(c\)-м столбце слева. Две клетки называются соседними, если они имеют общую сторону. Путь — это последовательность пустых клеток, в которой любые две подряд идущие клетки являются соседними.

Каждая клетка изначально пуста. Li Hua может выбрать несколько клеток (кроме \((x_1, y_1)\) и \((x_2, y_2)\)) и поместить в каждую из них препятствие. Он хочет узнать минимальное количество препятствий, которые нужно поставить, чтобы не существовало пути из \((x_1, y_1)\) в \((x_2, y_2)\).

Предположим, что вы Li Hua. Пожалуйста, решите эту задачу.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n,m\) (\(4\le n,m\le 10^9\)) — размер лабиринта.

Вторая строка каждого набора входных данных содержит четыре целых числа \(x_1,y_1,x_2,y_2\) (\(1\le x_1,x_2\le n, 1\le y_1,y_2\le m\)) — координаты начальной и конечной клетки.

Гарантируется, что \(|x_1-x_2|+|y_1-y_2|\ge 2\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество препятствий, которое нужно поставить на поле, чтобы не существовало пути из \((x_1, y_1)\) в \((x_2, y_2)\).

Примечание

В первом наборе входных данных можно поставить препятствия на \((1,3), (2,3), (3,2), (4,2)\). Тогда путь из \((2,2)\) в \((3,3)\) не будет существовать.

D. Li Hua и дерево

Деревья дп Перебор поиск в глубину и подобное реализация Структуры данных *1900

У Li Hua есть дерево с \(n\) вершинами и \(n-1\) ребром. Корнем дерева является вершина \(1\). Каждая вершина \(i\) имеет важность \(a_i\). Обозначим размер поддерева как количество вершин в нем, а важность как сумму важности вершин в нем. Обозначим тяжелым сыном нелистовой вершины сына с наибольшим размером поддерева. Если таких вершин несколько, то тяжёлым сыном будет та, у которой индекс минимален.

Li Hua хочет выполнить \(m\) операций:

  • «1 \(x\)» (\(1\leq x \leq n\)) — вычислить важность поддерева, корнем которого является \(x\).
  • «2 \(x\)» (\(2\leq x \leq n\)) — повернуть тяжёлого сына поддерева \(x\) вверх. Формально, обозначим как \(son_x\) тяжелого сына \(x\), \(fa_x\) как отца \(x\). Он хочет удалить ребро между \(x\) и \(fa_x\) и добавить ребро между \(son_x\) и \(fa_x\). Гарантируется, что \(x\) не является корнем, но не гарантируется, что \(x\) не является листом. Если \(x\) является листом, проигнорируйте эту операцию.

Предположим, что вы Li Hua. Пожалуйста, решите эту задачу.

Входные данные

Первая строка содержит 2 целых числа \(n,m\) (\(2\le n\le 10^{5},1\le m\le 10^{5}\)) — количество вершин в дереве и количество операций.

Вторая строка содержит \(n\) целых чисел \(a_{1},a_{2},\ldots ,a_{n}\) (\(-10^{9}\le a_{i}\le 10^{9}\)) — важность каждой вершины.

Следующие \(n-1\) строк содержат рёбра дерева. В \(i\)-й строке записаны два целых числа \(u_i\) и \(v_i\) (\(1\le u_i,v_i\le n\), \(u_i\ne v_i\)) — соответствующее ребро. Данные рёбра образуют дерево.

Следующие \(m\) строк содержат операции — по одной операции в строке. \(j\)-я операция содержит два целых числа \(t_{j},x_{j}\) (\(t_{j}\in \{1,2\}\), \(1 \leq x_{j} \leq n\), \(x_{j}\neq 1\) если \(t_j = 2\)) — \(j\)-я операция.

Выходные данные

Для каждого запроса вида «1 \(x\)» выведите ответ в отдельной строке.

Примечание

В первом примере:

Начальное дерево показано на следующем рисунке:

Важность поддерева \(6\) равна \(a_6+a_7=2\).

После поворота тяжелого сына вершины \(3\) (которым является \(6\)) вверх, дерево будет выглядеть следующим образом:

Важность поддерева \(6\) равна \(a_6+a_3+a_7=3\).

Важность поддерева \(2\) - \(a_2+a_4+a_5=3\).

A. Гвоздь программы

жадные алгоритмы реализация сортировки *800

Вам даны два массива \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_n\).

За одну операцию можно выбрать любое число \(i\) от \(1\) до \(n\) и поменять местами числа \(a_i\) и \(b_i\).

Определите, можно ли после использования некоторого (возможно, нулевого) количества операций добиться одновременного выполнения следующих двух условий:

  • \(a_n = \max(a_1, a_2, \ldots, a_n)\),
  • \(b_n = \max(b_1, b_2, \ldots, b_n)\).

Здесь запись \(\max(c_1, c_2, \ldots, c_k)\) обозначает максимальное из чисел \(c_1, c_2, \ldots, c_k\). Например \(\max(3, 5, 4) = 5\), \(\max(1, 7, 7) = 7\), \(\max(6, 2) = 6\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)) — длина массивов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 100\)) — элементы первого массива.

Третья строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le 100\)) — элементы второго массива.

Выходные данные

Для каждого набора входных данных в отдельной строке выведите «Yes», если после применения некоторого (возможно, нулевого) количества операций можно добиться выполнения описанных условий. В противном случае выведите «No».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных можно поменять местами числа \(a_3\) и \(b_3\), после чего массив \(a\) станет равным \([7, 9, 9]\), а массив \(b\) станет равным \([7, 6, 7]\) и оба условия будут выполнены.

Во втором наборе входных данных можно показать, что выполнить условия невозможно.

В третьем наборе входных данных можно поменять местами числа \(a_1\) и \(b_1\), после чего массив \(a\) станет равным \([99, 99]\), а массив \(b\) станет равным \([100, 100]\) и оба условия будут выполнены.

В пятом наборе входных данных можно поменять местами \(a_7\) и \(b_7\), \(a_8\) и \(b_8\), \(a_9\) и \(b_9\), после чего массив \(a\) станет равным \([1, 2, 3, 4, 5, 6, 6, 6, 6]\), а массив \(b\) станет равным \([9, 9, 9, 9, 9, 9, 7, 8, 9]\) и оба условия будут выполнены.

B. Три семёрки

жадные алгоритмы Перебор реализация Структуры данных *1000

Лотерея «Три Семёрки» проводилась \(m\) дней. В день \(i\) в лотерее участвовали \(n_i\) людей с номерами \(a_{i, 1}, \ldots, a_{i, n_i}\).

Известно, что в каждый из \(m\) дней из участников лотереи выбирался ровно один победитель. Победителю лотереи в день \(i\) запрещено участвовать в лотерее в дни с номерами от \(i+1\) до \(m\).

К сожалению, информация о победителях лотереи была утеряна. Вам нужно восстановить любой возможный список победителей лотереи в дни с номерами от \(1\) до \(m\) или определить, что это невозможно.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 50\,000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(m\) (\(1 \le m \le 50\,000\)) — количество дней, в которые проводилась лотерея.

Далее для каждого \(i\) от \(1\) до \(m\) находится блок данных из двух строк.

В первой строке каждого блока находится одно целое число \(n_i\) (\(1 \le n_i \le 50\,000\)) — количество участников лотереи в день \(i\).

Во второй строке блока находятся числа \(a_{i, 1}, \ldots, a_{i, n_i}\) (\(1 \le a_{i, j} \le 50\,000\)) — номера участников лотереи в день \(i\). Гарантируется, что все числа \(a_{i, 1}, \ldots, a_{i, n_i}\) попарно различны.

Гарантируется, что сумма значений \(n_i\) по всем блокам всех наборов входных данных не превосходит \(50\,000\).

Выходные данные

Для каждого набора входных данных, если решения не существует, выведите одно целое число \(-1\).

Иначе выведите \(m\) целых чисел \(p_1, p_2, \ldots, p_m\) (\(1 \le p_i \le 50\,000\)) — номера победителей лотереи в дни с \(1\) по \(m\). Если существует несколько корректных решений, выведите любое из них.

Примечание

В первом наборе входных данных один из подходящих ответов \([8, 2, 1]\), так как участник с номером \(8\) участвовал в день \(1\), но не участвовал в дни \(2\) и \(3\); участник с номером \(2\) участвовал в день \(2\), но не участвовал в день \(3\); а участник с номером \(1\) участвовал в день \(3\). Обратите внимание, что это не единственный возможный ответ, например, \([8, 9, 4]\) также является верным ответом.

Во втором наборе входных данных оба участника лотереи участвовали в обоих днях лотереи, значит любой возможный победитель лотереи в день \(1\) обязательно участвовал в день \(2\), значит подходящего ответа не существует.

В третьем наборе входных данных в дни \(2\), \(3\) и \(4\) участвовал только один участник, а в день \(1\) единственный участник, не участвовавший в лотерее в днях \(2, 3, 4\) — это участник \(2\). Значит \([2, 1, 4, 3]\) — единственно верный ответ.

A. Прямой эфир

жадные алгоритмы математика реализация Структуры данных *800

На Codeforces поле «Прямой эфир» показывает последние \(n\) постов, в которых были обновления.

Изначально там находятся посты \(1, 2, \ldots, n\) (в таком порядке сверху вниз). Также есть бесконечно много постов, которые не находятся в поле, пронумерованных целыми числами \(n + 1, n + 2, \ldots\).

Когда обновление происходит в посте \(p\):

  • Если пост находится в поле «Прямой эфир», он перемещается со своей позиции на самую верхнюю.
  • Иначе он добавляется в поле на самую верхнюю позицию, а пост на самой нижней позиции удаляется из поля «Прямой эфир».

Вы знаете, что следующие \(m\) обновлений произойдут в постах \(p_1, p_2, \ldots, p_m\) (\(n + 1 \leq p_i \leq n + m\)) в моменты времени \(1, 2, \ldots, m\). Обратите внимание, что обновления происходят только с постами имеющими номер \(\geq n + 1\).

Для каждого поста \(i\) (\(1 \leq i \leq n\)) найдите минимальный момент времени, когда он будет удален из поля «Прямой эфир», или скажите, что он не будет удален.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Описания наборов входных данных следуют.

Первая строка описания каждого набора входных данных содержит два целых числа \(n\), \(m\) (\(1 \leq n, m \leq 5 \cdot 10^4\)) — размер поля «Прямой эфир» и количество действий.

В следующей строке находятся \(m\) целых чисел \(p_1, p_2, \ldots, p_m\) (\(n + 1 \leq p_i \leq n + m\)).

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превосходят \(5 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел \(t_1, t_2, \ldots, t_n\), где \(t_i=-1\), если пост \(i\) не будет удален, иначе \(t_i\) равняется первому моменту времени, когда пост \(i\) будет удален (\(1 \leq t_i \leq m\)).

Примечание

В первом наборе входных данных единственный пост \(1\) будет удален в момент времени \(1\) и будет заменен на пост \(2\).

Во втором наборе входных данных поле «Прямой эфир» будет (в порядке сверху вниз):

  1. Перед моментом времени \(1\): \([1, 2, 3]\), после момента времени \(1\): \([5, 1, 2]\). Пост \(3\) был удален.
  2. Перед моментом времени \(2\): \([5, 1, 2]\), после момента времени \(2\): \([4, 5, 1]\). Пост \(2\) был удален.

Пост \(1\) не будет удален.

Во третьем наборе входных данных поле «Прямой эфир» будет (в порядке сверху вниз):

  1. Перед моментом времени \(1\): \([1, 2, 3, 4]\), после момента времени \(1\): \([5, 1, 2, 3]\). Пост \(4\) был удален.
  2. Перед моментом времени \(2\): \([5, 1, 2, 3]\), после момента времени \(2\): \([9, 5, 1, 2]\). Пост \(3\) был удален.
  3. Перед моментом времени \(3\): \([9, 5, 1, 2]\), после момента времени \(3\): \([9, 5, 1, 2]\). Ничего не изменилось.
  4. Перед моментом времени \(4\): \([9, 5, 1, 2]\), после момента времени \(4\): \([5, 9, 1, 2]\). Поменялся только порядок постов.
  5. Перед моментом времени \(5\): \([5, 9, 1, 2]\), после момента времени \(5\): \([7, 5, 9, 1]\). Пост \(2\) был удален.

Пост \(1\) не будет удален.

E. Объединение городов

геометрия жадные алгоритмы Конструктив математика поиск в глубину и подобное реализация снм *2300

Вам дана таблица \(n \times m\). Некоторые клетки заполнены, некоторые пустые.

Город — это максимальное (по включению) множество заполненных клеток, такое что можно дойти из любой клетки города до любой другой клетки города, перемещаясь в соседние по стороне клетки, только по клеткам города. Другими словами, город — это компонента связности заполненных клеток, где ребро проводится между соседними по стороне заполненными клетками.

Изначально в таблице находятся два города. Вы хотите поменять некоторые пустые клетки на заполненные, так что выполняются два условия:

  • В таблице находится один город.
  • Кратчайший путь между любыми двумя заполненными клетками, если можно перемещаться только по заполненным клеткам, равно манхеттенскому расстоянию между клетками.

Манхеттенское расстояние между двумя клетками \((a, b)\) и \((c, d)\) равняется \(|a - c| + |b - d|\).

Найдите способ заполнить некоторые клетки, чтобы все условия выполнялись и общее количество заполненных клеток было минимально.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных. Описания наборов входных данных следуют.

В первой строке описания каждого набора входных данных находится два целых числа \(n\), \(m\) (\(1 \le n, m \le 50\), \(nm \geq 3\)).

Следующие \(n\) строк описывают таблицу. В \(i\)-й строке находится строка \(s_i\) длины \(m\). Символ \(s_{i,j}\) равен '#', если клетка \((i, j)\) заполнена, и '.', если клетка пустая.

Гарантируется, что изначально в таблице ровно два города.

Гарантируется, что сумма \(n\cdot m\) по всем наборам входных данных не превосходит \(25\,000\).

Выходные данные

Для каждого набора входных данных выведите \(n\) строк, каждая содержит строку длины \(m\) — описание таблицы, которую вы сделали в том же формате, что во входных данных.

Если существует несколько возможных способов заполнить некоторые пустые клетки, чтобы общее количество заполненных клеток было минимально, выведите любой.

Примечание

В первом наборе входных данных мы добавляем одну заполненную клетку между двумя городами, чтобы соединить их. Можно убедиться, что второе условие также выполняется.

Во втором наборе входных данных мы также соединяем города одной заполненной клеткой, также выполняя второе условие.

В третьем наборе входных данных, обратите внимание, что если мы заполним 3 клетки слева сверху, города будут соединены, однако второе условие не будет выполняться для пары клеток \((4, 2)\) и \((2, 4)\).

C. Полоска

реализация Структуры данных *1200

Однажды Вася взял бумажную полоску из n клеток (высота полоски равна 1 клетке) и в каждой клетке написал целое число, возможно отрицательное. Ему стало интересно, сколько есть способов разрезать полоску на две части так, что сумма чисел в одной части равна сумме чисел в другой части, и в каждой части содержится целое положительное число клеток. Помогите Васе решить эту задачу.

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 105) — количество клеток в полоске. Во второй строке содержится n чисел, разделенных пробелами — числа, записанные в клетках полоски. Эти числа целые и не превосходят по модулю 10000.

Выходные данные

Выведите число способов разрезать полоску на две непустые части так, чтобы сумма чисел в одной части была равна сумме чисел в другой части. Не забудьте, что разрезать полоску разрешается только по границам клеток.

A. Дефрагментация

реализация *1800

В этой задаче вам предстоит реализовать алгоритм дефрагментации жесткого диска. Жесткий диск состоит из последовательности кластеров, пронумерованных целыми числами от 1 до n. На диске записано m файлов, i-й файл занимает кластеры с номерами ai, 1, ai, 2, ..., ai, ni. Эти кластеры не обязательно расположены последовательно на диске, однако порядок их задания соответствует их последовательности в файле (в кластере ai, 1 содержится первый фрагмент i-го файла, в кластере ai, 2 — второй фрагмент и т.д.). Также на диске обязательно имеется один или несколько свободных кластеров, не занятых файлами.

Разрешается выполнять операции копирования содержимого кластера с номером i в кластер с номером j (i и j должны быть различны). При этом если в кластере с номером j хранилась какая-то информация, она утрачивается безвозвратно. Кластеры не очищаются, просто после завершения дефрагментации некоторые из них объявляются неиспользуемыми (хотя, возможно, продолжают содержать некоторые фрагменты файлов).

Ваша задача — с помощью некоторой последовательности операций копирования добиться того, чтобы каждый файл занимал непрерывную область памяти. Каждый файл должен занимать последовательный участок кластеров, файлы должны следовать один за другим от начала жесткого диска. Все свободные (неиспользуемые) кластеры после дефрагментации должны оказаться в конце жесткого диска. После дефрагментации файлы могут располагаться в произвольном порядке. Кластеры каждого из файлов должны идти подряд от первого до последнего. Смотрите поясняющее примеры в примечании.

Выведите последовательность операций, приводящих к дефрагментации диска. Обратите внимание, что не требуется минимизировать количество операций, однако оно не должно превосходить 2n.

Входные данные

В первой строке содержатся два целых числа n и m (1 ≤ n, m ≤ 200) — количество кластеров и количество файлов, соответственно. Следующие m строк содержат описания файлов. Первое число в строке — ni (ni ≥ 1), количество кластеров, которые занимает i-й файл. Далее следуют ni чисел ai, 1, ai, 2, ..., ai, ni (1 ≤ ai, j ≤ n). Гарантируется, что каждый номер кластера встречается не более одного раза и , т.е. существует хотя бы один неиспользуемый кластер. Числа в каждой строке разделены пробелами.

Выходные данные

В первой строке выведите одно целое число k (0 ≤ k ≤ 2n) — количество операций, требующихся для дефрагментации диска. Следующие k строк должны содержать описания операций в формате «i j» (скопировать содержимое кластера с номером i в кластер с номером j).

Примечание

Пусть диск состоит из 8 кластеров и на нем расположены два файла. Первый файл занимает два кластера, второй — три кластера. Рассмотрим примеры корректного и некорректного расположения файлов после дефрагментации.

Пример 2: каждый файл должен занимать непрерывную область памяти.

Пример 3: порядок файлов между собой не важен, сначала может быть записан второй файл, потом — первый.

Пример 4: нарушать порядок фрагментов файла между собой не разрешается.

Пример 5: неиспользуемые кластеры должны располагаться в конце, а в данном примере неиспользуемые кластеры — 3, 7, 8.

F. Задача про матанализ!

Конструктив математика реализация *1200

Студенты 199-ой группы очень плохо записывали лекции во время семестра. Подходит время экзамена по матанализу, поэтому надо как-то исправлять ситуацию. Будем считать, что студенты группы пронумерованы от 1 до n, а у каждого студента i (1 ≤ i ≤ n) есть его лучший друг p[i] (1 ≤ p[i] ≤ n). Так получилось, что каждый из студентов является лучшим другом ровно одного студента, иными словами все p[i] — различны. Возможно, в группе присутствуют такие «оригиналы», для которых i = p[i].

Каждый студент за семестр исписал ровно одну тетрадь. Известно, что студенты договорились действовать по следующему алгоритму:

  • в первый день подготовки каждый студент учит матанализ по своим лекциям,
  • утром каждого следующего дня каждый студент передает тетрадку с лекциями своему лучшему другу, но получает тетрадку от студента, чьим лучшим другом он является.

Так, во второй день тетрадка i-го студента находится у студента p[i] (1 ≤ i ≤ n), в третий день у студента p[p[i]] и так далее. В силу особенностей того, как дружат ребята (см. первый абзац), каждый день у каждого студента есть ровно одна тетрадь с лекциями.

Вам заданы две последовательности, описывающие ситуацию на третий и четвертый день подготовки:

  • a1, a2, ..., an, где ai обозначает студента, у кого в третий день подготовки находится тетрадь i-го студента;
  • b1, b2, ..., bn, где bi обозначает студента, у кого в четвертый день подготовки находится тетрадь i-го студента.

Вам неизвестен массив p, то есть неизвестно, кто является чьим лучшим другом. Напишите программу, которая по заданным последовательностям a и b находит p.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество студентов в группе. Вторая строка содержит последовательность различных целых чисел a1, a2, ..., an (1 ≤ ai ≤ n). Третья строка последовательность различных целых чисел b1, b2, ..., bn (1 ≤ bi ≤ n).

Выходные данные

Выведите последовательность n различных целых p[1], p[2], ..., p[n] (1 ≤ p[i] ≤ n). Гарантируется, что решение существует и оно единственно.

A. Это кошка?

реализация Строки *800

Вы шли по улице и услышали некоторый звук. Звук описывается строкой \(s\), состоящей из строчных и заглавных латинских символов. Теперь вы хотите понять, являлся ли этот звук мяуканьем кошки.

Звук является мяуканьем, если описывающая его строка состоит только из символов 'm', 'e', 'o', 'w', записанных в любом регистре. При этом:

  • строка должна начинаться с последовательности, состоящей только из символов 'm' или 'M';
  • сразу за ней должна следовать последовательность, состоящая только из символов 'e' или 'E';
  • сразу за ней должна следовать последовательность, состоящая только из символов 'o' или 'O';
  • сразу за ней должна следовать последовательность, состоящая только из символов 'w' и 'W', эта последовательность завершает строку, после этой последовательности сразу наступает конец строки.

Например, строки «meow», «mMmmEeOWwW», «MeOooOw» описывают мяуканье, а строки «Mweo», «MeO», «moew», «MmEW», «meowmeow» — нет.

Определите, услышали вы мяуканье кошки или какой-то другой звук?

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных записано целое число \(n\) (\(1 \le n \le 50\)) — длину строки, описывающей звук.

Во второй строке каждого набора входных данных записана строка \(s\) из \(n\) символов. Строка описывает звук, который вы услышали, и состоит только из строчных и заглавных латинских букв.

Выходные данные

Для каждого набора входных данных в отдельной строке выведите:

  • YES, если звук является мяуканьем кошки;
  • NO в противном случае.

Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных строка состоит из последовательно идущих символов 'm', 'e', 'O', 'w', что удовлетворяет определению мяуканья.

Во втором наборе входных данных строка состоит из последовательности из \(3\)-х символов 'm' и 'M', одного символа 'e', последовательности из \(3\)-х символов 'o' и 'O' и последовательности из \(7\)-ми символов 'w' и 'W', что удовлетворяет определению мяуканья.

В третьем наборе строка не описывает мяуканье, так как в ней отсутствует последовательность из символов 'o' или 'O' между символами 'e' и 'w'.

В четвертом наборе входных данных в строке присутствует символ 'U', поэтому она не описывает мяуканье.

G. Симмеtreeя

Деревья поиск в глубину и подобное реализация хэши *2200

Киду подарили дерево из \(n\) вершин с корнем в вершине \(1\). Так как он очень любит симметричные объекты, Кид хочет узнать симметрично ли это дерево.

Например, деревья на картинке выше симметричны.
А деревья на этой картинке не симметричны.

Более формально, дерево является симметричным, если существует такой порядок детей, что:

  • Поддерево самого левого ребёнка корня является зеркальным отражением поддерева самого правого ребёнка;
  • поддерево второго слева ребёнка корня является зеркальным отражением поддерева второго справа ребёнка корня;
  • ...
  • если число детей корня нечётно, то поддерево среднего ребёнка должно быть симметрично.
Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Первая строка каждого набора содержит целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Следующие \(n-1\) строк содержат по два числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \neq v\)) — номера вершин, соединённых ребром.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите «YES», если данное дерево симметрично, и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

A. Лайки

жадные алгоритмы реализация *800

Недавно Никита провел очень противоречивый раунд, после которого его вклад очень быстро менялся.

Анонс висел на главной странице \(n\) секунд. В \(i\)-ю секунду \(|a_i|\)-й человек либо поставил лайк, либо убрал лайк (в этой задаче Никите повезло и дизлайков не существует). Если \(a_i > 0\), то \(a_i\)-й человек поставил лайк. Если \(a_i < 0\), то \(-a_i\) человек убрал лайк. Каждый человек ставил и убирал лайк не более одного раза. Человек не мог убрать лайк, если он до этого его не ставил.

Так как после раунда у Никиты вклад стал очень плохим, то он захотел проанализировать, как менялся его вклад, пока анонс был на главной странице. Он обратился к создателю платформы с просьбой дать ему последовательность \(a_1, a_2, \ldots, a_n\). Но из-за несовершенства платформы последовательность \(a\) перемешалась.

Вам дана перемешанная последовательность \(a\), которая описывает активность пользователей. Вам требуется сказать для каждого момента от \(1\) до \(n\), какое максимальное и минимальное количество лайков могло быть на посту в этот момент.

Входные данные

В первой строке входных данных дано одно число \(t\) (\(1 \leqslant t \leqslant 1000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных дано одно число \(n\) (\(1 \leqslant n \leqslant 100\)) — количество секунд, в течение которых анонс Никиты висел на главной странице.

В следующей строке дано \(n\) чисел \(b_1, b_2, b_3, \ldots, b_n\) (\(1 \leqslant |b_i| \leqslant n\)) — перемешанный массив \(a\). Гарантируется, что существует такая перестановка \(b\), что она является корректной последовательностью событий, описанных в условии.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

Для каждого набора входных данных выведите по две строки, в каждой из которых по \(n\) чисел.

В первой строке для каждого набора входных данных выведите максимальное количество лайков, которые Никита мог иметь на анонсе в \(i\)-ю секунду.

Во второй строке для каждого набора входных данных выведите минимальное количество лайков, которые Никита мог иметь на анонсе в \(i\)-ю секунду.

Примечание

В первом наборе входных данных максимальные значения достигаются при следующей перестановке: \(1, 2, -2\). А минимальные значения при такой: \(2, -2, 1\).

Во третьем наборе входных данных все максимумы достигаются при следующей перестановке: \(4, 2, 3, 1, -1, -2\). А минимальные значения при следующей перестановке: \(2, -2, 1, -1, 3, 4\).

B. Расселение морских свинок

жадные алгоритмы математика реализация *1000

Даша очень любит морских свинок. В связи с этим, она решила поселить как можно больше морских свинок у себя дома и разработала план на ближайшие \(n\) дней. Каждый день она будет либо покупать новую морскую свинку, либо вызывать врача, чтобы он осмотрел всех ее питомцев.

К сожалению, магазин, в котором она собралась покупать морских свинок, не разбирается в них. Поэтому не может определить их пол. Даша тоже не может этого сделать. Единственный, кто может помочь — врач.

Для содержания морских свинок нужны вольеры. Покупать их Даша планирует в том же магазине. К сожалению, там продается только один вид — двухместный вольер. В нем может жить не более двух морских свинок.

Так как Даша не хочет нанести моральную травму своим питомцам — она не будет селить двух морских свинок разного пола в один вольер.

Помогите Даше посчитать, сколько минимум вольеров нужно купить, чтобы ни в один момент времени две морские свинки разных полов не жили в одном вольере.

В рамках этой задачи мы считаем, что у морских свинок всего два пола — мужской и женский.

Входные данные

В первой строке входных данных дано одно число \(t\) (\(1 \leqslant t \leqslant 10^5\)) — количество наборов входных данных.

В первой строке каждого набора входных данных дано одно число \(n\) (\(1 \leqslant n \leqslant 10^5\)) — количество дней на которые у Даши есть план.

В следующей строке дано \(n\) чисел \(b_1, b_2, b_3, \ldots, b_n\) (\(1 \leqslant b_i \leqslant 2\)) — план Даши. Если \(b_i = 1\), то в \(i\)-й день Даша купит новую морскую свинку. Если \(b_i = 2\), то в \(i\)-й день к Даше придет доктор и поможет определить пол всех морских свинок которые уже есть у Даши.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — сколько минимум вольеров нужно купить Даше, чтобы ни в один момент времени две морские свиньи разного пола не жили вместе.

Примечание

В первом наборе входных данных Даше нужно селить каждую морскую свинку в отдельный вольер, так как она не знает их пол.

Во втором наборе входных данных Даша купит \(0\) морских свинок, а значит ей потребуется \(0\) вольеров.

В третьем наборе входных данных Даше нужно \(3\) вольера, чтобы поселить каждую морскую свинку в отдельный вольер до прихода врача на \(4\)-й день. Когда она узнает их пол, то хотя бы две морские свинки окажутся одного пола и их можно будет поселить в один вольер, а третью - в другой вольер. Таким образом у нее будет один свободный вольер, в который она может поселить новую морскую свинку. Таким образом ответ \(3\).

В четвертом наборе входных данных покажем, что \(4\) - оптимальный ответ.

Для начала заметим, что первые четыре морские свинки можно поселить по одной в вольер. Затем придет врач и определит их пол. Среди этих четырех морских свинок будет хотя бы одна пара одного пола, потому что: либо морских свинок мужского пола хотя бы \(2\), либо их не больше \(1\), а значит женского пола хотя бы \(3\). Теперь мы можем поселить эту пару в один вольер, а две остальные - в отдельные. У нас останется еще один пустой вольер куда можно поселить новую свинку.

Теперь покажем, что ответ не меньше \(4\). Пусть среди первых \(4\) морских свинок \(3\) имеют женский пол и \(1\) - мужской. Нам нужно минимум \(3\) вольера чтобы их расселить. Тогда, когда мы купим новую морскую свинку - нам понадобится еще один вольер, в которые мы ее поселим, так как мы не знаем ее пол.

B. Вакцинация

жадные алгоритмы реализация *1000

Итан управляет станцией вакцинации, чтобы помогать людям бороться с сезонным гриппом. Он анализирует исторические данные, чтобы разработать оптимальную стратегию использования вакцины.

Пусть в конкретный день на станцию вакцинации придут \(n\) пациентов. Пациент с номером \(i\) придёт в момент времени \(t_i\). Каждого пациента можно попросить подождать не более \(w\) моментов времени, то есть \(i\)-й пациент может получить вакцину в моменты времени \(t_i, t_i + 1, \ldots, t_i + w\).

Вакцины поставляются в упаковках, каждая упаковка состоит из \(k\) доз. Каждому пациенту требуется ровно одна доза. Пакеты хранятся в специальном холодильнике. После того, как пачку вынули из холодильника и открыли, ее уже нельзя положить обратно. Время жизни вакцины вне холодильника составляет \(d\) моментов времени. Таким образом, если упаковка была вынута из холодильника и открыта в момент \(x\), дозы из этой упаковки можно использовать для вакцинации пациентов в моменты \(x, x + 1, \ldots, x + d\). В момент \(x + d + 1\) все оставшиеся неиспользованные дозы этой пачки выбрасываются.

Предположим, что на станции вакцинации достаточно персонала для проведения произвольного количества операций в каждый момент времени. Какое минимальное количество упаковок вакцин требуется для вакцинации всех \(n\) пациентов?

Входные данные

Первая строка входных данных содержит количество наборов входных данных \(t\) (\(1 \leq t \leq 10^4\)). Затем следует описание \(t\) наборов входных данных.

Первая строка каждого набора входных данных содержит четыре целых числа \(n\), \(k\), \(d\) и \(w\) (\(1 \leq n, k \leq 2 \cdot 10^5\), \(0 \leq d, w \leq 10^6\)) — количество пациентов, количество доз в упаковке вакцины, количество моментов времени, в течение которых вакцина может жить вне холодильника, и количество моментов времени, в течение которых каждый из пациентов может ждать соответственно.

Вторая строка каждого набора входных данных содержит неубывающую последовательность \(t_1, t_2, \ldots, t_n\) (\(0 \leq t_1 \leq t_2 \leq \ldots \leq t_n \leq 10^6\)). \(i\)-м элементом этой последовательности является момент прихода \(i\)-го пациента на станцию вакцинации.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превысит \(2 \cdot 10^5\).

Выходные данные

Выведите одно целое число — минимальное количество упаковок с вакциной, необходимое для вакцинации всех \(n\) пациентов.

Примечание

В первом наборе входных данных первая упаковка может быть открыта в момент времени \(1\) для вакцинации пациента \(1\). Затем дозы из этой упаковки будут использованы в моменты времени \(2\) и \(3\) для пациентов \(2\) и \(3\) соответственно. Далее персоналу необходимо попросить пациентов \(4\) и \(5\) дождаться момента \(13\). В момент \(13\) персонал открывает вторую упаковку вакцины и обслуживает пациентов \(4\) и \(5\). Наконец, последний пациент приходит в момент \(18\) и сразу же получает последнюю дозу из второй упаковки, пока она ещё не испортилась.

Во втором наборе входных данных вакцина может быть использована только в тот момент времени, когда её достают из холодильника. Более того, все пациенты хотят быть обслужены именно в тот момент, когда они приходят. Это означает, что персонал должен открыть две упаковки в момент \(3\) и использовать пять доз для пациентов \(1\), \(2\), \(3\), \(4\) и \(5\). Из этих двух упаковок останется три дозы, но их нельзя использовать для пациента \(6\). Когда пациент \(6\) приходит в момент \(4\), персоналу необходимо открыть новую упаковку, чтобы использовать только одну дозу из неё.

D. Размещение

дп жадные алгоритмы Перебор реализация *2000

Энни — фотограф-любитель. Ей нравится фотографировать гигантские жилые дома ночью. Она только что сфотографировала огромное прямоугольное здание, которое можно представить как таблицу из \(n \times m\) окон. Это означает, что в здании \(n\) этажей и на каждом этаже ровно \(m\) окон. Каждое окно либо тёмное, либо светлое, то есть в комнате за ним горит свет.

Энни знает, что каждая квартира в этом доме либо однокомнатная, либо двухкомнатная. Каждая однокомнатная квартира представлена на фотографии ровно одним окном, а каждая двухкомнатная квартира представлена на фотографии двумя подряд идущими окнами на одном этаже. Более того, \(m\) гарантированно делится на \(4\) и известно, что на каждом этаже ровно \(\frac{m}{4}\) двухкомнатных квартир и ровно \(\frac{m}{2}\) однокомнатных квартир. Точное расположение квартир неизвестно и может быть разным для каждого этажа.

Энни считает, что квартира заселена, если хотя бы в одном из её окон горит свет. Теперь она задаётся вопросом, какое может быть минимальное и максимальное количество заселённых квартир в доме, если судить по данной фотографии?

Формально, для каждого из этажей Энни придумывает возможное расположение квартир, в котором есть ровно \(\frac{m}{4}\) двухкомнатных квартир (два последовательных окна) и \(\frac{m}{2}\) однокомнатных квартир (одно окно). Затем она подсчитывает общее количество квартир, в которых есть хотя бы одно светлое окно. Какое минимальное и максимальное число она может получить?

Входные данные

Первая строка входных данных содержит два положительных целых числа \(n\) и \(m\) (\(1 \leq n \cdot m \leq 5 \cdot 10^5\)) — количество этажей в здании и количество окон на этаже соответственно. Гарантируется, что \(m\) делится на \(4\).

Затем следует \(n\) строк, каждая из которых содержит \(m\) символов. \(j\)-й символ \(i\)-й строки равен «0», если \(j\)-е окно на \(i\)-м этаже тёмное, и равен «1», если это окно светлое.

Выходные данные

Выведите два целых числа, минимальное и максимальное возможное количество заселённых квартир, если на каждом этаже возможно своё собственное расположение \(\frac{m}{4}\) двухкомнатных и \(\frac{m}{2}\) однокомнатных квартир.

Примечание

В первом примере каждый этаж состоит из одной двухкомнатной квартиры и двух однокомнатных квартир.

При следующей планировке квартир достигается минимально возможное количество заселённых квартир, равное \(7\).


|0 1|0|0|
|1 1|0|0|
|0|1 1|0|
|1|0 1|0|
|1|0|1 1|

При следующей планировке квартир достигается максимально возможное количество заселённых квартир, равное \(10\).


|0 1|0|0|
|1|1 0|0|
|0 1|1|0|
|1|0 1|0|
|1 0|1|1|

G. Управление потоком

реализация снм Структуры данных *3500

У Раджа есть одна физическая сетевая линия, которая соединяет его офис с интернетом. Пропускная способность этой линии составляет \(b\) байт в миллисекунду.

Есть \(n\) пользователей, которые хотели бы использовать эту сетевую линию для передачи некоторых данных. \(i\)-й из них будет использовать линию начиная с миллисекунды \(s_i\) и до миллисекунды \(f_i\) включительно. Изначально он установит свою скорость передачи данных в значение \(d_i\). Это означает, что он будет использовать скорость передачи данных, равную \(d_i\), в течение миллисекунды \(s_i\), а затем она будет меняться в соответствии с процедурой, описанной ниже.

Контроль за соблюдением пропускной способности линии происходит следующим образом. Предположим, что есть \(m\) пользователей, пытающихся передать какие-то данные по заданной сетевой линии в течение миллисекунды \(x\). Обозначим за \(t_i\) скорость передачи данных у \(i\)-м из этих \(m\) пользователей в начале данной миллисекунды. Все \(t_i\) являются целыми неотрицательными значениями.

  • Если \(m = 0\), то есть в течение этой миллисекунды нет пользователей, пытающихся передать данные, ничего не происходит.
  • Если сумма всех \(t_i\) меньше или равна \(b\), то каждый активный пользователь успешно завершает свою передачу данных (\(i\)-й активный пользователь передаёт \(t_i\) байт). После этого скорость передачи данных каждого активного пользователя увеличивается на \(1\), то есть каждое \(t_i\) увеличивается на \(1\).
  • Если сумма всех \(t_i\) больше, чем \(b\), то возникает перегрузка линии и в эту миллисекунду вообще никому не удаётся передать данные. В таком случае каждое значение \(t_i\) уменьшается вдвое, то есть каждое \(t_i\) заменяется на \(\lfloor \frac{t_i}{2} \rfloor\).

Радж знает все значения \(n\), \(b\), \(s_i\), \(f_i\) и \(d_i\), он хочет подсчитать общее количество байтов, переданных всеми пользователями в совокупности.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(b\) (\(1 \leq n \leq 2 \cdot 10^5\), \(1 \leq b \leq 10^9\)) — количество пользователей, которые будут использовать линию и пропускная способность линии соответственно.

Каждая из следующих \(n\) строк содержит три целых числа \(s_i\), \(f_i\) и \(d_i\) (\(1 \leq s_i \leq f_i \leq 10^9\), \(1 \leq d_i \leq 10^9\)), обозначающих что \(i\)-й пользователь будет пытаться передавать данные каждую миллисекунду между \(s_i\) и \(f_i\) включительно, и начальная скорость передачи данных \(i\)-го пользователя.

Выходные данные

Выведите одно целое число — общее количество байтов, которое все пользователи успешно передадут.

Примечание

Рассмотрим первый пример.

  • Миллисекунда \(1\): Пользователь \(1\) передает \(2\) байта.
  • Миллисекунда \(2\): Пользователь \(1\) передает \(3\) байта.
  • Миллисекунда \(3\): Возникает перегрузка, и никто не передает данные.
  • Миллисекунда \(4\): Пользователь \(1\) передает \(2\) байта.
  • Миллисекунда \(5\): Пользователь \(1\) передает \(3\) байта.

Во втором примере в каждую миллисекунду с \(7\)-й по \(11\)-ю включительно возникает перегрузка, и единственный пользователь уменьшает свою скорость вдвое. Однако он не успевает достаточно снизить скорость до отключения.

Рассмотрим третий пример.

  • Миллисекунда \(1\): Пользователь \(1\) передает \(1\) байт.
  • Миллисекунда \(2\): Пользователь \(1\) передает \(2\) байта.
  • Миллисекунда \(3\): Пользователь \(1\) передает \(3\) байта.
  • Миллисекунда \(4\): Пользователь \(1\) передает \(4\) байта.
  • Миллисекунда \(5\): Пользователь \(1\) передает \(5\) байтов.
  • Миллисекунда \(6\): Пользователь \(1\) передает \(6\) байтов.
  • Миллисекунда \(7\): Возникает перегрузка, и никто не передает данные.
  • Миллисекунда \(8\): Пользователь \(1\) передает \(3\) байта. Пользователь \(2\) передает \(3\) байта.
  • Миллисекунда \(9\): Возникает перегрузка, и никто не передает данные.
  • Миллисекунда \(10\): Пользователь \(1\) передает \(2\) байта. Пользователь \(2\) передает \(2\) байта.
  • Миллисекунда \(11\): Пользователь \(1\) передает \(3\) байта. Пользователь \(2\) передает \(3\) байта.
  • Миллисекунда \(12\): Возникает перегрузка, и никто не передает данные.
  • Миллисекунда \(13\): Пользователь \(2\) передает \(2\) байта.
  • Миллисекунда \(14\): Пользователь \(2\) передает \(3\) байта.
  • Миллисекунда \(15\): Пользователь \(2\) передает \(4\) байта.
  • Миллисекунда \(16\): Пользователь \(2\) передает \(5\) байтов.
  • Миллисекунда \(17\): Пользователь \(2\) передает \(6\) байтов.
  • Миллисекунда \(18\): Возникает перегрузка, и никто не передает данные.
  • Миллисекунда \(19\): Пользователь \(2\) передает \(3\) байта.
  • Миллисекунда \(20\): Пользователь \(2\) передает \(4\) байта.

F1. Выживание слабейших (простая версия)

Бинарный поиск математика Перебор реализация сортировки *2600

Это простая версия задачи. Она отличается от сложной только ограничением на \(n\). Вы можете делать взломы, только если заблокируете обе версии задачи.

Пусть \(a_1, a_2, \ldots, a_n\) — массив, состоящий из целых неотрицательных чисел. Определим \(F(a_1, a_2, \ldots, a_n)\) как отсортированный по неубыванию массив, состоящий из \(n - 1\) минимальных чисел вида \(a_i + a_j\), где \(1 \le i < j \le n\). Другими словами, \(F(a_1, a_2, \ldots, a_n)\) — это отсортированный по неубыванию массив из \(n - 1\) минимальных сумм всевозможных пар элементов массива \(a_1, a_2, \ldots, a_n\). Например, \(F(1, 2, 5, 7) = [1 + 2, 1 + 5, 2 + 5] = [3, 6, 7]\).

Вам дан массив, состоящий из целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\). Определите, чему равен единственный элемент массива \(\underbrace{F(F(F\ldots F}_{n-1}(a_1, a_2, \ldots, a_n)\ldots))\). Так как ответ может быть достаточно большим, выведите его по модулю \(10^9+7\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 3000\)) — начальную длину массива.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)) — элементы массива.

Выходные данные

Выведите единственное число — ответ на задачу по модулю \(10^9 + 7\).

Примечание

В первом тесте массив трансформируется следующим образом: \([1, 2, 4, 5, 6] \to [3, 5, 6, 6] \to [8, 9, 9] \to [17, 17] \to [34]\). Единственный элемент конечного массива равен \(34\).

Во втором тесте \(F(a_1, a_2, \ldots, a_n)\) будет равен \([2, 2, 2, 8, 8, 8, 8, 8]\). Этот массив составлен из \(3\) чисел вида \(1 + 1\) и из \(5\) чисел вида \(1 + 7\).

В четвёртом тесте массив трансформируется следующим образом: \([10^9, 10^9, 777] \to [10^9+777, 10^9+777] \to [2 \cdot 10^9 + 1554]\). \(2 \cdot 10^9 + 1554\) по модулю \(10^9+7\) равняется \(1540\).

A. Плюс или минус

реализация *800

Вам даны три целых числа \(a\), \(b\) и \(c\), такие, что ровно одно из этих двух уравнений верно:

  • \(a+b=c\)
  • \(a-b=c\)
Выведите +, если первое уравнение истинно, и - в противном случае.
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 162\)) — количество наборов входных данных.

Описание каждого набора входных данных состоит из трех целых чисел \(a\), \(b\), \(c\) (\(1 \leq a, b \leq 9\), \(-8 \leq c \leq 18\)). Гарантируется, что ровно одно из двух уравнений истинно.

Выходные данные

Для каждого набора входных данных выведите либо +, либо - на отдельной строке — обозначение правильного уравнения.

Примечание

В первом наборе входных данных \(1+2=3\).

Во втором наборе входных данных \(3-2=1\).

В третьем наборе входных данных \(2-9=-7\). Обратите внимание, что \(c\) может быть отрицательным.

C. Найти и заменить

жадные алгоритмы реализация Строки *800

Вам дана строка \(s\), состоящая из строчных латинских букв. За одну операцию можно выбрать символ и заменить все вхождения этого символа на \(\texttt{0}\), или заменить все вхождения этого символа на \(\texttt{1}\).

Можно ли выполнить некоторое количество ходов так, чтобы в результате получилась чередующаяся бинарная строка\(^{\dagger}\)?

Например, рассмотрим строку \(\texttt{abacaba}\). Вы можете сделать следующие ходы:

  • Заменить \(\texttt{a}\) на \(\texttt{0}\). Тогда строка будет иметь вид \(\color{red}{\texttt{0}}\texttt{b}\color{red}{\texttt{0}}\texttt{c}\color{red}{\texttt{0}}\texttt{b}\color{red}{\texttt{0}}\).
  • Заменить \(\texttt{b}\) на \(\texttt{1}\). Тогда строка будет иметь вид \({\texttt{0}}\color{red}{\texttt{1}}{\texttt{0}}\texttt{c}{\texttt{0}}\color{red}{\texttt{1}}{\texttt{0}}\).
  • Заменить \(\texttt{c}\) на \(\texttt{1}\). Теперь строка имеет вид \({\texttt{0}}{\texttt{1}}{\texttt{0}}\color{red}{\texttt{1}}{\texttt{0}}{\texttt{1}}{\texttt{0}}\). Это чередующаяся бинарная строка.

\(^{\dagger}\)Чередующаяся бинарная строка — это такая строка из \(\texttt{0}\) и \(\texttt{1}\), что никакие два соседних символа не равны. Например, \(\texttt{01010101}\), \(\texttt{101}\), \(\texttt{1}\) являются чередующимися бинарными строками, а \(\texttt{0110}\), \(\texttt{0a0a0}\), \(\texttt{10100}\) — нет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 2000\)) — длина строки \(s\).

Вторая строка каждого набора входных данных содержит строку, состоящую из \(n\) строчных латинских букв — строка \(s\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если вы можете превратить строку в чередующуюся бинарную строку, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Первый набор входных данных объясняется в условии.

Во втором наборе входных данных единственными возможными бинарными строками, которые вы можете получить, являются \(\texttt{00}\) и \(\texttt{11}\). Но они обе не являются чередующимися.

В третьем наборе входных данных можно получить \(\texttt{1}\), что является чередующейся бинарной строкой.

D. Нечётные запросы

реализация Структуры данных *900

У вас есть массив \(a_1, a_2, \dots, a_n\). Ответьте на \(q\) таких запросов:

  • Если сделать каждый элемент подотрезка массива \(a_l, a_{l+1}, \dots, a_r\) равным \(k\), будет ли сумма всего массива нечетной?

Обратите внимание, что запросы независимы и не влияют на будущие запросы.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит \(2\) целых числа \(n\) и \(q\) (\(1 \le n \le 2 \cdot 10^5\); \(1 \le q \le 2 \cdot 10^5\)) — длина массива и количество запросов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 10^9\)) — массив \(a\).

Следующие \(q\) строк содержат по \(3\) целых числа \(l,r,k\) (\(1 \le l \le r \le n\); \(1 \le k \le 10^9\)) — запросы.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\) и сумма \(q\) не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите «YES», если сумма всего массива будет нечетной, и «NO» в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Для первого набора входных данных:

  • Если элементы на подотрезке \((2, 3)\) сделать равными \(3\), то массив станет равняться \(\{2, 3, 3, 3, 2\}\), сумма будет равна \(2+3+3+3+2 = 13\), что нечетно, поэтому ответ будет «YES».
  • Если элементы на подотрезке \((2, 3)\) сделать равными \(4\), то массив станет равняться \(\{2, 4, 4, 3, 2\}\), сумма будет равна \(2+4+4+3+2 = 15\), что нечетно, поэтому ответ будет «YES».
  • Если элементы на подотрезке \((1, 5)\) сделать равными \(5\), то массив станет равняться \(\{5, 5, 5, 5, 5\}\), сумма будет равна \(5+5+5+5+5 = 25\), что нечетно, поэтому ответ будет «YES».
  • Если элементы на подотрезке \((1, 4)\) сделать равными \(9\), то массив станет равняться \(\{9, 9, 9, 9, 2\}\), сумма будет равна \(9+9+9+9+2 = 38\), что четно, поэтому ответ будет «NO».
  • Если элементы на подотрезке \((2, 4)\) сделать равными \(3\), то массив станет равняться \(\{2, 3, 3, 3, 2\}\), сумма будет равна \(2+3+3+3+2 = 13\), что нечетно, поэтому ответ будет «YES».

E. Интервью

Бинарный поиск интерактив реализация *1300

Это интерактивная задача. Если вы не знаете, как работают интерактивные задачи, то рекомендуем прочитать руководство для участников.

Перед последним этапом экзамена директор провел собеседование. Он дал Гону \(n\) кучек камней, в \(i\)-й кучке лежало \(a_i\) камней.

Все камни одинаковы и весят \(1\) грамм, за исключением одного особого камня, который лежит в неизвестной куче и весит \(2\) грамма.

Картинка первого набора входных данных. Кучка \(2\) имеет особый камень. Кучки имеют веса \(1,3,3,4,5\), соответственно.

Гон может задавать директору вопросы только одного типа: он может выбрать \(k\) кучек, и директор скажет ему общую массу выбранных куч. Более формально, Гон может выбрать целое число \(k\) (\(1 \leq k \leq n\)) и \(k\) различных кучек \(p_1, p_2, \dots, p_k\) (\(1 \leq p_i \leq n\)), и директор скажет ему общую массу \(m_{p_1} + m_{p_2} + \dots + m_{p_k}\), где \(m_i\) обозначает массу кучки \(i\).

Гону поручено найти кучку, в которой находится особый камень. Однако директор — занятой человек, поэтому помогите Гону найти эту кучу не более чем за \(\mathbf{30}\) запросов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество кучек.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_i\) (\(1 \leq a_i \leq 10^4\)) — количество камней в каждой куче.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

После считывания входных данных для каждого набора, продолжите взаимодействие следующим образом.

Протокол взаимодействия

Вы можете выполнить не более \(\mathbf{30}\) операций, чтобы угадать кучу.

Чтобы сделать запрос, выведите строку следующего формата:

  • \(\texttt{?}\ k \ p_1 \ p_2 \ p_3 \ ... \ p_{k-1}\ p_k\) (\(1 \leq k \leq n\); \(1 \leq p_i \leq n\); все \(p_i\) различны) — индексы кучек.

После каждой операции вы должны считать строку, содержащую одно целое число \(x\) — сумму масс выбранных кучек. (Формально, \(x = m_{p_1} + m_{p_2} + \dots + m_{p_k}\)).

Когда вы узнаете индекс кучки с особым камнем, выведите одну строку следующего формата: \(\texttt{!}\ m\) (\(1 \leq m \leq n\)).

После этого переходите к следующему набору входных данных или завершите программу, если наборов больше не осталось.

Если ваша программа выполнит более \(30\) операций для одного набора или сделает некорректный запрос, вы можете получить вердикт Неправильный ответ.

После вывода запроса или ответа не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Дополнительно рекомендуется прочитать интерактивное руководство по решению задач для участников.

Взломы

Чтобы сделать взлом, используйте следующий формат.

Первая строка должна содержать одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать два целых числа \(n, m\) (\(1 \leq n \leq 2 \cdot 10^5\)) – количество кучек и кучка с особым камнем.

Вторая строка каждого набора входных данных должна содержать \(n\) целых \(a_i\) (\(1 \leq a_i \leq 10^4\)) — количество камней в каждой куче.

Обратите внимание, что интерактор является неадаптивным, то есть ответ известен до того, как участник задает запросы, и не зависит от запросов, заданных участником.

Примечание

В первом наборе входных данных камень с массой два находится в куче \(2\), как показано на рисунке. Взаимодействие происходит так:

  • \(\texttt{? 4 1 2 3 4}\) — спрашиваем общую массу кучек \(1\), \(2\), \(3\) и \(4\). Общая масса, которую мы получим, равна \(1+3+3+4=11\).
  • \(\texttt{? 2 2 3}\) — спрашиваем общую массу кучек \(2\) и \(3\). Общая масса, которую мы получим, равна \(3+3=6\).
  • \(\texttt{? 1 2}\) — спрашиваем общую массу кучи \(2\). Общая масса, которую мы получим, равна \(3\).
  • \(\texttt{! 2}\) — мы выяснили, что куча \(2\) содержит особый камень, поэтому выводим его и переходим к следующему набору входных данных.

Во втором наборе входных данных камень с весом два находится на индексе \(7\). Взаимодействие происходит так:

  • \(\texttt{? 4 2 3 5 6}\) — спрашиваем общую массу кучек \(2\), \(3\), \(5\) и \(6\). Общая масса, которую мы получим обратно, равна \(2+3+3+4=12\).
  • \(\texttt{? 2 1 4}\) — спрашиваем общую массу кучек \(1\) и \(4\). Общая масса, которую мы получим, равна \(1+5=6\).
  • \(\texttt{! 7}\) — мы каким-то образом выяснили, что куча \(7\) содержит особый камень, поэтому выводим его и завершаем взаимодействие.

F. Мяч-попрыгунчик

Перебор поиск в глубину и подобное реализация *1700

Вам дана комната, которую можно представить в виде сетки из \(n \times m\). В позиции \((i_1, j_1)\) (пересечение строки \(i_1\) и столбца \(j_1\)) находится шар, который начинает двигаться по диагонали в одном из четырех направлений:

  • Шарик движется вниз и вправо, обозначается \(\texttt{DR}\); это означает, что после шага местоположение шарика изменяется с \((i, j)\) на \((i+1, j+1)\).
  • Мяч движется вниз и влево, обозначается \(\texttt{DL}\); это означает, что после шага местоположение мяча изменяется с \((i, j)\) на \((i+1, j-1)\).
  • Мяч движется вверх и вправо, обозначается \(\texttt{UR}\); это означает, что после шага местоположение мяча изменяется с \((i, j)\) на \((i-1, j+1)\).
  • Мяч движется вверх и влево, обозначается \(\texttt{UL}\); это означает, что после шага местоположение мяча изменяется с \((i, j)\) на \((i-1, j-1)\).

После каждого шага мяч сохраняет свое направление, если только он не ударится о стену (то есть направление выведет его за пределы комнаты на следующем шаге). В этом случае направление мяча изменяется вдоль оси стены; если мяч попадает в угол, то изменяются оба направления. Любой такой случай называется отскоком. Мяч никогда не перестает двигаться.

В приведенном примере мяч стартует с точки \((1, 7)\) и движется в направлении \(\texttt{DL}\), пока не достигнет нижней стены, затем он подпрыгивает и продолжает движение в направлении \(\texttt{UL}\). Достигнув левой стены, мяч подпрыгивает и продолжает двигаться в направлении \(\texttt{UR}\). Когда мяч достигает верхней стены, он подпрыгивает и продолжает движение в направлении \(\texttt{DR}\). Достигнув правого нижнего угла, он отскакивает один раз и продолжает движение в направлении \(\texttt{UL}\), и так далее.

Ваша задача - найти, сколько отскоков произойдёт, пока мяч не достигнет клетки \((i_2, j_2)\) в комнате, или сообщить, что он никогда не достигнет клетки \((i_2, j_2)\), выведя \(-1\).

Обратите внимание, что мяч сначала попадает в клетку и только после этого отскакивает, если это происходит.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит шесть целых чисел и строку \(n, m, i_1, j_1, i_2, j_2, d\) (\(2 \leq n, m \leq 25000\); \(1 \leq i_1, i_2 \leq n\); \(1 \leq j_1, j_2 \leq m\); \(d \in\{ \texttt{DR}, \texttt{DL}, \texttt{UR}, \texttt{UL}\}\)) — размеры сетки, начальные координаты шарика, координаты конечной клетки и начальное направление шарика.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(5 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество отскоков мяча, пока он не достигнет клетки \((i_2, j_2)\) в первый раз, или \(-1\), если мяч никогда не достигнет данной клетки.

G1. Последовательное сложение (простая версия)

дп жадные алгоритмы Перебор реализация сортировки Структуры данных *1100

Единственное различие между двумя версиями в том, что в этой версии ограничения ниже.

Изначально массив \(a\) содержит только число \(1\). Вы можете выполнить несколько операций, чтобы изменить массив. За одну операцию можно выбрать некоторую подпоследовательность \(^{\dagger}\) из \(a\) и вставить на любую позицию в \(a\) элемент, равный сумме всех элементов подпоследовательности.

Вам дан массив \(c\). Проверьте, можно ли получить из массива \(a\) массив \(c\), выполнив некоторое количество (возможно, 0) операций над исходным массивом.

\(^{\dagger}\) Последовательность \(b\) является подпоследовательностью последовательности \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, нуля, но не всех) элементов. Другими словами, операция выглядит так: выберем \(k\) (\(1 \leq k \leq |a|\)) различных индексов \(i_1, i_2, \dots, i_k\) и вставим в любое место \(a\) новый элемент со значением, равным \(a_{i_1} + a_{i_2} + \dots + a_{i_k}\).

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 5000\)) — длину массива \(c\).

Вторая строка каждого набора входных данных содержит \(n\) разделенных пробелами целых чисел \(c_i\) (\(1 \leq c_i \leq 5000\)) — массив \(c\), который вам нужно получить из массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(5000\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если такая последовательность операций существует, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Для первого набора входных данных исходный массив \(a\) уже равен \([1]\), поэтому ответ «YES».

Для второго набора входных данных после выполнения любого количества операций длина массива \(a\) станет хотя бы два, а в начальном массиве элемента \(2\) нет, поэтому получить массив \([2]\) невозможно, и ответ будет «NO».

Для третьего набора входных данных мы можем выполнить следующие операции, чтобы получить массив \(c\):

  • Первоначально, \(a = [1]\).
  • Выбрав подпоследовательность \([1]\) и вставив \(1\) в массив, \(a\) станет равным \([1, 1]\).
  • Выбрав подпоследовательность \([1, 1]\) и вставив \(1+1=2\) в середину массива, \(a\) станет равным \([1, 2, 1]\).
  • Выбрав подпоследовательность \([1, 2]\) и вставив \(1+2=3\) после первой \(1\) массива, \(a\) станет равным \([1, 3, 2, 1]\).
  • Выбрав подпоследовательность \([1, 3, 1]\) и вставив \(1+3+1=5\) в начало массива, \(a\) станет равным \([5, 1, 3, 2, 1]\) (именно такой массив нам нужно было получить).

G2. Последовательное сложение (сложная версия)

битмаски дп жадные алгоритмы реализация сортировки *1100

Единственное различие между двумя версиями в том, что в этой версии ограничения выше.

Изначально массив \(a\) содержит только число \(1\). Вы можете выполнить несколько операций, чтобы изменить массив. За одну операцию можно выбрать некоторую подпоследовательность \(^{\dagger}\) из \(a\) и вставить на любую позицию в \(a\) элемент, равный сумме всех элементов подпоследовательности.

Вам дан массив \(c\). Проверьте, можно ли получить из массива \(a\) массив \(c\), выполнив некоторое количество (возможно, 0) операций над исходным массивом.

\(^{\dagger}\) Последовательность \(b\) является подпоследовательностью последовательности \(a\), если \(b\) может быть получена из \(a\) удалением нескольких (возможно, нуля, но не всех) элементов. Другими словами, операция выглядит так: выберем \(k\) (\(1 \leq k \leq |a|\)) различных индексов \(i_1, i_2, \dots, i_k\) и вставим в любое место \(a\) новый элемент со значением, равным \(a_{i_1} + a_{i_2} + \dots + a_{i_k}\).

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — длину массива \(c\).

Вторая строка каждого набора входных данных содержит \(n\) разделенных пробелами целых чисел \(c_i\) (\(1 \leq c_i \leq 2 \cdot 10^5\)) — массив \(c\), который вам нужно получить из массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если такая последовательность операций существует, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Для первого набора входных данных исходный массив \(a\) уже равен \([1]\), поэтому ответ «YES».

Для второго набора входных данных после выполнения любого количества операций длина массива \(a\) станет хотя бы два, а в начальном массиве элемента \(2\) нет, поэтому получить массив \([2]\) невозможно, и ответ будет «NO».

Для третьего набора входных данных мы можем выполнить следующие операции, чтобы получить массив \(c\):

  • Первоначально, \(a = [1]\).
  • Выбрав подпоследовательность \([1]\) и вставив \(1\) в массив, \(a\) станет равным \([1, 1]\).
  • Выбрав подпоследовательность \([1, 1]\) и вставив \(1+1=2\) в середину массива, \(a\) станет равным \([1, 2, 1]\).
  • Выбрав подпоследовательность \([1, 2]\) и вставив \(1+2=3\) после первой \(1\) массива, \(a\) станет равным \([1, 3, 2, 1]\).
  • Выбрав подпоследовательность \([1, 3, 1]\) и вставив \(1+3+1=5\) в начало массива, \(a\) станет равным \([5, 1, 3, 2, 1]\) (именно такой массив нам нужно было получить).

A. Удачливые номера

Перебор реализация *900

В городе Олимп-Сити недавно запустили производство персональных звездолетов. Теперь каждый житель Марса сможет купить себе такое средство передвижения и недорого летать на другие планеты.

Естественно, у каждого звездолета есть номер — некоторое целое положительное число \(x\). Назовем удачливостью числа \(x\) разность между наибольшей и наименьшей цифрами этого числа. Например, у числа \(142857\) наибольшая цифра равна \(8\), а наименьшая — \(1\), поэтому его удачливость равна \(8-1=7\). А у числа \(111\) все цифры равны \(1\), поэтому его удачливость равна нулю.

Лаксап — известный марсианский блогер, который часто летает в разные уголки Солнечной системы. Чтобы выпускать интересные видео еще быстрее, он решил купить себе звездолет. Придя в магазин, он увидел звездолеты с номерами с \(l\) по \(r\) включительно. Находясь в магазине, Лаксап заинтересовался, какие из звездолетов имеют наиболее удачливые номера.

Поскольку звездолетов в магазине много, а Лаксап не умеет программировать, то Вы должны помочь блогеру и написать программу, которая отвечает на его вопрос.

Входные данные

В первой строке находится целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных.

В каждой из следующих \(t\) строк находится описание набора входных данных. Описание состоит из двух целых чисел \(l\) и \(r\) (\(1 \le l \le r \le 10^6\)) — наибольший и наименьший номера звездолета в магазине.

Выходные данные

Выведите \(t\) строк, по одной строке на каждый набор входных данных, содержащей номер самого удачливого звездолета в магазине.

Если способов выбрать наиболее удачливый номер несколько, то выведите любой из них.

Примечание

Рассмотрим два набора входных данных:

  • удачливость числа \(59\) равна \(9 - 5 = 4\);
  • удачливость числа \(60\) равна \(6 - 0 = 6\);
  • удачливость числа \(61\) равна \(6 - 1 = 5\);
  • удачливость числа \(62\) равна \(6 - 2 = 4\);
  • удачливость числа \(63\) равна \(6 - 3 = 3\).
Таким образом, наиболее удачливый номер — \(60\).

В пятом наборе входных данных наибольшую удачливость имеет номер \(90\).

C. Неудачливые номера

дп жадные алгоритмы Перебор реализация *1900

В этой задаче, в отличие от задачи А, требуется искать наименее удачливый номер, а не наиболее удачливый.

Обратите внимание, что ограничения на эту задачу отличаются от ограничений на задачу А.

В городе Олимп-Сити недавно запустили производство персональных звездолетов. Теперь каждый житель Марса сможет купить себе такое средство передвижения и недорого летать на другие планеты.

Естественно, у каждого звездолета есть номер — некоторое целое положительное число \(x\). Назовем удачливостью числа \(x\) разность между наибольшей и наименьшей цифрами этого числа. Например, у числа \(142857\) наибольшая цифра равна \(8\), а наименьшая — \(1\), поэтому его удачливость равна \(8-1=7\). А у числа \(111\) все цифры равны \(1\), поэтому его удачливость равна нулю.

Лаксап — известный марсианский блогер, который часто летает в разные уголки Солнечной системы. Чтобы выпускать интересные видео еще быстрее, он решил купить себе звездолет. Придя в магазин, он увидел звездолеты с номерами с \(l\) по \(r\) включительно. Находясь в магазине, Лаксап заинтересовался, какие из звездолетов имеют наименее удачливые номера.

Поскольку звездолетов в магазине много, а Лаксап не умеет программировать, то Вы должны помочь блогеру и написать программу, которая отвечает на его вопрос.

Входные данные

В первой строке находится целое число \(t\) (\(1 \le t \le 600\)) — количество наборов входных данных.

В каждой из следующих \(t\) строк находится описание набора входных данных. Описание состоит из двух целых чисел \(l\), \(r\) (\(1 \le l \le r \le 10^{18}\)) — наибольший и наименьший номера звездолета в магазине.

Выходные данные

Выведите \(t\) строк, по одной строке на каждый набор входных данных, содержащую номер наименее удачливого звездолета в магазине.

Если способов выбрать наименее удачливый номер несколько, то выведите любой из них.

Примечание

Рассмотрим первые два набора входных данных.

  • удачливость числа \(59\) равна \(9 - 5 = 4\);
  • удачливость числа \(60\) равна \(6 - 0 = 6\);
  • удачливость числа \(61\) равна \(6 - 1 = 5\);
  • удачливость числа \(62\) равна \(6 - 2 = 4\);
  • удачливость числа \(63\) равна \(6 - 3 = 3\).
Таким образом, наименее удачливый номер — \(63\).

В пятом тестовом примере наименьшую удачливость имеют числа \(1\), \(2\), \(3\), \(4\), \(5\), \(6\), \(7\), \(8\), \(9\), \(11\), \(22\), \(33\), \(44\), \(55\), \(66\), \(77\), \(88\), \(99\), поэтому разрешается вывести любое из них.

A. Гирлянда

реализация *800

У вас есть гирлянда, состоящая из \(4\) цветных лампочек, цвет \(i\)-й лампочки — \(s_i\).

Изначально все лампочки выключены. Ваша задача — включить все лампочки. Вы можете выполнять следующую операцию любое количество раз: выбрать лампочку и переключить ее состояние (включить, если была выключена, и выключить, если была включена). Единственное ограничение на вышеописанную операцию — вы можете применять операцию к лампочке, только если предыдущая операция была применена к лампочке другого цвета (первую операцию можно применять к любой лампочке).

Посчитайте минимальное количество операций, чтобы включить все лампочки, или сообщите, что это невозможно.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора содержит \(s\) — последовательность из \(4\) символов, где каждый символ является цифрой. \(i\)-й символ этой последовательности обозначает цвет \(i\)-й лампочки.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, чтобы включить все лампочки. Если включить все лампочки невозможно, выведите -1.

Примечание

В первом примере все цвета различные, значит, мы можем просто включить все лампочки за \(4\) операции.

Во втором примере невозможно включить все лампочки, т.к. после включения одной лампочки включить другие невозможно.

В третьем примере можно действовать следующим образом: включить первую лампочку, включить третью лампочку, включить четвертую лампочку, выключить третью лампочку, включить вторую лампочку, включить третью лампочку.

E. Две бочки

Бинарный поиск дп математика реализация *2400

Есть две бочки — в первую помещается \(a\) литров воды, во вторую помещается \(b\) литров воды. В первой бочке изначально \(c\) (\(0 \le c \le a\)) литров воды, во второй бочке изначально \(d\) (\(0 \le d \le b\)) литров воды.

Вы хотите провести \(n\) действий над ними. \(i\)-е действие задается одним ненулевым целым числом \(v_i\). Если \(v_i > 0\), то вы пытаетесь налить \(v_i\) литров воды из первой бочки во вторую. Если \(v_i < 0\), то вы пытаетесь налить \(-v_i\) литров воды из второй бочки в первую.

Когда вы пытаетесь налить \(x\) литров воды из бочки, в которой сейчас \(y\) литров воды, в бочку, в которой может поместиться еще \(z\) литров воды, то за действие вы перельете только \(\min(x, y, z)\) литров воды.

Для всех пар начальных объемов воды \((c, d)\) таких, что \(0 \le c \le a\) и \(0 \le d \le b\), посчитайте объем воды в первой бочке после применения всех действий.

Входные данные

В первой строке записаны три целых числа \(n, a\) и \(b\) (\(1 \le n \le 10^4\); \(1 \le a, b \le 1000\)) — количество действий и вместимости бочек, соответственно.

Во второй строке записаны \(n\) целых чисел \(v_1, v_2, \dots, v_n\) (\(-1000 \le v_i \le 1000\); \(v_i \neq 0\)) — объем воды, который вы пытаетесь перелить в каждом действии.

Выходные данные

Для всех пар начальных объемов воды \((c, d)\) таких, что \(0 \le c \le a\) и \(0 \le d \le b\), посчитайте объем воды в первой бочке после применения всех действий.

Выведите \(a + 1\) строку, в каждой строке должно быть \(b + 1\) целых чисел. \(j\)-е значение в \(i\)-й строке должно быть ответом для \(c = i - 1\) и \(d = j - 1\).

Примечание

Рассмотрим \(c = 3\) и \(d = 2\) из первого примера:

  • В первом действии вы пытаетесь перелить \(2\) литра воды из второй бочки в первую, во второй бочке есть \(2\) литра воды, в первую поместится еще \(1\) литр. Поэтому переливается \(\min(2, 2, 1) = 1\) литр, в первой бочке теперь \(4\) литра, во второй \(1\) литр.
  • Во втором действии вы пытаетесь перелить \(1\) литр воды из первой бочки во вторую. Переливается \(\min(1, 4, 3) = 1\) литр, в первой бочке теперь \(3\) литра, во второй \(2\) литра.
  • В третьем действии вы пытаетесь перелить \(2\) литра воды из первой бочки во вторую. Переливается \(\min(2, 3, 2) = 2\) литра, в первой бочке теперь \(1\) литр, во второй \(4\) литра.

В конце в первой бочке \(1\) литр воды. Поэтому третье значение в четвертой строке равно \(1\).

F. Путешествие по Берляндии

Бинарный поиск графы жадные алгоритмы реализация Структуры данных *2500

В Берляндии \(n\) городов, расположенных по кругу и пронумерованных от \(1\) до \(n\) по часовой стрелке.

Мы хотим объехать всю Берляндию, начав в каком-то городе, посетив все остальные города и вернувшись в стартовый город. К сожалению, ехать мы можем только по Берляндской Кольцевой Автодороге, соединяющей все \(n\) городов. Проектировал дорогу очень титулованный и респектабельный министр, поэтому она односторонняя — по ней можно ехать только по часовой стрелке, то есть только из города \(i\) в город \((i \bmod n) + 1\) (т.е. из \(1\) в \(2\), из \(2\) в \(3\), ..., из \(n\) в \(1\)).

Бензобак машины вмещает до \(k\) литров бензина. На пути \(i\)-го города в следующий машина расходует \(a_i\) литров бензина.

В каждом городе есть заправка; литр бензина на заправке в \(i\)-м городе стоит \(b_i\) бурлей. Заправляться между городами нельзя; если бензин закончился между городами, то такая поездка считается незавершенной.

Для каждого города посчитайте минимальную стоимость путешествия, если оно должно начаться и закончиться в нем.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(3 \le n \le 2 \cdot 10^5\); \(1 \le k \le 10^9\)) — количество городов и объем бензобака, соответственно.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le 2\)).

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел, где \(i\)-е из них равно минимальной стоимости путешествия, если начать и закончить в \(i\)-м городе.

A. Серия преступлений

геометрия Перебор реализация *800

В столице Берляндии переполох, уже три шокирующих преступления совершила известная банда грабителей «Пихстеры».

Карта столицы Берляндии представляет собой прямоугольную таблицу n × m. На карте каждая клетка таблицы обозначает некоторый квартал столицы.

Главный детектив столицы, Поликарп, обозначил на карте звездочками кварталы, в которых произошли первые три ограбления. Дедукция подсказывает Поликарпу, что четвертое ограбление будет совершено в таком квартале, что все четыре ограбленных квартала будут вершинами некоторого прямоугольника, параллельного сторонам карты.

С дедукцией у Поликарпа хорошо, а вот с математикой — плохо. Поэтому он попросил вас найти квартал, в котором произойдет четвертое ограбление.

Входные данные

В первой строке записано два целых числа через пробел n и m (2 ≤ n, m ≤ 100) — количество строк и столбцов карты соответственно.

Далее в n строках записано по m символов — описание карты столицы. Каждый символ может быть либо «.» (точка), либо «*» (звездочка). Символ равен «*» если соответствующий квартал ограбили, или «.» в противном случае.

Гарантируется, что на карте ровно три символа «*» и всегда можно найти четвертый квартал, соответствующий условиям задачи.

Выходные данные

Выведите два целых числа — номер строки и номер столбца на карте квартала, который ограбят четвертым. Строки нумеруются с единицы сверху вниз, столбцы нумеруются с единицы слева направо.

B. Конвейерные ленты

математика реализация *1000

Конвейерная матрица \(m_n\) — матрица размера \(n \times n\), \(n\)чётное число. Матрица состоит из концентрических лент, движущихся по часовой стрелке.

Иными словами, конвейерная матрица для \(n = 2\) — это просто матрица \(2 \times 2\), ячейки которой образуют цикл длины \(4\) по часовой стрелке. Для любого натурального \(k \ge 2\), матрица \(m_{2k}\) получается добавлением к матрице \(m_{2k - 2}\) внешнего слоя, образующего цикл, направленный по часовой стрелке.

Конвейерная матрица \(8 \times 8\).

Вы стоите в ячейке с координатами \(x_1, y_1\) и хотите попасть в ячейку с координатами \(x_2, y_2\). Клетка имеет координаты \(x, y\), если находится на пересечении \(x\)-й строки и \(y\)-го столбца.

Стоя на какой-то ячейке, вы каждую секунду будете перемещаться на ячейку, следующую в направлении движения ленты, на которой вы находитесь. Также вы можете переместиться на соседнюю ячейку, потратив одну единицу энергии. Перемещения происходят мгновенно и их можно совершать неограниченное количество в любой момент времени.

Ваша задача — найти минимальное количество энергии, которое придётся потратить, чтобы добраться из ячейки с координатами \(x_1, y_1\) в ячейку с координатами \(x_2, y_2\).

Например, \(n=8\) изначально вы находитесь в ячейке с координатами \(1,3\) и хотите попасть в ячейку с координатами \(6, 4\). Вы можете сразу же сделать \(2\) перемещения, оказавшись в ячейке с координатами \(3, 3\), а затем через \(8\) секунд вы окажетесь в нужной ячейке.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 2 \cdot 10^5\)) — количество наборов входных данных.

Далее следуют описания наборов входных данных.

Описание каждого набора входных данных состоит из одной строки, содержащей пять целых чисел \(n\), \(x_1\), \(y_1\), \(x_2\) и \(y_2\) (\(1 \le x_1, y_1, x_2, y_2 \le n \le 10^9\)) — размер матрицы и координаты начальной и конечной ячеек. Гарантируется, что число \(n\) четно.

Выходные данные

Для каждого набора входных данных в отдельной строке выведите одно целое число — минимальное количество энергии, которое придётся потратить, чтобы добраться из ячейки с координатами \(x_1, y_1\) в ячейку с координатами \(x_2, y_2\).

D. Умка и долгий перелёт

Конструктив математика реализация *1600

Девочка Умка любит путешествовать и участвовать в олимпиадах по математике. Однажды она летела самолетом на очередную олимпиаду и от скуки изучала огромный клетчатый лист бумаги.

Обозначим \(n\)-е число Фибоначчи как \(F_n = \begin{cases} 1, & n = 0; \\ 1, & n = 1; \\ F_{n-2} + F_{n-1}, & n \ge 2. \end{cases}\)

Клетчатый прямоугольник с высотой \(F_n\) и шириной \(F_{n+1}\) назовем прямоугольником Фибоначчи порядка \(n\).

У Умки есть прямоугольник Фибоначчи порядка \(n\). Кто-то закрасил в нём клетку на пересечении ряда \(x\) и столбца \(y\).

Необходимо разрезать этот прямоугольник ровно на \(n+1\) квадратов, чтобы

  • закрашенная клетка находилась в квадрате со стороной \(1\);
  • было не более одной пары квадратов с совпадающими сторонами;
  • сторона каждого квадрата являлась числом Фибоначчи.

Получится ли у Умки разрезать этот прямоугольник таким образом?

Входные данные

В первой строке дано целое число \(t\) (\(1 \le t \le 2 \cdot 10^5\)) — количество наборов входных данных.

В единственной строке каждого набора входных данных даны целые числа \(n\), \(x\), \(y\) (\(1 \le n \le 44\), \(1 \le x \le F_n\), \(1 \le y \le F_{n+1}\)) — порядок прямоугольника Фибоначчи и координаты закрашенной клетки.

Выходные данные

Для каждого набора входных данных выведите «YES», если ответ положительный, и «NO» в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут распознаны как положительный ответ).

Примечание
Первый, третий и четвёртый наборы входных данных.

F. Это цветок?

графы поиск в глубину и подобное реализация *2100

Влад обнаружил у себя во дворе клумбу с графами и решил взять один себе. Позже он узнал, что на той клумбе помимо обычных графов росли также \(k\)-цветки. Граф называется \(k\)-цветком если он состоит из простого цикла длины \(k\), через каждую вершину которого проходит свой простой цикл длины \(k\) и эти циклы не пересекаются по вершинам. Например \(3\)-цветок выглядит так:

Обратите внимание, что \(1\)-цветок и \(2\)-цветок не существуют, поскольку для формирования цикла нужно хотя бы \(3\) вершины.

Владу очень понравилась структура \(k\)-цветков и теперь он хочет узнать повезло ли ему взять с клумбы один из них.

Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов. Перед каждым набором в тесте записана пустая строка.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le \min(2 \cdot 10^5, \frac{n \cdot (n-1)}{2})\)) — количество вершин и рёбер в графе, соответственно.

Следующие \(m\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — номера вершин, соединённых ребром. Гарантируется, что граф не содержит кратных рёбер и петель.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\). Также это гарантируется для суммы \(m\).

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите «YES», если граф Влада является \(k\)-цветком для некоторого \(k\), и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

B. Was it rated?

*особая задача *особая задача *особая задача Перебор реализация

Входные данные

Единственная строка входных данных содержит единственное целое число \(n\) (\(1 \leq n \leq 25\)).

G. Цветовое зрение

*особая задача реализация

A. Монеты

математика реализация *800

В Берляндии используются монеты двух типов — номиналами в \(2\) и в \(k\) бурлей.

Ваша задача — определить, возможно ли представить \(n\) бурлей в монетах, т. е. существуют ли неотрицательные целые числа \(x\) и \(y\), такие, что выполняется равенство \(2 \cdot x + k \cdot y = n\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 10^{18}\); \(k \ne 2\)).

Выходные данные

На каждый набор входных данных выведите YES, если возможно представить \(n\) бурлей в монетах; иначе выведите NO. Каждую букву можно выводить в любом регистре (YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

Примечание

В первом наборе входных данных можно взять одну монету номиналом \(2\) и одну монету номиналом \(k = 3\).

Во втором наборе можно взять три монеты номиналом \(2\). Или же можно взять шесть монет номиналом \(k = 1\).

В третьем наборе нет способов представить \(7\) бурлей.

В четвертом наборе можно взять одну монету номиналом \(k = 8\).

A. Монеты

математика реализация *800

В Берляндии используются монеты двух типов — номиналами в \(2\) и в \(k\) бурлей.

Ваша задача — определить, возможно ли представить \(n\) бурлей в монетах, т. е. существуют ли неотрицательные целые числа \(x\) и \(y\), такие, что выполняется равенство \(2 \cdot x + k \cdot y = n\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 10^{18}\); \(k \ne 2\)).

Выходные данные

На каждый набор входных данных выведите YES, если возможно представить \(n\) бурлей в монетах; иначе выведите NO. Каждую букву можно выводить в любом регистре (YES, yes, Yes будут распознаны как положительный ответ, NO, no и nO будут распознаны как отрицательный ответ).

Примечание

В первом наборе входных данных можно взять одну монету номиналом \(2\) и одну монету номиналом \(k = 3\).

Во втором наборе можно взять три монеты номиналом \(2\). Или же можно взять шесть монет номиналом \(k = 1\).

В третьем наборе нет способов представить \(7\) бурлей.

В четвертом наборе можно взять одну монету номиналом \(k = 8\).

B. Граф сумм

графы Деревья интерактив Конструктив кратчайшие пути Перебор реализация *2000

Это интерактивная задача.

Загадана перестановка \(p_1, p_2, \dots, p_n\).

Рассмотрим неориентированный граф с \(n\) вершинами и без рёбер. Вы можете делать два типа запросов:

  1. Укажите целое число \(x\) такое, что \(2 \le x \le 2n\). Тогда для всех целых чисел \(i\) (\(1 \le i \le n\)) таких, что \(1 \le x-i \le n\), будет добавлено ребро между вершинами \(i\) и \(x-i\).
  2. Запросить число рёбер в кратчайшем пути между вершинами \(p_i\) и \(p_j\). В качестве ответа вы получите количество рёбер на кратчайшем пути, если такой путь существует, или \(-1\), если такого пути нет.

Обратите внимание, что вы можете делать оба типа запросов в любом порядке.

Сделав \(2n\) запросов (включая тип \(1\) и тип \(2\)), угадайте две возможные перестановки, хотя бы одна из которых равна \(p_1, p_2, \dots, p_n\). Ваш ответ будет засчитан, если хотя бы одна из перестановок верна. Вы можете вывести одну и ту же перестановку дважды.

Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(2 \le n \le 10^3\)) — длина перестановки.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^3\).

Протокол взаимодействия

Взаимодействие для каждого набора входных данных начинается после считывания \(n\).

Затем, сделайте не более \(2n\) запросов:

  • Если вы хотите сделать запрос типа \(1\), выведите «+ x». \(x\) должно быть целым числом от \(2\) до \(2n\) включительно. После этого считайте \(1\) или \(-2\). Если вы считали \(1\), то ваш запрос был корректным, иначе он был некорректным или вы превысили количество запросов, и ваша программа должна немедленно завершиться, чтобы получить вердикт Неправильный ответ.
  • Если вы хотите сделать запрос типа \(2\), выведите «? i j». \(i\) и \(j\) должны быть целыми числами от \(1\) до \(n\) включительно. После этого, считайте единственное целое число \(r\) (\(-1 \le r \le n\)) — ответ на ваш запрос. Если вы получили число \(−2\) вместо ответа, то ваша программа сделала некорректный запрос или превысила число запросов. Ваша программа должна немедленно завершиться для получения вердикта Неправильный ответ.

В любой момент взаимодействия, если вы хотите угадать две перестановки, выведите «! \(p_{1,1}\) \(p_{1,2}\) \(\dots\) \(p_{1,n}\) \(p_{2,1}\) \(p_{2,2}\) \(\dots\) \(p_{2,n}\)». Обратите внимание, что вы должны выводить две перестановки на одной и той же строке и без восклицательного знака между перестановками. После этого считайте \(1\) или \(-2\). Если вы считали \(1\), то ваш ответ был правильным, иначе он был неправильным, и ваша программа должна немедленно завершиться, чтобы получить вердикт Неправильный ответ. После этого, перейдите к следующему набору входных данных, или завершите программу, если такого нет. Обратите внимание, что вывод ответа не считается как запрос.

Обратите внимание, что даже если вы вывели правильную перестановку, вторая перестановка должна быть именно перестановкой, а не произвольным массивом.

В любой момент, если вы продолжите взаимодействие после считывания числа \(-2\), вы можете получить любой вердикт, так как программа продолжит чтение из закрытого потока.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Интерактор является неадаптивным. Это означает, что все перестановки зафиксированы до начала взаимодействия.

Взломы

Чтобы сделать взлом, используйте следующий формат.

Первая строка должна содержать единственное целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать единственное целое число \(n\) (\(2 \le n \le 10^3\)) — длину перестановки.

Вторая строка каждого набора входных данных должна содержать \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)) — загаданную перестановку.

Сумма \(n\) по всем наборам входных данных не превосходит \(10^3\).

Примечание

В первом наборе входных данных \(n=6\) и загадана перестановка \(p = [1,4,2,5,3,6]\).

Сначала сделаем запросы типа \(1\) с \(x=12, 2, 3\) соответственно. Это суммарно добавит в граф четыре ребра:

  • Ребро, соединяющее вершины \(6\) и \(6\).
  • Ребро, соединяющее вершины \(1\) и \(1\).
  • Ребро, соединяющее вершины \(1\) и \(2\).
  • Ребро, соединяющее вершины \(2\) и \(1\).

Поскольку все эти запросы корректны, интерактор вернул \(1\) после каждого из них.

Затем спросим количество рёбер на кратчайшем пути между вершинами \(p_1 = 1\) и \(p_3 = 2\), которое равно \(1\).

Затем сделаем запрос типа \(1\) с \(x=5\). Это суммарно добавит в граф четыре ребра:

  • Ребро, соединяющее вершины \(1\) и \(4\).
  • Ребро, соединяющее вершины \(2\) и \(3\).
  • Ребро, соединяющее вершины \(3\) и \(2\).
  • Ребро, соединяющее вершины \(4\) и \(1\).

Поскольку этот запрос корректен, интерактор вернул \(1\).

Затем спросим количество рёбер на кратчайшем пути между вершинами \(p_1 = 1\) и \(p_5 = 3\), которое равно \(2\).

Затем спросим количество рёбер на кратчайшем пути между вершинами \(p_4 = 5\) и \(p_5 = 3\). Такого пути не существует, поэтому интерактор вернёт \(-1\).

После этого, благодаря некоторой магии, две возможные перестановки, которые могут быть равны \(p\), определены: первая перестановка равна \([1,4,2,5,3,6]\), и вторая перестановка равна \([1,2,3,4,5,6]\). Так как первая перестановка равна загаданной перестановке, этот набор входных данных решён корректно. Всего \(7\) запросов использовано, что находится в пределах \(2 \cdot 6 = 12\) запросов.

Поскольку ответ правильный, интерактор вернул \(1\).

Во втором наборе входных данных \(n=2\) и загадана перестановка \(p = [2,1]\).

Так как есть только \(2! = 2\) возможные перестановки, никаких запросов не требуется. Достаточно просто вывести две перестановки \([1,2]\) и \([2,1]\). Всего \(0\) запросов использовано, что находится в пределах \(2 \cdot 2 = 4\) запросов.

Поскольку ответ правильный, интерактор вернул \(1\).

D. Автомат с игрушками

игры Конструктив реализация *2700

Рассмотрим автомат с игрушками, в котором игрушки расположены в два ряда по \(n\) ячеек каждый (\(n\) — нечетное).

Начальное состояние для \(n=9\).

Изначально в верхнем ряду в неугловых ячейках размещены \(n-2\) игрушки. Нижний ряд изначально пуст, и его левая, правая и центральная ячейки заблокированы. Есть \(4\) кнопки для управления автоматом: влево, вправо, вверх и вниз, обозначенные буквами L, R, U и D соответственно.

При нажатии на L, R, U или D все игрушки будут одновременно двигаться в соответствующем направлении и остановятся, только если они столкнутся с другой игрушкой, стеной или заблокированной ячейкой. Ваша цель — переместить \(k\)-ю игрушку в крайнюю левую ячейку верхнего ряда. Игрушки пронумерованы с \(1\) по \(n-2\) слева направо. Вам даны \(n\) и \(k\), найдите решение, которое использует не более \(1\,000\,000\) нажатий кнопок.

Чтобы опробовать автомат, вы можете воспользоваться веб-страницей, позволяющей вам играть в описанную игру в режиме реального времени.

Входные данные

Первая и единственная строка содержит два целых числа \(n\) и \(k\) (\(5 \le n \le 100\,000\), \(n\) — нечетное, \(1 \le k \le n-2\)) — количество ячеек в ряду и номер игрушки, которую нужно переместить в крайнюю левую ячейку верхнего ряда.

Выходные данные

Выведите описание нажатий кнопок в виде строки из не более чем \(1\,000\,000\) символов. Строка должна содержать только символы L, R, U и D. \(i\)-й символ в строке соответствует \(i\)-й нажатой кнопке. После нажатия всех кнопок в указанной последовательности \(k\)-я игрушка должна быть в крайней левой ячейке верхнего ряда.

Если существует несколько решений, выведите любое из них. Количество нажатий кнопок не обязательно должно быть минимальным.

Примечание

В первом примере будет \(5-2 = 3\) игрушки. Первая игрушка должна оказаться в крайней левой ячейке верхнего ряда. Ходы RDL позволят достичь этого, см. картинку для лучшего понимания. Другим возможным решением было бы выполнить одно нажатие кнопки L.

Визуализация ходов для первого примера.

A. Политика

жадные алгоритмы реализация *800

Клуб дебатов с \(n\) участниками, включая вас (участник \(1\)), сегодня последовательно обсудит \(k\) мнений. Во время каждого обсуждения участники выразят свое согласие или несогласие с мнением. Обозначим количество участников, которые согласны, как \(Y\), а количество участников, которые не согласны, как \(N\). После каждого обсуждения участники покидают клуб в соответствии со следующими правилами:

  • Если больше участников согласны с мнением, чем не согласны (\(Y > N\)), все участники, которые не согласны, покидают клуб.
  • Если больше участников не согласны с мнением, чем согласны (\(Y < N\)), все участники, которые согласны, покидают клуб.
  • В случае ничьей (\(Y = N\)), все участники покидают клуб.

Как президент клуба, вы хотите остаться в клубе и максимизировать количество участников, оставшихся после встречи. Вы знаете позицию каждого участника по всем \(k\) мнениям до начала встречи, и вы можете исключить любых участников (кроме себя самого) перед началом встречи.

Определите максимальное количество участников, включая вас, которые могут остаться в клубе после встречи, при условии, что вы также останетесь в клубе после встречи.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n, k \le 100\)) — количество участников и количество обсуждений.

\(i\)-я из следующих \(n\) строк содержит строку \(t_i\) длины \(k\). \(j\)-й символ в строке \(t_i\) указывает, согласится ли \(i\)-й участник или не согласится с \(j\)-м мнением, если он будет присутствовать во время его обсуждения. Символ «+» означает, что участник согласен, а символ «-» означает, что участник не согласен.

Гарантируется, что сумма значений \(n \cdot k\) по всем наборам входных данных не превышает \(5 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных выведите максимальное количество участников, включая вас, которые могут остаться в клубе после встречи.

Примечание

Для удобства, в примерах ниже мы будем разбирать ситуации, опираясь на то, кто пришел на встречу (т. е. не был исключен перед ней), а не на то, кто был исключён.

Пример 1:

На встречу мог прийти только первый участник, иначе оба участника ушли бы после обсуждения второго мнения.

Пример 2:

На встречу приходит только один участник и остается до конца.

Пример 3:

В клубе \(4\) участника, и только одно мнение будет обсуждаться во время встречи. Проанализируем возможные исходы в зависимости от участников на встрече:

  • Если придет только первый участник, после встречи он останется один.
  • Если первый участник придет со вторым или третьим участником, в обсуждении будет ничья, и они оба уйдут.
  • Если первый участник придет со вторым и третьим участниками, первый участник окажется в меньшинстве и уйдет после обсуждения, что противоречит условию.
  • Если придут первый и четвертый участники, они согласятся во время обсуждения и оба останутся до конца.
  • Если придут первый, второй и четвертый участники, второй участник окажется в меньшинстве во время обсуждения, и после него останутся только первый и четвертый участники. То же самое произойдет, если второго участника заменить на третьего.
  • Если придут все четыре участника, во время обсуждения будет ничья, и все уйдут.

Максимальное количество участников, оставшихся после встречи, составляет \(2\).

Пример 4:

В клубе \(5\) участников, и во время встречи будут обсуждаться \(4\) мнения.

Один из способов достичь максимального количества участников — если на встречу придут только первый, третий и пятый участники. В этом случае все они согласятся во время первых двух обсуждений, после чего третий участник окажется в меньшинстве во время третьего обсуждения. Затем первый и пятый участники согласятся в последнем обсуждении, и эти два участника останутся до конца встречи.

Пример 5:

В клубе \(4\) участника, и будут обсуждаться \(2\) мнения.

Если на встречу придут первые три участника, первый участник окажется в меньшинстве во время первого обсуждения и покинет клуб. После этого второй и третий участники будут не согласны со вторым мнением, и они оба останутся до конца встречи. Таким образом, после встречи останется 2 участника, но это недопустимый исход, так как это вынуждает первого участника уйти. Следовательно, максимальное количество в 1 участник достигается, если на встречу придет только первый участник.

B. Мясник

геометрия жадные алгоритмы реализация сортировки *1900

Антон играет в свою любимую игру «Защита древних 2» за своего любимого героя — Мясника. Сейчас он хочет приготовить себе ужин. Для этого он возьмет прямоугольник высоты \(h\) и ширины \(w\), затем проведет вертикальный или горизонтальный разрез так, чтобы обе получившиеся части имели целые стороны. После этого одну из частей он положит в ящик, а другую снова разрежет, и так далее.

Более формально, прямоугольник размера \(h \times w\) можно разрезать на две части размеров \(x \times w\) и \((h - x) \times w\), где \(x\) является целым числом от \(1\) до \((h - 1)\), или же на две части размеров \(h \times y\) и \(h \times (w - y)\), где \(y\) является целым числом от \(1\) до \((w - 1)\).

Эту операцию он повторит \(n - 1\) раз, после чего оставшийся прямоугольник тоже положит в ящик. Таким образом, в ящике будет \(n\) прямоугольников, из которых \(n - 1\) прямоугольник был отложен в результате разрезов, а \(n\)-й прямоугольник — тот, что остался в руках Мясника после всех \(n - 1\) разрезов.

К сожалению, Мясник забыл числа \(h\) и \(w\), однако у него сохранились \(n\) прямоугольников, перемешанных в произвольном порядке. Обратите внимание, что Мясник не поворачивал прямоугольники, но, возможно, переупорядочил их. Теперь он хочет узнать все возможные пары \((h, w)\), из которых можно получить данный набор прямоугольников. А вы должны ему в этом помочь!

Гарантируется, что существует хотя бы одна пара \((h, w)\), из которой можно получить данный набор прямоугольников.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество полученных прямоугольников.

\(i\)-я из следующих \(n\) строк содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 10^6\)) — высота и ширина \(i\)-го прямоугольника.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в первой строке выведите одно целое число \(m\) — количество пар \((h, w)\), обозначающих размеры прямоугольников, из которых можно получить данные прямоугольники. Два прямоугольника считаются различными, если у них отличается длина или ширина.

В каждой из следующих \(m\) строк выведите два целых числа \(h_i\) и \(w_i\)  — высоту и ширину прямоугольника, из которого можно получить данные прямоугольники. Вы можете выводить прямоугольники в любом порядке.

Примечание

В первом наборе входных данных у Мясника мог быть только прямоугольник размером \(4 \times 5\). Тогда разрезы могли бы выглядеть следующим образом (сначала был сделан зеленый разрез, затем красный):

Во втором наборе входных данных у Мясника мог быть либо прямоугольник размером \(1 \times 3\), либо \(3 \times 1\). Разрезы выглядели бы так (сначала был сделан зеленый разрез, затем красный):

В третьем наборе входных данных Мясник не делал ни одного разреза, поэтому прямоугольник имеет размер \(10 \times 10\).

C. Лисица и полный обход древа

Деревья дп Конструктив математика реализация *2400

Лисица Яэ забралась на древо Священной сакуры. Древом называют связный неориентированный граф, не содержащий циклов.

Для передвижения по древу лисица применяет свои магические способности. Яэ может прыгнуть из вершины \(v\) в другую вершину \(u\) тогда и только тогда, когда расстояние между этими вершинами не превосходит \(2\). Иными словами, за один прыжок Яэ может перепрыгнуть из вершины \(v\) в вершину \(u\), если вершины \(v\) и \(u\) соединены ребром, либо если существует такая вершина \(w\), что вершины \(v\) и \(w\) соединены ребром, а также вершины \(u\) и \(w\) соединены ребром.

После того, как Яэ смогла заполучить лепесток сакуры, она задумалась, существует ли циклический маршрут в древе \(v_1, v_2, \ldots, v_n\), такой что:

  • лисица может совершить прыжок из вершины \(v_i\) в вершину \(v_{i + 1}\),
  • лисица может совершить прыжок из вершины \(v_n\) в вершину \(v_1\),
  • все \(v_i\) попарно различны.

Помогите лисице определить, существует ли требуемый обход.

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин древа.

Каждая из следующих \(n - 1\) строк содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — вершины, соединенные ребром. Гарантируется, что данные ребра задают древо.

Выходные данные

В первой строке выведите «Yes» (без кавычек), если требуемый обход древа существует, либо «No» (без кавычек) в противном случае.

Если требуемый обход древа существует, во второй строке выведите \(n\) целых различных чисел \(v_1, v_2, \ldots, v_n\) (\(1 \le v_i \le n\)) — вершины древа в порядке обхода.

Если существует несколько корректных обходов, выведите любой из них.

Примечание

Древо из первого примера изображено ниже. Жирными стрелками обозначен маршрут лисицы.

Во втором примере любая последовательность из трёх различных вершин является корректным маршрутом, потому что лисица может совершить прыжок из любой вершины в любую.

Древо из третьего примера изображено ниже. Можно показать, что для него не существует требуемого маршрута.

A. Поле битвы

геометрия графы кратчайшие пути реализация *2200

Вася плохо учился в университете и попал на поле битвы. Шутка. Он всего лишь играет в какую-то компьютерную игру. Поле представляет собой плоскую площадку, на которой выкопано n траншей. Траншеи — это отрезки на плоскости, параллельные осям координат. Никакие две траншеи не пересекаются.

Далеко от Васи находится огромный вражеский лазер. Лазер заряжается в течении a секунд, а после этого стреляет непрерывно в течении b секунд. Потом снова a секунд заряжается. Потом опять непрерывно в течении b секунд стреляет и так далее. Числа a и b известны Васе. Так же Васе известно, что во время выстрела лазера ему необходимо находиться в траншее, а в пока лазер заряжается, он может без опасений передвигаться по полю. Главное успеть до выстрела спрятаться в траншее. Если Вася добегает до траншеи ровно в момент начала выстрела лазера, считается, что Вася успел спрятаться. Так совпало, что длина любой траншеи в метрах численно не превосходит b.

Изначально Вася находится в точке A. Ему необходимо попасть в точку B. Вася передвигается со скоростью 1 метр в секунду в любом направлении. В траншею можно входить и из нее можно выходить в любой её точке. Вход и выход из траншеи осуществляется мгновенно. Так же по траншее можно передвигаться, не выходя из нее.

Какое минимальное время потребуется Васе, чтобы добраться из точки A в точку B, если в начальный момент времени лазер только что начал заряжаться? Если же Вася не может попасть из точки A в точку B, выведите -1. Если Вася достигнет точки B в момент начала выстрела лазера, то считается, что он успел дойти в точку B.

Входные данные

В первой строке заданы два целых числа через пробел: a и b (1 ≤ a, b ≤ 1000), — продолжительность процесса зарядки лазера и продолжительность выстрела лазера в секундах.

Во второй строке заданы четыре целых числа через пробел: Ax, Ay, Bx, By ( - 104 ≤ Ax, Ay, Bx, By ≤ 104) — координаты точек А и B. Гарантируется, что точки A и B не принадлежат никакой траншее.

В третьей строке задано единственное целое число: n (1 ≤ n ≤ 1000), — количество траншей.

В каждой из следующих n строк задано по четыре целых числа через пробел: x1, y1, x2, y2 ( - 104 ≤ xi, yi ≤ 104) — координаты концов соответствующей траншеи.

Все координаты заданы в метрах. Гарантируется, что для каждой траншеи либо x1 = x2, либо y1 = y2. Никакие две траншеи не пересекаются. Длина любой траншеи в метрах численно не превосходит b.

Выходные данные

Если Вася может попасть из точки A в точку B, то выведите минимальное время, которое ему для этого потребуется. Иначе выведите число -1.

Ответ будет считаться правильным, если абсолютная или относительная погрешность не превышает 10 - 4

B. Календарь Васи

реализация *1000

Вася живет в странном мире, где в году n месяцев, а в i-ом месяце ai дней. На новый год Васе подарили наручные часы, которые показывают не только время, но и сегодняшнее число.

На дисплее часов может отображаться любое число от 1 до d. Гарантируется, что ai ≤ d для всех i от 1 до n. Часы не хранят данные о текущем месяце, поэтому когда наступает новый день они просто увеличивают текущий номер дня на один. Часы не могут отображать число d + 1, поэтому после номера дня d они показывают номер дня 1 (счетчик текущего дня сбрасывается). Механизм работы часов позволяет вручную увеличить номер дня на один. При выполнении этой операции также за днем d следует день 1.

Каждый день Вася начинает с того, что проверяет номер дня на своих часах. Если номер дня на часах не совпадает с действительным номером сегодняшнего дня в текущем месяце, то Вася вручную увеличивает его на один. Вася настойчив и повторяет эту операцию пока номер дня на часах не совпадет с действительным номером сегодняшнего дня в текущем месяце.

Прошел год и Васе стало интересно, сколько раз начиная с первого дня первого месяца до последнего дня n-го месяца включительно он вручную увеличил номер дня на один, если в первый день первого месяца на часах отображался номер дня 1.

Входные данные

В первой строке записано единственное целое число d — максимальный номер дня, который отображают часы Васи (1 ≤ d ≤ 106).

Во второй строке находится единственное целое число n — количество месяцев в году (1 ≤ n ≤ 2000).

В третьей строке находятся n целых чисел, разделенных пробелом: ai (1 ≤ ai ≤ d) — количество дней в каждом месяце в году в порядке их следования, начиная с первого.

Выходные данные

Выведите одно число — сколько раз за прошедший год Вася вручную увеличивал номер дня на один.

Примечание

В первом примере события развиваются следующим образом:

  • День 1. Месяц 1. На часах отображается 1. Вася ничего не поправляет.
  • День 2. Месяц 1. На часах отображается 2. Вася ничего не поправляет.
  • День 1. Месяц 2. На часах отображается 3. Вася вручную увеличивает номер дня на 1. После этого на часах отображается 4. Вася еще раз вручную увеличивает номер дня на 1. После этого на часах отображается 1.
  • День 2. Месяц 2. На часах отображается 2. Вася ничего не поправляет.
В итоге Вася ровно 2 раза вручную увеличивал номер дня на 1.

D. Общие делители

математика Перебор реализация Строки хэши *1400

Недавно Вася узнал в школе, что такое делитель числа, и решил определить делитель строки. Вот что он придумал.

Строка a является делителем строки b тогда и только тогда, когда существует целое положительное число x такое, что если строку a выписать x раз подряд получится строка b. Например, у строки «abab» два делителя — «ab» и «abab».

Теперь Вася захотел написать программу, которая вычисляет количество общих делителей двух строк. Помогите ему, пожалуйста.

Входные данные

В первой строке входных данных задана непустая строка s1.

Во второй строке входных данных задана непустая строка s2.

Длины строк s1 и s2 положительны и не превосходят 105. Строки состоят только из строчных букв латинского алфавита.

Выходные данные

Выведите количество общих делителей строк s1 и s2.

Примечание

В первом примере общими делителями являются строки «abcd» и «abcdabcd».

В втором примере общим делителем является единственная строка «a». Строка «aa» не входит в ответ, так как не является делителем строки «aaa».

A. Новое имя Юры

реализация Строки *800

После проведения «ЛКОШПа» мальчик Юра очень устал и захотел изменить свою жизнь и переехать в Японию. В честь такой перемены Юра сменить имя на что-то милое.

Загоревшись этой идеей он уже придумал себе имя \(s\), состоящее только из символов «_» и «^». Но вот незадача Юра очень любит смайлики «^_^» и «^^». Поэтому любой символ имени должен быть частью хотя бы одного такого смайлика. Обратите внимание, что смайликом могут являться только подряд идущие символы имени.

Более формально, рассмотрим все вхождения строк «^_^» и «^^» в строку \(s\). Тогда все такие вхождения должны покрывать всю строку \(s\), возможно, с пересечениями. Например, в строке «^^__^_^^__^» символы на позициях \(3,4,9,10\) и \(11\) не содержатся внутри ни одного смайлика, а остальные символы на позициях \(1,2,5,6,7\) и \(8\) содержатся внутри смайликов.

За одну операцию Юра может вставить один из символов «_» и «^» в своё имя \(s\) (вставлять можно на любую позицию в строке). Он просит вас сказать минимальное количество операций, которые нужно сделать, чтобы имя подходило под критерий Юры.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит единственную строку \(s\) (\(1 \leq |s| \leq 100\)), состоящую из символов «_» и «^»,  — имя, которое нужно поменять.

Выходные данные

Для каждого набора входных данных выведите ровно одно целое число — минимальное количество символов, которое нужно добавить в имя, чтобы оно подходило для Юры. Если ничего в имени менять не нужно, то выведите \(0\).

Примечание

В первом наборе входных данных можно получить следующее имя, добавив \(5\) символов:

^_^_^_^_^_^_^

В третьем наборе входных данных мы можем добавить один символ «^» в конец имени, тогда получится имя:

^_^

В четвёртом наборе входных данных мы можем добавить один символ «^» в конец имени, тогда получится имя:

^^

В пятом наборе входных данных все символы уже содержатся в смайликах, поэтому ответ равен \(0\).

В седьмом наборе входных данных можно добавить один символ «^» в начало имени и один символ «^» в конец имени, тогда получится имя:

^_^

C. Разорвать на части

математика Перебор реализация Строки *1300

Дана строка \(s\), состоящая из строчных латинских букв.

За одно действие вы можете выбрать несколько (одну или больше) позиций в ней так, что никакие две выбранные позиции не соседние друг другу. Затем вы удаляете все буквы на выбранных позициях из строки. Полученные части строки затем склеиваются без изменения порядка.

Какое наименьшее количество действий необходимо совершить, чтобы все буквы в строке \(s\) стали одинаковые?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В единственной строке каждого набора записана строка \(s\), состоящая из строчных латинских букв. Ее длина от \(1\) до \(2 \cdot 10^5\).

Суммарная длина строк по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — наименьшее количество действий, которые необходимо совершить, чтобы все буквы в строке \(s\) стали одинаковые.

Примечание

В первом наборе входных данных вы можете выбрать позиции \(2, 4\) и \(6\), и удалить соответствующие буквы 'b', 'c' и 'b'.

В третьем примере все буквы в строке уже одинаковые, поэтому не нужно совершать никаких действий.

В четвертом примере одно из возможных решений за \(2\) действия следующее. Сначала выбираете позиции \(1, 4, 6\). Строка становится «bce». Затем выбираете позиции \(1\) и \(3\). Строка становится «c». Все буквы в ней одинаковые, так как это просто одна буква.

A. Лента TubeTube

Перебор реализация *800

Гриб Филиппов приготовил себе покушать, а за едой решил посмотреть видео на TubeTube. Он может выделить на обед не более \(t\) секунд, поэтому просит вас помочь с выбором видео.

Лента TubeTube представляет собой список из \(n\) видео, пронумерованных от \(1\) до \(n\); \(i\)-е видео длится \(a_i\) секунд и имеет интересность \(b_i\). Изначально лента открыта на первом видео, за \(1\) секунду Гриб может пропустить видео и перейти к следующему (если следующее существует). Переходить к следующему видео Гриб может любое количество раз (в том числе и ноль).

Помогите Грибу выбрать одно видео, которое он сможет открыть и посмотреть за \(t\) секунд. Если таких несколько, он хочет выбрать наиболее интересное. Выведите номер подходящего видео, или \(-1\), если таких нет.

Входные данные

В первой строке входных данных содержится одно целое число \(q\) (\(1 \le q \le 1000\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

В первой строке набора содержится два числа \(n\) и \(t\) (\(1 \le n \le 50\), \(1 \le t \le 200\)) — количество видео в ленте и секунд на обед, соответственно.

Во второй строке набора содержится \(n\) чисел \(a_1, a_2, a_3, \dots, a_n\) (\(1 \le a_i \le 100\)) — продолжительности видео.

В третьей строке набора содержится \(n\) чисел \(b_1, b_2, b_3, \dots, b_n\) (\(1 \le b_i \le 100\)) — интересности видео.

Выходные данные

Выведите \(q\) целых чисел, каждое из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите номер самого интересного видео, которое успеет посмотреть Гриб. Если ответов несколько — выведите любой. Выведите \(-1\), если он не успеет посмотреть ни одно видео до конца обеда.

A. LuoTianyi и шоу

жадные алгоритмы реализация *1400

В шоу о VOCALOID принимают участие \(n\) человек. Они будут сидеть в ряду с сиденьями, пронумерованными от \(1\) до \(m\) слева направо.

Все \(n\) людей приходят и садятся по порядку. Каждый человек занимает место одним из трёх способов:

  1. Сесть на соседнее слева место от самого левого человека, который уже сидит, или, если место \(1\) занятно, то покинуть шоу. Если сейчас никто не сидит, то занять место с номером \(m\).
  2. Сесть на соседнее справа место от самого правого человека, который уже сидит, или, если место \(m\) занятно, то покинуть шоу. Если сейчас никто не сидит, то занять место с номером \(1\).
  3. Сесть на место с номером \(x_i\). Если это место занято, то покинуть шоу.

Теперь вы хотите узнать, каково максимальное количество тех, кто может занять место, если вы можете впустить людей на шоу в любом порядке?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10^5\)) — количество людей и количество мест.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(x_1, x_2, \ldots, x_n\) (\(-2 \le x_i \le m\), \(x_i \ne 0\)), \(i\)-е из которых описывает способ, как \(i\)-й человек занимает место:

  1. Если \(x_i=-1\), то \(i\)-й человек занимает место первым способом.
  2. Если \(x_i=-2\), то \(i\)-й человек занимает место вторым способом.
  3. Если \(x_i > 0\), то \(i\)-й человек занимает место третьим способом, т.е. хочет сесть на место с номером \(x_i\) или покинуть шоу, если оно занято.

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превосходят \(10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — максимальное количество человек, которые могут занять место.

Примечание

В первом наборе входных данных все люди хотят занять место \(5\), поэтому только \(1\) человек сможет занять место.

Во втором наборе входных данных людей можно впустить в порядке \(1, 2, 3, 4\), тогда все люди, кроме последнего, смогут занять место.

В третьем наборе входных данных мы можем впускать людей на шоу в таком порядке:

Впустим третьего человека:

3

Впустим четвёртого человека:

34

Впустим пятого человека:

345

Впустим первого человека:

1345

Впустим второго человека:

21345

Таким образом, все \(5\) человек заняли места.

В пятом наборе входных данных мы можем впускать людей на шоу в таком порядке:

Впустим четвёртого человека:

4

Впустим третьего человека:

34

Впустим шестого человека, он покинет шоу, потому что занимает место третьим способом и должен сесть на место \(4\), но оно уже занято:

34

Впустим пятого человека:

534

Впустим первого человека:

1534

Впустим второго человека:

21534

Таким образом, \(5\) человек заняли места.

В седьмом наборе входных данных мы можем впускать людей на шоу в таком порядке:

Впустим третьего человека:

3

Впустим четвёртого человека:

34

Впустим пятого человека:

345

Впустим шестого человека:

3456

Впустим первого человека:

34561

Впустим второго человека, он покинет шоу, потому что занимает место первым способом, но место \(1\) занято:

34561

Таким образом, \(5\) человек заняли места.

A. Trust Nobody

жадные алгоритмы Перебор реализация сортировки *1200

Есть группа из \(n\) человек. Некоторые из них могут быть лжецами, которые всегда лгут. Остальные люди всегда говорят правду. \(i\)-й человек сказал: «Среди нас не менее \(l_i\) лжецов». Определите, является ли сказанное людьми противоречивым, или это возможно. Если это возможно, выведите количество лжецов в группе. Если ответов несколько, вы можете вывести любой из них.

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \leq t \leq 1000\)) — число наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \leq n \leq 100\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(l_i\) (\(0 \leq l_i \leq n\)) — число, которое сказал \(i\)-й человек.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^4\).

Выходные данные

Для каждого набора входных данных выведите одно целое число. Если сказанное людьми противоречиво, выведите \(-1\). Иначе выведите количество лжецов в группе. Если ответов несколько, вы можете вывести любой из них.

Примечание

В первом примере единственный возможной ответ, это что лжет второй человек, откуда ответ \(1\) лжец.

Во втором примере можно показать, что невозможно выбрать лжецов, так чтобы все высказывания удовлетворяли условию.

В третьем примере все говорят правду, откуда ответ \(0\) лжецов.

E. Walk the Runway

битмаски графы дп Перебор реализация сортировки Структуры данных *2400

Тур состоит из \(m\) идентичных подиумных шоу в разных городах. Всего есть \(n\) моделей, которые хотят участвовать в туре, пронумерованных от \(1\) до \(n\). У людей в разных городах разные взгляды на индустрию моды, поэтому они оценивают моделей по-разному. В частности, люди в городе \(i\) оценивают модель \(j\) рейтингом \(r_{i, j}\).

Из желающих моделей вы выберете \(k\) моделей и некоторый их порядок, пусть эти модели в этом порядке имеют номера \(j_1, j_2, \dots, j_k\). В каждом городе на подиум выйдут эти \(k\) моделей в данном порядке. Чтобы сделать шоу захватывающим, в каждом городе рейтинги моделей должны строго возрастать в порядке их выхода на подиум. Более формально, для любого города \(i\) и индекса \(t\) (\(2 \leq t \leq k\)), рейтинги должны удовлетворять условию \(r_{i,j_{t - 1}} < r_{i,j_t}\).

В конце концов, индустрия моды сфокусирована на деньгах, поэтому выбрав модель \(j\) для участия в туре, вы получите \(p_j\) прибыли. Вычислите, какую максимальную прибыль вы можете получить при правильном выборе моделей и порядка их выступления, при условии соблюдения всех ограничений.

Входные данные

Первая строка содержит два целых числа \(m\) и \(n\) (\(1 \leq m \leq 500\), \(1 \leq n \leq 5000\)) — число шоу и число моделей, желающих участвовать, соответственно.

Вторая строка содержит \(n\) целых чисел \(p_j\) (\(1 \leq p_j \leq 10^9\)) — прибыль от приглашения \(j\)-й модели в тур.

В каждой из следующих \(m\) строк содержится \(n\) целых чисел. Строка под номером \(i\) содержит \(n\) целых чисел \(r_{i, j}\) (\(1 \leq r_{i, j} \leq n\)) — рейтинги моделей в городе \(i\).

Выходные данные

Выведите одно целое число — максимальную суммарную прибыль.

Примечание

В первом примере в тур приглашены \(3\) модели. Шоу состоит из моделей в следующем порядке \([1, 3, 4]\).

Соответственные рейтинги в городах:

  • Город \(1\)\([ 1, 3, 4 ]\).
  • Город \(2\)\([ 1, 2, 3 ]\).
  • Город \(3\)\([ 2, 4, 5 ]\).

Видно, что рейтинги моделей в каждом городе возрастают. Суммарная прибыль равна \(10 + 10 + 10 = 30\). Можно доказать, что невозможно достичь большей прибыли.

Во втором примере мы можем пригласить в тур пятую модель, откуда получаем общую прибыль \(50\). Можно доказать, что невозможно достичь большей прибыли.

В третьем примере мы приглашаем в тур единственную модель, откуда получаем прибыль \(1\,000\,000\,000\).

В четвертом примере мы можем пригласить всех моделей и шоу будет состоять из моделей в следующем порядке \([ 5, 4, 3, 2, 1 ]\). Тогда общая прибыль будет равна \(5 \cdot 1\,000\,000\,000 = 5\,000\,000\,000\).

A. История любви

реализация Строки *800

Тимур любит Codeforces. Поэтому у него есть строка \(s\) длиной \(10\) символов, состоящая только из строчных латинских букв. Тимур хочет знать, на скольких позициях строка \(s\) отличается от строки «codeforces».

Например, строка \(s =\) «coolforsez» отличается от «codeforces» в \(4\) позициях, выделенных жирным шрифтом.

Помогите Тимуру, найдя количество позиций, на которых строка \(s\) отличается от «codeforces».

Обратите внимание, что вы не можете менять порядок символов в строке \(s\).

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных в тесте.

Каждый набор состоит из одной строки, содержащей строку \(s\) длины \(10\), которая состоит только из строчных латинских букв.

Выходные данные

Для каждого набора выведите одно целое число — количество позиций, на которых строка \(s\) отличается от «codeforces».

B. Пробел

реализация *800

Дан бинарный массив \(a\) из \(n\) элементов, бинарный массив — это массив, состоящий только из \(0\) и \(1\).

Пробел — это непрерывный отрезок массива, состоящий только из \(0\).

Ваша задача — найти длину самого длинного пробела.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных в тесте.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \leq n \leq 100\)) — длина массива.

Вторая строка каждого набора содержит \(n\) целых чисел, разделенных пробелами, \(a_i\) (\(0 \leq a_i \leq 1\)) — элементы массива.

Выходные данные

Для каждого теста выведите одно целое число — длину самого длинного пробела.

C. Мистер совершенство

битмаски жадные алгоритмы реализация *800

Виктор хочет стать «Мистером совершенство». Для этого ему нужно овладеть определенным набором навыков. Более точно, у него есть \(2\) навыка, которые ему нужно овладеть.

У него также есть \(n\) книг. Чтение книги \(i\) занимает у него \(m_i\) минут и дает ему некоторые (возможно, ни одного) из двух необходимых навыков, представленных двоичной строкой длины \(2\).

Какое минимальное количество времени потребуется, чтобы Виктор овладел обоими необходимыми навыками?

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов случаев. Затем следует описание наборов.

Первая строка каждого набора содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество доступных книг.

Затем следуют \(n\) строк. Строка \(i\) содержит положительное целое число \(m_i\) (\(1 \leq m_i \leq 2 \cdot 10^5\)) и двоичную строку длины \(2\), где \(s_{i1} = 1\), если чтение книги \(i\) дает Виктору навык \(1\), и \(s_{i1} = 0\) в противном случае, а \(s_{i2} = 1\), если чтение книги \(i\) дает Виктору навык \(2\), и \(s_{i2} = 0\) в противном случае.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество минут, необходимое для того, чтобы Виктор овладел обоими необходимыми навыками, и \(-1\), если невозможно овладеть двумя навыками после чтения любого количества книг.

Примечание

В первом тестовом случае мы можем использовать книги \(2\) и \(3\), с общим количеством потраченного времени, равным \(3 + 4 = 7\).

Во втором тестовом случае мы можем использовать книги \(1\) и \(4\), с общим количеством потраченного времени, равным \(3 + 2 = 5\).

В третьем тестовом случае у нас есть только один вариант, и это чтение книги \(1\) за общее количество потраченного времени, равное \(5\).

D. Золотая лихорадка

дп Перебор поиск в глубину и подобное реализация *1000

Изначально у вас есть одна куча золотых самородков, содержащая \(n\) самородков. За одну операцию вы можете сделать следующее:

  • Разделить любую кучу на две кучи так, чтобы одна из полученных куч содержала в два раза больше золотых самородков, чем другая. (Все кучи должны содержать целое число самородков.)

Одно из возможных действий - взять кучу размера \(6\) и разделить ее на кучи размеров \(2\) и \(4\), что является допустимым, так как \(4\) в два раза больше, чем \(2\).

Можете ли вы сделать кучу с ровно \(m\) золотых самородков, используя ноль или более операций?
Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных в тесте.

Единственная строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 10^7\)) — начальный и целевой размер кучи соответственно.

Выходные данные

Для каждого теста выведите «YES», если вы можете создать кучу размером ровно \(m\), и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Первый тест изображен в условии. Мы можем создать кучу размером \(4\).

Во втором тесте мы можем выполнить следующие операции: \(\{\color{red}{9}\} \to \{\color{red}{6},3\} \to \{4,2,3\}\). Куча, которая разделяется, выделена красным цветом перед каждой операцией.

В третьем тесте мы не можем выполнить ни одной операции.

В четвертом тесте мы не можем получить кучу большего размера, чем у нас изначально.

E. Озера

графы поиск в глубину и подобное реализация снм *1100

Дана сетка \(a\) размера \(n \times m\) из неотрицательных целых чисел, где \(a_{i,j}\) представляет глубину воды в \(i\)-й строке и \(j\)-м столбце.

Озеро — это набор ячеек, таких что:

  • Каждая ячейка в наборе имеет \(a_{i,j} > 0\)
  • Существует путь между любой парой ячеек в озере, двигаясь вверх, вниз, влево или вправо, несколько раз и не наступая на ячейку с \(a_{i,j} = 0\).

Объем озера — это сумма глубин всех ячеек в озере.

Найдите наибольший объем озера в сетке.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных в тесте.

Первая строка каждого набора содержит два целых числа \(n, m\) (\(1 \leq n, m \leq 1000\)) — размеры сетки.

Затем следуют \(n\) строк, каждая из которых содержит \(m\) целых чисел \(a_{i,j}\) (\(0 \leq a_{i,j} \leq 1000\)) — глубина воды в каждой ячейке.

Гарантируется, что сумма \(n \cdot m\) по всем наборам не превышает \(10^6\).

Выходные данные

Для каждого теста выведите одно целое число — наибольший объем озера в сетке.

G. Пирамида из банок

дп математика реализация Структуры данных *1600

На ярмарке есть огромная пирамида из консервных банок с \(2023\) рядами, пронумерованными в стандартном порядке, как показано на рисунке.

Если вначале попасть в банку с номером \(9^2\), то упадут все банки, покрашенные в красный цвет на рисунке выше.

Вы бросаете мяч в пирамиду, и он попадает в одну банку с номером \(n^2\). Это приводит к тому, что все банки, которые находятся над этой банкой, падают (то есть банка \(n^2\) падает, затем падают банки, непосредственно находящиеся над \(n^2\), затем банки, непосредственно находящиеся над этими банками, и так далее). Например, на рисунке выше показаны банки, которые упадут, если попасть в банку \(9^2\).

Какова сумма номеров всех банок, которые упадут? Напомним, что \(n^2 = n \times n\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 10^6\)) — это означает, что банка, в которую вы попали, имеет номер \(n^2\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — сумму номеров всех банок, которые упадут.

Примечание

Первый набор входных данных изображен в условии. Сумма номеров, которые упадут, равна \(\)1^2 + 2^2 + 3^2 + 5^2 + 6^2 + 9^2 = 1 + 4 + 9 + 25 + 36 + 81 = 156.\(\)

Во втором наборе входных данных упадет только банка с номером \(1^2\), поэтому ответ равен \(1^2=1\).

В третьем наборе входных данных упадут банки с номерами \(1^2\) и \(2^2\), поэтому ответ равен \(1^2+2^2=1+4=5\).

В четвертом наборе входных данных упадут банки с номерами \(1^2\) и \(3^2\), поэтому ответ равен \(1^2+3^2=1+9=10\).

В пятом наборе входных данных упадут банки с номерами \(1^2\), \(2^2\) и \(4^2\), поэтому ответ равен \(1^2+2^2+4^2=1+4+16=21\).

C. Контрастность

жадные алгоритмы реализация *1200

Для массива целых чисел \([a_1, a_2, \dots, a_n]\) значение \(|a_1-a_2|+|a_2-a_3|+\cdots+|a_{n-1}-a_n|\) назовем контрастностью массива. Обратите внимание, что контрастность массива размера \(1\) равен \(0\).

Дан массив целых чисел \(a\). Ваша задача — построить массив \(b\) таким образом, чтобы выполнялись следующие условия:

  • \(b\) не пустой, то есть содержит хотя бы один элемент;
  • \(b\) является подпоследовательностью \(a\), то есть \(b\) может быть получен удалением некоторых элементов из \(a\) (возможно, ни одного);
  • контрастность \(b\) равна контрастности \(a\).

Каково минимально возможное количество элементов в массиве \(b\)?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)) — размер массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \cdot, a_n\) (\(0 \le a_i \le 10^9\)) — элементы массива.

Сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимально возможное количество элементов в массиве \(b\).

D1. Красно-синие операции (простая версия)

Бинарный поиск жадные алгоритмы математика реализация *2100

Единственное отличие между простой и сложной версиями — максимальные значения \(n\) и \(q\).

Задан массив, состоящий из \(n\) целых чисел. Изначально все элементы красные.

К массиву можно несколько раз применить следующую операцию. На \(i\)-й операции вы выбираете элемент массива; затем:

  • если элемент красный, то он увеличивается на \(i\) и становится синим;
  • если элемент синий, то он уменьшается на \(i\) и становится красным.

Операции нумеруются с \(1\), т. е. на первой операции некоторый элемент изменяется на \(1\) и так далее.

К массиву задаются \(q\) запросов следующего вида:

  • дано целое число \(k\), какой может быть наибольший минимум в массиве после того как вы примените ровно \(k\) операций к нему?

Обратите внимание, что операции не изменяют массив между запросами, все запросы задаются к начальному массиву \(a\).

Входные данные

В первой строке записано два целых числа \(n\) и \(q\) (\(1 \le n, q \le 1000\)) — количество элементов массива и количество запросов.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

В третьей строке записаны \(q\) целых чисел \(k_1, k_2, \dots, k_q\) (\(1 \le k_j \le 10^9\)).

Выходные данные

На каждый запрос выведите одно целое число — наибольший минимум, который может быть в массиве после того как вы примените ровно \(k\) операций к нему.

D2. Красно-синие операции (сложная версия)

Бинарный поиск жадные алгоритмы Конструктив математика реализация *2400

Единственное отличие между простой и сложной версиями — максимальные значения \(n\) и \(q\).

Задан массив, состоящий из \(n\) целых чисел. Изначально все элементы красные.

К массиву можно несколько раз применить следующую операцию. На \(i\)-й операции вы выбираете элемент массива; затем:

  • если элемент красный, то он увеличивается на \(i\) и становится синим;
  • если элемент синий, то он уменьшается на \(i\) и становится красным.

Операции нумеруются с \(1\), т. е. на первой операции некоторый элемент изменяется на \(1\) и так далее.

К массиву задаются \(q\) запросов следующего вида:

  • дано целое число \(k\), какой может быть наибольший минимум в массиве после того как вы примените ровно \(k\) операций к нему?

Обратите внимание, что операции не изменяют массив между запросами, все запросы задаются к начальному массиву \(a\).

Входные данные

В первой строке записано два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество элементов массива и количество запросов.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

В третьей строке записаны \(q\) целых чисел \(k_1, k_2, \dots, k_q\) (\(1 \le k_j \le 10^9\)).

Выходные данные

На каждый запрос выведите одно целое число — наибольший минимум, который может быть в массиве после того как вы примените ровно \(k\) операций к нему.

A. Музыкальный паззл

реализация Строки *800

Влад решил записать мелодию на своей гитаре. Представим мелодию как последовательность нот, которым соответствуют символы 'a', 'b', 'c', 'd', 'e', 'f' и 'g'.

Однако, он не очень опытен в игре на гитаре и может записать ровно две ноты за раз. Влад хочет получить мелодию \(s\) и для этого он может сводить записанные мелодии вместе. При этом, последний звук в первой мелодии должен совпадать с первым звуком второй мелодии.

Например, если Влад записал мелодии «ab» и «ba», он может свести их вместе и получить мелодию «aba», а потом свести результат с «ab» и получить «abab».

Помогите Владу определить, какое минимальное количество мелодий из двух нот ему нужно записать, чтобы получить мелодию \(s\).

Входные данные

В первой строке входных данных содержится целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

Первая строка набора содержит целое число \(n\) (\(2 \le n \le 50\)) — длина мелодии \(s\).

Вторая строка набора содержит строку \(s\) из \(n\) символов, каждый из которых 'a', 'b', 'c', 'd', 'e', 'f' или 'g'.

Выходные данные

Выведите \(t\) целых чисел, каждое из которых является ответом на соответствующий набор входных данных. В качестве ответа выведите минимальное количество мелодий из двух нот, которое нужно записать Владу.

Примечание

В первом примере нужно записать мелодии «ab» и «ba», как и было описано в условии.

Во втором примере нужно записать мелодии «ab», «ba», «aс» и «сa».

В третьем примере единственная необходимая мелодия это «aa».

F. Ира и фламенко

Комбинаторика Конструктив математика реализация сортировки Структуры данных *1700

Ира очень любит испанский танец фламенко. Она решила основать собственную танцевальную студию и нашла \(n\) учеников, \(i\)-й из которых имеет уровень \(a_i\).

Ира может выбрать несколько своих учеников и поставить с ними танец. Таким образом она может поставить огромное количество танцев, но её интересуют только великолепные танцы. Танец называется великолепным, если выполнено следующее:

  • в танце участвуют ровно \(m\) учеников;
  • уровни всех танцоров попарно различны;
  • уровни любых двух танцоров отличаются строго меньше чем на \(m\).

Например, если \(m = 3\) и \(a = [4, 2, 2, 3, 6]\), следующие танцы являются великолепными (красным цветом выделены ученики, участвующие в танце): \([\color{red}{4}, 2, \color{red}{2}, \color{red}{3}, 6]\), \([\color{red}{4}, \color{red}{2}, 2, \color{red}{3}, 6]\). В то же время танцы \([\color{red}{4}, 2, 2, \color{red}{3}, 6]\), \([4, \color{red}{2}, \color{red}{2}, \color{red}{3}, 6]\), \([\color{red}{4}, 2, 2, \color{red}{3}, \color{red}{6}]\) не являются великолепными.

В танце \([\color{red}{4}, 2, 2, \color{red}{3}, 6]\) участвуют \(2\) ученика, хотя \(m = 3\).

В танце \([4, \color{red}{2}, \color{red}{2}, \color{red}{3}, 6]\) участвуют ученики с уровнями \(2\) и \(2\), хотя уровни всех танцоров должны быть попарно различны.

В танце \([\color{red}{4}, 2, 2, \color{red}{3}, \color{red}{6}]\) участвуют ученики с уровнями \(3\) и \(6\), но \(|3 - 6| = 3\), хотя \(m = 3\).

Помогите Ире посчитать количество великолепных танцев, которые она может поставить. Так как это число может быть очень большим, посчитайте его по модулю \(10^9 + 7\). Два танца считаются различными, если различны наборы учеников, участвующих в них.

Входные данные

В первой строке дано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целые числа \(n\) и \(m\) (\(1 \le m \le n \le 2 \cdot 10^5\)) — количество учеников Иры и количество танцоров в великолепном танце.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — уровни учеников.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное число — количество великолепных танцев по модулю \(10^9 + 7\).

Примечание

В первом наборе входных данных Ира может поставить только такие великолепные танцы: \([\color{red}{8}, 10, 10, \color{red}{9}, \color{red}{6}, 11, \color{red}{7}]\), \([\color{red}{8}, \color{red}{10}, 10, \color{red}{9}, 6, 11, \color{red}{7}]\), \([\color{red}{8}, 10, \color{red}{10}, \color{red}{9}, 6, 11, \color{red}{7}]\), \([\color{red}{8}, 10, \color{red}{10}, \color{red}{9}, 6, \color{red}{11}, 7]\), \([\color{red}{8}, \color{red}{10}, 10, \color{red}{9}, 6, \color{red}{11}, 7]\).

Второй набор входных данных разобран в условии.

G. Ксюша и шиншилла

Деревья дп жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм *1800

У Ксюши есть домашняя шиншилла, дерево на \(n\) вершинах и огромные ножницы. Деревом называется связный граф без циклов. Сейчас Ксюша сидит на скучном уроке физики и думает над тем, как развлечь своего питомца.

Шиншиллам нравится играть с веточками. Веточкой называется дерево из \(3\) вершин.

Веточка выглядит так.

Разрезом называется удаление некоторого (ещё не отрезанного) ребра в дереве. У Ксюши полно свободного времени, поэтому она может себе позволить сделать достаточно разрезов, чтобы дерево распалось на веточки. Другими словами, после нескольких (возможно нуля) разрезов, каждая вершина должна принадлежать ровно одной веточке.

Помогите Ксюше выбрать отрезаемые рёбра или сообщите, что сделать это невозможно.

Входные данные

В первой строке дано единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных дано единственное целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин в дереве.

Следующие \(n - 1\) строк каждого набора входных данных содержат целые числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — номера вершин, которые соединяет \(i\)-е ребро.

Гарантируется, что данный набор рёбер образует дерево. Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите ответ для каждого набора входных данных.

Если искомого способа разрезать дерево не существует, выведите \(-1\).

В противном случае выведите целое число \(k\) — количество отрезаемых рёбер. В следующей строке выведите \(k\) различных целых чисел \(e_i\) (\(1 \le e_i < n\)) — номера отрезаемых рёбер. Если \(k = 0\), выведите вместо этого пустую строку.

Если решений несколько, вы можете вывести любое.

Примечание
Первый набор входных данных в первом тесте.

D. Опрос на уроке

жадные алгоритмы Перебор реализация сортировки Структуры данных *1900

На урок истории к Зинаиде Викторовне пришло \(n\) учеников. На дом было задано \(m\) тем, но у учеников было мало времени для подготовки, поэтому \(i\)-й ученик выучил только темы с \(l_i\) по \(r_i\) включительно.

В начале урока каждый ученик держит свою руку на уровне \(0\). Учительница хочет спросить какие-то темы. Происходит это так:

  • Учительница спрашивает тему \(k\).
  • Если ученик выучил тему \(k\), то он поднимает руку на \(1\), а иначе опускает на \(1\).
Каждую тему Зинаида Викторовна может спросить не более одного раза.

Определите, какая максимальная разность высот самой высокой и самой низкой руки может быть после опроса.

Обратите внимание, рука ученика может опускаться ниже \(0\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 10^5, 1 \le m \le 10^9\)) — количество учеников и количество тем соответственно.

В следующих \(n\) строках каждого набора содержится по два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le m\)), обозначающих границы отрезка тем, которые выучил \(i\)-й ученик.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальную разность высот самой высокой и самой низкой руки, которая может быть в классе после опроса.

Примечание

В первом наборе входных данных Зинаида Викторовна может спросить темы \(5, 6, 7, 8\). Тогда рука \(2\)-го ученика будет на высоте \(4\), а \(4\)-го — на высоте \(-2\), то есть разность будет равна \(6\).

Во втором наборе можно спросить темы \(1\) и \(3\). Тогда рука \(1\)-го ученика будет на высоте \(2\), а \(3\)-го ученика — на высоте \(-2\). Значит, разность будет равна \(4\).

В третьем наборе разница высот между самой высокой и низкой рукой будет \(0\) при любом наборе спрашиваемых тем.

В пятом наборе можно спросить все темы. Тогда разность высот рук \(1\)-го и \(3\)-го учеников будет равняться \(12\).

E. MEX НОК

Бинарный поиск математика реализация Структуры данных теория чисел *2300

Вам дан массив \(a\) длины \(n\). Назовем целое положительное число \(x\) хорошим, если нельзя найти такой подотрезок\(^{\dagger}\) массива, что наименьшее общее кратное всех элементов на нём равно \(x\).

Вам требуется найти наименьшее хорошее число.

Подотрезком \(^{\dagger}\) массива \(a\) называется набор элементов \(a_l, a_{l + 1}, \ldots, a_r\) для некоторых \(1 \le l \le r \le n\). Будем обозначать такой подотрезок \([l, r]\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное число \(n\) (\(1 \leq n \leq 3 \cdot 10^5\)) — длина массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots , a_n\) (\(1 \leq a_i \leq 10^9\)) — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных выведите единственное целое число — наименьшее хорошее число.

Примечание

В первом наборе входных данных, \(4\) — хорошее число, при этом оно является наименьшим, так как числа \(1,2,3\) встречаются в массиве, а значит, есть подотрезки массива длины \(1\) с наименьшими общими кратными \(1,2,3\). При этом нельзя найти подотрезок массива с наименьшим общим кратным равным \(4\).

Во втором наборе входных данных, \(7\) — хорошее число. При этом числа \(1,2,3,4,5\) встречаются в массиве явно, а число \(6\) является наименьшим общим кратных подотрезков \([2, 3]\) и \([1, 3]\).

В третьем наборе входных данных, \(1\) — хорошее число, так как наименьшие общие кратные для чисел на отрезках \([1, 1], [1, 2], [2, 2]\), соответственно, равны \(2,6,3\).

A. k-е равенство

математика Перебор реализация *1700

Рассмотрим все равенства вида \(a + b = c\), где \(a\) имеет \(A\) цифр, \(b\)\(B\) цифр, а \(c\)\(C\) цифр. Все числа — целые, положительны и записаны без ведущих нулей. Найдите \(k\)-е лексикографически наименьшее равенство, записанное в виде строки, как указано выше, или определите, что его не существует.

Например, первые три равенства, удовлетворяющие \(A = 1\), \(B = 1\), \(C = 2\), имеют вид

  • \(1 + 9 = 10\),
  • \(2 + 8 = 10\),
  • \(2 + 9 = 11\).

Равенство \(s\) лексикографически меньше равенства \(t\), в котором все числа имеют ту же длину, если и только если выполняется следующее:

  • в первой позиции, где \(s\) и \(t\) различны, в уравнении \(s\) находится меньшая цифра, чем соответствующая цифра в \(t\).
Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит числа \(A\), \(B\), \(C\), \(k\) (\(1 \leq A, B, C \leq 6\), \(1 \leq k \leq 10^{12}\)).

Каждый тест содержит не более \(5\) наборов входных данных, которые не удовлетворяют \(A, B, C \leq 3\).

Выходные данные

Для каждого набора входных данных, если подходящих равенств строго меньше \(k\), выведите \(-1\).

В противном случае выведите \(k\)-е равенство в виде строки вида \(a + b = c\).

Примечание

В первом наборе входных данных первыми \(9\) решениями являются: \(\langle 1, 1, 2 \rangle, \langle 1, 2, 3 \rangle, \langle 1, 3, 4 \rangle, \langle 1, 4, 5 \rangle, \langle 1, 5, 6 \rangle, \langle 1, 6, 7 \rangle, \langle 1, 7, 8 \rangle, \langle 1, 8, 9 \rangle, \langle 2, 1, 3 \rangle\).

В третьем наборе входных данных решений нет, так как наименьшие возможные значения \(a\) и \(b\) больше, чем максимально возможное значение \(c\)\(10 + 10 = 20 > 9\).

Обратите внимание, что пробелы в выводе имеют значение.

F. Хороший граф

битмаски графы Паросочетания поиск в глубину и подобное реализация *3500

Вам дан двудольный граф \(G\) с множеством вершин в левой доле \(L\), в правой доле \(R\) и \(m\) ребрами, соединяющими эти два множества. Мы знаем, что \(|L| = |R| = n\).

Для любого подмножества \(S \subseteq L\), пусть \(N(S)\) обозначает множество всех соседей вершин в \(S\). Мы говорим, что подмножество \(S \subseteq L\) в графе \(G\) является строгим, если \(|S| = |N(S)|\). Мы говорим, что граф \(G\) является хорошим, если \(\forall_{S \subseteq L}, |S| \leq |N(S)|\).

Ваша задача — проверить, является ли граф хорошим, и, если да, то оптимизировать его. Если граф не является хорошим, найдите подмножество \(S \subseteq L\) такое, что \(|S| > |N(S)|\). Однако, если граф хороший, ваша задача — найти хороший двудольный граф \(G'\) с тем же набором вершин \(L \cup R\), в котором \(\forall_{S \subseteq L}\) множество \(S\) является строгим в \(G\) тогда и только тогда, когда \(S\) строго в \(G'\). Если таких графов несколько, выберите один с наименьшим возможным числом ребер. Если таких графов по-прежнему несколько, выведите любой из них.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 10^3\), \(0 \leq m \leq n^2\)), разделенных пробелом. Число \(n\) обозначает количество вершин в каждом из множеств \(L\) и \(R\), а число \(m\) — количество ребер между ними.

Следующие \(m\) строк описывают ребра. Каждая из них содержит два целых числа \(l\) и \(r\) (\(1 \leq l \leq n\), \(n+1 \leq r \leq 2 \cdot n\)), разделенных пробелом, что указывает на наличие ребра из вершины \(l \in L\) в вершину \(r \in R\).

Выходные данные

Если граф \(G\), заданный на входе, не является хорошим, выведите в первой строке вывода одно слово «NO». Во второй строке вывода выведите число \(k\), а в третьей строке выведите \(k\) чисел \(l_1, l_2, \dots, l_k\), разделенные пробелами. Эти числа должны показать, что для множества \(S = \{l_1, l_2, \dots, l_k\}\) выполняется \(|S| > |N(S)|\).

Однако, если граф \(G\), заданный на входе, хороший, выведите одно слово «YES» в первой строке вывода. Во второй строке вывода выведите число \(m'\), обозначающее количество ребер в новом, также хорошем графе \(G'\). Затем, в следующих \(m'\) строках, выведите ребра графа \(G'\) в том же формате, что и во входных данных.

Примечание

В первом тестовом примере граф \(G\) хороший; таким образом, мы ищем эквивалентный граф с такими же строгими множествами. Единственный строгий набор — это \(\{ 1, 2, 3 \}\), который остается строгим в результирующем графе. Более того, никакое другое множество не является строгим в полученном графе. Можно доказать, что не существует графа с менее чем \(6\) ребрами и такими же строгимимножествами.

Во втором тестовом примере граф \(G\) не является хорошим. Множество \(\{ 2, 3 \}\) имеет только одного соседа — вершину \(6\). Таким образом, \(|\{ 2, 3 \}| > |\{ 6 \}|\), что доказывает, что входной граф не является хорошим.

A. Разрушитель

реализация сортировки *800

Джон — ведущий программист на эсминце, принадлежащем космическому флоту Конфедерации независимых операционных систем. Одна из его задач — проверять, не были ли повреждены электронные мозги роботов во время сражений.

Стандартный тест — приказать роботом сформировать один или несколько рядов, в каждом ряду роботы должна стоять друг за другом. После этого каждый робот доложит, сколько роботов стоит перед ним в его ряду.

Пример расположения роботов (начало рядов слева). Роботы докладывают числа, указанные над ними.

\(i\)-й робот доложил число \(l_i\). К сожалению, Джон не знает, в каком ряду стоит каждый из роботов, и не может проверить доложенные числа. Определите, существует ли расположение роботов такое, что все доложенные числа корректны, или такого расположения не существует.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно число \(n\) (\(1 \le n \le 100\)) — количество роботов.

Вторая строка каждого набора входных данных содержит \(n\) целых \(l_1, l_2, \ldots, l_n\) (\(0 \leq l_i < 100\)), \(l_i\) равно количеству роботов перед \(i\)-м роботом.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(200\).

Выходные данные

Для каждого набора входных данных выведите «YES», если существует расстановка роботов, соответствующая заявлениям роботов. В противном случае выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Пример расстановки, согласованной с утверждениями роботов из первого примера:

Пример расположения, согласованного с утверждениями роботов из второго примера, показан в условии.

В третьем входном наборе третий робот утверждает, что перед ним находятся две машины. В таком случае перед роботом, стоящим непосредственно перед ним, будет одна машина. Ни один робот не утверждает этого, поэтому нет правильного расположения.

F. Разбор на двоих

Бинарный поиск жадные алгоритмы реализация Структуры данных *2400

Только что закончилась Берлядская межвузовская олимпиада. Монокарп и Поликарп, как члены жюри, собираются провести разбор. К сожалению, время у них ограничено, так как надо закончить до церемонии закрытия.

В соревновании было \(n\) задач. Задачи пронумерованы от \(1\) до \(n\). Разбор \(i\)-й задачи занимает \(a_i\) минут. Монокарп и Поликарп планируют разобрать ровно \(k\) из них.

Разбор проходит следующим образом. Перед ними лежит весь проблемсет из \(n\) задач. Они убирают \(n - k\) из них, не изменяя порядок оставшихся \(k\) задач. Затем Монокарп забирает себе какой-то префикс из этих \(k\) задач (возможно, пустой или все задачи). Поликарп забирает себе оставшийся суффикс. После этого они идут в разные комнаты и проводят разборы для своих задач параллельно. Так что разбор занимает столько времени, сколько занимает более долгий из этих двух.

Пожалуйста, помогите Монокарпу и Поликарпу выбрать задачи и разделить их между собой так, чтобы разбор закончился как можно раньше. Выведите длительность разбора.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записаны два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 3 \cdot 10^5\)) — количество задач во всем проблемсете и количество задач, для которых Монокарп и Поликарп планируют провести разбор.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — время, которое занимает каждый разбор.

Сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — наименьшее время, которое может занять разбор, если Монокарп и Поликарп могут выбирать, какие \(k\) из \(n\) задач разбирать и как разделять их между собой.

A. Хороший массив

жадные алгоритмы математика реализация *800

Вам даны целые числа \(n\) и \(k\).

Назовем массив \(a_1, a_2, \ldots, a_n\) длины \(n\), состоящий из нулей и единиц, хорошим, если для всех целых \(i\) от \(1\) до \(n\) выполняются оба следующих условия:

  • среди первых \(i\) элементов \(a\) хотя бы \(\lceil \frac{i}{k} \rceil\) равны \(1\),
  • среди последних \(i\) элементов \(a\) хотя бы \(\lceil \frac{i}{k} \rceil\) равны \(1\).

Здесь \(\lceil \frac{i}{k} \rceil\) обозначает результат деления \(i\) на \(k\), округлённый вверх. Например, \(\lceil \frac{6}{3} \rceil = 2\), \(\lceil \frac{11}{5} \rceil = \lceil 2.2 \rceil = 3\) и \(\lceil \frac{7}{4} \rceil = \lceil 1.75 \rceil = 2\).

Найдите наименьшее возможное количество единиц в хорошем массиве.

Входные данные

В первой строке задано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке даны два целых числа \(n\), \(k\) (\(2 \le n \le 100\), \(1 \le k \le n\)) — длина массива и параметр \(k\) из условия.

Выходные данные

Для каждого набора входных данных выведите одно число — наименьшее возможное количество единиц в хорошем массиве.

Можно показать, что при данных ограничениях всегда существует хотя бы один хороший массив.

Примечание

В первом наборе входных данных \(n = 3\) и \(k = 2\):

  • Массив \([ \, 1, 0, 1 \, ]\) является хорошим и количество единиц в нём равно \(2\).
  • Массивы \([ \, 0, 0, 0 \, ]\), \([ \, 0, 1, 0 \, ]\) и \([ \, 0, 0, 1 \, ]\) не являются хорошими, так как для этих массивов при \(i=1\) не выполняется первое условие.
  • Массив \([ \, 1, 0, 0 \, ]\) не является хорошим, так как для него при \(i=1\) не выполняется второе условие.
  • Во всех остальных массивах длины \(3\) есть хотя бы \(2\) единицы.

Таким образом, ответ равен \(2\).

Во втором наборе входных данных \(n = 5\) и \(k = 2\):

  • Массив \([ \, 1, 1, 0, 0, 1 \, ]\) не является хорошим, так как для него при \(i=3\) не выполняется второе условие.
  • Массив \([ \, 1, 0, 1, 0, 1 \, ]\) является хорошим и количество единиц в нём равно \(3\).
  • Можно показать, что хорошего массива, содержащего меньше \(3\) единиц, не существует, поэтому ответ равен \(3\).

В третьем наборе входных данных \(n = 9\) и \(k = 3\):

  • Массив \([ \, 1, 0, 1, 0, 0, 0, 1, 0, 1 \, ]\) является хорошим и количество единиц в нём равно \(4\).
  • Можно показать, что хорошего массива, содержащего меньше \(4\) единиц, не существует, поэтому ответ равен \(4\).

В четвертом наборе входных данных \(n = 7\) и \(k = 1\). Существует единственный хороший массив \([ \, 1, 1, 1, 1, 1, 1, 1\, ]\), поэтому ответ равен \(7\).

A. Шифр шифер

реализация Строки *800

Есть строка \(a\) (она вам неизвестна), состоящая из латинских строчных букв, зашифрованная по следующему правилу в строку \(s\):

  • после каждого символа строки \(a\) дописывается произвольное (возможно, нулевое) количество любых латинских строчных букв, отличных от самого символа;
  • после каждого такого дописывания ставится тот символ, который мы дополняли.

Вам дана строка \(s\), выведите изначальную строку \(a\). Другими словами, вам нужно расшифровать строку \(s\).

Обратите внимание, что каждая зашифрованная таким образом строка расшифровывается единственным образом.

Входные данные

В первой строке входных данных содержится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

В первой строке набора содержится одно целое число \(n\) (\(2 \le n \le 100\)) — длина зашифрованного сообщения.

Во второй строке входных данных содержится одна строка \(s\) длины \(n\) — зашифрованное сообщение, полученное из некоторой строки \(a\).

Выходные данные

Для каждого запроса выведите в отдельной строке строку \(a\) — расшифрованное сообщение.

Примечание

В первом зашифрованном сообщении буква \(a\) зашифрована в виде \(aba\), и буква \(c\) зашифрована в виде \(cabac\).

Во втором зашифрованном сообщении всего одна буква \(q\) зашифрована в виде \(qzxcq\).

В третьем зашифрованном сообщении к каждой букве дописано нулевое количество символов.

E. Блокировка символов

реализация Структуры данных хэши *1600

Дано две строки равной длины \(s_1\) и \(s_2\), состоящие из строчных букв латинского алфавита, и натуральное число \(t\).

Вам необходимо ответить на \(q\) запросов, пронумерованных от \(1\) до \(q\). \(i\)-й запрос приходит в \(i\)-ю секунду времени. Каждый запрос одного из трёх типов:

  • заблокировать символы на позиции \(pos\) (индексация с \(1\)) в обеих строках на \(t\) секунд;
  • поменять местами два не заблокированных символа;
  • сказать, равны ли на момент запроса две строки без учёта заблокированных символов.

Заметьте, в запросах второго типа местами могут менять как символы, принадлежащие одной строке, так и символ из \(s_1\) с символом из \(s_2\).

Входные данные

В первой строке входных данных содержится одно целое число \(T\) (\(1 \le T \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

В первой строке набора содержится строка \(s_1\), состоящая из строчных букв латинского алфавита (длины не более \(2 \cdot 10^5\)).

Во второй строке набора содержится строка \(s_2\), состоящая из строчных букв латинского алфавита (длины не более \(2 \cdot 10^5\)).

Строки имеют равную длину.

В третьей строке набора содержатся два натуральных числа \(t\) и \(q\) (\(1 \le t, q \le 2 \cdot 10^5\)). Число \(t\) означает количество секунд, на которые блокируется символ. Число \(q\) соответствует количеству запросов.

В каждой из следующих \(q\) строк набора содержатся сами запросы — по одному в строке. Каждый запрос одного из трёх типов:

  • «\(1\ \ \ pos\)» — заблокировать символы на позиции \(pos\) в обеих строках на \(t\) секунд;
  • «\(2\ \ \ 1/\;\!2\ \ \ pos_1\ \ \ 1/\;\!2\ \ \ pos_2\)» — поменять местами два не заблокированных символа. Второе число в запросе указывает номер строки, из которой берётся первый символ для обмена. Третье число в запросе указывает позицию в строке этого символа. Четвёртое число в запросе указывает номер строки, из которой берётся второй символ для обмена. Пятое число в запросе указывает позицию в строке этого символа;
  • «\(3\)» — запрос равенства двух строк без учёта заблокированных символов.

Для запросов первого типа гарантируется, что на момент запроса символы на позиции \(pos\) не заблокированы.

Для запросов второго типа гарантируется, что меняющиеся местами символы не заблокированы.

Все значения \(pos, pos_1, pos_2\) лежат в диапазоне от \(1\) до длин строк.

Сумма значений \(q\) по всем наборам входных данных, а также суммарная длина строк \(s_1\) не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса третьего типа выведите «YES», если на момент запроса строки \(s_1\) и \(s_2\) равны без учёта заблокированных символов, «NO» — иначе.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Давайте посмотрим на строки \(s_1\) и \(s_2\) после каждого из \(q\) запросов. Будем обозначать красным цветом заблокированные символы.

Первый пример входных данных:

(\(codeforces\), \(codeblocks\)) \(\rightarrow\) (\(codeforces\), \(codeblocks\)) \(\rightarrow\) (\(code\color{red}{f}orces\), \(code\color{red}{b}locks\)) \(\rightarrow\) (\(code\color{red}{fo}rces\), \(code\color{red}{bl}ocks\)) \(\rightarrow\) (\(code\color{red}{for}ces\), \(code\color{red}{blo}cks\)) \(\rightarrow\) (\(code\color{red}{for}c\color{red}{e}s\), \(code\color{red}{blo}c\color{red}{k}s\)) \(\rightarrow\) (\(code\color{red}{for}c\color{red}{e}s\), \(code\color{red}{blo}c\color{red}{k}s\)) \(\rightarrow\) (\(codef\color{red}{or}c\color{red}{e}s\), \(codeb\color{red}{lo}c\color{red}{k}s\))

Второй пример входных данных:

(\(cool\), \(club\)) \(\rightarrow\) (\(cuol\), \(clob\)) \(\rightarrow\) (\(cuol\), \(cbol\)) \(\rightarrow\) (\(c\color{red}{u}ol\), \(c\color{red}{b}ol\)) \(\rightarrow\) (\(c\color{red}{u}ol\), \(c\color{red}{b}ol\)) \(\rightarrow\) (\(cuol\), \(cbol\))

B. Сохраняем массив красивым

реализация *1000

Массив \([a_1, a_2, \dots, a_k]\) называется красивым, если можно удалить несколько (возможно, ноль) элементов из начала массива и вставить все эти элементы в конец массива в том же порядке таким образом, чтобы получившийся массив был отсортирован в неубывающем порядке.

Другими словами, массив \([a_1, a_2, \dots, a_k]\) является красивым, если существует целое число \(i \in [0, k-1]\), такое что массив \([a_{i+1}, a_{i+2}, \dots, a_{k-1}, a_k, a_1, a_2, \dots, a_i]\) отсортирован в неубывающем порядке.

Например:

  • \([3, 7, 7, 9, 2, 3]\) является красивым: мы можем удалить первые четыре элемента и вставить их в конец в том же порядке, и мы получим массив \([2, 3, 3, 7, 7, 9]\), который отсортирован в неубывающем порядке;
  • \([1, 2, 3, 4, 5]\) является красивым: мы можем не удалять ни одного элемента и вставить их в конец, и мы получим массив \([1, 2, 3, 4, 5]\), который отсортирован в неубывающем порядке;
  • \([5, 2, 2, 1]\) не является красивым.

Обратите внимание, что любой массив, состоящий из нуля или одного элемента, является красивым.

Дан пустой массив \(a\). Вам нужно обработать \(q\) запросов к нему. Во время \(i\)-го запроса вам будет дано одно целое число \(x_i\), и вы должны сделать следующее:

  • если вы можете добавить \(x_i\) в конец массива \(a\) так, чтобы массив \(a\) оставался красивым, вы должны добавить его;
  • в противном случае вы не должны делать ничего.

После каждого запроса сообщите, добавили вы число \(x_i\) в массив или нет.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк. Первая строка содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов. Вторая строка содержит \(q\) целых чисел \(x_1, x_2, \dots, x_q\) (\(0 \le x_i \le 10^9\)).

Дополнительное ограничение на входные данные: сумма \(q\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, состоящую из ровно \(q\) символов. \(i\)-й символ строки должен быть 1, если вы добавили число в массив во время \(i\)-го запроса; в противном случае он должен быть 0.

Примечание

Рассмотрим первый набор входных данных из примера. Изначально массив пустой: \([]\).

  • пытаемся приписать \(3\). Массив \([3]\) является красивым, поэтому мы добавляем \(3\);
  • пытаемся приписать \(7\). Массив \([3, 7]\) является красивым, поэтому мы добавляем \(7\);
  • пытаемся приписать \(7\). Массив \([3, 7, 7]\) является красивым, поэтому мы добавляем \(7\);
  • пытаемся приписать \(9\). Массив \([3, 7, 7, 9]\) является красивым, поэтому мы добавляем \(9\);
  • пытаемся приписать \(2\). Массив \([3, 7, 7, 9, 2]\) является красивым, поэтому мы добавляем \(2\);
  • пытаемся приписать \(4\). Массив \([3, 7, 7, 9, 2, 4]\) не является красивым, поэтому мы не добавляем \(4\);
  • пытаемся приписать \(6\). Массив \([3, 7, 7, 9, 2, 6]\) не является красивым, поэтому мы не добавляем \(6\);
  • пытаемся приписать \(3\). Массив \([3, 7, 7, 9, 2, 3]\) является красивым, поэтому мы добавляем \(3\);
  • пытаемся приписать \(4\). Массив \([3, 7, 7, 9, 2, 3, 4]\) не является красивым, поэтому мы не добавляем \(4\).

C. Частицы

дп жадные алгоритмы математика реализация *1300

Вы нашли \(n\) волшебных частиц, которые расположены друг за другом в ряд и имеют целочисленные заряды \(c_1,\dots,c_n\). У вас также есть устройство, которое позволяет производить следующую операцию:

  • Выбрать частицу и удалить её из последовательности. Оставшиеся частицы сдвинутся, чтобы заполнить образовавшийся разрыв между ними. Если перед удалением частицы непосредственно слева и непосредственно справа от неё были расположены частицы с зарядами \(x\) и \(y\) соответственно, то они войдут в реакцию и объединятся в одну частицу с зарядом \(x+y\).

Например, если последовательность зарядов частиц была \([-3,1,4,-1,5,-9]\), то после выполнения операции над \(4\)-й частицей последовательность преобразуется в \([-3,1,9,-9]\).

Если после этого использовать устройство на \(1\)-й частице в этом новом порядке, то последовательность станет равна \([1,9,-9]\).

Вам нужно выполнять операции до тех пор, пока в последовательности не останется ровно одна частица. Чему равен максимально возможный заряд этой частицы?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(c_1,\dots,c_n\) (\(-10^9 \le c_i \le 10^9\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число, равное максимально возможному заряду последней оставшейся частицы.

Примечание

В первом наборе входных данных оптимальная стратегия выглядит так: использовать устройство на \(4\)-й частице, затем на \(1\)-й (как описано в условии), потом на \(3\)-й, и наконец на \(1\)-й.

Во втором наборе входных данных оптимальная стратегия выглядит так: использовать устройство на \(4\)-й частице, после чего последовательность преобразуется в \([998244353,998244353,1996488706]\), затем на \(2\)-й частице, после чего последовательность станет равна \([2994733059]\). Проследите за переполнением целочисленного типа.

В третьем наборе входных данных есть всего одна частица, так что операций применять нельзя.

G. Дерево с весами

битмаски Деревья Конструктив математика матрицы поиск в глубину и подобное реализация Структуры данных теория чисел *3000

Дано дерево на \(n\) вершинах, пронумерованных числами \(1,2,\dots,n\). \(i\)-е ребро соединяет вершины \(u_i\) и \(v_i\) и имеет некоторый неизвестный целый положительный вес \(w_i\). Вам также известны расстояния \(d_i\) между вершинами \(i\) и \(i+1\) для всех \(1 \le i \le n-1\) (это расстояние равно сумме весов рёбер на простом пути между вершинами дерева \(i\) и \(i+1\)).

Найдите вес каждого ребра. Если существует несколько решений, выведите любое из них. Если не существует весов \(w_i\), согласующихся со всеми данными, выведите одно целое число \(-1\).

Входные данные

Первая строка содержит целое число \(n\) (\(2 \le n \le 10^5\)).

В \(i\)-й из следующих \(n-1\) строк содержатся по два числа: \(u_i\) и \(v_i\) (\(1 \le u_i,v_i \le n\), \(u_i \ne v_i\)).

В последней строке содержится \(n-1\) целых чисел \(d_1,\dots,d_{n-1}\) (\(1 \le d_i \le 10^{12}\)).

Гарантируется, что заданные ребра образуют дерево.

Выходные данные

Если решения не существует, выведите одно целое число \(-1\). В противном случае выведите \(n-1\) строку, содержащую веса \(w_1,\dots,w_{n-1}\).

Если существует несколько решений, выведите любое из них.

Примечание

В первом примере дерево выглядит следующим образом:

Во втором примере вес \(w_2\) не может быть равен \(0\), поскольку должен быть целым положительным числом. Поэтому решения нет.

В третьем примере дерево выглядит следующим образом:

A. Запрещенное число

Конструктив математика реализация теория чисел *800

Дано целое число \(n\), которое вы хотите получить. У вас есть бесконечный запас каждого целого числа от \(1\) до \(k\), кроме числа \(x\) (числа \(x\) нет ни одной штуки).

Разрешается взять произвольное количество каждого из этих чисел (возможно, ноль). Можете ли вы сделать так, чтобы сумма взятых чисел была равна \(n\)?

Если существует несколько ответов, то выведите любой из них.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В единственной строке каждого набора входных данных записаны три целых числа \(n, k\) и \(x\) (\(1 \le x \le k \le n \le 100\)).

Выходные данные

На каждый набор входных данных в первой строке выведите «YES» или «NO» — можете ли вы взять произвольное количество каждого из чисел от \(1\) до \(k\), кроме \(x\), так, чтобы их сумма была равна \(n\).

Если можете, то во второй строке должно быть записано одно целое число \(m\) — суммарное количество взятых чисел. В третьей строке должны быть записаны \(m\) целых чисел — каждое от \(1\) до \(k\), не равно \(x\), а их сумма равна \(n\).

Если существует несколько ответов, то выведите любой из них.

Примечание

Другой возможный ответ на первый набор входных данный — это \([3, 3, 3, 1]\). Обратите внимание, что не требуется минимизировать количество взятых чисел. Существуют и другие ответы.

Во втором наборе у вас есть только бесконечный запас чисел \(2\). Невозможно собрать сумму \(5\) только из них.

В пятом наборе вообще нет доступных чисел, поэтому невозможно собрать никакую положительную сумму.

B. Идем вместе

геометрия математика реализация *900

Боб и Кэрол провели целый день вместе с Алисой, но пришла пора идти домой. Алиса, Боб и Кэрол живут на бесконечной двумерной плоскости в клетках \(A\), \(B\) и \(C\) соответственно. Сейчас все трое находятся в клетке \(A\).

Если Боб (или Кэрол) находится в некоторой клетке, то он (она) может переместиться в одну из ее соседних клеток. Две клетки называются соседними, если они имеют общую сторону. Например, у клетки \((3, 5)\) есть четыре соседние клетки: \((2, 5)\), \((4, 5)\), \((3, 6)\) и \((3, 4)\).

Боб хочет вернуться в клетку \(B\), Кэрол — в клетку \(C\). Каждый из них хочет вернуться домой по кратчайшему пути, т. е. по пути, который состоит из наименьшего возможного количества клеток. Но также они хотели бы идти вместе.

Какое наибольшее возможное количество клеток Боб и Кэрол смогут пройти вместе, если каждых из них идет домой по одному из кратчайших путей?

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных заданы два целых числа \(x_A\) и \(y_A\) (\(1 \le x_A, y_A \le 10^8\)) — позиция клетки \(A\), где сейчас находятся Боб и Кэрол.

Во второй строке каждого набора заданы два целых числа \(x_B\) и \(y_B\) (\(1 \le x_B, y_B \le 10^8\)) — позиция клетки \(B\) (дом Боба).

В третьей строке каждого набора заданы два целых числа \(x_C\) и \(y_C\) (\(1 \le x_C, y_C \le 10^8\)) — позиция клетки \(C\) (дом Кэрол).

Дополнительное ограничение на входные данные: в пределах одного набора клетки \(A\), \(B\) \(C\) — попарно различные.

Выходные данные

Для каждого набора входных данных, выведите одно целое число — максимально возможное количество клеток, которые Боб и Кэрол могут пройти вместе, если каждый из них идет домой по одному из кратчайших путей.

Примечание

Во всех картинках, красным обозначены клетки, лежащие только на пути Боба; светло-синим — клетки на пути только Кэрол, а темно-синим — общие для Боба и Кэрол клетки.

Один из оптимальных ответов для первого набора входных данных изображен ниже:

Путь Боба состоит из \(5\) клеток, путь Кэрол — из \(7\) клеток, и они пройдут \(3\) клетки вместе.

Оптимальный ответ для второго набора изоборажен ниже:

Путь Боба состоит из \(4\) клеток, путь Кэрол — из \(3\) клеток, и они пройдут вместе только \(1\) клетку.

Один из оптимальных ответов для третьего набора изображен ниже:

Путь Боба состоит из \(6\) клеток, путь Кэрол — из \(9\) клеток, и они пройдут \(6\) клеток вместе.

E. Коробки и шары

дп математика реализация *2500

В ряд расставлены \(n\) коробок. Коробки пронумерованы от \(1\) до \(n\). В некоторых коробках лежит по одному шару, остальные пустые. Хотя бы в одной коробке есть шар и хотя бы одна коробка пустая.

За один ход вы обязаны выбрать коробку с шаром и соседнюю с ней пустую коробку и переложить шар из одной коробки в другую. Коробки \(i\) и \(i+1\) для всех \(i\) от \(1\) до \(n-1\) считаются соседними друг с другом. Коробки \(1\) и \(n\) не соседние.

Сколько различных расположений шаров может быть после совершения ровно \(k\) ходов? Два расположения называются различными, если есть хотя бы одна такая коробка, что в одном из них в ней есть шар, а в другом нет.

Так как ответ может быть достаточно большой, выведите его остаток от деления на \(10^9+7\).

Входные данные

В первой строке записаны два целых числа \(n\) и \(k\) (\(2 \le n \le 1500\); \(1 \le k \le 1500\)) — количество коробок и количество ходов.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(a_i \in \{0, 1\}\)) — \(0\) обозначает пустую коробку, \(1\) обозначает коробку с шаром. В последовательности есть хотя бы один \(0\) и хотя бы одна \(1\).

Выходные данные

Выведите одно целое число — количество возможных различных расположений шаров после совершения ровно \(k\) ходов, по модулю \(10^9+7\).

Примечание

В первом примере есть следующие возможные расположения:

  • 0 1 1 0 — получается после перемещения шара из коробки \(1\) в коробку \(2\);
  • 1 0 0 1 — получается после перемещения шара из коробки \(3\) в коробку \(4\);
  • 1 1 0 0 — получается после перемещения шара из коробки \(3\) в коробку \(2\).

Во втором примере есть следующие возможные расположения:

  • 1 0 1 0 — три способа получить ее: просто верните обратно шар после первой операции;
  • 0 1 0 1 — получается из любого из первых двух расположений после первого хода.

A. Рудольф и перерезание верёвки

математика реализация *800

В стену вбито \(n\) гвоздей, \(i\)-й гвоздь вбит в \(a_i\) метрах над землёй, к нему привязан один конец верёвки длины \(b_i\) метров. Все гвозди вбиты на разных высотах друг над другом. Один леденец привязан сразу ко всем веревкам. Леденец привязан к концу веревки, который не привязан к гвоздю.

Чтобы взять леденец его нужно опустить на землю. Для этого Рудольф может перерезать некоторые верёвки, по одной за раз. Помогите Рудольфу найти минимальное количество верёвок, которое необходимо перерезать, чтобы получить леденец.

На рисунке изображен пример первого теста:

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 50\)) — количество гвоздей.

В \(i\)-й из следующий \(n\) строк записаны два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 200\)) — высота \(i\)-го гвоздя и длина привязанной к нему веревки, все \(a_i\) различны.

Гарантируется, что данные непротиворечивы, то есть по ним можно построить описанную в условии конфигурацию.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество веревок, которые нужно разрезать, чтобы леденец упал на землю.

B. Рудольф и крестики-нолики-плюсики

Перебор реализация Строки *800

Рудольф изобрел игру крестики-нолики на троих. Она имеет классические правила, не считая третьего игрока, играющего плюсиками. У Рудольфа есть поле \(3 \times 3\) — результат завершенной игры. Каждая ячейка поля содержит либо крестик, либо нолик, либо плюсик, либо ничего. В игре побеждает игрок, сделавший горизонтальный, вертикальный или диагональный ряд из \(3\)-х своих символов.

Рудольф хочет узнать результат игры. Либо ровно один из трех игроков выиграл, либо игра закончилась вничью. Гарантируется, что несколько игроков не могут победить одновременно.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из трех строк, каждая из которых состоит из трех символов. Символ может быть одним из четырех: «X» означает крестик, «O» означает нолик, «+» означает плюсик, «.» означает пустую ячейку.

Выходные данные

Для каждого набора входных данных выведите строку «X», если победили крестики, «O», если победили нолики, «+», если победили плюсики, «DRAW», если была ничья.

E1. Рудольф и снежинки (простая версия)

математика Перебор реализация *1300

Это простая версия задачи. Единственное отличие в том, что в этой версии \(n \le 10^6\).

Однажды зимним утром Рудольф задумчиво смотрел в окно и наблюдал за падающими снежинками. Он очень быстро заметил некоторую симметрию в конфигурации снежинок. И как истинный математик, Рудольф придумал математическую модель снежинки.

Он определил снежинку как неориентированный граф, строящийся по следующим правилам:

  • Изначально в графе одна единственная вершина.
  • Далее в граф добавляются ещё вершины. Исходная вершина соединяется ребрами с ещё \(k\) новыми вершинами (\(k > 1\)).
  • Каждая из вершин, соединённая только с одной другой вершиной, соединяется ребрами с ещё \(k\) новыми вершинами. Этот шаг нужно выполнить хотя бы один раз.

Минимальная снежинка для \(k = 4\) приведена на рисунке.

После некоторых математических изысканий Рудольф понял, что такие снежинки могут иметь далеко не любое число вершин. Помогите Рудольфу проверить, может ли существовать снежинка с \(n\) вершинами.

Входные данные

В первой строке входных данных содержится целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

В первой строке набора содержится целое число \(n\) (\(1 \le n \le 10^6\)) — количество вершин, для которого нужно проверить существование снежинки.

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор — «YES», если существует такое \(k > 1\), для которого можно построить снежинку с заданным количеством вершин; «NO» в противном случае.

E2. Рудольф и снежинки (сложная версия)

Бинарный поиск математика Перебор реализация *1800

Это сложная версия задачи. Единственное отличие в том, что в этой версии \(n \le 10^{18}\).

Однажды зимним утром Рудольф задумчиво смотрел в окно и наблюдал за падающими снежинками. Он очень быстро заметил некоторую симметрию в конфигурации снежинок. И как истинный математик, Рудольф придумал математическую модель снежинки.

Он определил снежинку как неориентированный граф, строящийся по следующим правилам:

  • Изначально в графе одна единственная вершина.
  • Далее в граф добавляются ещё вершины. Исходная вершина соединяется ребрами с ещё \(k\) новыми вершинами (\(k > 1\)).
  • Каждая из вершин, соединённая только с одной другой вершиной, соединяется ребрами с ещё \(k\) новыми вершинами. Этот шаг нужно выполнить хотя бы один раз.

Минимальная снежинка для \(k = 4\) приведена на рисунке.

После некоторых математических изысканий Рудольф понял, что такие снежинки могут иметь далеко не любое число вершин. Помогите Рудольфу проверить, может ли существовать снежинка с \(n\) вершинами.

Входные данные

В первой строке входных данных содержится целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

В первой строке набора содержится целое число \(n\) (\(1 \le n \le 10^{18}\)) — количество вершин, для которого нужно проверить существование снежинки.

Выходные данные

Выведите \(t\) строк, каждая из которых является ответом на соответствующий набор — «YES», если существует такое \(k > 1\), для которого можно построить снежинку с заданным количеством вершин; «NO» в противном случае.

F. Рудольф и мимик

интерактив Конструктив реализация *1800

Это интерактивная задача.

Рудольф — ученый, изучающий инопланетную форму жизни. Перед Рудольфом находится комната, в которой раскидано \(n\) различных объектов. Среди объектов есть ровно одно поразительное существо — мимик, умеющий превращаться в любой объект. Он уже замаскировался в этой комнате и Рудольфу нужно найти его при помощи эксперимента.

Эксперимент проходит в несколько этапов. На каждом этапе происходит следующее:

  • Сначала Рудольф осматривает все объекты в комнате и записывает их типы. Тип каждого объекта обозначается цифрой, может быть несколько объектов одного типа.
  • После осмотра Рудольф может указать на объект, который по его мнению является мимиком. После этого эксперимент завершается. У Рудольфа есть только одна попытка, поэтому, если он не уверен в положении мимика, он вместо этого выполняет следующий пункт.
  • Рудольф может убрать любое количество объектов из комнаты(возможно ноль). Затем Рудольф выходит из комнаты и в это время все объекты, включая мимика, перемешиваются между собой, меняется их порядок, а мимик может превратиться в любой другой объект(даже в тот, которого нет в комнате).
  • После этого Рудольф возвращается в комнату и повторяет этап. Мимик может не изменять свой вид, но он не может оставаться тем же объектом больше двух этапов подряд.

Задача Рудольфа обнаружить мимика не более чем за пять этапов.

Входные данные

Первая строка содержит одно целое число \(t\) \((1 \le t \le 1000)\) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) \((2 \le n \le 200)\) — количество объектов в комнате.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1\),\(a_2\),...,\(a_n\) \((1 \le a_i \le 9)\) — типы объектов.

Протокол взаимодействия

После того, как вы считали описание набора входных данных, вы должны сделать не более чем \(5\) запросов. Считывание входных данных считается началом первого этапа, и мимик уже может начать изменяться.

Запрос является строкой. Первый символ строки означает тип запроса. Чтобы удалить объекты, выведите символ «-». После этого выведите число \(k\) — сколько объектов вы хотите убрать. После идут \(k\) чисел — номера объектов в их текущем расположении. Индексация начинается с единицы. Вы можете удалить мимика, но в таком случае вы не сможете указать на него и получите вердикт «Неправильный ответ».

В ответ на запрос придет строка, содержащая целые числа — оставшиеся в комнате объекты после удаления и перемешивания.

Чтобы указать положение мимика выведите символ «!», после этого выведите номер объекта, который является мимиком.

Задача будет считаться решенной, если положение мимика указано верно.

Если вы сделаете больше пяти запросов или сделаете некорректный запрос, решение получит вердикт «Неправильный ответ».

После вывода запроса или ответа не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Для взлома используйте следующий формат.

Первая строка содержит одно целое число \(t\) \((1 \le t \le 1000)\) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\), \(k\) (\(2 \le n \le 200, 1 \le k \le n\)) — количество объектов и позиция мимика.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1\), \(a_2\),...,\(a_n\) (\(1 \le a_i \le 9\)) — изначальный массив объектов.

Примечание

Пояснение к первому тесту: изначальный массив \(x_1\), \(x_2\), \(x_3\), \(x_4\), \(x_5\). Мимик находится на первой позиции.

  • Удаляем пятый объект. После этого позиция перемешиваются, и мимик выбрал не менять свой вид. Позиции объектов становятся \(x_4\), \(x_1\), \(x_2\), \(x_3\).
  • Удаляем третий объект. Мимик вынужден превратится в другой объект, потому что он уже два этапа находился в виде \(1\). Мимик выбрал превратиться в \(2\), объекты перемешиваются и становятся \(x_3\), \(x_4\), \(x_1\).
  • Удаляем первый и второй объекты. Позиции объектов становятся \(x_1\). Остается только мимик, и он остается объектом \(2\).
  • Указываем на первый объект.

D. Профессор Хигасиката

жадные алгоритмы реализация снм Строки Структуры данных *1900

Джосуке устал от спокойной жизни в Мориохе. Пойдя по стопам своего племянника Дзётаро, он решает упорно учиться и стать профессором информатики. Просматривая в Интернете задачи по программированию, он наткнулся на следующую.

Пусть \(s\) — бинарная строка длины \(n\). Операция над \(s\) определяется как выбор двух различных целых чисел \(i\) и \(j\) (\(1 \leq i < j \leq n\)), и обмен местами символов \(s_i, s_j\).

Рассмотрим \(m\) строк \(t_1, t_2, \ldots, t_m\), где \(t_i\) — подстрока\(^\dagger\) из \(s\) от \(l_i\) до \(r_i\). Определим \(t(s) = t_1+t_2+\ldots+t_m\) как конкатенацию строк \(t_i\) в таком порядке.

Существует \(q\) обновлений строки. В \(i\)-м обновлении \(s_{x_i}\) инвертируется. То есть, если \(s_{x_i}=1\), то \(s_{x_i}\) становится \(0\) и наоборот. После каждого обновления найдите минимальное количество операций, которые нужно выполнить над \(s\), чтобы сделать \(t(s)\) лексикографически как можно большим\(^\ddagger\).

Обратите внимание, что на самом деле ни одна операция не применяется. Нужно найти только количество операций.

Помогите Йосуке в его мечте, решив за него эту задачу.

——————————————————————

\(\dagger\) Строка \(a\) является подстрокой строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, нуля или всех) символов из начала и нескольких (возможно, нуля или всех) символов из конца.

\(\ddagger\) Строка \(a\) лексикографически больше строки \(b\) такой же длины тогда и только тогда, когда выполняется следующее условие:

  • в первой позиции, где \(a\) и \(b\) отличаются, в строка \(a\) стоит \(1\), а в строке \(b\) стоит \(0\).
Входные данные

Первая строка содержит три целых числа \(n\), \(m\), \(q\) (\(1 \leq n,m,q \leq 2 \cdot 10^5\)).

Вторая строка содержит бинарную строку \(s\) длины \(n\), состоящую только из цифр \(0\) и \(1\).

В \(i\)-й среди следующих \(m\) строк содержатся два целых числа \(l_i\) и \(r_i\) (\(1 \leq l_i \leq r_i \leq n\)).

В \(i\)-й среди следующих \(q\) строк содержится одно целое число \(x_i\) (\(1 \leq x_i \leq n\)).

Выходные данные

Выведите \(q\) целых чисел. В строке \(i\) выведите минимальное количество операций, которое необходимо выполнить над \(s\), чтобы получить лексикографически наибольшую возможную строку \(t(s)\) после \(i\)-го обновления.

Примечание

В первом примере:

Изначально \(t(s) = s(1,2) + s(1,2) = 0101\).

После \(1\)-го запроса, \(s\) становится \(11\) и, соответственно, \(t\) становится \(1111\). Никаких операций выполнять не нужно, так как \(t(s)\) уже является лексикографически наибольшей строкой из возможных.

После \(2\)-го запроса \(s\) становится \(01\) и, следовательно, \(t\) становится \(0101\). Необходимо выполнить операцию \(1\), поменяв местами \(s_1\) и \(s_2\). Следовательно, \(t(s)\) становится \(1010\), что является лексикографически наибольшей строкой, которую можно получить.

E. Платиновый треугольник?

интерактив Комбинаторика математика Перебор реализация Теория вероятностей *2900

Это интерактивная задача.

Made in Heaven — довольно любопытный стенд. Конечно, это (возможно) самый сильный Стенд из всех существующих, но он также является ярым любителем головоломок. Например, недавно он задал Qtaro следующую задачу:

Made in Heaven имеет \(n\) скрытых целых чисел \(a_1, a_2, \dots, a_n\) (\(3 \le n \le 5000\), \(1 \le a_i \le 4\)). Qtaro должен определить все \(a_i\), задав Made in Heaven несколько вопросов следующего вида:

  • В одном запросе Qtaro разрешается дать Made in Heaven три различных индекса \(i\), \(j\) и \(k\) (\(1 \leq i, j, k \leq n\)).
  • Если \(a_i, a_j, a_k\) образуют стороны невырожденного треугольника \(^\dagger\), Made in Heaven выдаст площадь этого треугольника.
  • В противном случае, Made in Heaven ответит \(0\).

Задав не более \(5500\) таких вопросов, Qtaro должен либо сказать Made in Heaven все значения \(a_i\), либо сообщить, что нет возможности однозначно определить их.

К сожалению, из-за перезагрузки вселенной, Qtaro не так умен, как Jotaro. Пожалуйста, помогите Qtaro решить задачу Made In Heaven.

——————————————————————

\(^\dagger\) Три целых положительных числа \(a, b, c\) образуют стороны невырожденного треугольника тогда и только тогда, когда выполняются все следующие три неравенства:

  • \(a+b > c\),
  • \(b+c > a\),
  • \(c+a > b\).
Протокол взаимодействия

Взаимодействие начинается с чтения \(n\) (\(3 \le n \le 5000\)) — количества скрытых целых чисел.

Чтобы задать вопрос, соответствующий тройке \((i, j, k)\) (\(1 \leq i < j < k \leq n\)), выведите «? \(i\) \(j\) \(k\)» без кавычек. После этого вы должны прочитать одно целое число \(s\).

  • Если \(s = 0\), то \(a_i\), \(a_j\) и \(a_k\) не являются сторонами невырожденного треугольника.
  • Иначе, \(s = 16 \Delta^2\), где \(\Delta\) — площадь треугольника. Площадь предоставляется в таком формате для удобства, чтобы вам нужно было вводить только целые числа.

Если числа \(a_i\) не могут быть однозначно определены, выведите «! \(-1\)» без кавычек. Иначе, если вы определили все значения \(a_i\), выведите «! \(a_1\) \(a_2\) \(\dots\) \(a_n\)» в одну строку.

Интерактор неадаптивный. Скрытый массив \(a_1, a_2, \dots, a_n\) фиксируется заранее и не изменяется в процессе взаимодействия.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Взломы

Для взлома используйте следующий формат.

Первая строка содержат одно целое число \(n\) (\(3 \le n \le 5000\))  – количество скрытых целых чисел.

Вторая строка содержат \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 4\))  – скрытый массив.

Примечание

В первом примере процесс взаимодействия происходит следующим образом:

StdinStdoutОбъяснение
3Прочитаем \(n = 3\). Существует \(3\) скрытых целых чисел
? 1 2 3Попросим найти площадь, образованную \(a_1\), \(a_2\) и \(a_3\)
63Получено \(16\Delta^2 = 63\). Значит, площадь \(\Delta = \sqrt{\frac{63}{16}} \approx 1.984313\)
! -1Ответим, что не существует однозначного массива, удовлетворяющего запросам.

Из полученной площади можно сделать вывод, что числа, образующие треугольник, либо (\(4\), \(4\), \(1\)), либо (\(3\), \(2\), \(2\)) (в определенном порядке). Поскольку существует несколько массивов чисел, удовлетворяющих запросам, уникальный ответ не может быть найден.

Во втором примере процесс взаимодействия происходит следующим образом:

ШагStdinStdoutОбъяснение
16Прочитаем \(n = 6\). Значит, есть \(6\) скрытых чисел
2? 1 2 3Спросим площадь треугольника, образованного \(a_1\), \(a_2\) и \(a_3\)
30Они не образуют невырожденный треугольник
4? 2 3 4Спросим площадь треугольника, образованного \(a_2\), \(a_3\) и \(a_4\)
50Они не образуют невырожденный треугольник
6? 4 5 6Спросим площадь треугольника, образованного \(a_4\), \(a_5\) и \(a_6\)
70Они не образуют невырожденный треугольник
8? 1 5 6Спросим площадь треугольника, образованного \(a_1\), \(a_5\) и \(a_6\)
963Получим \(16\Delta^2 = 63\). Тогда площадь \(\Delta = \sqrt{\frac{63}{16}} \approx 1.984313\)
10? 3 5 6Спросим площадь треугольника, образованного \(a_3\), \(a_5\) и \(a_6\)
1115Получим \(16\Delta^2 = 15\). Тогда площадь \(\Delta = \sqrt{\frac{15}{16}} \approx 0.968245\)
12? 1 2 4Спросим площадь треугольника, образованного \(a_3\), \(a_5\) и \(a_6\)
13135Получим \(16\Delta^2 = 135\). Тогда площадь \(\Delta = \sqrt{\frac{135}{16}} \approx 2.904738\)
14! 3 2 1 4 2 2Однозначный ответ найден, и он равен \(a = [3, 2, 1, 4, 2, 2]\).

Из шагов \(10\) и \(11\) мы можем сделать вывод, что мультимножество \(\left\{a_3, a_5, a_6\right\}\) должно равняться \(\left\{2, 2, 1\right\}\).

Из шагов \(8\) и \(9\), мультимножество \(\left\{a_1, a_5, a_6\right\}\) должно быть либо \(\left\{4, 4, 1\right\}\), либо \(\left\{3, 2, 2\right\}\).

Так как \(\left\{a_3, a_5, a_6\right\}\) и \(\left\{a_1, a_5, a_6\right\}\) пересекаются по \(a_5\) и \(a_6\), делаем вывод, что \(a_5 = a_6 = 2\), а также \(a_1 = 3\), \(a_3 = 1\).

Из шагов \(6\) и \(7\) известно, что \(a_5 = a_6 = 2\), а \(a_4\), \(a_5\) и \(a_6\) не могут образовать невырожденный треугольник, следовательно, \(a_4 = 4\).

При всей известной информации, только \(a_2 = 2\) удовлетворяет запросам, сделанным на шагах \(2\), \(3\), \(4\), \(5\), \(12\) и \(13\).

В третьем примере один массив, удовлетворяющий запросам, — \([1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\).

B. Вика и мостик

Бинарный поиск жадные алгоритмы математика реализация сортировки Структуры данных *1200

Летом Вика любит бывать на даче. Там есть всё для отдыха: удобные качели, велосипеды и речка.

Через речку прокинут деревянный мостик, состоящий из \(n\) дощечек. Он уже довольно старый и неказистый, поэтому Вика решила его покрасить. Да и в сарае как раз нашлись банки с краской \(k\) цветов.

Покрасив каждую дощечку в один из \(k\) цветов, Вика уже хотела пойти качаться на качелях, чтобы отдохнуть от работы. Однако поняла, что дом находится на другой стороне речки, а краска ещё не полностью засохла и ходить по мостику пока нельзя.

Чтобы не портить внешний вид мостика, Вика решила, что всё же пройдёт по нему, но наступая только на дощечки одного цвета. Так как иначе небольшой слой краски на её подошве испортит дощечку другого цвета. У девушки также осталось немного краски, но её хватит на перекрашивание лишь одной дощечки мостика.

Сейчас Вика стоит на земле перед первой дощечкой. Чтобы пройти по мостику, она выберет некоторые дощечки одинакового цвета (после перекрашивания), которые имеют номера \(1 \le i_1 < i_2 < \ldots < i_m \le n\) (дощечки нумеруются с \(1\) слева направо). Тогда Вике придётся переступить \(i_1 - 1, i_2 - i_1 - 1, i_3 - i_2 - 1, \ldots, i_m - i_{m-1} - 1, n - i_m\) дощечек в результате каждого из \(m + 1\) шагов.

Так как Вика боится упасть, она не хочет делать слишком длинные шаги. Помогите ей и скажите минимально возможное максимальное количество дощечек, через которые ей придётся переступить за один шаг, если в процессе перехода по мостику она может перекрасить одну (или ноль) дощечек в другой цвет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержатся два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)) — количество дощечек в мостике и количество различных цветов краски.

Во второй строке каждого набора входных данных содержится \(n\) целых чисел \(c_1, c_2, c_3, \dots, c_n\) (\(1 \le c_i \le k\)) — цвета, в которые Вика покрасила дощечки мостика.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное число — минимально возможное максимальное количество дощечек, через которое придётся переступить Вике за один шаг.

Примечание

В первом наборе входных данных Вика может перекрасить дощечку посередине в цвет \(1\) и пройти через мостик, не переступая через дощечки.

Во втором наборе входных данных Вика может перекрасить дощечку посередине в цвет \(2\) и пройти через мостик, каждый раз переступая через одну дощечку.

В третьем наборе входных данных Вика может перекрасить предпоследнюю дощечку в цвет \(2\) и пройти по мостику, наступая только на дощечки с номерами \(2\) и \(5\). Тогда Вике придётся переступить \(1\), \(2\) и \(1\) дощечку при каждом шаге, поэтому ответ равен \(2\).

В четвёртом наборе входных данных Вика может вовсе не перекрашивать мостик и пройти по нему, каждый раз переступая через две дощечки, идя по дощечкам цвета \(3\).

В пятом наборе входных данных Вика может вовсе не перекрашивать мостик и пройти по нему, не переступая через дощечки.

E. Вика и блинчики

математика Перебор реализация теория чисел *2600

В родном городе Вики, Владивостоке, очень красивое море.

Часто можно видеть ребят, запускающих «блинчики» или «лягушки». Так называется процесс кидания камня в море под небольшим углом, отчего он далеко летит и несколько раз отскакивает от водной глади.

Вика много раз запускала «блинчики» и знает, что если кинуть камень от берега перпендикулярно береговой линии с силой \(f\), то он сперва коснётся воды на расстоянии \(f\) от берега, затем оттолкнётся и вновь коснётся воды на расстоянии \(f - 1\) от предыдущей точки касания. Так камешек будет лететь по прямой, всё сокращая расстояния между точками, в которых он касается воды, пока не упадёт в море.

Формально, точки в которых камень соприкоснётся с водной гладью будут иметь следующие координаты: \(f\), \(f + (f - 1)\), \(f + (f - 1) + (f - 2)\), ... , \(f + (f - 1) + (f - 2) + \ldots + 1\) (если считать, что \(0\) — координата береговой линии).

Как-то раз прогуливаясь вечером по набережной Владивостока, Вика увидела, как группа ребят запускала «блинчики» в море с одной и той же точки с разными силами.

Ей стало интересно, какое максимальное количество ребят могут запустить камешек со своей силой \(f_i\), так чтобы все \(f_i\) были различными целыми положительными числами, и при этом все \(n\) камешков в процессе полёта коснулись воды в точке с координатой \(x\) (если считать, что \(0\) — координата береговой линии).

Немного подумав, Вика ответила на свой вопрос. После этого она начала анализировать, а как будет изменятся ответ на её вопрос, если координату \(x\) домножать на некоторые положительные целые числа \(x_1\), \(x_2\), ... , \(x_q\), выбранные ей для анализа.

Вике сложно справится с таким анализом самостоятельно, поэтому она обратилась к вам за помощью.

Формально, Вику интересует ответ на её вопрос для координат \(X_1 = x \cdot x_1\), \(X_2 = X_1 \cdot x_2\), ... , \(X_q = X_{q-1} \cdot x_q\). Так как ответ для таких координат может быть очень большой, найдите его по модулю \(M\). Гарантируется, что число \(M\) является простым.

Входные данные

В первой строке входных данных содержится три целых числа \(x\) (\(1 \le x \le 10^9\)), \(q\) (\(1 \le q \le 10^5\)) и \(M\) (\(100 \le M \le 2 \cdot 10^9\)) — изначальная координата, для которой Вика ответила на вопрос самостоятельно, количество чисел \(x_i\), на которые Вика будет домножать изначальную координату и простой модуль \(M\).

Во второй строке входных данных содержится \(q\) чисел \(x_1, x_2, x_3, \ldots, x_q\) (\(1 \le x_i \le 10^6\)) — описанные в условии числа.

Выходные данные

Выведите \(q\) целых чисел, где \(i\)-е число соответствует ответу на вопрос Вики для координаты \(X_i\). Все ответы выводите по модулю \(M\).

Примечание

В первом примере, чтобы камешек коснулся водной глади в точке с координатой \(2\), его нужно кинуть с силой \(2\). Чтобы камешек коснулся воды в точке с координатой \(2 \cdot 3 = 6\), его нужно кинуть с силой \(3\) или с силой \(6\).

Во втором примере можно запустить «блинчик» с силой \(5\) или \(14\), чтобы он коснулся в воды в точке с координатой \(7 \cdot 2 = 14\). Для координаты \(14 \cdot 13 = 182\) есть \(4\) варианта сил — это \(20\), \(29\), \(47\), \(182\).

A. Утренний сэндвич

математика реализация *800

Монокарп начинает каждое утро со вкусного сэндвича. Его ингредиенты — это всегда хлеб, сыр и ветчина.

Сэндвич всегда готовится по следующему принципу:

  • кусок хлеба
  • ломтик сыра или ветчины
  • кусок хлеба
  • \(\dots\)
  • ломтик сыра или ветчины
  • кусок хлеба

То есть в сэндвиче всегда хлеб сверху и снизу, и при этом хлеб и начинка чередуются (начинка — это либо сыр, либо ветчина). Каждый кусок хлеба и каждый ломтик сыра или ветчины называется слоем.

Сегодня Монокарп проснулся и обнаружил, что у него есть \(b\) кусков хлеба, \(c\) ломтиков сыра и \(h\) ломтиков ветчины. Какое наибольшее количество слоев может быть в его утреннем сэндвиче?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор состоит из трех целых чисел \(b, c\) и \(h\) (\(2 \le b \le 100\); \(1 \le c, h \le 100\)) — количество кусков хлеба, ломтиков сыра и ломтиков ветчины, соответственно.

Выходные данные

На каждый набор входных данных выведите одно целое число — наибольшее количество слоев, которое может быть в его утреннем сэндвиче.

Примечание

В первом наборе входных данных Монокарп может собрать сэндвич из трех слоев: либо кусок хлеба, ломтик сыра и другой кусок хлеба, либо кусок хлеба, ломтик ветчины и другой кусок хлеба.

Во втором наборе у Монокарпа есть много хлеба, но не очень много начинки. Он может собрать сэндвич из четырех кусков хлеба, одного ломтика сыра и двух ломтиков ветчины.

В третьем наборе все наоборот — у Монокарпа есть много начинки, но не очень много хлеба. Он может собрать сэндвич из трех кусков хлеба и двух ломтиков сыра, например.

A. To My Critics

реализация сортировки *800

У Сунита есть три цифры \(a\), \(b\) и \(c\).

Так как математика не является его сильной стороной, он просит вас определить, можно ли выбрать любые две цифры так, чтобы их сумма была больше или равна \(10\).

Выведите «YES», если такая пара существует, и «NO» в противном случае.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Единственная строка каждого набора содержит три цифры \(a\), \(b\), \(c\) (\(0 \leq a, b, c \leq 9\)).

Выходные данные

Для каждого теста выведите «YES», если такая пара существует, и «NO» в противном случае.

Вы можете вывести ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом примере, выбрав цифры \(8\) и \(2\), мы можем получить сумму \(8 + 2 = 10\), что удовлетворяет условию, поэтому ответ «YES».

Во втором примере, любая комбинация выбранных цифр не будет иметь сумму, равную или большую \(10\), поэтому ответ «NO» (обратите внимание, что мы не можем выбрать цифру на одной позиции дважды).

В третьем примере, любая комбинация выбранных цифр будет иметь сумму, равную \(18\), поэтому ответ «YES».

B. Десять слов мудрости

реализация сортировки *800

В игровом шоу «Десять слов мудрости» участвуют \(n\) участников, пронумерованных от \(1\) до \(n\), каждый из которых даёт один ответ. \(i\)-й ответ состоит из \(a_i\) слов и имеет качество \(b_i\). Никакие два ответа не имеют одинакового качества, и по крайней мере один ответ имеет длину не более \(10\) слов.

Победителем шоу становится ответ с наивысшим качеством из всех ответов, которые не превышают \(10\) слов. Какой ответ станет победителем?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \leq n \leq 50\)) — количество ответов.

Затем следуют \(n\) строк, \(i\)-я из которых содержит два целых числа \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq 50\)) — количество слов и качество \(i\)-го ответа соответственно.

Дополнительные ограничения на ввод: в каждом тесте, по крайней мере одно значение \(i\) удовлетворяет условию \(a_i \leq 10\), и все значения \(b_i\) различны.

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую одно целое число \(x\) (\(1 \leq x \leq n\)) — победителя шоу, согласно правилам, указанным в условии.

Можно показать, что согласно ограничениям в условии, для каждого теста существует ровно один победитель.

Примечание

В первом тесте предоставлены следующие ответы:

  • Ответ 1: \(7\) слов, качество \(2\)
  • Ответ 2: \(12\) слов, качество \(5\)
  • Ответ 3: \(9\) слов, качество \(3\)
  • Ответ 4: \(9\) слов, качество \(4\)
  • Ответ 5: \(10\) слов, качество \(1\)

Мы видим, что ответы с индексами \(1\), \(3\), \(4\) и \(5\) имеют длину, не превышающую \(10\) слов. Из этих ответов победителем является тот, у которого наивысшее качество.

Сравнивая качества, мы находим, что:

  • Ответ 1 имеет качество \(2\).
  • Ответ 3 имеет качество \(3\).
  • Ответ 4 имеет качество \(4\).
  • Ответ 5 имеет качество \(1\).

Среди этих ответов, победителем является Ответ 4 с наивысшим качеством.

C. Слово на бумаге

реализация Строки *800

На сетке из точек размером \(8 \times 8\) вертикально в одном столбце написали слово, состоящее из строчных латинских букв, сверху вниз. Что это за слово?

Входные данные

Ввод содержит несколько наборов входных данных. Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из \(8\) строк, каждая из которых содержит \(8\) символов. Каждый символ в сетке может быть либо \(\texttt{.}\) (представляющий точка), либо строчной латинской буквой (\(\texttt{a}\)\(\texttt{z}\)).

Слово полностью находится в одном столбце и непрерывно от начала до конца (без пропусков). Для лучшего понимания смотрите пример ввода.

Выходные данные

Для каждого тестового случая выведите одну строку, содержащую слово, состоящее из строчных латинских букв (\(\texttt{a}\)\(\texttt{z}\)), которое написано вертикально в одном столбце сверху вниз.

D. Сбалансированный раунд

жадные алгоритмы Перебор реализация сортировки *900

Вы являетесь автором раунда Codeforces и подготовили \(n\) задач, которые вы собираетесь задать, причем задача \(i\) имеет сложность \(a_i\). Вы будете выполнять следующий процесс:

  • удалить некоторые (возможно, ноль) задач из списка;
  • переставить оставшиеся задачи в любом порядке, который вы пожелаете.

Раунд считается сбалансированным, если и только если абсолютная разница между сложностью любых двух последовательных задач не превышает \(k\) (то есть меньше или равен \(k\)).

Какое минимальное количество задач нужно удалить, чтобы расстановка задач была сбалансированной?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит два положительных целых числа \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) и \(k\) (\(1 \leq k \leq 10^9\)) — количество задач и максимально допустимая абсолютная разница между последовательными задачами.

Вторая строка каждого набора содержит \(n\) целых чисел, разделенных пробелами, \(a_i\) (\(1 \leq a_i \leq 10^9\)) — сложность каждой задачи.

Обратите внимание, что сумма \(n\) по всем тестам не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество задач, которые нужно удалить, чтобы расстановка задач была сбалансированной.

Примечание

В первом примере мы можем удалить первые \(2\) задачи и составить набор, используя задачи со сложностями \([4, 5, 6]\), с разницей между соседними задачами равной \(|5 - 4| = 1 \leq 1\) и \(|6 - 5| = 1 \leq 1\).

Во втором примере мы можем взять одну задачу и составить раунд, используя задачу со сложностью \(10\).

E. Картон для картин

Бинарный поиск геометрия математика реализация *1100

У Мирчи есть \(n\) картин. \(i\)-я картина является квадратом со стороной \(s_i\) сантиметров.

Он прикрепил каждую картину к квадратному куску картона так, чтобы у каждой картинки был картон шириной \(w\) сантиметров со всех сторон. Всего он использовал \(c\) квадратных сантиметров картона. Зная размеры картин и значение \(c\), сможете ли вы найти значение \(w\)?

Картинка первого тестового примера. Здесь \(c = 50 = 5^2 + 4^2 + 3^2\), поэтому ответ \(w=1\).

Обратите внимание, что кусок картона находится за каждой картинкой, а не только по краям.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит два положительных целых числа \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) и \(c\) (\(1 \leq c \leq 10^{18}\)) — количество картин и количество использованных квадратных сантиметров картона.

Вторая строка каждого набора содержит \(n\) целых чисел, разделенных пробелами, \(s_i\) (\(1 \leq s_i \leq 10^4\)) — размеры картин.

Сумма \(n\) по всем наборам не превышает \(2 \cdot 10^5\).

Дополнительное ограничение на ввод: Для каждого набора входных данных существует такое целое число \(w\).

Пожалуйста, обратите внимание, что некоторые наборы входных данных могут не поместиться в 32-разрядный целочисленный тип, поэтому вам следует использовать по крайней мере 64-разрядный целочисленный тип в вашем языке программирования (например, long long для C++).

Выходные данные

Для каждого набора входных данных выведите одно целое число — значение \(w\) (\(w \geq 1\)), при котором понадобится ровно \(c\) квадратных сантиметров картона.

Примечание

Первый пример объяснен в условии.

Для второго примера выбрано значение \(w\) равное \(2\), таким образом, площадь, покрытая картоном, составляет \(c = (2 \cdot 2 + 6)^2 = 10^2 = 100\) квадратных сантиметров.

Для третьего примера выбрано значение \(w\) равное \(4\), что дает площадь покрытия \(c = (2 \cdot 4 + 2)^2 \times 5 = 10^2 \times 5 = 100 \times 5 = 500\) квадратных сантиметров.

F. We Were Both Children

математика Перебор реализация теория чисел *1300

Михай и Славик смотрели на группу из \(n\) лягушек, пронумерованных от \(1\) до \(n\), которые изначально находились в точке \(0\). Лягушка \(i\) может прыгнуть на расстояние \(a_i\).

Каждую секунду лягушка \(i\) прыгает на \(a_i\) единиц вперед. Прежде чем лягушки начнут прыгать, Славик и Михай могут поставить ровно одну ловушку в координате, чтобы поймать всех лягушек, которые когда-либо пройдут через эту координату.

Однако, дети не могут уйти далеко от своего дома, поэтому они могут поставить ловушку только в одной из первых \(n\) точках (то есть в точке с координатой от \(1\) до \(n\)), и дети не могут поставить ловушку в точке \(0\), так как они боятся лягушек.

Можете ли вы помочь Славику и Михаю определить, сколько лягушек они могут поймать, используя ловушку?

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Затем следуют описания наборов.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество лягушек, которое равно расстоянию, которое Славик и Михай могут пройти, чтобы установить ловушку.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — длины прыжков соответствующих лягушек.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество лягушек, которых Славик и Михай могут поймать с помощью ловушки.

Примечание

В первом примере лягушки будут прыгать следующим образом:

  • Лягушка 1: \(0 \to 1 \to 2 \to 3 \to \mathbf{\color{red}{4}} \to \cdots\)
  • Лягушка 2: \(0 \to 2 \to \mathbf{\color{red}{4}} \to 6 \to 8 \to \cdots\)
  • Лягушка 3: \(0 \to 3 \to 6 \to 9 \to 12 \to \cdots\)
  • Лягушка 4: \(0 \to \mathbf{\color{red}{4}} \to 8 \to 12 \to 16 \to \cdots\)
  • Лягушка 5: \(0 \to 5 \to 10 \to 15 \to 20 \to \cdots\)
Таким образом, если Славик и Михай поставят ловушку в координате \(4\), они смогут поймать трех лягушек: лягушек 1, 2 и 4. Можно доказать, что они не смогут поймать больше лягушек.

Во втором примере Славик и Михай могут поставить ловушку в координате \(2\) и мгновенно поймать всех трех лягушек.

G. The Morning Star

геометрия Комбинаторика математика реализация сортировки Структуры данных *1500

Компас указывает прямо на утреннюю звезду. Он может указывать только в одном из восьми направлений: четыре основных направления (N, S, E, W) или их комбинации (NW, NE, SW, SE). В противном случае, он сломается.

Направления, в которых может указывать компас.

На плоскости находится \(n\) различных точек с целочисленными координатами. Сколько существует способов разместить компас в одной точке и утреннюю звезду в другой, чтобы компас не сломался?

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Затем следуют описания наборов.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество точек.

Затем следуют \(n\) строк, каждая строка содержит два целых числа \(x_i\), \(y_i\) (\(-10^9 \leq x_i, y_i \leq 10^9\)) — координаты каждой точки.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество пар точек, которые не сломают компас.

Примечание

В первом примере, любая пара точек не сломает компас:

  • Компас находится в \((0,0)\), утренняя звезда находится в \((-1,-1)\): компас будет указывать \(\text{SW}\).
  • Компас находится в \((0,0)\), утренняя звезда находится в \((1,1)\): компас будет указывать \(\text{NE}\).
  • Компас находится в \((-1,-1)\), утренняя звезда находится в \((0,0)\): компас будет указывать \(\text{NE}\).
  • Компас находится в \((-1,-1)\), утренняя звезда находится в \((1,1)\): компас будет указывать \(\text{NE}\).
  • Компас находится в \((1,1)\), утренняя звезда находится в \((0,0)\): компас будет указывать \(\text{SW}\).
  • Компас находится в \((1,1)\), утренняя звезда находится в \((-1,-1)\): компас будет указывать \(\text{SW}\).

Во втором примере, только две пары точек не сломают компас:

  • Компас находится в \((6,9)\), утренняя звезда находится в \((10,13)\): компас будет указывать \(\text{NE}\).
  • Компас находится в \((10,13)\), утренняя звезда находится в \((6,9)\): компас будет указывать \(\text{SW}\).

H. Третья буква

графы жадные алгоритмы поиск в глубину и подобное реализация снм *1700

Чтобы выиграть свою самую трудную битву, Мирча придумал отличную стратегию для своей армии. У него есть \(n\) солдат, и он решил расположить их определенным образом в лагерях. Каждый солдат должен принадлежать ровно одному лагерю, и на каждой целочисленной точке оси \(x\) находится один лагерь (на точках \(\cdots, -2, -1, 0, 1, 2, \cdots\)).

Стратегия состоит из \(m\) условий. Условие \(i\) гласит, что солдат \(a_i\) должен принадлежать лагерю, который находится в \(d_i\) метрах перед лагерем, к которому принадлежит человек \(b_i\). (Если \(d_i < 0\), то лагерь \(a_i\) должен быть в \(-d_i\) метрах позади лагеря \(b_i\).)

Теперь Мирча задается вопросом, существует ли разбиение солдат, которое удовлетворяет условию, и просит вашей помощи! Ответьте «YES», если существует разбиение из \(n\) солдат, которое удовлетворяет всем \(m\) условиям, и «NO» в противном случае.

Обратите внимание, что два разных солдата могут быть размещены в одном лагере.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора содержит два положительных целых числа \(n\) и \(m\) (\(2 \leq n \leq 2 \cdot 10^5\); \(1 \leq m \leq n\)) — количество солдат и количество условий соответственно.

Затем следуют \(m\) строк, каждая из которых содержит \(3\) целых числа: \(a_i\), \(b_i\), \(d_i\) (\(a_i \neq b_i\); \(1 \leq a_i, b_i \leq n\); \(-10^9 \leq d_i \leq 10^9\)) — описывающие условия, объясненные в условии. Обратите внимание, что если \(d_i\) положительно, то \(a_i\) должен быть в \(d_i\) метрах перед \(b_i\), а если отрицательно, то \(a_i\) должен быть в \(-d_i\) метрах позади \(b_i\).

Обратите внимание, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если существует такое расположение \(n\) солдат, которое удовлетворяет всем \(m\) условиям, и «NO» в противном случае.

Примечание

В первом примере мы можем разделить солдат на лагеря следующим образом:

  • Солдат \(1\) в лагере с координатой \(x = 3\).
  • Солдат \(2\) в лагере с координатой \(x = 5\).
  • Солдат \(3\) в лагере с координатой \(x = 9\).
  • Солдат \(4\) в лагере с координатой \(x = 11\).

Для второго примера не существует разбиения, которое может удовлетворить все ограничения одновременно.

Для третьего примера не существует разбиения, которое удовлетворяет всем условиям, так как мы получаем противоречивую информацию о той же паре.

Одно из возможных разбиений, удовлетворяющих условиям в четвёртом примере:

  • Солдат \(1\) в лагере с координатой \(x = 10\).
  • Солдат \(2\) в лагере с координатой \(x = 13\).
  • Солдат \(3\) в лагере с координатой \(x = -2023\).
  • Солдат \(4\) в лагере с координатой \(x = -2023\).

D. Префиксные суммы перестановки

математика реализация *1300

Вам загадали некоторый массив из \(n\) элементов, после чего посчитали его массив префиксных сумм и передали его вам, случайно потеряв при передаче один элемент. Ваша задача — выяснить, может ли данный массив соответствовать какой-то перестановке.

Перестановкой из \(n\) элементов называется массив из \(n\) чисел от \(1\) до \(n\), такой что каждое число встречается в нём ровно один раз.

Массив префиксных сумм массива \(a\) — это такой массив \(b\), что \(b_i = \sum_{j=1}^i a_j, 1 \le i \le n\).

Например, исходная перестановка была \([1, 5, 2, 4, 3]\). Её массив префиксных сумм — \([1, 6, 8, 12, 15]\). Потеряв один элемент, можно получить, например, массивы \([6, 8, 12, 15]\) или \([1, 6, 8, 15]\).

Также можно показать, что массив \([1, 2, 100]\) не соответствует никакой перестановке.

Входные данные

Первая строка содержит положительное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка описания каждого набора входных данных содержит положительное число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — размер загаданного массива.

Вторая строка описания каждого набора входных данных содержит \(n - 1\) положительное число \(a_i\) (\(1 \le a_i \le 10^{18}\)), \(a_{i-1} < a_i\) — элементы массива префиксных сумм.

Гарантируется, что сумма значений \(n\) по всем наборам не превосходит \(2 \cdot 10^5\)

Выходные данные

Для каждого набора входных данных, выведите «YES», если существует такая перестановка, и «NO» в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes» и «Yes» будут распознаны как положительный ответ).

Примечание

В четвёртом примере подходит, например, перестановка \([1, 2, 3, 4]\). В пятом примере подходит, например, перестановка \([2, 1]\). В седьмом примере подходит, например, перестановка \([1, 2, 4, 3]\).

G. Влад и горы

Бинарный поиск графы Деревья реализация снм сортировки Структуры данных *2000

Влад решил отправиться в путешествие в горы. Всего он планирует перемещаться по \(n\) горам, между некоторыми из которых есть дороги. Горы имеют высоты, высота \(i\)-й горы равна \(h_i\).

Если между горами \(i\) и \(j\) есть дорога, то Влад может перейти с горы \(i\) на гору \(j\), потратив при этом \(h_j - h_i\) единиц энергии. Если при переходе его энергия должна опуститься ниже нуля, он не сможет перейти с горы \(i\) на гору \(j\). Обратите внимание, что \(h_j - h_i\) может быть отрицательным и тогда энергия восстановится.

Влад хочет рассмотреть разные варианты маршрута, поэтому просит вас ответить на следующие запросы: можно ли построить какой-либо маршрут, начинающийся на горе \(a\) и заканчивающийся на горе \(b\), если изначально у него есть \(e\) единиц энергии?

Входные данные

В первой строке входных данных содержится целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов.

Первая строка набора содержит два числа \(n\) и \(m\) (\(2 \le n \le 2 \cdot 10^5\), \(1 \le m \le \min(\frac{n\cdot(n - 1)}{2}, 2 \cdot 10^5)\)) — количество гор и дорог между ними, соответственно.

Вторая строка содержит \(n\) целых чисел \(h_1, h_2, h_3, \dots, h_n\) (\(1 \le h_i \le 10^9\)) — высоты гор.

Следующие \(m\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — номера гор, которые соединяет дорога. Гарантируется, что ни одна дорога не встречается дважды.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Следующие \(q\) строк содержат по три числа \(a\), \(b\) и \(e\) (\(1 \le a, b \le n\), \(0 \le e \le 10^9\)) — начальная и конечная горы маршрута и количество энергии, соответственно.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\). Также это гарантируется для \(m\) и \(q\).

Выходные данные

Для каждого запроса выведите «YES», если Влад может составить маршрут от горы \(a\) до горы \(b\), и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

В примерах ниже ответы на разные наборы данных разделены пустой строкой, вы можете её не выводить.

A. Сказка о сортировке

реализация *800

У Алфена есть массив целых положительных чисел \(a\) длины \(n\).

Алфен может применять следующую операцию:

  • Для всех \(i\) от \(1\) до \(n\), заменить \(a_i\) на \(\max(0, a_i - 1)\).

Алфен будет применять указанную выше операцию до тех пор, пока \(a\) не окажется отсортированным, то есть пока для \(a\) не станет верно \(a_1 \leq a_2 \leq \ldots \leq a_n\). Сколько операций применит Алфен? В рамках ограничений задачи можно утверждать, что Алфен применит конечное число операций.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 50\)) — длину массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10 ^ 9\)) — элементы массива \(a\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество операций, которых применит Алфен.

Примечание

В первом наборе входных данных \(a=[1,2,3]\). Поскольку \(a\) уже отсортирован, Алфен не будет применять никаких операций. Поэтому ответ равен \(0\).

Во втором наборе входных данных \(a=[2,1,2,1,2]\). Поскольку \(a\) изначально не отсортирован, Алфен применит операцию, чтобы стало \(a=[1,0,1,0,1]\). После применения одной операции \(a\) всё ещё не отсортирован, поэтому Алфен применит еще одну операцию, чтобы стало \(a=[0,0,0,0,0]\). Поскольку \(a\) теперь отсортирован, Алфен больше применять операцию не будет. Поскольку Алфен выполнил в общей сложности две операции, ответ равен \(2\).

B. Хорошие массивы

математика реализация *900

Дан массив целых положительных чисел \(a\) длины \(n\).

Назовем массив целых положительных чисел \(b\) длины \(n\) хорошим, если:

  1. \(a_i \neq b_i\) для всех \(i\) от \(1\) до \(n\),
  2. \(a_1 + a_2 +\ldots + a_n = b_1 + b_2 + \ldots + b_n\).

Существует ли хороший массив?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — длину массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10 ^ 9\)) — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если существует хороший массив, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных одним возможным хорошим массивом является массив \([3, 3, 3]\). Примерами не хороших массивов являются:

  • \([8, 0, 1]\) — массив состоит не только из целых положительных чисел,
  • \([5, 2, 4]\) — cумма элементов массива отличается от суммы элементов исходного массива,
  • \([5, 2, 2]\) — третий элемент равен третьему элементу исходного массива.

Во втором наборе входных данных \([1, 1]\) — единственный массив целых положительных чисел длины \(2\), сумма элементов которого равна \(2\). Поскольку \([1, 1]\) не является хорошим массивом, ответ — «NO».

E2. ПерестановДерево (сложная версия)

битмаски бпф Деревья дп жадные алгоритмы математика поиск в глубину и подобное реализация *2700

Это сложная версия задачи. Различия между двумя версиями заключаются в ограничении на \(n\) и ограничении по времени. Делать взломы можно только в том случае, если решены обе версии задачи.

Дано дерево с \(n\) вершинами с корнем в вершине \(1\).

Для некоторой перестановки\(^\dagger\) \(a\) длины \(n\) пусть \(f(a)\) — количество пар вершин \((u, v)\) таких, что \(a_u < a_{\operatorname{lca}(u, v)} < a_v\). Здесь \(\operatorname{lca}(u,v)\) обозначает наименьшего общего предка вершин \(u\) и \(v\).

Найдите максимально возможное значение \(f(a)\) по всем перестановкам \(a\) длины \(n\).

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) — количество вершин в дереве.

Вторая строка содержит \(n - 1\) целых чисел \(p_2,p_3,\ldots,p_n\) (\(1 \le p_i < i\)), указывающих на наличие ребра между вершинами \(i\) и \(p_i\).

Выходные данные

Выведите максимальное значение \(f(a)\).

Примечание

Дерево в первом примере:

Одной возможной оптимальной перестановкой \(a\) является \([2, 1, 4, 5, 3]\) с \(4\)-мя подходящими парами вершин:

  • \((2, 3)\), так как \(\operatorname{lca}(2, 3) = 1\) и \(1 < 2 < 4\),
  • \((2, 4)\), так как \(\operatorname{lca}(2, 4) = 1\) и \(1 < 2 < 5\),
  • \((2, 5)\), так как \(\operatorname{lca}(2, 5) = 1\) и \(1 < 2 < 3\),
  • \((5, 4)\), так как \(\operatorname{lca}(5, 4) = 3\) и \(3 < 4 < 5\).

Дерево в третьем примере:

Дерево в четвёртом примере:

B. Максимальное округление

жадные алгоритмы математика реализация *1100

Дано натуральное число \(x\). Вы можете выполнить следующую операцию:

  • выбрать положительное целое число \(k\) и округлить \(x\) до \(k\)-го разряда

Обратите внимание, что числовые разряды нумеруются справа налево и начинаются с нуля. Если запись числа имеет \(k\) разрядов, то считается, что цифра на \(k\)-м разряде равна \(0\).

Округление происходит следующим образом:

  • если цифра на \((k-1)\)-м разряде больше или равна \(5\), то цифра на \(k\)-м разряде увеличивается на \(1\), иначе цифра на \(k\)-м разряде не меняется (используется математическое округление).

  • если до выполнения операций цифра на \(k\)-м разряде равнялась \(9\), и она должна увеличиться на \(1\), то мы ищем наименьший такой разряд \(k'\) (\(k'>k\)), где цифра на \(k'\)-м разряде меньше \(9\) и прибавляем \(1\) к цифре на \(k'\)-м разряде. Затем мы присваиваем \(k=k'\).

  • после этого все цифры, разряды которых меньше \(k\), заменяются нулями.

Ваша задача - сделать \(x\) максимально возможным, если вы можете выполнять операцию столько раз, сколько хотите.

Например, если \(x\) равно \(3451\), то если последовательно выбрать:

  • \(k=1\), то после операции \(x\) станет равным \(3450\)
  • \(k=2\), то после операции \(x\) станет равным \(3500\)
  • \(k=3\), то после операции \(x\) станет равным \(4000\)
  • \(k=4\), то после операции \(x\) станет равным \(0\)
Для максимизации ответа нужно сначала выбрать \(k=2\), а затем \(k=3\), тогда число станет равным \(4000\).
Входные данные

Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных.

В каждом наборе входных данных дано натуральное число \(x\) длиной до \(2 \cdot 10^5\), гарантируется, что в записи числа нет ведущих нулей.

Гарантируется, что сумма длин чисел \(x\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите максимально возможное значение \(x\) после операций. В записи числа не должно быть ведущих нулей.

Примечание

В первом примере лучше не выполнять никаких операций.

Во втором примере вы можете выполнить одну операцию и получить \(10\).

В третьем примере можно выбрать \(k=1\) или \(k=2\). В обоих случаях ответ будет \(100\).

A. Строкосравнитель

реализация Строки *1100

Некоторым гномам, которые заканчивают бакалавриат ГоГну (Государственный Гномий университет), сказали — «Нет генома, нет диплома». Что означало, что всем гномам надо защищать диплом на тему генома. Геном у гномов совсем не простой. Он представляет собой строку, состоящую из строчных букв латинского алфавита.

Гном Миша уже выбрал тему диплома: определить по двум геномам гномов, принадлежат ли они одной и той же расе. Два гнома принадлежат одной и той же расе, если в геноме первого гнома, можно поменять два символа местами так, чтобы получился геном второго гнома. Помогите гному Мише, определите принадлежат два гнома одной расе или нет.

Входные данные

В первой строке записан геном первого гнома: непустая строка, состоящая из строчных букв латинского алфавита.

Во второй строке записан геном второго гнома: непустая строка, состоящая из строчных букв латинского алфавита.

Количество букв в каждом из геномов не превосходит 105. Гарантируется, что строки соответствующие геномам различны. Заданные геномы не обязательно одинаковой длины.

Выходные данные

Выведите «YES», если гномы принадлежат одной расе, иначе выведите «NO».

Примечание
  • Первый пример: в строчке «ab» нужно просто поменять две буквы местами, тогда мы получим «ba».
  • Второй пример: строчку «aa» нельзя перевести в строчку «ab», так как в первой строке нет символа «b».

F. Вычисляем ПСП

геометрия математика реализация сортировки Структуры данных *2900

Заданы \(2n\) наборов \((a, b, c)\), где \(a\) и \(b\) — некоторые положительные целые числа, а \(c\) — скобка '(' или ')'. В ровно \(n\) наборах \(c = \)'(', в остальных \(n\) — \(c =\) ')'.

Требуется выбрать два положительных числа \(x\) и \(y\) (\(x > 0\) и \(y > 0\); не обязательно целые) и отсортировать наборы в порядке возрастания \(a \cdot x + b \cdot y\). Если у нескольких наборов одно и то же значение, то их можно расположить в произвольном порядке друг между другом.

Можно ли выбрать такие значения \(x\) и \(y\), что, взяв скобки \(c\) из наборов в полученном порядке, мы получим правильную скобочную последовательность?

Правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов «1» и «+».

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1500\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 1500\)).

В \(i\)-й из следующих \(2n\) строк записаны два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 10^6\)) и символ \(c_i\) (\(c_i = \)'(' или \(c_i = \)')'). В ровно \(n\) наборах \(c_i = \)'(', в остальных \(n\) — \(c_i =\) ')'.

Сумма \(n\) по всем наборам входных данных не превосходит \(1500\).

Выходные данные

На каждый набор входных данных выведите «YES», если возможно выбрать такие значения \(x\) и \(y\), что, взяв скобки \(c\) из наборов в полученном порядке, мы получим правильную скобочную последовательность. Иначе выведите «NO».

Примечание

В первом наборе входных данных можно выбрать \(x = 10, y = 0.1\). Значения для наборов тогда будут \(10 \cdot 1 + 0.1 \cdot 4 = 10.4\) и \(10 \cdot 2 + 0.1 \cdot 3 = 20.3\). Тогда сначала будет первый набор, за ним второй, из чего получается скобочная последовательность «()», которая является правильной.

Во втором наборе невозможно выбрать такие положительные \(x\) и \(y\), что открывающей скобке будет присвоено значение, меньше или равное значению закрывающей скобки.

В четвертом наборе можно выбрать \(x = 0.6, y = 0.55\). Скобочная последовательность будет «(()(()))».

C. Запросы к массиву

Деревья поиск в глубину и подобное реализация Строки Структуры данных *1600

У Монокарпа был массив \(a\), состоящий из целых чисел. Изначально массив был пустым.

Монокарп выполнял три типа запросов к этому массиву:

  • выбрать число и добавить его в конец массива. Каждый раз, когда Монокарп выполнял этот запрос, он выписывал символ +;
  • удалить последний элемент из массива. Каждый раз, когда Монокарп выполнял этот запрос, он выписывал символ -. Монокарп не выполнял этот запрос, если массив был пуст;
  • проверить, отсортирован ли массив в порядке неубывания, т. е. выполняется ли \(a_1 \le a_2 \le \dots \le a_k\), где \(k\) — количество элементов в массиве на данный момент. Любой массив, содержащий меньше \(2\) элементов, считается отсортированным. Если массив отсортирован в момент запроса, Монокарп выписывал символ 1. Иначе он выписывал символ 0.

Вам задана строка \(s\), состоящая из \(q\) символов 0, 1, + и/или -. Это символы, выписанные Монокарпом, строго в том порядке, в каком он их выписывал.

Вам нужно выяснить, является ли эта строка непротиворечивой, т. е. мог ли Монокарп выполнять такие запросы, что выписанная после них строка равна строке \(s\).

Входные данные

Первая строка входных данных содержит одно число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит строку \(s\) (\(1 \le |s| \le 2 \cdot 10^5\)). Это строка состоит из символов 0, 1, + и/или -. Это символы, выписанные Монокарпом, строго в том порядке, в каком он их выписывал.

Дополнительные ограничения на входные данные:

  • для любого префикса \(s\) количество символов + не меньше количества символов -. Другими словами, если бы Монокарп выполнял описанные в условии запросы, он никогда не пытался бы удалить элемент из пустого массива;
  • сумма \(|s|\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).
Выходные данные

Для каждого набора входных данных выведите YES, если Монокарп мог выполнить такие запросы, в результате которых будет выписана строка \(s\). Иначе выведите NO.

Вы можете выводить символы в ответе в любом регистре.

Примечание

В первом наборе входных данных Монокарп мог выполнить следующие запросы:

  • добавить число \(13\);
  • добавить число \(37\);
  • проверить, что массив \([13, 37]\) отсортирован в порядке неубывания (и он действительно отсортирован).

В пятом наборе входных данных Монокарп мог выполнить следующие запросы:

  • добавить число \(3\);
  • добавить число \(2\);
  • проверить, что массив \([3, 2]\) отсортирован (он не отсортирован);
  • удалить последний элемент;
  • добавить число \(3\);
  • проверить, что массив \([3, 3]\) отсортирован (он отсортирован);
  • удалить последний элемент;
  • добавить число \(-5\);
  • проверить, что массив \([3, -5]\) отсортирован (он не отсортирован);

В остальных наборах входных данных Монокарп не мог выписать строку \(s\), выполняя свои запросы.

E. Непересекающиеся подперестановки

дп Комбинаторика математика реализация *2300

Заданы два целых числа \(n\) и \(k\).

Для массива длины \(n\) давайте определим его стоимость как максимальное количество непрерывных подмассивов этого массива, которые могут быть выбраны следующим образом:

  • каждый элемент массива принадлежит не более чем одному подмассиву;
  • длина каждого подмассива ровно \(k\);
  • каждый подмассив содержит каждое целое число от \(1\) до \(k\) ровно один раз.

Например, если \(n = 10\), \(k = 3\) и массив равен \([1, 2, 1, 3, 2, 3, 2, 3, 1, 3]\), его стоимость равна \(2\), потому что, например, мы можем выбрать два подмассива: от \(2\)-го элемента до \(4\)-го и от \(7\)-го элемента до \(9\)-го, и мы можем показать, что выбрать больше \(2\) подмассивов нельзя.

Посчитайте сумму стоимостей по всем массивам длины \(n\), состоящих из целых чисел от \(1\) до \(k\), и выведите ее по модулю \(998244353\).

Входные данные

Единственная строка входных данных содержит два целых числа \(n\) и \(k\) (\(2 \le k \le n \le 4000\)).

Выходные данные

Выведите одно целое число— сумму стоимостей по всем массивам длины \(n\), состоящих из целых чисел от \(1\) до \(k\), по модулю \(998244353\).

A. Ковёр в подарок

дп жадные алгоритмы реализация Строки *800

Недавно Тёма и Вика праздновали день семьи. Их подруга Арина подарила им ковёр, который может быть представлен в виде таблицы \(n \cdot m\) из строчных латинских букв.

Вика ещё не видела подарок, но Тёма знает, какие ковры она любит. Вике понравится ковёр, если она сможет прочитать на нём своё имя слева направо.

Формально, ковёр понравится девушке, если можно выбрать четыре различных столбца в порядке слева направо так, что первый содержит «v», второй — «i», третий — «k» и четвёртый — «a».

Помогите Тёме заранее понять, понравится ли Вике подарок Арины.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке входных содержится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержатся два целых числа \(n\), \(m\) (\(1 \le n, m \le 20\)) — размеры ковра.

В следующих \(n\) строках содержится по \(m\) строчных латинских букв в каждой, описывающих подаренный ковёр.

Выходные данные

Для каждого набора входных данных выведите «YES», если ковёр понравится Вике, в противном случае выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом примере Вика может прочитать своё имя слева направо.

Во втором примере Вика не сможет прочитать символ «v», поэтому ковёр ей не понравится.

C. Забор в цветочном городе

Бинарный поиск реализация сортировки Структуры данных *1100

Аня живет в цветочном городе. По указу мэра города она должна построить себе забор.

Забор состоит из \(n\) досок, каждая из которых высотой \(a_i\) метров. По указу высоты досок должны не возрастать. То есть верно, что \(a_i \ge a_j\) для всех \(i < j\).

Ане стало интересно, является ли ее забор симметричным относительно диагонали. То есть получится ли у нее такой же забор, если она уложит все доски горизонтально в том же порядке.

Например, для \(n = 5\), \(a = [5, 4, 3, 2, 1]\) забор является симметричным. Так как если уложить все доски горизонтально, то получится забор \([5, 4, 3, 2, 1]\), как на картинке.

Слева забор \([5, 4, 3, 2, 1]\), справа этот же забор, уложенный горизонтально

А для \(n = 3\), \(a = [4, 2, 1]\) забор не является симметричным. Так как если уложить все доски горизонтально, то получится забор \([3, 2, 1, 1]\), как на картинке.

Слева забор \([4, 2, 1]\), справа этот же забор, уложенный горизонтально

Помогите Ане и выясните является ли ее забор симметричным.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке входных данных содержится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных содержится единственное целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина забора.

Во второй строке набора содержатся \(n\) натуральных чисел \(a_1 \ge a_2 \ge a_3 \ge \dots \ge a_n\) (\(1 \le a_i \le 10^9\)) — высоты досок.

Cумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если забор симметричный, в противном случае выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом и втором наборах входных данных примера забор является симметричным.

В третьем наборе входных данных примера забор не является симметричным. Если уложить доски горизонтально, то получится забор \([3, 2, 1, 1]\).

В четвертом наборе входных данных примера забор не является симметричным. Если уложить доски горизонтально, то получится забор \([1, 1]\).

В пятом и шестом наборах входных данных примера забор является симметричным.

В седьмом наборе входных данных примера забор не является симметричным. Если уложить доски горизонтально, то получится забор \([2, 1, 1, 1, 1, 1]\).

A. Канал

жадные алгоритмы реализация *800

Петя — администратор канала в одном мессенджере. Всего на канал подписано \(n\) человек, причём Петя не считается подписчиком.

Петя опубликовал в канале новое сообщение. В момент его публикации в сети находилось \(a\) человек. Будем считать, что подписчики обязательно читают все сообщения канала, если они в сети.

Затем Петя следил за числом подписчиков, находящихся в сети. Ему последовательно пришло \(q\) уведомлений вида «пользователь вышел из сети» или «пользователь зашёл в сеть». Какой именно пользователь заходит или выходит, Пете неизвестно. Гарантируется, что такая последовательность уведомлений действительно могла прийти Пете.

Пете интересно, все ли пользователи канала прочли его сообщение. Помогите ему, сообщите одно из следующего:

  • не может быть такого, что все \(n\) подписчиков прочли сообщение;
  • возможно, что все \(n\) подписчиков прочли сообщение;
  • гарантированно все \(n\) подписчиков прочли сообщение.
Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(a\) и \(q\) (\(1 \le n \le 100\), \(0 \le a \le n\), \(1 \le q \le 100\)) — число подписчиков канала, изначальное число подписчиков в сети, а также число поступивших уведомлений.

Вторая строка каждого набора входных данных содержит одну строку длины \(q\), состоящую из символов '+' и '-'. В этой строке \(i\)-й символ равен '+', если при \(i\)-м оповещении пользователь заходит в сеть, и '-' иначе.

Выходные данные

Для каждого набора входных данных выведите одну строку: «YES», если все \(n\) подписчиков гарантированно прочитали сообщение, «NO», если гарантированно не все \(n\) подписчиков прочитали сообщение, и «MAYBE» иначе.

Примечание

В первом наборе входных данных изначально в сети находятся все \(5\) из \(5\) подписчиков, так что они сразу читают сообщение. Ответ — «YES».

Во втором наборе входных данных после первых двух уведомлений число подписчиков в сети станет равно \(4\), а затем кто-то выйдет из сети, так что пятый подписчик точно не может прочитать сообщение. Не может быть такого, что все подписчики прочли сообщение, так что ответ — «NO».

В третьем наборе входных данных, с одной стороны, выйти и зайти может один и тот же человек (и тогда только \(4\) из \(5\) подписчиков прочли сообщение), с другой стороны, при последнем уведомлении зайти может пятый подписчик, ранее не бывший в сети (тогда все подписчики прочтут сообщение). Однозначно заключить нельзя, поэтому ответ — «MAYBE».

В четвёртом наборе входных данных после всех уведомлений в сети гарантированно находится пять пользователей. Все они прочтут сообщение, поэтому ответ — «YES».

C. MEX много раз

математика реализация *1100

Дан массив \(a_1,a_2,\ldots, a_n\), состоящий из попарно различных целых чисел от \(0\) до \(n\). Рассмотрим следующую операцию:

  • последовательно для каждого \(i\) от \(1\) до \(n\) в этом порядке элемент \(a_i\) заменяется на \(\operatorname{MEX}(a_1, a_2, \ldots, a_n)\).

Здесь \(\operatorname{MEX}\) набора чисел \(c_1, c_2, \ldots, c_m\) определяется как наименьшее неотрицательное целое число \(x\), которое не встречается в наборе чисел \(c\). Например, \(\operatorname{MEX}(0, 2, 2, 1, 4) = 3\), и \(\operatorname{MEX}(1, 2) = 0\).

Выведите массив, который получится после применения к нему такой операции \(k\) раз.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1\le n\le 10^5\), \(1\le k\le 10^9\)).

Вторая строка каждого набора входных данных содержит \(n\) попарно различных целых чисел \(a_1,a_2,\ldots, a_n\) (\(0\le a_i\le n\)) — элементы массива до выполнения операций.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите все \(n\) элементов итогового массива после применения к нему операции \(k\) раз.

Примечание

В первом наборе входных данных процесс происходит следующим образом:

  1. На первой операции массив изменяется с \([1]\) на \([0]\), поскольку \(\operatorname{MEX}(1) = 0\).
  2. На второй операции массив изменяется с \([0]\) на \([1]\), поскольку \(\operatorname{MEX}(0) = 1\).

Значит, массив станет равен \([1]\) после двух операций.

Во втором наборе входных данных за одну операцию массив изменяется так: \([{\mkern3mu\underline{\mkern-3mu {\bf 0}\mkern-3mu}\mkern3mu}, 1, 3] \rightarrow [2, {\mkern3mu\underline{\mkern-3mu {\bf 1}\mkern-3mu}\mkern3mu}, 3] \rightarrow [2, 0, {\mkern3mu\underline{\mkern-3mu {\bf 3}\mkern-3mu}\mkern3mu}] \rightarrow [2, 0, 1]\).

В третьем наборе входных данных за одну операцию массив изменяется так: \([{\mkern3mu\underline{\mkern-3mu {\bf 0}\mkern-3mu}\mkern3mu}, 2] \rightarrow [1, {\mkern3mu\underline{\mkern-3mu {\bf 2}\mkern-3mu}\mkern3mu}] \rightarrow [1, 0]\). За вторую операцию массив изменяется так: \([{\mkern3mu\underline{\mkern-3mu {\bf 1}\mkern-3mu}\mkern3mu}, 0] \rightarrow [2, {\mkern3mu\underline{\mkern-3mu {\bf 0}\mkern-3mu}\mkern3mu}] \rightarrow [2, 1]\).

A. Возрастание и убывание

жадные алгоритмы Конструктив математика реализация *800

Даны три целых числа \(x\), \(y\), и \(n\).

Вам нужно построить массив \(a\), состоящий из \(n\) целых чисел, который удовлетворял бы следующим условиям:

  1. \(a_1=x\), \(a_n=y\);
  2. \(a\) строго возрастает (т.е. \(a_1 < a_2 < \ldots < a_n\));
  3. если обозначать \(b_i=a_{i+1}-a_{i}\) для всех \(1 \leq i \leq n-1\), то \(b\) строго убывает (т.е. \(b_1 > b_2 > \ldots > b_{n-1}\)).

Если искомого массива \(a\) не существует, выведите одно целое число \(-1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит три целых числа \(x\), \(y\), \(n\) (\(1 \le x < y \le 1000,3 \le n \le 1000\)).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел \(a_1,a_2,\ldots,a_n\). Если существует несколько решений, выведите любое из них.

Если решения не существует, выведите одно целое число \(-1\).

Примечание

В первом наборе входных данных \(a=[1,3,4]\), и этот массив строго возрастает. Далее, \(b_1=a_2-a_1=3-1=2\), \(b_2=a_3-a_2=4-3=1\), так что \(b=[2,1]\), и этот массив строго убывает.

Во втором наборе входных данных, не существует такого массива \(a\), который удовлетворял был всем вышеописанным условиям.

F. Экзотические запросы

реализация сортировки Структуры данных *2300

AquaMoon дала RiverHamster последовательность целых чисел \(a_1,a_2,\dots,a_n\), а RiverHamster задал вам \(q\) запросов. Каждый запрос характеризуется двумя целыми числами \(l\) и \(r\).

При ответе на каждый запрос вы можете выбрать любой непрерывный отрезок последовательности и вычесть из всех его элементов одно и то же неотрицательное число. Выполнять эту операцию можно несколько (возможно, ноль) раз. Однако нельзя выбрать два пересекающихся отрезка, которые были бы не вложены друг в друга. Ваша задача — превратить в \(0\) все числа, у которых изначальное значение лежало в диапазоне \([l, r]\). Сделать это нужно за наименьшее число операций.

Обратите внимание, что запросы независимы, числа в массиве возвращаются к своим первоначальным значениям между запросами.

Формально, для каждого запроса нужно найти наименьшее \(m\), для которого существует последовательность \(\{(x_j,y_j,z_j)\}_{j=1}^{m}\), удовлетворяющая следующим условиями:

  • для любого \(1 \le j \leq m\) выполняется \(z_j \ge 0\) и \(1 \le x_j \le y_j \leq n\) (здесь \([x_j, y_j]\) представляют отрезки в последовательности);
  • для любых \(1 \le j < k \le m\) выполняется \([x_j,y_j]\subseteq[x_{k},y_{k}]\), \([x_k,y_k]\subseteq[x_{j},y_{j}]\), или \([x_j,y_j]\cap[x_{k},y_{k}]=\varnothing\);
  • для любого \(1 \le i \le n\), такого что \(l \le a_i \leq r\), выполняется \(\){\large a_i = \sum\limits_{\substack {1 \le j \le m \\ x_j \le i \le y_j}} z_j. }\(\)
Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1\le n,q\le 10^6\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)).

Каждая из следующих \(q\) строк содержит по два целых числа \(l\) и \(r\) (\(1\le l\le r\le n\)), характеризующий очередной запрос.

Выходные данные

Выведите ответ на каждый запрос на отдельной строке.

Примечание

В первом наборе входных данных рассмотрим второй запрос: \(l = 2\), \(r = 2\). Элементы, которые нужно обнулить, суть \([a_3, a_5, a_{10}] = [2, 2, 2]\). Достаточно применить последовательность операций \(\{(2, 10, 2)\}\).

В четвёртом запросе \(l = 2\), \(r = 3\). Обнулить нужно элементы \([a_3, a_4, a_5, a_7, a_{10}] = [2, 3, 2, 3, 2]\). Достаточно применить последовательность операций \(\{(1, 10, 2), (4, 4, 1), (7, 7, 1)\}\).

Во втором наборе входных данных можно заметить, что последовательность операций \(\{(1, 2, 1), (2, 3, 2)\}\) не является допустимой, потому что два используемых отрезка пересекаются, но не вложены один в другой.

G. Волшебный квадрат

Комбинаторика Конструктив реализация *3100

У Aquamoon есть квадратик Рубика, который можно представить как матрицу размера \(n \times n\), причём элементы матрицы составляют перестановку чисел \(1, \ldots, n^2\).

Aquamoon можно производить над матрицей следующие операции:

  • Сдвиг строки, т.е. сдвиг некоторой строки матрицы на несколько позиций (хотя бы на \(1\) и не более чем на \(n-1\)) вправо. Элементы, выходящие за правую границу матрицы, сдвигаются в начало строки. Так, например, сдвиг строки \(\begin{pmatrix} a & b & c \end{pmatrix}\) на \(2\) позиции превратит её в \(\begin{pmatrix} b & c & a \end{pmatrix}\);
  • Сдвиг столбца, т.е. сдвиг некоторого столбца матрицы на несколько позиций (хотя бы на \(1\) и не более чем на \(n-1\)) вниз. Элементы, выходящие за нижнюю границу матрицы, сдвигаются в начало столбца. Так, например, сдвиг столбца \(\begin{pmatrix} a \\ b \\ c \end{pmatrix}\) на \(2\) позиции превратит его в \(\begin{pmatrix} b\\c\\a \end{pmatrix}\).

Строки матрицы пронумерованы от \(1\) до \(n\) сверху вниз, столбцы пронумерованы от \(1\) до \(n\) слева направо. Клетку на пересечении \(x\)-й строки и \(y\)-го столбца обозначим как \((x, y)\).

Aquamoon может выполнить несколько (возможно, ноль) операций, но она должна выполнять следующие ограничения:

  • каждая строка и каждый столбец могут быть сдвинуты не более чем по одному разу;
  • каждое число матрицы может быть сдвинуто не более чем дважды;
  • итоговые смещения любых двух чисел, сдвинутых дважды, должны быть попарно различны. Формально, пусть числа \(a\) и \(b\) были сдвинуты по два раза. Пусть \(a\) изменило свою позицию с \((x_1,y_1)\) на \((x_2,y_2)\), а \(b\) изменило позицию с \((x_3,y_3)\) на \((x_4,y_4)\). Тогда \(x_2-x_1 \not\equiv x_4-x_3 \pmod{n}\) или \(y_2-y_1 \not\equiv y_4-y_3 \pmod{n}\).

Aquamoon интересно, сколькими способами она может преобразовать исходное состояние квадратика в некоторое заданное конечно состояние. Два способа считаются различными, если последовательности применяемых операций в них различны. Поскольку ответ может быть очень большим, выведите его по модулю modulo \(998\,244\,353\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 2\cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(3\le n \le 500\)).

В \(i\)-й из следующих \(n\) строк содержится \(n\) целых чисел \(a_{i1}, \ldots, a_{in}\), которые задают \(i\)-ю строчку исходной матрицы (\(1 \le a_{ij} \le n^2\)).

В \(i\)-й из следующих \(n\) строк содержится \(n\) целых чисел \(b_{i1}, \ldots, b_{in}\), которые задают \(i\)-ю строчку конечной матрицы (\(1 \le b_{ij} \le n^2\)).

Гарантируется, что элементы исходной матрицы, а также элементы конечной матрицы, образуют перестановки чисел \(1, \ldots, n^2\).

Гарантируется, что сумма значений \(n^2\) по всем наборам входных данных не превосходит \(250\,000\).

Выходные данные

Для каждого набора входных данных, если возможно преобразовать начальное состояние в конечное, соблюдая все условия, то выведите одно число — число способов это сделать по модулю \(998\,244\,353\).

Если решения не существует, выведите одно целое число \(0\).

Примечание

В первом наборе входных данных единственный способ преобразовать исходную матрицу в конечную — сдвинуть вторую строку на \(1\) вправо, а затем сдвинуть первый столбец на \(1\) вниз.

Во втором наборе входных данных можно показать, что нет ни одного корректного способа преобразовать матрицу, так что ответ равен \(0\).

K. Keen Tree Calculation

Бинарный поиск геометрия графы Деревья дп реализация Структуры данных *2500

There is a tree of \(N\) vertices and \(N-1\) edges. The \(i\)-th edge connects vertices \(U_i\) and \(V_i\) and has a length of \(W_i\).

Chaneka, the owner of the tree, asks you \(Q\) times. For the \(j\)-th question, the following is the question format:

  • \(X_j\) \(K_j\) – If each edge that contains vertex \(X_j\) has its length multiplied by \(K_j\), what is the diameter of the tree?

Notes:

  • Each of Chaneka's question is independent, which means the changes in edge length do not influence the next questions.
  • The diameter of a tree is the maximum possible distance between two different vertices in the tree.
Input

The first line contains a single integer \(N\) (\(2\leq N\leq10^5\)) — the number of vertices in the tree.

The \(i\)-th of the next \(N-1\) lines contains three integers \(U_i\), \(V_i\), and \(W_i\) (\(1 \leq U_i,V_i \leq N\); \(1\leq W_i\leq10^9\)) — an edge that connects vertices \(U_i\) and \(V_i\) with a length of \(W_i\). The edges form a tree.

The \((N+1)\)-th line contains a single integer \(Q\) (\(1\leq Q\leq10^5\)) — the number of questions.

The \(j\)-th of the next \(Q\) lines contains two integers \(X_j\) and \(K_j\) as described (\(1 \leq X_j \leq N\); \(1 \leq K_j \leq 10^9\)).

Output

Output \(Q\) lines with an integer in each line. The integer in the \(j\)-th line represents the diameter of the tree on the \(j\)-th question.

Note

In the first example, the following is the tree without any changes.

The following is the tree on the \(1\)-st question.

The maximum distance is between vertices \(6\) and \(7\), which is \(6+6+6=18\), so the diameter is \(18\).

The following is the tree on the \(2\)-nd question.

The maximum distance is between vertices \(2\) and \(6\), which is \(3+2+6=11\), so the diameter is \(11\).

D. Циклические операции

графы жадные алгоритмы Конструктив Перебор поиск в глубину и подобное реализация *1800

У Егора был массив \(a\) длины \(n\), изначально состоящий из нулей. Однако он захотел сделать из него другой массив \(b\) длины \(n\).

Поскольку Егор не ищет легких путей, разрешено использовать только такую операцию (возможно ноль или несколько раз):

  • выбрать массив \(l\) длины \(k\) (\(1 \leq l_i \leq n\), все \(l_i\) различны) и поменять каждый элемент \(a_{l_i}\) на \(l_{(i\%k)+1}\) (\(1 \leq i \leq k\)).

Ему стало интересно, а можно ли вообще получить массив \(b\) с помощью таких операций. Поскольку Егор еще только начинающий программист, он попросил Вас помочь ему решить эту задачу.

Операция \(\%\) означает взятие по модулю, то есть \(a\%b\) равно остатку от деления числа \(a\) на число \(b\).

Входные данные

В первой строке входных данных дано целое число \(t\) (\(1 \leq t \leq 10^5\)) - количество наборов входных данных.

Каждый набор состоит из двух строк. В первой строке даны целые числа \(n\) и \(k\) (\(1 \leq k \leq n \leq 10^5\)).

Во второй строке вводится массив \(b_1, b_2, \ldots, b_n\) (\(1 \leq b_i \leq n\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если существует способ получить массив \(b\), используя только заданную операцию. Иначе выведите «NO» (без кавычек). Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Рассмотрим первый пример:

  • Применим операцию с \(l\) = \([1,2,3]\). Теперь \(a\) = \([2,3,1,0,0]\).
  • Применим операцию с \(l\) = \([3,5,4]\). Теперь \(a\) = \([2,3,5,3,4]\) = \(b\).
Мы видим, что получить массив \(b\) можно. Следовательно ответ YES.

Во втором примере можно доказать, что массив \(b\) получить нельзя, следовательно ответ NO.

A. Заполните матрицу

Конструктив реализация *1300

Имеется пустая матрица \(M\) размера \(n\times m\).

Экзамен закончился, и Daniel хотел бы заняться головоломками. Он собирается заполнить матрицу \(M\) перестановками длины \(m\). То есть каждая строка \(M\) должна быть перестановкой длины \(m^\dagger\).

Определим значение \(i\)-го столбца в \(M\) как \(v_i=\operatorname{MEX}(M_{1,i},M_{2,i},\ldots,M_{n,i})^\ddagger\). Поскольку Daniel любит разнообразие, то красота \(M\) равна \(s=\operatorname{MEX}(v_1,v_2,\cdots,v_m)\).

Вы должны помочь Daniel заполнить матрицу \(M\) и максимизировать её красоту.

\(^\dagger\) Перестановка длины \(m\) — это массив, состоящий из \(m\) различных целых чисел от \(0\) до \(m-1\), расположенных в произвольном порядке. Например, \([1,2,0,4,3]\) является перестановкой, но \([0,1,1]\) не является перестановкой (\(1\) встречается в массиве дважды), и \([0,1,3]\) также не является перестановкой (\(m-1=2\), но в массиве есть \(3\)).

\(^\ddagger\) \(\operatorname{MEX}\) массива — это наименьшее неотрицательное целое число, не принадлежащее массиву. Например, \(\operatorname{MEX}(2,2,1)=0\), так как \(0\) не принадлежит массиву, и \(\operatorname{MEX}(0,3,1,2)=4\), так как \(0\), \(1\), \(2\) и \(3\) в массиве есть, а \(4\) нет.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\le t\le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1\le n,m\le 2\cdot 10^5\)) — размер матрицы.

Гарантируется, что сумма \(n\cdot m\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных в первой строке выведите одно целое число — максимальную красоту \(M\).

Затем выведите матрицу \(M\) размера \(n\times m\) — матрицу, которую вы нашли.

Если существует несколько решений, вы можете вывести любое из них.

Примечание

В первом наборе входных данных:

  • \(v_1=\operatorname{MEX}(1,0,1,0)=2\);
  • \(v_2=\operatorname{MEX}(0,2,0,2)=1\);
  • \(v_3=\operatorname{MEX}(2,1,2,1)=0\).

Таким образом, \(s=\operatorname{MEX}(2,1,0)=3\).

Можно доказать, что \(3\) является максимально возможной красотой \(M\).

Во втором наборе входных данных при любой перестановке \(s=2\).

В третьем наборе входных данных:

  • \(v_1=\operatorname{MEX}(3,5,1,4,4,2)=0\);
  • \(v_2=\operatorname{MEX}(0,2,3,1,2,4)=5\);
  • \(v_3=\operatorname{MEX}(1,1,2,3,5,0)=4\);
  • \(v_4=\operatorname{MEX}(4,0,4,2,3,5)=1\);
  • \(v_5=\operatorname{MEX}(2,4,5,5,0,1)=3\);
  • \(v_6=\operatorname{MEX}(5,3,0,0,1,3)=2\).

Таким образом, \(s=\operatorname{MEX}(0,5,4,1,3,2)=6\).

B1. Конфетная вечеринка (простая версия)

битмаски графы жадные алгоритмы Конструктив математика реализация *1700

Это простая версия задачи. Единственное отличие состоит в том, что в этой версии каждый должен дать конфеты ровно одному человеку и получить конфеты ровно от одного человека. Обратите внимание, что посылка не может пройти обе версии задачи одновременно. Вы можете делать взломы, только если обе версии задачи решены.

После экзамена Daniel и его друзья собираются устроить вечеринку. Все придут с конфетами.

На вечеринке будут присутствовать \(n\) человек. Изначально у \(i\)-го человека есть \(a_i\) конфет. Во время вечеринки они будут обмениваться конфетами. Для этого они выстроятся в произвольном порядке и каждый из них сделает следующее ровно один раз:

  • Выберет целое число \(p\) (\(1 \le p \le n\)) и неотрицательное целое число \(x\), затем даст \(2^{x}\) конфет \(p\)-му человеку. Заметим, что человек не может отдать больше конфет, чем у него есть в данный момент (он мог получить конфеты от кого-то другого), и он не может отдать конфеты самому себе.

Daniel любит справедливость, поэтому он будет счастлив тогда и только тогда, когда каждый получит конфеты от ровно одного человека. В то же время его друг Tom любит среднее, поэтому он будет счастлив тогда и только тогда, когда у всех людей будет одинаковое количество конфет после всех обменов.

Определите, существует ли способ обменяться конфетами так, чтобы Daniel и Tom были счастливы после обменов.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\le t\le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2\le n\le 2\cdot 10^5\)) — количество человек на вечеринке.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1\le a_i\le 10^9\)) — количество конфет у каждого человека.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «Yes» (без кавычек), если существует способ обменяться конфетами так, чтобы Daniel и Tom были счастливы, и выведите «No» (без кавычек) в противном случае.

Вы можете вывести ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes», и «YES» будут распознаны как положительный ответ.

Примечание

В первом наборе входных данных:

  • Первый человек даёт \(1\) конфету третьему человеку;
  • Второй человек даёт \(2\) конфеты первому человеку;
  • Третий человек даёт \(1\) конфету второму человеку.

Тогда у всех трёх человек есть по \(3\) конфеты.

Во втором наборе входных данных:

  • Пятый человек даёт \(4\) конфеты первому человеку, и теперь у первого человека есть \(5\) конфет;
  • Первый человек даёт \(2\) конфеты третьему человеку;
  • Третий человек даёт \(2\) конфеты пятому человеку;
  • Четвёртый человек даёт \(2\) конфеты второму человеку;
  • Второй человек даёт \(1\) конфету четвёртому человеку.

Тогда у всех трёх людей есть по \(3\) конфеты. Обратите внимание, что вначале первый человек не может дать \(2\) конфеты третьему человеку, потому что у него есть только \(a_1=1\) конфета. Но после того, как пятый человек дал ему \(4\) конфеты, он может это сделать, потому что сейчас у него есть \(1+4=5\) конфет.

В третьем наборе входных данных невозможно сделать так, чтобы у всех людей было одинаковое количество конфет.

В четвёртом наборе входных данных первый человек даёт второму человеку \(1024\) конфеты, и второй также даёт \(1024\) конфеты первому человеку.

B2. Конфетная вечеринка (сложная версия)

битмаски дп жадные алгоритмы Конструктив математика реализация *2100

Это сложная версия задачи. Единственное отличие состоит в том, что в этой версии каждый должен дать конфеты не более чем одному человеку и получить конфеты не более чем от одного человека. Обратите внимание, что посылка не может пройти обе версии задачи одновременно. Вы можете делать взломы, только если обе версии задачи решены.

После экзамена Daniel и его друзья собираются устроить вечеринку. Все придут с конфетами.

На вечеринке будут присутствовать \(n\) человек. Изначально у \(i\)-го человека есть \(a_i\) конфет. Во время вечеринки они будут обмениваться конфетами. Для этого они выстроятся в произвольном порядке и каждый из них сделает следующее не более одного раза:

  • Выберет целое число \(p\) (\(1 \le p \le n\)) и неотрицательное целое число \(x\), затем даст \(2^{x}\) конфет \(p\)-му человеку. Заметим, что человек не может отдать больше конфет, чем у него есть в данный момент (он мог получить конфеты от кого-то другого), и он не может отдать конфеты самому себе.

Daniel любит справедливость, поэтому он будет счастлив тогда и только тогда, когда каждый получит конфеты от не более чем одного человека. В то же время его друг Tom любит среднее, поэтому он будет счастлив тогда и только тогда, когда у всех людей будет одинаковое количество конфет после всех обменов.

Определите, существует ли способ обменяться конфетами так, чтобы Daniel и Tom были счастливы после обменов.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\le t\le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2\le n\le 2\cdot 10^5\)) — количество человек на вечеринке.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1\le a_i\le 10^9\)) — количество конфет у каждого человека.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «Yes» (без кавычек), если существует способ обменяться конфетами так, чтобы Daniel и Tom были счастливы, и выведите «No» (без кавычек) в противном случае.

Вы можете вывести ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes», и «YES» будут распознаны как положительный ответ.

Примечание

В первом наборе входных данных второй человек даёт \(1\) конфету первому человеку, поэтому у всех людей есть по \(3\) конфеты.

Во втором наборе входных данных четвёртый человек даёт \(1\) конфету второму человеку, пятый человек даёт \(2\) конфеты первому человеку, третий человек ничего не делает. После всех обменов у каждого есть по \(3\) конфеты.

В третьем наборе входных данных невозможно сделать так, чтобы у всех людей было одинаковое количество конфет.

В четвёртом наборе входных данных двум людям не нужно ничего делать.

C. План путешествия

Деревья дп Комбинаторика математика реализация *2400

Во время летних каникул после экзамена, Tom и Daniel планировали отправиться в путешествие.

В их стране есть \(n\) городов, пронумерованных от \(1\) до \(n\). И система дорожного движения в стране особенная. Для любого города \(i\) (\(1 \le i \le n\)) есть:

  • дорога между городами \(i\) и \(2i\), если \(2i\le n\);
  • дорога между городами \(i\) и \(2i+1\), если \(2i+1\le n\).

Составляя план путешествия, Daniel выбирает некоторое целое значение от \(1\) до \(m\) для каждого города, для \(i\)-го города обозначим его \(a_i\).

Пусть \(s_{i,j}\) равно максимальному значению для городов на простом\(^\dagger\) пути между городами \(i\) и \(j\). Тогда оценка плана путешествия равна \(\sum_{i=1}^n\sum_{j=i}^n s_{i,j}\).

Tom хочет знать сумму оценок всех возможных планов путешествия. Daniel просит вас помочь ему найти её. Вам нужно сказать ответ по модулю \(998\,244\,353\).

\(^\dagger\) Простым путём между городами \(x\) и \(y\) называется путь между ними, который проходит по каждому городу не более одного раза.

Входные данные

Первая строка входных данных содержит единственное целое число \(t\) (\(1\le t\le 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1\leq n\leq 10^{18}\), \(1\leq m\leq 10^5\)) — количество городов и максимальное значение для города.

Гарантируется, что сумма \(m\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — сумму оценок всех возможных планов путешествия по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных есть только один возможный план путешествия:

Путь \(1\rightarrow 1\): \(s_{1,1}=a_1=1\).

Путь \(1\rightarrow 2\): \(s_{1,2}=\max(1,1)=1\).

Путь \(1\rightarrow 3\): \(s_{1,3}=\max(1,1)=1\).

Путь \(2\rightarrow 2\): \(s_{2,2}=a_2=1\).

Путь \(2\rightarrow 1\rightarrow 3\): \(s_{2,3}=\max(1,1,1)=1\).

Путь \(3\rightarrow 3\): \(s_{3,3}=a_3=1\).

Оценка равна \(1+1+1+1+1+1=6\).

Во втором наборе входных данных есть четыре возможных плана путешествия:

Оценка плана \(1\): \(1+1+1=3\).

Оценка плана \(2\): \(1+2+2=5\).

Оценка плана \(3\): \(2+2+1=5\).

Оценка плана \(4\): \(2+2+2=6\).

Таким образом, сумма оценок равна \(3+5+5+6=19\).

D. Цветочное псевдодерево

графы Деревья жадные алгоритмы Конструктив реализация *3000

Псевдодеревом называется связный граф, который имеет ровно один цикл и не имеет петель. Обратите внимание, что псевдодерево может содержать кратные рёбра. Можно доказать, что псевдодерево с \(n\) вершинами всегда содержит \(n\) рёбер.

После удаления всех рёбер на цикле в псевдодереве образуется лес\(^{\dagger}\). Можно доказать, что каждое дерево в лесу будет содержать ровно одну вершину, которая находится на цикле до удаления рёбер. Если все деревья в лесу имеют одинаковую глубину\(^{\ddagger}\) при выборе вершины на цикле в качестве корня, мы называем исходное псевдодерево цветочным.

У нашего друга sszcdjr, было цветочное псевдодерево с \(n\) вершинами и \(n\) рёбрами. Однако, он забыл все рёбра в псевдодереве. К счастью, он все ещё помнит степени вершин. В частности, степень \(i\)-й вершины равна \(d_i\).

Вы должны помочь sszcdjr построить возможное цветочное псевдодерево с \(n\) вершинами, где степень \(i\)-й вершины строго равна \(d_i\), или сообщить ему, что это невозможно.

\(^{\dagger}\) Лесом называется граф, в котором все компоненты связности являются деревьями. Деревом называется связный граф без циклов и петель.

\(^{\ddagger}\) Глубиной дерева с корнем называется максимальное расстояние от корня до вершины этого дерева.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\leq t\leq 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2\leq n\leq 10^6\)) — количество вершин.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(d_1,d_2,\ldots,d_n\) (\(1\leq d_i\leq n\)) — степень каждой вершины.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^6\).

Выходные данные

Для каждого набора входных данных, если существует возможное цветочное псевдодерево:

  • Выведите «Yes» (без кавычек) в первой строке.
  • Затем выведите \(n\) строк, в каждой строке выведите два целых числа \(u_i\) и \(v_i\) — две вершины, которые соединяет \(i\)-е ребро.

Если есть несколько ответов, вы можете вывести любой из них.

В противном случае, выведите «No» (без кавычек) в единственной строке вывода.

Вы можете выводить первую строку для каждого набора входных данных в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительные ответы.

Примечание

В первом наборе входных данных единственным возможным цветочным псевдодеревом является:

После удаления всех рёбер на цикле в псевдодереве каждое дерево имеет глубину \(0\).

Во втором наборе входных данных можно доказать, что не существует такого цветочного псевдодерева.

В третьем наборе входных данных одним из возможных цветочных псевдодеревьев является:

F. НСП?

жадные алгоритмы реализация Структуры данных *3500

Став старшеклассником, Tom увлекся задачами о массивах, причем не только задачей о наибольшей возрастающей подпоследовательности, но и задачей о наибольшей сумме на подотрезке. Он получил от своего друга Daniel очень интересную задачу. Однако ему кажется, что она очень сложная, поэтому он просит вас помочь.

Дан массив \(a\), состоящий из \(n\) целых чисел.

За одну операцию нужно сделать следующее:

  • Выбрать подотрезок \([l,r]\) (\(1\le l\le r\le n\)) такой, что сумма на этом подотрезке наибольшая среди всех подотрезков в массиве \(a\). Более формально, \(\displaystyle\sum_{i=l}^r a_i=\max_{1\le l'\le r'\le n}\sum_{i=l'}^{r'} a_i\).
  • Затем вычесть \(1\) из всех элементов \(a_l,a_{l+1},\ldots,a_r\).

Найдите минимальное количество операций, которые нужно выполнить, чтобы сделать \(a_i<0\) для всех \(1\le i\le n\).

Входные данные

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 5 \cdot 10^5\)) — длину массива \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(-10^6\le a_i\le 10^6\)) — элементы массива \(a\).

Выходные данные

Выведите одно целое число — минимальное количество операций.

Примечание

В первом примере вы можете выполнить операции на подотрезках \([1,5],[1,5],[2,5],[3,5],[4,5],[5,5]\) в таком порядке. Ещё вы можете выполнить операции на подотрезках \([1,5],[2,5],[3,5],[4,5],[5,5],[1,5]\) в таком порядке.

Во втором примере уже выполнено условие \(a_i<0\) для всех \(1\le i\le n\). Поэтому вам не нужно выполнять никаких операций.

C. Разноцветная таблица

Бинарный поиск дп математика реализация Структуры данных *1300

Вам даны два целых числа \(n\) и \(k\). Также вам дан массив целых чисел \(a_1, a_2, \ldots, a_n\) размера \(n\). Известно, что для всех \(1 \leq i \leq n\) верно, что \(1 \leq a_i \leq k\).

Определим двумерный массив \(b\) размера \(n \times n\) так: \(b_{i, j} = \min(a_i, a_j)\). Представим массив \(b\) как квадрат, где верхняя левая клетка — это \(b_{1, 1}\), строки нумеруются сверху вниз от \(1\) до \(n\), столбцы — слева направо от \(1\) до \(n\). Назовём цветом клетки число, которое в ней записано (для клетки с координатами \((i, j)\) это \(b_{i, j}\)).

Для каждого цвета от \(1\) до \(k\) найдём минимальный прямоугольник в массиве \(b\), содержащий все клетки этого цвета. Выведите сумму ширины и высоты этого прямоугольника.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \leq n, k \leq 10^5\)) — размер массива \(a\), а также количество цветов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq k\)) — массив \(a\).

Гарантируется, что суммы значений \(n\) и \(k\) по всем наборам входных данных не превосходят \(10^5\).

Выходные данные

На каждый набор входных данных выведите \(k\) чисел: сумму ширины и высоты минимального прямоугольника, содержащего все клетки одного цвета, для цветов от \(1\) до \(k\).

Примечание

В первом наборе входных данных весь массив \(b\) состоит из цвета \(1\), поэтому минимальный прямоугольник для цвета \(1\) имеет размер \(2 \times 2\), сумма его сторон это \(4\).

Во втором наборе входных данных массив \(b\) выглядит так:

11
12

Одна из угловых клеток имеет цвет \(2\), три остальные клетки имеют цвет \(1\). Поэтому для цвета \(1\) минимальный прямоугольник имеет размер \(2 \times 2\), а для цвета \(2\)\(1 \times 1\).

В последнем наборе входных данных \(b\) выглядит так:

11111
12221
12321
12221
11111

D. Покупка префиксов

жадные алгоритмы реализация сортировки *1800

У вас есть массив \(a\) размера \(n\), изначально заполненный нулями (\(a_1 = a_2 = \ldots = a_n = 0\)). Также у вас есть массив целых чисел \(c\) размера \(n\).

Изначально у вас есть \(k\) монет. Заплатив \(c_i\) монет, вы можете прибавить \(1\) ко всем элементам массива \(a\) с первого по \(i\)-й (\(a_j \mathrel{+}= 1\) для всех \(1 \leq j \leq i\)). Покупать любое \(c_i\) можно произвольное число раз. Покупка возможна только при \(k \geq c_i\), то есть в любой момент должно выполняться \(k \geq 0\).

Найдите лексикографически наибольший массив \(a\), который возможно получить.

Массив \(a\) лексикографически меньше массива \(b\) такой же длины, если и только если в первой позиции, где \(a\) и \(b\) различны, в массиве \(a\) элемент меньше, чем соответствующий элемент в \(b\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — размер массивов \(a\) и \(c\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \leq c_i \leq 10^9\)) — массив \(c\).

Третья строка каждого набора входных данных содержит одно целое число \(k\) (\(1 \leq k \leq 10^9\)) — количество монет, которое у вас есть.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) — лексикографически наибольший массив \(a\), который можно получить.

Примечание

В первом наборе входных данных \(a_1\) не может быть больше \(5\), а если пять раз купить \(c_1\), то у нас не останется денег, поэтому \(a = [5, 0, 0]\).

Во втором наборе входных данных \(a_1\) не может быть больше \(2\), при этом мы можем купить \(c_1\) и \(c_2\) по одному разу (купить \(c_2\) дважды не получится), поэтому \(a = [2, 1]\).

B. Коридор или туда и обратно

жадные алгоритмы реализация *900

Вы находитесь в бесконечном коридоре, который простирается бесконечно вправо и разделен на квадратные комнаты. Вы начинаете в комнате \(1\), перемещаетесь в комнату \(k\) и затем возвращаетесь в комнату \(1\). Вы можете выбрать значение \(k\). Переход в соседнюю комнату занимает \(1\) секунду.

Кроме того, в коридоре находится \(n\) ловушек: \(i\)-я ловушка находится в комнате \(d_i\) и активируется через \(s_i\) секунд после вашего входа в комнату \(\boldsymbol{d_i}\). После активации ловушки вы не можете ни войти в комнату с этой ловушкой, ни выйти из неё.

Схематическое изображение возможного коридора и вашего пути к комнате \(k\) и обратно.

Определите максимальное значение \(k\), которое позволяет вам безопасно переместиться из комнаты \(1\) в комнату \(k\) и затем вернуться в комнату \(1\).

Например, если \(n=1\) и \(d_1=2, s_1=2\), вы можете переместиться в комнату \(k=2\) и вернуться безопасно (ловушка активируется в момент \(1+s_1=1+2=3\), она не может помешать вам вернуться назад). Но если вы попытаетесь достичь комнаты \(k=3\), ловушка активируется в момент \(1+s_1=1+2=3\), что помешает вашему возвращению (вы попытаетесь войти в комнату \(2\) на обратном пути в \(3\) секунду, но активированная ловушка заблокирует вас). Любое большее значение для \(k\) также невозможно. Таким образом, ответом является \(k=2\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит целое число \(n\) (\(1 \le n \le 100\)) — количество ловушек.

Следующие \(n\) строк каждого набора содержат по два целых числа \(d_i\) и \(s_i\) (\(1 \le d_i, s_i \le 200\)) — параметры ловушки (вы должны покинуть комнату \(d_i\) строго до того, как пройдет \(s_i\) секунд с момента входа в эту комнату). Возможно, что несколько ловушек могут находиться в одной комнате (значения \(d_i\) могут повторяться).

Выходные данные

Для каждого набора входных данных выведите максимальное значение \(k\), которое позволяет вам переместиться в комнату \(k\) и вернуться в комнату \(1\) без столкновения с активной ловушкой.

Примечание

Первый набор входных данных примера разобран в условии задачи выше.

Во втором наборе входных данных вторая ловушка мешает вам достигнуть \(k\ge6\). Если \(k\ge6\), вторая ловушка активируется в момент \(3+s_2=3+3=6\) (время, когда вы входите в комнату \(4\) плюс \(s_2\)). В случае \(k\ge6\) вы вернетесь в комнату \(4\) в момент времени \(7\) или позже. Ловушка будет активна в это время. Можно показать, что комната \(k=5\) может быть достигнута без столкновения с активной ловушкой.

В третьем наборе входных данных примера вы можете добраться до комнаты \(299\) и сразу вернуться в комнату \(1\).

F. Продажа зверинца

графы математика поиск в глубину и подобное реализация снм *1800

Вы владелец зверинца, состоящего из \(n\) животных пронумерованных от \(1\) до \(n\). Однако содержать зверинец достаточно затратно, поэтому вы решили его продать!

Известно, что каждое животное боится ровно одного другого животного. А точнее, животное \(i\) боится животного \(a_i\) (\(a_i \neq i\)). Также для каждого животного известна его стоимость, для животного \(i\) она равняется \(c_i\).

Вы будете продавать всех своих животных в каком-то зафиксированном порядке. Формально, вам надо будет выбрать некоторую перестановку\(^\dagger\) \(p_1, p_2, \ldots, p_n\), и продать сначала животное \(p_1\), потом животное \(p_2\), и так далее, последним продав животное \(p_n\).

Когда вы продаёте животное \(i\), есть два варианта развития событий:

  • Если животное \(a_i\) было продано раньше чем животное \(i\), вы получаете \(c_i\) денег за продажу животного \(i\).
  • Если животное \(a_i\) не было продано раньше чем животное \(i\), вы получаете \(2 \cdot c_i\) денег за продажу животного \(i\). (Удивительно, но животные, которые боятся в текущий момент имеют большую ценность).

Ваша задача — выбрать порядок продажи животных так, чтобы максимизировать суммарную прибыль.

Например, если \(a = [3, 4, 4, 1, 3]\), \(c = [3, 4, 5, 6, 7]\) и выбранная вами перестановка равна \([4, 2, 5, 1, 3]\), то:

  • Первым продаётся животное \(4\). Животное \(a_4 = 1\) не было продано ранее, а значит, вы получаете \(2 \cdot c_4 = 12\) денег за продажу.
  • Вторым продаётся животное \(2\). Животное \(a_2 = 4\) было продано ранее, а значит, вы получаете \(c_2 = 4\) денег за продажу.
  • Третьим продаётся животное \(5\). Животное \(a_5 = 3\) не было продано ранее, а значит, вы получаете \(2 \cdot c_5 = 14\) денег за продажу.
  • Четвёртым продаётся животное \(1\). Животное \(a_1 = 3\) не было продано ранее, а значит, вы получаете \(2 \cdot c_1 = 6\) денег за продажу.
  • Пятым продаётся животное \(3\). Животное \(a_3 = 4\) было продано ранее, а значит, вы получаете \(c_3 = 5\) денег за продажу.

Ваша суммарная прибыль при таком выборе перестановки, равна \(12 + 4 + 14 + 6 + 5 = 41\). Обратите внимание, что \(41\) — не максимально возможная прибыль в этом примере.

\(^\dagger\) Перестановкой длины \(n\) называется массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) является перестановкой, но \([1,2,2]\) не является перестановкой (\(2\) встречается дважды в массиве) и \([1,3,4]\) тоже не является перестановкой (\(n=3\), но в массиве присутствует \(4\)).

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит целое число \(n\) (\(2 \le n \le 10^5\)) — количество животных.

Вторая строка набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\), \(a_i \neq i\)) — \(a_i\) означает номер животного, которого боится животное \(i\).

Третья строка набора входных данных содержит \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le 10^9\)) — стоимости животных.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(10^5\).

Выходные данные

Выведите \(t\) строк, каждая из которых содержит ответ на соответствующий набор входных данных. В качестве ответа выведите \(n\) целых чисел — перестановку \(p_1, p_2, \ldots, p_n\), обозначающую, в каком порядке нужно продавать животных, чтобы максимизировать прибыль. Если есть несколько возможных ответов, можно вывести любой из них.

A. Короткая сортировка

Перебор реализация *800

Есть три карты с буквами \(\texttt{a}\), \(\texttt{b}\), \(\texttt{c}\), расположенные в ряд в некотором порядке. Вы можете выполнить следующую операцию не более одного раза:

  • Выберите две карты и поменяйте их местами.
Возможно ли, чтобы ряд стал \(\texttt{abc}\) после выполнения операции? Выведите «YES», если это возможно, и «NO» в противном случае.
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 6\)) — количество наборов входных данных.

Единственная строка каждого набора содержит одну строку, состоящую из трех символов \(\texttt{a}\), \(\texttt{b}\) и \(\texttt{c}\) ровно по одному, представляющих карты.

Выходные данные

Для каждого набора входных данных выведите «YES», если вы можете сделать ряд \(\texttt{abc}\) с помощью не более одной операции, или «NO» в противном случае.

Вы можете вывести ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных примера нам не нужно выполнять никаких операций, так как ряд уже \(\texttt{abc}\).

Во втором наборе входных данных примера мы можем поменять местами \(\texttt{c}\) и \(\texttt{b}\): \(\texttt{acb} \to \texttt{abc}\).

В третьем наборе входных данных примера мы можем поменять местами \(\texttt{b}\) и \(\texttt{a}\): \(\texttt{bac} \to \texttt{abc}\).

В четвертом наборе входных данных примера невозможно получить \(\texttt{abc}\) с помощью не более одной операции.

C. Стрельба по мишени

математика реализация *800

Мишень размером \(10 \times 10\) состоит из пяти «колец», как показано на рисунке. Попадание в каждое кольцо даёт разное количество очков: внешнее кольцо — 1 очко, следующее кольцо — 2 очка, ..., центральное кольцо — 5 очков.

Влад выпустил несколько стрел по мишени. Помогите ему определить, сколько очков он набрал.

Входные данные

Ввод содержит несколько наборов входных данных. Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Каждый набор состоит из 10 строк, каждая из которых содержит 10 символов. Каждый символ в сетке может быть либо \(\texttt{X}\) (обозначает попадание стрелы), либо \(\texttt{.}\) (обозначает промах).

Выходные данные

Для каждого набора входных данных выведите одно целое число — общее количество очков.

Примечание

В первом примере на внешнем кольце находятся три стрелы, каждая из которых стоит 1 очко, на следующем кольце находятся две стрелы, каждая из которых стоит 3 очка, и на следующем кольце находятся две стрелы, каждая из которых стоит 4 очка. Общий счет равен \(3 \times 1 + 2 \times 3 + 2 \times 4 = 17\).

Во втором примере стрел нет, поэтому счет равен \(0\).

D. 1D Ластик

жадные алгоритмы реализация *800

У вас есть полоска бумаги \(s\), которая имеет длину \(n\) ячеек. Каждая ячейка может быть либо черной, либо белой. За одну операцию вы можете выбрать любые \(k\) последовательных ячеек и сделать их все белыми.

Найдите минимальное количество операций, необходимых для удаления всех черных ячеек.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \leq k \leq n \leq 2 \cdot 10^5\)) — длина полоски бумаги и целое число, используемое в операции.

Вторая строка каждого набора содержит строку \(s\) длиной \(n\), состоящую из символов \(\texttt{B}\) (представляющего черную ячейку) и \(\texttt{W}\) (представляющего белую ячейку).

Сумма \(n\) по всем тестам не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для удаления всех черных ячеек.

Примечание

В первом наборе входных данных примера вы можете выполнить следующие операции: \(\)\color{red}{\texttt{WBW}}\texttt{WWB} \to \texttt{WWW}\color{red}{\texttt{WWB}} \to \texttt{WWWWWW}\(\)

Во втором наборе входных данных примера вы можете выполнить следующие операции: \(\)\texttt{WW}\color{red}{\texttt{BWB}}\texttt{WW} \to \texttt{WWWWWWW}\(\)

В третьем наборе входных данных примера вы можете выполнить следующие операции: \(\)\texttt{B}\color{red}{\texttt{WBWB}} \to \color{red}{\texttt{BWWW}}\texttt{W} \to \texttt{WWWWW}\(\)

A. Медуза и игра

жадные алгоритмы игры Перебор реализация *1200

У Медузы есть \(n\) зеленых яблок со значениями \(a_1, a_2, \dots, a_n\), а у Гедузы есть \(m\) зеленых яблок со значениями \(b_1,b_2,\ldots,b_m\).

Они будут играть в игру, состоящую из \(k\) раундов. Для \(i=1,2,\ldots,k\) в этом порядке они будут выполнять следующие действия:

  • Если \(i\) нечетное, то Медуза может поменять одно свое яблоко на одно яблоко Гедузы или ничего не делать.
  • Если \(i\) четное, то Гедуза может поменять одно из своих яблок на одно из яблок Медузы или ничего не делать.

Оба игрока хотят максимизировать сумму стоимостей своих яблок.

Поскольку вы — один из самых умных людей в мире, Медуза хочет, чтобы вы сообщили ей окончательную сумму стоимости ее яблок после всех \(k\) раундов игры. Предположим, что и Медуза, и Гедуза играют оптимально, стремясь максимизировать сумму стоимостей своих яблок.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указывается количество наборов входных данных \(t\) (\(1 \leq t \leq 2000\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа, \(n\), \(m\) и \(k\) (\(1 \leq n, m \leq 50\), \(1 \leq k \leq 10^9\)) — количество зеленых яблок у Медузы, количество зеленых яблок у Гедузы и количество раундов игры соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq 10^9\)) — значения зеленых яблок Медузы.

Третья строка каждого набора входных данных содержит \(m\) целых чисел \(b_1, b_2, \dots, b_m\) (\(1 \leq b_i \leq 10^9\)) — значения зеленых яблок Гедузы.

Заметим, что суммы \(n\) и \(m\) по всем наборам входных данных не ограничены.

Выходные данные

Для каждого набора входных данных выведите одно целое число — конечную сумму значений яблок Медузы.

Примечание

В первом наборе входных данных Медуза поменяет местами яблоки стоимостью \(1\) и \(4\).

Во втором наборе входных данных оба игрока поменяют местами два яблока \(10,000\) раз.

В четвертом наборе входных данных Медуза ничего не будет делать.

G. Дерево wxhtzdy ORO

Бинарный поиск битмаски Деревья Перебор поиск в глубину и подобное реализация Структуры данных *2300

После (наконец-то) прохождения отбора на IOI 2023, wxhtzdy был очень счастлив и решил сделать то, что делают многие люди: попытаться угадать задачи, которые будут на IOI. В процессе этого он случайно создал задачу, которая, по его мнению, была очень крутой.

Дано дерево (связный ациклический граф) с \(n\) вершинами и \(n-1\) ребром. Вершине \(i\) (\(1 \le i \le n\)) соответствует значение \(a_i\). Пусть \(g(u, v)\) - это побитовое ИЛИ значений всех вершин на кратчайшем пути от \(u\) до \(v\). Например, если мы хотим вычислить \(g(3, 4)\) на дереве из первого набора данных примера. На пути от \(3\) до \(4\) находятся вершины \(3\), \(1\), \(4\). Тогда \(g(3, 4) = a_3 \ | \ a_1 \ | \ a_4\) (здесь \(|\) обозначает побитовое ИЛИ).

Также дано \(q\) запросов, и каждый запрос выглядит следующим образом:

Вам даны \(x\) и \(y\). Рассмотрим все вершины \(z\) такие, что \(z\) находится на кратчайшем пути от \(x\) до \(y\) (включительно).

Определим красоту вершины \(z\) как сумму количества ненулевых битов в \(g(x, z)\) и количества ненулевых битов в \(g(y, z)\). Вам нужно найти максимальную красоту среди всех вершин \(z\) на кратчайшем пути от \(x\) до \(y\).

Так как его мозг очень устал после решения output only задачи на SIO (он должен был это сделать, чтобы пройти отбор на IOI), он хочет вашей помощи в этой задаче.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество вершин.

Вторая строка каждого набора содержит \(n\) положительных целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_v \le 10^9\)) — значение каждой вершины, \(i\)-е число в этой строке соответствует вершине \(i\).

Следующие \(n - 1\) строк описывают дерево.

Каждая строка содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n, u \ne v\)) указывающие, что вершины \(u\) и \(v\) соединены ребром.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)) — количество запросов.

Следующие \(q\) строк содержат 2 целых числа \(x, y\) (\(1 \le x, y \le n\)) — вершины \(x\) и \(y\) для каждого запроса.

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2 \cdot 10^5\).

Гарантируется, что сумма \(q\) по всем наборам не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) целых чисел, каждое из которых является ответом на соответствующий запрос.

Примечание

На изображении ниже показано дерево из первого набора входных данных второго примера.

Дерево из первого набора входных данных второго примера.

В первом запросе \(x=7\), \(y=5\). Самый короткий путь от \(7\) до \(5\) это \(7-4-2-1-5\).

Давайте вычислим красоту вершины \(7\) на этом пути. У нас есть \(g(7,7)=a_7=10=(1010)_2\) и \(g(5,7)=a_5 \ | \ a_1 \ | \ a_2 \ | \ a_4 \ | \ a_7=10 \ | \ 4 \ | \ 7 \ | \ 4 \ | \ 10=15=(1111)_2\), поэтому ее красота равна \(2 + 4 = 6\).

Теперь давайте вычислим красоту вершины \(4\) на этом пути. У нас есть \(g(7,4)=a_7 \ | \ a_4=10 \ | \ 4=14=(1110)_2\) и \(g(5,4)=a_5 \ | \ a_1 \ | \ a_2 \ | \ a_4=10 \ | \ 4 \ | \ 7 \ | \ 4=15=(1111)_2\), поэтому ее красота равна \(3 + 4 = 7\).

Теперь давайте вычислим красоту вершины \(2\) на этом пути. У нас есть \(g(7,2)=a_7 \ | \ a_4 \ | \ a_2=10 \ | \ 4 \ | \ 7=15=(1111)_2\) и \(g(5,2)=a_5 \ | \ a_1 \ | \ a_2=10 \ | \ 4 \ | \ 7=15=(1111)_2\), поэтому ее красота равна \(4 + 4 = 8\).

Теперь давайте вычислим красоту вершины \(1\) на этом пути. У нас есть \(g(7,1)=a_7 \ | \ a_4 \ | \ a_2 \ | \ a_1=10 \ | \ 4 \ | \ 7 \ | \ 4=15=(1111)_2\) и \(g(5,1)=a_5 \ | \ a_1=10 \ | \ 4=14=(1110)_2\), поэтому ее красота равна \(4 + 3 = 7\).

Наконец, давайте вычислим красоту вершины \(5\) на этом пути. У нас есть \(g(7,5)=a_7 \ | \ a_4 \ | \ a_2 \ | \ a_1 \ | \ a_5=10 \ | \ 4 \ | \ 7 \ | \ 4 \ | \ 10=15=(1111)_2\) и \(g(5,5)=a_5=10=(1010)_2\), поэтому ее красота равна \(4 + 2 = 6\).

Максимальная красота на этом пути у вершины \(2\), и она равна \(8\).

E. Интерактивная игра с раскраской

графы Деревья интерактив Конструктив Перебор поиск в глубину и подобное реализация *2400

Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://cf.m27.workers.dev/blog/entry/45307.

Дано дерево с \(n\) вершинами; вершина \(1\) является корнем дерева. Для каждого \(i \in [2, n]\) вам дан родитель \(i\)-й вершины \(p_i\); для каждой вершины соблюдается \(p_i < i\).

Вам предстоит раскрасить все ребра дерева, используя минимально возможное количество цветов, таким образом, чтобы выиграть в игру на этом дереве (каждое ребро должно быть окрашено в ровно один цвет).

Игра, в которую мы собираемся играть, будет проходить следующим образом. После того как вы раскрасите ребра и выведите их цвета, жюри поместит фишку в одну из вершин дерева (кроме корня). Ваша цель — переместить эту фишку в корень ровно за \(d\) ходов, где \(d\) — расстояние от вершины до корня (расстояние равно количеству ребер на пути). Если фишка достигает корня за \(d\) ходов, вы выигрываете. В противном случае вы проигрываете.

Жюри не сообщит вам, где находится фишка. Вы даже не будете знать значение \(d\) заранее. Однако в начале каждого хода вам будет сообщено, сколько ребер каждого цвета инцидентно текущей вершине (это включает как ребро, ведущее вверх по дереву, так и ребра, ведущие вниз). Вы должны выбрать один из этих цветов, и фишка будет перемещена вдоль ребра выбранного цвета (если есть несколько ребер с этим цветом, жюри выбирает одно из них). После перемещения фишки вам снова будет сообщена та же информация о текущей вершине, и игра продолжается, пока вы не достигнете корня или не сделаете \(d\) ходов, не достигнув корня.

Интерактор для этой задачи является адаптивным. Это означает, что начальная вершина и текущая вершина не фиксированы и могут изменяться «на ходу» в зависимости от вывода вашей программы. Однако состояние игры всегда будет согласовано с информацией, которую вы получаете: всегда будет как минимум одна начальная вершина и как минимум один путь вашей фишки из этой вершины, согласующийся как с информацией о цветах, которую вы получаете, так и с цветами, которые вы выбирали во время ходов.

Входные данные

Первая строка содержит одно целое число \(n\) (\(3 \le n \le 100\)) — количество вершин в дереве.

Вторая строка содержит \(n-1\) целых чисел \(p_2, p_3, \dots, p_n\) (\(1 \le p_i < i\)), где \(p_i\) — родитель \(i\)-й вершины в дереве.

Протокол взаимодействия

Сначала вы должны вывести выбранную вами раскраску ребер следующим образом:

  • в первой строке выведите одно целое число \(k\) (\(1 \le k \le n - 1\)) — количество используемых вами цветов;
  • во второй строке выведите \(n-1\) целых чисел \(c_2, c_3, \dots, c_n\) (\(1 \le c_i \le k\)), где \(c_i\) — цвет ребра, соединяющего вершины \(p_i\) и \(i\).

Затем начинается игра. В начале каждого хода программа жюри выводит что-то одно из следующего:

  • целое число \(1\) на отдельной строке, указывающее, что фишка достигла корня, и вы выиграли;
  • целое число \(-1\) на отдельной строке, указывающее, что вы не достигли корня за \(d\) ходов и проиграли, или вы сделали что-то неправильно (либо раскраска, которую вы предоставили, не соответствует ограничениям, либо ваш предыдущий ход невозможен);
  • или целое число \(0\) на отдельной строке, за которым следует строка, содержащая \(k\) целых чисел \(e_1, e_2, \dots, e_k\), где \(e_i\) — количество ребер с цветом \(i\), инцидентных текущей вершине.

Если вы получаете \(1\) или \(-1\), ваша программа должна немедленно завершиться, в противном случае вердикт для вашей посылки может быть неопределенным. Если вы получаете \(0\), за которым следуют \(k\) целых чисел \(e_1, e_2, \dots, e_k\), вы должны вывести одно целое число, указывающее цвет, который вы выбираете во время хода (конечно, \(e_i\) для этого цвета не должно быть равно \(0\)).

Не забывайте сбрасывать буфер вывода каждый раз, когда что-то выводите!

Примечание

В первом примере каждая вершина от \(2\) до \(n\) соединена с корнем. Поэтому мы можем покрасить все ребра в один цвет \(1\), и когда игра начнется, будет только одно ребро, инцидентное текущей вершине (и оно будет вести к корню).

Во втором примере дерево представляет собой путь из \(4\) вершин. Мы должны покрасить его ребра в разные цвета, потому что можно показать, что у нас нет выигрышной стратегии с двумя цветами.

B. A + Reverse B

*особая задача реализация *1300

Заданы числа a и b. Вычислите сумму чисел a и зеркального отображения b. Зеркальное отображение числа — это число, состоящее из тех же цифр в обратном порядке. Например, зеркальное отображение числа 230 — 32, а числа 0 — 0.

Входные данные

Входные данные содержат два целых числа a и b (0 ≤ a, b ≤ 109), разделенных пробелом. Числа заданы без лидирующих нулей.

Выходные данные

Выведите сумму a и зеркального отображения b.

C. НОК

*особая задача математика реализация *1400

Наименьшее общее кратное (НОК) двух чисел — это наименьшее целое положительное число, которое делится на каждое из этих чисел. Заданы числа a и b. Найдите их НОК.

Входные данные

Входные данные содержат два целых числа a и b (1 ≤ a, b ≤ 103), разделенных пробелом.

Выходные данные

Выведите НОК(a, b).

D. Звездочки

*особая задача реализация *1100

Задано число n. Выведите n строк, i-ая из которых состоит из i символов «*». Нумерация строк начинается с 1.

Входные данные

Единственная строка входных данных содержит целое число n (1 ≤ n ≤ 50).

Выходные данные

Выведите вышеописанный узор.

E. HQ9+

*особая задача реализация *1400

HQ9+ — шуточный язык программирования, состоящий всего из четырех односимвольных команд:

  • «H» печатает «Hello, World!»,
  • «Q» печатает исходный код самой программы целиком (при каждом вызове),
  • «9» печатает текст песни «99 бутылок пива»,
  • «+» увеличивает на единицу значение внутреннего счетчика.

Команды «H» и «Q» воспринимаются только в верхнем регистре. Все символы программы, не являющиеся командами, игнорируются.

Вам дана программа на HQ9+. Определите, будет ли что-то напечатано в результате ее выполнения.

Входные данные

В единственной строке входных данных задана строка p — программа на языке HQ9+. Строка p содержит от 1 до 100 символов, включительно. ASCII-код каждого символа будет от 33 (восклицательный знак) до 126 (тильда), включительно.

Выходные данные

Выведите «YES» (без кавычек), если в результате выполнения программы будет напечатано какое-то сообщение, и «NO» (без кавычек) в противном случае.

Примечание

В первом примере в программе есть только одна команда — «H», которая выводит на печать «Hello, World!».

Во втором примере ни один символ программы не является командой.

F. Двоичная запись

*особая задача реализация *1400

Задано целое положительное число n. Выведите его запись в двоичной системе счисления.

Входные данные

В единственной строке входных данных записано целое число n (1 ≤ n ≤ 106).

Выходные данные

Выведите запись числа n в двоичной системе счисления (без ведущих нулей).

Примечание

В первом примере 5 = 1 * 22 + 0 * 21 + 1 * 20.

G. Сортировка массива

*особая задача реализация *1600

Сортировка массивов чисел традиционно считается прерогативой языков высокого уровня. Но так ли это сложно на самом деле? Отсортируйте заданный массив в порядке неубывания элементов.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — размер массива. Следующие n строк содержат элементы массива, по одному на строку. Все элементы массива — целые числа от 1 до 100, включительно. Числа в массиве могут повторяться.

Выходные данные

Выведите элементы отсортированного массива, разделенные пробелами.

H. Стек

*особая задача Разбор выражений реализация *1800

Рассмотрим стек, который поддерживает выполнение двух типов действий:

  • Добавить заданное число в стек.
  • Извлечь два числа из стека, произвести над ними арифметическую операцию (сложение или умножение) и добавить результат этой арифметической операции в стек.

Вам задана строка, описывающая последовательность действий над стеком. i-ый символ строки соответствует i-ому действию, которое надо выполнить:

  • Если i-й символ является цифрой, то нужно добавить в стек число, соответствующее этой цифре.
  • Если i-й символ «+» или «*», то нужно выполнить арифметическую операцию, соответствующую этому символу.

Изначально стек пуст. Выведите число, которое окажется на вершине стека после выполнения всех заданных действий.

Входные данные

В единственной строке входных данных задана непустая строка действий над стеком, состоящая из символов «+», «*» и цифр (0..9). Длина строки от 1 до 20 символов, включительно.

Гарантируется, что заданная последовательность действий будет корректной, то есть перед выполнением каждой арифметической операции в стеке будет не меньше двух чисел. Кроме того, гарантируется, что числа в стеке никогда не превысят 106.

Выходные данные

Выведите единственное число — верхний элемент стека после выполнения заданных операций.

Примечание

В первом примере действия над стеком эквивалентны вычислению выражения (1+2)*3+6*6.

Во втором примере используется только добавление чисел в стек, и ответом будет последнее добавленное число.

C. Идеальный квадрат

Перебор реализация *1200

У Кристины есть матрица размера \(n\) на \(n\), заполненная строчными латинскими буквами. При этом значение \(n\) четное.

Ей хочется изменить некоторые символы так, чтобы ее матрица стала идеальным квадратом. Назовём матрицу идеальным квадратом, если после одного поворота на \(90^\circ\) по часовой стрелке она не изменится.

Пример поворота матрицы на \(90^\circ\):

За одну операцию Кристина может выбрать любой элемент и заменить его значение на следующий символ в алфавите. Если символ равен «z», то его значение не изменится.

Найдите минимальное количество операций, которое необходимо применить для того, чтобы матрица стала идеальным квадратом.

Например, если матрица размера \(4\) на \(4\) выглядит так:

\(\)\matrix{ a & b & b & a \cr b & c & \textbf{b} & b \cr b & c & c & b\cr a & b & b & a \cr }\(\)

то в ней достаточно применить \(1\) операцию к букве b, выделенной жирным.

Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^2\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка каждого набора содержит единственное целое четное число \(n\) (\(2 \le n \le 10^3\)) — количество строк и столбцов в матрице.

Далее следуют \(n\) строк, каждая из которых содержит ровно \(n\) строчных латинских букв.

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(10^3\).

Выходные данные

В отдельной строке для каждого набора входных данных выведите единственное число: минимальное количество операций, которое необходимо применить, чтобы у Кристины получился идеальный квадрат.

Примечание

Первый набор входных данных разобран в условии.

E. Сложная конструкция

жадные алгоритмы математика реализация *2800

Рассмотрим массив целых чисел \(b_0, b_1, \ldots, b_{n-1}\). Ваша цель — сделать все элементы в нем равными. Для этого вы можете выполнять следующую операцию несколько раз (возможно, ни одного):

  • Выбрать пару индексов \(0 \le l \le r \le n-1\) и для каждого \(l \le i \le r\) увеличить \(b_i\) на \(1\) (то есть заменить \(b_i\) на \(b_i + 1\)).
  • За выполнение такой операции вы получаете \((r - l + 1)^2\) монет.

Значение \(f(b)\) определяется как пара чисел \((cnt, cost)\), где \(cnt\) — это наименьшее количество операций, необходимых для того, чтобы сделать все числа массива равными, а \(cost\) — это наибольшее суммарное количество монет, которые можно получить, среди всех возможных вариантов сделать все элементы равными за \(cnt\) операций. Иными словами, в первую очередь нужно минимизировать число операций, во вторую — максимизировать число получаемых монет.

Вам дан массив целых чисел \(a_0, a_1, \ldots, a_{n-1}\). Найдите значение \(f\) для всех циклических сдвигов массива \(a\).

Формально, для каждого \(0 \le i \le n-1\) нужно сделать следующее:

  • Пусть \(c_j = a_{(j + i) \pmod{n}}\) для всех \(0 \le j \le n-1\).
  • Найдите значение \(f(c)\). Поскольку \(cost\) может быть большим числом, выведите его по модулю \((10^9 + 7)\).

Обратите внимание: при фиксированном \(cnt\) нужно максимизировать суммарную стоимость \(cost\), а не ее остаток по модулю \((10^9 + 7)\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^6\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_0, a_1, \ldots, a_{n-1}\) (\(1 \le a_i \le 10^9\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных для каждого \(0 \le i \le n-1\) выведите значение \(f\) для \(i\)-го циклического сдвига массива \(a\): сначала выведите \(cnt\) (наименьшее количество операций), затем \(cost\) (наибольшее суммарное число монет, которое могут принести эти операции) по модулю \(10^9 + 7\).

Примечание

В первом наборе входных данных есть всего один циклический сдвиг, задающийся массивом \([1]\), и в нем все элементы уже равны.

Во втором наборе входных данных нужно найти ответ на трех массивах:

  1. \(f([1, 3, 2]) = (3, 3)\).
  2. \(f([3, 2, 1]) = (2, 5)\).
  3. \(f([2, 1, 3]) = (2, 5)\).

Рассмотрим детально случай \([2, 1, 3]\). Чтобы сделать все элементы равными, на первой операции можно выбрать \(l = 1\) и \(r = 1\), получив массив \([2, 2, 3]\). На второй операции можно выбрать \(l = 0\) и \(r = 1\), получив массив \([3, 3, 3]\). Мы использовали \(2\) операции, суммарная стоимость которых равна \(1^2 + 2^2 = 5\).

C. Уменьшающаяся строка

реализация Строки *1600

Напомним, что строка \(a\) лексикографически меньше строки \(b\), если \(a\) является префиксом \(b\)\(a \ne b\)), либо существует такое \(i\) (\(1 \le i \le \min(|a|, |b|)\)), что \(a_i < b_i\), и для любого \(j\) (\(1 \le j < i\)) \(a_j = b_j\).

Рассмотрим последовательность строк \(s_1, s_2, \dots, s_n\), каждая из которых состоит из строчных букв латинского алфавита. Строка \(s_1\) задана явно, все остальные строки создаются по следующему правилу: для получения строки \(s_i\) берется строка \(s_{i-1}\) и из нее удаляется символ так, чтобы строка \(s_i\) была лексикографически минимальной.

Например, если \(s_1 = \mathrm{dacb}\), то строка \(s_2 = \mathrm{acb}\), строка \(s_3 = \mathrm{ab}\), строка \(s_4 = \mathrm{a}\).

После этого мы получаем строку \(S = s_1 + s_2 + \dots + s_n\) (\(S\) — это конкатенация всех строк \(s_1, s_2, \dots, s_n\)).

Вам нужно вывести символ, который стоит в строке \(S\) на позиции \(pos\) (то есть символ \(S_{pos}\)).

Входные данные

В первой строке задано число \(t\) — количество наборов входных данных (\(1 \le t \le 10^4\)).

Каждый набор входных данных содержит две строки. В первой содержится строка \(s_1\) (\(1 \le |s_1| \le 10^6\)), состоящая из строчных букв латинского алфавита. Во второй строке содержится целое число \(pos\) (\(1 \le pos \le \frac{|s_1| \cdot (|s_1| +1)}{2}\)). Считайте, что \(n\) равно длине заданной строки (\(n = |s_1|\)).

Дополнительное ограничение на входные данные: сумма \(|s_1|\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите ответ — символ, стоящий в строке \(S\) на позиции \(pos\). Обратите внимание, что ответы между разными наборами входных данных не разделяются ни пробелом, ни переводом строки.

A. Циншань любит строки 2

жадные алгоритмы Конструктив реализация *1300

У Циншань есть строка \(s\), которая содержит только \(\texttt{0}\) и \(\texttt{1}\).

Строка \(a\) длины \(k\) является хорошей тогда и только тогда, когда

  • \(a_i \ne a_{k-i+1}\) для всех \(i=1,2,\ldots,k\).

Для участников Div. 2: обратите внимание, что это условие отличается от условия в задаче B.

Например, \(\texttt{10}\), \(\texttt{1010}\), \(\texttt{111000}\) — хорошие строки, а \(\texttt{11}\), \(\texttt{101}\), \(\texttt{001}\), \(\texttt{001100}\) — плохие.

Циншань хочет сделать \(s\) хорошей. Для этого она может проделать следующую операцию не более \(300\) раз (возможно, ноль):

  • вставить \(\texttt{01}\) в любое место строки \(s\) (получив новую строку \(s\)).

Скажите, возможно ли сделать \(s\) хорошей. Если это возможно, то приведите последовательность операций, которая делает строку \(s\) хорошей.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\le t\le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \le n\le 100\)) — длину строки \(s\), соответственно.

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\).

Гарантируется, что \(s\) состоит только из \(\texttt{0}\) и \(\texttt{1}\).

Выходные данные

Для каждого набора входных данных, если невозможно сделать \(s\) хорошей, выведите \(-1\).

В противном случае в первой строке выведите \(p\) (\(0 \le p \le 300\)) — количество операций.

Затем выведите \(p\) целых чисел во второй строке. Целое число \(i\) должно быть индексом \(x_i\) (\(0 \le x_i \le n+2i-2\)) — позицией, в которую необходимо вставить \(\texttt{01}\) в текущем \(s\). Если \(x_i=0\), то \(\texttt{01}\) вставляется в начало \(s\). В противном случае, \(\texttt{01}\) вставляется сразу после \(x_i\)-го символа \(s\).

Можно показать, что при данных ограничениях, если ответ существует, то всегда найдется ответ, требующий не более \(300\) операций.

Примечание

В первом наборе входных данных можно выполнить ноль операций и получить \(s=\texttt{01}\), что является хорошей строкой.

Другим правильным решением является выполнение одной операции: (вставленная \(\texttt{01}\) подчеркнута)

  1. \(\texttt{0}\underline{\texttt{01}}\texttt{1}\)

получаем \(s = \texttt{0011}\), что является хорошей строкой.

Во втором и третьем наборах входных данных сделать \(s\) хорошей невозможно.

В четвертом наборе входных данных можно выполнить две операции:

  1. \(\texttt{001110}\underline{\texttt{01}}\)
  2. \(\texttt{0011100}\underline{\texttt{01}}\texttt{1}\)

и получить \(s = \texttt{0011100011}\), что является хорошей строкой.

D. Игра со стеками

графы Деревья Перебор поиск в глубину и подобное реализация *3000

У вас есть \(n\) стеков \(r_1,r_2,\ldots,r_n\). Каждый стек содержит некоторое количество целых положительных чисел в диапазоне от \(1\) до \(n\).

Определим следующие функции:

function init(pos):
stacks := массив, содержащий n стеков r[1], r[2], ..., r[n].
return get(stacks, pos)

function get(stacks, pos):
if stacks[pos] пуст:
return pos
else:
new_pos := верхний элемент stacks[pos]
удалить верхний элемент stacks[pos]
return get(stacks, new_pos)

Вы хотите узнать значения, возвращаемые \(\texttt{init(1)}, \texttt{init(2)}, \ldots, \texttt{init(n)}\).

Заметим, что во время этих вызовов стеки \(r_1,r_2,\ldots,r_n\) не изменяются, поэтому вызовы \(\texttt{init(1)}, \texttt{init(2)}, \ldots, \texttt{init(n)}\) являются независимыми.

Входные данные

Первая строка ввода содержит одно целое число \(n\) (\(1\le n\le 10^5\)) — длина массива \(r\).

Каждая из последующих \(n\) строк содержит несколько целых чисел. Первое целое число \(k_i\) (\(0\le k_i\le 10^5\)) представляет собой количество элементов в \(i\)-м стеке, а следующие \(k_i\) положительных целых чисел \(c_{i,1},c_{i,2},\ldots,c_{i,k_i}\) (\(1\le c_{i,j}\le n\)) представляют элементы в \(i\)-м стеке. \(c_{i,1}\) - нижний элемент.

В каждом тесте \(\sum k_i\le 10^6\).

Выходные данные

Необходимо вывести \(n\) значений, \(i\)-м из которых является значение, возвращаемое \(\texttt{init(i)}\).

Примечание

В первом примере:

  • При вызове \(\texttt{init(1)}\) присваивается \(\texttt{stacks := [[1,2,2],[3,1,2],[1,2,1]]}\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1,2],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 3}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) пуст, возвращается \(1\).
  • При вызове \(\texttt{init(2)}\) присваивается \(\texttt{stacks := [[1,2,2],[3,1,2],[1,2,1]]}\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2,2],[3,1],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2,2],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 3}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[],[1,2,1]]\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) пуст, возвращается \(2\).
  • При вызове \(\texttt{init(3)}\) присваивается \(\texttt{stacks := [[1,2,2],[3,1,2],[1,2,1]]}\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2,2],[3,1,2],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1,2],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3,1],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 1}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1,2],[3],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 1)}\).
    • \(\texttt{stacks[1]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[1]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[3],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) не пуст, присваивается \(\texttt{new_pos := 3}\) и удаляется верхний элемент \(\texttt{stacks[2]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1,2]]\), а затем вызывается \(\texttt{get(stacks, 3)}\).
    • \(\texttt{stacks[3]}\) не пуст, присваивается \(\texttt{new_pos := 2}\) и удаляется верхний элемент \(\texttt{stacks[3]}\), в результате чего \(\texttt{stacks}\) станет \([[1],[],[1]]\), а затем вызывается \(\texttt{get(stacks, 2)}\).
    • \(\texttt{stacks[2]}\) пуст, возвращается \(2\).

B. Циншань любит строки

Конструктив реализация *800

У Циншань есть строка \(s\), а у Даниэля — строка \(t\). Обе строки содержат только символы \(\texttt{0}\) и \(\texttt{1}\).

Строка \(a\) длины \(k\) является хорошей тогда и только тогда, когда

  • \(a_i \ne a_{i+1}\) для всех \(i=1,2,\ldots,k-1\).

Например, строки \(\texttt{1}\), \(\texttt{101}\), \(\texttt{0101}\) — хорошие, а \(\texttt{11}\), \(\texttt{1001}\), \(\texttt{001100}\) — плохие.

Циншань хочет сделать \(s\) хорошей. Для этого она может выполнить следующую операцию любое количество раз (возможно, нулевое):

  • вставить \(t\) в любую позицию \(s\) (получив новую строку \(s\)).

Пожалуйста, скажите Циншань, можно ли сделать \(s\) хорошей.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(T\) (\(1\le T\le 2000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 50\)) — длины строк \(s\) и \(t\) соответственно.

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\).

Третья строка каждого набора входных данных содержит строку \(t\) длины \(m\).

Гарантируется, что \(s\) и \(t\) содержат только \(\texttt{0}\) и \(\texttt{1}\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если можно сделать \(s\) хорошей, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных строка \(s\) изначально хорошая, поэтому можно получить хорошую \(s\), выполнив ноль операций.

Во втором наборе входных данных можно выполнить следующие две операции (вставленная строка \(t\) подчеркнута):

  1. \(\texttt{1}\underline{\texttt{010}}\texttt{11}\)
  2. \(\texttt{10101}\underline{\texttt{010}}\texttt{1}\)

и получить \(s = \texttt{101010101}\), что является хорошей строкой.

В третьем наборе входных данных нет способа сделать \(s\) хорошей после любого количества операций.

E. Брухович и контрольные

жадные алгоритмы математика Перебор реализация сортировки *2500

Мальчик Смайло учится алгоритмам у учителя по имени Брухович.

В течение года Брухович проведет \(n\) контрольных. Для каждой контрольной известна ее сложность \(a_i\) — неотрицательное целое число. Смайло не нравится, когда у двух последовательных контрольных наибольший общий делитель их сложностей равен \(1\). Поэтому он считает грустностью учебного года количество таких пар контрольных. Формально, грустность — это количество таких индексов \(i\) (\(1 \leq i \leq n - 1\)), что \(gcd(a_i, a_{i+1}) = 1\), где \(gcd(x, y)\) — наибольший общий делитель чисел \(x\) и \(y\).

Брухович хочет минимизировать грустность учебного года для Смайло. Для этого он может сделать сложность любой контрольной равной \(0\). Понятно, что Брухович не хочет слишком сильно облегчать жизнь своим ученикам. Поэтому он выполнит описанное выше действие не более \(k\) раз.

Помогите Смайло узнать, какой минимальной грустности может добиться Брухович, если применит не более \(k\) операций.

Напоминаем, что наибольшим общим делителем (НОД) двух неотрицательных целых чисел \(x\) и \(y\) называется максимальное такое число, которое является делителем и \(x\), и \(y\), обозначается как \(gcd(x, y)\). В частности, \(gcd(x, 0) = gcd(0, x) = x\) для любого целого неотрицательного \(x\).

Входные данные

В первой строке содержится единственное число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \leq k \leq n \leq 10^5\)) — количество контрольных всего и количество контрольных, сложности которых можно обнулить, соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, a_3, \ldots, a_n\) — элементы массива \(a\), которые являются сложностями контрольных (\(0 \leq a_i \leq 10^9\)).

Гарантируется, что сумма \(n\) по всем тестовым наборам не превосходят \(10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальную возможную грустность, которую можно достичь, выполнив не более \(k\) операций.

Примечание

В первом наборе входных данных можно достичь грустности, равной \(1\). Для этого нужно упростить вторую и четвертую контрольные. После этого будет только одна пара соседних контрольных, имеющая НОД, равный единице - это первая и вторая контрольные.

Во втором наборе входных данных можно достичь грустности, равной \(0\), упростив вторую и четвертую контрольные.

A. Анонимный информатор

графы Перебор поиск в глубину и подобное реализация *1400

Вам дан массив \(b_1, b_2, \ldots, b_n\).

Некий анонимный информатор сообщил вам, что массив \(b\) был получен следующим образом: изначально существовал некоторый массив \(a_1, a_2, \ldots, a_n\), после чего \(k\) раз была произведена следующая двухкомпонентная операция:

  1. Была выбрана некоторая фиксированная точка\(^{\dagger}\) массива \(a\), пусть \(x\).
  2. После чего ровно \(x\) раз массив \(a\) был заменён на свой циклический сдвиг влево\(^{\ddagger}\).

И в результате \(k\) таких операций был получен массив \(b_1, b_2, \ldots, b_n\). Вы хотите проверить, могут ли слова анонимного информатора быть правдивы, или же он гарантированно лжёт.

\(^{\dagger}\)Число \(x\) называется фиксированной точкой массива \(a_1, a_2, \ldots, a_n\), если \(1 \leq x \leq n\) и \(a_x = x\).

\(^{\ddagger}\)Циклический сдвиг влево от массива \(a_1, a_2, \ldots, a_n\) это массив \(a_2, \ldots, a_n, a_1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целые числа \(n, k\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le k \le 10^9\)) — длину массива \(b\) и количество проведённых операций.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le 10^9\)) — элементы массива \(b\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «Yes», если слова анонимного информатора могут быть правдой, и «No», если он гарантированно лжёт.

Примечание

В первом наборе входных данных массив \(a\) мог быть равен \([3, 2, 3, 4, 3]\). В первой операции была выбрана фиксированная точка \(x = 2\), и после \(2\) сдвигов влево массив принял вид \([3, 4, 3, 3, 2]\). Во второй операции была выбрана фиксированная точка \(x = 3\), и после \(3\) сдвигов влево массив принял вид \([3, 2, 3, 4, 3]\). В третьей же операции была выбрана фиксированная точка \(x = 3\), и после \(3\) сдвигов влево массив принял вид \([4, 3, 3, 2, 3]\), чему и равняется массив \(b\).

Во втором наборе входных данных массив \(a\) мог быть равен \([7, 2, 1]\). После операции с фиксированной точкой \(x = 2\) массив принял вид \([1, 7, 2]\). Далее после операции с фиксированной точкой \(x = 1\) массив снова принял изначальный вид \([7, 2, 1]\). Далее эти же \(2\) операции (с \(x = 2\) и \(x = 1\)) были повторены \(49\) раз. И итого после \(100\) операций массив снова принял вид \([7, 2, 1]\).

В третьем наборе входных данных нетрудно показать, что ответа нет.

C. Свобода выбора

жадные алгоритмы Перебор реализация *2000

Определим анти-красоту мультимножества \(\{b_1, b_2, \ldots, b_{len}\}\) как количество вхождений числа \(len\) в это мультимножество.

Вам дано \(m\) мультимножеств, \(i\)-е мультимножество содержит \(n_i\) различных элементов, а конкретно: \(c_{i, 1}\) копий числа \(a_{i,1}\), \(c_{i, 2}\) копий числа \(a_{i,2}, \ldots, c_{i, n_i}\) копий числа \(a_{i, n_i}\). Гарантируется, что \(a_{i, 1} < a_{i, 2} < \ldots < a_{i, n_i}\). Также вам даны числа \(l_1, l_2, \ldots, l_m\) и \(r_1, r_2, \ldots, r_m\) такие, что \(1 \le l_i \le r_i \le c_{i, 1} + \ldots + c_{i, n_i}\).

Создадим мультимножество \(X\), изначально пустое. Далее, для всех \(i\) от \(1\) до \(m\) вы должны совершить следующее действие ровно один раз:

  1. Выбрать некое \(v_i\) такое, что \(l_i \le v_i \le r_i\)
  2. Выбрать \(v_i\) любых чисел из \(i\)-го мультимножества и добавить их в мультимножество \(X\).

Ваша задача выбрать \(v_1, \ldots, v_m\) и добавленные числа так, чтобы в итоге мультимножество \(X\) имело минимально возможную анти-красоту.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(m\) (\(1 \le m \le 10^5\)) — количество мультимножеств.

Далее для каждого \(i\) от \(1\) до \(m\) следует блок данных из трёх строк.

Первая строка каждого блока содержит целые числа \(n_i, l_i, r_i\) (\(1 \le n_i \le 10^5, 1 \le l_i \le r_i \le c_{i, 1} + \ldots + c_{i, n_i} \le 10^{17}\)) — количество различных чисел в \(i\)-м мультимножестве и границы на количество чисел, которое надо добавить из \(i\)-го мультимножества в \(X\).

Вторая строка каждого блока содержит \(n_i\) целых чисел \(a_{i, 1}, \ldots, a_{i, n_i}\) (\(1 \le a_{i, 1} < \ldots < a_{i, n_i} \le 10^{17}\)) — различные элементы \(i\)-го мультимножества.

Третья строка каждого блока содержит \(n_i\) целых чисел \(c_{i, 1}, \ldots, c_{i, n_i}\) (\(1 \le c_{i, j} \le 10^{12}\)) — количества копий элементов в \(i\)-м мультимножестве.

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(10^5\), а также сумма \(n_i\) по всем блокам всех наборов входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите минимально возможную анти-красоту мультимножества \(X\), которой вы можете добиться.

Примечание

В первом наборе входных данных мультимножества имеют следующий вид:

  1. \(\{10, 10, 10, 11, 11, 11, 12\}\). Из этого мультимножества нужно выбрать от \(5\) до \(6\) чисел.
  2. \(\{12, 12, 12, 12\}\). Из этого мультимножества нужно выбрать от \(1\) до \(3\) чисел.
  3. \(\{12, 13, 13, 13, 13, 13\}\). Из этого мультимножества нужно выбрать \(4\) числа.

Можно выбрать из первого мультимножества элементы \(\{10, 11, 11, 11, 12\}\), из второго: \(\{12\}\), из третьего: \(\{13, 13, 13, 13\}\). Итого \(X = \{10, 11, 11, 11, 12, 12, 13, 13, 13, 13\}\). Размер \(X\) равен \(10\), число \(10\) входит в \(X\) ровно \(1\) раз, а значит анти-красота \(X\) равна \(1\). Можно показать, что анти-красоты меньшей чем \(1\), добиться не получится.

A. Секретный спорт

реализация Строки *800

Рассмотрим игру, в которую играют два человека: A и B. Эта игра характеризуется двумя целыми положительными числами: \(X\) и \(Y\).

Игра состоит из сетов, каждый сет состоит из розыгрышей. В каждом розыгрыше побеждает ровно один из игроков — либо A, либо B. Сет заканчивается ровно тогда, когда один из игроков набирает \(X\) побед в розыгрышах в течении этого сета. Этот игрок объявляется победителем сета. Игроки разыгрывают сеты до тех пор, пока один из них не наберёт \(Y\) побед в сетах. После этого игра заканчивается, и этот игрок объявляется победителем всей игры.

Вы только что посмотрели игру, но не заметили, кого объявили победителем. Вы запомнили, что в течение игры было сыграно \(n\) розыгрышей, а также кто из игроков победил в каждом из розыгрышей. Однако, вам неизвестны значения \(X\) и \(Y\). По имеющейся информации определите, кто из игроков победил во всей игре — A или B. Если информации недостаточно, чтобы определить победителя, вы также должны сообщить об этом.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) \((1 \leq t \leq 10^4)\) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) \((1 \leq n \leq 20)\) — количество сыгранных розыгрышей в течение игры.

Вторая строка каждого набора входных данных содержит последовательность \(s\) длины \(n\), состоящую из символов \(\texttt{A}\) и \(\texttt{B}\). Если \(s_i = \texttt{A}\), это означает, что в \(i\)розыгрыше победил игрок A. Если \(s_i = \texttt{B}\), это означает, что в \(i\)розыгрыше победил игрок B.

Гарантируется, что заданная последовательность розыгрышей соответствует хотя бы одному корректному сценарию игры при некоторых параметрах \(X\) и \(Y\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите:

  • \(\texttt{A}\) — если победителем игры гарантированно является игрок A.
  • \(\texttt{B}\) — если победителем игры гарантированно является игрок B.
  • \(\texttt{?}\) — если невозможно однозначно определить победителя игры.
Примечание

В первом наборе входных данных игра могла проходить с параметрами \(X = 3\), \(Y = 1\). Игра состояла из \(1\) сета, в котором победил игрок A, так как он первым выиграл \(3\) розыгрыша. При таком сценарии победителем является игрок A. Также игра могла проходить с параметрами \(X = 1\), \(Y = 3\). Можно показать, что не существует таких \(X\) и \(Y\), при которых победителем будет игрок B.

Во втором наборе входных данных все розыгрыши выиграл игрок B. Несложно показать, что тогда игрок B гарантированно является победителем игры.

В четвёртом наборе входных данных игра могла проходить с параметрами \(X = 3\), \(Y = 3\):

  • В первом сете было сыграно \(3\) розыгрыша: AAA. Победителем сета считается игрок A.
  • Во втором сете было сыграно \(3\) розыгрыша: AAA. Победителем сета считается игрок A.
  • В третьем сете было сыграно \(5\) розыгрышей: AABBB. Победителем сета считается игрок B.
  • В четвёртом сете было сыграно \(5\) розыгрышей: AABBB. Победителем сета считается игрок B.
  • В пятом сете было сыграно \(4\) розыгрыша: BBAB. Победителем сета считается игрок B.

В итоге первым игроком, выигравшим \(3\) сета, был игрок B. Он и считается победителем игры.

C. Порванный счастливый билет

дп математика Перебор реализация хэши *1400

Билет — это непустая строка из цифр от \(1\) до \(9\).

Счастливый билет — это такой билет, у которого:

  • четная длина;
  • сумма цифр в первой половине равна сумме цифр во второй половине.

У вас есть \(n\) частей билетов \(s_1, s_2, \dots, s_n\). Сколько пар \((i, j)\) (для \(1 \le i, j \le n\)) существует таких, что \(s_i + s_j\) является счастливым билетом? Обратите внимание, что возможно \(i=j\).

Здесь оператор + обозначает конкатенацию двух строк. Например, если \(s_i\) — это 13, а \(s_j\) — это 37, то \(s_i + s_j\) будет 1337.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество частей билетов.

Вторая строка содержит \(n\) непустых строк \(s_1, s_2, \dots, s_n\), каждая длиной не более \(5\) и состоящая только из цифр от \(1\) до \(9\).

Выходные данные

Выведите одно целое число — количество пар \((i, j)\) (для \(1 \le i, j \le n\)), таких что \(s_i + s_j\) является счастливым билетом.

F. Инвертирование скобок

жадные алгоритмы Конструктив математика реализация *2600

Дана бинарная строка \(s\) длины \(2n\), каждый элемент которой равняется \(\mathtt{0}\) или \(\mathtt{1}\). Вы можете выполнять следующую операцию:

  1. Выбрать правильную скобочную последовательность\(^\dagger\) \(b\) длины \(2n\).
  2. Пройти по всем индексам \(i\) от \(1\) до \(2n\) по порядку. Если \(b_i\) — открывающая скобка, то обозначим за \(p_i\) минимальный индекс такой, что \(b[i,p_i]\) — правильная скобочная последовательность. Тогда к подотрезку с \(i\) по \(p_i\) из бинарной строки \(s\) применяется операция инвертирования\(^\ddagger\). Заметим, что поскольку правильная скобочная последовательность длины \(2n\) будет иметь \(n\) открывающих скобок, то мы выполним \(n\) операций инвертирования подотрезка над \(s\).

Ваша задача — найти последовательность из не более чем \(10\) операций, изменяющую все элементы \(s\) на \(\mathtt{0}\), или определить, что это невозможно. Заметим, что минимизировать количество операций не обязательно.

При заданных ограничениях можно доказать, что если существует способ изменить все элементы \(s\) на \(\mathtt{0}\), то существует способ, требующий не более \(10\) операций.

\(^\dagger\) Скобочная последовательность называется правильной, если ее можно превратить в корректное математическое выражение, добавив символы \(+\) и \(1\). Например, последовательности «(()()», «()» и «(()(())» являются правильными, а «)(», «(()» и «(())(» — не являются.

\(^\ddagger\) Если мы выполним операцию инвертирования для подотрезка с \(l\) по \(r\) бинарной строки \(s\), то мы инвертируем все значения \(s_i\) такие, что \(l \leq i \leq r\). Если \(s_i\) инвертируется, то мы присваиваем \(s_i := \mathtt{0}\), если изначально было \(s_i = \mathtt{1}\), и наоборот. Например, если \(s=\mathtt{1000101}\) и мы выполняем операцию инвертирования подотрезка с \(3\) по \(5\), то \(s\) изменится на \(s=\mathtt{1011001}\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2\cdot 10^5\)) — где \(2n\) — длина строки \(s\).

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(2n\) (\(s_i = \mathtt{0}\) или \(s_i = \mathtt{1}\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в единственной строке \(-1\), если невозможно изменить все элементы \(s\) на \(\mathtt{0}\).

В противном случае выведите одно целое число \(k\) (\(0 \le k \le 10\)), равняющееся количеству операций, необходимому для изменения всех элементов \(s\) на \(\mathtt{0}\). Затем в следующих \(k\) строках выведите правильные скобочные последовательности длины \(2n\), представляющие собой операции, необходимые для изменения всех элементов \(s\) на \(0\).

Если существует несколько способов изменить все элементы \(s\) на \(\mathtt{0}\), требующих не более \(10\) операций, то можно вывести любой из них.

Примечание

В первом наборе входных данных можно показать, что невозможно изменить все элементы \(s\) на \(\mathtt{0}\).

Во втором наборе входных данных первая операция с использованием последовательности скобок \(b = \mathtt{()()}\) преобразует двоичную строку \(s=\mathtt{0000}\) в \(s=\mathtt{1111}\). Затем вторая операция с использованием той же последовательности скобок \(b = \mathtt{()()}\) преобразует двоичную строку \(s=\mathtt{1111}\) обратно в \(s=\mathtt{0000}\). Заметим, что поскольку все элементы \(s\) изначально уже равнялись \(\mathtt{0}\), то использование \(0\) операций также является правильным ответом.

В третьем наборе входных данных одна операция с использованием последовательности скобок \(b = \mathtt{(())()}\) изменит все элементы \(s\) на \(\mathtt{0}\). Операция будет происходить следующим образом:

  1. \(b_1\) — открывающая скобка, а \(p_1 = 4\), так как \(b[1,4]=\mathtt{(())}\) — правильная скобочная последовательность. Следовательно, выполнив операцию инвертирования подотрезка с \(1\) по \(4\) на бинарной строке \(s = \mathtt{100111}\), мы получим \(s = \mathtt{011011}\).
  2. \(b_2\) является открывающей скобкой, а \(p_2 = 3\), так как \(b[2,3]=\mathtt{()}\) является правильной скобочной последовательностью. Следовательно, выполнив операцию инвертирования подотрезка с \(2\) по \(3\) на бинарной строке \(s = \mathtt{011011}\), мы получим \(s = \mathtt{000011}\).
  3. \(b_3\) не является открывающей скобкой, поэтому на этом шаге операция инвертирования не выполняется.
  4. \(b_4\) не является открывающей скобкой, поэтому на этом шаге операция инвертирования не выполняется.
  5. \(b_5\) является открывающей скобкой, а \(p_5 = 6\), так как \(b[5,6]=\mathtt{()}\) является правильной скобочной последовательностью. Следовательно, выполнив операцию инвертирования подотрезка с \(5\) по \(6\) для бинарной строки \(s = \mathtt{000011}\), мы получим \(s = \mathtt{000000}\).
  6. \(b_6\) не является открывающей скобкой, поэтому на этом шаге операция инвертирования не выполняется.

В четвертом наборе входных данных первая операция с использованием скобочной последовательности \(b = \mathtt{(((())))}\) преобразует бинарную строку \(s = \mathtt{01011100}\) в \(s = \mathtt{11111001}\). Затем, вторая операция с использованием скобочной последовательности \(b = \mathtt{()()(())}\) преобразует бинарную строку \(s = \mathtt{11111001}\) в \(s=\mathtt{00000000}\).

G. Гонка пепе

интерактив Конструктив реализация сортировки *3200

Это интерактивная задача.

В гонках участвует \(n^2\) пепе, пронумерованных \(1, 2, \ldots, n^2\), с попарно различными скоростями. Вы хотите устроить несколько гонок, чтобы выяснить относительную скорость всех пепе.

В одной гонке можно выбрать ровно \(n\) различных пепе и заставить их соревноваться друг с другом. После каждого заезда вы узнаете только самого быстрого пепе среди этих \(n\) пепе.

Сможете ли вы найти порядок \(n^2-n+1\) самых быстрых пепе за не более чем \(2n^2 - 2n + 1\) заездов? Заметим, что самые медленные \(n - 1\) пепе неотличимы друг от друга.

Заметим, что интерактор является адаптивным. То есть относительные скорости пепе изначально не фиксированы и могут зависеть от ваших запросов. Но гарантируется, что в любой момент времени существует хотя бы одна начальная конфигурация пепе такая, что все ответы на запросы корректны.

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 20\)) — количество пепе в одной гонке.

Для каждого набора входных данных после считывания целого числа \(n\) следует начать взаимодействие.

Гарантируется, что сумма \(n^3\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Протокол взаимодействия

Чтобы задать гонку, выведите строку следующего формата:

  • \(\mathtt{?}\,x_1\,x_2 \ldots x_n\) (\(1 \le x_i \le n^2\), \(x_i\) попарно различны) — номера пепе, которые должны участвовать в гонке.

После каждого заезда необходимо считать строку, содержащую единственное целое число \(p\) (\(1\le p\le n^2\)) — самого быстрого пепе в гонке.

Когда вы узнаете \(n^2-n+1\) самых быстрых пепе, выведите одну строку следующего формата:

  • \(\mathtt{!}\,p_1\,p_2 \ldots p_{n^2 - n + 1}\) (\(1 \le p_i \le n^2\), \(p_i\) попарно различны)
где \(p\) — последовательность номеров этих пепе в порядке убывания скорости.

После этого переходите к следующему набору входных данных или завершайте работу программы, если наборов входных данных больше не осталось.

Если ваша программа выполнит более \(2n^2 - 2n + 1\) заездов для одного набора входных данных или сделает некорректный заезд, то вы можете получить вердикт «Неправильный ответ».

После вывода запроса или ответа не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Формат взломов

Для взломов используйте следующий формат:

Первая строка должна содержать \(t\) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать целое число \(n\), за которым следует строка manual.

Вторая строка каждого набора входных данных должна содержать перестановку \(a_1,a_2,\ldots,a_{n^2}\) целых чисел от \(1\) до \(n^2\). \(a_i > a_j\) тогда и только тогда, когда пепе \(i\) имеет скорость больше, чем пепе \(j\).

Например, формат взлома для примера имеет следующий вид: \(\mathtt{1}\\\mathtt{2}~\mathtt{manual}\\\mathtt{1}~\mathtt{2}~\mathtt{3}~\mathtt{4}\)

A. Мария и строка

Перебор реализация Строки *800

У Марии есть строка \(s\) длины \(n\), состоящая из букв «A» и «B». Она хочет сделать так, чтобы строка \(s\) содержала ровно \(k\) символов «B». Для этого она может использовать следующую операцию.

  • Выбрать целое число \(i\) (\(1 \leq i \leq n\)) и букву \(c\) (\(c\) должна быть равна «A» или «B»).
  • После этого заменить каждую из первых \(i\) букв строки \(s\) (то есть, буквы \(s_1, s_2, \ldots, s_i\)) на \(c\).

Мария просит вас найти минимальное количество операций, которое необходимо выполнить для того, чтобы строка \(s\) содержала ровно \(k\) символов «B». Также она просит вас найти сами эти операции (то есть, число \(i\) и букву \(c\) в каждой операции).

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 500\)) — количество наборов входных данных. Далее следуют описания этих наборов.

В первой строке дано два целых числа \(n\) и \(k\) (\(3 \leq n \leq 100\), \(0 \leq k \leq n\)) — длина строки \(s\) и количество букв «B», которое должна содержать строка \(s\) после всех операций.

Во второй строке дана строка \(s\) длины \(n\), состоящая из букв «A» и «B».

Выходные данные

Для каждого набора входных данных в первой строке выведите число \(m\) — минимальное количество операций, которое нужно выполнить Марии.

В \(j\)-й из следующих \(m\) строк выведите число \(i\) (\(1 \le i \le n\)) и букву \(c\) (\(c\) должна быть равна «A» или «B») — параметры \(j\)-й операции.

Если существует несколько решений с минимальным возможным количеством операций, вы можете вывести любое из них.

Примечание

В первом наборе входных данных в строке \(s\) уже \(2\) символа «B», поэтому Марии не нужно выполнять ни одной операции.

Во втором наборе входных данных единственный способ добиться того, чтобы строка \(s\) содержала \(3\) символа «B» после одной операции — заменить первый символ строки \(s\) на «B»: «AABAB» \(\rightarrow\) «BABAB».

В третьем наборе входных данных единственный способ добиться того, чтобы строка \(s\) содержала \(0\) символов «B» после одной операции — заменить первые \(5\) символов строки \(s\) на «A»: «BBBBB» \(\rightarrow\) «AAAAA».

В четвёртом наборе входных один из способов добиться того, чтобы строка \(s\) содержала \(0\) символов «B» после одной операции — заменить первые \(2\) символа строки \(s\) на «A»: «BAA» \(\rightarrow\) «AAA». Обратите внимание, что «1 A» и «3 A» тоже являются правильными решениями в одну операцию.

B. 250 тысяч тонн тротила

Перебор реализация теория чисел *1100

Лёша участвует в съёмке очередного ролика BrMeast, и BrMeast попросил Лёшу подготовить 250 тысяч тонн тротила, но Лёша его не расслышал, поэтому он подготовил \(n\) коробок. Лёша хочет погрузить эти коробки в грузовики, для этого он расставил их в ряд, \(i\)-я слева коробка имеет вес \(a_i\) тонн.

Все грузовики, которые собирается использовать Лёша, вмещают в себя одинаковое количество коробок, обозначим это количество \(k\). Тогда погрузка происходит следующим образом:

  • В первый грузовик помещаются первые \(k\) коробок,
  • Во второй грузовик помещаются вторые \(k\) коробок,
  • \(\dotsb\)
  • В \(\frac{n}{k}\)-й грузовик помещаются последние \(k\) коробок.

По окончании погрузки в каждом грузовике должно быть ровно \(k\) коробок. То есть, если в какой-то момент в грузовик не получится загрузить ровно \(k\) коробок, то вариант погрузки с таким \(k\) невозможен.

Лёша ненавидит справедливость, так что он хочет, чтобы максимальная абсолютная разница между суммарным весом каких-либо двух грузовиков была как можно больше. Если грузовик один, эта величина равна \(0\).

У Лёши есть достаточно много связей, поэтому для каждого \(1 \leq k \leq n\) он может найти такую компанию, что каждый её грузовик вмещает в себя ровно \(k\) коробок. Выведите максимальную абсолютную разницу между суммарным весом каких-либо двух грузовиков.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 150\,000\)) — количество коробок.

Во второй строке даны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \leq a_i \leq 10^9\)) — веса коробок.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(150\,000\).

Выходные данные

Для каждого набора данных выведите одно число — ответ на задачу.

Примечание

В первом случае выгодно взять два грузовика, в первом будет только первая коробка, во втором только вторая.

Во втором случае выгодно взять шесть грузовиков, в каждом по одной коробке. Тогда максимум равен \(10\), минимум равен \(1\), ответ равен \(10 - 1 = 9\).

В третьем случае при любом возможном \(k\) в грузовиках будет одинаковый суммарный вес коробок, то есть ответ равен \(0\).

E. Очередная сортировка

жадные алгоритмы реализация сортировки *1300

Влад нашёл массив \(a\) из \(n\) чисел и решил его отсортировать в порядке неубывания.

Для этого Влад может применить следующую операцию любое количество раз:

  • Извлечь первый элемент массива и вставить его в конец;
  • Обменивать этот элемент с предыдущим, пока он не станет первым или не станет строго больше предыдущего.

Обратите внимание, что оба действия являются частью операции и за одну операцию вы должны применить оба действия.

Например, если применить операцию к массиву [\(4, 3, 1, 2, 6, 4\)], то он будет изменяться следующим образом:

  • [\(\color{red}{4}, 3, 1, 2, 6, 4\)];
  • [\(3, 1, 2, 6, 4, \color{red}{4}\)];
  • [\(3, 1, 2, 6, \color{red}{4}, 4\)];
  • [\(3, 1, 2, \color{red}{4}, 6, 4\)].

У Влада нет времени проделывать все операции, поэтому он просит вас определить, какое минимальное число операций нужно применить, чтобы отсортировать массив, или сообщить, что это невозможно.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит одно число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество элементов массива.

Вторая строка каждого набора содержит \(n\) чисел \(a_1, a_2, a_3, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственное число — минимальное число операций, необходимое для сортировки массива. Если это сделать невозможно, в качестве ответа выведите \(-1\).

A. Чемпионат мира по футболу

реализация *1400

Всем известно, что сейчас в ЮАР проходит Чемпионат мира по футболу. По решению БФА (Берляндская Футбольная Ассоциация) следующий чемпионат пройдет в Берляндии. Также БФА приняло решение изменить некоторые положения в уставе чемпионата:

  • в финальную часть ЧМ выходит n команд (n всегда четно)
  • в плей-офф выходит первые n / 2 команд по итогам турнирной таблицы
  • турнирная таблица строится по принципу: за победу команде начисляется 3 очка, за ничью — 1 очко, за поражение — 0 очков. Команды упорядочиваются в первую очередь по убыванию количества очков, во вторую — по убыванию разности забитых и пропущенных мячей, в третью — по убыванию количества забитых голов.
  • в Берляндской Конституции прописано, что предыдущее правило позволяет однозначно упорядочить команды.

Вам поручили написать программу, которая по списку команд-участниц и результатам всех матчей найдет список команд, которые прошли в плей-офф.

Входные данные

В первой строке входных данных написано единственное целое число n (1 ≤ n ≤ 50) — количество команд, прошедших в финальную часть ЧМ. Далее в n строках написаны названия команд, представляющие собой строки из строчных и прописных латинских букв длиной не более 30 символов. Следующие n·(n - 1) / 2 строк описывают проведенные матчи в формате name1-name2 num1:num2, где name1, name2 — названия команд; num1, num2 (0 ≤ num1, num2 ≤ 100) — количество голов, забитых соответствующими командами. Гарантируется корректность описания чемпионата, в частности, не существуют двух команд с одинаковыми с точностью до регистра названиями, не существует описания матча, в котором команда играет сама с собой, каждый матч встречается в описании ровно один раз.

Выходные данные

Выведите в выходной файл n / 2 строк — названия вышедших в плей-офф команд в лексикографическом порядке. Каждое название выводите на отдельной строке. Посторонние символы (включая пробелы) не допускаются. Гарантируется, что описанные правила позволяют однозначно упорядочить команды.

A. Заполните водой

жадные алгоритмы Конструктив реализация Строки *800

У Филиппа есть ряд клеток, некоторые из которых заблокированы, а остальные — пусты. Он хочет, чтобы во всех пустых клетках оказалась вода. Для этого он может применять 2 типа операций:

  • \(1\) — поместить воду в пустую клетку.
  • \(2\) — переместить воду из клетки с водой в любую другую пустую клетку. Обратите внимание, что при перемещении воды из одной клетки в другую Филипп удаляет воду из начальной клетки.

Если клетка \(i\) (\(2 \le i \le n-1\)) пустая, а клетки \(i-1\) и \(i+1\) содержат воду, то она заполняется водой.

Найдите минимальное количество раз, которое ему нужно выполнить операцию \(1\) типа, чтобы заполнить все пустые клетки водой.

Заметим, что минимизировать использование операций \(2\) типа не нужно. Также заметим, что заблокированные клетки не содержат воду, и Филипп не может поместить в них воду.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество клеток.

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\). \(i\)-й символ \(s\) равен '.', если клетка \(i\) пуста, и '#', если клетка \(i\) заблокирована.

Выходные данные

Для каждого набора входных данных выведите единственное число — минимальное количество операций \(1\) типа, необходимое для заполнения всех пустых клеток водой.

Примечание

Набор входных данных 1

В первом наборе входных данных Филипп может поместить воду в клетки \(1\) и \(3\). Поскольку клетка \(2\) находится между \(2\) клетками с водой, она тоже заполняется водой.

Набор входных данных 2

Во втором наборе он может поместить источники воды в клетки \(3\) и \(5\). В результате клетка \(4\) заполнится водой. Затем он удалит воду из клетки \(5\) и поместит ее в клетку \(6\). Поскольку соседи клетки \(5\) — клетки \(4\) и \(6\) — имеют воду, клетка \(5\) также заполняется водой. Иллюстрация этого процесса приведена ниже.

Операции во втором наборе входных данных. Белые клетки — пустые, серые — заблокированные, синие — вода.

Набор входных данных 3

В третьем наборе входных данных он может поместить воду во все пустые клетки. Для этого требуется \(5\) операций \(1\) типа.

Набор входных данных 4

В четвертом наборе пустых клеток нет. Следовательно, ни одной операции применять не нужно.

Набор входных данных 5

В пятом наборе входных данных существует последовательность операций, которая требует только \(2\) операции типа \(1\).

E. Транзитивный граф

графы дп поиск в глубину и подобное реализация снм *2100

Дан ориентированный граф \(G\) с \(n\) вершинами и \(m\) ребрами.

Изначально граф \(H\) совпадает с графом \(G\). Затем вы решили выполнить следующие действия:

  • Если в графе \(H\) существует тройка вершин \(a\), \(b\), \(c\) такая, что есть ребро из \(a\) в \(b\) и ребро из \(b\) в \(c\), но нет ребра из \(a\) в \(c\), то добавить ребро из \(a\) в \(c\).
  • Повторять предыдущий шаг до тех пор, пока существуют такие тройки.

Заметим, что после выполнения этих действий количество ребер в \(H\) может достигать \(n^2\).

Вы также записали некоторые значения на вершинах графа \(H\): на вершине \(i\) записано значение \(a_i\).

Рассмотрим простой путь, состоящий из \(k\) различных вершин с номерами \(v_1, v_2, \ldots, v_k\). Длина такого пути равняется \(k\). Значение этого пути определим как \(\sum_{i = 1}^k a_{v_i}\).

Простой путь считается самым длинным, если в графе нет другого простого пути с большей длиной.

Среди всех самых длинных простых путей в \(H\) найдите тот, который имеет наименьшее значение.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 2 \cdot 10^5\)) — количество вершин и количество ребер.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)) — числа, записанные на вершинах графа \(H\).

В \(i\)-й из следующих \(m\) строк записаны два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — в графе \(G\) есть ребро, идущее от вершины \(v_i\) к вершине \(u_i\). Заметим, что ребра являются ориентированными. Также заметим, что в графе могут быть петли и кратные рёбра.

Гарантируется, сумма \(n\) и сумма \(m\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два числа — длину самого длинного простого пути в \(H\) и минимально возможное значение такого пути.

Примечание

В первом наборе входных данных самый длинный путь в обоих графах равен \(1 \to 3 \to 4 \to 5 \to 2\). Поскольку путь включает все вершины, то минимально возможное значение самого длинного пути равно сумме значений по всем вершинам, которое равняется \(12\).

Во втором наборе входных данных самый длинный путь равен \(1 \to 2 \to 3 \to 4 \to 6 \to 7\). Поскольку самых длинных путей с вершиной \(5\) не существует, то такой путь имеет минимально возможное значение \(5\,999\,999\,995\).

В третьем наборе входных данных можно доказать, что не существует пути длиннее \(11\) и что значение самого длинного пути не может быть меньше \(37\). Также заметим, что данный граф содержит петли и кратные ребра.

F. Локальные удаления

Бинарный поиск реализация Структуры данных *2800

Для массива \(b_1, b_2, \ldots, b_m\), для индекса \(i\) (\(1 < i < m\)) элемент \(b_i\) считается локальным минимумом, если \(b_i < b_{i-1}\) и \(b_i < b_{i+1}\). Элемент \(b_1\) считается локальным минимумом, если \(b_1 < b_2\). Элемент \(b_m\) считается локальным минимумом, если \(b_m < b_{m-1}\).

Для массива \(b_1, b_2, \ldots, b_m\), для индекса \(i\) (\(1 < i < m\)) элемент \(b_i\) считается локальным максимумом, если \(b_i > b_{i-1}\) и \(b_i > b_{i+1}\). Элемент \(b_1\) считается локальным максимумом, если \(b_1 > b_2\). Элемент \(b_m\) считается локальным максимумом, если \(b_m > b_{m-1}\).

Пусть \(x\) — массив, в котором все элементы различны. Определим две операции над ним.

  • \(1\) — удалить из \(x\) все элементы, которые не являются локальными минимумами.
  • \(2\) — удалить из \(x\) все элементы, которые не являются локальными максимумами.

Определим \(f(x)\) следующим образом: повторять операции \(1, 2, 1, 2, \ldots\) в таком порядке, пока в массиве не останется только один элемент. В конце вернуть этот элемент.

Например, возьмем массив \([1,3,2]\). Сначала выполним операцию типа \(1\) и получим \([1, 2]\). Затем выполним операцию типа \(2\) и получим \([2]\). Значит, \(f([1,3,2]) = 2\).

Дана перестановка\(^\dagger\) \(a\) длины \(n\) и \(q\) запросов. Каждый запрос состоит из двух целых чисел \(l\) и \(r\) таких, что \(1 \le l \le r \le n\). Для каждого запроса требуется посчитать \(f([a_l, a_{l+1}, \ldots, a_r])\).

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 10^5\)) — длину перестановки \(a\) и количество запросов.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — элементы перестановки \(a\).

В \(i\)-й из следующих \(q\) строк содержатся два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le n\)) — описание \(i\)-го запроса.

Выходные данные

Для каждого запроса выведите одно целое число — ответ на этот запрос.

Примечание

В первом запросе первого примера единственным числом в подотрезке массива является \(1\), поэтому оно и является ответом.

Во втором запросе первого примера наш подотрезок изначально имеет вид \([1, 4]\). После выполнения операции типа \(1\) мы получаем \([1]\).

В третьем запросе первого примера наш подотрезок изначально имеет вид \([4, 3]\). После выполнения операции типа \(1\) мы получаем \([3]\).

В четвертом запросе первого примера наш подотрезок изначально имеет вид \([1, 4, 3, 6]\). После выполнения операции типа \(1\) мы получаем \([1, 3]\). Затем выполняем операцию типа \(2\) и получаем \([3]\).

В пятом запросе первого примера наш подотрезок изначально имеет вид \([1, 4, 3, 6, 2, 7, 5]\). После выполнения операции типа \(1\) мы получаем \([1,3,2,5]\). После выполнения операции типа \(2\) получаем \([3,5]\). Затем выполняем операцию типа \(1\) и получаем \([3]\).

В первом и единственном запросе второго примера наш подотрезок изначально имеет вид \([1,2,3,4,5,6,7,8,9,10]\). Здесь \(1\) — единственный локальный минимум, поэтому после выполнения операции типа \(1\) остается только он.

D. Очередное сражение с монстрами

Бинарный поиск дп жадные алгоритмы математика реализация *1700

Вася — волшебник, который сражается с монстрами. В очередной раз. В ряд расположены \(n\) монстров, количество очков здоровья \(i\)-го монстра равно \(a_i\).

Вася — очень могущественный волшебник и знает очень много мощных заклинаний. В этом сражении он решил использовать цепную молнию, чтобы победить всех монстров. Давайте посмотрим, как работает это заклинание.

Сначала Вася выбирает индекс какого-то монстра \(i\) (\(1 \le i \le n\)) и изначальную силу заклинания \(x\). Затем заклинание поражает монстров ровно \(n\) раз, каждого монстра ровно один раз. Первой целью заклинания всегда является монстр \(i\). Каждой целью заклинания, за исключением первой, выбирается случайный монстр, который еще не был поражен заклинанием и является соседним к одному из пораженных монстров. Таким образом, каждый из монстров будет поражен ровно единожды. Первый монстр, пораженный заклинанием, получает \(x\) единиц урона, второй получает \((x-1)\) единиц урона, третий получает \((x-2)\) единиц урона, и так далее.

Вася хочет показать, насколько он силен, поэтому он хочет убить всех монстров за одно применение цепной молнии. Монстр считается мертвым тогда, когда его количество очков здоровья меньше либо равно урону, который он получил. С другой стороны, Вася хочет показать, что он не настолько сильно переживает за сражение, поэтому он хочет выбрать минимальную изначальную силу заклинания \(x\), способную убить всех монстров вне зависимости от того, какой монстр (среди тех, кто может получить урон) получит урон на каждом из шагов.

Вася, конечно же, является волшебником, но количество вычислений, необходимое для нахождения оптимального варианта применения заклинания, выше его возможностей, поэтому вам поручено помочь ему найти минимальную силу заклинания, необходимую для убийства всех монстров.

Заметьте, что Вася выбирает изначальную цель и силу заклинания, другие события являются случайными и Вася хочет убить всех монстров даже в худшем из возможных исходов.

Входные данные

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)) — количество монстров.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)), где \(a_i\) равно количеству очков здоровья \(i\)-го монстра.

Выходные данные

Выведите одно целое число — минимальную силу заклинания, необходимую для убийства всех монстров, если Вася выберет первую цель заклинания оптимально, а порядок ударов заклинания может быть любым возможным, удовлетворяющим правилам задачи.

D. Запросы робота

Бинарный поиск дп реализация Структуры данных *1900

В точке \((0, 0)\) \(2\)-мерной плоскости стоит робот. Робот может выполнять четыре команды:

  • U — переместиться из точки \((x, y)\) в \((x, y + 1)\);
  • D — переместиться из точки \((x, y)\) в \((x, y - 1)\);
  • L — переместиться из точки \((x, y)\) в \((x - 1, y)\);
  • R — переместиться из точки \((x, y)\) в \((x + 1, y)\).

Задана последовательность команд \(s\) длины \(n\). Ваша задача — ответить на \(q\) независимых запросов: для четырех целых чисел \(x\), \(y\), \(l\) и \(r\) определить, посетит ли робот точку \((x, y)\), выполняя последовательность \(s\), где подстрока с \(l\) по \(r\) перевернута (то есть робот выполняет команды в порядке \(s_1 s_2 s_3 \dots s_{l-1} s_r s_{r-1} s_{r-2} \dots s_l s_{r+1} s_{r+2} \dots s_n\)).

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — длину последовательности команд и количество запросов соответственно.

Вторая строка содержит строку \(s\) длины \(n\), состоящую из символов U, D, L и/или R.

Затем следуют \(q\) строк, \(i\)-я из них содержит четыре целых числа \(x_i\), \(y_i\), \(l_i\) и \(r_i\) (\(-n \le x_i, y_i \le n\); \(1 \le l \le r \le n\)), описывающие \(i\)-й запрос.

Выходные данные

Для каждого запроса выведите YES, если робот посещает точку \((x, y)\), выполняя последовательность \(s\), где подстрока с \(l\) по \(r\) перевернута; в противном случае выведите NO.

Примечание

В первом запросе первого примера путь робота выглядит следующим образом:

Во втором запросе первого примера путь робота выглядит следующим образом:

В третьем запросе первого примера путь робота выглядит следующим образом:

F. Снова деревья и XOR-запросы

графы Деревья математика поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2400

Вам дано дерево, состоящее из \(n\) вершин. На каждой вершине написано целое число; на \(i\)-й вершине написано число \(a_i\).

Вам необходимо обработать \(q\) запросов. \(i\)-й запрос состоит из трех целых чисел \(x_i\), \(y_i\) и \(k_i\). Для этого запроса вы должны ответить, возможно ли выбрать набор вершин \(v_1, v_2, \dots, v_m\) (возможно, пустой) так, чтобы:

  • каждая вершина \(v_j\) находилась на простом пути между \(x_i\) и \(y_i\) (в том числе можно использовать концы пути);
  • \(a_{v_1} \oplus a_{v_2} \oplus \dots \oplus a_{v_m} = k_i\), где \(\oplus\) обозначает оператор побитового исключающего ИЛИ.
Входные данные

Первая строка содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 2^{20} - 1\)).

Затем следуют \(n-1\) строк. Каждая из них содержит два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\); \(u \ne v\)), обозначающие ребро дерева.

Следующая строка содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Затем следуют \(q\) строк. В \(i\)-й из них содержатся три целых числа \(x_i\), \(y_i\) и \(k_i\) (\(1 \le x_i, y_i \le n\); \(0 \le k_i \le 2^{20} - 1\)).

Выходные данные

Для каждого запроса выведите YES, если возможно сформировать набор вершин, удовлетворяющий ограничениям. В противном случае выведите NO.

Каждую букву можно выводить в любом регистре.

A. Вилка!

Перебор реализация *900

Ланчбоксу надоело играть в шахматы! Его соперник только что снова поставил вилку королю и ферзю!

В шахматах вилка — ситуация, когда конь атакует две фигуры более высокого достоинства, обычно короля и ферзя. Ланчбокс знает, что кони могут делать очень хитрые ходы, а в той версии шахмат, в которую он играет, кони еще хитрее: вместо того, чтобы двигаться на \(1\) клетку в одну сторону и на \(2\) клетки в другую, кони в модифицированной игре Ланчбокса двигаются на \(a\) клеток в одну сторону и на \(b\) клеток в другую.

Ланчбокс играет в шахматы на бесконечной шахматной доске, которая содержит все клетки \((x,y)\), где \(x\) и \(y\) — (возможно, отрицательные) целые числа. Король и ферзь Ланчбокса размещены на клетках \((x_K,y_K)\) и \((x_Q,y_Q)\) соответственно. Найдите количество позиций, для которых, если на эту клетку поставить коня, он будет атаковать и короля, и ферзя.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(a\) и \(b\) (\(1 \le a, b \le 10^8\)) — описание возможных ходов коня.

Вторая строка каждого набора входных данных содержит два целых числа \(x_K\) и \(y_K\) (\(0 \le x_K, y_K \le 10^8\)) — позицию короля Ланчбокса.

Третья строка в наборе входных данных содержит два целых числа \(x_Q\) и \(y_Q\) (\(0 \le x_Q, y_Q \le 10^8\)) — позицию ферзя Ланчбокса.

Гарантируется, что ферзь и король Ланчбокса находятся на разных клетках. То есть \((x_K,y_K) \neq (x_Q,y_Q)\).

Выходные данные

Для каждого набора входных данных выведите количество позиций на бесконечной шахматной доске, на которых конь может атаковать и короля, и ферзя.

Примечание

В первом наборе входных данных конь может перемещаться на 2 клетки в одну сторону и на 1 клетку в другую (по сути, это то же самое, что и конь в стандартных шахматах). Конь, поставленный на \((2, 1)\) или \((1, 2)\), будет атаковать и короля, и ферзя.

Пример размещения коня, который атакует ферзя и короля в первом наборе входных данных. Клетки, которые атакует конь, выделены красным цветом.

Во втором наборе входных данных конь, размещенный на \((2, 2)\), атакует и короля, и ферзя.

Пример размещения коня, который не ставит вилку на ферзя и короля во втором наборе входных данных. Конь атакует короля, но не ферзя.

В третьем наборе входных данных конь, размещенный на \((4, 4)\) или \((4, -4)\), будет атаковать и короля, и ферзя.

В четвертом наборе входных данных нет позиций, на которых конь мог бы атаковать и короля, и ферзя.

(Спасибо EnDeRBeaT за красивые картинки)

D2. Присвоить максимум (сложная версия)

жадные алгоритмы Конструктив разделяй и властвуй реализация сортировки Структуры данных *1800

Это сложная версия задачи. Единственное различие между двумя версиями — это ограничение на \(n\) и ограничение по времени. Вы можете делать взломы, только если обе версии задачи решены.

Вам даны два массива \(a\) и \(b\) длины \(n\).

Вы можете выполнить следующую операцию несколько (возможно, ноль) раз:

  1. выбрать \(l\) и \(r\) такие, что \(1 \leq l \leq r \leq n\).
  2. пусть \(x=\max(a_l,a_{l+1},\ldots,a_r)\).
  3. для всех \(l \leq i \leq r\), присвоить \(a_i := x\).

Определите, можно ли сделать массив \(a\) равным массиву \(b\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину массивов.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — элементы массива \(a\).

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le n\)) — элементы массива \(b\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если вы можете превратить \(a\) в \(b\) с помощью данных операций, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных мы можем получить массив \(b\), применив единственную операцию: \((l,r)=(2,3)\).

Во втором наборе входных данных можно показать, что мы не можем получить массив \(b\) ни при каком количестве операций.

В третьем наборе входных данных массив \(b\) можно получить, применив две операции: \((l,r)=(2,5)\) и \((l,r)=(1,3)\).

В четвертом и пятом наборах входных данных можно показать, что массив \(b\) не может быть получен ни при каком количестве операций.

E. Запросы на дереве

графы Деревья поиск в глубину и подобное реализация Структуры данных *2500

Кто не работает, тот не ест. Получи то, что ты хочешь своими силами. Поверь, искренние и серьёзные люди всегда смеются последними. Но я всё равно не дам тебе подарка.
—Санта, Hayate no Gotoku!

Поскольку Хаяте не получил никаких рождественских подарков от Санты, его вместо этого ожидает решение задачи на запросы на дереве.

У Хаяте есть дерево с \(n\) вершинами.

Теперь Хаяте хочет, чтобы вы ответили на \(q\) запросов. Каждый запрос состоит из вершины \(x\) и \(k\) других дополнительных вершин \(a_1,a_2,\ldots,a_k\). Эти \(k+1\) вершина гарантированно различны.

Для каждого запроса необходимо найти длину самого длинного простого пути, начинающегося в вершине \(x^\dagger\) после удаления вершин \(a_1,a_2,\ldots,a_k\) вместе со всеми ребрами, соединенными хотя бы с одной из вершин \(a_1,a_2,\ldots,a_k\).

\(^\dagger\) Простой путь длины \(k\), начинающийся в вершине \(x\) — это последовательность различных вершин \(x=u_0,u_1,\ldots,u_k\) таких, что существует ребро между вершинами \(u_{i-1}\) и \(u_i\) для всех \(1 \leq i \leq k\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество вершин дерева и количество запросов.

Следующие \(n - 1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — в дереве есть ребро между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Следующие \(q\) строк описывают запросы. Каждая строка содержит целые числа \(x\), \(k\) и \(a_1,a_2,\ldots,a_k\) (\(1 \leq x \leq n\), \(0 \leq k < n\), \(1 \leq a_i \leq n\)) — начальная вершина, количество удаленных вершин и удаленные вершины.

Гарантируется, что в запросе все вершины \(x,a_1,a_2,\ldots,a_k\) различны.

Гарантируется, что сумма \(k\) по всем запросам не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите одно целое число, являющееся ответом на этот запрос.

Примечание

В первом примере дерево выглядит следующим образом:

В первом запросе ни одна вершина не пропущена. Самый длинный простой путь, начинающийся в вершине \(2\), это \(2 \to 1 \to 3 \to 4\). Таким образом, ответ — \(3\).

Во третьем запросе отсутствуют вершины \(1\) и \(6\), и дерево показано ниже. Самый длинный простой путь из вершины \(2\) — это \(2 \to 5\). Таким образом, ответ — \(1\).

F. Прекрасное дерево

графы Деревья поиск в глубину и подобное реализация Структуры данных *2800

У Ланчбокса есть дерево размера \(n\) с корнем в вершине \(1\). Каждой вершине присваивается значение. Ланчбокс считает дерево прекрасным, если каждое значение является уникальным и находится в диапазоне от \(1\) до \(n\). Кроме того, прекрасное дерево должно удовлетворять \(m\) требованиям \(2\) типов:

  • «1 a b c» — Вершина с наименьшим значением на пути между вершинами \(a\) и \(b\) должна быть \(c\).
  • «2 a b c» — Вершина с наибольшим значением на пути между вершинами \(a\) и \(b\) должна быть \(c\).

Теперь вы должны присвоить значения каждой вершине так, чтобы получившееся дерево было прекрасным. Если это невозможно, выведите \(-1\).

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(2 \le n, m \le 2 \cdot 10^5\)).

Следующие \(n - 1\) строк содержат по два целых числа \(u\) и \(v\) (\(1 \le u, v \le n, u \ne v\)) — в дереве есть ребро между вершинами \(u\) и \(v\). Гарантируется, что заданные ребра образуют дерево.

Следующие \(m\) строк содержат по четыре целых числа \(t\), \(a\), \(b\) и \(c\) (\(t \in \{1,2\}\), \(1 \le a, b, c \le n\)). Гарантируется, что вершина \(c\) находится на пути между вершинами \(a\) и \(b\).

Выходные данные

Если невозможно присвоить значения так, чтобы дерево было прекрасным, выведите \(-1\). В противном случае выведите \(n\) целых чисел, \(i\)-е из которых обозначает значение вершины \(i\).

D. Циклический MEX

математика реализация Структуры данных *2000

Для массива \(a\) определим его стоимость как \(\sum_{i=1}^{n} \operatorname{mex} ^\dagger ([a_1,a_2,\ldots,a_i])\).

Вам дана перестановка\(^\ddagger\) \(p\) множества \(\{0,1,2,\ldots,n-1\}\). Найдите максимальную стоимость среди всех циклических сдвигов \(p\).

\(^\dagger\operatorname{mex}([b_1,b_2,\ldots,b_m])\) — это наименьшее неотрицательное целое число \(x\), такое что \(x\) не встречается среди \(b_1,b_2,\ldots,b_m\).

\(^\ddagger\)Перестановкой множества \(\{0,1,2,...,n-1\}\) является массив, состоящий из \(n\) различных целых чисел от \(0\) до \(n-1\) в произвольном порядке. Например, \([1,2,0,4,3]\) — перестановка, но \([0,1,1]\) не перестановка (\(1\) встречается дважды в массиве), и \([0,2,3]\) тоже не перестановка (\(n=3\), но есть \(3\) в массиве).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^6\)) — длина перестановки \(p\).

Вторая строка каждого набора входных данных содержит \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(0 \le p_i < n\)) — элементы перестановки \(p\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальную стоимость среди всех циклических сдвигов \(p\).

Примечание

В первом наборе входных данных циклическим сдвигом, дающим максимальную стоимость, является \([2,1,0,5,4,3]\) со стоимостью \(0+0+3+3+3+6=15\).

Во втором наборе входных данных циклическим сдвигом, дающим максимальную стоимость, является \([0,2,1]\) со стоимостью \(1+1+3=5\).

A. Ладья

реализация *800

Как вы, вероятно, знаете, шахматы — это игра, которая ведется на доске с 64 клетками, расположенными в сетке \(8\times 8\). Столбцы этой доски обозначены буквами от a до h, а строки — цифрами от 1 до 8. Каждая клетка описывается строкой и столбцом, к которым она принадлежит.

Ладья — это фигура в игре шахматы. За ход она может перемещаться на любое ненулевое количество клеток по горизонтали или вертикали. Ваша задача — найти все возможные ходы для ладьи на пустой шахматной доске.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 64\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Каждый набор входных данных содержит одну строку из двух символов — описание клетки, на которой расположена ладья. Первый символ — это буква от a до h, обозначение столбца, и второй символ — это цифра от 1 до 8, обозначение строки.

Одна и та же позиция может встречаться в более чем одном наборе входных данных.

Выходные данные

Для каждого набора входных данных выведите описания всех клеток, куда может пойти ладья, в том же формате, что и во входных данных.

В ответе для каждого набора входных данных вы можете выводить клетки в любом порядке.

B. YetnotherrokenKeoard

реализация Строки Структуры данных *1000

У Поликарпа беда — сломалась клавиатура на его ноутбуке.

Теперь, когда он нажимает клавишу 'b', она отрабатывает подобно необычному backspace: происходит удаление последней (самой правой) строчной буквы в набранной строке. Если в набранной строке нет ни одной строчной буквы, то нажатие полностью игнорируется.

Аналогично, когда он нажимает клавишу 'B', то происходит удаление последней (самой правой) прописной буквы в набранной строке. Если в набранной строке нет ни одной прописной буквы, то нажатие полностью игнорируется.

В обоих случаях буквы 'b' и/или 'B' при нажатии на эти клавиши не добавляются в набранную строку.

Рассмотрим пример. Пусть последовательность нажатий имела вид «ARaBbbitBaby». В этом случае набранная строка будет изменяться следующим образом: «» \(\xrightarrow{\texttt{A}}\) «A» \(\xrightarrow{\texttt{R}}\) «AR» \(\xrightarrow{\texttt{a}}\) «ARa» \(\xrightarrow{\texttt{B}}\) «Aa» \(\xrightarrow{\texttt{b}}\) «A» \(\xrightarrow{\texttt{b}}\) «A» \(\xrightarrow{\texttt{i}}\) «Ai» \(\xrightarrow{\texttt{t}}\) «Ait» \(\xrightarrow{\texttt{B}}\) «it» \(\xrightarrow{\texttt{a}}\) «ita» \(\xrightarrow{\texttt{b}}\) «it» \(\xrightarrow{\texttt{y}}\) «ity».

По заданной последовательности нажатых клавиш выведите набранную строку после обработки всех нажатий.

Входные данные

В первой строке входных данных содержится целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных в тесте.

Далее содержится \(t\) непустых строк, которые состоят из строчных и прописных букв латинского алфавита.

Гарантируется, что каждая строка содержит хотя бы одну букву и сумма длин строк не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите результат обработки нажатий в отдельной строке. Если набранная строка пустая, то выведите пустую строку.

G. Освещение

графы жадные алгоритмы Конструктив Перебор поиск в глубину и подобное реализация *2200

В конце дня Анне нужно выключить свет в офисе. Есть \(n\) ламп и \(n\) выключателей, но схема их работы довольно странная. Выключатель \(i\) меняет состояние лампы \(i\), но также меняет состояние другой лампы \(a_i\) (изменение состояния означает, что если лампа была включена, она выключается, и наоборот).

Помогите Анне выключить все лампы, используя минимальное количество выключателей, или скажите, что это невозможно.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит целое число \(n\) (\(2 \le n \le 10^5\)) — количество ламп.

Вторая строка каждого набора содержит строку из \(n\) символов — начальное состояние ламп. Символ «0» означает, что соответствующая лампа выключена, а «1» означает, что она включена.

Третья строка каждого набора содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le n\), \(a_i \neq i\)) — выключатель \(i\) меняет состояние лампы \(i\) и лампы \(a_i\).

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2 \cdot 10^5\)

Выходные данные

Для каждого набора входных данных выведите целое число \(k\) — минимальное количество выключателей, которое нужно использовать, затем в отдельной строке выведите список из \(k\) выключателей.

Если невозможно выключить все лампы, выведите одно целое число \(-1\).

A. Различные кнопки

математика реализация *800

Вы находитесь в точке \((0, 0)\) бесконечной координатной плоскости. У вас есть контроллер с \(4\) кнопками, выполняющими следующие операции:

  • \(\texttt{U}\): перемещение из \((x, y)\) в \((x, y+1)\);
  • \(\texttt{R}\): перемещение из \((x, y)\) в \((x+1, y)\);
  • \(\texttt{D}\): перемещение из \((x, y)\) в \((x, y-1)\);
  • \(\texttt{L}\): перемещение из \((x, y)\) в \((x-1, y)\).

К сожалению, контроллер сломан. Если нажать все \(4\) кнопки (в любом порядке), контроллер перестанет работать. Это значит, что за всю поездку можно нажать не более \(3\) различных кнопок (любое количество раз, в любом порядке).

На плоскости есть \(n\) особых точек с целочисленными координатами \((x_i, y_i)\).

Можете ли вы посетить все особые точки (в любом порядке), не сломав контроллер?

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке указано количество наборов входных данных \(t\) (\(1 \le t \le 1000\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество особых точек.

Каждая из следующих \(n\) строк содержит по два целых числа \(x_i\), \(y_i\) (\(-100 \leq x_i, y_i \leq 100\)) — координаты особой точки \((x_i, y_i)\).

Обратите внимание, что на сумму \(n\) по всем наборам входных данных нет никаких ограничений.

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если вы можете достичь всех особых точек, не сломав контроллер, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных вы можете перемещаться следующим образом:

  • вы начинаете с \((0, 0)\);
  • вы посещаете специальную точку \((x_2, y_2) = (0, 0)\);
  • Вы нажимаете \(\texttt{R}\), и перемещаетесь из \((0, 0)\) в \((1, 0)\);
  • вы нажимаете \(\texttt{D}\), и вы перемещаетесь из \((1, 0)\) в \((1, -1)\);
  • вы посещаете особую точку \((x_1, y_1) = (1, -1)\);
  • вы посещаете особую точку \((x_3, y_3) = (1, -1)\).

Таким образом, вы можете посетить все особые точки, используя только кнопки \(\texttt{R}\), \(\texttt{D}\), поэтому контроллер не сломается.

Обратите внимание, что особые точки могут совпадать.

Во втором наборе входных данных можно показать, что можно посетить все особые точки, используя только кнопки \(\texttt{U}\), \(\texttt{D}\), \(\texttt{L}\).

В третьем наборе входных данных можно показать, что для посещения всех точек необходимо нажать все кнопки (\(\texttt{U}\), \(\texttt{R}\), \(\texttt{D}\), \(\texttt{L}\)), поэтому контроллер сломается.

A. Имя пользователя

*особая задача реализация *1100

На официальном сайте Берляндии каждая учетная запись имеет два параметра: имя пользователя и ID.

Имя пользователя — это строка, которая состоит из строчных латинских букв и/или цифр и содержит хотя бы одну букву. Например, user0, 1fox1, zzzz являются корректными именами пользователей, а 1337 и User22 — нет.

ID учетной записи для данного имени пользователя генерируется следующим образом: к концу имени пользователя приписывается положительное целое число без ведущих нулей. Например, ID user0125 может быть сгенерирован следующими именами пользователей: user012, user01, user0; но не user и не us.

Вам задана строка \(s\) — действительный ID. Ваша задача — определить любое допустимое имя пользователя, которое может сгенерировать данный ID. Если существует несколько правильных имен пользователей, вы можете вывести любое из них.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит строку \(s\) (\(2 \le |s| \le 50\)), состоящую из строчных латинских букв и/или цифр.

Дополнительное ограничение на входные данные: существует хотя бы одно допустимое имя пользователя, которое может сгенерировать данный ID.

Выходные данные

Для каждого набора входных данных на отдельной строке выведите строку — любое допустимое имя пользователя, которое может сгенерировать данный ID. Если существует несколько правильных имен пользователей, вы можете вывести любое из них.

C. Ядовитое болото

*особая задача *особая задача реализация реализация *1600

Первая локация в новейшей фэнтези ролевой игре «Ancient Staff» — это ядовитое болото. В болоте растут кувшинки. Его можно представить как сетку \(2 \times n\) (\(2\) строки и \(n\) столбцов), где каждая ячейка либо пустая, либо содержит кувшинку.

В болото ровно \(n\) кувшинок — по одной в каждом столбце. На каждой кувшинке сидит лягушка. За один ход лягушка обязана прыгнуть в соседнюю по стороне ячейку.

После хода никакая лягушка не может оказаться за границей сетки, и никакие две лягушки не могут находиться на одной кувшинке. Две лягушки из соседних не могут прыгать навстречу друг другу (то есть меняться ячейками).

Если лягушка прыгает на кувшинку, то она выживает. Иначе она попадает в ядовитое болото, и ее поглощает древнее существо, живущее на его дне.

Вы можете выбирать, в каком направлении прыгает каждая лягушка. Определите наибольшее количество лягушек, которые могут выжить после одного хода.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество столбцов в сетке болота.

В каждой из следующих двух строк записано описание строки болота — строка, состоящая из ровно \(n\) символов. Каждый символ — либо точка ('.'), означающая ячейку с болотом, либо звездочка ('*'), означающая ячейку с кувшинкой и лягушкой.

В каждом столбце ровно одна точка и ровно одна звездочка. Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — наибольшее количество лягушек, которые могут выжить после одного хода, если вы выберете направление для прыжка каждой лягушке.

Примечание

\(i\)-я лягушка — это лягушка на кувшинке в \(i\)-м столбце.

В первом наборе входных данных:

  • первая лягушка не может выжить, потому что нет соседних кувшинок;
  • вторая и третья лягушки могут прыгнуть вправо и наверх, соответственно, — их обеих одновременно спасти не получится;
  • четвертая и пятая лягушки могут прыгнуть влево и влево, соответственно, — их обеих одновременно спасти не получится; обратите внимание, однако, что третья и четвертая лягушки окажутся в одной ячейке с болотом, что не запрещено.

C. Ядовитое болото

*особая задача *особая задача реализация реализация *1600

Первая локация в новейшей фэнтези ролевой игре «Ancient Staff» — это ядовитое болото. В болоте растут кувшинки. Его можно представить как сетку \(2 \times n\) (\(2\) строки и \(n\) столбцов), где каждая ячейка либо пустая, либо содержит кувшинку.

В болото ровно \(n\) кувшинок — по одной в каждом столбце. На каждой кувшинке сидит лягушка. За один ход лягушка обязана прыгнуть в соседнюю по стороне ячейку.

После хода никакая лягушка не может оказаться за границей сетки, и никакие две лягушки не могут находиться на одной кувшинке. Две лягушки из соседних не могут прыгать навстречу друг другу (то есть меняться ячейками).

Если лягушка прыгает на кувшинку, то она выживает. Иначе она попадает в ядовитое болото, и ее поглощает древнее существо, живущее на его дне.

Вы можете выбирать, в каком направлении прыгает каждая лягушка. Определите наибольшее количество лягушек, которые могут выжить после одного хода.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество столбцов в сетке болота.

В каждой из следующих двух строк записано описание строки болота — строка, состоящая из ровно \(n\) символов. Каждый символ — либо точка ('.'), означающая ячейку с болотом, либо звездочка ('*'), означающая ячейку с кувшинкой и лягушкой.

В каждом столбце ровно одна точка и ровно одна звездочка. Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — наибольшее количество лягушек, которые могут выжить после одного хода, если вы выберете направление для прыжка каждой лягушке.

Примечание

\(i\)-я лягушка — это лягушка на кувшинке в \(i\)-м столбце.

В первом наборе входных данных:

  • первая лягушка не может выжить, потому что нет соседних кувшинок;
  • вторая и третья лягушки могут прыгнуть вправо и наверх, соответственно, — их обеих одновременно спасти не получится;
  • четвертая и пятая лягушки могут прыгнуть влево и влево, соответственно, — их обеих одновременно спасти не получится; обратите внимание, однако, что третья и четвертая лягушки окажутся в одной ячейке с болотом, что не запрещено.

A. Увеличение рейтинга

реализация *800

Монокарп отлично решает адхок задачи. Недавно он поучаствовал в Educational Codeforces Round и поднял свой рейтинг!

Монокарп помнил, что до раунда его рейтинг был \(a\). После раунда он увеличился до \(b\) (\(b > a\)). Он записал оба значения одно за другим, чтобы не забыть их.

Однако он записал их так близко друг к другу, что теперь не может определить, где заканчивается первое значение и начинается второе.

Пожалуйста, помогите ему найти значения \(a\) и \(b\) такие, что:

  • ни одно из них не содержит ведущих нулей;
  • оба строго больше \(0\);
  • \(b > a\);
  • они образуют заданное значение \(ab\), если записать их одно за другим.

Если есть несколько ответов, вы можете вывести любой из них.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В единственной строке каждого набора входных данных записана одна строка \(ab\) длиной от \(2\) до \(8\), которая:

  • состоит только из цифр;
  • не начинается с нуля.
Выходные данные

Для каждого набора входных данных определите, существуют ли такие значения \(a\) и \(b\). Если нет, напечатайте -1. В противном случае напечатайте два целых числа \(a\) и \(b\).

Если есть несколько ответов, вы можете вывести любой из них.

Примечание

Во втором наборе входных данных также можно напечатать \(3\) и \(91125\).

В третьем наборе \(20\) и \(0200\) не подходит, потому что \(b\) имеет ведущий ноль. \(200\) и \(200\) не подходит, потому что \(200\) не строго больше \(200\).

A. Журнал решения задач

реализация Строки *800

Монокарп участвует в соревновании по программированию, в котором \(26\) задач, обозначенных от 'A' до 'Z'. Задачи отсортированы по сложности. Более того, известно, что Монокарп может решить задачу 'A', потратив на нее \(1\) минуту, задачу 'B', потратив на нее \(2\) минуты, ..., задачу 'Z', потратив на нее \(26\) минут.

После соревнования вы нашли его журнал соревнования — строку, состоящую из заглавных латинских букв, такую, что \(i\)-я буква означает, какую задачу Монокарп решал в \(i\)-ю минуту соревнования. Если Монокарп потратил суммарно достаточно времени на решение задачи, он ее решил. Обратите внимание, что Монокарп мог думать о задаче после ее решения.

По журналу соревнования Монокарпа, вычислите количество задач, которые он решил во время соревнования.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 500\)) — продолжительность соревнования в минутах.

Во второй строке записана строка длиной ровно \(n\), состоящая только из заглавных латинских букв, — журнал соревнования Монокарпа.

Выходные данные

На каждый набор входных данных выведите одно целое число — количество задач, которые Монокарп решил во время соревнования.

D. Три активности

дп жадные алгоритмы Перебор реализация сортировки *1200

Приближаются зимние каникулы. Они будут длиться \(n\) дней.

Во время каникул Монокарп с друзьями хочет ровно по одному разу:

  • пойти кататься на лыжах;
  • посмотреть фильм в кинотеатре;
  • поиграть в настольные игры.

Монокарп знает, что в \(i\)-й день ровно \(a_i\) друзей соберутся на катание на лыжах, \(b_i\) друзей — на просмотр фильма и \(c_i\) друзей — на настольные игры.

Монокарп также знает, что он не может заниматься более чем одной активностью в течение одного дня.

Поэтому он просит вас помочь ему выбрать три различных дня \(x, y, z\) таким образом, чтобы общее количество друзей, присоединившихся к нему на активности (\(a_x + b_y + c_z\)), было максимальным.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого теста содержит одно целое число \(n\) (\(3 \le n \le 10^5\)) — продолжительность зимних каникул в днях.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^8\)) — количество друзей, которые присоединятся к Монокарпу для катания на лыжах в \(i\)-й день.

Третья строка содержит \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le 10^8\)) — количество друзей, которые присоединятся к Монокарпу для просмотра фильма в \(i\)-й день.

Четвертая строка содержит \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le 10^8\)) — количество друзей, которые присоединятся к Монокарпу для настольных игры в \(i\)-й день.

Сумма \(n\) по всем тестам не превышает \(10^5\).

Выходные данные

На каждый набор входных данных выведите одно целое число — максимальное суммарное количество друзей, которые могут присоединиться к Монокарпу за три различных дня.

Примечание

В первом наборе входных данных Монокарп может выбрать день \(2\) для катания на лыжах, день \(1\) для просмотра фильма и день \(3\) для настольных игр. Таким образом, \(a_2 = 10\) друзей присоединятся к нему для катания на лыжах, \(b_1 = 10\) друзей присоединятся к нему для просмотра фильма и \(c_3 = 10\) друзей присоединятся к нему для настольных игр. Общее количество друзей составляет \(30\).

Во втором наборе Монокарп может выбрать день \(1\) для катания на лыжах, день \(4\) для просмотра фильма и день \(2\) для настольных игр. Всего соберется \(30 + 20 + 25 = 75\) друзей. Обратите внимание, что Монокарп не может выбрать день \(1\) для всех активностей, потому что он не может заниматься более чем одной активностью в течение одного дня.

В третьем наборе Монокарп может выбрать день \(2\) для катания на лыжах, день \(3\) для просмотра фильма и день \(7\) для настольных игр. Всего соберется \(19 + 19 + 17 = 55\) друзей.

В третьем наборе Монокарп может выбрать день \(1\) для катания на лыжах, день \(4\) для просмотра фильма и день \(9\) для настольных игр. Всего соберется \(17 + 19 + 20 = 56\) друзей.

A. Выброс

битмаски реализация *800

Вам даны три цифры \(a\), \(b\), \(c\). Две из них равны, но третья отличается от остальных двух.

Найдите значение, которое встречается ровно один раз.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 270\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит три цифры \(a\), \(b\), \(c\) (\(0 \leq a\), \(b\), \(c \leq 9\)). Две из цифр равны, но третья отличается от остальных двух.

Выходные данные

Для каждого набора входных данных выведите значение, которое встречается ровно один раз.

B. Не совсем латинский квадрат

битмаски Перебор реализация *800

Латинский квадрат — это сетка \(3 \times 3\), состоящая из букв \(\texttt{A}\), \(\texttt{B}\) и \(\texttt{C}\) таким образом, что:

  • в каждой строке буквы \(\texttt{A}\), \(\texttt{B}\) и \(\texttt{C}\) появляются по одному разу, и
  • в каждом столбце буквы \(\texttt{A}\), \(\texttt{B}\) и \(\texttt{C}\) появляются по одному разу.
Например, один из возможных латинских квадратов показан ниже. \(\)\begin{bmatrix} \texttt{A} & \texttt{B} & \texttt{C} \\ \texttt{C} & \texttt{A} & \texttt{B} \\ \texttt{B} & \texttt{C} & \texttt{A} \\ \end{bmatrix}\(\)

Вам дан латинский квадрат, но одна из букв была заменена вопросительным знаком \(\texttt{?}\). Найдите букву, которая была заменена.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 108\)) — количество наборов входных данных.

Каждый набор состоит из трех строк, каждая из которых состоит из трех символов, представляющих латинский квадрат. Каждый символ — это одна из букв \(\texttt{A}\), \(\texttt{B}\), \(\texttt{C}\) или \(\texttt{?}\).

Каждый набор представляет собой латинский квадрат, в котором ровно одна из букв заменена вопросительным знаком \(\texttt{?}\).

Выходные данные

Для каждого набора входных данных выведите букву, которая была заменена.

Примечание

Правильные латинские квадраты для наборов входных данных примера показаны ниже:

\(\)\begin{bmatrix} \texttt{A} & \texttt{B} & \texttt{C} \\ \texttt{C} & \color{red}{\texttt{A}} & \texttt{B} \\ \texttt{B} & \texttt{C} & \texttt{A} \\ \end{bmatrix} \quad \begin{bmatrix} \texttt{B} & \texttt{C} & \texttt{A} \\ \texttt{C} & \texttt{A} & \color{red}{\texttt{B}} \\ \texttt{A} & \texttt{B} & \texttt{C} \\ \end{bmatrix} \quad \begin{bmatrix} \color{red}{\texttt{C}} & \texttt{A} & \texttt{B} \\ \texttt{B} & \texttt{C} & \texttt{A} \\ \texttt{A} & \texttt{B} & \texttt{C} \\ \end{bmatrix}\(\)

C. Можно ли построить квадрат?

Бинарный поиск реализация *800

У Калина есть \(n\) ведер, \(i\)-е из которых содержит \(a_i\) деревянных квадратов со стороной длиной \(1\).

Может ли Калин построить один большой квадрат, используя все заданные квадраты?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество ведер.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — количество квадратов в каждом ведре.

Сумма \(n\) по всем тестам не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если Калин может построить квадрат, используя все заданные квадраты \(1 \times 1\), и «NO» в противном случае.

Вы можете вывести ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных Калин может построить квадрат \(3 \times 3\).

Во втором наборе входных данных Калин может построить квадрат \(4 \times 4\).

В третьем наборе входных данных Калин не может построить квадрат, используя все заданные квадраты.

D. Нестандартная обработка языка

жадные алгоритмы реализация Строки *900

Лура скучала и решила создать простой язык, используя пять букв \(\texttt{a}\), \(\texttt{b}\), \(\texttt{c}\), \(\texttt{d}\), \(\texttt{e}\). Существуют два типа букв:

  • гласные — буквы \(\texttt{a}\) и \(\texttt{e}\). Они обозначаются как \(\textsf{V}\).
  • согласные — буквы \(\texttt{b}\), \(\texttt{c}\), \(\texttt{d}\). Они обозначаются как \(\textsf{C}\).
В языке существуют два типа слогов: \(\textsf{CV}\) (согласная, за которой следует гласная) или \(\textsf{CVC}\) (гласная с согласной до и после). Например, \(\texttt{ba}\), \(\texttt{ced}\), \(\texttt{bab}\) являются слогами, но \(\texttt{aa}\), \(\texttt{eda}\), \(\texttt{baba}\) — нет.

Слово в языке — это последовательность слогов. Лура написала слово на этом языке, но не знает, как разбить его на слоги. Помогите ей разбить слово на слоги.

Например, для слова \(\texttt{bacedbab}\) оно будет разбито на слоги как \(\texttt{ba.ced.bab}\) (точка \(\texttt{.}\) обозначает границу слога).

Входные данные

Ввод состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Затем следуют описания наборов.

Первая строка каждого набора содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — длина слова.

Вторая строка каждого набора содержит строку, состоящую из \(n\) строчных латинских символов — слово.

Все предоставленные слова являются допустимыми словами в языке; то есть, они используют только буквы \(\texttt{a}\), \(\texttt{b}\), \(\texttt{c}\), \(\texttt{d}\), \(\texttt{e}\), и каждое слово состоит из нескольких слогов.

Сумма \(n\) по всем тестам не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите строку, обозначающую слово, разбитое на слоги, вставив точку \(\texttt{.}\) между каждой парой смежных слогов.

Если существует несколько возможных разбиений, выведите любое из них. Ввод предоставлен таким образом, что по крайней мере одно возможное разбиение существует.

G. Велосипеды

графы жадные алгоритмы кратчайшие пути реализация сортировки *1800

Все друзья Славика планируют отправиться на вечеринку на своих велосипедах из места, где они живут. У всех есть велосипеды, кроме Славика. Есть \(n\) городов, через которые они могут путешествовать. Все живут в городе \(1\) и хотят пойти на вечеринку, которая находится в городе \(n\). Карту городов можно рассматривать как ненаправленный граф с \(n\) узлами и \(m\) ребрами. Ребро \(i\) соединяет города \(u_i\) и \(v_i\) и имеет длину \(w_i\).

У Славика нет велосипеда, но у него есть деньги. В каждом городе есть ровно один велосипед, который можно купить. У велосипеда в \(i\)-м городе есть коэффициент медлительности \(s_{i}\). Как только Славик купит велосипед, он может использовать его, чтобы путешествовать из города, в котором он находится, в любой город. Проезд по ребру \(i\) с использованием велосипеда \(j\) занимает время \(w_i \cdot s_j\).

Славик может купить столько велосипедов, сколько захочет, так как деньги для него не проблема. Славик ненавидит путешествовать на велосипеде, поэтому он хочет добраться на вечеринку за минимальное время. И поскольку он уже подзабыл информатику, он просит вас ему помочь.

Какое минимальное количество времени потребуется Славику, чтобы добраться из города \(1\) в город \(n\)? Славик не может путешествовать без велосипеда. Гарантируется, что возможно добраться от города \(1\) до любого другого города.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание самих наборов.

Первая строка каждого набора содержит два целых числа, разделенных пробелом: \(n\) и \(m\) (\(2 \leq n \leq 1000\); \(n - 1 \leq m \leq 1000\)) — количество городов и количество дорог, соответственно.

\(i\)-я из следующих \(m\) строк содержит три целых числа \(u_i\), \(v_i\), \(w_i\) (\(1 \le u_i, v_i \le n\), \(u_i \neq v_i\); \(1 \leq w_i \leq 10^5\)), обозначающих, что есть дорога между городами \(u_i\) и \(v_i\) длиной \(w_i\).

Следующая строка содержит \(n\) целых чисел \(s_1, \ldots, s_n\) (\(1 \leq s_i \leq 1000\)) — коэффициент медлительности каждого велосипеда. Одну и ту же пару городов может соединять больше, чем одна дорога.

Сумма \(n\) по всем наборам не превышает \(1000\), и сумма \(m\) по всем наборам не превышает \(1000\).

Дополнительное ограничение на ввод: возможно путешествовать от города \(1\) до любого другого города.

Выходные данные

Для каждого набора входных данных выведите одно целое число, обозначающее минимальное количество времени, за которое Славик может добраться из города \(1\) в город \(n\).

A. 2023

Конструктив математика реализация теория чисел *800

В последовательности \(a\), произведение которой было равно \(2023\), удалили \(k\) чисел и осталась последовательность \(b\) длины \(n\). По получившейся последовательности \(b\) найдите любую подходящую последовательность \(a\) и выведите какие \(k\) элементов из нее удалили, либо скажите, что такой последовательности не могло существовать.

Обратите внимание, что вам не гарантируется, что такой массив существует.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) (\(1 \le n, k \le 5\)) — размер последовательности \(b\) и количество удаленных чисел из последовательности \(a\).

Во второй строке содержится \(n\) целых чисел \(b_1,b_2, \ldots,b_n\) (\(1 \leq b_i \leq 2023\)) — оставшаяся последовательность. Значения \(b_i\) могут не являться делителями \(2023\).

Выходные данные

Для каждого набора входных данных выведите «YES», если последовательность \(a\) существует, а также в следующей строке выведите \(k\) целых неотрицательных чисел, которые удалили из последовательности \(a\). Если же последовательности \(a\) не существует в единственной строке выведите «NO».

Вы можете вывести ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительные ответы.

Примечание

В третьем наборе произведение равно \(289 \cdot 7 = 2023\).

В четвертом произведение уже равно \(2023\).

В седьмом произведение равно \(7 \cdot 17 \cdot 17 = 2023\).

C. Тренировка перед олимпиадой

жадные алгоритмы игры Конструктив математика реализация *1200

У Маши и Оли скоро важная командная олимпиада. В честь этого Маша, для разминки, предложила сыграть Оле в следующую игру:

Есть массив \(a\) размера \(n\). Первой ходит Маша, игроки ходят по-очереди. Каждый ход описывается следующей последовательностью действий:

\(\bullet\) Если размер массива равен \(1\) — игра завершается.

\(\bullet\) Игрок, который сейчас ходит, выбирает два различных индекса \(i\), \(j\) (\(1 \le i, j \le |a|\)), и проделывает следующую операцию — удаляет \(a_i\) и \(a_j\) из массива и добавляет в массив число равное \(\lfloor \frac{a_i + a_j}{2} \rfloor \cdot 2\). Иными словами, сначала делит сумму чисел \(a_i\), \(a_j\) на \(2\) с округлением вниз, после чего результат умножает на \(2\).

Маша стремится максимизировать итоговое число, Оля же — минимизировать.

Маша и Оля решили сыграть на каждом непустом префиксе первоначального массива \(a\), и попросили вас об одной помощи.

Для каждого \(k = 1, 2, \ldots, n\) ответьте на следующий вопрос. Пусть в игре присутствуют только первые \(k\) элементов массива \(a\), соответственно с индексами \(1, 2, \ldots, k\). Какое число тогда останется при оптимальной игре обоих игроков?

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \le n \le 10^5\)) — размер массива.

Во второй строке содержится \(n\) целых чисел \(a_1,a_2, \ldots,a_n\) (\(1 \leq a_i \leq 10^9\)) — массив, на котором играют Маша и Оля.

Гарантируется, что сумма \(n\) по всем входным данным не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел. \(k\)-е из этих чисел должно быть равно числу, которое останется в конце при оптимальной игре обоих, на массиве, состоящем из первых \(k\) элементов массива \(a\).

Примечание

В третьем наборе входных данных для префикса длины \(1\) ответ \(3\). Для префикса длины \(2\) у Маши есть один вариант для хода, поэтому ответ \(12\). Для префикса длины \(3\) у Маши есть три возможных хода: она выбирает \(3\) и \(10\), тогда число в конце \(22\), \(3\) и \(11\), тогда число в конце \(24\), \(10\) и \(11\), тогда число в конце \(22\), значит Маша выберет \(3\) и \(11\) и получит \(24\).

C. Поливка массива

жадные алгоритмы математика Перебор реализация *1600

У вас есть массив целых чисел \(a_1, a_2, \ldots, a_n\) длины \(n\). В \(i\)-й из следующих \(d\) дней вы собираетесь выполнить ровно одно из следующих двух действий:

  • Прибавить \(1\) к каждому из первых \(b_i\) элементов массива \(a\) (т.е. присвоить \(a_j := a_j + 1\) для всех \(1 \le j \le b_i\)).
  • Посчитаем количество элементов, которые равны своей позиции (т.е. \(a_j = j\)). Обозначим количество таких элементов за \(c\). Затем нужно прибавить \(c\) к своему счету и сбросить весь массив \(a\) к \(0\)-массиву длины \(n\) (т.е. присвоить \([a_1, a_2, \ldots, a_n] := [0, 0, \ldots, 0]\)).

Изначально ваш счет равен \(0\). Обратите внимание, что в каждый день вы должны выполнить ровно одно из указанных выше действий: нельзя пропустить день или выполнить оба действия в один и тот же день.

Какой максимальный счет вы можете получить в конце?

Поскольку \(d\) может быть довольно большим, последовательность \(b\) дается вам в сжатом виде:

  • Вам дана последовательность целых чисел \(v_1, v_2, \ldots, v_k\). Последовательность \(b\) является конкатенацией бесконечного числа копий \(v\): \(b = [v_1, v_2, \ldots, v_k, v_1, v_2, \ldots, v_k, \ldots]\).
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(k\) и \(d\) (\(1 \le n \le 2000\), \(1 \le k \le 10^5\), \(k \le d \le 10^9\)) — длину массива \(a\), длину последовательности \(v\) и количество дней, в течение которых будут выполняться операции.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le n\)) — массив \(a\).

Третья строка каждого набора входных данных содержит \(k\) целых чисел \(v_1, v_2, \ldots, v_k\) (\(1 \le v_i \le n\)) — последовательность \(v\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2000\), а сумма \(k\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: максимальный счет, который вы можете получить в конце \(d\)-го дня.

Примечание

В первом наборе входных данных последовательность \(b\) равняется \([1, 3, 2, 3, 1, 3, 2, 3, \ldots]\) и одно из оптимальных решений выглядит следующим образом:

  • Выполнить операцию второго типа в \(1\)-й день: счет увеличится на \(3\), а массив \(a\) станет равным \([0, 0, 0]\).
  • Выполнить операцию первого типа во \(2\)-й день: массив \(a\) станет равным \([1, 1, 1]\).
  • Выполнить операцию первого типа в \(3\)-й день: массив \(a\) станет равным \([2, 2, 1]\).
  • Выполнить операцию второго типа в \(4\)-й день: счет увеличится на \(1\), а массив \(a\) станет равным \([0, 0, 0]\).

Можно показать, что набрать больше \(4\) невозможно, поэтому ответ — \(4\).

Во втором наборе входных данных последовательность \(b\) равняется \([6, 6, 6, 6, \ldots]\). Один из способов набрать \(3\) — это выполнить операции первого типа в \(1\)-й и \(3\)-й дни и выполнить операцию второго типа во \(2\)-й день.

D. Очередная задача про инверсии

дп Комбинаторика математика реализация Структуры данных теория чисел *2300

Вам даны перестановка \(p_0, p_1, \ldots, p_{n-1}\) нечётных чисел от \(1\) до \(2n-1\) и перестановка \(q_0, q_1, \ldots, q_{k-1}\) целых чисел от \(0\) до \(k-1\).

Определим массив \(a_0, a_1, \ldots, a_{nk-1}\) длины \(nk\) в соответствии со следующим правилом:

\(a_{i \cdot k+j}=p_i \cdot 2^{q_j}\) для всех \(0 \le i < n\) и всех \(0 \le j < k\)

Например, если \(p = [3, 5, 1]\) и \(q = [0, 1]\), то \(a = [3, 6, 5, 10, 1, 2]\).

Обратите внимание, что все массивы в условии нумеруются с нуля. Также обратите внимание, что каждый элемент массива \(a\) определён однозначно.

Найдите количество инверсий в массиве \(a\). Так как ответ может быть очень большим, выведите его по модулю \(998\,244\,353\).

Инверсией в массиве \(a\) называется пара \((i, j)\) (\(0 \le i < j < nk\)), такая что \(a_i > a_j\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит два числа \(n\) и \(k\) (\(1 \le n, k \le 2 \cdot 10^5\)) — длины массивов \(p\) и \(q\).

Вторая строка каждого набора содержит \(n\) различных целых чисел \(p_0, p_1, \ldots, p_{n-1}\) (\(1 \le p_i \le 2n-1\), \(p_i\) нечётно) — массив \(p\).

Третья строка каждого набора содержит \(k\) различных целых чисел \(q_0, q_1, \ldots, q_{k-1}\) (\(0 \le q_i < k\)) — массив \(q\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\), и что сумма \(k\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — количество инверсий в массиве \(a\) по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных массив \(a\) равен \([3, 6, 5, 10, 1, 2]\). В нём есть \(9\) инверсий: \((0, 4)\), \((0, 5)\), \((1, 2)\), \((1, 4)\), \((1, 5)\), \((2, 4)\), \((2, 5)\), \((3, 4)\), \((3, 5)\). Обратите внимание, что здесь перечислены пары \((i, j)\), такие что \(i < j\) и \(a_i > a_j\).

Во втором наборе входных данных массив \(a\) равен \([8, 4, 1, 2, 24, 12, 3, 6, 40, 20, 5, 10]\). В нём \(25\) инверсий.

В третьем наборе входных данных массив \(a\) равен \([1, 2, 4, 8, 16]\). В нём нет инверсий.

A. Кирпичная стена

жадные алгоритмы Конструктив математика реализация *800

Кирпич — это полоска \(1 \times k\), расположенная горизонтально или вертикально, где \(k\) может быть произвольным числом не менее \(2\) (\(k \ge 2\)).

Кирпичная стена размера \(n \times m\) — это такой способ разместить некоторое количество кирпичей внутри прямоугольника \(n \times m\), чтобы кирпичи располагались по клеткам горизонтально или вертикально, не вылезали за границы прямоугольника \(n \times m\), и чтобы каждая клетка принадлежала ровно одному кирпичу. Здесь \(n\) — это высота прямоугольника \(n \times m\), а \(m\) — ширина. Обратите внимание, что в одной кирпичной стене могут быть кирпичи с разными значениями k.

Устойчивость стены — это число кирпичей, расположенных горизонтально, минус число кирпичей, расположенных вертикально. Обратите внимание, что если вы использовали \(0\) горизонтальных кирпичей и \(2\) вертикальных, то получится устойчивость \(-2\), а не \(2\).

Какую максимальную устойчивость может иметь стена \(n \times m\)?

Гарантируется, что при ограничениях задачи существует хотя бы одна кирпичная стена \(n \times m\).

Входные данные

В первой строке находится единственное целое число \(t\) (\(1 \le t \le 10\,000\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n,\,m \le 10^4\)).

Выходные данные

Для каждого набора входных данных выведите единственное целое число — максимальную устойчивость стены размера \(n \times m\).

Примечание

В 1-м тестовом случае максимальная прочность \(2\) получается, если положить два горизонтальных кирпича \(1 \times 2\) друг на друга.

Во 2-м тестовом случае можно получить максимальную прочность \(28\), если разместить в каждом из \(7\) рядов по \(4\) горизонтальных кирпича \(1 \times 2\).

B. Минимизируйте инверсии

жадные алгоритмы Конструктив реализация сортировки Структуры данных *900

Вам даны две перестановки \(a\) и \(b\) длины \(n\). Перестановкой называется массив из \(n\) элементов от \(1\) до \(n\), в котором все элементы различны. К примеру, массив [\(2,1,3\)] является перестановкой, а [\(0,1\)] и [\(1,3,1\)] не являются.

Вы можете сколько угодно раз выбрать два индекса \(i\) и \(j\), а затем поменять местами элементы \(a_i\) с \(a_j\) и \(b_i\) с \(b_j\) одновременно.

Вы ненавидите инверсии и поэтому хотите минимизировать суммарное число инверсий в обеих перестановках.

Инверсией в перестановке \(p\) называется пара индексов \((i, j)\), такая что \(i < j\) и \(p_i > p_j\). Например, если \(p=[3,1,4,2,5]\), то количество инверсий в этой перестановке равно \(3\) (искомые пары индексов: \((1,2)\), \((1,4)\) и \((3,4)\)).

Входные данные

В первой строке входных данных вводится одно число \(t\) (\(1 \leq t \leq 20\,000\)) — количество запросов.

Каждый набор входных данных состоит из трех строк. В первой строке вводится число \(n\) (\(1 \leq n \leq 2\cdot10^5\)) — длина перестановок \(a\) и \(b\). Во второй строке вводится \(n\) элементов \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — перестановка \(a\). В третьей строке в аналогичном формате вводится перестановка \(b\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите две перестановки \(a'\) и \(b'\) — перестановки после применения операций. Суммарное количество инверсий в \(a'\) и \(b'\) должно быть минимально возможным среди всех пар перестановок, которые возможно получить с помощью операций из условия.

Если существует несколько решений, выведите любое из них.

Примечание

В первом тесте минимальное достижимое количество инверсий равно \(10\).

Во втором наборе входных данных можно отсортировать обе перестановки одновременно. Для этого можно применить следующие операции:

  • Поменять элементы на позициях \(1\) и \(3\) в обеих перестановках. После операции \(a =\) [\(2,1,3\)], \(b =\) [\(2,1,3\)].
  • Поменять элементы на позициях \(1\) и \(2\). После операции \(a\) и \(b\) отсортированы.

В третьем тесте минимальное достижимое количество инверсий равно \(7\).

C. XOR-расстояние

битмаски жадные алгоритмы математика реализация *1400

Вам даны целые числа \(a\), \(b\), \(r\). Найдите наименьшее значение величины \(|({a \oplus x}) - ({b \oplus x})|\) по всем \(0 \leq x \leq r\).

\(\oplus\) это операция побитового исключающего ИЛИ, а \(|y|\) — абсолютная величина числа \(y\).

Входные данные

В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных содержит целые числа \(a\), \(b\), \(r\) (\(0 \le a, b, r \le 10^{18}\)).

Выходные данные

Для каждого набора входных данных выведите одно число — наименьшее возможное значение.

Примечание

В первом тесте \(r = 0\), то есть \(x\) точно равен \(0\), поэтому ответ \(|{4 \oplus 0} - {6 \oplus 0}| = |4 - 6| = 2\).

Во втором тесте:

  • при \(x = 0\), \(|{0 \oplus 0} - {3 \oplus 0}| = |0 - 3| = 3\);
  • при \(x = 1\), \(|{0 \oplus 1} - {3 \oplus 1}| = |1 - 2| = 1\);
  • при \(x = 2\), \(|{0 \oplus 2} - {3 \oplus 2}| = |2 - 1| = 1\).

Следовательно, ответ равен \(1\).

В третьем тесте минимум достигается при \(x = 1\).

D. Блокировка элементов

Бинарный поиск дп реализация Структуры данных *1900

Вам дан массив чисел \(a_1, a_2, \ldots, a_n\). Ваша задача — заблокировать некоторые элементы массива так, чтобы минимизировать его стоимость. Допустим, вы заблокировали элементы с индексами \(1 \leq b_1 < b_2 < \ldots < b_m \leq n\). Тогда стоимость массива вычисляется как максимум из:

  • суммы заблокированных элементов, то есть \(a_{b_1} + a_{b_2} + \ldots + a_{b_m}\).
  • максимума из сумм на частях, на которые распадается массив, если удалить заблокированные элементы. То есть максимум из сумм на следующем (\(m + 1\))-ом подотрезке: [\(1, b_1 − 1\)], [\(b_1 + 1, b_2 − 1\)], [\(\ldots\)], [\(b_{m−1} + 1, b_m - 1\)], [\(b_m + 1, n\)] (сумма чисел на подотрезке вида [\(x,x − 1\)] полагается равной \(0\)).

К примеру, если \(n = 6\), исходный массив равен [\(1, 4, 5, 3, 3, 2\)], и вы заблокировали элементы на позициях \(2\) и \(5\), то стоимость массива будет равна максимуму из суммы заблокированных элементов (\(4 + 3 = 7\)) и сумм на отрезках (\(1\), \(5 + 3 = 8\), \(2\)) что равно \(\max(7,1,8,2) = 8\).

Вам нужно вывести минимальную стоимость массива после блокировки.

Входные данные

В первой строке входных данных вводится одно число \(t\) (\(1 \leq t \leq 30\,000\)) — количество запросов.

Каждый набор входных данных состоит из двух строк. В первой строке вводится число \(n\) (\(1 \leq n \leq 10^5\)) — длина массива \(a\). Во второй строке вводится \(n\) элементов \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — массив \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — минимальную стоимость блокировки массива.

Примечание

Первый набор совпадает с массивом из условия. Чтобы получить стоимость \(7\) нужно заблокировать элементы на позициях \(2\) и \(4\), В таком случае стоимость массива вычислится как максимум из:

  • суммы заблокированных элементов, которая равна \(a_2 + a_4 = 7\).
  • максимума из сумм на частях, на которые распадается массив, если убрать заблокированные, то есть максимум из \(a_1\), \(a_3\), \(a_5 + a_6 = \max(1,5,5) = 5\).

То есть стоимость равна \(\max(7,5) = 7\).

Во втором наборе можно заблокировать элементы на позициях \(1\) и \(4\).

В третьем наборе чтобы получить ответ \(11\) можно заблокировать элементы на позициях \(2\) и \(5\). Есть и другие способы получить такой ответ, например заблокировать позиции \(4\) и \(6\).

E. ace5 и порядок задач

интерактив Конструктив разделяй и властвуй реализация сортировки Теория вероятностей *2200

Это интерактивная задача!

В новом раунде было \(n\) задач, сложности от \(1\) до \(n\). Координатор, решив сделать первый раунд с неотсортированными по сложности задачами, переставил задачи, получив перестановку сложностей от \(1\) до \(n\). После этого координатор предложил ace5 угадать перестановку следующим образом.

Координатор загадывает число \(x\) от \(1\) до \(n\).

ace5 может делать запросы типа: \(?\ i\). Ответом будет:

  • \(>\), если \(a_i > x\), после этого \(x\) увеличивается на \(1\).
  • \(<\), если \(a_i < x\), после этого \(x\) уменьшается на \(1\).
  • \(=\), если \(a_i = x\), после этого \(x\) не меняется.

Задача ace5 — отгадать перестановку не более чем за \(40n\) запросов. Так как ace5 слишком занят написанием анонса, он поручил эту задачу Вам.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество тестовых случаев.

Протокол взаимодействия

Взаимодействие Вашей программы с программой жюри в каждом тестовом случае начинается со считывания целого положительного числа \(n\) (\(1 \leq n \leq 2000\)) — длины загаданной перестановки.

Чтобы сделать запрос, выведите строку в формате «? i», где \(1 \leq i \leq n\).

В качестве ответа вы получите:

  • «>», если \(a_i\) > \(x\), после этого \(x\) увеличится на \(1\).
  • «<», если \(a_i\) < \(x\), после этого \(x\) уменьшится на \(1\).
  • «=», если \(a_i\) = \(x\), после этого \(x\) не изменится.

Вы можете сделать не более \(40n\) запросов. Чтобы вывести ответ, необходимо напечатать «! a_1 a_2 ... a_n», где \(1 \leq a_i \leq n\), все они различны. Вывод ответа не считается за запрос.

Если ваша программа сделает более \(40n\) запросов для одного набора входных данных, или сделает некорректный запрос, то ответом на запрос будет -1, после получения такого ответа ваша программа должна немедленно завершится, чтобы получить вердикт Неправильный ответ. Иначе она может получить любой другой вердикт.

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.
Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(2000\).

Интерактор в этой задаче не является адаптивным.

Взломы:

Чтобы сделать взлом, используйте следующий формат:

В первой строке находится одно целое число \(t\) — количество тестовых случаев.

Описание каждого тестового случая должно состоять из двух строк. В первой строке находятся числа \(n\) и \(x\) (\(1 \leq x \leq n \leq 2000\)) — длина загаданной перестановки и изначальное значение числа \(x\). Во второй строке находятся \(n\) различных чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — перестановка, которую должно загадать жюри в данном тестовом случае.

Сумма \(n\) по всем запросам не должна превосходить \(2000\).

Примечание

В первом тесте загадана перестановка \(a\) = [\(2,4,1,5,3\)], и значение \(x\) изначально равно \(3\).

Во втором тесте загадана перестановка \(a\) = [\(2,1\)], \(x\) изначально равен \(1\).

F. Гусеница на дереве

графы Деревья жадные алгоритмы поиск в глубину и подобное реализация сортировки *2500

Гусеница решила побывать в каждой вершине дерева. Изначально она сидит в корне.

Дерево представлено как корневое дерево с корнем в вершине \(1\). Каждое переползание в соседнюю вершину у неё занимает \(1\) минуту.

А под деревом стоит батут. Если гусеница отцепится от дерева и упадёт на батут, то за \(0\) секунд окажется в корне дерева. Но батут старый и выдержит не более \(k\) падений гусеницы.

За какое минимальное время гусеница сможет обойти дерево?

Более формально — надо найти минимальное время, нужное, чтобы посетить все вершины дерева, если гусеница начинает в корне (вершине \(1\)) и двигается с помощью двух способов.

  1. Перейти по ребру в одну из соседних вершин: тратит \(1\) минуту.
  2. Телепортироваться в корень: не тратит времени, никакие новые вершины не становятся посещёнными.

Второй способ (телепортацию) можно применить не более \(k\) раз. Гусеница может закончить путешествие в любой вершине.

Входные данные

В первой строке входных данных находятся два целых числа: \(n\) (\(2 \le n \le 2\cdot 10^5\)) — количество вершин в дереве, и \(k\) (\(0 \le k \le 10^9\)) — максимальное число телепортаций в корень.

Во второй строке записаны \(n-1\) целых чисел \(p_2\), \(p_3\), ..., \(p_n\) (\(1 \le p_i \le n\)) — предки в дереве для вершин \(2, 3, \ldots, n\); вершина \(1\) — корень.

Выходные данные

В единственной строке выведите одно число — минимальное число минут, за которое можно побывать во всех вершинах дерева.

Примечание

На картинке показан один из способов обойти дерево из первого теста за 9 минут.

E. Подсчёт префиксов

дп Комбинаторика Конструктив математика реализация *2600

Есть неизвестный массив \(a\) длины \(n\), состоящий только из \(1\) и \(-1\). Пусть \(p\) — массив префиксных сумм массива \(a\). Более формально, \(p\) — это массив длины \(n\), в котором \(p_i = a_1 + a_2 + \ldots + a_i\). После этого массив \(p\) сортируется в неубывающем порядке. Например, если \(a = [1, -1, -1, 1, 1]\), то \(p = [1, 0, -1, 0, 1]\) до сортировки и \(p = [-1, 0, 0, 1, 1]\) после сортировки.

Вам дан массив префиксных сумм \(p\) после сортировки, но вы не знаете, чему был равен массив \(a\). Ваша задача — посчитать количество исходных массивов \(a\), для которых в результате сортировки массива префиксных сумм получается заданный массив \(p\). Поскольку это число может быть большим, от вас требуется только найти его по модулю \(998\,244\,353\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 5000\)) — длину неизвестного массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(|p_i| \le n\)) — \(n\) префиксных сумм массива \(a\), отсортированных в порядке неубывания.

Гарантируется, что \(p_1 \le p_2 \le \ldots \le p_n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5000\).

Выходные данные

Для каждого набора входных данных выведите ответ по модулю \(998\,244\,353\).

Примечание

В первых двух наборах входных данных единственными возможными массивами \(a\) для \(n = 1\) являются \(a = [1]\) и \(a = [-1]\). Соответствующие им отсортированные массивы префиксных сумм \(p\) — \(p = [1]\) и \(p = [-1]\). Следовательно, не существует массива \(a\), который может привести к отсортированному массиву префиксных сумм \(p = [0]\). Но существует ровно \(1\) массив \(a\), который может привести к отсортированному массиву префиксных сумм \(p = [1]\).

В третьем наборе входных данных можно доказать, что не существует массива \(a\), который мог бы привести к отсортированному массиву префиксных сумм \(p = [-1, 1, 2]\).

В четвертом наборе входных данных существует \(3\) возможных массива \(a\), которые могут привести к отсортированному массиву префиксных сумм \(p = [-1, 0, 0, 1, 1]\).

  • \(a = [1, -1, 1, -1, -1]\). Массив префиксных сумм до сортировки равен \(p = [1, 0, 1, 0, -1]\), а после сортировки \(p = [-1, 0, 0, 1, 1]\).
  • \(a = [1, -1, -1, 1, 1]\). Массив префиксных сумм до сортировки равен \(p = [1, 0, -1, 0, 1]\), а после сортировки \(p = [-1, 0, 0, 1, 1]\).
  • \(a = [-1, 1, 1, -1, 1]\). Массив префиксных сумм до сортировки равен \(p = [-1, 0, 1, 0, 1]\), а после сортировки \(p = [-1, 0, 0, 1, 1]\).

Для пятого набора входных данных единственным возможным массивом \(a\), который может привести к отсортированному массиву префиксных сумм \(p = [-4, -3, -3, -2, -1]\), является \(a = [-1, -1, -1, -1, 1]\).

A. Модные числа

Бинарный поиск Перебор реализация *1300

Как вам хорошо известно, в этом году самые модные числа — это так называемые треугольные числа (то есть целые числа, представимые в виде , где k — некоторое целое положительное число), а самые крутые — те, которые представимы в виде суммы двух треугольных.

Небезызвестный хипстер Андрей очень любит все модное и крутое, но, к сожалению, он не дружит с математикой. Помогите ему по числу n сказать, раскладывается ли оно в сумму двух треугольных чисел (не обязательно различных)!

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 109).

Выходные данные

Выведите «YES» (без кавычек), если n раскладывается в сумму двух треугольных, и «NO» (без кавычек) в противном случае.

Примечание

В первом примере число .

Во втором примере число 512 представить в виде суммы двух треугольных невозможно.

B. Прогулки под дождем

Перебор реализация *1100

В Берляндии оппозиционеры собираются устроить массовые гуляния по бульвару. Бульвар состоит из n расположенных в ряд плиток, пронумерованных от 1 до n cправа налево. Прогулка оппозиционеров должна начаться на плитке номер 1 и закончиться на плитке номер n. В ходе прогулки разрешается перемещаться справа налево между соседними в ряду плитками, а также перепрыгивать через одну плитку. Более формально, с плитки номер i (i < n - 1) можно попасть на плитку номер i + 1 или на плитку номер i + 2 (с плитки номер n - 1 можно попасть только на плитку номер n). Можно считать, что все перемещения оппозиционеров происходят мгновенно.

Для того, чтобы сорвать оппозиционную акцию, берляндский кровавый режим организовал дождь. Плитки на бульваре плохого качества и они быстро разрушаются под дождем. Известно, что i-тая плитка приходит в негодность после ai дней дождя (в день ai плитка еще не разрушена, а в день ai + 1 уже разрушена). Конечно же, никому не разрешается ходить по разрушенным плиткам! Поэтому прогулка оппозиционеров считается сорванной, если либо разрушена плитка номер 1, либо разрушена плитка номер n, либо невозможно дойти с плитки номер 1 до плитки номер n, двигаясь по неразрушенным плиткам.

Оппозиционеры хотят собрать побольше единомышленников для своей прогулки. Поэтому чем больше времени у них есть на сборы, тем лучше. Помогите оппозиционерам узнать, сколько у них еще осталось времени, и скажите, в течение скольких дней прогулка с плитки номер 1 на плитку номер n будет возможной.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 103) — длина бульвара в плитках.

Во второй строке заданы n целых чисел ai, разделенных пробелом,  — количество дней, через которое i-тая плитка разрушится (1 ≤ ai ≤ 103).

Выходные данные

Выведите одно число — искомое количество дней.

Примечание

В первом примере после третьего дня будет разрушена вторая плитка, и единственным оставшимся маршрутом для гуляний будет 1 → 3 → 4. После пятого дня между первой и последней плиткой будет промежуток в две плитки, который уже невозможно перепрыгнуть.

Во втором примере до пятого дня включительно будет доступен путь 1 → 3 → 5. На шестой день будет разрушена последняя плитка, и прогулка будет сорвана.

D. Повторение в массиве

Бинарный поиск математика Перебор реализация снм *1900

У Джейдена есть массив \(a\), который изначально пуст. Ему необходимо выполнить \(n\) операций двух типов в заданном порядке.

  1. Джейден добавляет целое число \(x\) (\(1 \leq x \leq n\)) в конец массива \(a\).
  2. Джейден добавляет \(x\) копий массива \(a\) в конец массива \(a\). Другими словами, массив \(a\) становится равным \([a,\underbrace{a,\ldots,a}_{x}]\). Гарантируется, что перед этим была выполнена хотя бы одна операция первого типа.

У Джейдена есть \(q\) запросов. Для каждого запроса вы должны сообщить ему \(k\)-й элемент массива \(a\). Элементы массива нумеруются с \(1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1 \leq n, q \leq 10^5\)) — количество операций и количество запросов.

Следующие \(n\) строк описывают операции. Каждая строка содержит два целых числа \(b\) и \(x\) (\(b \in \{1, 2\}\)), где \(b\) обозначает тип операции. Если \(b=1\), то \(x\) (\(1 \leq x \leq n\)) является целым числом, которое Джейден добавляет в конец массива. Если \(b=2\), то \(x\) (\(1 \leq x \leq 10^9\)) является количеством копий, которые Джейден добавляет в конец массива.

Следующая строка каждого набора входных данных содержит \(q\) целых чисел \(k_1, k_2, \ldots, k_q\) (\(1 \leq k_i \leq \min(10^{18}, c)\)), которые обозначают запросы, где \(c\) — размер массива после выполнения всех \(n\) операций.

Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) целых чисел — ответы на запросы Джейдена.

Примечание

В первом наборе входных данных:

  • После первой операции \(a = [1]\);
  • После второй операции \(a = [1, 2]\);
  • После третьей операции \(a = [1, 2, 1, 2]\);
  • После четвёртой операции \(a = [1, 2, 1, 2, 3]\);
  • После пятой операции \(a = [1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3]\).

В четвёртом наборе входных данных после всех операций \(a = [1, 2]\).

B. Рассадить котов

жадные алгоритмы реализация *800

Чтобы проверить гипотезу о котах, ученые должны рассадить котов по коробкам определенным образом. Они, конечно, хотели бы проверить гипотезу и опубликовать сенсационную статью как можно быстрее, потому что слишком увлечены следующей гипотезой — о заряде телефона.

У ученых есть \(n\) коробок, в которых могут сидеть или не сидеть коты. Обозначим текущее состояние коробок последовательностью \(b_1, \dots, b_n\): \(b_i = 1\), если в коробке с номером \(i\) сидит кот, и \(b_i = 0\) иначе.

К счастью, неограниченное производство котов уже налажено, поэтому за один день ученые могут провести одну из следующих операций:

  • Взять нового кота и поместить его в коробку (для некоторого \(i\), такого что \(b_i = 0\), присвоить \(b_i = 1\)).
  • Изъять кота из коробки и отправить его на пенсию (для некоторого \(i\), такого что \(b_i = 1\), присвоить \(b_i = 0\)).
  • Переместить кота из одной коробки в другую (для некоторых \(i, j\), таких что \(b_i = 1, b_j = 0\), присвоить \(b_i = 0, b_j = 1\)).

Также оказалось, что некоторые коробки были сразу укомплектованы котами. Таким образом, ученым известно начальное положение котов в коробках \(s_1, \dots, s_n\) и желаемое \(f_1, \dots, f_n\).

Из-за большого количества бумажной работы у ученых нет времени на решение этой задачи. Помогите им во благо науки и подскажите, через какое минимальное количество дней гипотеза может быть проверена.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Каждый набор входных данных состоит из трех строк.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество коробок.

Вторая строка каждого набора входных данных содержит строку \(s\) из \(n\) символов, \(i\)-й символ равен '1', если в \(i\)-й коробке сидит кот и '0' иначе.

Третья строка каждого набора входных данных содержит строку \(f\) из \(n\) символов, \(i\)-й символ равен '1', если в \(i\)-й коробке должен будет сидеть кот и '0' иначе.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число на отдельной строке — минимальное количество операций, требуемое для того, чтобы из начальной позиции получить желаемую. Можно показать, что решение всегда существует.

Примечание

В первом наборе входных данных можно сначала переместить кота из первой коробки в пятую, а затем изъять кота из четвертой коробки.

Во втором наборе входных данных ничего делать не приходится — единственный кот уже сидит в нужной коробке.

В третьем наборе входных данных надо потратить три дня, чтобы в каждую коробку посадить по коту.

F. Сумма на прогрессии

дп математика Перебор реализация Структуры данных *1900

Дан массив \(a\) из \(n\) чисел. Также есть \(q\) запросов вида \(s, d, k\).

Для каждого из \(q\) запросов найдите сумму элементов \(a_s + a_{s+d} \cdot 2 + \dots + a_{s + d \cdot (k - 1)} \cdot k\). Иными словами, для каждого запроса нужно найти сумму \(k\) элементов массива с индексами начиная с \(s\)-го, делая шаги, равные \(d\), умножая на порядковый номер элемента в полученной последовательности.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка каждого набора содержит два числа \(n, q\) (\(1 \le n \le 10^5, 1 \le q \le 2 \cdot 10^5\)) — количество чисел в массиве \(a\) и количество запросов.

Вторая строка содержит \(n\) целых чисел \(a_1, ... a_n\) (\(-10^8 \le a_1, ..., a_n \le 10^8\)) — элементы массива \(a\).

Следующие \(q\) строк содержат по три целых числа \(s\), \(d\) и \(k\) (\(1 \le s, d, k \le n\), \(s + d\cdot (k - 1) \le n\)).

Гарантируется, что сумма значений \(n\) по всем наборам не превосходит \(10^5\), и что сумма значений \(q\) по всем наборам не превосходит \(2 \cdot 10^5 \).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите \(q\) чисел — желаемые суммы, разделенные пробелом.

G. Озорной стрелок

дп Перебор разделяй и властвуй реализация Структуры данных *2200

Однажды непутёвый озорной стрелок по имени Шел попал на прямоугольное поле размером \(n \times m\), разбитое на единичные квадратики. В каждой из клеток либо стоит мишень, либо нет.

С собой у Шел оказался только счастливый дробовик, из которого можно выстрелить в одну из четырёх сторон: вправо-вниз, влево-вниз, влево-вверх или вправо-вверх. При выстреле дробовик поражает все мишени в выбранном направлении, Манхэттенское расстояние до которых не больше фиксированной для дробовика константы \(k\). Манхэттенское расстояние между двумя точками \((x_1, y_1)\) и \((x_2, y_2)\) равно \(|x_1 - x_2| + |y_1 - y_2|\).

Возможные области поражения для \(k = 3\).

Цель Шел — поразить как можно большее количество мишеней. Помогите ему, пожалуйста, найти это значение.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

На ввод в первой строчке даются размеры поля \(n\), \(m\) и константа для мощности дробовика \(k\) (\(1 \le n, m, k \le 10^5, 1 \le n \cdot m \le 10^5\)).

В следующих \(n\) строках даётся \(m\) символов — описание очередной строки поля, где символ '.' означает, что клетка пуста, а символ '#' означает наличие мишени. Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите одно число, которое равно максимально возможному количеству поражённых мишеней за один выстрел.

Примечание

Возможные оптимальные выстрелы для примеров из условия:

A. Необычный шаблон

Конструктив реализация Строки *800

Задано целое число \(n\) и три строки \(a, b, c\), каждая из которых состоит из \(n\) строчных латинских букв.

Назовем шаблоном строку \(t\), состоящую из \(n\) строчных и/или заглавных латинских букв. Строка \(s\) подходит под шаблон \(t\), если для всех \(i\) от \(1\) до \(n\) выполняются следующие условия:

  • если \(i\)-я буква шаблона строчная, то буква \(s_i\) должна совпадать с \(t_i\);
  • если \(i\)-я буква шаблона заглавная, то буква \(s_i\) должна отличаться от строчной версии буквы \(t_i\). Например, если в шаблоне в какой-то позиции находится символ 'A', то в этой позиции в строке не должно быть буквы 'a'.

Соответственно, строка не подходит под шаблон, если хотя бы для одного \(i\) условие не выполняется.

Определите, существует ли шаблон \(t\) такой, что строки \(a\) и \(b\) подходят под него, а строка \(c\) не подходит.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 20\)) — длина заданных строк.

В следующих трех строках записаны строки \(a, b\) и \(c\). Каждая строка состоит из ровно \(n\) строчных латинских букв.

Выходные данные

На каждый набор входных данных выведите «YES», если существует такой шаблон \(t\), под который подходят строки \(a\) и \(b\), но не подходит строка \(c\). В противном случае выведите «NO».

Примечание

В первом наборе входных данных можно использовать шаблон «C». У строк \(a\) и \(b\) первая буква отличается от 'c', поэтому они подходят под шаблон. У строки \(c\) первая буква совпадает с 'c', поэтому она не подходит.

В третьем наборе можно использовать шаблон «CODEforces».

C. Ближайшие города

жадные алгоритмы математика реализация *1300

На числовой прямой расположены \(n\) городов, \(i\)-й город находится в точке \(a_i\). Координаты городов заданы в порядке возрастания, т. е. \(a_1 < a_2 < \dots < a_n\).

Расстояние между двумя городами \(x\) и \(y\) равно \(|a_x - a_y|\).

Для каждого города \(i\) определим ближайший город \(j\) как город, для которого расстояние между \(i\) и \(j\) не больше, чем расстояние между \(i\) и каждым другим городом \(k\). Например, если города расположены в точках \([0, 8, 12, 15, 20]\), то:

  • ближайший город к городу \(1\) — город \(2\);
  • ближайший город к городу \(2\) — город \(3\);
  • ближайший город к городу \(3\) — город \(4\);
  • ближайший город к городу \(4\) — город \(3\);
  • ближайший город к городу \(5\) — город \(4\).

Города расположены таким образом, что для каждого города ближайший город уникален. Например, невозможно, чтобы города находились в точках \([1, 2, 3]\), так как это означало бы, что у города \(2\) два ближайших города (\(1\) и \(3\)), оба на расстоянии \(1\).

Вы можете перемещаться между городами. Предположим, что вы находитесь в городе \(x\). Тогда вы можете выполнить одно из следующих действий:

  • переместиться в любой другой город \(y\), заплатив \(|a_x - a_y|\) монет;
  • переместиться в ближайший к \(x\) город, заплатив \(1\) монету.

Вам даны \(m\) запросов. В каждом запросе вам будут даны два города, и вам нужно вычислить минимальное количество монет, которое придется потратить, чтобы переместиться из одного города в другой.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных задается в следующем формате:

  • первая строка содержит одно целое число \(n\) (\(2 \le n \le 10^5\));
  • вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_1 < a_2 < \dots < a_n \le 10^9\));
  • третья строка содержит одно целое число \(m\) (\(1 \le m \le 10^5\));
  • затем следуют \(m\) строк; \(i\)-я из них содержит два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\); \(x_i \ne y_i\)), что означает, что в \(i\)-м запросе вам нужно вычислить минимальное количество монет, которое придется потратить, чтобы переместиться из города \(x_i\) в город \(y_i\).

Дополнительные ограничения на входные данные:

  • в каждом наборе входных данных для каждого города ближайший город определяется однозначно;
  • сумма \(n\) по всем наборам входных данных не превышает \(10^5\);
  • сумма \(m\) по всем наборам входных данных не превышает \(10^5\).
Выходные данные

Для каждого запроса выведите одно целое число — минимальное количество монет, которое придется потратить.

Примечание

Рассмотрим первые два запроса в примере из условия:

  • в первом запросе вы изначально находитесь в городе \(1\). Вы можете переместиться в ближайший город (который является городом \(2\)), заплатив \(1\) монету. Затем вы снова перемещаетесь в ближайший город (который является городом \(3\)), заплатив \(1\) монету. Затем вы снова перемещаетесь в ближайший город (который является городом \(4\)), заплатив \(1\) монету. Всего вы потратите \(3\) монеты, чтобы попасть из города \(1\) в город \(4\);
  • во втором запросе вы можете использовать тот же способ, чтобы попасть из города \(1\) в город \(4\), а затем потратить \(5\) монет, чтобы переместиться из города \(4\) в город \(5\).

D. Безумные монстры

математика Перебор реализация снм Структуры данных *1900

Монокарп играет в компьютерную игру (опять). Угадайте, что он делает? Правильно, убивает монстров.

В ряд стоят \(n\) монстров, пронумерованных от \(1\) до \(n\). У \(i\)-го монстра есть два параметра: значение атаки, равное \(a_i\), и значение защиты, равное \(d_i\). Чтобы убить этих монстров, Монокарп наложил на них заклинание безумия, так что они атакуют друг друга, а не персонажа Монокарпа.

Бой состоит из \(n\) раундов. В каждом раунде происходит следующее:

  • сначала каждый живой монстр \(i\) наносит \(a_i\) урона ближайшему живому монстру слева (если он существует) и ближайшему живому монстру справа (если он существует);
  • затем каждый живой монстр \(j\), который получил больше \(d_j\) урона в течение этого раунда, умирает. Т.е. \(j\)-й монстр умирает тогда и только тогда, когда его значение защиты \(d_j\) строго меньше суммарного урона, который он получил в этом раунде.

Для каждого раунда вычислите количество монстров, которые умрут во время этого раунда.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор состоит из трех строк:

  • первая строка содержит одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\));
  • вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\));
  • третья строка содержит \(n\) целых чисел \(d_1, d_2, \dots, d_n\) (\(1 \le d_i \le 10^9\)).

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел. \(i\)-е целое число должно быть равно количеству монстров, которые умрут в \(i\)-м раунде.

Примечание

Объяснение для первого примера:

Во время первого раунда происходит следующее:

  • монстр \(1\) наносит \(3\) урона монстру \(2\);
  • монстр \(2\) наносит \(4\) урона монстру \(1\) и монстру \(3\);
  • монстр \(3\) наносит \(7\) урона монстру \(2\) и монстру \(4\);
  • монстр \(4\) наносит \(5\) урона монстру \(3\) и монстру \(5\);
  • монстр \(5\) наносит \(10\) урона монстру \(4\);
  • монстр \(1\) не умирает, так как он получил \(4\) урона и его защита равна \(4\);
  • монстр \(2\) умирает, так как он получил \(10\) урона и его защита равна \(9\);
  • монстр \(3\) умирает, так как он получил \(9\) урона и его защита равна \(1\);
  • монстр \(4\) не умирает, так как он получил \(17\) урона и его защита равна \(18\);
  • монстр \(5\) умирает, так как он получил \(5\) урона и его защита равна \(1\).

После первого раунда остаются в живых монстры \(1\) и \(4\).

Во время второго раунда происходит следующее:

  • монстр \(1\) наносит \(3\) урона монстру \(4\);
  • монстр \(4\) наносит \(5\) урона монстру \(1\);
  • монстр \(1\) умирает, так как он получил \(5\) урона и его защита равна \(4\);
  • монстр \(4\) не умирает, так как он получил \(3\) урона и его защита равна \(18\).

В следующих трех раундах остается в живых только монстр \(4\), поэтому ничего не происходит.

A. Перемещение фишек

жадные алгоритмы реализация *800

Есть лента, разделенная на \(n\) ячеек, пронумерованных слева направо от \(1\) до \(n\). Каждая ячейка либо содержит фишку, либо свободна.

Вы можете выполнять следующую операцию любое количество раз (возможно, ноль): выбрать фишку и переместить ее в ближайшую свободную ячейку слева. Вы можете выбрать любую фишку, при условии, что слева от нее есть хотя бы одна свободная ячейка. При перемещении фишки ячейка, где она находилась до операции, становится свободной.

Ваша цель — переместить фишки таким образом, чтобы они шли подряд, образовывали единый блок без свободных ячеек между ними. Какое минимальное количество операций вам нужно выполнить?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк:

  • первая строка содержит одно целое число \(n\) (\(2 \le n \le 50\)) — количество ячеек;
  • вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 1\)); \(a_i = 0\) означает, что \(i\)-я ячейка свободна; \(a_i = 1\) означает, что \(i\)-я ячейка содержит фишку.

Дополнительное ограничение на входные данные: в каждом наборе входных данных хотя бы одна ячейка содержит фишку.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которые вам нужно выполнить, чтобы все фишки образовали единый блок без свободных ячеек между ними.

Примечание

В первом примере вы можете выполнить операцию с фишкой в \(7\)-й ячейке. Ближайшая свободная ячейка слева — \(5\)-я ячейка, поэтому фишка перемещается туда. После этого все фишки образуют единый блок.

Во втором примере все фишки уже находятся в одном блоке без свободных ячеек между ними. То же самое касается и третьего примера.

B. Монстры атакуют!

дп жадные алгоритмы реализация *1100

Вы играете в компьютерную игру. Текущий уровень этой игры можно представить в виде прямой линии. Ваш персонаж находится в точке \(0\). Есть \(n\) монстров, пытающихся убить вашего персонажа; у \(i\)-го монстра здоровье равно \(a_i\) и изначально он находится в точке \(x_i\).

Каждую секунду происходит следующее:

  • сначала вы стреляете до \(k\) пуль в монстров. Каждая пуля нацеливается только на одного монстра и уменьшает его здоровье на \(1\). Для каждой пули вы выбираете ее цель произвольно (например, вы можете выстрелить все пули в одного монстра, выстрелить все пули в разных монстров или выбрать любую другую комбинацию). Любой монстр может быть целью для пули, независимо от его положения и других факторов;
  • затем все живые монстры со здоровьем \(0\) или менее умирают;
  • затем все живые монстры перемещаются на \(1\) точку ближе к вам (монстры слева от вас увеличивают свои координаты на \(1\), монстры справа от вас уменьшают свои координаты на \(1\)). Если какой-либо монстр достигает вашего персонажа (перемещается в точку \(0\)), вы проигрываете.

Сможете ли вы выжить и убить всех \(n\) монстров, не дав им достичь вашего персонажа?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 3 \cdot 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из трех строк:

  • первая строка содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 3 \cdot 10^5\); \(1 \le k \le 2 \cdot 10^9\));
  • вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\));
  • третья строка содержит \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(-n \le x_1 < x_2 < x_3 < \dots < x_n \le n\); \(x_i \ne 0\)).

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите YES, если вы можете убить всех \(n\) монстров до того, как они достигнут вашего персонажа, или NO в противном случае.

Вы можете выводить каждую букву в любом регистре (как строчную или как заглавную). Например, строки yEs, yes, Yes и YES будут приняты как положительный ответ.

Примечание

В первом примере вы можете поступить следующим образом:

  • в течение \(1\)-й секунды выстрелить \(1\) пулю в \(1\)-го монстра и \(1\) пулю в \(3\)-го монстра. Затем \(1\)-й монстр умирает, \(2\)-й и \(3\)-й монстры приближаются;
  • в течение \(2\)-й секунды выстрелить \(2\) пули во \(2\)-го монстра. Затем \(2\)-й монстр умирает, \(3\)-й монстр приближается;
  • в течение \(3\)-й секунды выстрелить \(2\) пули в \(3\)-го монстра. Затем \(3\)-й монстр умирает.

Во втором примере вы можете выстрелить только \(1\) пулю, поэтому вы можете убить только одного из двух монстров в течение \(1\)-й секунды. Затем оставшийся монстр приближается и убивает вашего персонажа.

F. Shrink-Reverse

Бинарный поиск жадные алгоритмы Перебор реализация Строки строковые суфф. структуры хэши *2800

Вам задана бинарная строка \(s\) длины \(n\) (строка, состоящая из \(n\) символов, и каждый символ — либо 0, либо 1).

Посмотрим на строку \(s\) как на двоичное представление некоторого числа, и назовем это число значением строки \(s\). Например, значение строки 000 равно \(0\), значение 01101 равно \(13\), значение 100000 — это \(32\), и так далее.

Вы можете применить не более \(k\) операций к \(s\). Каждая операция должна иметь один из следующих двух типов:

  • SWAP: выбрать два индекса \(i < j\) в \(s\) и поменять местами \(s_i\) и \(s_j\);
  • SHRINK-REVERSE: удалить все лидирующие нули из \(s\) и перевернуть строку \(s\).
Например, после применения SHRINK-REVERSE к строке 000101100 вы получите строку 001101.

Какое минимальное значение строки \(s\) вы можете получить, применив не более \(k\) операций к \(s\)?

Входные данные

В первой строке заданы два целых числа \(n\) и \(k\) (\(2 \le n \le 5 \cdot 10^5\); \(1 \le k \le n\)) — длина строки \(s\) и максимальное количество операций.

Во второй строке задана строка \(s\) длины \(n\), состоящая из символов 0 и/или 1.

Дополнительное ограничение на входные данные: в строке \(s\) есть хотя бы одна цифра 1.

Выходные данные

Выведите одно целое число — наименьшее возможное значение строки \(s\), которое вы можете получить, применив не более \(k\) операций. Так как ответ может быть слишком большим, выведите его по модулю \(10^{9} + 7\).

Заметим, что вы должны минимизировать само значение, а не его остаток.

Примечание

В первом примере, одна из оптимальных стратегий — следующая:

  1. 10010010 \(\xrightarrow{\texttt{SWAP}}\) 00010110;
  2. 00010110 \(\xrightarrow{\texttt{SWAP}}\) 00000111.
Значение строки 00000111 равно \(7\).

Во втором примере, одна из оптимальных стратегий — следующая:

  1. 01101000 \(\xrightarrow{\texttt{SHRINK}}\) 1101000 \(\xrightarrow{\texttt{REVERSE}}\) 0001011;
  2. 0001011 \(\xrightarrow{\texttt{SWAP}}\) 0000111.
Значение строки 0000111 равно \(7\).

B. Космическая гавань

математика реализация сортировки Структуры данных *2100

На прямой линии расположены \(n\) точек, пронумерованных от \(1\) до \(n\). Изначально существует \(m\) гаваней, причем \(i\)-я гавань находится в точке \(X_i\) и имеет значение \(V_i\). Гарантируется, что в точках \(1\) и \(n\) существуют гавани. На каждой из \(n\) точек находится ровно один корабль. Стоимость перемещения корабля с его текущего местоположения до следующей гавани равна произведению значения ближайшей гавани слева и расстояния до ближайшей гавани справа. В частности, если корабль уже находится в гавани, стоимость перемещения его до следующей гавани равна \(0\).

Кроме того, имеется \(q\) запросов, каждый из которых является одним из \(2\) типов:

  • \(1\) \(x\) \(v\) — Добавить гавань в точке \(x\) со значением \(v\). Гарантируется, что перед добавлением в точке \(x\) там еще нет гавани.
  • \(2\) \(l\) \(r\) — Вывести сумму стоимости перемещения всех кораблей с точек от \(l\) до \(r\) до их следующих гаваней. Обратите внимание, что вам нужно только вычислить стоимость перемещения кораблей, но не перемещать их фактически.
Входные данные

Первая строка содержит три целых числа \(n\), \(m\) и \(q\) (\(2 \le m \le n \le 3 \cdot 10^5\), \(1 \le q \le 3 \cdot 10^5\)) — количество точек, гаваней и запросов соответственно.

Вторая строка содержит \(m\) различных целых чисел \(X_1, X_2, \ldots, X_m(1 \le X_i \le n)\) — позиции \(i\)-й гавани.

Третья строка содержит \(m\) целых чисел \(V_1, V_2, \ldots, V_m(1 \le V_i \le 10^7)\) — значения \(i\)-й гавани.

Каждая из следующих \(q\) строк содержит три целых числа. Первое целое число \(t\) (\(1\le t \le 2\)) — тип запроса. Если \(t=1\), то следующие два целых числа \(x\) и \(v\) (\(2 \le x \le n - 1\), \(1 \le v \le 10^7\)) — запрос первого типа. Если \(t=2\), то следующие два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)) — запрос второго типа.

Гарантируется, что есть хотя бы один запрос второго типа.

Выходные данные

Для каждого запроса второго типа выведите одно целое число в новой строке — ответ на этот запрос.

Примечание

Для первого запроса типа \(2\), цена для кораблей на позициях \(2\), \(3\), \(4\) и \(5\) будет \(3(3 \times 1)\), \(0\), \(96(24 \times 4)\) и \(72(24 \times 3)\) соответственно.

Для второго запроса типа \(2\), так как корабль в точке \(5\) уже находится в гавани, ответ будет \(0\).

Для третьего запроса типа \(2\), цена для кораблей на позициях \(7\) и \(8\) будет \(15(15 \times 1)\) и \(0\) соответственно.

A. Влад и лучший из пяти

реализация *800

У Владислава есть строка длины \(5\), символы в которой могут быть только \(\texttt{A}\) или \(\texttt{B}\).

Какой символ встречается чаще: \(\texttt{A}\) или \(\texttt{B}\)?

Входные данные

Первая строка ввода содержит целое число \(t\) (\(1 \leq t \leq 32\)) — количество наборов входных данных.

Единственная строка в каждом наборе входных данных содержит строку длиной \(5\), состоящую из символов \(\texttt{A}\) и \(\texttt{B}\).

Все \(t\) строк теста различны.

Выходные данные

Для каждого набора входных данных выведите одну букву (\(\texttt{A}\) или \(\texttt{B}\)), обозначающую символ, который встречается чаще всего в строке.

B. Влад и фигуры

геометрия реализация *800

У Владислава есть квадратное клетчатое поле размером \(n \times n\). Символами \(\texttt{1}\) на поле нарисован либо треугольник, либо квадрат. Так как он слишком занят, он просит вас сказать ему, какая фигура нарисована на поле.

  • Треугольник — это фигура, состоящая из \(k\) (\(k>1\)) последовательных строк, где \(i\)-я строка содержит \(2 \cdot i-1\) подряд идущих символов \(\texttt{1}\), и центральные единицы расположены в одном столбце. Перевернутый треугольник также является корректным треугольником (но не повёрнутый на 90 градусов).
Две левые картинки изображают примеры треугольников: \(k=4\), \(k=3\). Две правые картинки не содержат треугольников.
  • Квадрат — это фигура, состоящая из \(k\) (\(k>1\)) последовательных строк, где \(i\)-я строка содержит \(k\) подряд идущих символов \(\texttt{1}\), которые расположены на одинаковом расстоянии от левого края поля.
Примеры двух квадратов: \(k=2\), \(k=4\).

Для заданного поля определите вид фигуры, которая на нём нарисована.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \leq n \leq 10\)) — размер поля.

Следующие \(n\) строк содержат по \(n\) символов \(\texttt{0}\) или \(\texttt{1}\).

Поле содержит ровно один треугольник или ровно один квадрат, который содержит все \(\texttt{1}\) поля. Гарантируется, что размер треугольника или квадрата больше \(1\) (то есть фигура не может состоять из ровно одной единицы).

Выходные данные

Для каждого набора входных данных выведите строку «SQUARE», если все \(\texttt{1}\) в сетке образуют квадрат, и «TRIANGLE» в противном случае (без кавычек).

C. Влад и сумма сумм цифр

дп реализация *1200

Обратите внимание, что ограничение по времени в этой задаче составляет всего 0.5 секунды на тест.

Владислав записал целые числа от \(1\) до \(n\), включительно, на доске. Затем он заменил каждое число суммой его цифр.

Какова сумма чисел на доске сейчас?

Например, если \(n=12\), то изначально числа на доске равны: \(\)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12.\(\) Затем после замены числа становятся равными: \(\)1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3.\(\) Сумма этих чисел равна \(1+2+3+4+5+6+7+8+9+1+2+3=51\). Таким образом, для \(n=12\) ответ равен \(51\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — наибольшее число, записанное Владиславом.

Выходные данные

Для каждого набора входных данных выведите одно целое число — сумму чисел в конце процесса.

E. Влад и нечётное упорядочение

Бинарный поиск битмаски дп математика реализация Структуры данных теория чисел *1500

У Владислава есть \(n\) карт с номерами \(1, 2, \dots, n\). Он хочет выложить их в ряд следующим образом:

  • Сначала он выкладывает все карты с нечетными номерами от наименьшего к наибольшему.
  • Затем он выкладывает все карты, которые являются удвоенными нечетными числами, от наименьшего к наибольшему (т.е., \(2\) умноженное на нечётное число).
  • Затем он выкладывает все карты, которые являются нечетными числами, умноженными на \(3\), от наименьшего к наибольшему (т.е., \(3\) умноженное на нечётное число).
  • Затем он выкладывает все карты, которые являются нечетными числами, умноженными на \(4\), от наименьшего к наибольшему (т.е., \(4\) умноженное на нечётное число).
  • И так далее, пока все карты не будут выложены.
Какая карта будет \(k\)-й, которую он выложит в этом процессе? После того, как Влад положил карту, он не может использовать ее снова.
Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 5 \cdot 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \leq k \leq n \leq 10^9\)) — количество карт у Влада и позицию карты, которую нужно вывести.

Выходные данные

Для каждого набора входных данных выведите одно целое число — \(k\)-ю карту, которую выложит Влад.

Примечание

В первых семи наборах входных данных примера \(n=7\). Влад выкладывает карты следующим образом:

  • Сначала — все карты с нечетными номерами в порядке \(1\), \(3\), \(5\), \(7\).
  • Затем — все карты, которые являются удвоенными нечетными числами, в порядке \(2\), \(6\).
  • Затем нет оставшихся карт, которые являются нечетными числами, умноженными на \(3\). (У Влада есть только по одной карте каждого числа.)
  • Затем — все карты, которые являются нечетными числами, умноженными на \(4\), и есть только одна такая карта: \(4\).
  • Больше карт не осталось, поэтому Влад останавливается.
Таким образом, порядок карт будет \(1\), \(3\), \(5\), \(7\), \(2\), \(6\), \(4\).

F. Влад и избегание X

битмаски дп Перебор поиск в глубину и подобное реализация *2200

У Владислава есть квадратное клетчатое поле размером \(7 \times 7\), где каждая клетка окрашена в черный или белый цвет. За одну операцию можно выбрать любую клетку и изменить её цвет (черный \(\leftrightarrow\) белый).

Найдите минимальное количество операций, необходимых для того, чтобы гарантировать, что нет черных клеток, у которых все четыре диагональных соседа также черные.

На левом изображении показано, что изначально есть две черные клетки, нарушающие условие. Переворачивая одну клетку, поле будет соответствовать требованию.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 200\)) — количество наборов входных данных. Затем следует описание наборов.

Каждый набор состоит из \(7\) строк, каждая содержит \(7\) символов. Каждый из этих символов либо \(\texttt{W}\), либо \(\texttt{B}\), обозначая белую или черную клетку соответственно.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы гарантировать, что нет черных клеток, у которых все четыре диагональных соседа также черные.

Примечание

Первый набор входных данных изображен в условии.

Второй набор входных данных изображен ниже:

В третьем наборе входных данных поле уже удовлетворяет условию.

G. Влад и проблемы в МИТ

графы Деревья дп жадные алгоритмы поиск в глубину и подобное Потоки реализация *1900

У Владислава есть сын, который очень хотел поступить в МИТ. Общежитие колледжа в МИТ (Молдавский институт технологий) можно представить в виде дерева с \(n\) вершинами, где каждая вершина представляет собой комнату с ровно одним студентом. Дерево — это связный неориентированный граф с \(n\) вершинами и \(n-1\) ребром.

Сегодня ночью есть три типа студентов:

  • студенты, которые хотят веселиться и слушать музыку (обозначены \(\texttt{P}\)),
  • студенты, которые хотят спать и наслаждаться тишиной (обозначены \(\texttt{S}\)), и
  • студенты, которым не важно, что делать ночью (обозначены \(\texttt{C}\)).

Изначально все рёбра представляют собой тонкие стены, которые позволяют музыке проходить через них, поэтому когда веселящийся студент включает музыку, её можно услышать в каждой комнате. Однако мы можем установить толстые стены на любые рёбра — толстые стены не позволяют музыке проходить через них.

Университет хочет установить несколько толстых стен, чтобы каждый веселящийся студент мог слушать музыку, и ни один спящий студент не мог её услышать.

Поскольку университет потерял много денег в судебном процессе о правах на наименование, они просят вас найти минимальное количество толстых стен, которые им придется использовать.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Первая строка каждого набора содержит целое число \(n\) (\(2 \leq n \leq 10^5\)) — количество вершин в дереве.

Вторая строка каждого набора входных данных содержит \(n-1\) целых чисел \(a_2, \dots , a_n\) (\(1 \leq a_i < i\)) — это означает, что есть ребро между \(i\) и \(a_i\) в дереве.

Третья строка каждого набора входных данных содержит строку \(s\) длиной \(n\), состоящую из символов \(\texttt{P}\), \(\texttt{S}\) и \(\texttt{C}\), обозначающих, что студент \(i\) относится к типу \(s_i\).

Сумма \(n\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — искомое минимальное количество толстых стен.

Примечание

В первом случае мы можем установить одну толстую стену между комнатами \(1\) и \(2\), как показано ниже. Мы не можем установить \(0\) стен, так как тогда музыка из комнаты 3 дойдет до комнаты 2, где студент хочет спать, поэтому ответ равен \(1\). Существуют и другие допустимые решения.

F. Микроцикл

графы Деревья жадные алгоритмы поиск в глубину и подобное реализация снм сортировки Структуры данных *1900

Дан неориентированный взвешенный граф из \(n\) вершин и \(m\) рёбер. Между каждой парой вершин в графе существует не более одного ребра, граф не содержит петель (рёбер из вершины в себя же). Граф не обязательно связный.

Цикл в графе называется простым, если он не проходит через одну и ту же вершину дважды и не содержит одно и то же ребро дважды.

Найдите любой простой цикл этого графа, в котором вес самого лёгкого ребра минимален.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(3 \le n \le m \le \min(\frac{n\cdot(n - 1)}{2}, 2 \cdot 10^5)\)) — размер графа и количество рёбер.

Следующие \(m\) строк набора содержат по три целых числа \(u\), \(v\) и \(w\) (\(1 \le u, v \le n\), \(u \ne v\), \(1 \le w \le 10^6\)) — вершины \(u\) и \(v\) соединены ребром веса \(w\).

Гарантируется, что между каждой парой вершин существует не более одного ребра. Обратите внимание, что при заданных ограничениях в графе всегда есть хотя бы один простой цикл.

Гарантируется, что сумма значений \(m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите пару чисел \(b\) и \(k\), где:

  • \(b\) — минимальный вес ребра в найденном цикле,
  • \(k\) — количество вершин в найденном цикле.

В следующей строке выведите \(k\) чисел от \(1\) до \(n\)  — вершины цикла в порядке обхода.

Обратите внимание, что ответ всегда существует, так как при заданных ограничениях в графе всегда есть хотя бы один простой цикл.

F. Цифровые узоры

Комбинаторика математика реализация Структуры данных *2900

Аня занимается рукоделием. Сегодня она решила связать платок из полупрозрачных ниток. Каждая нитка характеризуется единственным целым числом — коэффициентом прозрачности.

Платок делается по следующей схеме: выбираются горизонтальные нитки с коэффициентами прозрачности \(a_1, a_2, \ldots, a_n\) и вертикальные с коэффициентами прозрачности \(b_1, b_2, \ldots, b_m\). Затем они переплетаются между собой, как показано на картинке снизу, и образуют кусок ткани размера \(n \times m\), состоящий ровно из \(nm\) узлов:

Пример куска ткани при \(n = m = 4\).

После того, как сплетение затянется и не будет видно зазоров между нитками, каждый узел, образованный горизонтальной ниткой с номером \(i\) и вертикальной ниткой с номером \(j\), превратится в клетку, которую мы будем обозначать как \((i, j)\). Клетка \((i, j)\) будет иметь коэффициент прозрачности \(a_i + b_j\).

Интересностью полученного платка будем называть количество его подквадратов\(^{\dagger}\), в которых нет пары соседних\(^{\dagger \dagger}\) клеток с одинаковыми коэффициентами прозрачности.

Аня ещё не решила, из каких ниток плести платок, поэтому вам будут даны также \(q\) запросов увеличения/уменьшения коэффициентов прозрачностей ниток на некоторых отрезках. После каждого запроса надо вывести интересность полученного платка.

\(^{\dagger}\)Подквадратом куска ткани называется множество всех его клеток \((i, j)\), таких что \(x_0 \le i \le x_0 + d\) и \(y_0 \le j \le y_0 + d\) для некоторых целых чисел \(x_0\), \(y_0\) и \(d\) (\(1 \le x_0 \le n - d\), \(1 \le y_0 \le m - d\), \(d \ge 0\)).

\(^{\dagger \dagger}\)Клетки \((i_1, j_1)\) и \((i_2, j_2)\) считаются соседними, если \(|i_1 - i_2| + |j_1 - j_2| = 1\).

Входные данные

Первая строка содержит три целых числа \(n\), \(m\) и \(q\) (\(1 \le n, m \le 3 \cdot 10^5\), \(0 \le q \le 3 \cdot 10^5\)) — количество горизонтальных ниток, количество вертикальных ниток и количество запросов изменения.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-10^9 \le a_i \le 10^9\)) — коэффициенты прозрачности для горизонтальных ниток, нитки пронумерованы сверху-вниз.

Третья строка содержит \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) (\(-10^9 \le b_i \le 10^9\)) — коэффициенты прозрачности для вертикальных ниток, нитки пронумерованы слева-направо.

В последующих \(q\) строках указаны запросы изменения. Каждый из запросов описывается четверкой целых чисел \(t\), \(l\), \(r\) и \(x\) (\(1 \le t \le 2\), \(l \le r\), \(-10^9 \le x \le 10^9\)). В зависимости от параметра \(t\) в запросе требуется сделать следующее:

  • \(t=1\). Коэффициенты прозрачности для горизонтальных ниток на отрезке \([l, r]\) увеличиваются на \(x\) (иными словами, для всех целых \(l \le i \le r\) значение \(a_i\) увеличивается на \(x\));
  • \(t=2\). Коэффициенты прозрачности для вертикальных ниток на отрезке \([l, r]\) увеличиваются на \(x\) (иными словами, для всех целых \(l \le i \le r\) значение \(b_i\) увеличивается на \(x\)).
Выходные данные

Выведите \((q+1)\) строку. В \((i + 1)\)-й строке (\(0 \le i \le q\)) выведите одно целое число — интересность платка после применения первых \(i\) запросов.

Примечание

В первом примере коэффициенты прозрачности клеток в получившемся платке равны:

2334
2334
3445
4556

Тогда есть следующие подквадраты, не содержащие двух соседних по вертикали или по горизонтали клеток с одинаковым коэффициентом прозрачности:

  • Каждая из \(16\) клеток по отдельности;
  • Подквадрат с левым верхним углом в клетке \((3, 1)\) и правым нижним углом в клетке \((4, 2)\);
  • Подквадрат с левым верхним углом в клетке \((2, 3)\) и правым нижним углом в клетке \((3, 4)\);
  • Подквадрат с левым верхним углом в клетке \((2, 1)\) и правым нижним углом в клетке \((3, 2)\);
  • Подквадрат с левым верхним углом в клетке \((3, 3)\) и правым нижним углом в клетке \((4, 4)\).

Во втором примере после первого запроса коэффициенты прозрачности горизонтальных ниток равны \([1, 2, 2]\). После второго запроса коэффициенты прозрачности вертикальных ниток равны \([2, -4, 2]\).

D2. Сумма по всем подстрокам (сложная версия)

битмаски дп жадные алгоритмы разделяй и властвуй реализация снм Строки *2100

Это простая версия задачи. Единственное отличие между версиями заключается в ограничениях на \(t\) и \(n\). Вы можете делать взломы только тогда, когда обе версии задачи решены.

Для бинарного\(^\dagger\) шаблона \(p\) и бинарной строки \(q\) одинаковой длины \(m\), скажем, что строка \(q\) называется \(p\)-хорошей, если для каждого \(i\) (\(1 \leq i \leq m\)) существуют индексы \(l\) и \(r\) такие, что:

  • \(1 \leq l \leq i \leq r \leq m\), и
  • \(p_i\) является модой\(^\ddagger\) строки \(q_l q_{l+1} \ldots q_{r}\).

Для шаблона \(p\) определим \(f(p)\) как минимально возможное количество \(\mathtt{1}\) в \(p\)-хорошей бинарной строке (такой же длины, как и шаблон).

Вам дана бинарная строка \(s\) длины \(n\). Найдите \(\)\sum_{i=1}^{n} \sum_{j=i}^{n} f(s_i s_{i+1} \ldots s_j).\(\) Другими словами, вам нужно просуммировать значения \(f\) по всем \(\frac{n(n+1)}{2}\) подстрокам \(s\).

\(^\dagger\) Бинарный шаблон — это строка, состоящая только из символов \(\mathtt{0}\) и \(\mathtt{1}\).

\(^\ddagger\) Символ \(c\) является модой строки \(t\) длины \(m\), если число вхождений \(c\) в \(t\) не меньше \(\lceil \frac{m}{2} \rceil\). Например, \(\mathtt{0}\) является модой \(\mathtt{010}\), \(\mathtt{1}\) не является модой \(\mathtt{010}\), и оба символа \(\mathtt{0}\) и \(\mathtt{1}\) являются модами \(\mathtt{011010}\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^6\)) — длина двоичной строки \(s\).

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\), состоящую только из символов \(\mathtt{0}\) и \(\mathtt{1}\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите сумму значений \(f\) по всем подстрокам \(s\).

Примечание

В первом наборе входных данных единственной \(\mathtt{1}\)-хорошей строкой является \(\mathtt{1}\). Таким образом, \(f(\mathtt{1})=1\).

Во втором наборе входных данных \(f(\mathtt{10})=1\), так как \(\mathtt{01}\) является \(\mathtt{10}\)-хорошей, а \(\mathtt{00}\) не является \(\mathtt{10}\)-хорошей. Таким образом, ответ равен \(f(\mathtt{1})+f(\mathtt{10})+f(\mathtt{0}) = 1 + 1 + 0 = 2\).

В третьем наборе входных данных \(f\) равна \(0\) для всех \(1 \leq i \leq j \leq 5\). Таким образом, ответ равен \(0\).

A. Шипы и монеты

дп жадные алгоритмы реализация *800

Во время вашего путешествия по компьютерным вселенным вы наткнулись на очень интересный мир. Это путь с \(n\) последовательными ячейками, каждая из которых может быть пустой, содержать шипы или монету. За один ход вы можете переместиться на одну или две ячейки вдоль пути, при условии, что конечная ячейка не содержит шипов (и принадлежит пути). Если вы перемещаетесь на ячейку с монетой, вы ее забираете.

Здесь зеленые стрелки соответствуют допустимым ходам, а красная стрелка соответствует недопустимому ходу.

Вы хотите собрать как можно больше монет. Найдите максимальное количество монет, которое вы можете собрать в этом мире, если начнете с самой левой ячейки пути.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Затем следуют описания наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 50\)) — длина пути.

Вторая строка каждого набора входных данных содержит строку из \(n\) символов, описание пути. Символ '.' обозначает пустую ячейку, '@' обозначает ячейку с монетой, а '*' обозначает ячейку с шипами. Гарантируется, что первая ячейка пуста.

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество монет, которое вы можете собрать.

Примечание

Иллюстрацию первого примера показана в условии задачи.

Вот иллюстрация второго примера:

И иллюстрация третьего примера:

C. LR-остатки

математика Перебор реализация Структуры данных *1400

Вам задан массив \(a\) длины \(n\), положительное целое число \(m\) и строка команд из \(n\) символов. Каждая команда — это либо символ 'L', либо символ 'R'.

Обработайте все \(n\) команд в порядке их записи в строке \(s\). Обработка команды производится следующим образом:

  • сначала выведите остаток от произведения значений всех элементов массива \(a\) при делении на \(m\),
  • затем, если команда равна 'L', то удалите из массива \(a\) крайний левый элемент, если команда равна 'R', то удалите из массива \(a\) крайний правый элемент.

Обратите внимание, что после каждого хода длина массива \(a\) уменьшается на \(1\) и после обработки всех команд он окажется пустым.

Напишите программу, которая совершит обработку всех команд в порядке из записи в строке \(s\) (слева направо).

Входные данные

В первой строке записано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте. Далее следуют описания \(t\) наборов входных данных.

Каждый набор входных данных задаётся тремя строками.

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 2\cdot10^5, 1 \le m \le 10^4\)) — начальная длина массива \(a\) и значение, по которому надо брать остаток.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^4\)) — элементы массива \(a\).

Третья строка состоит из \(n\) букв 'L' и 'R' — строка команд \(s\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных теста не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел \(b_1, b_2, \dots, b_n\), где \(b_i\) — остаток при делении произведения всех элементов текущего состояния массива \(a\) на \(m\) в начале выполнения \(i\)-й команды.

Примечание

В первом наборе входных данных примера:

  • \(3 \cdot 1 \cdot 4 \cdot 2 \bmod 6 = 24 \bmod 6 = 0\);
  • \(s_1 = \text{L}\), так что удалим первый элемент и получим массив \([1, 4, 2]\);
  • \(1 \cdot 4 \cdot 2 \bmod 6 = 8 \bmod 6 = 2\);
  • \(s_2 = \text{R}\), так что удалим последний элемент и получим массив \([1, 4]\);
  • \(1 \cdot 4 \bmod 6 = 4 \bmod 6 = 4\);
  • \(s_3 = \text{R}\), так что удалим последний элемент и получим массив \([1]\);
  • \(1 \bmod 6 = 1\);
  • \(s_4 = \text{L}\), так что удалим первый элемент и получим пустой массив.

D. Карточная игра

жадные алгоритмы реализация *1400

Два игрока играют в карточную онлайн-игру. Игра играется с использованием колоды из 32 карт. У каждой карты есть масть и ранг. Существует четыре масти: трефы, бубны, червы и пики. Мы закодируем их символами 'C', 'D', 'H', и 'S' соответственно. И существует 8 рангов, в порядке возрастания: '2', '3', '4', '5', '6', '7', '8', '9'.

Каждая карта обозначается двумя буквами: ее рангом и мастью. Например, восьмёрка червей обозначается как 8H.

В начале игры выбирается одна масть как козырная масть.

На каждом ходу игроки делают ходы следующим образом: первый игрок кладет одну из своих карт на стол, и второй игрок должен побить эту карту одной из своих карт. После этого обе карты перемещаются на сброс.

Карта может побить другую карту, если обе карты имеют одинаковую масть, и у первой карты ранг выше, чем у второй. Например, 8S может побить 4S. Кроме того, козырная карта может побить любую некозырную карту, независимо от ранга карт, например, если козырная масть — трефы ('C'), то 3C может побить 9D. Обратите внимание, что козырные карты могут быть побиты только козырными картами более высокого ранга.

В игре было сыграно \(n\) раундов, поэтому в сбросе теперь находится \(2n\) карт. Вы хотите восстановить раунды, сыгранные в игре, но карты в сбросе перемешаны. Найдите любую возможную последовательность из \(n\) раундов, которая могла быть сыграна в игре.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Затем следуют \(t\) наборов входных данных.

Первая строка набора входных данных содержит целое число \(n\) (\(1\le n\le 16\)).

Вторая строка набора входных данных содержит один символ, козырная масть. Она является одной из «CDHS».

Третья строка набора входных данных содержит описание \(2n\) карт. Каждая карта описывается двухсимвольной строкой, первый символ — ранг карты, который является одним из «23456789», и второй — масть карты, которая является одной из «CDHS». Все карты различны.

Выходные данные

Для каждого теста выведите ответ на него:

  • Выведите \(n\) строк. В каждой строке выведите описание двух карт, в том же формате, что и во входном файле: первая карта, сыгранная первым игроком, и вторая карта — карта, использованная вторым игроком, чтобы ее побить.
  • Если нет решения, выведите одну строку «IMPOSSIBLE».

Если существует несколько ответов, выведите любой из них.

E. Финальный отсчёт

математика реализация теория чисел *1600

Вы находитесь в ядерной лаборатории, которая готовится взорваться и уничтожить Землю. Вы должны спасти Землю, прежде чем финальный отсчёт достигнет нуля.

Отсчёт состоит из \(n\) (\(1 \le n \le 4 \cdot 10^5\)) механических индикаторов, каждый из которых показывает одну десятичную цифру. Вы заметили, что когда отсчёт меняет своё состояние с \(x\) на \(x-1\), это не происходит сразу. Вместо этого каждое изменение одной цифры занимает одну секунду.

Так, например, если отсчёт показывает 42, то он изменится на 41 за одну секунду, потому что изменяется только одна цифра, но если отсчёт показывает 2300, то он изменится на 2299 за три секунды, потому что изменяются три последние цифры.

Узнайте, сколько времени осталось до того, как отсчёт достигнет нуля.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Затем следуют описания наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1\le n\le 4\cdot 10^5\)).

Вторая строка содержит строку из \(n\) цифр, текущее состояние отсчёта. Гарантируется, что хотя бы одна цифра не равна нулю.

Сумма \(n\) по всем наборам входных данных теста не превышает \(4\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число без ведущих нулей, количество секунд, оставшихся до того, как отсчёт достигнет нуля. Обратите внимание, что это число может быть огромным.

Примечание

В первом примере есть четыре изменения, которые занимают 2 секунды: 40 до 39, 30 до 29, 20 до 19 и 10 до 09, другие изменения занимают по 1 секунде каждое. Таким образом, общее время составляет \(2\cdot 4 + 1\cdot(42-4) = 46\).

B. Сделай сумму кратной 3

математика реализация теория чисел *800

Вам дан массив \(a_1, a_2, \ldots, a_n\).

За один ход можно выполнить любую из двух операций:

  • Выбрать элемент из массива и удалить его из массива. В результате длина массива уменьшается на \(1\);
  • Выбрать элемент из массива и увеличить его значение на \(1\).

Вы можете выполнять произвольное количество ходов. Если текущий массив оказался пустым, то больше ходов выполнять нельзя.

Ваша задача — найти минимальное количество ходов, которые необходимо выполнить, чтобы сумма элементов массива \(a\) стала делиться на \(3\). Возможно, вам понадобится \(0\) ходов.

Обратите внимание, что сумма элементов пустого массива (массива длины \(0\)) равна \(0\).

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^4\)).

Сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: минимальное количество ходов.

Примечание

В первом наборе входных данных, изначально \(a = [2, 2, 5, 4]\). Один из оптимальных способов выполнения ходов:

  • удалить \(4\)-й элемент и получить \(a = [2, 2, 5]\);
Таким образом сумма массива \(a\) станет делиться на \(3\) (действительно, \(a_1 + a_2 + a_3 = 2 + 2 + 5 = 9\)).

Во втором наборе входных данных изначально сумма массива равна \(1+3+2 = 6\), что делится на \(3\). Таким образом, ходы не требуются. Следовательно, ответ равен \(0\).

В четвертом наборе входных данных изначально сумма массива равна \(1\), что не делится на \(3\). Удалением его единственного элемента вы получите пустой массив, поэтому его сумма равна \(0\). Следовательно, ответ равен \(1\).

C. Количество значений k

математика Перебор реализация теория чисел *1100

Вам даны три положительных целых числа \(a\), \(b\) и \(l\) (\(a,b,l>0\)).

Можно показать, что всегда существует способ выбрать неотрицательные (т.е. \(\ge 0\)) целые числа \(k\), \(x\) и \(y\) таким образом, что \(l = k \cdot a^x \cdot b^y\).

Ваша задача — найти количество различных возможных значений \(k\) для всех таких способов.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Следующие \(t\) строк содержат три целых числа, \(a\), \(b\) и \(l\) (\(2 \le a, b \le 100\), \(1 \le l \le 10^6\)) — описание набора входных данных.

Выходные данные

Выведите \(t\) строк, где \(i\)-я (\(1 \le i \le t\)) строка содержит целое число — ответ на \(i\)-й набор входных данных.

Примечание

В первом наборе входных данных примера \(a=2, b=5, l=20\). Возможные значения \(k\) (и соответствующие \(x,y\)) следующие:

  • Выберите \(k = 1, x = 2, y = 1\). Тогда \(k \cdot a^x \cdot b^y = 1 \cdot 2^2 \cdot 5^1 = 20 = l\).
  • Выберите \(k = 2, x = 1, y = 1\). Тогда \(k \cdot a^x \cdot b^y = 2 \cdot 2^1 \cdot 5^1 = 20 = l\).
  • Выберите \(k = 4, x = 0, y = 1\). Тогда \(k \cdot a^x \cdot b^y = 4 \cdot 2^0 \cdot 5^1 = 20 = l\).
  • Выберите \(k = 5, x = 2, y = 0\). Тогда \(k \cdot a^x \cdot b^y = 5 \cdot 2^2 \cdot 5^0 = 20 = l\).
  • Выберите \(k = 10, x = 1, y = 0\). Тогда \(k \cdot a^x \cdot b^y = 10 \cdot 2^1 \cdot 5^0 = 20 = l\).
  • Выберите \(k = 20, x = 0, y = 0\). Тогда \(k \cdot a^x \cdot b^y = 20 \cdot 2^0 \cdot 5^0 = 20 = l\).

Во втором наборе входных данных примера \(a=2, b=5, l=21\). Обратите внимание, что \(l = 21\) не делится ни на \(a = 2\), ни на \(b = 5\). Поэтому мы можем установить только \(x = 0, y = 0\), что соответствует \(k = 21\).

В третьем наборе входных данных примера \(a=4, b=6, l=48\). Возможные значения \(k\) (и соответствующие \(x,y\)) следующие:

  • Выберите \(k = 2, x = 1, y = 1\). Тогда \(k \cdot a^x \cdot b^y = 2 \cdot 4^1 \cdot 6^1 = 48 = l\).
  • Выберите \(k = 3, x = 2, y = 0\). Тогда \(k \cdot a^x \cdot b^y = 3 \cdot 4^2 \cdot 6^0 = 48 = l\).
  • Выберите \(k = 8, x = 0, y = 1\). Тогда \(k \cdot a^x \cdot b^y = 8 \cdot 4^0 \cdot 6^1 = 48 = l\).
  • Выберите \(k = 12, x = 1, y = 0\). Тогда \(k \cdot a^x \cdot b^y = 12 \cdot 4^1 \cdot 6^0 = 48 = l\).
  • Выберите \(k = 48, x = 0, y = 0\). Тогда \(k \cdot a^x \cdot b^y = 48 \cdot 4^0 \cdot 6^0 = 48 = l\).

E. Оптимальные тренировки

Бинарный поиск математика реализация Тернарный поиск *1500

Исаак начинает свою тренировку. Доступно \(n\) маршрутов, \(i\)-й маршрут (\(1 \le i \le n\)) состоит из \(a_i\) участков одинаковой длины.

Дано целое число \(u\) (\(1 \le u \le 10^9\)), завершение каждого участка может увеличить способности Исаака на определенное значение:

  • Завершение \(1\)-го участка увеличивает способности Исаака на \(u\).
  • Завершение \(2\)-го участка увеличивает способности Исаака на \(u-1\).
  • Завершение \(3\)-го участка увеличивает способности Исаака на \(u-2\).
  • \(\ldots\)
  • Завершение \(k\)-го участка (\(k \ge 1\)) увеличивает способности Исаака на \(u+1-k\). (Значение \(u+1-k\) может быть отрицательным, что означает, что завершение дополнительного участка уменьшает способности Исаака.)

Также дано целое число \(l\). Вы можете выбрать целое число \(r\), такое что \(l \le r \le n\), и тогда Исаак завершит каждый участок каждого маршрута \(l, l + 1, \dots, r\) (то есть, всего \(\sum_{i=l}^r a_i = a_l + a_{l+1} + \ldots + a_r\) участков).

Ответьте на следующий вопрос: какое оптимальное значение \(r\) вы можете выбрать, чтобы увеличение способностей Исаака было максимальным?

Если существует несколько значений \(r\), которые максимизируют увеличение способностей Исаака, выведите наименьшее значение \(r\).

Для увеличения сложности вам нужно ответить на вопрос для \(q\) различных значений \(l\) и \(u\).

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Далее следуют описания наборов.

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^4\)).

Третья строка содержит одно целое число \(q\) (\(1 \le q \le 10^5\)).

Следующие \(q\) строк содержат по два целых числа \(l\) и \(u\) (\(1 \le l \le n, 1 \le u \le 10^9\)) — описания каждого запроса.

Сумма \(n\) по всем наборам входных данных теста не превышает \(2 \cdot 10^5\). Сумма \(q\) по всем наборам входных данных теста не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого теста выведите \(q\) целых чисел: \(i\)-е целое число содержит оптимальное значение \(r\) для \(i\)-го запроса. Если существует несколько решений, выведите наименьшее из них.

Примечание

Для \(1\)-го запроса в первом тесте:

  • Выбрав \(r = 3\), Исаак завершает \(a_1 + a_2 + a_3 = 3 + 1 + 4 = 8\) участков в общей сложности, поэтому его увеличение способностей составляет \(u+(u-1)+\ldots+(u-7)=8+7+6+5+4+3+2+1 = 36\).
  • Выбрав \(r = 4\), Исаак завершает \(a_1 + a_2 + a_3 + a_4 = 3 + 1 + 4 + 1 = 9\) участков в общей сложности, поэтому его увеличение способностей составляет \(u+(u-1)+\ldots+(u-8)=8+7+6+5+4+3+2+1+0 = 36\).

Оба варианта дают оптимальное увеличение способностей, однако мы хотим выбрать наименьшее значение \(r\). Поэтому мы выбираем \(r = 3\).

Для \(2\)-го запроса в первом тесте, выбрав \(r = 4\), Исаак завершает \(a_2 + a_3 + a_4 = 1 + 4 + 1 = 6\) участков в общей сложности, поэтому его увеличение способностей составляет \(u+(u-1)+\ldots+(u-5)=7+6+5+4+3+2 = 27\). Это оптимальное увеличение способностей.

Для \(3\)-го запроса в первом тесте:

  • Выбрав \(r = 5\), Исаак завершает \(a_5 = 5\) участков в общей сложности, поэтому его увеличение способностей составляет \(u+(u-1)+\ldots+(u-4)=9+8+7+6+5 = 35\).
  • Выбрав \(r = 6\), Исаак завершает \(a_5 + a_6 = 5 + 9 = 14\) участков в общей сложности, поэтому его увеличение способностей составляет \(u+(u-1)+\ldots+(u-13)=9+8+7+6+5+4+3+2+1+0+(-1)+(-2)+(-3)+(-4) = 35\).

Оба варианта дают оптимальное увеличение способностей, однако мы хотим выбрать наименьшее значение \(r\). Поэтому мы выбираем \(r = 5\).

Таким образом, вывод для первого теста: \([3, 4, 5]\).

D. Экзамен в ЦПМ

Бинарный поиск Комбинаторика математика реализация *1800

Центр Помощи Магистрам объявил вступительный экзамен, который заключается в следующем.

Кандидату даётся множество \(s\) размера \(n\), а также некоторое странное число \(c\). Для этого множества нужно посчитать количество пар целых чисел \((x, y)\) таких, что \(0 \leq x \leq y \leq c\), \(x + y\) не содержится в множестве \(s\), а также \(y - x\) не содержится в множестве \(s\).

Ваш друг хочет поступить в Центр. Помогите ему сдать экзамен!

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 2 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(c\) (\(1 \leq n \leq 3 \cdot 10^5\), \(1 \leq c \leq 10^9\)) — размер множества и странное число.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(s_1, s_2, \ldots, s_{n}\) (\(0 \leq s_1 < s_2 < \ldots < s_{n} \leq c\)) — элементы множества \(s\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество подходящих пар целых чисел.

Примечание

В первом наборе входных данных подходят следующие пары: \((0, 0)\), \((2, 2)\), \((3, 3)\).

В третьем наборе входных данных подходят следующие пары: \((0, 1)\), \((0, 2)\), \((0, 4)\), \((1, 3)\), \((2, 6)\), \((3, 4)\), \((3, 5)\), \((4, 5)\), \((4, 6)\), \((5, 6)\).

F. Дерево Андрея

Бинарный поиск Деревья жадные алгоритмы Конструктив поиск в глубину и подобное реализация снм Структуры данных *2800

Магистр Андрей очень любит деревья\(^{\dagger}\), поэтому у него есть дерево, состоящее из \(n\) вершин.

Но не все так просто. Магистр Тимофей решил украсть одну вершину из дерева. Если Тимофей украл вершину \(v\) из дерева, то вершина \(v\) и все ребра с концом в вершине \(v\) удаляются из дерева, при этом номера других вершин не меняются. Чтобы Андрей не расстраивался, Тимофей решил сделать получившийся граф снова деревом. Для этого он может добавлять ребра между произвольными вершинами \(a\) и \(b\), однако при добавлении такого ребра он должен заплатить \(|a - b|\) монет в Центр Помощи Магистрам.

Обратите внимание, что получившееся дерево не содержит вершину \(v\).

Тимофей не определился, какую вершину \(v\) он удалит из дерева, поэтому он хочет знать для каждой вершины \(1 \leq v \leq n\), какое минимальное количество монет нужно потратить, чтобы после удаления вершины \(v\) сделать граф снова деревом, а также какие ребра при этом нужно добавить.

\(^{\dagger}\)Деревом называется неориентированный связный граф без циклов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(5 \le n \le 2\cdot10^5\)) — количество вершин в дереве Андрея.

В следующих \(n - 1\) строках содержится описание ребер дерева. \(i\)-я из этих строк содержит два целых числа \(u_i\) и \(v_i\) (\(1 \le u_i, v_i \le n\)) — номера вершин, соединённых \(i\)-м ребром.

Гарантируется, что данные рёбра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2\cdot10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ в следующем формате:

Для каждой вершины \(v\) (в порядке от \(1\) до \(n\)) в первой строке выведите два целых числа \(w\) и \(m\) — минимальное количество монет, которое нужно потратить, чтобы граф после удаления вершины \(v\) снова стал деревом, и количество добавленных ребер.

Далее выведите \(m\) строк, каждая из которых содержит два целых числа \(a\) и \(b\) (\(1 \le a, b \le n, a \ne v, b \ne v\), \(a \ne b\)) — концы добавленного ребра.

Если существует несколько способов добавить ребра, вы можете вывести любое решение с минимальной стоимостью.

Примечание

В первом наборе входных данных:

Рассмотрим удаление вершины \(4\):

Оптимальным решением будет провести ребро из вершины \(5\) в вершину \(3\). Тогда мы потратим \(|5 - 3| = 2\) монеты.

В третьем наборе входных данных:

Рассмотрим удаление вершины \(1\):

Оптимальным решением будет:

  • Провести ребро из вершины \(2\) в вершину \(3\), потратив \(|2 - 3| = 1\) монету.
  • Провести ребро из вершины \(3\) в вершину \(4\), потратив \(|3 - 4| = 1\) монету.
  • Провести ребро из вершины \(4\) в вершину \(5\), потратив \(|4 - 5| = 1\) монету.

Тогда сумарно мы потратим \(1 + 1 + 1 = 3\) монеты.

Рассмотрим удаление вершины \(2\):

Ребра проводить не нужно, так как после удаления вершины граф останется деревом.

B. Пинбол

Бинарный поиск математика реализация Структуры данных *2000

Дана полоска из \(n\) клеток. В \(i\)-й клетке полоски находится символ \(s_i\), равный '<' или '>'.

Когда шарик помещают в одну из клеток, он начинает движение в соответствии со следующими правилами:

  • Если шарик находится в \(i\)-й клетке и \(s_i\) равно '<', то шарик за одну секунду сдвигается на одну клетку влево. Если же \(s_i\) равно '>', то шарик сдвигается на одну клетку вправо.
  • После того как шарик сдвинулся, символ \(s_i\) заменяется на противоположный (т. е. если символ \(s_i\) был равен '<', он становится равным '>', и наоборот).
  • Шарик прекращает движение, когда покидает полоску: он выходит за границы либо слева, либо справа.

Вам нужно ответить на \(n\) независимых запросов. В \(i\)-м запросе шарик изначально помещается в \(i\)-ю клетку. Обратите внимание, что шарик всегда помещается на одну из клеток изначальной полоски.

Для каждого запроса посчитайте, сколько пройдёт секунд до момента, когда шарик выйдет за пределы полоски. Можно доказать, что шарик всегда покинет полоску за конечное число шагов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 5 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит строку \(s_1s_2 \ldots s_{n}\) длины \(n\), состоящую из символов '<' и '>'.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, для каждого \(i\) (\(1 \le i \le n\)) выведите ответ, если шарик изначально помещается в \(i\)-ю клетку.

Примечание

В первом наборе входных данных движение шарика для \(i=1\) показано на картинке ниже. Шарику нужно \(3\) секунды, чтобы покинуть полоску.

Движение шарика для \(i=2\) показано на картинке ниже. Шарику нужно \(6\) секунд, чтобы покинуть полоску.

C. Арена покемонов

графы жадные алгоритмы кратчайшие пути реализация сортировки Структуры данных *2400

Вы находитесь на дуэльной арене. Вы также владеете \(n\) покемонами. Изначально на арене находится только \(1\)-й покемон.

Каждый покемон имеет \(m\) характеристик. Значение \(j\)-й характеристики у \(i\)-го покемона равно \(a_{i,j}\). Также у каждого покемона есть стоимость его вызова: цена \(i\)-го покемона равна \(c_i\).

Вы хотите добиться того, чтобы на арене находился \(n\)-й покемон. Для этого вы можете выполнять операции двух типов любое количество раз в любом порядке:

  • Выбрать три целых числа \(i\), \(j\), \(k\) (\(1 \le i \le n\), \(1 \le j \le m\), \(k > 0\)) и навсегда увеличить \(a_{i,j}\) на \(k\). Стоимость такой операции равна \(k\).
  • Выбрать два числа \(i\), \(j\) (\(1 \le i \le n\), \(1 \le j \le m\)) и вызвать \(i\)-го покемона, который бросит вызов текущему покемону на арене по \(j\)-й характеристике. При этом \(i\)-й покемон победит, если \(a_{i,j}\) не меньше, чем \(j\)-я характеристика текущего покемона на арене (иначе он проиграет). После дуэли на арене остаётся только её победитель. Стоимость такой операции равна \(c_i\).

Найдите наименьшую суммарную стоимость операций, необходимых для того, чтобы на арене оказался \(n\)-й покемон.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \le n \le 4 \cdot 10^5\), \(1 \le m \le 2 \cdot 10^5\), \(2 \leq n \cdot m \leq 4 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \le c_i \le 10^9\)).

Далее, \(i\)-я из следующих \(n\) строк содержит \(m\) целых чисел \(a_{i,1}, a_{i,2}, \ldots, a_{i,m}\) (\(1 \le a_{i,j} \le 10^9\)).

Гарантируется, что сумма значений \(n \cdot m\) по всем наборам входных данных не превосходит \(4 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальную суммарную стоимость операций, чтобы на арене оказался \(n\)-й покемон.

Примечание

В первом наборе входных данных массив значений характеристик \(1\)-го покемона (который изначально расположен на арене) есть \([2,9,9]\).

На первой операции можно выбрать \(i=3\), \(j=1\), \(k=1\) и увеличить \(a_{3,1}\) на \(1\) навсегда. Теперь массив значений характеристик \(3\)-го покемона станет равен \([2,2,1]\). Стоимость этой операции равна \(k = 1\).

На второй операции можно выбрать \(i=3\), \(j=1\) и вызвать \(3\)-го покемона, который сразится с текущим покемоном на арене по \(1\)-й характеристике. Поскольку \(a_{i,j}=a_{3,1}=2 \ge 2=a_{1,1}\), \(3\)-й покемон победит. Стоимость этой операции равна \(c_3 = 1\).

Таким образом, \(3\)-й покемон находится на арене, а суммарная стоимость операций равна \(2\). Можно показать, что меньше \(2\) ответ получить нельзя.

Во втором наборе входных данных массив значений характеристик \(1\)-го покемона есть \([9,9,9]\).

На первой операции можно выбрать \(i=2\), \(j=3\), \(k=2\) и увеличить \(a_{2,3}\) на \(2\) навсегда. Теперь массив значений характеристик \(2\)-го покемона есть \([6,1,9]\). Стоимость этой операции равна \(k = 2\).

На второй операции можно выбрать \(i=2\), \(j=3\) и вызвать \(2\)-го покемона, который сразится с текущим покемоном на арене по \(3\)-й характеристике. Поскольку \(a_{i,j}=a_{2,3}=9 \ge 9=a_{1,3}\), \(2\)-й покемон победит. Стоимость этой операции равна \(c_2 = 3\).

На третьей операции можно выбрать \(i=3\), \(j=2\) и вызвать \(3\)-го покемона, который сразится с текущим покемоном на арене по \(2\)-й характеристике. Поскольку \(a_{i,j}=a_{1,2}=2 \ge 1=a_{2,2}\), \(3\)-й покемон победит. Стоимость этой операции равна \(c_3 = 1\).

Таким образом, \(3\)-й покемон находится на арене, а суммарная стоимость операций равна \(6\). Можно показать, что меньше \(6\) ответ получить нельзя.

A. Перемешиватель

математика реализация *800

Задан массив \(a_1, a_2, \ldots, a_n\). Изначально \(a_i=i\) для всех \(1 \le i \le n\).

Для произвольного целого \(k \ge 2\) операция \(\texttt{swap}(k)\) устроена следующим образом:

  • Пусть \(d\) — наибольший делитель\(^\dagger\) числа \(k\), не равный \(k\). Тогда нужно поменять местами элементы \(a_d\) и \(a_k\).

Выполним операции \(\texttt{swap}(i)\) для каждого \(i=2,3,\ldots, n\) именно в таком порядке. Найдите позицию, на которой в результате окажется число \(1\). Иными словами, найдите такое \(j\), что \(a_j = 1\) после всех операций.

\(^\dagger\) Целое число \(x\) называется делителем числа \(y\), если существует целое \(z\), для которого \(y = x \cdot z\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^9\)) — длину массива \(a\).

Выходные данные

Для каждого набора входных данных выведите позицию, на которой окажется число \(1\).

Примечание

В первом наборе входных данных массив равен \([1]\), и никакие операции не выполняются.

Во втором наборе входных данных \(a\) изменяется следующим образом:

  • Изначально \(a\) равен \([1,2,3,4]\).
  • После выполнения \(\texttt{swap}(2)\) массив \(a\) становится равным \([\underline{2},\underline{1},3,4]\) (элементы, поменянные местами, подчёркнуты).
  • После выполнения \(\texttt{swap}(3)\) массив \(a\) становится равным \([\underline{3},1,\underline{2},4]\).
  • После выполнения \(\texttt{swap}(4)\) массив \(a\) становится равным \([3,\underline{4},2,\underline{1}]\).

Итак, число \(1\) находится на позиции \(4\) (то есть \(a_4 = 1\)). Значит, ответ равен \(4\).

B. Бинарный путь

дп жадные алгоритмы реализация *1300

Дана таблица размера \(2 \times n\), заполненная нулями и единицами. Пусть число, стоящее на пересечении \(i\)-й строки и \(j\)-го столбца, равно \(a_{ij}\).

В левой верхней клетке \((1, 1)\) находится кузнечик, который может прыгать только на одну клетку вправо или вниз. Ему нужно добраться до правой нижней клетки \((2, n)\). Рассмотрим бинарную строку длины \(n+1\), состоящую из чисел, записанных в клетках пути, без изменения их относительного порядка.

Вам необходимо:

  1. Найти лексикографически наименьшую\(^\dagger\) строку, которую можно получить, выбрав один из доступных путей;
  2. Найти количество путей, которые дают эту лексикографически наименьшую строку.

\(^\dagger\) Если строки \(s\) и \(t\) имеют равную длину, то строка \(s\) лексикографически меньше строки \(t\), если и только если в первой позиции, где \(s\) и \(t\) различны, в строке \(s\) элемент меньше, чем соответствующий элемент в \(t\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит бинарную строку \(a_{11} a_{12} \ldots a_{1n}\) (\(a_{1i}\) равно либо \(0\), либо \(1\)).

Третья строка каждого набора входных данных содержит бинарную строку \(a_{21} a_{22} \ldots a_{2n}\) (\(a_{2i}\) равно либо \(0\), либо \(1\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите:

  1. Лексикографически наименьшую строку, которую можно получить;
  2. Число путей, дающих эту строку.
Примечание

В первом наборе входных данных лексикографически наименьшей строкой является \(\mathtt{000}\). Есть два пути, движение по которым даст эту строку:

Во втором наборе входных данных лексикографически наименьшей строкой является \(\mathtt{11000}\). Существует всего один путь, дающий такую строку:

A. Экзамены

математика реализация *900

Однажды автор раунда Codeforces сдавал экзамены. Экзаменов было n штук, при этом за каждый экзамен можно было получить целую оценку от 2 до 5. Каждый экзамен, сданный с оценкой 2, требуется пересдать.

Чтобы получить оценки, сумма которых строго больше k, автору пришлось бы потратить слишком много усилий и раунд Codeforces получился бы так себе. С другой стороны, если получить оценки, сумма которых строго меньше k, мама автора будет весьма недовольна.

Авторы раундов Codeforces очень умны, поэтому они всегда получают за экзамен ту оценку, которую выбрали сами. Кроме всего прочего, авторы раундов Codeforces «ой-как» не любят пересдавать экзамены.

Помогите автору, найдите какое минимальное количество экзаменов придется пересдавать, если он сдаст экзамены так, что сумма оценок за все n экзаменов будет в точности равна k.

Входные данные

В единственной строке через пробел записаны целые числа n и k (1 ≤ n ≤ 50, 1 ≤ k ≤ 250) — количество экзаменов и требуемая сумма оценок.

Гарантируется, что существует способ сдать n экзаменов так, чтобы сумма оценок в точности была равна k.

Выходные данные

Выведите единственное число — минимальное количество экзаменов, по которым автор раундов Codeforces получит 2, при условии, что сумма оценок за все экзамены должна быть равна k.

Примечание

В первом примере чтобы достичь цели, придется сдать все экзамены на 2.

Во втором примере нужно сдать два экзамена на 3 и два на 2.

В третьем примере нужно сдать один экзамен на 3.

D. Рудольф и игра с мячом

дп поиск в глубину и подобное реализация *1200

Рудольф и Бернард решили сыграть с друзьями в игру. В круг встают \(n\) человек и начинают бросать друг другу мяч. Они пронумерованы от \(1\) до \(n\) по часовой стрелке.

Назовём переходом в игре перемещение мяча от некоторого игрока к его соседу. Переход может быть выполнен по часовой стрелке или против часовой стрелки.

Назовём расстоянием по часовой стрелке (против часовой стрелки) от игрока \(y_1\) до игрока \(y_2\) число переходов по часовой стрелке (против часовой стрелки), которые нужно выполнить, чтобы переместить мяч от игрока \(y_1\) к игроку \(y_2\). Например, если \(n=7\), тогда расстояние по часовой стрелке от \(2\) до \(5\) равно \(3\), а расстояние против часовой стрелки от \(2\) до \(5\) равно \(4\).

Изначально мяч находится у игрока номер \(x\) (нумерация игроков осуществляется по часовой стрелке). Во время \(i\)-го хода тот, у кого мяч, бросает его на расстояние \(r_i\) (\(1 \le r_i \le n - 1\)) по или против часовой стрелки. Например, если играет \(7\) человек, и \(2\)-й игрок, получив мяч, бросает его на расстояние \(5\), то мяч получит либо \(7\)-й игрок (бросок по часовой стрелке), либо \(4\)-й игрок (бросок против часовой стрелки). Иллюстрация этого примера приведена ниже.

Игра прервалась после \(m\) бросков из-за неожиданного дождя. Когда дождь закончился, ребята вновь собрались, чтобы продолжить. Однако никто не мог вспомнить, у кого остался мяч. Как оказалось, Бернард запомнил расстояния каждого из бросков и направление для некоторых бросков (по часовой стрелке или против часовой стрелки).

Рудольф просит вас помочь ему и на основе информации от Бернарда вычислить номера игроков, у которых мог оказаться мяч после \(m\) бросков.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит три целых числа \(n, m, x\) (\(2 \le n \le 1000\), \(1 \le m \le 1000\), \(1 \le x \le n\)) — количество игроков, число совершённых бросков и номер игрока, который бросил мяч первым, соответственно.

Следующие \(m\) строк содержат информацию о каждом броске по порядку. Каждая из них содержит целое число \(r_i\) (\(1 \le r_i \le n - 1\)) — расстояние, на которое был совершен \(i\)-й бросок, и символ \(c_i\), равный «0», «1» или «?»:

  • если \(c_i\)='0', то \(i\)-й бросок был совершен по часовой стрелке,
  • если \(c_i\)='1', то \(i\)-й бросок был совершен против часовой стрелки,
  • если \(c_i\)='?', то Бернард не помнит направление, и \(i\)-й бросок мог быть совершен как по часовой стрелке так и против часовой стрелки.

Гарантируется, что сумма \(n \cdot m\) (\(n\) умноженное на \(m\)) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите по две строки.

В первой строке выведите количество игроков \(k\) (\(1 \le k \le n\)), у которых в конце игры мог оказаться мяч.

В следующей строке выведите \(k\) чисел \(b_i\) (\(1 \le b_i \le n\)) — номера игроков в возрастающем порядке. Все номера должны быть различными.

Примечание

Ниже приведена иллюстрация трёх бросков для первого набора входных данных примера. Стрелки обозначают возможные направления броска. Серым цветом обозначены игроки, у которых мог оказаться мяч после броска.

D. Учимся рисовать

Бинарный поиск дп жадные алгоритмы поиск в глубину и подобное реализация сортировки Структуры данных *2100

Элси учится рисовать. У нее есть холст из \(n\) клеток, пронумерованных от \(1\) до \(n\), и она может раскрасить любое (возможно, пустое) подмножество клеток.

У Элси есть двумерный массив \(a\), который она будет использовать для оценки картин. Пусть максимальные непрерывные отрезки закрашенных клеток в картине равны \([l_1,r_1],[l_2,r_2],\ldots,[l_x,r_x]\). Красота картины — это сумма \(a_{l_i,r_i}\) по всем \(1 \le i \le x\). На изображении выше максимальные непрерывные отрезки закрашенных клеток равны \([2,4],[6,6],[8,9]\), а красота картины равна \(a_{2,4}+a_{6,6}+a_{8,9}\).

Всего есть \(2^n\) различных способов раскрасить холст. Помогите Элси найти \(k\) наибольших значений красоты картины, которые она может получить, среди всех способов. Обратите внимание, что эти \(k\) значений не обязательно должны быть различными. Гарантируется, что существует не менее \(k\) различных способов раскрасить холст.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит \(2\) целых числа \(n\) и \(k\) (\(1 \leq n \leq 10^3\), \(1 \leq k \leq \min(2^n, 5 \cdot 10^3)\)) — количество клеток и количество наибольших значений красоты картины, которые вы должны найти.

Следующие \(n\) строк каждого набора входных данных описывают двумерный массив \(a\), \(i\)-я строка содержит \(n-i+1\) целых чисел \(a_{i,i},a_{i,i+1},\ldots,a_{i,n}\) (\(-10^6 \leq a_{i,j} \leq 10^6\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^3\), а сумма \(k\) по всем наборам входных данных не превосходит \(5 \cdot 10^3\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке \(k\) целых чисел: \(i\)-е из них должно равняться \(i\)-му наибольшему значение красоты картины, которое может получить Элси.

Примечание

В первом наборе входных данных Элси может либо закрасить единственную клетку, либо не закрашивать ее. Если она раскрасит единственную клетку, красота картины составит \(-5\). Если она решит не раскрашивать ее, красота картины составит \(0\). Таким образом, наибольшая красота, которую она может получить, равна \(0\), а вторая по величине красота, которую она может получить, равна \(-5\).

Ниже приведена иллюстрация третьего набора входных данных.

F. Любимая функция Фермера Джона

математика Перебор реализация Структуры данных *2700

У Фермера Джона есть массив \(a\) длины \(n\). У него также есть функция \(f\) со следующим рекуррентным соотношением:

  • \(f(1) = \sqrt{a_1}\);
  • Для всех \(i > 1\), \(f(i) = \sqrt{f(i-1)+a_i}\).

Обратите внимание, что \(f(i)\) не обязательно является целым числом.

Он планирует сделать \(q\) обновлений массива. При каждом обновлении он дает вам два целых числа \(k\) и \(x\) и хочет, чтобы вы установили \(a_k = x\). После каждого обновления он хочет узнать \(\lfloor f(n) \rfloor\), где \(\lfloor t \rfloor\) обозначает значение \(t\), округленное вниз до ближайшего целого числа.

Входные данные

Первая строка содержит \(n\) и \(q\) (\(1 \leq n, q \leq 2 \cdot 10^5\)) — длину \(a\) и количество обновлений, которые он будет выполнять.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^{18}\)).

Следующие \(q\) строк содержат по два целых числа \(k\) и \(x\) (\(1 \leq k \leq n\), \(0 \leq x \leq 10^{18}\)) — индекс обновления и элемент, на который он заменит \(a_k\).

Выходные данные

После каждого обновления выведите целое число \(\lfloor f(n) \rfloor\) в отдельной строке.

Примечание

В первом примере массив после первого обновления имеет вид \([4, 14, 0, 7, 6]\). Значения \(f\) следующие:

  • \(f(1)=2\);
  • \(f(2)=4\);
  • \(f(3)=2\);
  • \(f(4)=3\);
  • \(f(5)=3\).

Поскольку \(\lfloor f(5) \rfloor = 3\), ответом будет \(3\).

Массив после второго обновления имеет вид \([3, 14, 0, 7, 6]\). Значения \(f\), округленные до \(6\) знаков после запятой, таковы:

  • \(f(1)\approx 1.732051\);
  • \(f(2)\approx 3.966365\);
  • \(f(3)\approx 1.991573\);
  • \(f(4)\approx 2.998595\);
  • \(f(5)\approx 2.999766\).

Поскольку \(\lfloor f(5) \rfloor = 2\), ответом будет \(2\).

B. Непалиндромная подстрока

математика реализация Строки хэши *2000

Строка \(t\) считается \(k\)-хорошей, если существует хотя бы одна подстрока\(^\dagger\) длины \(k\), которая не является палиндромом\(^\ddagger\). Пусть \(f(t)\) обозначает сумму всех значений \(k\), при которых строка \(t\) является \(k\)-хорошей.

Вам дана строка \(s\) длины \(n\). Вы должны ответить на \(q\) следующих запросов:

  • Для данных \(l\) и \(r\) (\(l < r\)), найдите значение \(f(s_ls_{l + 1}\ldots s_r)\).

\(^\dagger\) Подстрока строки \(z\) — это последовательность подряд идущих символов строки \(z\). Например, «\(\mathtt{defor}\)», «\(\mathtt{code}\)» и «\(\mathtt{o}\)» являются подстроками «\(\mathtt{codeforces}\)», а «\(\mathtt{codes}\)» и «\(\mathtt{aaa}\)» не являются.

\(^\ddagger\) Палиндром — это строка, которая одинаково читается как слева направо, так и справа налево. Например, строки «\(\texttt{z}\)», «\(\texttt{aa}\)» и «\(\texttt{tacocat}\)» являются палиндромами, а «\(\texttt{codeforces}\)» и «\(\texttt{ab}\)» — нет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 2 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(2 \le n \le 2 \cdot 10^5, 1 \le q \le 2 \cdot 10^5\)) — длину строки и количество запросов соответственно.

Вторая строка каждого набора содержит строку \(s\). Гарантируется, что строка \(s\) содержит только строчные латинские буквы.

Следующие \(q\) строк содержат по два целых числа \(l\) и \(r\) (\(1 \le l < r \le n\)).

Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превосходят \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите \(f(s_ls_{l + 1}\ldots s_r)\).

Примечание

В первом запросе первого набора входных данных строка равняется \(\mathtt{aaab}\). Подстроки \(\mathtt{aaab}\), \(\mathtt{aab}\) и \(\mathtt{ab}\) не являются палиндромами и имеют длины \(4\), \(3\) и \(2\) соответственно. Таким образом, строка является \(2\)-хорошей, \(3\)-хорошей и \(4\)-хорошей. Следовательно, \(f(\mathtt{aaab}) = 2 + 3 + 4 = 9\).

Во втором запросе первого набора строка имеет вид \(\mathtt{aaa}\). В ней нет непалиндромных подстрок. Следовательно, \(f(\mathtt{aaa}) = 0\).

В первом запросе второго набора входных данных строка имеет вид \(\mathtt{abc}\). Подстроки \(\mathtt{ab}\), \(\mathtt{bc}\) и \(\mathtt{abc}\) не являются палиндромами и имеют длины \(2\), \(2\) и \(3\) соответственно. Таким образом, строка является \(2\)-хорошей и \(3\)-хорошей. Следовательно, \(f(\mathtt{abc}) = 2 + 3 = 5\). Заметим, что даже если существует \(2\) непалиндромных подстроки длины \(2\), мы считаем их только один раз.

G. Повар и каша

Бинарный поиск Конструктив реализация Структуры данных *2500

Наконец-то, обед!

\(n\) школьников выстроились в длинную очередь к палатке повара за кашей. Повар будет выдавать кашу в течение \(D\) минут. Школьник, который стоит на \(i\)-м месте в очереди, имеет приоритет \(k_i\) и съедает одну порцию каши за \(s_i\) минут.

В начале каждой минуты перерыва повар накладывает первому в очереди школьнику одну порцию каши, после этого школьник уходит есть свою порцию. Если \(i\)-му школьнику выдали порцию в начале \(x\)-й минуты, то он вернётся в очередь в конце \((x + s_i)\)-й минуты.

Когда \(i\)-й школьник возвращается в очередь, школьники в конце очереди, приоритет которых строго меньше, чем у \(i\)-го школьника, должны пропустить его. Таким образом, он встанет в очередь за последним из школьников, приоритет которого не меньше, чем его собственный. То есть за последним школьником \(j\), у которого \(k_j \ge k_i\). Если в очереди нет ни одного такого школьника, то \(i\)-й школьник встаёт в начало очереди.

Если несколько школьников возвращаются в одно время, то они вернутся в очередь в порядке возрастания их \(s_i\).

Например, если \(n = 3\), \(D = 3\), \(k = [2, 3, 2]\) и \(s = [2, 1, 3]\), то выдача будет происходить следующим образом:

  • В начале \(1\) минуты в очереди стоят школьники \([1, 2, 3]\), школьнику \(1\) выдают кашу;
  • в начале \(2\) минуты в очереди стоят школьники \([2, 3]\), школьнику \(2\) выдают кашу;
  • в начале \(3\) минуты в очереди стоят школьники \([3]\) школьнику \(3\) выдают кашу;
  • в конце \(3\) минуты в очередь возвращается школьник \(2\) и очередь становится \([2]\);
  • в конце \(3\) минуты в очередь возвращается школьник \(1\) и очередь становится \([2, 1]\), так как его приоритет ниже.

Определите, через какое минимальное количество минут после начала перерыва каждый школьник получит кашу хотя бы один раз или сообщите, что за \(D\) минут этого не произойдёт.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(D\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le D \le 3\cdot 10^5\)) — количество школьников в очереди и время перерыва соответственно.

Следующие \(n\) строк содержат по два целых числа \(k_i\) и \(s_i\) (\(1 \le k_i, s_i, \le 10^9\)) — приоритет и время поедания одной порции каши для очередного школьника. Школьники заданы в порядке, в котором они стоят в очереди (от начала к концу).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\). Аналогично гарантируется, что сумма значений \(D\) по всем наборам входных данных не превосходит \(3\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное количество минут, через которое каждый школьник получит кашу хотя бы один раз. Если этого не произойдёт за время перерыва, выведите \(-1\).

A. Медиана массива

жадные алгоритмы реализация сортировки *800

Вам дан массив \(a\) из \(n\) целых чисел.

Будем называть медианой массива \(q_1, q_2, \ldots, q_k\) число \(p_{\lceil \frac{k}{2} \rceil}\), где \(p\) — отсортированный по неубыванию массив \(q\). Например, медиана массива \([9, 5, 1, 2, 6]\) это \(5\), так как в отсортированном массиве \([1, 2, 5, 6, 9]\) число с индексом \(\lceil \frac{5}{2} \rceil = 3\) это \(5\), а медиана массива \([9, 2, 8, 3]\) это \(3\), так как в отсортированном массиве \([2, 3, 8, 9]\) число с индексом \(\lceil \frac{4}{2} \rceil = 2\) это \(3\).

За одно действие вам разрешается выбрать целое число \(i\) (\(1 \le i \le n\)) и увеличить \(a_i\) на \(1\).

Ваша задача найти минимальное количество действий, за которое можно увеличить медиану массива.

Обратите внимание, что в массиве \(a\) необязательно все числа различны.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \le n \le 10^5\)) — длина массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — сам массив \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите одно целое число — минимальное количество действий за которое можно увеличить медиану массива.

Примечание

В первом наборе входных данных можно применить одну операцию к первому числу и получить массив \([3, 2, 8]\), у этого массива медиана равна \(3\), так как это число с индексом \(\lceil \frac{3}{2} \rceil = 2\) в отсортированном по неубыванию массиве \([2, 3, 8]\). У изначального массива \([2, 2, 8]\) медиана равна \(2\), так как это число с индексом \(\lceil \frac{3}{2} \rceil = 2\) в отсортированном по неубыванию массиве \([2, 2, 8]\). Таким образом медиана увеличилась (\(3 > 2\)) всего за одно действие.

В четвертом наборе входных данных можно применить по одной операции к числам с индексами \(1, 2, 3\) и получить массив \([6, 6, 6, 4, 5]\), у этого массива медиана равна \(6\), так как это число с индексом \(\lceil \frac{5}{2} \rceil = 3\) в отсортированном по неубыванию массиве \([4, 5, 6, 6, 6]\). У изначального массива \([5, 5, 5, 4, 5]\) медиана равна \(5\), так как это число с индексом \(\lceil \frac{5}{2} \rceil = 2\) в отсортированном по неубыванию массиве \([4, 5, 5, 5, 5]\). Таким образом медиана увеличилась (\(6 > 5\)) за три действия. Можно показать, что это минимальное возможное количество действий.

В пятом наборе входных данных можно применить по одной операции к числам с индексами \(1, 3\) и получить массив \([3, 1, 3, 3, 1, 4]\), у этого массива медиана равна \(3\), так как это число с индексом \(\lceil \frac{6}{2} \rceil = 3\) в отсортированном по неубыванию массиве \([1, 1, 3, 3, 3, 4]\). У изначального массива \([2, 1, 2, 3, 1, 4]\) медиана равна \(2\), так как это число с индексом \(\lceil \frac{6}{2} \rceil = 3\) в отсортированном по неубыванию массиве \([1, 1, 2, 2, 3, 4]\). Таким образом медиана увеличилась (\(3 > 2\)) за два действия. Можно показать, что это минимальное возможное количество действий.

C. Разрезание дерева

Бинарный поиск Деревья дп жадные алгоритмы реализация *1600

Вам дано дерево из \(n\) вершин.

Ваша задача — найти такое максимальное число \(x\), что можно удалить из этого дерева ровно \(k\) ребер так, чтобы размер каждой оставшейся компоненты связности\(^{\dagger}\) был не менее \(x\).

\(^{\dagger}\) Две вершины \(v\) и \(u\) находятся в одной компоненте связности, если существует такая последовательность чисел \(t_1, t_2, \ldots, t_k\) произвольной длины \(k\), такая что \(t_1 = v\), \(t_k = u\), и для каждого \(i\) от \(1\) до \(k - 1\) вершины \(t_i\) и \(t_{i+1}\) соединены ребром.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k < n \le 10^5\)) — количество вершин в дереве и количество ребер, которое нужно удалить.

Каждая из следующих \(n - 1\) строк каждого набора входных данных содержит два целых числа \(v\) и \(u\) (\(1 \le v, u \le n\)) — очередное ребро дерева.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите такое максимальное число \(x\), что можно удалить ровно \(k\) ребер дерева так, чтобы размер каждой оставшейся компоненты связности был равен не менее \(x\).

Примечание

Дерево в первом наборе входных данных:

После удаления ребра \(1\) — \(3\) дерево будет выглядеть следующим образом:

Дерево распалось на две компоненты связности. Первая компонента состоит из двух вершин: \(1\) и \(2\). Вторая компонента связности состоит из трех вершин: \(3, 4\) и \(5\). В обоих компонентах связности не менее двух вершин. Можно показать, что ответ \(3\) не достижим, поэтому ответ \(2\).

D. Подарок на день рождения

битмаски жадные алгоритмы Конструктив Перебор реализация *1900

Совсем скоро у Ярика день рождения, и Марк решил подарить ему массив \(a\) длины \(n\).

Марк знает, что Ярик очень любит битовые операции, а также у него есть любимое число \(x\), поэтому Марк хочет найти такое максимальное число \(k\), что можно выбрать такие пары чисел [\(l_1, r_1\)], [\(l_2, r_2\)], \(\ldots\) [\(l_k, r_k\)], что:

  • \(l_1 = 1\).
  • \(r_k = n\).
  • \(l_i \le r_i\) для всех \(i\) от \(1\) до \(k\).
  • \(r_i + 1 = l_{i + 1}\) для всех \(i\) от \(1\) до \(k - 1\).
  • \((a_{l_1} \oplus a_{l_1 + 1} \oplus \ldots \oplus a_{r_1}) | (a_{l_2} \oplus a_{l_2 + 1} \oplus \ldots \oplus a_{r_2}) | \ldots | (a_{l_k} \oplus a_{l_k + 1} \oplus \ldots \oplus a_{r_k}) \le x\), где \(\oplus\) обозначает операцию побитового исключающего ИЛИ, а \(|\) обозначает операцию побитового ИЛИ.

Если такого \(k\) не существует, то нужно вывести \(-1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) (\(1 \le n \le 10^5, 0 \le x < 2^{30}\)) — длина массива \(a\) и число \(x\) соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i < 2^{30}\)) — сам массив \(a\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите одно целое число — максимальное подходящее число \(k\), и \(-1\), если такого \(k\) не существует.

Примечание

В первом наборе входных данных можно взять \(k\) равным \(2\) и выбрать два отрезка [\(1, 1\)] и [\(2, 3\)], \((1) | (2 \oplus 3) = 1\). Можно показать, что \(2\) — максимальный возможный ответ.

Во втором наборе входных данных подходят отрезки [\(1, 1\)] и [\(2, 2\)], \((1) | (1) = 1\). Больше отрезков сделать нельзя.

В третьем наборе входных данных нельзя выбрать \(2\) отрезка, так как \((1) | (3) = 3 > 2\), значит оптимальный ответ это \(1\).

B. Исправление массива

дп жадные алгоритмы Перебор реализация *1100

Вам задан массив целых чисел \(a\) размера \(n\).

Вы можете выполнять следующую операцию любое количество раз (возможно, ни разу): взять любой элемент массива \(a\), который больше или равен \(10\), удалить его и вставить вместо него цифры, из которых состоял этот элемент, на ту же позицию, в том же порядке, в котором они шли в этом элементе.

Например:

  • если мы применим эту операцию к \(3\)-му элементу массива \([12, 3, 45, 67]\), то массив станет равен \([12, 3, 4, 5, 67]\).
  • если мы применим эту операцию ко \(2\)-му элементу массива \([2, 10]\), то массив станет равен \([2, 1, 0]\).

Ваша задача — определить, возможно ли сделать массив \(a\) отсортированным в неубывающем порядке, используя вышеописанную операцию любое количество раз (возможно, ни разу). Другими словами, вам нужно определить, возможно ли преобразовать массив \(a\) таким образом, чтобы выполнялось \(a_1 \le a_2 \le \dots \le a_k\), где \(k\) — текущая длина массива \(a\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк:

  • первая строка содержит одно целое число \(n\) (\(2 \le n \le 50\)).
  • вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 99\)).
Выходные данные

Для каждого набора входных данных выведите YES, если возможно сделать \(a\) отсортированным в неубывающем порядке, используя вышеописанную операцию; в противном случае выведите NO.

Вы можете печатать каждую букву в любом регистре. Например, yes, Yes, YeS будут распознаны как положительный ответ.

Примечание

В первом примере вы можете разделить первый элемент, тогда массив станет равен \([1, 2, 3, 45, 67]\).

Во втором примере нет способа получить отсортированный массив.

В третьем примере массив уже отсортирован.

E. Разделение на клики

графы жадные алгоритмы Конструктив Перебор реализация *2100

Даны два целых числа, \(n\) и \(k\). Рассмотрим граф на \(n\) вершинах, пронумерованных от \(1\) до \(n\), в котором изначально нет ребер.

Вам нужно назначить каждой вершине число; пусть \(a_i\) — число, назначенное вершине \(i\). Все \(a_i\) должны быть различными целыми числами от \(1\) до \(n\).

После того как вы назначили числа для вершин, вы добавляете в граф ребра. Для пары вершин \((i, j)\) добавляется ребро между ними, если \(|i - j| + |a_i - a_j| \le k\).

Ваша цель — создать граф, который можно разбить на минимально возможное (для заданных значений \(n\) и \(k\)) количество клик. Каждая вершина графа должна принадлежать ровно одной клике. Напомним, что клика — это такое множество вершин, что каждая пара вершин в этом множестве соединена ребром.

Поскольку BledDest не особо подтянул свои навыки программирования, он не может решить задачу «дан граф, разбейте его на минимальное количество клик». Поэтому мы также просим вас вывести само разбиение.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1600\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей два целых числа \(n\) и \(k\) (\(2 \le n \le 40\); \(1 \le k \le 2n\)).

Выходные данные

Для каждого набора входных данных выведите три строки:

  • первая строка должна содержать \(n\) различных целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)) — значения, которые вы назначаете вершинам;
  • вторая строка должна содержать одно целое число \(q\) (\(1 \le q \le n\)) — количество клик, на которые вы разбиваете граф;
  • третья строка должна содержать \(n\) целых чисел \(c_1, c_2, \dots, c_n\) (\(1 \le c_i \le q\)) — разбиение графа на клики. Где две вершины \(u\) и \(v\) в одной клике, если \(c_u = c_v\).

Если существует несколько ответов, выведите любой из них.

J. Amanda the Amoeba

графы Деревья реализация *2600

This problem has an attachment. You can use it to simulate and visualize the movements of the amoeba.

Amoeba Amanda lives inside a rectangular grid of square pixels. Her body occupies some of these pixels. Other pixels may be either free or blocked. Amanda moves across the grid using the so-called amoeboid movement. In each step of such a movement, her body first shrinks by one pixel (one pixel of the body is removed and becomes free), and then grows at a different place (one previously-free pixel is added to the body).

To prevent structural damage, Amanda's body always occupies a connected region of pixels, which means that any pair of pixels forming the body can be connected by a sequence of adjacent pixels without ever leaving the body. Two pixels are considered adjacent if they share a common side (each pixel has at most 4 neighbours). The body remains connected even during the movement, including the moment after removing a pixel and before adding another one.

Your task is to help Amanda find her way around. Given her initial position and desired final position, suggest a sequence of valid moves leading from the former to the latter.

Illustration of sample \(1\): The filled shape is the initial position, the dotted region is the final position.
Input

The first line contains two integers \(r\) and \(c\) (\(1\le r,c \le 50\)) — the size of the rectangular grid in pixels.

The next \(r\) lines contain \(c\) characters each, describing the initial position of Amanda. Each of those characters is either a dot \(\texttt{.}\) denoting a free pixel, an asterisk \(\texttt{*}\) denoting Amanda's body, or an \(\texttt{X}\) denoting a blocked pixel which may never be occupied.

The next line is empty.

The next \(r\) lines describe the desired final position in the same format as the initial position.

It is guaranteed that:

  • The number of pixels forming Amanda's body is the same in both positions, and it is at least 2.
  • The body of Amanda is connected in the initial position.
  • The body of Amanda is connected in the final position.
  • The blocked pixels do not change between the descriptions of the initial and final position, their placement is exactly the same in both positions.
Output

Print \(\texttt{YES}\) if it is possible for Amanda to go from the initial position to the final one. Otherwise, print \(\texttt{NO}\).

If it is possible, on the next line print one integer \(m\) (\(0\le m\le 10\,000\)) — the number of moves to execute.

The following \(m\) lines must contain four integer coordinates each: \(i_1\), \(j_1\), \(i_2\), \(j_2\) (\(1\le i_1,i_2\le r\), \(1\le j_1,j_2\le c\)). These four coordinates specify one move, meaning that the pixel at \(i_1\)-th row and \(j_1\)-th column is first removed from the body. Then, \((i_2,j_2)\) must designate a different location where one pixel is added.

The sequence should consist only of valid moves and after the last move, Amanda's body should occupy the desired final position.

If there are multiple solutions, print any of them.

Under the assumptions of this problem, it can be proven that if it is possible for Amanda to go from the initial position to the desired final one, then it is possible to do it with at most \(10\,000\) moves.

Note

In the first sample, Amanda executes 5 moves to reach the final position, as shown in the figure below.

B. После тренировки

математика реализация Структуры данных *1300

После тренировки одной из команд на чемпионате Европы по футболу Валерику поручили собрать мячи и разложить по корзинам. Всего на стадионе имеется n мячей и m корзин. Корзины расположены в ряд слева направо и пронумерованы, соответственно, числами от 1 до m. Мячи пронумерованы числами от 1 до n.

Валерик решил раскладывать мячи в порядке увеличения их номеров по следующей схеме. Каждый новый мяч он будет класть в ту корзину, где меньше всего мячей. При этом если у него есть несколько вариантов, то Валерик выбирает корзину, которая ближе всего к середине. Это означает, что он выбирает ту корзину, для которой минимально, где i — номер корзины. Если при этом также есть несколько вариантов, тогда он выбирает корзину с минимальным номером.

Выведите для каждого мяча номер корзины, в которую он отправится в соответствии со схемой Валерика.

Обратите внимание, что мячи раскладываются по корзинам в порядке увеличения номеров мячей, то есть сначала первый мяч, потом второй мяч и так далее.

Входные данные

В первой строке через пробел записаны два целых числа n, m (1 ≤ n, m ≤ 105) — количество мячей и корзин, соответственно.

Выходные данные

Выведите n чисел, по одному на каждой строке. В i-ой строке должен содержаться номер корзины, в которую попадет i-ый мяч.

C. Попробуй поймай

Разбор выражений реализация *1800

Вася разрабатывает свой язык программирования VPL (Vasya Programming Language). Сейчас он занят созданием системы исключений. В его представлении система исключений должна функционировать следующим образом.

Для обработки исключений используются try-catch-блоки. Работа с блоками осуществляется при помощи двух операторов:

  1. Оператор try. Открывает новый try-catch-блок.
  2. Оператор catch(<тип_исключения>, <сообщение>). Закрывает еще не закрытый try-catch-блок, который был начат последним. Данный блок может быть активирован только исключением типа <тип_исключения>. При активации этого блока, на экран выводится <сообщение>. Если в данный момент не открыто ни одного try-catch-блока, то оператор catch использовать нельзя.

Исключения могут возникать в программе только в одном случае: при использовании оператора throw. Оператор throw(<тип_исключения>) создает исключение указанного типа.

Пусть в результате вызова какого-то оператора throw в программе возникло исключение типа a. В этом случае активируется try-catch-блок такой, что оператор try этого блока описан в программе раньше, чем вызванный оператор throw, при этом оператору catch этого блока в качестве параметра передан тип исключения a, и оператор catch этого блока описан позже, чем вызванный оператор throw. Если таких try-catch-блоков несколько, активируется тот блок, описание оператора catch которого встречается раньше всех. Если ни один try-catch-блок не был активирован, то на экран выводится сообщение «Unhandled Exception».

Для тестирования системы, Вася составил программу, в которой содержатся только операторы try, catch и throw, в одной строке находится не более одного оператора, во всей программе присутствует ровно один оператор throw.

Ваша задача в том, чтобы по программе на VPL определить, какое сообщение будет выведено на экран.

Входные данные

В первой строке записано одно целое число: n (1 ≤ n ≤ 105) — количество строк в программе. В следующих n строках записана программа на языке VPL. В каждой строке содержится не более одного оператора. Это означает, что во входных данных могут встречаться пустые строки или строки, состоящие только из пробелов.

В программе присутствуют только операторы try, catch и throw. Гарантируется, что программа корректна. Это означает, что каждый начатый try-catch-блок был закрыт, операторы catch не используются, если нет открытого try-catch-блока. В программе присутствует ровно один оператор throw. В программе могут присутствовать пробелы в начале строки, в конце строки, перед и после скобок, запятых и кавычек.

Тип исключения — это непустая строка, состоящая только из прописных и строчных букв латинского алфавита. Длина типа исключения не превосходит 20 символов. Сообщение — это непустая строка, состоящая только из прописных и строчных букв латинского алфавита, цифр и пробелов, заключенная в кавычки. Кавычки выводить не надо. Длина сообщения не превосходит 20 символов. Длина любой строки входного файла не превосходит 50 символов.

Выходные данные

Выведите сообщение, которое будет написано на экране после выполнения заданной программы.

Примечание

В первом примере существует 2 try-catch блока, для которых оператор try описан раньше оператора throw, а оператор catch описан позже оператора throw: try-catch(BE,"BE in line 3") и try-catch(AE,"AE somewhere"). Тип исключения AE, а значит будет активирован второй блок, так как в операторе catch(AE,"AE somewhere") указан тип исключения AE, а в операторе catch(BE,"BE in line 3") указан тип BE.

Во втором примере существует 2 try-catch блока, для которых оператор try описан раньше оператора throw, а оператор catch описан позже оператора throw: try-catch(AE,"AE in line 3") и try-catch(AE,"AE somewhere"). В данном случае оба блока могут быть активированы исключением типа AE, но будет активирован только блок try-catch(AE,"AE in line 3"), так как оператор catch(AE,"AE in line 3") описан раньше, чем catch(AE,"AE somewhere").

В третьем примере не существует блоков, способных обработать исключение типа CE.

A. Лестница, Пик или Ничего?

реализация *800

Вам даны три цифры \(a\), \(b\) и \(c\). Определите, образуют ли они лестницу, пик или ни то, ни другое.

  • Лестница удовлетворяет условию \(a<b<c\).
  • Пик удовлетворяет условию \(a<b>c\).
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Единственная строка каждого набора содержит три цифры \(a\), \(b\), \(c\) (\(0 \leq a\), \(b\), \(c \leq 9\)).

Выходные данные

Для каждого набора входных данных выведите «STAIR» если цифры образуют лестницу, «PEAK» если цифры образуют пик, и «NONE» в противном случае (выводите строки без кавычек).

B. Масштабирование

реализация *800

Дано целое число \(n\). Выведите шахматную доску размером \(2n \times 2n\), состоящую из \(2 \times 2\) клеток, чередующихся между '\(\texttt{#}\)' и '\(\texttt{.}\)', с верхним левым углом, содержащим '\(\texttt{#}\)'.

На рисунке выше показаны ответы для \(n=1,2,3,4\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 20\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 20\)) — это означает, что вам нужно вывести шахматную доску размером \(2n\).

Выходные данные

Для каждого набора входных данных выведите \(2n\) строк, каждая содержащая \(2n\) символов без пробелов — шахматную доску, как описано в условии. Не выводите пустые строки между наборами входных данных.

C. Преобразование времени

математика реализация *800

Дано время в формате 24 часа, определите эквивалентное время в формате 12 часов.

  • Формат 24 часа делит сутки на 24 часа от \(00\) до \(23\), каждый из которых имеет 60 минут от \(00\) до \(59\).
  • Формат 12 часов делит сутки на две половины: первая половина — \(\mathrm{AM}\), а вторая — \(\mathrm{PM}\). В каждой половине часы нумеруются в порядке \(12, 01, 02, 03, \dots, 11\). Каждый час имеет 60 минут, нумеруемых от \(00\) до \(59\).
Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1440\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит строку \(s\) длиной \(5\) с форматом hh:mm, представляющую допустимое время в формате 24 часа. hh представляет час от \(00\) до \(23\), а mm представляет минуту от \(00\) до \(59\).

Ввод всегда будет допустимым временем в формате 24 часа.

Выходные данные

Для каждого набора входных данных выведите две строки, разделенные пробелом («hh:mm AM» или «hh:mm PM»), которые являются эквивалентом времени в формате 12 часов для предоставленного времени в наборе входных данных (без кавычек).

Вы должны вывести время точно так, как указано; в частности, вы не должны удалять ведущие нули.

D. Произведение двоичных десятичных чисел

дп Перебор реализация теория чисел *1100

Давайте назовем число двоичным десятичным, если это положительное целое число, и все цифры в его десятичной записи равны \(0\) или \(1\). Например, \(1\,010\,111\) является двоичным десятичным числом, в то время как \(10\,201\) и \(787\,788\) не являются таковыми.

Дано число \(n\), вам нужно определить, возможно ли представить \(n\) в виде произведения некоторых (не обязательно различных) двоичных десятичных чисел.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5 \cdot 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если \(n\) можно представить в виде произведения двоичных десятичных чисел, и «NO» (без кавычек) в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yES», «yes» и «Yes» будут распознаны как положительный ответ).

Примечание

Первые пять примеров можно представить в виде произведения двоичных десятичных чисел следующим образом:

  • \(121 = 11 \times 11\).
  • \(1 = 1\) уже является двоичным десятичным числом.
  • \(14\,641 = 11 \times 11 \times 11 \times 11\).
  • \(12\,221 = 11 \times 11 \times 101\).
  • \(10\,110 = 10\,110\) уже является двоичным десятичным числом.

E. Почти самая короткая повторяющаяся подстрока

Перебор реализация Строки теория чисел *1500

Вам дана строка \(s\) длиной \(n\), состоящая из строчных латинских символов. Найдите длину самой короткой строки \(k\), такой что несколько (возможно одна) копий \(k\) могут быть сконкатенированы вместе, чтобы образовать строку той же длины, что и \(s\), и при этом имеется не более одного отличающегося символа.

Формально, найдите длину самой короткой строки \(k\), такой что \(c = \underbrace{k + \cdots + k}_{x\rm\ \text{раз}}\) для некоторого положительного целого \(x\), строки \(s\) и \(c\) имеют одинаковую длину и \(c_i \neq s_i\) для не более чем одного \(i\) (т.е. существует \(0\) или \(1\) такая позиция).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество тестов.

Первая строка каждого теста содержит одно целое число \(n\) (\(1 \leq n \leq 2\cdot10^5\)) — длина строки \(s\).

Вторая строка каждого теста содержит строку \(s\), состоящую из строчных латинских символов.

Сумма \(n\) по всем тестам не превышает \(2\cdot10^5\).

Выходные данные

Для каждого теста выведите длину самой короткой строки \(k\), удовлетворяющей условиям в условии.

Примечание

В первом примере вы можете выбрать \(k = \texttt{a}\) и \(k+k+k+k = \texttt{aaaa}\), которая отличается от \(s\) только во второй позиции.

Во втором примере вы не можете выбрать \(k\) длиной один или два. Мы можем взять \(k = \texttt{abba}\), которая равна \(s\).

F. 0, 1, 2, Tree!

битмаски Деревья жадные алгоритмы Перебор реализация *1700

Найдите минимальную высоту корневого дерева\(^{\dagger}\) с \(a+b+c\) вершинами, которое удовлетворяет следующим условиям:

  • \(a\) вершин имеют ровно \(2\) потомка,
  • \(b\) вершин имеют ровно \(1\) потомка, и
  • \(c\) вершин имеют ровно \(0\) потомков (не имеют потомков).
Если такого дерева не существует, вы должны сообщить об этом.

Дерево выше с корнем в верхней вершине, и каждая вершина помечена числом потомков. Здесь \(a=2\), \(b=1\), \(c=3\), и высота равна \(2\).

\(^{\dagger}\) Корневое дерево — это связный граф без циклов, с особой вершиной, называемой корнем. В корневом дереве, среди любых двух вершин, соединенных ребром, одна вершина является родителем (ближе к корню), а другая — потомком.

Расстояние между двумя вершинами в дереве — количество ребер в кратчайшем пути между ними. Высота корневого дерева — это максимальное расстояние от вершины до корня.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит три целых числа \(a\), \(b\), и \(c\) (\(0 \leq a, b, c \leq 10^5\); \(1 \leq a + b + c\)).

Сумма \(a + b + c\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если такое дерево не существует, выведите \(-1\). В противном случае выведите одно целое число — минимальную высоту дерева, удовлетворяющего описанным условиям.

Примечание

Первый набор входных данных изображен в условии. Можно доказать, что высота не может быть меньше \(2\).

Во втором наборе входных данных, можно сформировать дерево с одной вершиной и без ребер. Оно имеет высоту \(0\), что является оптимальным.

В третьем наборе входных данных, можно сформировать дерево с двумя вершинами, соединенными одним ребром. Оно имеет высоту \(1\), что является оптимальным.

G. Перемешивание песен

битмаски графы дп поиск в глубину и подобное реализация Строки хэши *1900

У Владислава есть плейлист, состоящий из \(n\) песен, пронумерованных от \(1\) до \(n\). Песня \(i\) имеет жанр \(g_i\) и автора \(w_i\). Он хочет составить плейлист таким образом, чтобы каждая пара соседних песен либо имела одного и того же автора, либо была из того же жанра (или и то, и другое). Он называет такой плейлист захватывающим. И \(g_i\), и \(w_i\) являются строками, длины не более \(10^4\).

Не всегда возможно составить захватывающий плейлист, используя все песни, поэтому процесс перемешивания происходит в два этапа. Сначала удаляются некоторое количество (возможно, нулевое) песен, а затем оставшиеся песни в плейлисте переставляются, чтобы сделать его захватывающим.

Поскольку Владислав не любит, когда песни удаляются из его плейлиста, он хочет, чтобы составление плейлиста выполнялось с минимальным количеством удалений. Помогите ему найти минимальное количество удалений, которые необходимо выполнить, чтобы можно было переставить оставшиеся песни, чтобы сделать плейлист захватывающим.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество тестов. Затем следует описание тестов.

Первая строка каждого теста содержит одно целое число \(n\) (\(1 \le n \le 16\)) — количество песен в исходном плейлисте.

Затем следуют \(n\) строк, \(i\)-я из которых содержит две строки строчных букв \(g_i\) и \(w_i\) (\(1 \leq |g_i|, |w_i| \leq 10^4\)) — жанр и автор \(i\)-й песни. Где \(|g_i|\) и \(|w_i|\) — длины строк.

Сумма \(2^n\) по всем тестам не превышает \(2^{16}\).

Сумма \(|g_i| + |w_i|\) по всем наборам входных данных не превышает \(4 \cdot 10^5\).

Выходные данные

Для каждого теста выведите одно целое число — минимальное количество удалений, необходимых для того, чтобы получившийся плейлист можно было сделать захватывающим.

Примечание

В первом тесте плейлист уже захватывающий.

Во втором тесте, если у вас есть песни в порядке \(4, 3, 1, 2\), это захватывающий плейлист, поэтому вам не нужно удалять никакие песни.

В третьем тесте вы можете удалить песни \(4, 5, 6, 7\). Тогда плейлист с песнями в порядке \(1, 2, 3\) будет захватывающим.

E. Без палиндромов

жадные алгоритмы Конструктив математика Перебор разделяй и властвуй реализация Строки хэши *2000

Вам дана строка \(s\), состоящая из строчных латинских букв. Вам нужно разбить\(^\dagger\) эту строку на некоторое количество подстрок так, чтобы каждая подстрока не была палиндромом\(^\ddagger\).

\(^\dagger\) Разбиение строки \(s\) — это упорядоченная последовательность некоторых \(k\) строк \(t_1, t_2, \ldots, t_k\), таких, что \(t_1 + t_2 + \ldots + t_k = s\), где \(+\) обозначает операцию конкатенации.

\(^\ddagger\) Строка \(s\) называется палиндромом, если она читается одинаково как слева направо, так и справа налево. Например, \(\mathtt{racecar}\), \(\mathtt{abccba}\) и \(\mathtt{a}\) являются палиндромами, а \(\mathtt{ab}\), \(\mathtt{dokibird}\) и \(\mathtt{kurosanji}\) — нет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Каждый набор входных данных содержит строку \(s\), состоящую из строчных латинских букв (\(1 \le |s| \le 10^6\)).

Гарантируется, что сумма \(|s|\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке «YES», если существует разбиение \(s\), части которого не являются палиндромами, или «NO», если такого разбиения не существует.

Если ответ «YES», то во второй строке выведите целое число \(k\) — количество частей, на которое нужно разбить \(s\), чтобы каждая часть не была палиндромом. В третьей строке выведите \(k\) строк \(t_1, t_2, \ldots, t_k\), представляющих такое разбиение. Если таких разбиений несколько, выведите любое из них.

Примечание

В первом наборе входных данных, поскольку \(\mathtt{sinktheyacht}\) уже не является палиндромом, разбиение \([\mathtt{sinktheyacht}]\) является допустимым.

Во втором наборе входных данных, поскольку любая подстрока строки \(s\) является палиндромом, не существует допустимых разбиений.

В третьем наборе входных данных еще одно допустимое разбиение — \([\mathtt{uw},\mathtt{uo}, \mathtt{wou}, \mathtt{wu}]\).

D. Вы прокрастинатор?

*особая задача реализация

!

Входные данные

!

Выходные данные

!

Система оценки

!

Примечание

!

H. Палиндром

*особая задача реализация Строки

Палиндром — это строка, которая читается одинаково в обоих направлениях, например z, uwu или moom.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Каждая из следующих \(t\) строк содержит строку длиной не более \(100\) символов, состоящую из строчных латинских букв.

Выходные данные

Для каждого набора входных данных выведите «YES» или «NO» в качестве ответа.

J. Помогите, что значит быть «Based»

*особая задача Конструктив Перебор Разбор выражений реализация сортировки

Входные данные

Чё, давай сюда одно целое число \(x\) (\(1 \le x \le 4\)), братишка uwu :3

Выходные данные

Если \(x = 1\), выдай код, который, типа, когда подаёшь ему два целых числа \(a\) и \(b\), он возвращает их сумму.

Если \(x = 2\), напиши код, который принимает целое число \(a\) и возвращает его абсолютное значение, как будто волшебство, без всяких приколов.

Если \(x = 3\), чекай это: сочини код, который берёт целое число \(n\) (\(1 \le n \le 50\)) и массив \(a\) из \(n\) различных целых чисел, а потом возвращает максимальное значение, вжух!

Если \(x = 4\), бросай код, который берёт целое число \(n\) (\(1 \le n \le 50\)), массив \(a\) из \(n\) различных целых чисел и целое число \(k\) (\(1 \le k \le n\)), а потом выдаёт \(k\)-тое по величине значение в массиве. Врубился, братишка?!

Примечание

Загляни на страницу «Мои посылки» и оцени свой код, кликнув на его ID. Ты увидишь, насколько based или cringe он.

B. Сделай его некрасивым

математика реализация *1200

Назовём массив \(a\) красивым, если его можно превратить в массив из одинаковых чисел следующими операциями:

  • выбрать позицию \(i\) (\(2 \le i \le |a| - 1\)) такую, что \(a_{i - 1} = a_{i + 1}\), и заменить \(a_i\) на \(a_{i - 1}\).

Задан красивый массив \(a_1, a_2, \dots, a_n\). Какое минимальное количество элементов надо из него удалить, чтобы он перестал быть красивым? Переставлять элементы местами запрещается. Если это сделать невозможно, то выведите -1.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)).

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)).

Дополнительные ограничения на входные данные:

  • в каждом наборе входных данных массив \(a\) — красивый;
  • сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).
Выходные данные

На каждый набор входных данных выведите одно целое число — минимальное количество элементов, которое надо удалить из массива \(a\), чтобы он стал некрасивым. Если это сделать невозможно, то выведите -1.

Примечание

В первом наборе входных данных массив невозможно сделать так, чтобы массив перестал быть красивым. Массив, состоящий из одинаковых чисел, будет оставаться красивым, сколько бы чисел мы из него не удалили.

Во втором наборе входных данных можно удалить число на позиции \(5\), например.

Полученный массив будет \([1, 2, 1, 2]\). Проверим, красивый ли он. Доступны две операции:

  • Выбрать \(i = 2\): получится массив \([1, 1, 1, 2]\). К нему больше не применишь операций, а числа не все одинаковые.
  • Выбрать \(i = 3\): получится массив \([1, 2, 2, 2]\). К нему тоже больше не применишь операций, и числа все еще не все одинаковые.

Получается, что массив \([1, 2, 1, 2]\) не является красивым.

В четвертом наборе входных данных можно удалить первые три элемента, например. Полученный массив \([5, 3, 3, 3]\) не является красивым.

E. Цепная реакция

Бинарный поиск жадные алгоритмы математика реализация снм Структуры данных теория чисел *2200

В ряд стоят \(n\) монстров, у \(i\)-го монстра \(a_i\) очков здоровья.

В каждую секунду вы можете выбрать одного живого монстра и запустить в него цепную молнию. Молния наносит ему \(k\) урона, а также распространяется налево (в сторону уменьшения \(i\)) и направо (в сторону увеличения \(i\)) по живым монстрам, нанося каждому по \(k\) урона. Когда молния доходит до мертвого монстра или до начала/конца ряда, она останавливается. Монстр считается живым, если количество его очков здоровья строго больше \(0\).

Например, рассмотрим следующий сценарий: три монстра с уровнями здоровья \([5, 2, 7]\), \(k = 3\). Можно убить всех монстров за \(4\) секунды:

  • запустить цепную молнию в \(3\)-го монстра, тогда уровни здоровья будут равны \([2, -1, 4]\);
  • запустить цепную молнию в \(1\)-го монстра, тогда уровни здоровья будут равны \([-1, -1, 4]\);
  • запустить цепную молнию в \(3\)-го монстра, тогда уровни здоровья будут равны \([-1, -1, 1]\);
  • запустить цепную молнию в \(3\)-го монстра, тогда уровни здоровья будут равны \([-1, -1, -2]\).

Для каждого \(k\) от \(1\) до \(\max(a_1, a_2, \dots, a_n)\) посчитайте минимальное количество секунд, за которое можно убить всех монстров.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 10^5\)) — количество монстров.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^5\)) — количество очков здоровья у \(i\)-го монстра.

Выходные данные

Для каждого \(k\) от \(1\) до \(\max(a_1, a_2, \dots, a_n)\) выведите минимальное количество секунд, за которое можно убить всех монстров.

B. Прогрессивный квадрат

Конструктив реализация сортировки Структуры данных *1000

Прогрессивный квадрат размера \(n\) — это матрица размера \(n \times n\). Максим выбирает три натуральных числа \(a_{1,1}\), \(c\) и \(d\) и строит прогрессивный квадрат по следующим правилам:

\(\)a_{i+1,j} = a_{i,j} + c\(\)

\(\)a_{i,j+1} = a_{i,j} + d\(\)

Например, если \(n = 3\), \(a_{1,1} = 1\), \(c=2\) и \(d=3\), то прогрессивный квадрат выглядит следующим образом:

\(\) \begin{pmatrix} 1 & 4 & 7 \\ 3 & 6 & 9 \\ 5 & 8 & 11 \end{pmatrix} \(\)

В прошлом месяце Максим построил прогрессивный квадрат и запомнил значения \(n\), \(c\) и \(d\). Недавно он нашёл массив \(b\) из \(n^2\) целых чисел, идущих в случайном порядке и хочет убедиться, что эти элементы являются элементами того самого квадрата.

Можно показать, что при любых значениях \(n\), \(a_{1,1}\), \(c\) и \(d\) существует ровно один прогрессивный квадрат, удовлетворяющий всем правилам.

Входные данные

В первой строке задано целое число \(t\) (\(1 \le t \le {10} ^ 4\)) — количество наборов входных данных.

Первая строка каждого набора содержит три целых числа \(n\), \(c\) и \(d\) (\(2 \le n \le 500\), \(1 \le c, d \le 10^6\)) — размер квадрата и значения \(c\) и \(d\), описанные в условии.

Вторая строка каждого набора содержит \(n \cdot n\) целых чисел \(b_1, b_2, \dots, b_{n \cdot n}\) (\(1 \le b_i \le 10^9\)) — элементы, которые нашёл Максим.

Гарантируется, что сумма \(n ^ 2\) по всем наборам входных данных не превосходит \(25 \cdot {10} ^ 4\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите «YES», если прогрессивный квадрат для данных \(n\), \(c\) и \(d\) может быть составлен из элементов массива \(a\), в противном случае выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

C. Обитатель морских глубин

жадные алгоритмы математика реализация *1300

На исследование глубин океана отправились \(n\) кораблей, корабли пронумерованы от \(1\) до \(n\) и следуют друг за другом в порядке возрастания номеров, \(i\)-й корабль имеет прочность \(a_i\).

На корабли напал Кракен, он атакует корабли \(k\) раз в определённом порядке. Сначала он атакует первый из кораблей, потом последний, потом снова первый и так далее.

Каждая атака Кракена снижает прочность корабля на \(1\). Когда прочность корабля опускается до \(0\), он тонет и больше не подвергается атакам (таким образом корабль перестаёт быть первым или последним, а Кракен атакует только те корабли, которые ещё не утонули). Если все корабли оказались потоплены, Кракену нечего атаковать, и он уплывает.

Например, если \(n=4\), \(k=5\) и \(a=[1, 2, 4, 3]\), то произойдёт следующее:

  1. Кракен атакует первый корабль, его прочность стала нулевой и теперь \(a = [2, 4, 3]\);
  2. Кракен атакует последний корабль, теперь \(a = [2, 4, 2]\);
  3. Кракен атакует первый корабль, теперь \(a = [1, 4, 2]\);
  4. Кракен атакует последний корабль, теперь \(a = [1, 4, 1]\);
  5. Кракен атакует первый корабль, его прочность стала нулевой и теперь \(a = [4, 1]\).

Сколько кораблей оказались потоплены после нападения Кракена?

Входные данные

В первой строке задано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le k \le 10^{15}\)) — количество кораблей, а так же сколько раз Кракен будет атаковать корабли.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — прочности кораблей.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных в отдельной строке выведите количество потопленных Кракеном кораблей.

E. Длинное инвертирование

жадные алгоритмы Перебор реализация сортировки *1700

Дана бинарная строка \(s\) из \(n\) символов. Бинарной строкой называется строка, состоящая только из символов '1' и '0'.

Вы можете выбрать целое число \(k\) (\(1 \le k \le n\)), после чего применить любое число раз следующую операцию: выбрать \(k\) подряд идущих символов строки и инвертировать их, то есть заменить все '0' на '1' и наоборот.

С помощью операций нужно сделать все символы в строке равными '1'.

Например, если \(n=5\), \(s=00100\), то можно выбрать \(k=3\) и действовать следующим образом:

  • выбрать отрезок от \(1\)-го до \(3\)-го символа и получить \(s=\color{blue}{110}00\);
  • выбрать отрезок от \(3\)-го до \(5\)-го символа и получить \(s=11\color{blue}{111}\);

Найдите максимальное значение \(k\), при котором можно с помощью операций сделать все символы строки равными '1'. Обратите внимание, что количество операций, которые для этого нужно совершить, не имеет значения.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 5000\)) — длину строки \(s\).

Вторая строка каждого набора содержит строку \(s\) длины \(n\), состоящую из символов '1' и '0'.

Гарантируется, что сумма значений \(n^2\) по всем наборам входных данных в тесте не превосходит \(25 \cdot 10^6\).

Выходные данные

Для каждого набора входных данных выведите максимальное целое число \(k\) (\(1 \le k \le n\)), при котором возможно с помощью описанных операций получить строку \(s\), состоящую только из символов '1'.

G. НОД на клетчатом поле

дп математика Перебор поиск в глубину и подобное реализация теория чисел *1900

Совсем недавно Егор узнал про алгоритм Евклида нахождения наибольшего общего делителя двух чисел. Наибольшим общим делителем двух чисел \(a\) и \(b\) называется наибольшее число, на которое \(a\) и \(b\) делятся без остатка. С помощью этих знаний Егор может решить задачу, которую он когда-то не решил.

У Василия есть клетчатое поле \(n\) строк на \(m\) столбцов, на пересечении \(i\)-й строки и \(j\)-го столбца находится число \({a_i}_j\). Егор хочет попасть из левого верхнего угла (на пересечении первой строки и первого столбца) в правый нижний угол (на пересечении последней строки и последнего столбца) и узнать, какой НОД у всех чисел на пути. Разрешается двигаться только вниз и вправо. Егор выписал несколько путей и получил разные значения НОД, ему стало интересно, какой максимальный НОД можно получить.

К сожалению, Егор устал считать НОД чисел и поэтому просит Вас помочь ему найти максимальный НОД чисел на пути из левого верхнего угла в правый нижний угол клетчатого поля.

Входные данные

В первой строке задано целое число \(t\) (\(1 \le t \le {10}^{4}\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 100\)) — количество строк и столбцов клетчатого поля.

Далее следует \(n\) строк, \(i\)-я строка содержит \(m\) целых чисел \((1 \le a_{i,j} \le {10}^{6}\)) — числа, записанные в \(i\)-й строке и \(j\)-м столбце клетчатого поля.

Гарантируется, что сумма \(n \cdot m\) не превосходит \(2 \cdot {10}^{5}\) по всем тестовым случаям.

Выходные данные

Для каждого набора входных данных в отдельной строке выведите максимальное возможный НОД на пути из клетки левой верхней клетки в правую нижнюю клетку.

D. Нина и MEX

битмаски дп жадные алгоритмы Конструктив математика Перебор разделяй и властвуй реализация *2000

Нина дала вам массив целых чисел \(a_1, a_2, \ldots, a_n\) длины \(n\).

Вы можете выполнить следующую операцию не более \(5\cdot 10^5\) раз (возможно, ноль):

  • Выбрать два целых числа \(l\) и \(r\) таких, что \(1 \le l \le r \le n\), вычислить \(x\) как \(\operatorname{MEX}(\{a_l, a_{l+1}, \ldots, a_r\})\), и одновременно присвоить \(a_l:=x, a_{l+1}:=x, \ldots, a_r:=x\).

Здесь \(\operatorname{MEX}\) множества целых чисел \(\{c_1, c_2, \ldots, c_k\}\) определяется как наименьшее неотрицательное целое число \(m\), которое не встречается в множестве \(c\).

Ваша цель — максимизировать сумму элементов массива \(a\). Найдите максимальную сумму и постройте последовательность операций, которая достигает этой суммы. Обратите внимание, что вам не нужно минимизировать количество операций в этой последовательности, вам лишь нужно использовать не более \(5\cdot 10^5\) операций в вашем решении.

Входные данные

В первой строке дано одно целое число \(n\) (\(1 \le n \le 18\)) — длина массива \(a\).

Во второй строке даны \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(0\leq a_i \leq 10^7\)) — массив \(a\).

Выходные данные

В первой строке выведите два целых числа \(s\) и \(m\) (\(0\le m\le 5\cdot 10^5\)) — максимальную сумму элементов массива \(a\) и количество операций в вашем решении.

В \(i\)-й из следующих \(m\) строк выведите два целых числа \(l\) и \(r\) (\(1 \le l \le r \le n\)), представляющие параметры \(i\)-й операции.

Можно показать, что максимальная сумма элементов массива \(a\) всегда может быть получена не более чем за \(5 \cdot 10^5\) операций.

Примечание

В первом примере, после операции с \(l=1\) и \(r=2\) массив \(a\) становится равным \([2,2]\). Можно показать, что невозможно достичь большей суммы элементов \(a\), поэтому ответ \(4\).

Во втором примере, начальная сумма элементов равна \(13\), а достичь большей суммы невозможно.

В третьем примере массив \(a\) изменяется следующим образом:

  • после первой операции (\(l=3\), \(r=3\)), массив \(a\) становится равным \([1,100,0,1]\);
  • после второй операции (\(l=3\), \(r=4\)), массив \(a\) становится равным \([1,100,2,2]\).

Можно показать, что большей суммы элементов \(a\) достичь невозможно, поэтому ответ \(105\).

E1. Нина против монстров (простая версия)

математика Перебор реализация *2500

Это простая версия задачи. Единственное отличие между версиями — ограничение на \(a_i\). Вы можете делать взломы, только если обе версии задачи решены.

Нина сражается с \(n\) монстрами, стоящими по кругу. Эти монстры пронумерованы от \(1\) до \(n\), и текущий уровень энергии \(i\)-го (\(1 \le i \le n\)) монстра равен \(a_i\).

Поскольку монстры слишком сильные, Нина решила сразиться с ними, используя заклинание Атакуй своего соседа. Когда Нина использует это заклинание, следующие действия происходят в следующем порядке последовательно:

  • \(1\)-й монстр атакует \(2\)-го монстра;
  • \(2\)-й монстр атакует \(3\)-го монстра;
  • \(\ldots\)
  • \((n-1)\)-й монстр атакует \(n\)-го монстра;
  • \(n\)-й монстр атакует \(1\)-го монстра.

Когда монстр с уровнем энергии \(x\) атакует монстра с уровнем энергии \(y\), уровень энергии защищающегося монстра становится \(\max(0, y-x)\) (уровень энергии атакующего монстра остается равным \(x\)).

Нина собирается использовать это заклинание \(10^{100}\) раз и потом сразиться с монстрами, у которых останется ненулевой уровень энергии. Она хочет, чтобы вы определили, у каких монстров останется ненулевой уровень энергии после того, как она использует описанное заклинание \(10^{100}\) раз.

Входные данные

В первой строке дано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке дано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество монстров.

Во второй строке даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 2 \cdot 10^5\)) — текущие уровни энергии монстров.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных

  • в первой строке выведите целое число \(m\) — количество монстров с ненулевым уровнем энергии после \(10^{100}\) использований заклинания;
  • во второй строке выведите \(m\) целых чисел \(i_1,i_2,\ldots,i_m\) (\(1 \le i_1 < i_2 < \ldots < i_m \le n\)) — индексы этих монстров в порядке возрастания.

Если \(m=0\), вы можете либо вывести пустую строку, либо не выводить ее.

Примечание

В первом наборе входных данных в первые \(3\) использования заклинания происходят следующие действия в следующем порядке:

  • Нина использует заклинание Атакуй своего соседа в первый раз;
  • \(1\)-й монстр атакует \(2\)-го монстра, после атаки уровень энергии \(2\)-го монстра становится равным \(\max(0, 5-2)=3\);
  • \(2\)-й монстр атакует \(3\)-го монстра, после атаки уровень энергии \(3\)-го монстра становится равным \(\max(0, 3-3)=0\);
  • \(3\)-й монстр атакует \(1\)-го монстра, после атаки уровень энергии \(1\)-го монстра становится равным \(\max(0, 2-0)=2\);
  • Нина использует заклинание Атакуй своего соседа во второй раз;
  • \(1\)-й монстр атакует \(2\)-го монстра, после атаки уровень энергии \(2\)-го монстра становится равным \(\max(0, 3-2)=1\);
  • \(2\)-й монстр атакует \(3\)-го монстра, после атаки уровень энергии \(3\)-го монстра становится равным \(\max(0, 0-1)=0\);
  • \(3\)-й монстр атакует \(1\)-го монстра, после атаки уровень энергии \(1\)-го монстра становится равным \(\max(0, 2-0)=2\);
  • Нина использует заклинание Атакуй своего соседа в третий раз;
  • \(1\)-й монстр атакует \(2\)-го монстра, после атаки уровень энергии \(2\)-го монстра становится равным \(\max(0, 1-2)=0\);
  • \(2\)-й монстр атакует \(3\)-го монстра, после атаки уровень энергии \(3\)-го монстра становится равным \(\max(0, 0-0)=0\);
  • \(3\)-й монстр атакует \(1\)-го монстра, после атаки уровень энергии \(1\)-го монстра становится равным \(\max(0, 2-0)=2\).

После каждого следующего использования заклинания уровни энергии монстров не изменяются. Таким образом, в конце только у \(1\)-го монстра ненулевой уровень энергии.

Во втором наборе входных данных у обоих монстров изначально нулевой уровень энергии.

E2. Нина против монстров (сложная версия)

жадные алгоритмы математика Перебор реализация *2700

Это сложная версия задачи. Единственное отличие между версиями — ограничение на \(a_i\). Вы можете делать взломы, только если обе версии задачи решены.

Нина сражается с \(n\) монстрами, стоящими по кругу. Эти монстры пронумерованы от \(1\) до \(n\), и текущий уровень энергии \(i\)-го (\(1 \le i \le n\)) монстра равен \(a_i\).

Поскольку монстры слишком сильные, Нина решила сразиться с ними, используя заклинание Атакуй своего соседа. Когда Нина использует это заклинание, следующие действия происходят в следующем порядке последовательно:

  • \(1\)-й монстр атакует \(2\)-го монстра;
  • \(2\)-й монстр атакует \(3\)-го монстра;
  • \(\ldots\)
  • \((n-1)\)-й монстр атакует \(n\)-го монстра;
  • \(n\)-й монстр атакует \(1\)-го монстра.

Когда монстр с уровнем энергии \(x\) атакует монстра с уровнем энергии \(y\), уровень энергии защищающегося монстра становится \(\max(0, y-x)\) (уровень энергии атакующего монстра остается равным \(x\)).

Нина собирается использовать это заклинание \(10^{100}\) раз и потом сразиться с монстрами, у которых останется ненулевой уровень энергии. Она хочет, чтобы вы определили, у каких монстров останется ненулевой уровень энергии после того, как она использует описанное заклинание \(10^{100}\) раз.

Входные данные

В первой строке дано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

В первой строке дано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество монстров.

Во второй строке даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)) — текущие уровни энергии монстров.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных

  • в первой строке выведите целое число \(m\) — количество монстров с ненулевым уровнем энергии после \(10^{100}\) использований заклинания;
  • во второй строке выведите \(m\) целых чисел \(i_1,i_2,\ldots,i_m\) (\(1 \le i_1 < i_2 < \ldots < i_m \le n\)) — индексы этих монстров в порядке возрастания.

Если \(m=0\), вы можете либо вывести пустую строку, либо не выводить ее.

Примечание

В первом наборе входных данных в первые \(3\) использования заклинания происходят следующие действия в следующем порядке:

  • Нина использует заклинание Атакуй своего соседа в первый раз;
  • \(1\)-й монстр атакует \(2\)-го монстра, после атаки уровень энергии \(2\)-го монстра становится равным \(\max(0, 5-2)=3\);
  • \(2\)-й монстр атакует \(3\)-го монстра, после атаки уровень энергии \(3\)-го монстра становится равным \(\max(0, 3-3)=0\);
  • \(3\)-й монстр атакует \(1\)-го монстра, после атаки уровень энергии \(1\)-го монстра становится равным \(\max(0, 2-0)=2\);
  • Нина использует заклинание Атакуй своего соседа во второй раз;
  • \(1\)-й монстр атакует \(2\)-го монстра, после атаки уровень энергии \(2\)-го монстра становится равным \(\max(0, 3-2)=1\);
  • \(2\)-й монстр атакует \(3\)-го монстра, после атаки уровень энергии \(3\)-го монстра становится равным \(\max(0, 0-1)=0\);
  • \(3\)-й монстр атакует \(1\)-го монстра, после атаки уровень энергии \(1\)-го монстра становится равным \(\max(0, 2-0)=2\);
  • Нина использует заклинание Атакуй своего соседа в третий раз;
  • \(1\)-й монстр атакует \(2\)-го монстра, после атаки уровень энергии \(2\)-го монстра становится равным \(\max(0, 1-2)=0\);
  • \(2\)-й монстр атакует \(3\)-го монстра, после атаки уровень энергии \(3\)-го монстра становится равным \(\max(0, 0-0)=0\);
  • \(3\)-й монстр атакует \(1\)-го монстра, после атаки уровень энергии \(1\)-го монстра становится равным \(\max(0, 2-0)=2\).

После каждого следующего использования заклинания уровни энергии монстров не изменяются. Таким образом, в конце только у \(1\)-го монстра ненулевой уровень энергии.

Во втором наборе входных данных у обоих монстров изначально нулевой уровень энергии.

B. Битовая конструкция

битмаски жадные алгоритмы Конструктив реализация *1100

Даны целые неотрицательные числа \(n\) и \(k\). Постройте последовательность из \(n\) целых неотрицательных (т.е. \(\geq 0\)) чисел \(a_1, a_2, \ldots, a_n\) таких, что

  1. \(\sum\limits_{i = 1}^n a_i = k\).
  2. Количество \(1\) в двоичной записи числа \(a_1 | a_2 | \ldots | a_n\) максимально, где \(|\) обозначает операцию побитового ИЛИ.
Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \leq n \leq 2 \cdot 10^5\), \(1 \leq k \leq 10^9\)) — количество чисел в последовательности и сумму соответственно.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите на отдельной строке последовательность \(a_1, a_2, \ldots, a_n\), удовлетворяющую приведенным выше условиям.

Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных нам нужно вывести ровно одно число, поэтому в качестве ответа мы можем вывести только \(5\).

Во втором наборе входных данных мы выводим \(1, 2\). Они имеют сумму \(3\), а \(1 | 2 = (11)_2\) имеет две \(1\) в двоичном представлении. Можно показать, что большего количества единиц достичь нельзя.

В четвертом наборе входных данных мы выводим \(3, 1, 1, 32, 2, 12\), что в сумме составляет \(51\), и \(3 | 1 | 1 | 32 | 2 | 12 = (101\,111)_2\) имеет пять \(1\) в двоичном представлении. Можно показать, что большего количества единиц достичь нельзя.

B. Покраска прямоугольника

Конструктив реализация *1100

Дана таблица \(n \times m\) из белых и черных клеток. За одну операцию можно выбрать две клетки одного цвета и покрасить в этот цвет все клетки в подпрямоугольнике между ними.

Формально, если выбрать позиции \((x_1, y_1)\) и \((x_2, y_2)\), которые в данный момент имеют цвет \(c\), установите цвет всех \((x, y)\), где \(\min(x_1, x_2) \le x \le \max(x_1, x_2)\) и \(\min(y_1, y_2) \le y \le \max(y_1, y_2)\) в \(c\).

На этой диаграмме показана последовательность двух возможных операций в таблице:

Возможно ли, чтобы все клетки в таблице были одного цвета после выполнения любого количества операций (возможно, нуля)?

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество тестов. Далее следует описание самих тестов.

Первая строка каждого теста содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 500\)) — количество строк и столбцов в таблице, соответственно.

Каждая из следующих \(n\) строк содержит \(m\) символов 'W' и 'B' — начальные цвета клеток таблицы.

Гарантируется, что сумма \(n\cdot m\) по всем тестам не превышает \(3\cdot 10^5\).

Выходные данные

Для каждого теста выведите «YES», если возможно сделать все клетки в таблице одного цвета, и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (верхний или нижний). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом примере невозможно изменить цвет любой клетки с помощью операции, поэтому мы выводим NO.

Во втором примере это случай, изображенный выше. Как показано на этой диаграмме, возможно, что все клетки будут белыми после двух операций, поэтому мы выводим YES.

В третьем и четвертом примерах все клетки уже имеют одинаковый цвет, поэтому мы выводим YES.

В пятом примере мы можем сделать все за две операции. Сначала выберем позиции \((2, 1)\) и \((1, 4)\) и покрасим все клетки с \(1 \le x \le 2\) и \(1 \le y \le 4\) в белый цвет. Затем выберем позиции \((2, 1)\) и \((3, 4)\) и покрасим все клетки с \(2 \le x \le 3\) и \(1 \le y \le 4\) в белый цвет. После этих двух операций все клетки будут белыми.

A. Подсчет перестановок

Бинарный поиск жадные алгоритмы математика реализация сортировки *1400

У вас есть несколько карточек, на каждой из которых написано целое число от \(1\) до \(n\). В частности, для каждого \(i\) от \(1\) до \(n\) у вас есть \(a_i\) карточек, на которых написано число \(i\).

Также есть магазин, который содержит неограниченное количество карточек каждого типа. У вас есть \(k\) монет, поэтому вы можете купить в общей сложности \(k\) дополнительных карточек, а купленные вами карточки могут содержать любые целые числа от \(1\) до \(n\).

После покупки новых карточек вы расставляете все свои карточки в линию. Счет расстановки — это количество (непрерывных) подмассивов длины \(n\), которые являются перестановкой массива \([1, 2, \ldots, n]\). Какой максимальный счет вы можете получить?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке указано количество наборов входных данных \(t\ (1\le t\le 100)\). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1\le n \le 2 \cdot 10^5\), \(0\le k \le 10^{12}\)) — количество различных типов карт и количество монет.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^{12}\)) — количество карт типа \(i\), имеющихся у вас в начале.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке одно целое число — максимальный счет, который вы можете получить.

Примечание

В первом наборе входных данных искомый (и единственный) массив, который можно получить, — это \([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\) (\(11\) карточек с числом \(1\)), который содержит \(11\) подмассивов, состоящих из перестановки \([1]\).

Во втором наборе входных данных мы можем купить \(0\) карточек типа \(1\) и \(4\) карточки типа \(2\), а затем расставить карточки следующим образом: \([1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]\). Есть \(8\) подмассивов, равных \([1, 2]\), и \(7\) подмассивов, равных \([2, 1]\), что в сумме составляет \(15\) подмассивов, которые являются перестановкой \([1, 2]\). Можно также доказать, что это максимальный счет, который мы можем получить.

В третьем наборе входных данных одной из возможных оптимальных расстановок является \([3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 3]\).

D. Длинный путь к неубыванию

Бинарный поиск графы кратчайшие пути поиск в глубину и подобное реализация *2800

Малышка R — волшебница, которая любит неубывающие массивы. У нее есть массив длины \(n\), изначально равный \(a_1, \ldots, a_n\), в котором каждый элемент — целое число в диапазоне \([1, m]\). Она хочет, чтобы он стал неубывающим, то есть выполнялось \(a_1 \leq a_2 \leq \ldots \leq a_n\).

Для этого она может проделать несколько фокусов. У малышки R есть фиксированный массив \(b_1\ldots b_m\) длины \(m\). Формально определим фокус как процедуру, которая выполняет следующие действия по порядку:

  • Выбрать множество \(S \subseteq \{1, 2, \ldots, n\}\).
  • Для каждого \(u \in S\) присвоить \(a_u\) значение \(b_{a_u}\).

Малышка R задается вопросом, сколько нужно сделать фокусов, чтобы исходный массив стал неубывающим. Если это невозможно ни при каком количестве фокусов, выведите вместо этого \(-1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1\leq n \leq 10^6\), \(1 \leq m \leq 10^6\)) — длину исходного массива и диапазон элементов в массиве.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, \ldots, a_n\) (\(1 \leq a_i \leq m\)) — изначальный массив.

Третья строка каждого набора входных данных содержит \(m\) целых чисел \(b_1, \ldots, b_m\) (\(1 \leq b_i \leq m\)) — фиксированный магический массив.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\), и сумма \(m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: минимально необходимое количество фокусов или \(-1\), если невозможно сделать \(a_1, \ldots, a_n\) неубывающим.

Примечание

В первом наборе входных данных изначальный массив \(a_1, \ldots, a_n\) равен \([1, 6, 3, 7, 1]\). Вы можете выбрать \(S\) следующим образом:

  • первый фокус: \(S = [2, 4, 5]\), \(a = [1, 1, 3, 5, 2]\);
  • второй фокус: \(S = [5]\), \(a = [1, 1, 3, 5, 3]\);
  • третий фокус: \(S = [5]\), \(a = [1, 1, 3, 5, 5]\).
Таким образом, с помощью \(3\) фокусов можно сделать \(a_1, \ldots, a_n\) неубывающим. Можно показать, что это минимально возможное количество фокусов.

Во втором наборе входных данных невозможно сделать \(a_1, \ldots, a_n\) неубывающим.

F. Следующий и предыдущий

Перебор реализация Структуры данных *3200

Пусть \(p_1, \ldots, p_n\) — перестановка массива \([1, \ldots, n]\).

Пусть \(q\)-последовательность \(p\) — это перестановка \([1, q]\), элементы которой расположены в том же относительном порядке, что и в \(p_1, \ldots, p_n\). То есть мы извлекаем из \(p\) в исходном порядке все элементы, которые не превосходят \(q\), и они составляют \(q\)-последовательность \(p\).

Для заданного массива \(a\) пусть \(pre(i)\) — наибольшее значение, удовлетворяющее \(pre(i) < i\) и \(a_{pre(i)} > a_i\). Если такого значения не существует, пусть \(pre(i) = -10^{100}\). Пусть \(nxt(i)\) — наименьшее значение, удовлетворяющее \(nxt(i) > i\) и \(a_{nxt(i)} > a_i\). Если оно не существует, пусть \(nxt(i) = 10^{100}\).

Для каждого \(q\) такого, что \(1 \leq q \leq n\), пусть \(a_1, \ldots, a_q\) — \(q\)-последовательность \(p\). Для каждого \(i\), такого, что \(1 \leq i \leq q\), \(pre(i)\) и \(nxt(i)\) будут вычислены в соответствии с условиями выше. Затем вам будут даны некоторые целые значения \(x\), и для каждого из них вы должны вычислить \(\sum\limits_{i=1}^q \min(nxt(i) - pre(i), x)\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке находится одно целое число \(n\) (\(1 \leq n \leq 3\cdot 10^5\)) — длина перестановки.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_1, \ldots, p_n\) (\(1 \leq p_i \leq n\)) — начальную перестановку.

Затем, для каждого \(q\) такого, что \(1 \leq q \leq n\), в порядке возрастания, вам будет дано целое число \(k\) (\(0 \leq k \leq 10^5\)), представляющее собой количество запросов для \(q\)-последовательности. Затем в строке следуют \(k\) чисел: каждое из них является значением \(x\) для одного запроса (\(1 \leq x \leq q\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3\cdot 10^5\), а сумма \(k\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных, для каждого запроса выведите одну строку с целым числом — ответом на запрос.

Примечание

\(1\)-последовательность — это \([1]\), причем \(pre=[-10^{100}]\), \(nxt=[10^{100}]\). \(ans(1)=\min(10^{100}-(-10^{100}),1)=1\).

\(5\)-последовательностью является \([1,4,3,2,5]\), причем \(pre=[-10^{100},-10^{100},2,3,-10^{100}]\), \(nxt=[2,5,5,5,10^{100}]\). \(ans(1)=5,ans(2)=10,ans(3)=14\).

A. Два друга

Конструктив математика реализация *800

Монокарп хочет устроить вечеринку. У него есть \(n\) друзей, и он хочет, чтобы на его вечеринке было как минимум \(2\) из них.

Лучший друг \(i\)-го друга — это \(p_i\). Все \(p_i\) различны, и для каждого \(i \in [1, n]\), \(p_i \ne i\).

Монокарп может отправлять приглашения друзьям. \(i\)-й друг придет на вечеринку, если приглашение получат и друг \(i\), и друг \(p_i\) (обратите внимание, что друг \(p_i\) не обязан прийти на вечеринку). Каждое приглашение отправляется ровно одному другу.

Например, если \(p = [3, 1, 2, 5, 4]\), и Монокарп отправляет приглашения друзьям \([1, 2, 4, 5]\), то на вечеринку придут друзья \([2, 4, 5]\). Друг \(1\) не придет, так как его лучший друг не получил приглашение; друг \(3\) не придет, так как он не получил приглашение.

Вычислите минимальное количество приглашений, которые Монокарп должен отправить, чтобы как минимум \(2\) друга пришли на вечеринку.

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк:

  • в первой строке записано одно целое число \(n\) (\(2 \le n \le 50\)) — количество друзей;
  • во второй строке записаны \(n\) целых чисел \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\); \(p_i \ne i\); все \(p_i\) различны).
Выходные данные

Выведите одно целое число — минимальное количество приглашений, которые Монокарп должен отправить.

Примечание

В первом наборе входных данных Монокарп может отправить приглашения друзьям \(4\) и \(5\). Оба придут на вечеринку, так как они лучшие друзья друг друга, и у каждого из них есть приглашение.

Во втором наборе Монокарп может отправить приглашения друзьям \(1, 2\) и \(3\), например. Тогда придут друзья \(1\) и \(2\): у друга \(1\) и его лучшего друга \(2\) есть приглашения, у друга \(2\) и его лучшего друга \(3\) есть приглашения. Друг \(3\) не придет, так как его лучший друг \(4\) не имеет приглашения. Невозможно отправить приглашения меньше чем \(3\) друзьям таким образом, чтобы пришло хотя бы \(2\).

В третьем наборе Монокарп может отправить приглашения обоим друзьям \(1\) и \(2\), и оба придут.

C. Минимизация суммы

дп реализация *1700

Задан целочисленный массив \(a\) размера \(n\).

Вы можете выполнить следующую операцию: выбрать элемент массива и заменить его значением любого из его соседей.

Например, если \(a=[3, 1, 2]\), вы можете получить один из массивов \([3, 3, 2]\), \([3, 2, 2]\) и \([1, 1, 2]\) за одну операцию, но не \([2, 1, 2\)] и \([3, 4, 2]\).

Ваша задача — посчитать минимально возможную сумму массива, если вы можете выполнить вышеописанную операцию не более \(k\) раз.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 3 \cdot 10^5\); \(0 \le k \le 10\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)).

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимально возможную сумму массива, если вы можете выполнить вышеописанную операцию не более \(k\) раз.

Примечание

В первом примере одна из возможных последовательностей операций: \([3, 1, 2] \rightarrow [1, 1, 2\)].

Во втором примере не нужно применять операцию.

В третьем примере одна из возможных последовательностей операций: \([2, 2, 1, 3] \rightarrow [2, 1, 1, 3] \rightarrow [2, 1, 1, 1]\).

В четвертом примере одна из возможных последовательностей операций: \([4, 1, 2, 2, 4, 3] \rightarrow [1, 1, 2, 2, 4, 3] \rightarrow [1, 1, 1, 2, 4, 3] \rightarrow [1, 1, 1, 2, 2, 3]\).

F. Пары карт

дп жадные алгоритмы реализация хэши *3000

Есть колода из \(n\) карт, каждая из которых имеет один из \(k\) типов. Вам дана последовательность \(a_1, a_2, \dots, a_n\), обозначающая типы карт в колоде сверху вниз. И \(n\), и \(k\) — четные числа.

Вы играете с этими картами. Сначала вы берете \(k\) верхних карт из колоды. Затем происходит следующее на каждом ходу игры:

  • вы выбираете ровно две карты из вашей руки и играете их. Если у этих карт одинаковый тип, вы зарабатываете монету;
  • затем, если колода не пуста, вы берете ровно две верхние карты из нее;
  • затем, если и ваша рука, и ваша колода пусты, игра заканчивается. В противном случае начинается новый ход.

Вам нужно посчитать максимальное количество монет, которое вы можете заработать во время игры.

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(2 \le k \le n \le 1000\), оба \(n\) и \(k\) — четные).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le k\)).

Выходные данные

Выведите одно целое число — максимальное количество монет, которое вы можете заработать.

A1. Balanced Shuffle (Easy)

реализация сортировки *1000

A parentheses sequence is a string consisting of characters "(" and ")", for example "(()((".

A balanced parentheses sequence is a parentheses sequence which can become a valid mathematical expression after inserting numbers and operations into it, for example "(()(()))".

The balance of a parentheses sequence is defined as the number of opening parentheses "(" minus the number of closing parentheses ")". For example, the balance of the sequence "(()((" is 3.

A balanced parentheses sequence can also be defined as a parentheses sequence with balance 0 such that each of its prefixes has a non-negative balance.

We define the balanced shuffle operation that takes a parentheses sequence and returns a parentheses sequence as follows: first, for every character of the input sequence, we compute the balance of the prefix of the sequence before that character and write those down in a table together with the positions of the characters in the input sequence, for example:

Prefix balance01212321
Position12345678
Character(()(()))

Then, we sort the columns of this table in increasing order of prefix balance, breaking ties in decreasing order of position. In the above example, we get:

Prefix balance01112223
Position18427536
Character()(()())

The last row of this table forms another parentheses sequence, in this case "()(()())". This sequence is called the result of applying the balanced shuffle operation to the input sequence, or in short just the balanced shuffle of the input sequence.

You are given a balanced parentheses sequence. Print its balanced shuffle.

Input

The only line of input contains a string \(s\) consisting only of characters "(" and ")". This string is guaranteed to be a non-empty balanced parentheses sequence with its length not exceeding \(500\,000\).

Output

Print the parentheses sequence \(t\) — the balanced shuffle of \(s\).

F1. Playing Quidditch (Easy)

реализация *2300

This afternoon, you decided to enjoy the first days of Spring by taking a walk outside. As you come near the Quidditch field, you hear screams. Once again, there is a conflict about the score: the two teams are convinced that they won the game! To prevent this problem from happening one more time, you decide to get involved in the refereeing of the matches.

Now, you will stay in the stadium to watch the game and count the score. At the end of the game, you will decide the winner.

Today, two teams are competing: the red Gryffindor (R) and the blue Ravenclaw (B) team. Each team is composed of \(P\) players (\(1 \leq P \leq 10\)).

The field is a rectangle of \(N\) lines and \(M\) columns (\(3 \leq N, M \leq 99\), \(N\) and \(M\) are odd). All the positions are integers, and several entities are allowed to be at the same position in the field. At the beginning of the game, the field contains goals for the two teams (each team can own between one and five goals), the players, and exactly one Quaffle. Other types of balls will be available in the harder versions of the problem.

A game is composed of \(T\) steps (\(0 \leq T \leq 10000\)). At each step, one entity on the field (a player or a ball) performs one action. All entities can move. A player can also catch a ball or throw the Quaffle that it is carrying. To catch a ball, a player must be located on the same cell as it. The Quaffle does not perform any action while it is being carried; it only follows the movements of the player. If a player carrying the Quaffle decides to throw it, the Quaffle is simply put at the current position of the player.

To win a point, a player must leave the Quaffle at a goal of the other team. When it does, the team of the player wins one point, and the Quaffle instantly moves to the middle of the field (the cell at the \((M+1)/2\)-th column of the \((N+1)/2\)-th line of the field, starting from 1). There is no goal in the middle of the field. If a player puts the ball in its own goal, the other team wins the point.

Input

On the first line, the integers \(N\) and \(M\).

The description of the field follows: \(N\) lines of \(M\) pairs of characters separated by spaces. Each pair of characters represents a position on the field. It can be either:

  • .. to represent an empty cell
  • R0, ..., R9, B0, ..., B9 to represent a player. The first character is the team of the player, and the second is the number of the player in the team. Each pair of characters is unique, but it is not guaranteed that all the pairs appear in the grid.
  • RG or BG to represent a goal. The blue team tries to put the ball in a red goal (RG) while the red team tries to put the ball in a blue goal (BG).
  • .Q to represent the Quaffle, which is the ball that the players use to score goals.

The next line contains \(T\), the number of steps that compose the game. \(T\) lines follow, each describing one action. It contains several pieces of information separated by a space. First, a pair of characters representing the entity that must perform the action. Second, the description of the action:

  • U, D, L, R indicate that the entity moves on the grid. It can move to the top of the grid (U), to the bottom (D), to the left (L), or to the right (R). Each entity moves by only one cell at a time.
  • C indicates that the player catches the ball (only a player can catch a ball). Then, there is a space followed by a pair of characters: the description of the ball caught by the player. This information is needed since in the next versions of the problem, several balls may be in the same cell.
  • T indicates that the player throws the Quaffle that it is carrying.

All the actions performed by the entities are guaranteed to be valid: the players stay in the field, don't catch a ball if they are not in the same cell, don't release the Quaffle if they are not carrying it, ...

Output

You must output the description of the main events of the game, one event per line. More precisely:

  • Each time a team scores, you must print t RED GOAL or t BLUE GOAL, depending on the team who scored, where t is the current time (the position of the action in the list of actions, starting from 0). In the case where a player scores in the wrong goal (a red player scores in the red goal, or a blue player scores in the blue goal), you must print the name of the team who wins one point, that is, the other team.

The events must be printed in ascending order of t.

At the end of the game, you must print the final score as: FINAL SCORE: r b, where r is the score of the red team and b is the score of the blue team.

Note

In the first example, a blue player goes to the middle of the grid, at the position of the Quaffle. He takes it, goes to the goal of the red team, and lets the ball there. He scores! The ball gets back to the middle of the field, a red player takes it and scores too.

In the second example, the red player takes the Quaffle, move it and throw it. The blue player catches the ball, goes to the red goal and scores.

In the third example, the red player takes the ball and scores in the goal of their own team: the blue team wins a point.

F2. Playing Quidditch (Medium)

реализация *2300

This afternoon, you decided to enjoy the first days of Spring by taking a walk outside. As you come near the Quidditch field, you hear screams. Once again, there is a conflict about the score: the two teams are convinced that they won the game! To prevent this problem from happening one more time, you decide to get involved in the refereeing of the matches.

Now, you will stay in the stadium to watch the game and count the score. At the end of the game, you will decide the winner.

Today, two teams are competing: the red Gryffindor (R) and the blue Ravenclaw (B) team. Each team is composed of \(P\) players (\(1 \leq P \leq 10\)).

The field is a rectangle of \(N\) lines and \(M\) columns (\(3 \leq N, M \leq 99\), \(N\) and \(M\) are odd). All the positions are integers, and several entities are allowed to be at the same position in the field. At the beginning of the game, the field contains goals for the two teams (each team can own between one and five goals), the players, and exactly one Quaffle. In this version of the problem, one Bludger can be present. An other type of ball will be available in the harder version of the problem.

A game is composed of \(T\) steps (\(0 \leq T \leq 10000\)). At each step, one entity on the field (a player or a ball) performs one action. All entities can move. A player can also catch a ball or throw the Quaffle that it is carrying. To catch a ball, a player must be located on the same cell as it. The Quaffle does not perform any action while it is being carried; it only follows the movements of the player. If a player carrying the Quaffle decides to throw it, the Quaffle is simply put at the current position of the player. If a player is on the same cell as a Bludger (either after a movement from the player or the Bludger), the player is eliminated. If the player is eliminated while it is carrying the Quaffle, the Quaffle remains on the cell containing both the player and the Bludger after the move. It is guaranteed that this never occurs while the player is in a cell containing a goal.

To win a point, a player must leave the Quaffle at a goal of the other team. When it does, the team of the player wins one point, and the Quaffle instantly moves to the middle of the field (the cell at the \((M+1)/2\)-th column of the \((N+1)/2\)-th line of the field, starting from 1). There is no goal in the middle of the field. If a player puts the ball in its own goal, the other team wins the point.

Input

On the first line, the integers \(N\) and \(M\).

The description of the field follows: \(N\) lines of \(M\) pairs of characters separated by spaces. Each pair of characters represents a position on the field. It can be either:

  • .. to represent an empty cell
  • R0, ..., R9, B0, ..., B9 to represent a player. The first character is the team of the player, and the second is the number of the player in the team. Each pair of characters is unique, but it is not guaranteed that all the pairs appear in the grid.
  • RG or BG to represent a goal. The blue team tries to put the ball in a red goal (RG) while the red team tries to put the ball in a blue goal (BG).
  • .Q to represent the Quaffle, which is the ball that the players use to score goals.
  • .B to represent a Bludger.

The next line contains \(T\), the number of steps that compose the game. \(T\) lines follow, each describing one action. It contains several pieces of information separated by a space. First, a pair of characters representing the entity that must perform the action. Second, the description of the action:

  • U, D, L, R indicate that the entity moves on the grid. It can move to the top of the grid (U), to the bottom (D), to the left (L), or to the right (R). Each entity moves by only one cell at a time.
  • C indicates that the player catches the ball (only a player can catch a ball). Then, there is a space followed by a pair of characters: the description of the ball caught by the player. This information is needed since several balls can be in the same cell.
  • T indicates that the player throws the Quaffle that it is carrying.

All the actions performed by the entities are guaranteed to be valid: the players stay in the field, don't catch a ball if they are not in the same cell, don't release the Quaffle if they are not carrying it, ...

Output

You must output the description of the main events of the game, one event per line. More precisely:

  • Each time a team scores, you must print t RED GOAL or t BLUE GOAL, depending on the team who scored, where t is the current time (the position of the action in the list of actions, starting from 0). In the case where a player scores in the wrong goal (a red player scores in the red goal, or a blue player scores in the blue goal), you must print the name of the team who wins one point, that is, the other team.
  • Each time a player is eliminated, you must print t p ELIMINATED, where t is the current time and p is the player who is eliminated. The format to print the player is the same as in the input.

The events must be printed in ascending order of t. If several players are eliminated at the same time, the events must be written in alphabetical order: B0, ..., B9, R0, ... R9.

At the end of the game, you must print the final score as: FINAL SCORE: r b, where r is the score of the red team and b is the score of the blue team.

Note

In the first example, the red player takes the Quaffle, move it and throw it. The blue player catches the ball, goes to the red goal and scores.

In the second example, the red player takes the ball and scores in the goal of their own team: the blue team wins a point.

In the third example, the Bludger goes at the position of R0: R0 is eliminated. Then, B0 moves to the position of the Bludger: B0 is eliminated too.

You can find one more example in the easy version of the problem

F3. Playing Quidditch (Hard)

реализация *2300

This afternoon, you decided to enjoy the first days of Spring by taking a walk outside. As you come near the Quidditch field, you hear screams. Once again, there is a conflict about the score: the two teams are convinced that they won the game! To prevent this problem from happening one more time, you decide to get involved in the refereeing of the matches.

Now, you will stay in the stadium to watch the game and count the score. At the end of the game, you will decide the winner.

Today, two teams are competing: the red Gryffindor (R) and the blue Ravenclaw (B) team. Each team is composed of \(P\) players (\(1 \leq P \leq 10\)).

The field is a rectangle of \(N\) lines and \(M\) columns (\(3 \leq N, M \leq 99\), \(N\) and \(M\) are odd). All the positions are integers, and several entities are allowed to be at the same position in the field. At the beginning of the game, the field contains goals for the two teams (each team can own between one and five goals), the players, and exactly one Quaffle. In this version of the problem, one Bludger and a Golden Snitch can be present.

A game is composed of \(T\) steps (\(0 \leq T \leq 10000\)). At each step, one entity on the field (a player or a ball) performs one action. All entities can move. A player can also catch a ball or throw the Quaffle that it is carrying. To catch a ball, a player must be located on the same cell as it. The Quaffle does not perform any action while it is being carried; it only follows the movements of the player. If a player carrying the Quaffle decides to throw it, the Quaffle is simply put at the current position of the player. If a player is on the same cell as a Bludger (either after a movement from the player or the Bludger), the player is eliminated. If the player is eliminated while it is carrying the Quaffle, the Quaffle remains on the cell containing both the player and the Bludger after the move. It is guaranteed that this never occurs while the player is in a cell containing a goal.

To win a point, a player must leave the Quaffle at a goal of the other team. When it does, the team of the player wins one point, and the Quaffle instantly moves to the middle of the field (the cell at the \((M+1)/2\)-th column of the \((N+1)/2\)-th line of the field, starting from 1). There is no goal in the middle of the field. If a player puts the ball in its own goal, the other team wins the point. If a player catches the Golden Snitch, their team wins 10 points and the game is over.

Input

On the first line, the integers \(N\) and \(M\).

The description of the field follows: \(N\) lines of \(M\) pairs of characters separated by spaces. Each pair of characters represents a position on the field. It can be either:

  • .. to represent an empty cell
  • R0, ..., R9, B0, ..., B9 to represent a player. The first character is the team of the player, and the second is the number of the player in the team. Each pair of characters is unique, but it is not guaranteed that all the pairs appear in the grid.
  • RG or BG to represent a goal. The blue team tries to put the ball in a red goal (RG) while the red team tries to put the ball in a blue goal (BG).
  • .Q to represent the Quaffle, which is the ball that the players use to score goals.
  • .B to represent the Bludger.
  • .S to represent the Golden Snitch.

The next line contains \(T\), the number of steps that compose the game. \(T\) lines follow, each describing one action. It contains several pieces of information separated by a space. First, a pair of characters representing the entity that must perform the action. Second, the description of the action:

  • U, D, L, R indicate that the entity moves on the grid. It can move to the top of the grid (U), to the bottom (D), to the left (L), or to the right (R). Each entity moves by only one cell at a time.
  • C indicates that the player catches the ball (only a player can catch a ball). Then, there is a space followed by a pair of characters: the description of the ball caught by the player. This information is needed since several balls can be in the same cell.
  • T indicates that the player throws the Quaffle that it is carrying.

All the actions performed by the entities are guaranteed to be valid: the players stay in the field, don't catch a ball if they are not in the same cell, don't release the Quaffle if they are not carrying it, ...

Output

You must output the description of the main events of the game, one event per line. More precisely:

  • Each time a team scores, you must print t RED GOAL or t BLUE GOAL, depending on the team who scored, where t is the current time (the position of the action in the list of actions, starting from 0). In the case where a player scores in the wrong goal (a red player scores in the red goal, or a blue player scores in the blue goal), you must print the name of the team who wins one point, that is, the other team.
  • Each time a player is eliminated, you must print t p ELIMINATED, where t is the current time and p is the player who is eliminated. The format to print the player is the same as in the input.
  • If the Golden Snitch is caught, you must print t RED CATCH GOLDEN SNITCH or t BLUE CATCH GOLDEN SNITCH, depending on the team who caught the Golden Snitch, where t is the current time.

The events must be printed in ascending order of t. If several players are eliminated at the same time, the events must be written is alphabetical order: B0, ..., B9, R0, ... R9.

At the end of the game, you must print the final score as: FINAL SCORE: r b, where r is the score of the red team and b is the score of the blue team.

Note

In the first example, the red player takes the Quaffle, move it and throw it. The blue player catches the ball, goes to the red goal and scores.

In the second example, the red player takes the ball and scores in the goal of their own team: the blue team wins a point.

In the third example, the Bludger goes at the position of R0: R0 is eliminated. Then, B0 moves to the position of the Bludger: B0 is eliminated too.

In the fourth example, a red player catches the Golden Snitch. Their team wins 10 points, and the game ends.

You can find one more example in the easy version of the problem

A. Моя первая задача на сортировку

реализация сортировки *800

Вам даны два целых числа \(x\) и \(y\).

Выведите два целых числа: минимум из \(x\) и \(y\), а затем максимум из \(x\) и \(y\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа, разделенных пробелом, \(x\) и \(y\) (\(0 \leq x, y \leq 9\)).

Выходные данные

Для каждого набора входных данных выведите два целых числа: минимум из \(x\) и \(y\), за которым следует максимум из \(x\) и \(y\).

B. Различные строки

реализация Строки *800

Вам дана строка \(s\), состоящая из строчных латинских букв.

Переставьте символы \(s\), чтобы получить новую строку \(r\), которая не равна \(s\), или сообщите, что это невозможно.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Единственная строка каждого набора содержит строку \(s\) длиной не более \(10\) символов, состоящую из строчных букв английского алфавита.

Выходные данные

Для каждого набора входных данных, если такая строка \(r\) не существует в соответствии с условием, выведите «NO» (без кавычек).

В противном случае выведите «YES» (без кавычек). Затем выведите одну строку — строку \(r\), состоящую из символов строки \(s\).

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», и «Yes» будут распознаны как положительный ответ).

Если существует несколько ответов, вы можете вывести любой из них.

Примечание

В первом примере другой возможный ответ — \(\texttt{forcescode}\).

Во втором примере все перестановки \(\texttt{aaaaa}\) равны \(\texttt{aaaaa}\).

C. Часы и строки

реализация *900

Есть часы, пронумерованные числами от \(1\) до \(12\) по часовой стрелке, как показано ниже.

В этом примере \((a,b,c,d)=(2,9,10,6)\), и нити пересекаются.

У Алисы и Боба есть четыре различных целых числа \(a\), \(b\), \(c\), \(d\), не превышающих \(12\). Алиса связывает красной нитью \(a\) и \(b\), а Боб связывает синей нитью \(c\) и \(d\). Пересекаются ли нити? (Нити являются прямыми отрезками.)

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5940\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит четыре различных целых числа \(a\), \(b\), \(c\), \(d\) (\(1 \leq a, b, c, d \leq 12\)).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если нити пересекаются, и «NO» (без кавычек) в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», и «Yes» будут распознаны как положительный ответ).

Примечание

Первый набор входных данных изображен в условии.

Во втором наборе входных данных нити не пересекаются, как показано ниже.

D. Бинарное разбиение

дп жадные алгоритмы реализация сортировки Строки *1100

Вам дана бинарная строка\(^{\dagger}\). Пожалуйста, найдите минимальное количество частей, которые вам нужно отрезать, чтобы полученные части можно было переставить в отсортированную бинарную строку.

Обратите внимание, что:

  • каждый символ должен принадлежать ровно одной из частей;
  • части должны быть непрерывными подстроками исходной строки;
  • вам нужно использовать все части при перестановке.

\(^{\dagger}\) Бинарная строка — это строка, состоящая из символов \(\texttt{0}\) и \(\texttt{1}\). Отсортированная бинарная строка — это бинарная строка, в которой все символы \(\texttt{0}\) идут перед всеми символами \(\texttt{1}\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 500\)) — количество наборов входных данных.

Единственная строка каждого набора содержит одну строку \(s\) (\(1 \leq |s| \leq 500\)), состоящую из символов \(\texttt{0}\) и \(\texttt{1}\), где \(|s|\) обозначает длину строки \(s\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество частей, необходимое для того, чтобы можно было переставить строку в отсортированную бинарную строку.

Примечание

Первый пример изображен в условии. Можно доказать, что вам понадобится не менее \(3\) частей.

Во втором и третьем примерах случаях бинарная строка уже отсортирована, поэтому нужна только \(1\) часть.

В четвертом примере вам нужно сделать один разрез между двумя символами и переставить их, чтобы получить строку \(\texttt{01}\).

F. Периметр круга

Бинарный поиск геометрия математика Перебор поиск в глубину и подобное реализация *1600

Дано целое число \(r\), найдите количество решетчатых точек, Евклидово расстояние от которых до \((0, 0)\) больше или равно \(r\), но строго меньше \(r+1\).

Решетчатая точка — это точка с целыми координатами. Евклидово расстояние от \((0, 0)\) до точки \((x,y)\) равно \(\sqrt{x^2 + y^2}\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(r\) (\(1 \leq r \leq 10^5\)).

Сумма \(r\) по всем наборам входных данных не превышает \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество решетчатых точек, расстояние от которых до \((0, 0)\) равно \(d\), где \(r \leq d < r+1\).

Примечание

Точки для первых трех наборов входных данных показаны ниже.

A. Шахматы на троих

дп математика Перебор реализация *900

Три друга собрались, чтобы сыграть несколько партий в шахматы.

В каждой партии двое из них играют друг против друга, победитель получает \(2\) очка, а проигравший — \(0\). В случае ничьей оба игрока получают по \(1\) очку. Обратите внимание, что одна и та же пара игроков могла сыграть любое неотрицательное число раз (возможно, ноль). Также возможно, что игр не было вообще.

Вам известно, что их счета после всех игр были равны \(p_1\), \(p_2\) и \(p_3\). Кроме того, гарантируется, что \(p_1 \leq p_2 \leq p_3\).

Найдите максимальное количество игр вничью, которое могли сыграть друзья, и выведите его. Если не существует способа получить \(p_1\), \(p_2\) и \(p_3\) в результате неотрицательного числа партий между тремя игроками, выведите \(-1\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(p_1\), \(p_2\) и \(p_3\) (\(0 \leq p_1 \leq p_2 \leq p_3 \leq 30\)) — счета трех игроков, отсортированные по неубыванию.

Выходные данные

Для каждого набора входных данных выведите одно число — максимальное возможное количество игр вничью, которые могли сыграть друзья, или \(-1\), если значения не соответствуют ни одному набору игр и результатов.

Примечание

В первом наборе входных данных не было сыграно ни одной партии, поэтому ничьих также не могло быть.

Во втором наборе входных данных между вторым и третьим игроком была сыграна ровно одна партия, которая закончилась вничью, поэтому ответом будет \(1\).

В третьем наборе входных данных не существует набора партий, в результате которых достигаются такие счета, поэтому ответом будет \(-1\).

C. Кот, Лиса и Двойной максимум

жадные алгоритмы Конструктив математика реализация сортировки *1700

Лиса любит перестановки! Она придумала следующую задачу, и предложила Коту её решить:

Вам дано четное целое положительное число \(n\) и перестановка\(^\dagger\) \(p\) длины \(n\).

Счет другой перестановки \(q\) длины \(n\) определим как количество локальных максимумов в массиве \(a\) длины \(n\), где \(a_i = p_i + q_i\) для всех индексов \(i\) (\(1 \le i \le n\)). Другими словами, счет \(q\) — это количество \(i\) таких, что \(1 < i < n\) (обратите внимание на строгие неравенства), \(a_{i-1} < a_i\) и \(a_i > a_{i+1}\) (еще раз обратите внимание на строгие неравенства).

Найдите перестановку \(q\), которая достигает максимального счета при заданных \(n\) и \(p\). Если таких перестановок несколько, вы можете вывести любую из них.

\(^\dagger\) Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) — не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно четное целое число \(n\) (\(4 \leq n \leq 10^5\), \(n\) — четное) — длину перестановки \(p\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \leq p_i \leq n\)). Гарантируется, что \(p\) действительно является перестановкой длины \(n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую любую перестановку чисел длины \(n\) (массив \(q\)) такую, что счёт \(q\) максимален при заданных ограничениях.

Примечание

В первом примере \(a = [3, 6, 4, 7]\). Массив имеет только один локальный максимум (на второй позиции), поэтому счет выбранной перестановки \(q\) равен \(1\). Можно доказать, что этот счет оптимален при заданных ограничениях.

В последнем примере полученный массив \(a = [6, 6, 12, 7, 14, 7, 14, 6]\) имеет \(3\) максимума — на третьей, пятой и седьмой позициях.

F. Запросы максимальной суммы НОД

битмаски дп Перебор реализация теория чисел *3100

Для \(k\) целых положительных чисел \(x_1, x_2, \ldots, x_k\) значение \(\gcd(x_1, x_2, \ldots, x_k)\) является наибольшим общим делителем чисел \(x_1, x_2, \ldots, x_k\) — наибольшим целым числом \(z\) таким, что все числа \(x_1, x_2, \ldots, x_k\) делятся на \(z\).

Вам даны три массива \(a_1, a_2, \ldots, a_n\), \(b_1, b_2, \ldots, b_n\) и \(c_1, c_2, \ldots, c_n\) длины \(n\), содержащие положительные целые числа.

У вас также есть автомат, который позволяет вам менять местами \(a_i\) и \(b_i\) для любого \(i\) (\(1 \le i \le n\)). Каждый обмен стоит вам \(c_i\) монет.

Найдите максимальное возможное значение \(\)\gcd(a_1, a_2, \ldots, a_n) + \gcd(b_1, b_2, \ldots, b_n)\text{,}\(\) которое вы можете получить, поменяв местами несколько элементов, и заплатив при этом не более \(d\) монет в сумме. Количество монет у вас меняется, поэтому найдите ответ на этот вопрос для каждого из \(q\) возможных значений \(d_1, d_2, \ldots, d_q\).

Входные данные

В первой строке находятся два целых числа \(n\) и \(q\) (\(1 \leq n \leq 5 \cdot 10^5\), \(1 \leq q \leq 5 \cdot 10^5\)).

Во второй строке находятся \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^8\)).

В третьей строке находятся \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \leq b_i \leq 10^8\)).

В четвертой строке находятся \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \leq c_i \leq 10^9\)).

В пятой строке находятся \(q\) целых чисел \(d_1, d_2, \ldots, d_q\) (\(0 \leq d_i \leq 10^{15}\)).

Выходные данные

Выведите \(q\) целых чисел — максимальное значение, которое можно получить для каждого из \(q\) возможных значений \(d\).

Примечание

В первом запросе из первого примера нам вообще не разрешается делать никаких обменов, поэтому ответом будет \(\gcd(1, 2, 3) + \gcd(4, 5, 6) = 2\). Во втором запросе одним из способов достижения оптимального значения является обмен \(a_2\) и \(b_2\), тогда ответом будет \(\gcd(1, 5, 3) + \gcd(4, 2, 6) = 3\).

Во втором запросе из второго примера оптимально сделать обмены на позициях \(1\) и \(3\), тогда ответом будет \(\gcd(3, 3, 6, 9, 3) + \gcd(8, 4, 4, 8, 4) = 7\), и нам суммарно придется заплатить \(40\) монет.

B. Симметричное кодирование

реализация сортировки Строки *800

У Поликарпа есть строка \(s\), которая состоит из строчных латинских букв. Он кодирует эту строку по следующему алгоритму:

  • сначала он строит новую вспомогательную строку \(r\), которая состоит из всех различных букв строки \(s\), записанных в алфавитном порядке;
  • далее кодирование происходит так: каждый символ в строке \(s\) заменяется на симметричный ему символ из строки \(r\) (первый символ строки \(r\) будет заменён на последний, второй на предпоследний и так далее).

Например, кодирование строки \(s\)codeforces» происходит так:

  • строка \(r\) получается равной «cdefors»;
  • первый символ \(s_1\)='c' заменяется на 's';
  • второй символ \(s_2\)='o' заменяется на 'e';
  • третий символ \(s_3\)='d' заменяется на 'r';
  • ...
  • последний символ \(s_{10}\)='s' заменяется на 'c'.
Строка \(r\) и замены для \(s\)="codeforces".

Таким образом, результатом кодирования строки \(s\)codeforces» является строка «serofedsoc».

Напишите программу, которая осуществляет декодирование — то есть по результату кодирования восстанавливает исходную строку \(s\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длину строки \(b\).

Вторая строка каждого набора содержит строку \(b\) длины \(n\), состоящую из строчных латинских букв — результат кодирования исходной строки \(s\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите строку \(s\) из которой был получен результат кодирования \(b\).

D. Ingenuity-2

жадные алгоритмы Конструктив реализация *1400

Представим поверхность Марса как бесконечную координатную плоскость. Изначально в точке с координатой \((0, 0)\) находятся ровер Perseverance-2 и вертолёт Ingenuity-2. Специально для них был разработан набор инструкций \(s\) из \(n\) инструкций следующего вида:

  • N: переместиться на один метр на север (из точки \((x, y)\) в \((x, y + 1)\));
  • S: переместиться на один метр на юг (из точки \((x, y)\) в \((x, y - 1)\));
  • E: переместиться на один метр на восток (из точки \((x, y)\) в \((x + 1, y)\));
  • W: переместиться на один метр на запад (из точки \((x, y)\) в \((x - 1, y)\)).

Каждая инструкция должна быть исполнена либо ровером, либо вертолётом. Причём каждый аппарат должен выполнить хотя бы одну инструкцию. Ваша задача распределить инструкции так, чтобы после исполнения всех \(n\) инструкций вертолёт и ровер оказались в одной точке или определить что это невозможно.

Входные данные

Первая строка ввода содержит \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество инструкций.

Вторая строка каждого набора содержит строку \(s\) длины \(n\) из символов 'N', 'S', 'E', 'W' — последовательность инструкций.

Гарантируется, что сумма \(n\) по всем наборам входных данных теста не превосходит \(2 \cdot 10 ^ 5\).

Выходные данные

Для каждого набора входных данных, если существует требуемое распределение инструкций, выведите строку \(p\) длины \(n\) из символов 'R', 'H'. Если \(i\)-я операция должна быть исполнена ровером, то \(p_i=\text{R}\), если \(i\)-я операция должна быть исполнена вертолётом, то \(p_i=\text{H}\). Если существует несколько решений, выведите любое из них.

В противном случае выведите NO.

Примечание

Рассмотрим первый пример: строка \(S = \texttt{NENSNE}\). Одно из возможных решений, показанное на рисунке ниже \(p = \texttt{RRHRRH}\), с использованием которого и ровер, и вертолет окажутся на один метр на север и на один метр на восток.

Для WWW решение невозможно.

F. Игра с отрезанием

Бинарный поиск Перебор реализация сортировки Структуры данных *1900

Алиса и Боб снова играли в игру. У них есть клетчатое поле размера \(a \times b\) (\(1 \le a, b \le 10^9\)), на котором расположены \(n\) фишек, в каждой клетке может быть не более одной фишки. Клетка на пересечении \(x\)-й строки и \(y\)-го столбца имеет координаты \((x, y)\).

Первой ходила Алиса, игроки ходили по очереди. На каждом ходу игрок мог отрезать несколько (но не все) строк или столбцов с начала или конца оставшегося поля и получить очко за каждую фишку, которая находилась на отрезанной части поля. Каждый ход может быть описан символом 'U', 'D', 'L' или 'R' и числом \(k\):

  • Если символ равен 'U', то будут отрезаны \(k\) первых строк среди оставшихся;
  • Если символ равен 'D', то будут отрезаны \(k\) последних строк среди оставшихся;
  • Если символ равен 'L', то будут отрезаны \(k\) первых столбцов среди оставшихся;
  • Если символ равен 'R', то будут отрезаны \(k\) последних столбцов среди оставшихся.

По изначальному состоянию поля и ходам игроков определите количество очков, заработанное Алисой и Бобом соответственно.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит четыре целых числа \(a\), \(b\), \(n\) и \(m\) (\(2 \le a, b \le 10^9\), \(1 \le n, m \le 2 \cdot 10^5\)) — размеры поля, количество фишек и количество ходов.

Следующие \(n\) строк содержат по два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i \le a\), \(1 \le y_i \le b\)) — координаты фишек. Все пары координат различны.

Следующие \(m\) строк содержат символ \(c_j\) и число \(k_j\) — описание \(j\)-го хода. Гарантируется, что \(k\) меньше количества строк/столбцов текущего поля. То есть игрок не мог отрезать всё оставшееся поле на своём ходу.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных в тесте не превосходит \(2 \cdot 10^5\). Гарантируется, что сумма значений \(m\) по всем наборам входных данных в тесте не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два целых числа — количество очков, заработанное Алисой и Бобом соответственно.

Примечание

Ниже показана игра из первого примера:

На своём ходу Алиса отрезала \(2\) строки снизу и получила \(2\) очка, после Боб отрезал \(1\) столбец справа и получил одно очко. Обратите внимание, что если бы Боб отрезал \(1\) строку снизу, он также получил бы \(1\) очко.

A. Массив Базоки и Мокки

жадные алгоритмы Перебор реализация сортировки *800

Мокка любит массивы, поэтому перед отъездом Базока подарил ей массив \(a\), состоящий из \(n\) целых положительных чисел.

Теперь Мокка хочет узнать, может ли массив \(a\) стать отсортированным в порядке неубывания после выполнения следующей операции несколько (возможно, ноль) раз:

  • Разделить массив на две части — префикс и суффикс, затем поменять эти две части местами. Другими словами, пусть \(a=x+y\). Тогда мы можем назначить \(a:= y+x\). Здесь \(+\) обозначает операцию конкатенации массивов.

Например, если \(a=[3,1,4,1,5]\), мы можем выбрать \(x=[3,1]\) и \(y=[4,1,5]\), удовлетворяющие \(a=x+y\). Тогда мы можем назначить \(a:= y + x = [4,1,5,3,1]\). Также для начального массива мы можем выбрать \(x=[3,1,4,1,5]\) и \(y=[\,]\), удовлетворяющие \(a=x+y\). Тогда мы можем назначить \(a := y+x = [3,1,4,1,5]\). Заметим, что мы не можем выбрать \(x=[3,1,1]\) и \(y=[4,5]\), а также \(x=[1,3]\) и \(y=[5,1,4]\), так как оба эти варианта не удовлетворяют \(a=x+y\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2\leq n\leq 50\)) — длину массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1\leq a_i \leq 10^6\)) — элементы массива \(a\).

Выходные данные

Для каждого набора входных данных выведите «Yes», если массив \(a\) может стать неубывающим после выполнения операции любое количество раз, и «No», если не может.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Для первого набора входных данных можно доказать, что массив \(a\) не может стать неубывающим после выполнения операции любое количество раз.

Во втором наборе входных данных мы можем выполнить следующие операции, чтобы сделать \(a\) отсортированным в неубывающем порядке:

  • Разделить массив на две части: \(x=[7]\) и \(y=[9,2,2,3]\), затем поменять эти две части местами. Массив станет равен \(y+x = [9,2,2,3,7]\).
  • Разделить массив на две части: \(x=[9]\) и \(y=[2,2,3,7]\), затем поменять местами эти две части. Массив станет равен \(y+x=[2,2,3,7,9]\), то есть станет неубывающим.

E. Цепные запросы

Бинарный поиск Деревья поиск в глубину и подобное реализация Структуры данных *2100

Вам дано дерево из \(n\) вершин, пронумерованных от \(1\) до \(n\). Изначально все вершины окрашены в белый или черный цвет.

Вам предлагается выполнить \(q\) запросов:

  • «u» — поменять цвет вершины \(u\) (если она была белой, то поменять на черную и наоборот).

После каждого запроса вы должны ответить, образуют ли все черные вершины цепочку. То есть существуют ли две черные вершины такие, что простой путь между ними проходит через все черные вершины и только через черные вершины. В частности, если существует только одна черная вершина, то она образует цепочку. Если черных вершин нет, то они не образуют цепочку.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\leq t\leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1\leq n,q\leq 2\cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(c_1,c_2,\ldots,c_n\) (\(c_i \in \{ \mathtt{0}, \mathtt{1} \}\)) — изначальные цвета вершин. \(c_i\) обозначает цвет вершины \(i\), где \(\mathtt{0}\) обозначает белый цвет, а \(\mathtt{1}\) — черный.

Далее следует \(n - 1\) строка, каждая из которых содержит по два целых числа \(x_i\) и \(y_i\) (\(1 \le x_i,y_i \le n\)), обозначающих ребро между вершинами \(x_i\) и \(y_i\). Гарантируется, что эти ребра образуют дерево.

Следующие \(q\) строк содержат по одному целому числу \(u_i\) (\(1 \le u_i \le n\)), указывающему на то, что цвет вершины \(u_i\) необходимо поменять.

Гарантируется, что и сумма \(n\), и сумма \(q\) по всем наборам входных данных не превосходят \(2\cdot 10^5\).

Выходные данные

Для каждого запроса выведите «Yes», если черные вершины образуют цепочку, и «No» в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Во втором наборе входных данных цвета вершин следующие:

Исходное дерево:

Первый запрос меняет цвет вершины \(4\):

Второй запрос меняет цвет вершины \(3\):

Третий запрос меняет цвет вершины \(2\):

Четвертый запрос меняет цвет вершины \(5\):

A. Проверка пароля

реализация сортировки Строки *800

Монокарп работает над своим новым сайтом, и сейчас он пытается заставить пользователей выбирать надежные пароли.

Монокарп решил, что надежные пароли должны удовлетворять следующим условиям:

  • пароль должен состоять только из строчных латинских букв и цифр;
  • не должно быть цифр, идущих после буквы (то есть, после каждой буквы следует либо другая буква, либо конец строки);
  • все цифры должны быть отсортированы в неубывающем порядке;
  • все буквы должны быть отсортированы в неубывающем порядке.

Обратите внимание, что разрешено, чтобы пароль состоял только из букв или только из цифр.

Монокарпу удалось реализовать первое условие, но он не справляется с оставшимися. Можете ли вы помочь ему проверить пароли?

Входные данные

В первой строке записано одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

В первой строке каждого набора входных данных записано одно целое число \(n\) (\(1 \le n \le 20\)) — длина пароля.

Во второй строке записана строка, состоящая из ровно \(n\) символов. Каждый символ является либо строчной латинской буквой, либо цифрой.

Выходные данные

Для каждого набора входных данных выведите «YES», если данный пароль является надежным, и «NO» в противном случае.

Примечание

Во втором наборе входных данных буквы не отсортированы в неубывающем порядке.

В четвертом наборе есть цифра, идущая после буквы — цифра '1' после буквы 'c'.

B. Увеличение/уменьшение/копирование

жадные алгоритмы реализация *1100

Задано два целочисленных массива: массив \(a\) размера \(n\) и массив \(b\) размера \(n+1\).

Вы можете выполнять следующие операции любое количество раз в любом порядке:

  • выбрать любой элемент массива \(a\) и увеличьте его на \(1\);
  • выбрать любой элемент массива \(a\) и уменьшить его на \(1\);
  • выбрать любой элемент массива \(a\), скопируйте его и добавьте копию в конец массива \(a\).

Ваша задача — посчитать минимальное количество вышеописанных операций (возможно, нулевое), необходимых для преобразования массива \(a\) в массив \(b\). Можно показать, что при ограничениях задачи это всегда возможно.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из трех строк:

  • первая строка содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\));
  • вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\));
  • третья строка содержит \(n + 1\) целых чисел \(b_1, b_2, \dots, b_{n + 1}\) (\(1 \le b_i \le 10^9\)).

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, выведите одно целое число — минимальное количество вышеописанных операций (возможно, нулевое), необходимых для преобразования массива \(a\) в массив \(b\).

Примечание

В первом примере вы можете преобразовать \(a\) в \(b\) следующим образом: \([2] \rightarrow [2, 2] \rightarrow [1, 2] \rightarrow [1, 3]\).

C. Собеседование на работу

Бинарный поиск дп жадные алгоритмы реализация *1600

Монокарп открывает свою IT-компанию. Он хочет нанять \(n\) программистов и \(m\) тестировщиков.

На собеседование придут \(n+m+1\) кандидатов, пронумерованных от \(1\) до \(n+m+1\) в хронологическом порядке их прибытия. У \(i\)-го кандидата есть навык программирования \(a_i\) и навык тестирования \(b_i\) (навык программирования человека отличается от его навыка тестирования). Навык команды — это сумма навыков программирования всех нанятых в качестве программистов и сумма навыков тестирования всех нанятых в качестве тестировщиков.

Когда кандидат приходит на собеседование, Монокарп пытается назначить его на наиболее подходящую должность (если его навык программирования выше, то как программиста, в противном случае как тестировщика). Если все места для этой должности заняты, Монокарп назначает его на другую должность.

Ваша задача — для каждого кандидата рассчитать навык команды, если на собеседование придут все, кроме него. Обратите внимание, что это означает, что придут ровно \(n+m\) кандидатов, и все \(n+m\) мест в компании будут заняты.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из трех строк:

  • первая строка содержит два целых числа \(n\) и \(m\) (\(0 \le n, m \le 2 \cdot 10^5\); \(2 \le n + m + 1 \le 2 \cdot 10^5\)) — количество программистов и количество тестировщиков, которых Монокарп хочет нанять, соответственно;
  • вторая строка содержит \(n + m + 1\) целых чисел \(a_1, a_2, \dots, a_{n+m+1}\) (\(1 \le a_i \le 10^9\)), где \(a_i\) — навык программирования \(i\)-го кандидата;
  • третья строка содержит \(n + m + 1\) целых чисел \(b_1, b_2, \dots, b_{n+m+1}\) (\(1 \le b_i \le 10^9\); \(b_i \ne a_i\)), где \(b_i\) — навык тестирования \(i\)-го кандидата.

Дополнительное ограничение на входные данные: сумма \((n + m + 1)\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n + m + 1\) целых чисел, где \(i\)-е число должно быть равно навыку команды, если на собеседование придут все, кроме \(i\)-го кандидата.

Примечание

Рассмотрим третий набор входных данных в примере:

  • если \(1\)-й кандидат не придет, \(2\)-го кандидата возьмут тестировщиком, \(3\)-го кандидата возьмут программистом, \(4\)-го кандидата возьмут тестировщиком. Суммарный навык команды будет \(2 + 5 + 1 = 8\);
  • если \(2\)-й кандидат не придет, \(1\)-го кандидата возьмут тестировщиком, \(3\)-го кандидата возьмут программистом, \(4\)-го кандидата возьмут тестировщиком. Суммарный навык команды будет \(5 + 5 + 1 = 11\);
  • если \(3\)-й кандидат не придет, \(1\)-го кандидата возьмут тестировщиком, \(2\)-го кандидата возьмут тестировщиком, \(4\)-го кандидата возьмут программистом. Суммарный навык команды будет \(5 + 2 + 4 = 11\);
  • если \(4\)-й кандидат не придет, \(1\)-го кандидата возьмут тестировщиком, \(2\)-го кандидата возьмут тестировщиком, \(3\)-го кандидата возьмут программистом. Суммарный навык команды будет \(5 + 2 + 5 = 12\).

D. Инвертируемые скобочные последовательности

Бинарный поиск Комбинаторика разделяй и властвуй реализация Структуры данных *2000

Правильная скобочная последовательность — это скобочная последовательность, которую можно превратить в корректное арифметическое выражение, вставив символы '1' и '+' между исходными символами. Например:

  • скобочные последовательности «()()» и «(())» — правильные (из них можно получить выражения «(1)+(1)» и «((1+1)+1)»);
  • скобочные последовательности «)(», «(» и «)» — неправильные.

Давайте определим инверсию скобочной последовательности следующим образом: заменить все скобки '(' на ')', и наоборот (все скобки ')' на '('). Например, строки «()((» и «)())» являются инверсиями друг друга.

Задана правильная скобочная последовательность \(s\). Ваша задача — посчитать количество таких пар целых чисел \((l,r)\) (\(1 \le l \le r \le |s|\)), что если заменить всю подстроку \(s\) с \(l\)-го символа по \(r\)-й символ (включительно) на ее инверсию, \(s\) все еще будет правильной скобочной последовательностью.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора содержит непустую правильную скобочную последовательность; она состоит только из символов '(' и/или ')'.

Дополнительное ограничение на входные данные: общая длина правильных скобочных последовательностей по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество пар \((l,r)\), удовлетворяющих условию задачи.

Примечание

В первом примере есть только одна пара:

  • \((2, 3)\): (()) \(\rightarrow\) ()().

Во втором примере подходящих пар нет.

В третьем примере есть три подходящих пары:

  • \((2, 3)\): ()()() \(\rightarrow\) (())();
  • \((4, 5)\): ()()() \(\rightarrow\) ()(());
  • \((2, 5)\): ()()() \(\rightarrow\) (()());

C. Манхэттенские перестановки

жадные алгоритмы Конструктив математика реализация Структуры данных *1300

Назовем манхэттенской величиной перестановки\(^{\dagger}\) \(p\) значение выражения \(|p_1 - 1| + |p_2 - 2| + \ldots + |p_n - n|\).

Например, для перестановки \([1, 2, 3]\) манхэттенская величина равна \(|1 - 1| + |2 - 2| + |3 - 3| = 0\), а для перестановки \([3, 1, 2]\) манхэттенская величина равна \(|3 - 1| + |1 - 2| + |2 - 3| = 2 + 1 + 1 = 4\).

Вам даны целые числа \(n\) и \(k\). Найдите такую перестановку \(p\) длины \(n\), что её манхэттенская величина равна \(k\) или определите, что такой перестановки не существует.

\(^{\dagger}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно число \(t\) (\(1 \leq t \leq 10^{4}\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 2 \cdot 10^{5}, 0 \le k \le 10^{12}\)) — длина перестановки и необходимая манхэттенская величина.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^{5}\).

Выходные данные

Для каждого набора входных данных, если не существует подходящей перестановки, выведите «No». В противном случае в первой строке выведите «Yes», а во второй строке выведите \(n\) различных целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \le p_i \le n\)) — подходящую перестановку.

Если существует несколько решений, выведите любое из них.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных подходит перестановка \([3, 1, 2]\), её манхэттенская величина равна \(|3 - 1| + |1 - 2| + |2 - 3| = 2 + 1 + 1 = 4\).

Во втором наборе входных данных можно доказать, что не существует перестановки длины \(4\) с манхэттенской величиной \(5\).

В третьем наборе входных данных подходит перестановка \([1,2,3,4,5,6,7]\), её манхэттенская величина равна \(|1-1|+|2-2|+|3-3|+|4-4|+|5-5|+|6-6|+|7-7|=0\).

D. Выборы

жадные алгоритмы математика реализация Структуры данных *1600

В Берляндии проходят выборы. На выборах участвуют \(n\) кандидатов, пронумерованных от \(1\) до \(n\). У \(i\)-го из них есть \(a_i\) фанатов, которые проголосуют за него. Также дополнительно есть \(c\) людей, которые не определились с любимым кандидатом, назовем их неопределившимися. Неопределившиеся люди проголосуют за кандидата с наименьшим номером.

На выборах побеждает кандидат, который набрал максимальное количество голосов, а если максимальное количество голосов набрали несколько кандидатов, то среди таких побеждает кандидат с наименьшим номером.

Такие выборы вам показались слишком скучными и предсказуемыми, поэтому вы решили не допустить некоторых кандидатов к ним. Если вы не допустите кандидата с номером \(i\) к выборам, то все \(a_i\) его фанатов станут неопределившимися, и на выборах проголосуют за допущенного кандидата с наименьшим номером.

Вам стало интересно узнать для каждого \(i\) от \(1\) до \(n\), какое минимальное количество кандидатов надо не допустить к выборам, чтобы кандидат с номером \(i\) выиграл выборы.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 2 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(c\) (\(1 \le n \le 2 \cdot 10^5\), \(0 \le c \le 10^9\)) — количество кандидатов на выборах и количество неопределившихся людей.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)) — количество фанатов у каждого кандидата.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел, \(i\)-е из которых должно быть равно минимальному количеству кандидатов, которых нужно не допустить к выборам, чтобы кандидат с номером \(i\) победил.

Примечание

В первом наборе входных данных:

  • Если допустить всех кандидатов, то кандидат с номером \(1\) наберёт \(3\) голоса (за него проголосует \(1\) неопределившийся человек), кандидат с номером \(2\) наберёт \(0\) голосов, кандидат с номером \(3\) наберёт \(3\) голоса. Таким образом, выиграет кандидат с номером \(1\) (он набрал столько же голосов, сколько кандидат \(3\), но его номер меньше), поэтому для него ответ равен \(0\).
  • Если не допустить кандидата с номером \(1\), то его \(2\) фаната станут неопределившимися. Тогда кандидат с номером \(2\) наберёт \(3\) голоса (за него проголосуют \(3\) неопределившихся человека) и кандидат с номером \(3\) наберёт \(3\) голоса. Таким образом, выиграет кандидат с номером \(2\) (он набрал столько же голосов, сколько кандидат \(3\), но его номер меньше), поэтому для него ответ равен \(1\).
  • Если не допустить кандидатов с номерами \(1\) и \(2\), то выиграет кандидат с номером \(3\), поэтому для него ответ равен \(2\).

Во втором наборе входных данных кандидат с номером \(1\) выиграет, если не допустить кандидата с номером \(2\).

E. Вычислительная машина

дп жадные алгоритмы Перебор реализация Структуры данных *2000

У Саши есть две бинарные строки \(s\) и \(t\) одинаковой длины \(n\), состоящие из символов 0 и 1.

Также есть вычислительная машина, которая умеет выполнять два вида операций с бинарными строками \(a\) и \(b\) одинаковой длины \(k\):

  1. Если \(a_{i} = a_{i + 2} =\) 0, то можно присвоить \(b_{i + 1} :=\) 1 (\(1 \le i \le k - 2\)).
  2. Если \(b_{i} = b_{i + 2} =\) 1, то можно присвоить \(a_{i + 1} :=\) 1 (\(1 \le i \le k - 2\)).

Саше стало интересно следующее: если рассмотреть строку \(a=s_ls_{l+1}\ldots s_r\) и строку \(b=t_lt_{l+1}\ldots t_r\), то какое максимальное количество символов 1 в строке \(a\) можно получить с помощью вычислительной машины. Так как Саша очень любознательный, но ленивый, то вам предстоит ответить на этот вопрос для нескольких интересующих его пар \((l_i, r_i)\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^{4}\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина строк \(s\) и \(t\).

Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\), состоящую из символов 0 и 1.

Третья строка каждого набора входных данных содержит бинарную строку \(t\) длины \(n\), состоящую из символов 0 и 1.

Четвертая строка каждого набора входных данных содержит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

\(i\)-я из следующих строк содержит два целых числа \(l_{i}\) и \(r_{i}\) (\(1 \le l_{i} \le r_{i} \le n\)) — границы \(i\)-й пары подстрок, которые интересуют Сашу.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\) и сумма \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) целых чисел — ответы на все запросы.

Примечание

В первом наборе входных данных:

  • В первом запросе \(a =\) 11, поэтому максимальное количество символов 1 равно \(2\).
  • Во втором запросе \(a =\) 111, поэтому максимальное количество символов 1 равно \(3\).

Во втором наборе входных данных:

  • В первом запросе \(a =\) 101 и \(b =\) 110. Никаких операций сделать нельзя, поэтому максимальное количество символов 1 равно \(2\).
  • Во втором запросе \(a =\) 1010 и \(b =\) 1101. Так как \(a_2 = a_4 =\) 0, то можно присвоить \(b_3 :=\) 1. Теперь \(b_1 = b_3 =\) 1, поэтому можно присвоить \(a_2 :=\) 1. Строка \(a\) стала равна 1110, поэтому максимальное количество символов 1 равно \(3\).

A. Угадай максимум

жадные алгоритмы Перебор реализация *800

Алиса и Боб придумали довольно странную игру. У них есть массив целых чисел \(a_1, a_2,\ldots, a_n\). Алиса выбирает некоторое целое число \(k\) и сообщает его Бобу, после чего происходит следующее:

  • Боб выбирает два целых числа \(i\) и \(j\) (\(1 \le i < j \le n\)), а затем ищет максимум среди чисел \(a_i, a_{i + 1},\ldots, a_j\);
  • Если полученный максимум строго больше \(k\), то побеждает Алиса, иначе Боб.

Помогите Алисе узнать максимальное \(k\), при котором она гарантированно побеждает.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(2 \le n \le 5 \cdot 10^4\)) — количество элементов в массиве.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2,\ldots, a_n\) (\(1 \le a_i \le 10^9\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное целое число \(k\), при котором Алиса гарантированно побеждает.

Примечание

В первом наборе входных данных всевозможные подотрезки, которые может выбрать Боб, выглядят следующим образом: \([2, 4], [2, 4, 1], [2, 4, 1, 7], [4, 1], [4, 1, 7], [1, 7]\). Максимумы на подотрезках соответственно равны \(4, 4, 7, 4, 7, 7\). Можно показать, что \(3\) является наибольшим целым числом, таким что любой из максимумов будет строго больше него.

В третьем наборе входных данных единственным отрезком, который может выбрать Боб, является \([1, 1]\). Поэтому ответ равен \(0\).

E. Манхэттенский треугольник

Бинарный поиск геометрия Конструктив реализация Структуры данных *2400

Манхэттенским расстоянием между двумя точками \((x_1, y_1)\) и \((x_2, y_2)\) называется величина, равная: \(\)|x_1 - x_2| + |y_1 - y_2|.\(\)

Назовем манхэттенским треугольником три точки на плоскости, манхэттенские расстояния между каждой парой из которых равны.

Вам дан набор попарно различных точек и четное целое число \(d\). Ваша задача — найти любой манхэттенский треугольник, составленный из трёх различных точек данного набора, у которого манхэттенское расстояние между любой парой вершин равно \(d\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(d\) (\(3 \le n \le 2 \cdot 10^5\), \(2 \le d \le 4 \cdot 10^5\), \(d\) — чётное) — количество точек и требуемое манхэттенское расстояние между вершинами треугольника.

\((i + 1)\)-я строка каждого набора входных данных содержит два целых числа \(x_i\) и \(y_i\) (\(-10^5 \le x_i, y_i \le 10^5\)) — координаты \(i\)-й точки. Гарантируется, что все точки попарно различны.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, выведите три целых попарно различных целых числа \(i\), \(j\) и \(k\) (\(1 \le i,j,k \le n\)) — индексы точек, образующих манхэттенский треугольник. Если ответа не существует, выведите «\(0\ 0\ 0\)» (без кавычек).

Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных:

Точки \(A\), \(B\) и \(F\) образуют манхэттенский треугольник, манхэттенское расстояние между каждой парой вершин равно \(4\). Точки \(D\), \(E\) и \(F\) также могут быть ответом.

В третьем наборе входных данных:

Точки \(A\), \(C\) и \(E\) образуют манхэттенский треугольник, манхэттенское расстояние между каждой парой вершин равно \(6\).

В четвертом наборе входных данных не существует двух точек, манхэттенское расстояние между которыми равно \(4\), а следовательно подходящего манхэттенского треугольника не существует.

A. О микробах

математика реализация *1700

Взявшись за очередное правительственное задание, рейнджер Йцукен прибыл на планету Марс. В стенах секретной лаборатории рейнджеру нужно провести несколько опытов над бактериями, обладающими странными аномальными свойствами. Работа несложная, но за нее обещали хорошо заплатить.

В начале первого опыта в пробирке находится одна бактерия. Каждую секунду каждая из бактерий в пробирке делится на k бактерий, после чего, в силу аномальных эффектов, в пробирке материализуются еще b бактерий. Таким образом, если в начале какой-либо секунды было x бактерий, то к концу этой секунды становится kx + b бактерий.

Как показал опыт, через n секунд бактерий стало ровно z, и на этом эксперимент завершился.

В ходе второго опыта пробирка будет продезинфицирована, после чего туда будет помещено t бактерий. Йцукен еще не начал проводить опыт, но ему уже интересно, через сколько секунд бактерий станет не меньше, чем z? Рейнджер считает, что бактерии будут делиться по такому же правилу, как и в первом опыте.

Помогите Йцукену, найдите наименьшее количество секунд, через которое количество бактерий во втором опыте станет не меньше, чем z.

Входные данные

В первой строке через пробел записаны четыре целых числа k, b, n и t (1 ≤ k, b, n, t ≤ 106) — параметры размножения бактерий, время, через которое в пробирке оказалось z бактерий в первом опыте, и начальное количество бактерий во втором опыте, соответственно.

Выходные данные

Выведите одно число — наименьшее количество секунд, через которое бактерий станет не меньше, чем z.

D. НОД-последовательность

жадные алгоритмы математика реализация теория чисел *1400

НОД (наибольший общий делитель) двух целых чисел \(x\) и \(y\) — это такое максимальное целое число \(z\), на которое нацело делятся и \(x\), и \(y\). Например, \(НОД(36, 48) = 12\), \(НОД(5, 10) = 5\), а \(НОД(7,11) = 1\).

У Кристины есть массив \(a\), состоящий ровно из \(n\) целых положительных чисел. Она хочет посчитать НОД каждой соседней пары чисел, чтобы получить новый массив \(b\), называемый НОД-последовательностью.

Таким образом, элементы НОД-последовательности \(b\) будут вычисляться по формуле \(b_i = НОД(a_i, a_{i + 1})\) для \(1 \le i \le n - 1\).

Определите, можно ли удалить из массива \(a\) ровно одно число, чтобы НОД-последовательность \(b\) получилась неубывающей (то есть, всегда было верно \(b_i \le b_{i+1}\))

Например, пусть у Кристины был массив \(a\) = [\(20, 6, 12, 3, 48, 36\)]. Если она удалит из него \(a_4 = 3\) и посчитает НОД-последовательность \(b\), то получит:

  • \(b_1 = НОД(20, 6) = 2\)
  • \(b_2 = НОД(6, 12) = 6\)
  • \(b_3 = НОД(12, 48) = 12\)
  • \(b_4 = НОД(48, 36) = 12\)
Полученная НОД-последовательность \(b\) = [\(2,6,12,12\)] является неубывающей, так как \(b_1 \le b_2 \le b_3 \le b_4\).
Входные данные

Первая строка входных данных содержит единственное число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных в тесте.

Далее следуют описания наборов входных данных.

Первая строка каждого набора содержит единственное целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — количество элементов в массиве \(a\).

Вторая строка каждого набора содержит ровно \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 10^9\)) — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам не превосходит \(2 \cdot 10^5\).

Выходные данные

Выведите:

  • «YES», если можно удалить из массива \(a\) ровно одно число так, чтобы НОД-последовательность \(b\) получилась неубывающей;
  • «NO» в противном случае.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

Первый набор входных данных разобран в условии задачи.

E. Перестановка строк и столбцов

жадные алгоритмы Конструктив математика матрицы реализация сортировки Структуры данных хэши *1600

У вас была матрица \(a\) размера \(n\) на \(m\), содержащая перестановку целых чисел от \(1\) до \(n \cdot m\).

Перестановкой из \(n\) целых чисел называется массив, содержащий все числа от \(1\) до \(n\) ровно один раз. Например, массивы \([1]\), \([2, 1, 3]\), \([5, 4, 3, 2, 1]\) являются перестановками, а массивы \([1, 1]\), \([100]\), \([1, 2, 4, 5]\) — нет.

Матрица содержит перестановку, если при выписывании всех её элементов полученный массив является перестановкой. Матрицы \([[1, 2], [3, 4]]\), \([[1]]\), \([[1, 5, 3], [2, 6, 4]]\) содержат перестановки, а матрицы \([[2]]\), \([[1, 1], [2, 2]]\), \([[1, 2], [100, 200]]\) — нет.

За одну операцию вы можете совершить одно из двух следующих действий:

  • выбрать столбец \(c\) и столбец \(d\) (\(1 \le c, d \le m\), \(c \ne d\)) и поменять эти столбцы местами;
  • выбрать строку \(c\) и строку \(d\) (\(1 \le c, d \le n\), \(c \ne d\)) и поменять эти строки местами.

Вы можете совершить любое количество операций.

Вам даны исходная матрица \(a\) и матрица \(b\). Ваша задача — определить, можно ли с помощью данных операций сделать из матрицы \(a\) матрицу \(b\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит \(2\) целых числа \(n\) и \(m\) (\(1 \le n, m \le n \cdot m \le 2 \cdot 10^5\)) — размеры матрицы.

Следующие \(n\) строк содержат по \(m\) целых чисел \(a_{ij}\) каждая (\(1 \le a_{ij} \le n \cdot m\)). Гарантируется, что матрица \(a\) является перестановкой.

Следующие \(n\) строк содержат по \(m\) целых чисел \(b_{ij}\) каждая (\(1 \le b_{ij} \le n \cdot m\)). Гарантируется, что матрица \(b\) является перестановкой.

Гарантируется, что сумма значений \(n \cdot m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если вторая матрица может быть получена из первой, и «NO» в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Во втором примере исходная матрица выглядит так:

\( \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} \)

При обмене строк \(1\) и \(2\) местами она станет такой:

\( \begin{pmatrix} 3 & 4 \\ 1 & 2 \end{pmatrix} \)

При обмене столбцов \(1\) и \(2\) местами она станет равна матрице \(b\):

\( \begin{pmatrix} 4 & 3 \\ 2 & 1 \end{pmatrix} \)

C. Черепаха и неполная последовательность

битмаски жадные алгоритмы Конструктив математика Перебор реализация *1800

Черепаха играла с последовательностью \(a_1, a_2, \ldots, a_n\), состоящей из положительных целых чисел. К сожалению, некоторые числа пропали во время игры.

Теперь последовательность стала неполной. Может существовать произвольное количество индексов \(i\), таких что \(a_i\) становится \(-1\). Пусть новая последовательность будет \(a'\).

Черепаха грустит. Но Черепаха помнит, что для каждого целого числа \(i\) от \(1\) до \(n - 1\), либо \(a_i = \left\lfloor\frac{a_{i + 1}}{2}\right\rfloor\), либо \(a_{i + 1} = \left\lfloor\frac{a_i}{2}\right\rfloor\) выполняется для исходной последовательности \(a\).

Черепаха хочет, чтобы вы помогли ей завершить последовательность. Но иногда Черепаха ошибается, поэтому вам нужно сказать ей, если вы не можете завершить последовательность.

Формально, вам нужно найти другую последовательность \(b_1, b_2, \ldots, b_n\), состоящую из положительных целых чисел, такую что:

  • Для каждого целого числа \(i\) от \(1\) до \(n\), если \(a'_i \ne -1\), то \(b_i = a'_i\).
  • Для каждого целого числа \(i\) от \(1\) до \(n - 1\), либо \(b_i = \left\lfloor\frac{b_{i + 1}}{2}\right\rfloor\), либо \(b_{i + 1} = \left\lfloor\frac{b_i}{2}\right\rfloor\) выполняется.
  • Для каждого целого числа \(i\) от \(1\) до \(n\), \(1 \le b_i \le 10^9\).

Если не существует последовательности \(b_1, b_2, \ldots, b_n\), которая удовлетворяет всем условиям выше, вам нужно сообщить \(-1\).

Входные данные

Каждый тест содержит несколько тестовых случаев. Первая строка содержит количество тестов \(t\) (\(1 \le t \le 10^5\)). Затем следует описание тестов.

Первая строка каждого теста содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — длина последовательности.

Вторая строка каждого теста содержит \(n\) целых чисел \(a'_1, a'_2, \ldots, a'_n\) (\(a'_i = -1\) или \(1 \le a'_i \le 10^8\)) — элементы последовательности \(a'\).

Гарантируется, что сумма \(n\) по всем тестовым случаям не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого теста, если не существует последовательности \(b_1, b_2, \ldots, b_n\), которая удовлетворяет всем условиям, выведите одно целое число \(-1\).

В противном случае выведите \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) — элементы последовательности \(b_1, b_2, \ldots, b_n\), которую вы нашли. Последовательность должна удовлетворять условию \(1 \le b_i \le 10^9\) для каждого целого числа \(i\) от \(1\) до \(n\). Если есть несколько ответов, выведите любой из них.

Примечание

В первом тесте, \([4, 2, 1, 2, 1, 2, 1, 3]\) также может быть ответом, в то время как \([4, 2, 5, 10, 5, 2, 1, 3]\) и \([4, 2, 1, 2, 1, 2, 1, 4]\) не могут.

Во втором тесте, \([1, 2, 5, 2]\) также может быть ответом.

С четвертого по шестой тесты, можно показать, что ответа нет, поэтому вы должны вывести \(-1\).

A. Футбол

жадные алгоритмы математика реализация сортировки *800

Дима очень любит смотреть футбол. В такой игре счет на табло представляется как \(x\) : \(y\), где \(x\) — количество голов первой команды, а \(y\) — количество голов второй команды. В один момент времени только одна команда может забить гол, то есть счет \(x\) : \(y\) может измениться или на \((x + 1)\) : \(y\), или на \(x\) : \((y + 1)\).

Во время просмотра очередного матча по футболу Диму отвлекли по очень важным делам, и после некоторого количества времени он продолжил смотреть матч. Дима помнит, какой счет был до того, как его отвлекли, и какой был, когда он вернулся. Теперь Диму интересует вопрос: могли ли в матче, пока он не смотрел игру, так развиваться события, что команды ни разу не имели равного счета?

Гарантируется, что у двух команд не было равного счета ни в тот момент, когда Дима перестал смотреть игру, ни в тот, когда он вернулся. Однако возможен такой случай, что за время его отсутствия счет не поменялся.

Помогите Диме и ответьте на вопрос!

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^{4}\)) количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора данных содержит два целых числа \(x_{1}, y_{1}\) (\(0 \le x_{1}, y_{1} \le 10^{9}\), \(x_{1} \neq y_{1}\)) — счет, который запомнил Дима, до того как его отвлекли.

Вторая строка каждого набора данных содержит два целых числа \(x_{2}, y_{2}\) (\(x_{1} \le x_{2} \le 10^{9}\), \(y_{1} \le y_{2} \le 10^{9}\), \(x_{2} \neq y_{2}\)) — счет, когда Дима вернулся.

Выходные данные

Для каждого набора входных данных выведите «YES» без кавычек, если могло быть такое, что команды не имели равного счета, иначе выведите «NO» без кавычек.

Вы можете вывести каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ).

Примечание

В первом наборе данных счет, который запомнил Дима, \(1\) : \(0\), как только он перестает следить за матчем, первая команда забивает несколько голов подряд, пока счет не становится \(5\) : \(0\), поэтому ответ YES.

Во втором наборе данных счет мог изменяться только так:

  • \(1\) : \(2\)
  • \(2\) : \(2\)
  • \(3\) : \(2\)

В этом варианте есть момент, в котором команды имеют равный счет, поэтому ответ NO.

В третьем наборе данных один из вариантов развития событий:

  • \(1\) : \(2\)
  • \(1\) : \(3\)
  • \(2\) : \(3\)
  • \(2\) : \(4\)
  • \(2\) : \(5\)
  • \(3\) : \(5\)
  • \(4\) : \(5\)

В таком варианте не существовало момента времени, где счет был равный, поэтому ответ YES.

B. Гипотеза Коллатца

математика Перебор реализация теория чисел *1200

Недавно первокурсник Максим узнал о гипотезе Коллатца, однако он плохо слушал лекцию, поэтому считает, что в гипотезе упоминается следующий процесс:

Существует переменная \(x\) и константа \(y\). Далее \(k\) раз происходит следующая операция:

  • увеличить \(x\) на \(1\), затем,
  • пока число \(x\) делится нацело на \(y\), делить его на \(y\).
Обратите внимание, что оба этих действия выполняются последовательно в рамках одной операции.

Например, если число \(x = 16\), \(y = 3\) и \(k = 2\), то после одной операции \(x\) станет равен \(17\), а после еще одной операции \(x\) будет равен \(2\), так как после прибавления единицы \(x = 18\) делится два раза на \(3\).

По данным начальным значениям \(x\), \(y\) и \(k\) Максим хочет узнать, какое число \(x\) в итоге получится.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^{4}\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора данных содержит три целых числа \(x\), \(y\) и \(k\) (\(1 \le x, k \le 10^{9}\), \(2 \le y \le 10^{9}\)) — начальная переменная, константа и количество операций.

Выходные данные

Для каждого набора входных данных выведите одно целое число — число, которое получится после применения \(k\) операций.

Примечание

В первом наборе входных данных всего одна операция, которая применяется к \(x = 1\), в результате \(x\) становится равен \(2\).

Во втором наборе входных данных к \(x = 2\) в рамках одной операции прибавляется единица и \(x\) делится на \(y = 3\), в результате \(x\) становится равен \(1\).

В третьем наборе данных \(x\) изменяется так:

  • После первой операции \(x = 1\), так как \(24 + 1 = 25\) и \(25\) делится на \(y = 5\) дважды в рамках одной операции.
  • После второй операции \(x = 2\).
  • После третьей операции \(x = 3\).
  • После четвертой операции \(x = 4\).
  • После пятой операции \(x = 1\).

D. Красота гор

математика Перебор реализация Структуры данных теория чисел *1700

Никита любит горы и наконец-то решил посетить Берляндский горный хребет! Хребет был настолько красив, что Никита решил запечатлеть его на карте. Карта представляет собой таблицу из \(n\) строк и \(m\) столбцов, в каждой клетке записано целое неотрицательное число — высота этой горы.

Также он заметил, что горы бывают двух типов:

  • Со снежными шапками.
  • Без снежных шапок.

Никита — человек очень прагматичный. Он хочет, чтобы сумма всех высот гор со снежными шапками была равна сумме высот гор без них. Он договорился с мэром Берляндии, самим Поликарпом Поликарповичем, чтобы тот разрешил ему трансформировать ландшафт.

Никита может проводить трансформации подматриц размером \(k \times k\) следующим образом: к высотам гор, попавших в этот участок, прибавляется целочисленная константа \(c\), но при этом тип гор не меняется. При этом константу \(c\) Никита может выбирать для каждой трансформации независимо от предыдущих. Обратите внимание, что \(c\) может быть отрицательной.

Прежде чем производить трансформации, Никита просит у вас узнать, возможно ли добиться равенства сумм, или это сделать невозможно. Неважно, какой ценой, даже если горы превратятся в каньоны и будут иметь отрицательную высоту.

Если на карте представлен только один тип гор, то сумма высот другого типа гор принимается равной нулю.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \le t \le 10^{4}\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n, m, k\) (\(1 \le n, m \le 500, 1 \le k \le min(n, m)\)).

Следующие \(n\) строк каждого набора входных данных содержат по \(m\) целых чисел \(a_{i j}\) (\(0 \le a_{i j} \le 10^{9}\)) — изначальные высоты гор.

Следующие \(n\) бинарных строк длины \(m\) каждого набора входных данных определяют тип гор, '\(0\)' — со снежными шапками, '\(1\)' — без них.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превышает \(250\,000\).

Выходные данные

Для каждого набора входных данных выведите «YES» без кавычек, если можно уравнять суммы высот гор, иначе выведите «NO» без кавычек. Вы можете вывести каждую букву в любом регистре (например, «YES», «Yes», «yes», «yEs» будут распознаны как положительный ответ).

Примечание

Горный массив из первого набора данных выглядит так:

Изначально сумма высот гор со снежными шапками равна \(11 + 3 + 4 + 3 + 0 + 1 + 15 = 37\), а без них \(7 + 2 = 9\).

Чтобы уравнять эти суммы, мы можем выполнить две трансформации:

Первая трансформация:

Обратите внимание, что константа \(c\) может быть отрицательной.

После первой трансформации горный массив выглядит так:

Вторая трансформация:

В результате горный массив выглядит так:

Сумма высот гор со снежными шапками равна \(17 + 9 + 9 - 16 - 20 - 19 + 15 = -5\), а без них \(7 - 12 = -5\), таким образом ответ YES.

B. Поворот угла

жадные алгоритмы Конструктив математика реализация *1200

Вам даны две таблицы \(a\) и \(b\) с \(n\) строками и \(m\) столбцами. Все значения в таблицах равны \(0\), \(1\) или \(2\).

Вы можете выполнить следующую операцию над \(a\) любое количество раз:

  • Выберите в таблице любой подпрямоугольник с длиной и шириной \(\ge 2\). Вы можете выбрать в качестве подпрямоугольника всю таблицу.
  • У подпрямоугольника есть четыре угла. Выберите любую пару диагонально противоположных углов выбранного подпрямоугольника и прибавьте к их значениям \(1\) по модулю \(3\).
  • Для оставшейся пары углов, прибавьте к их значениям \(2\) по модулю \(3\).

Обратите внимание, что эта операция изменяет значения только углов выбранного подпрямоугольника.

Можно ли преобразовать таблицу \(a\) в таблицу \(b\), применив описанную выше операцию любое количество раз (возможно, ноль)?

Входные данные

Первая строка содержит целое число \(t\) — количество наборов входных данных (\(1 \le t \le 250\)).

Для каждого набора входных данных:

Первая строка содержит два целых числа \(n\) и \(m\) — количество строк и столбцов в таблицах (\(2 \le n,m \le 500\)).

Каждая из следующих n строк содержат по m символов — \(j\)-й символ \(i\)-й строки равен \(a_{i,j}\).

Каждая из следующих n строк содержат по m символов — \(j\)-й символ \(i\)-й строки равен \(b_{i,j}\) (\(0 \le a_{i,j}, b_{i,j} \le 2\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных и сумма \(m\) по всем наборам входных данных не превосходят \(500\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если возможно преобразовать таблицу \(a\) в таблицу \(b\), и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных таблица \(a\) может быть преобразована в \(b\) следующим образом:

\(\begin{matrix}\fbox{0} & 0 & \fbox{0}\\ 0 & 0 & 0\\ \fbox{0} & 0 & \fbox{0}\end{matrix} \Rightarrow \begin{matrix}1 & 0 & 2\\ 0 & \fbox{0} & \fbox{0}\\ 2 & \fbox{0} & \fbox{1}\end{matrix} \Rightarrow \begin{matrix}1 & 0 & 2\\ \fbox{0} & \fbox{1} & 2\\ \fbox{2} & \fbox{2} & 2\end{matrix} \Rightarrow \begin{matrix}1 & \fbox{0} & \fbox{2}\\ 1 & 0 & 2\\ 1 & \fbox{0} & \fbox{2}\end{matrix} \Rightarrow \begin{matrix}1 & 1 & 1\\ 1 & \fbox{0} & \fbox{2}\\ 1 & \fbox{2} & \fbox{0}\end{matrix} \Rightarrow \begin{matrix}1 & 1 & 1\\ 1 & 1 & 1\\ 1 & 1 & 1\end{matrix}\)

Здесь в каждой операции верхний правый и нижний левый углы, выделенные рамкой, увеличиваются на \(2\) по модулю \(3\), а верхний левый и нижний правый углы увеличиваются на \(1\) по модулю \(3\).

Для четвертого набора входных данных можно показать, что невозможно преобразовать таблицу \(a\) в таблицу \(b\) с помощью любого числа вышеупомянутых операций.

C. Трое в лодке, не считая торт

Бинарный поиск жадные алгоритмы Перебор реализация *1400

Алиса, Боб и Чарли хотят разделить прямоугольный торт, разрезанный на \(n\) частей. Каждый считает, что каждый кусок торта имеет определённую ценность. Алиса считает, что \(i\)-й кусок имеет ценность \(a_i\), Боб — \(b_i\), а Чарли — \(c_i\).

Суммы всех \(a_i\), всех \(b_i\) и всех \(c_i\) по отдельности одинаковы и равны \(tot\).

Учитывая ценности каждого куска торта для каждого человека, нужно дать каждому человеку несколько подряд идущих кусков торта. Другими словами, индексы левых и правых концов этих подотрезков (номера кусков, отданных определённому человеку) можно представить как \((l_a, r_a)\), \((l_b, r_b)\) и \((l_c, r_c)\) для Алисы, Боба и Чарли соответственно. Разбиение должно удовлетворять следующим условиям:

  • Ни один кусок не отдан более чем одному человеку, т.е. никакие два подотрезка из \([l_a,\ldots,r_a]\), \([l_b, \ldots, r_b]\) и \([l_c, \ldots, r_c]\) не пересекаются.
  • Каждая из трёх сумм \( \sum_{i = l_a}^{r_a} a_i, \sum_{i = l_b}^{r_b} b_i, \sum_{i = l_c}^{r_c} c_i \geq \lceil \frac{tot}{3} \rceil\).

Здесь запись \(\lceil \frac{a}{b} \rceil\) обозначает деление с округлением вверх. Результат равен наименьшему целому числу, большему или равному результату точного деления \(a\) на \(b\). Иными словами, результат деления округляется вверх до ближайшего целого. Например, \(\lceil \frac{10}{3} \rceil = 4\) и \(\lceil \frac{15}{3} \rceil = 5\).

Входные данные

Первая строка содержит целое число \(t\) — количество наборов входных данных (\(1 \le t \le 10^4\))

Для каждого набора входных данных:

Первая строка содержит целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)).

Следующие три строки содержат по \(n\) целых чисел:

Одна строка с \(n\) целыми числами \(a_1, a_2, \ldots, a_n\) представляет ценности для Алисы (\(1 \le a_i \le 10^6\)).

Следующая строка с \(n\) целыми числами \(b_1, b_2, \ldots, b_n\) представляет ценности для Боба (\(1 \le b_i \le 10^6\)).

Следующая строка с \(n\) целыми числами \(c_1, c_2, \ldots, c_n\) представляет ценности для Чарли (\(1 \le c_i \le 10^6\)).

Гарантируется, что \( \sum_{i = 1}^{n} a_i = \sum_{i = 1}^{n} b_i = \sum_{i = 1}^{n} c_i\).

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(-1\), если искомые подотрезки не существуют.

В противном случае выведите шесть чисел: \(l_a, r_a, l_b, r_b, l_c, r_c\) — соответствующие начальные и конечные индексы (в \(1\)-индексации) подотрезков для Алисы, Боба и Чарли соответственно.

Примечание

В первом наборе входных данных сумма каждого из трех массивов равна \(9\). Каждому человеку нужна часть торта, соответствующая подотрезку с суммарной ценностью не менее \(\lceil \frac{9}{3} \rceil = 3\).

Если мы назначим подотрезок (\(1\),\(1\)) Алисе, то его общая ценность для нее составит \(5\), что \(\ge 3\); назначим подотрезок (\(2\),\(3\)) Бобу, общая ценность для него составит \(1 + 5 = 6\), что \(\ge 3\); и назначим подотрезок (\(4\),\(5\)) Чарли, общая ценность для него составит \(1 + 5 = 6\), что также \(\ge 3\). Каждый человек получает свои куски торта, и ни один кусок не является общим для двух или более человек.

Можно показать, что для третьего набора входных данных невозможно раздать кусочки торта таким образом, чтобы удовлетворить заданным условиям.

B. Большое сложение

математика реализация *1100

Цифра называется большой, если она находится между \(5\) и \(9\), включительно. Целое положительное число называется большим, если все его цифры большие.

Вам дано целое число \(x\). Может ли оно быть представлено в виде суммы двух больших целых положительных чисел с одинаковым количеством цифр?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит одно целое число \(x\) (\(10 \leq x \leq 10^{18}\)).

Выходные данные

Для каждого набора входных данных выведите \(\texttt{YES}\), если \(x\) удовлетворяет условию, и \(\texttt{NO}\) в противном случае.

Вы можете выводить каждую букву \(\texttt{YES}\) или \(\texttt{NO}\) в любом регистре (строчную или заглавную). Например, строки \(\texttt{yEs}\), \(\texttt{yes}\) и \(\texttt{Yes}\) будут приняты как положительный ответ.

Примечание

В первом наборе входных данных можно получить \(658 + 679 = 1337\).

Во втором наборе входных данных можно показать, что никакие числа одинаковой длины, состоящие только из больших цифр, не могут дать в сумме \(200\).

В третьем наборе входных данных мы можем получить \(696\,969 + 696\,969 = 1\,393\,938\).

В четвертом наборе входных данных мы можем получить \(777 + 657 = 1434\).

D. Задача про строку "a"

математика Перебор реализация Строки строковые суфф. структуры хэши *2000

Вам дана строка \(s\), состоящая из строчных латинских букв. Подсчитайте количество непустых строк \(t \neq\) «\(\texttt{a}\)», таких, что можно разбить\(^{\dagger}\) \(s\) на некоторые подстроки, удовлетворяющие следующим условиям:

  • каждая подстрока равна либо \(t\), либо «\(\texttt{a}\)», и
  • хотя бы одна подстрока равна \(t\).

\(^{\dagger}\) Разбиение строки \(s\) — это упорядоченная последовательность некоторых \(k\) строк \(t_1, t_2, \ldots, t_k\) (называемых подстроками), таких, что \(t_1 + t_2 + \ldots + t_k = s\), где \(+\) обозначает операцию конкатенации строк.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит строку \(s\), состоящую из строчных латинских букв (\(2 \leq |s| \leq 2 \cdot 10^5\)).

Гарантируется, что сумма \(|s|\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество непустых строк \(t \neq\) «\(\texttt{a}\)», удовлетворяющих всем ограничениям.

Примечание

В первом наборе входных данных \(t\) может быть «\(\texttt{aa}\)», «\(\texttt{aaa}\)», «\(\texttt{aaaa}\)» или всей строкой.

Во втором наборе входных данных \(t\) может быть «\(\texttt{b}\)», «\(\texttt{bab}\)», «\(\texttt{ba}\)» или всей строкой.

В третьем наборе входных данных единственной подходящей \(t\) является вся строка.

G. Магический трюк II

Конструктив реализация сортировки *3200

Секрет первого фокуса Оскара раскрыт! Поскольку он все еще хочет произвести впечатление на Луру, ему пришла в голову новая идея: он по-прежнему хочет отсортировать перестановку \(p_1, p_2, \ldots, p_n\) из \([1, 2, \ldots, n]\).

На этот раз он выбирает целое число \(k\). Он хочет отсортировать перестановку в неубывающем порядке, используя следующую операцию несколько раз:

  1. Выбрать непрерывный подмассив длины \(k\) и удалить его из \(p\).
  2. Вставить непрерывный подмассив обратно в \(p\) на любую позицию (возможно, в самое начало или в самый конец).

Чтобы произвести впечатление, Оскар хочет выбрать максимальное значение \(k\), при котором он сможет отсортировать свою перестановку. Пожалуйста, помогите ему найти максимальное значение \(k\), а также последовательность операций, которые отсортируют перестановку. Вам не нужно минимизировать количество операций, но разрешается использовать не более \(5n^2\) операций.

Можно доказать, что для максимального \(k\), при котором перестановку можно отсортировать за любое количество операций, ее также можно отсортировать за не более чем \(5n^2\) операций.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(5 \leq n \leq 10^3\)) — длина перестановки.

Вторая строка каждого набора входных данных содержит перестановку \(p_1, p_2, \ldots, p_n\) из \([1, 2, \ldots, n]\).

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\).

Выходные данные

Для каждого набора входных данных сначала выведите в отдельной строке выбранное значение \(k\) (\(1 \leq k \leq n\)).

Затем выведите одно целое число \(m\) — количество использованных операций (\(0 \leq m \leq 5n^2\)).

Затем в каждой из следующих \(m\) строк выведите операции, обозначенные двумя целыми числами \(i\) и \(j\) (\(1 \leq i, j \leq n - k + 1\)), представляющие собой операции удаления подмассива, начинающегося с индекса \(i\), и его вставки обратно в \(p\), начиная с индекса \(j\).

Примечание

В первом наборе входных данных достаточно переместить последние четыре числа в начало.

Во втором наборе входных данных можно показать, что мы не можем отсортировать перестановку при \(k = 4\) или \(k = 5\). При \(k = 3\) мы можем переместить первые три числа в конец, а затем средние три —- в начало, чтобы отсортировать перестановку.

В третьем наборе входных данных перестановка уже отсортирована. Мы можем выбрать \(k = 6\) и не использовать никаких операций.

A. Создание слов

реализация Строки *800

Мэттью получил две строки \(a\) и \(b\), обе длиной \(3\). Ему кажется особенно забавным создать два новых слова, поменяв местами первый символ \(a\) с первым символом \(b\). Он хочет, чтобы вы вывели \(a\) и \(b\) после обмена.

Обратите внимание, что новые слова не обязательно будут разными.

Входные данные

Первая строка содержит \(t\) (\(1 \leq t \leq 100\))  — количество наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит две строки, разделенные пробелом, \(a\) и \(b\), обе длиной \(3\). Строки содержат только строчные латинские буквы.

Выходные данные

Для каждого набора входных данных после обмена выведите \(a\) и \(b\), разделенные пробелом.

D. Манхэттенский круг

математика реализация *900

Дана матрица размера \(n\) на \(m\), состоящая из символов '.' и '#'. На сетке существует целый манхэттенский круг. Левый верхний угол сетки имеет координаты \((1,1)\), а правый нижний угол имеет координаты \((n, m)\).

Точка (\(a, b\)) принадлежит манхэттенскому кругу с центром в точке (\(h, k\)), если \(|h - a| + |k - b| < r\), где \(r\) — положительная константа.

В матрице точки, которые являются частью манхэттенского круга, обозначены символом '#'. Найдите координаты центра круга.

Входные данные

Первая строка содержит \(t\) (\(1 \leq t \leq 1000\))  — количество наборов входных данных.

Первая строка каждого набора содержит \(n\) и \(m\) (\(1 \leq n \cdot m \leq 2 \cdot 10^5\)) — высоту и ширину сетки соответственно.

Следующие \(n\) строк содержат \(m\) символов '.' или '#'. Если символ '#', то точка является частью манхэттенского круга.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\), и на сетке существует целый манхэттенский круг.

Выходные данные

Для каждого набора входных данных выведите два целых числа, координаты центра круга.

H1. Максимизация наибольшей компоненты (простая версия)

графы Перебор поиск в глубину и подобное реализация снм Структуры данных *1700

Простая и сложная версии фактически представляют собой разные задачи, поэтому внимательно прочитайте условия обеих задач. Единственное различие между двумя версиями — это применяемая операция.

У Алекса есть матрица из \(n\) строк и \(m\) столбцов, состоящая из символов '.' и '#'. Набор '#' ячеек формирует компоненту связности, если из любой ячейки в этом наборе можно достичь любую другую ячейку в этом наборе, перемещаясь только в другую ячейку набора, которая имеет общую сторону. Размер компоненты связности — это количество ячеек в наборе.

За одну операцию Алекс выбирает любую строку \(r\) (\(1 \le r \le n\)) или любой столбец \(c\) (\(1 \le c \le m\)), затем устанавливает каждую ячейку в строке \(r\) или столбце \(c\) равной '#'. Помогите Алексу найти максимально возможный размер наибольшей компоненты связности из ячеек '#', который он может достичь после выполнения операции не более одного раза.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n \cdot m \le 10^6\)) — количество строк и столбцов матрицы.

Следующие \(n\) строк содержат по \(m\) символов. Каждый символ может быть '.' или '#'.

Гарантируется, что сумма \(n \cdot m\) по всем наборам не превышает \(10^6\).

Выходные данные

Для каждого теста выведите одно целое число — максимально возможный размер компоненты связности из ячеек '#', который может достичь Алекс.

Примечание

Во втором примере для Алекса оптимально установить все ячейки в столбце \(2\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(6\).

В третьем примере для Алекса оптимально установить все ячейки в строке \(2\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(9\).

В четвертом примере для Алекса оптимально установить все ячейки в строке \(4\) равными '#'. Это приведет к тому, что наибольшая компонента связности из '#' будет иметь размер \(11\).

H2. Максимизация наибольшей компоненты (сложная версия)

дп поиск в глубину и подобное реализация снм Структуры данных *2200

Простая и сложная версии фактически представляют собой разные задачи, поэтому внимательно прочитайте условия обеих задач. Единственное различие между двумя версиями — это применяемая операция.

У Алекса есть матрица из \(n\) строк и \(m\) столбцов, состоящая из символов '.' и '#'. Набор '#' ячеек формирует компоненту связности, если из любой ячейки в этом наборе можно достичь любую другую ячейку в этом наборе, перемещаясь только в другую ячейку набора, которая имеет общую сторону. Размер компоненты связности — это количество ячеек в наборе.

За одну операцию Алекс выбирает любую строку \(r\) (\(1 \le r \le n\)) и любой столбец \(c\) (\(1 \le c \le m\)), затем устанавливает каждую ячейку в строке \(r\) и столбце \(c\) равной '#'. Помогите Алексу найти максимально возможный размер наибольшей компоненты связности из ячеек '#', который он может достичь после выполнения операции не более одного раза.

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(m\) (\(1 \le n \cdot m \le 10^6\)) — количество строк и столбцов матрицы.

Следующие \(n\) строк содержат по \(m\) символов. Каждый символ может быть '.' или '#'.

Гарантируется, что сумма \(n \cdot m\) по всем наборам не превышает \(10^6\).

Выходные данные

Для каждого теста выведите одно целое число — максимально возможный размер связного компонента из ячеек '#', который может достичь Алекс.

Примечание

В четвертом тесте для Алекса оптимально установить все ячейки в строке \(4\) и столбце \(2\) равными '#'. Это приведет к наибольшей компоненте связности из ячеек '#' размером \(16\).

В пятом тесте для Алекса оптимально установить все ячейки в строке \(2\) и столбце \(4\) равными '#'. Это приведет к наибольшей компоненте связности из ячеек '#' размером \(22\).

D. Математическая проблема

дп жадные алгоритмы математика Перебор реализация *1400

Вам дана строка \(s\) длины \(n > 1\), состоящая из цифр от \(0\) до \(9\). Вы должны вставить в эту строку ровно \(n - 2\) знака \(+\) (сложение) или \(\times\) (умножение), чтобы получилось корректное арифметическое выражение.

В этой задаче нельзя, чтобы знаки были перед первым или после последнего символа строки \(s\), а также не может быть записано два каких-либо знака подряд. Также обращаем ваше внимание на то, что вы не меняете порядок цифр в строке. Рассмотрим \(s = 987009\):

  • Из этой строки можно получить следующие математические выражения: \(9 \times 8 + 70 \times 0 + 9 = 81\), \(98 \times 7 \times 0 + 0 \times 9 = 0\), \(9 + 8 + 7 + 0 + 09 = 9 + 8 + 7 + 0 + 9 = 33\). Обратите внимание, что число \(09\) считается корректным и преобразуется просто в \(9\).
  • Из этой строки нельзя получить следующие математические выражения: \(+9 \times 8 \times 70 + 09\) (знаки должны стоять только между цифрами), \(98 \times 70 + 0 + 9\) (так как цифр \(6\), должно быть ровно \(4\) знака).

Результат математического выражения считается по правилам математики — сначала выполняются все операции умножения, затем сложения. Вам нужно найти минимальный результат, который можно получить, вставив в данную строку \(s\) ровно \(n - 2\) знака сложения или умножения.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует их описание.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \leq n \leq 20\)) — длина строки \(s\).

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\), состоящую из цифр от \(0\) до \(9\).

Выходные данные

Для каждого набора входных данных выведите минимальный результат математического выражения, который можно получить, вставив в данную строку ровно \(n - 2\) знака сложения или умножения.

Примечание

В первых четырех наборах входных данных мы не можем добавлять знаки, поэтому ответом будет исходное число.

В пятом наборе входных данных оптимальный ответ выглядит следующим образом \(9 \times 01 = 9 \times 1 = 9\).

В шестом наборе входных данных оптимальный ответ выглядит следующим образом \(1 \times 01 = 1 \times 1 = 1\).

В седьмом наборе входных данных оптимальный ответ выглядит следующим образом \(2 + 3 + 3 + 11 = 19\).

В восьмом наборе входных данных один из оптимальных ответов выглядит следующим образом \(98 \times 7 \times 0 + 0 \times 9 = 0\).

A. Разделите мультимножество

жадные алгоритмы математика Перебор реализация *900

Мультимножество — это набор чисел, в котором могут быть равные элементы, и порядок чисел не имеет значения. Например, \(\{2,2,4\}\) — мультимножество.

У вас есть мультимножество \(S\). Изначально мультимножество содержит только одно положительное целое число \(n\). То есть, \(S=\{n\}\). Кроме того, задано положительное целое число \(k\).

За одну операцию вы можете выбрать любое положительное целое число \(u\) из \(S\) и удалить одно вхождение \(u\) из \(S\). Затем вставить не более \(k\) положительных целых чисел в \(S\), чтобы сумма всех вставленных чисел была равна \(u\).

Найдите минимальное количество операций, чтобы сделать \(S\) состоящим из \(n\) единиц.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(n,k\) (\(1\le n\le 1000,2\le k\le 1000\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число, которое является требуемым ответом.

Примечание

Для первого набора входных данных изначально \(S=\{1\}\), что уже удовлетворяет требованию. Поэтому нам не нужно делать ни одной операции.

Для второго набора входных данных изначально \(S=\{5\}\). Мы можем применить следующие операции:

  • Выберите \(u=5\), удалите \(u\) из \(S\) и вставьте \(2,3\) в \(S\). Теперь \(S=\{2,3\}\).
  • Выберите \(u=2\), удалите \(u\) из \(S\) и вставьте \(1,1\) в \(S\). Теперь \(S=\{1,1,3\}\).
  • Выберите \(u=3\), удалите \(u\) из \(S\) и вставьте \(1,2\) в \(S\). Теперь \(S=\{1,1,1,2\}\).
  • Выберите \(u=2\), удалите \(u\) из \(S\) и вставьте \(1,1\) в \(S\). Теперь \(S=\{1,1,1,1,1\}\).

Используя \(4\) операции в общей сложности, мы достигаем цели.

Для третьего набора входных данных изначально \(S=\{6\}\). Мы можем применить следующие операции:

  • Выберите \(u=6\), удалите \(u\) из \(S\) и вставьте \(1,2,3\) в \(S\). Теперь \(S=\{1,2,3\}\).
  • Выберите \(u=2\), удалите \(u\) из \(S\) и вставьте \(1,1\) в \(S\). Теперь \(S=\{1,1,1,3\}\).
  • Выберите \(u=3\), удалите \(u\) из \(S\) и вставьте \(1,1,1\) в \(S\). Теперь \(S=\{1,1,1,1,1,1\}\).

Используя \(3\) операции в общей сложности, мы достигаем цели.

Для четвертого набора входных данных изначально \(S=\{16\}\). Мы можем применить следующие операции:

  • Выберите \(u=16\), удалите \(u\) из \(S\) и вставьте \(4,4,4,4\) в \(S\). Теперь \(S=\{4,4,4,4\}\).
  • Повторите \(4\) раза: выберите \(u=4\), удалите \(u\) из \(S\) и вставьте \(1,1,1,1\) в \(S\).

Используя \(5\) операций в общей сложности, мы достигаем цели.

B. Сделать большинство

жадные алгоритмы реализация *900

Вам дана последовательность \([a_1,\ldots,a_n]\), где каждый элемент \(a_i\) равен либо \(0\), либо \(1\). Вы можете применить несколько (возможно, нулевое количество) операций к последовательности. В каждой операции вы выбираете два целых числа \(1\le l\le r\le |a|\) (где \(|a|\) — текущая длина \(a\)) и заменяете \([a_l,\ldots,a_r]\) одним элементом \(x\), где \(x\) — большинство \([a_l,\ldots,a_r]\).

Здесь большинство последовательности, состоящей из \(0\) и \(1\), определяется следующим образом: предположим, что в последовательности содержится \(c_0\) нулей и \(c_1\) единиц соответственно.

  • Если \(c_0\ge c_1\), то большинство — \(0\).
  • Если \(c_0<c_1\), то большинство — \(1\).

Например, предположим, что \(a=[1,0,0,0,1,1]\). Если мы выберем \(l=1,r=2\), то результирующая последовательность будет \([0,0,0,1,1]\). Если мы выберем \(l=4,r=6\), то результирующая последовательность будет \([1,0,0,1]\).

Определите, можно ли сделать \(a=[1]\) с помощью конечного количества операций.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 4\cdot 10^4\)). Далее следует описание наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(1\le n\le 2\cdot 10^5\)).

Вторая строка каждого набора содержит строку, состоящую из \(0\) и \(1\), описывающую последовательность \(a\).

Гарантируется, что сумма \(n\) по всем наборам не превышает \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если возможно сделать \(a=[1]\), выведите YES. В противном случае выведите NO. Вы можете вывести ответ в любом регистре (верхний или нижний). Например, строки yEs, yes, Yes и YES будут распознаны как положительные ответы.

Примечание

В четвертом наборе входных данных изначально \(a=[1,0,0,0,0,0,0,0,1]\). Допустимая последовательность операций:

  1. Выберите \(l=2,r=8\) и примените операцию. \(a\) становится \([1,0,1]\).
  2. Выберите \(l=1,r=3\) и примените операцию. \(a\) становится \([1]\).

E. Сумма минимумов на подотрезках

Бинарный поиск Перебор разделяй и властвуй реализация Структуры данных *2300

Для массива \([a_1,a_2,\ldots,a_n]\) длины \(n\) определим \(f(a)\) как сумму минимального элемента по всем подотрезкам этого массива. Иными словами, \(\)f(a)=\sum_{l=1}^n\sum_{r=l}^n \min_{l\le i\le r}a_i.\(\)

Перестановка — это последовательность целых чисел от \(1\) до \(n\) длиной \(n\), содержащая каждое число ровно один раз. Вам дана перестановка \([a_1,a_2,\ldots,a_n]\). Для каждого \(i\) решите следующую задачу независимо:

  • Удалите \(a_i\) из \(a\), объединив оставшиеся части, получив \(b = [a_1,a_2,\ldots,a_{i-1},\;a_{i+1},\ldots,a_{n}]\).
  • Вычислите \(f(b)\).
Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^5\)). Затем следует описание наборов.

Первая строка каждого набора содержит целое число \(n\) (\(1\le n\le 5\cdot 10^5\)).

Вторая строка каждого набора содержит \(n\) различных целых чисел \(a_1,\ldots,a_n\) (\(1\le a_i\le n\)).

Гарантируется, что сумма \(n\) по всем наборам не превышает \(10^6\).

Выходные данные

Для каждого набора выведите одну строку, содержащую \(n\) целых чисел. \(i\)-е целое число должно быть ответом при удалении \(a_i\).

Примечание

Во втором наборе входных данных \(a=[3,1,2]\).

  • При удалении \(a_1\), \(b=[1,2]\). \(f(b)=1+2+\min\{1,2\}=4\).
  • При удалении \(a_2\), \(b=[3,2]\). \(f(b)=3+2+\min\{3,2\}=7\).
  • При удалении \(a_3\), \(b=[3,1]\). \(f(b)=3+1+\min\{3,1\}=5\).

A. Поймай монетку

реализация *800

Монокарп пришел в ретро игровой клуб с аркадными автоматами. Там его заинтересовал автомат «Поймай монетку».

Игра довольно простая. Экран представляет собой координатную сетку такую, что:

  • ось OX направлена слева направо;
  • ось OY направлена снизу вверх;
  • центр экрана имеет координаты \((0, 0)\).

В начале игры персонаж находится в центре, а на экране появляются \(n\) монет — \(i\)-я монета в координате \((x_i, y_i)\). Координаты всех монет различны и не равны \((0, 0)\).

За одну секунду Монокарп может подвинуть персонажа в одном из восьми направлений. Если персонаж находится в координате \((x, y)\), то он может оказаться в любой из координат \((x, y + 1)\), \((x + 1, y + 1)\), \((x + 1, y)\), \((x + 1, y - 1)\), \((x, y - 1)\), \((x - 1, y - 1)\), \((x - 1, y)\), \((x - 1, y + 1)\).

Если персонаж оказывается в координате с монеткой, то Монокарп собирает эту монетку.

После того как Монокарп сделал ход, все монетки падают на \(1\) вниз, то есть, перемещаются из \((x, y)\) в \((x, y - 1)\). Можете считать, что игровое поле бесконечное во все стороны.

Монокарп хочет собрать хотя бы одну монетку, но никак не может определиться, за какой монеткой бежать. Помогите ему определить для каждой монеты, может ли он ее собрать.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 500\)) — количество монет.

В \(i\)-й из следующих \(n\) строк записаны два целых числа \(x_i\) и \(y_i\) (\(-50 \le x_i, y_i \le 50\)) — координаты \(i\)-й монетки. Координаты всех монет различны. Ни одна монетка не находится в \((0, 0)\).

Выходные данные

Для каждой монетки выведите «YES», если Монокарп может ее собрать. В противном случае выведите «NO».

Примечание

Обратите внимание на вторую монетку в примере. Монокарп может сначала сходить из \((0, 0)\) в \((-1, -1)\). Затем монета падает на \(1\) вниз и оказывается в \((-2, -2)\). Наконец Монокарп ходит в \((-2, -2)\) и собирает монету.

A. Теорема Хексадесимал

Конструктив Перебор реализация теория чисел *900

Недавно вирус Хексадесимал выдвинула теорему о том, что любое число Фибоначчи представимо в виде суммы трёх не обязательно различных чисел Фибоначчи. Эта теорема должна потрясти Вселенную!

Напомним, что числа Фибоначчи определяются следующим образом: F0 = 0, F1 = 1, а все остальные вычисляются по формуле Fi = Fi - 2 + Fi - 1.

Таким образом, числа Фибоначчи образуют последовательность: 0, 1, 1, 2, 3, 5, 8, 13, ...

Если вы ещё не убежали в ужасе от компьютера, то помогите вирусу подтвердить или опровергнуть её теорему. Разложите заданное число Фибоначчи n на сумму трёх не обязательно различных чисел Фибоначчи, или сообщите, что это невозможно.

Входные данные

Входные данные содержат единственное число n (0 ≤ n < 109) — число, которое необходимо разложить на искомую сумму. Гарантируется, что n является числом Фибоначчи.

Выходные данные

Выведите три числа: a, b и c — искомое разложение, если оно существует. В противном случае выведите «I'm too stupid to solve this problem» без кавычек.

Если решений несколько разрешается выводить любое.

D. Задачка на сетке

битмаски дп жадные алгоритмы Перебор реализация *1800

Дан массив \(a\) размера \(n\).

Есть сетка размером \(n \times n\). В \(i\)-й строке первые \(a_i\) ячеек черные, а остальные ячейки белые. Другими словами, через \((i,j)\) обозначим ячейку в \(i\)-й строке и \(j\)-м столбце, ячейки \((i,1), (i,2), \ldots, (i,a_i)\) черные, а ячейки \((i,a_i+1), \ldots, (i,n)\) белые.

Вы можете выполнять следующие операции любое количество раз в любом порядке:

  • Покрасить подсетку размера \(2 \times 2\) в белый цвет;
  • Покрасить всю строку в белый цвет. Обратите внимание, что вы не можете покрасить всю колонку в белый цвет.

Найдите минимальное количество операций, которое необходимо, чтобы покрасить все ячейки в белый цвет.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Для каждого набора входных данных:

  • Первая строка содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — размер массива \(a\).
  • Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq n\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, которое необходимо, чтобы покрасить все ячейки в белый цвет.

Примечание

В первом наборе входных данных вам не нужно выполнять никаких операций.

Во втором наборе входных данных вы можете выполнить следующие операции:

  • Покрасить \((1,1), (1,2), (2,1)\) и \((2,2)\) в белый цвет;
  • Покрасить \((2,3), (2,4), (3,3)\) и \((3,4)\) в белый цвет;
  • Покрасить \((3,1), (3,2), (4,1)\) и \((4,2)\) в белый цвет.

Можно доказать, что минимальное количество операций равно \(3\).

В третьем наборе входных данных вы можете выполнить следующие операции:

  • Покрасить первую строку в белый цвет;
  • Покрасить \((2,1), (2,2), (3,1)\) и \((3,2)\) в белый цвет.

Можно доказать, что минимальное количество операций равно \(2\).

A. Максимизируйте оставшийся элемент

жадные алгоритмы реализация *800

Вам дан массив \(a\) из \(n\) целых чисел, где \(n\) — нечётное.

За одну операцию вы можете удалить из массива \(a\) два соседних элемента, а затем объединить оставшиеся части массива. Например, из массива \([4,7,4,2,9]\) можно получить массивы \([4,2,9]\) и \([4,7,9]\) с помощью операций \([\underline{4,7}, 4,2,9] \to [4,2,9]\) и \([4,7,\underline{4,2},9] \to [4,7,9]\) соответственно. Однако мы не можем получить массив \([7,2,9]\), так как для этого нужно удалить несмежные элементы \([\underline{4},7,\underline{4},2,9]\).

Вы выполняете эту операцию несколько раз, пока в \(a\) не останется ровно один элемент.

Найдите максимально возможное значение оставшегося элемента в \(a\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 99\); \(n\) — нечетное) — длина массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 100\)) — элементы массива \(a\).

Заметим, что сумма \(n\) по всем наборам входных данных не ограничена.

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимально возможное значение оставшегося элемента в \(a\).

Примечание

В первом наборе входных данных массив \(a\) равен \([6]\). Поскольку в нем только один элемент, никаких операций не требуется. Максимально возможное значение оставшегося элемента — \(6\).

Во втором наборе входных данных массив \(a\) равен \([1, 3, 2]\). Мы можем удалить первые два элемента \([\underline{1, 3}, 2] \to [2]\), или удалить последние два элемента \([1, \underline{3, 2}] \to [1]\). Таким образом, максимально возможное значение оставшегося элемента равно \(2\).

В третьем наборе входных данных массив \(a\) равен \([4, 7, 4, 2, 9]\). Один из способов максимизации оставшегося элемента — \([4, \underline{7, 4}, 2, 9] \to [\underline{4, 2}, 9] \to [9]\). Таким образом, максимально возможное значение оставшегося элемента равно \(9\).

В четвертом наборе входных данных массив \(a\) равен \([3, 1, 4, 1, 5, 9, 2]\). Можно показать, что максимально возможное значение оставшегося элемента равно \(5\).

F. Образуйте треугольники

жадные алгоритмы математика Перебор реализация сортировки *2200

Вам даны \(n\) палочек, пронумерованных от \(1\) до \(n\). Длина \(i\)-й палочки равна \(a_i\).

Вам нужно ответить на \(q\) запросов. В каждом запросе вам даны два целых числа \(l\) и \(r\) (\(1 \le l < r \le n\), \(r - l + 1 \ge 6\)). Определите, можно ли из палочек с номерами от \(l\) до \(r\) выбрать \(6\) различных палочек, чтобы они образовали \(2\) невырожденных треугольника\(^{\text{∗}}\).

\(^{\text{∗}}\)Треугольник с длинами сторон \(a\), \(b\) и \(c\) называется невырожденным, если:

  • \(a < b + c\),
  • \(b < a + c\), и
  • \(c < a + b\).
Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(6 \le n \le 10^5\), \(1 \le q \le 10^5\)) — количество палочек и количество запросов соответственно.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — \(a_i\) обозначает длину \(i\)-й палочки.

Каждая из следующих строк \(q\) содержит по два целых числа \(l\) и \(r\) (\(1 \le l < r \le n\), \(r - l + 1 \ge 6\)) — параметры запроса.

Выходные данные

Для каждого запроса выведите «YES» (без кавычек), если можно сформировать \(2\) треугольника, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом запросе длины палочек равны \([5, 2, 2, 10, 4, 10]\). Два набора палочек \([2, 4, 5]\) и \([2, 10, 10]\) могут быть выбраны для образования \(2\) невырожденных треугольников.

Во втором запросе длины палочек равны \([2, 2, 10, 4, 10, 6]\). Можно показать, что невозможно образовать \(2\) невырожденных треугольника.

В третьем запросе длины палочек равны \([2, 2, 10, 4, 10, 6, 1]\). Можно выбрать два набора палочек \([1, 2, 2]\) и \([4, 10, 10]\), чтобы образовать \(2\) невырожденных треугольника.

В четвертом запросе длины палочек равны \([4, 10, 6, 1, 5, 3]\). Можно показать, что невозможно образовать \(2\) невырожденных треугольника.

В пятом запросе длины палочек равны \([10, 4, 10, 6, 1, 5, 3]\). Можно выбрать два набора палочек \([1, 10, 10]\) и \([3, 4, 5]\), чтобы образовать \(2\) невырожденных треугольника.

G. Сбрасывание сетки

жадные алгоритмы Конструктив реализация *2700

Вам дана сетка, состоящая из \(n\) строк и \(m\) столбцов, в которой каждая клетка изначально белая. Кроме того, вам дано целое число \(k\), такое что \(1 \le k \le \min(n, m)\).

Вы будете обрабатывать \(q\) операций двух типов:

  • \(\mathtt{H}\) (горизонтальная операция) — Вы выбираете прямоугольник размером \(1 \times k\), полностью находящийся в сетке, и в котором все клетки белые. Затем все клетки в этом прямоугольнике красятся в чёрный.
  • \(\mathtt{V}\) (вертикальная операция) — Вы выбираете прямоугольник \(k \times 1\), который полностью находится в сетке, и в котором все клетки белые. Затем все клетки в этом прямоугольнике красятся в чёрный.

После каждой операции, если какие-либо строки или столбцы становятся полностью черными, все ячейки в этих строках и столбцах одновременно сбрасываются на белые. В частности, если все клетки в строке и столбце, в которых содержится клетка, станут чёрными, то все клетки и в строке, и в столбце будут сброшены на белый цвет.

Выберите прямоугольники таким образом, чтобы можно было выполнить все заданные операции, или определите, что это сделать невозможно.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит четыре целых числа \(n\), \(m\), \(k\) и \(q\) (\(1 \le n, m \le 100\), \(1 \le k \le \min(n, m)\), \(1 \le q \le 1000\)) — количество строк и столбцов в сетке, сторона прямоугольника операции и количество операций, соответственно.

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(q\), состоящую только из символов \(\mathtt{H}\) и \(\mathtt{V}\) — последовательность типов операций.

Гарантируется, что сумма \(q\) по всем наборам входных данных не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных выведите одно число \(-1\), если невозможно выполнить все операции.

В противном случае выведите \(q\) строк. Каждая строка должна содержать по два целых числа \(i\), \(j\) (\(1 \le i \le n\), \(1 \le j \le m\)) — координаты левой верхней клетки прямоугольника операций.

Если существует несколько решений, выведите любое из них.

Примечание
Иллюстрация примера.

Первая операция — горизонтальная. Прямоугольник операции начинается в точке \((1,1)\) и представляет собой прямоугольник размером \(1 \times 3\). После операции ячейки \((1,1)\), \((1,2)\) и \((1,3)\) становятся чёрными.

Вторая операция — вертикальная. Прямоугольник операции начинается в точке \((2,1)\) и представляет собой прямоугольник размером \(3 \times 1\). После операции ячейки \((2,1)\), \((3,1)\) и \((4,1)\) становятся черными. В этот момент первый столбец становится полностью черным, поэтому все ячейки в первом столбце сбрасываются в белый цвет.

Третья операция — вертикальная. Прямоугольник операции начинается в \((1,1)\) и представляет собой прямоугольник размером \(3 \times 1\). После операции ячейки \((1,1)\), \((2,1)\) и \((3,1)\) становятся черными.

Четвертая операция — горизонтальная. Прямоугольник операции начинается в точке \((2,3)\) и представляет собой прямоугольник размером \(1 \times 3\). После операции ячейки \((2,3)\), \((2,4)\) и \((2,5)\) становятся черными.

Пятая операция — горизонтальная. Прямоугольник операции начинается в точке \((3,3)\) и представляет собой прямоугольник размером \(1 \times 3\). После операции ячейки \((3,3)\), \((3,4)\) и \((3,5)\) становятся черными.

Шестая операция — вертикальная. Прямоугольник операции начинается в точке \((2,2)\) и представляет собой прямоугольник размером \(3 \times 1\). После операции клетки \((2,2)\), \((3,2)\) и \((4,2)\) становятся черными. В этот момент две строки и один столбец становятся полностью черными, поэтому все ячейки в этих строках и столбце сбрасываются в белые.

D. Испытание любви

дп жадные алгоритмы реализация *1200

ErnKor ради жюльена готов на всё, даже плыть через болота, кишащие крокодилами. Мы решили проверить эту любовь. ErnKor нужно будет проплыть речку шириной \(1\) метр и длиной \(n\) метров.

Река очень холодная. Поэтому, суммарно (то есть на протяжении всего заплыва от \(0\) до \(n+1\)) ErnKor в воде может проплыть не более чем \(k\) метров. В реку для гуманности мы добавили не только крокодилов, но и бревна, по которым он может прыгать. Наше испытание заключается в следующем:

Изначально ErnKor находится на левом берегу, а попасть ему надо на правый. Они находятся на \(0\) и на \(n+1\)-м метре соответственно. Реку можно представить как \(n\) участков, каждый длиной в \(1\) метр. В каждом участке есть или бревно 'L', или крокодил 'C', или просто вода 'W'. ErnKor может передвигаться следующим образом:

  • Если он на поверхности (то есть на берегу или на бревне), он может прыгнуть вперед не более чем на \(m\) (\(1 \le m \le 10\)) метров (можно прыгать на берег, на бревно или в воду).
  • Если он в воде, он может только переплыть на следующий участок реки (или на берег, если он на \(n\)-м метре).
  • ErnKor нельзя попадать в участок с крокодилом каким-либо образом.

Определите, сможет ли ErnKor добраться до правого берега.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\))  — количество наборов входных данных.

В первой строке каждого набора вводится три числа \(n, m, k\) (\(0 \le k \le 2 \cdot 10^5\), \(1 \le n \le 2 \cdot 10^5\), \(1 \le m \le 10\)) — длина реки, дальность прыжка ErnKor и количество метров, которое может проплыть ErnKor не замерзнув.

Во второй строке каждого набора вводится одна строка \(a\) длины \(n\). \(a_i\) обозначает объект, находящийся на \(i\)-м метре. (\(a_i \in \{\)'W','C','L'\(\}\))

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES», если ErnKor сможет выполнить испытание, и выведите «NO» в обратном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Рассмотрим примеры:

  • Первый пример: С берега прыгаем на первое бревно (\(0 \rightarrow 1\)), с первого бревна прыгаем на второе (\(1 \rightarrow 3\)), со второго прыгаем на четвертое (\(3 \rightarrow 5\)), с последнего бревна прыгаем на берег (\(5 \rightarrow 7\)). Итого, пусть есть, \(0 \rightarrow 1 \rightarrow 3 \rightarrow 5 \rightarrow 7\). Так как мы не заплыли на крокодила и проплыли в воде не больше k метров, ответ «YES».
  • Второй пример: \(0 \rightarrow 1\), с первого бревна прыгаем в воду (\(1 \rightarrow 2\)), плывем клетку до бревна (\(2 \leadsto 3\)), \(3 \rightarrow 4 \rightarrow 5 \rightarrow 6 \rightarrow 7\). Так как мы не заплыли на крокодила и проплыли в воде не больше k метров, ответ «YES».
  • В третьем примере ErnKor необходимо проплыть две клетки 'W', а может проплыть только одну. Поэтому ответ «NO»
  • Шестой пример: прыгаем с берега в воду (\(0 \rightarrow 6\)) и проплываем одну клетку воды (\(6 \leadsto 7\)). Так как мы не заплыли на крокодила и проплыли в воде не больше k метров, ответ «YES».

E. Ошибка новичка

Конструктив математика Перебор реализация Строки *1700

Одна из первых задач K1o0n по программированию выглядела так: «У Noobish_Monk есть \(n\) \((1 \le n \le 100)\) друзей. На день рождения каждый из них подарил \(a\) \((1 \le a \le 10000)\) яблок. Обрадовавшись такому подарку, Noobish_Monk вернул \(b\) \((1 \le b \le \min(10000, a \cdot n))\) яблок друзьям. Сколько яблок осталось у Noobish_Monk?»

K1o0n написал решение, но случайно считал значение \(n\) как строку, поэтому значение \(n \cdot a - b\) было посчитано по-другому. Конкретно:

  • при умножении строки \(n\) на число \(a\) он получит строку \(s=\underbrace{n + n + \dots + n + n}_{a\ \text{раз}}\)
  • при вычитании из строки \(s\) числа \(b\), из неё удалятся последние \(b\) символов, если \(b\) больше или равно длине строки \(s\), то она станет пустой.

Узнав об этом, ErnKor стало интересно, сколько для данного \(n\) существует пар \((a, b)\), удовлетворяющих ограничениям задачи, на которых решение K1o0n выдаёт правильный ответ.

«Решение выдаёт правильный ответ» означает, что оно выводит непустую строку, и эта строка при переводе в целое число равна правильному ответу, то есть значению \(n \cdot a - b\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\))  — количество наборов входных данных.

В единственной строке каждого набора входных данных вводится целое число \(n\) (\(1 \le n \le 100\))

Гарантируется, что во всех наборах данных \(n\) различны.

Выходные данные

Для каждого набора входных данных выведите ответ в следующем формате:

В первой строке выведите число \(x\) — количество плохих тестов для заданного \(n\).

В следующих \(x\) строках выведите по два числа \(a_i\) и \(b_i\) — такие числа, что решение K1o0n выдает на тест «\(n\) \(a_i\) \(b_i\)» выдаёт правильный ответ.

Примечание

В первом примере \(a = 20\), \(b = 18\) подходят, так как «\(\text{2}\)» \(\cdot 20 - 18 =\) «\(\text{22222222222222222222}\)» \(- 18 = 22 = 2 \cdot 20 - 18\)

A. Знаки вопроса

жадные алгоритмы реализация *800

Тим проходит тест, состоящий из \(4n\) вопросов; каждый вопрос имеет \(4\) варианта ответа: 'A', 'B', 'C' и 'D'. Для каждого варианта ответа существует ровно \(n\) правильных ответов, соответствующих этому варианту — это означает, что есть \(n\) вопросов с ответом 'A', \(n\) вопросов с ответом 'B', \(n\) вопросов с ответом 'C' и \(n\) вопросов с ответом 'D'.

Для каждого вопроса Тим записал свой ответ на бланке ответов. Если он не мог определить ответ, он оставлял знак вопроса '?' для этого вопроса.

Вам дан бланк ответов из \(4n\) символов. Какое максимальное количество правильных ответов может получить Тим?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 100\)).

Вторая строка каждого набора входных данных содержит строку \(s\) из \(4n\) символов (\(s_i \in \{\texttt{A}, \texttt{B}, \texttt{C}, \texttt{D}, \texttt{?}\}\)) — ответы Тима на вопросы.

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальный балл, который Тим может получить.

Примечание

В первом наборе входных данных есть ровно один вопрос с каждым ответом 'A', 'B', 'C' и 'D'; поэтому возможно, что Тим получит все свои ответы правильными.

Во втором наборе входных данных есть только два правильных ответа 'A', что делает его результатом ровно \(2\) балла в любом случае.

В третьем наборе входных данных Тим может получить максимум \(2\) правильных ответа с вариантом 'A' и \(2\) правильных ответа с вариантом 'B'. Например, он получил бы \(4\) балла, если бы правильными ответами были 'AACCBBDD'.

В четвертом наборе входных данных он отказывается отвечать на любые вопросы, поэтому его результат в любом случае равен \(0\) баллов.

C. Переключатели света

математика реализация *1400

Есть квартира, состоящая из \(n\) комнат, каждая из которых имеет свет, изначально выключенный.

Чтобы управлять светом в этих комнатах, владелец квартиры решил установить чипы в комнатах так, чтобы в каждой комнате был один чип, и каждый чип устанавливался в разное время. Более конкретно, времена установки представлены массивом \(a_1, a_2, \ldots, a_n\), где \(a_i\) — это момент времени (в минутах), в который чип устанавливается в \(i\)-ю комнату.

Как только чип установлен, он меняет статус света в комнате каждые \(k\) минут — включает свет на \(k\) минут, затем выключает его на следующие \(k\) минут, затем снова включает на следующие \(k\) минут и так далее. Другими словами, статус света меняется чипом в минуты \(a_i\), \(a_i + k\), \(a_i + 2k\), \(a_i + 3k\), \(\ldots\) для \(i\)-й комнаты.

Какой самый ранний момент, когда все комнаты в квартире будут с включенным светом?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)) — количество комнат в квартире и период чипов.

Вторая строка содержит \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — моменты, когда устанавливаются чипы.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — ответ на задачу. Если нет такого момента времени, в который свет горит во всех комнатах, выведите \(-1\) вместо этого.

Примечание

В первом наборе входных данных все переключатели будут включены в минуту \(5\), ни один из них не успеет выключиться к этой минуте. Ответ — \(5\).

Во втором наборе входных данных, поскольку \(k=3\), свет в \(1\)-й комнате будет включен в минуты \(2, 3, 4, 8, 9, 10, 14, \ldots\); в то время как свет в \(4\)-й комнате будет включен в минуты \(5, 6, 7, 11, 12, 13, 17, \ldots\). Эти две последовательности не имеют общих чисел, поэтому свет в этих комнатах никогда не будет включен одновременно.

В третьем наборе входных данных можно заметить, что свет в \(1\)-й и \(2\)-й комнатах будет выключен в минуты \(6\) и \(7\), но чипы снова включат его в минуты \(9\) и \(10\). Свет в \(3\)-й и \(4\)-й комнатах также будет включен в минуту \(10\), поэтому ответ — \(10\).

E. Xpinxor Grix

битмаски дп Конструктив реализация *2700

Дана матрица \(a\) размера \(n \times m\), каждая ячейка которой содержит неотрицательное целое число. Число, находящееся на пересечении \(i\)-й строки и \(j\)-го столбца матрицы, называется \(a_{i,j}\).

Определим \(f(i)\) и \(g(j)\) как XOR всех чисел в \(i\)-й строке и \(j\)-м столбце соответственно. За одну операцию вы можете либо:

  • Выбрать любую строку \(i\), затем присвоить \(a_{i,j} := g(j)\) для каждого \(1 \le j \le m\); либо
  • Выбрать любой столбец \(j\), затем присвоить \(a_{i,j} := f(i)\) для каждого \(1 \le i \le n\).
Пример применения операции к столбцу \(2\) матрицы.

В этом примере, когда мы применяем операцию к столбцу \(2\), все элементы в этом столбце изменяются следующим образом:

  • \(a_{1,2} := f(1) = a_{1,1} \oplus a_{1,2} \oplus a_{1,3} \oplus a_{1,4} = 1 \oplus 1 \oplus 1 \oplus 1 = 0\)
  • \(a_{2,2} := f(2) = a_{2,1} \oplus a_{2,2} \oplus a_{2,3} \oplus a_{2,4} = 2 \oplus 3 \oplus 5 \oplus 7 = 3\)
  • \(a_{3,2} := f(3) = a_{3,1} \oplus a_{3,2} \oplus a_{3,3} \oplus a_{3,4} = 2 \oplus 0 \oplus 3 \oplus 0 = 1\)
  • \(a_{4,2} := f(4) = a_{4,1} \oplus a_{4,2} \oplus a_{4,3} \oplus a_{4,4} = 10 \oplus 11 \oplus 12 \oplus 16 = 29\)

Вы можете применять операции любое количество раз. Затем мы вычислим \(\textit{красоту}\) финальной матрицы, суммируя абсолютные разности между всеми парами её соседних ячеек.

Более формально, \(\textit{красота}(a) = \sum|a_{x,y} - a_{r,c}|\) для всех ячеек \((x, y)\) и \((r, c)\), если они соседние. Две ячейки считаются соседними, если они имеют общую сторону.

Найдите минимальную \(\textit{красоту}\) среди всех достижимых матриц.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 250\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 15\)) — количество строк и столбцов матрицы \(a\) соответственно.

Далее идут \(n\) строк, каждая из которых содержит \(m\) целых чисел \(a_{i,1}, a_{i,2}, \ldots, a_{i,m}\) (\(0 \le a_{i,j} < 2^{20}\)) — описание матрицы \(a\).

Гарантируется, что сумма \((n^2 + m^2)\) по всем наборам входных данных не превышает \(500\).

Выходные данные

Для каждого набора входных данных выведите одно целое число \(b\) — наименьшая возможная \(\textit{красота}\) матрицы.

Примечание

Обозначим \(r(i)\) как операцию первого типа, примененную к \(i\)-й строке, и \(c(j)\) как операцию второго типа, примененную к \(j\)-му столбцу.

В первом наборе входных данных вы можете применить операцию \(c(1)\), которая присвоит \(a_{1,1} := 1 \oplus 3 = 2\). Затем мы получим эту матрицу:

23

Во втором наборе входных данных вы можете применить операцию \(r(1)\), которая присвоит:

  • \(a_{1,1} := g(1) = 0 \oplus 5 = 5\)
  • \(a_{1,2} := g(2) = 1 \oplus 4 = 5\)
  • \(a_{1,3} := g(3) = 0 \oplus 4 = 4\)

Финальная матрица после выполнения операции:

554
544

В третьем наборе входных данных лучший способ достичь минимальной \(\textit{красота}\) — применить три операции: \(c(3)\), \(r(2)\) и \(c(2)\). Финальная матрица:

046
456

A. Разнообразная игра

жадные алгоритмы Конструктив реализация *800

Пётр, смотря стрим Сергея, придумал матрицу \(a\), состоящую из \(n\) строк и \(m\) столбцов (число в \(i\)-й строке и \(j\)-м столбце обозначается \(a_{i, j}\)), в которой содержатся все целые числа от \(1\) до \(n \cdot m\). Но расположение чисел ему не понравилось, и теперь он хочет придумать новую матрицу \(b\), состоящую из \(n\) строк и \(m\) столбцов, которая также будет содержать все целые числа от \(1\) до \(n \cdot m\), такую, что для любых \(1 \leq i \leq n, 1 \leq j \leq m\) выполняется \(a_{i, j} \ne b_{i, j}\).

Вам дана матрица \(a\), постройте любую матрицу \(b\), подходящую под требования Пети, или скажите, что это невозможно.

Поторопитесь! Иначе все свои деньги он задонатит на стрим, в поиске ответа на свой вопрос.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных дано два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 10\)) — количество строк и столбцов матрицы \(a\).

В следующих \(n\) строках записано по \(m\) целых чисел, описывающих матрицу \(a\). В \(i\)-й из этих строк записаны элементы матрицы \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, m}\).

Гарантируется, что все числа матрицы \(a\) различны и \(1 \leq a_{i, j} \leq n \cdot m\).

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превышает \(5 \cdot 10^4\).

Выходные данные

Для каждого набора входных данных выведите \(n \cdot m\) целых чисел — любую подходящую матрицу \(b\), или \(-1\), если такой матрицы не существует.

Примечание

В первом наборе входных данных в матрице только один элемент, поэтому матрица \(b\) единственная и она не подходит.

Во втором наборе входных данных \(a_{1, 1} = 2 \neq 1 = b_{1, 1}\), \(a_{2, 1} = 1 \neq 2 = b_{2, 1}\).

A. Диагонали

жадные алгоритмы математика Перебор реализация *800

У Vitaly503 сегодня оказалась клетчатая доска со стороной \(n\), а также \(k\) фишек. Vitaly503 понял, что все эти \(k\) фишек нужно расположить на клетках доски (на одну клетку можно размещать не более одной фишки).

Обозначим ячейку в \(i\)-й строке и \(j\)-м столбце как \((i ,j)\). Диагональ – это набор ячеек, для которых значение \(i + j\) одинаково. Например, клетки \((3, 1)\), \((2, 2)\) и \((1, 3)\) лежат на одной диагонали, но \((1, 2)\) и \((2, 3)\) не лежат на одной диагонали. Диагональ называется занятой, если она содержит хотя бы одну фишку.

Vitaly503 просит вас помочь ему и сообщить минимальное количество занятых диагоналей, которое он может получить после размещения всех \(k\) фишек.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(n\), \(k\) (\(1 \le n \le 100, 0 \le k \le n^2\)) — сторона клетчатой доски и количество имеющихся фишек соответственно.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество диагоналей с хотя бы одной фишкой, которое он может получить после размещения всех \(k\) фишек.

Примечание

В первом наборе входных данных фишек нет, поэтому будут заняты 0 диагоналей. Во втором наборе входных данных обе фишки можно разместить на диагонали \((2, 1), (1, 2)\), поэтому ответ — 1. В третьем наборе входных данных 3 фишки нельзя разместить на одной диагонали, но размещение их на \((1, 2), (2, 1), (1, 1)\) делает 2 диагонали занятыми. В 7-м наборе входных данных фишки займут все 5 диагоналей в любой допустимой расстановке.

C. Квадратирование

жадные алгоритмы Конструктив математика Перебор реализация теория чисел *1800

ikrpprpp нашел массив \(a\), состоящий из целых чисел. Ему нравится справедливость, поэтому он хочет сделать \(a\) честным — то есть сделать его неубывающим. Для этого он может выполнить акт справедливости на индексе \(1 \le i \le n\) массива, который заменит \(a_i\) на \(a_i ^ 2\) (элемент на позиции \(i\) на его квадрат). Например, если \(a = [2,4,3,3,5,3]\) и ikrpprpp решает выполнить акт справедливости на \(i = 4\), то \(a\) становится \([2,4,3,9,5,3]\).

Каково минимальное количество актов справедливости, необходимых для того, чтобы сделать массив неубывающим?

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. За ним следует описание наборов входных данных.

Для каждого набора входных данных первая строка содержит целое число \(n\) — размер массива \(a\). Вторая строка содержит \(n\) (\(1 \le n \le 2 \cdot 10 ^5\)) целых числа \(a_1, a_2,\ldots, a_n\) (\(1 \le a_i \le 10 ^ 6\)).

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot {10}^5\).

Выходные данные

Для каждого набора входных данных выведите целое число — минимальное количество актов справедливости, необходимых для того, чтобы сделать массив \(a\) неубывающим. Если это невозможно, выведите \(-1\).

Примечание

В первом наборе входных данных нет необходимости выполнять акты справедливости. Массив сам по себе честен!

В третьем наборе входных данных можно доказать, что массив не может стать неубывающим.

В пятом наборе входных данных ikrpprppp может выполнить акт справедливости на индексе 3, затем акт справедливости на индексе 2 и, наконец, еще один акт справедливости на индексе 3. После этого \(a\) станет \([4, 9, 16]\).

B. Масштабирование

жадные алгоритмы реализация *800

У Тины есть квадратная матрица с \(n\) строками и \(n\) столбцами. Каждая ячейка в матрице может быть либо \(0\), либо \(1\).

Тина хочет уменьшить сетку в \(k\) раз (\(k\) является делителем \(n\)). Для этого Тина разбивает сетку на непересекающиеся блоки ячеек \(k \times k\) так, что каждая ячейка принадлежит ровно одному блоку.

Затем Тина заменяет каждый блок ячеек одной ячейкой, равной значению ячеек в блоке. Гарантируется, что каждая ячейка в одном блоке имеет одинаковое значение.

Например, следующая сетка получается из уменьшения вышеприведенной сетки в \(3\) раза.

Исходная матрица
\(0\)\(0\)\(0\)\(1\)\(1\)\(1\)
\(0\)\(0\)\(0\)\(1\)\(1\)\(1\)
\(0\)\(0\)\(0\)\(1\)\(1\)\(1\)
\(1\)\(1\)\(1\)\(0\)\(0\)\(0\)
\(1\)\(1\)\(1\)\(0\)\(0\)\(0\)
\(1\)\(1\)\(1\)\(0\)\(0\)\(0\)
Уменьшенная матрица
\(0\)\(1\)
\(1\)\(0\)

Помогите Тине уменьшить сетку в \(k\) раз.

Входные данные

Первая строка содержит \(t\) (\(1 \leq t \leq 100\)) – количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \leq n \leq 1000\), \(1 \le k \le n\), \(k\) является делителем \(n\)) — количество строк и столбцов матрицы, и коэффициент, на который Тина хочет уменьшить сетку.

Каждая из следующих \(n\) строк содержит \(n\) символов, описывающих ячейки матрицы. Каждый символ может быть либо \(0\), либо \(1\). Гарантируется, что каждый блок \(k\) на \(k\) имеет одинаковое значение.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(1000\).

Выходные данные

Для каждого набора входных данных выведите уменьшенную в \(k\) раз сетку на новой строке.

E. Декодирование

Комбинаторика математика реализация Структуры данных *1600

В отчаянной попытке получить своего waifu любимого персонажа, вы взломали исходный код игры. После дней борьбы вы наконец нашли двоичную строку, которая кодирует систему гача в игре. Чтобы раскодировать ее, вам сначала нужно решить следующую задачу.

Дана двоичная строка \(s\) длиной \(n\). Для каждой пары целых чисел \((l, r)\) \((1 \leq l \leq r \leq n)\) посчитайте количество пар \((x, y)\) \((l \leq x \leq y \leq r)\) таких, что количество \(\mathtt{0}\) равно количеству \(\mathtt{1}\) в подстроке \(s_xs_{x+1}...s_y\).

Выведите сумму подсчетов для всех возможных \((l, r)\) по модулю \(10^9+7\).

Входные данные

В первой строке содержится \(t\) (\(1 \leq t \leq 1000\)) — количество наборов входных данных.

Каждый набор входных данных содержит двоичную строку \(s\) (\(1 \leq |s| \leq 2 \cdot 10^5\)). Гарантируется, что \(s\) содержит только символы \(\mathtt{0}\) и \(\mathtt{1}\).

Гарантируется, что сумма \(|s|\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите целое число — ответ по модулю \(10^9+7\).

A. Сильный пароль

Перебор реализация Строки *800

Текущий пароль Монокарпа на Codeforces — это строка \(s\), состоящая из строчных латинских букв. Монокарп считает, что его текущий пароль слишком слабый, поэтому он хочет вставить ровно одну строчную латинскую букву в пароль, чтобы сделать его сильнее. Монокарп может выбрать любую букву и вставить ее в любое место, даже перед первым символом или после последнего символа.

Монокарп считает, что сила пароля пропорциональна времени, которое ему требуется для его ввода. Время, необходимое для ввода пароля, рассчитывается следующим образом:

  • время для ввода первого символа составляет \(2\) секунды;
  • для каждого символа, кроме первого, время ввода составляет \(1\) секунда, если он такой же, как предыдущий символ, или \(2\) секунды в противном случае.

Например, время, необходимое для ввода пароля abacaba, составляет \(14\); время, необходимое для ввода пароля a, составляет \(2\); время, необходимое для ввода пароля aaabacc, составляет \(11\).

Вам нужно помочь Монокарпу — вставить строчную латинскую букву в его пароль так, чтобы получившийся пароль требовал максимально возможное время для ввода.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из одной строки, содержащей \(s\) (\(1 \le |s| \le 10\)) — последовательность из строчных латинских букв.

Выходные данные

Для каждого набора входных данных выведите новый пароль — строку, которую можно получить из \(s\), вставив одну строчную латинскую букву. Строка, которую вы выводите, должна занимать максимальное возможное время для ввода. Если есть несколько ответов, выведите любой из них.

E. Прокачка персонажа

Бинарный поиск Перебор разделяй и властвуй реализация Структуры данных *2200

Монокарп играет в компьютерную игру. Он начинает игру, будучи \(1\) уровня. Ему предстоит сразиться с \(n\) монстрами в порядке от \(1\) до \(n\). Уровень \(i\)-го из них равен \(a_i\).

Когда Монокарп встречает очередного монстра, происходит следующее:

  • если уровень Монокарпа строго выше уровня монстра, то монстр спасается бегством;
  • иначе Монокарп сражается с монстром.

После каждого \(k\)-го сражения с монстром (сбежавшие монстры не считаются) уровень Монокарпа увеличивается на \(1\). То есть, после \(k\) сражений с монстрами уровень становится равен \(2\), после \(2k\) — равен \(3\), после \(3k\) — равен \(4\) и так далее.

Требуется обработать \(q\) запросов следующего вида:

  • \(i~x\): будет ли Монокарп сражаться с \(i\)-м монстром (или же этот монстр сбежит), если параметр \(k\) равен \(x\)?
Входные данные

В первой строке записаны два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество монстров и количество запросов.

Во второй строке записаны \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 2 \cdot 10^5\)) — уровни монстров.

В \(j\)-й из следующих \(q\) строк записаны два целых числа \(i\) и \(x\) (\(1 \le i, x \le n\)) — номер монстра и количество сражений, необходимых для повышения уровня в \(j\)-м запросе.

Выходные данные

На каждый запрос выведите «YES», если Монокарп сразится с \(i\)-м монстром в этом запросе, и «NO», если \(i\)-й монстр сбежит.

A. Найти K различных точек с фиксированным центром

Конструктив математика реализация *800

Я не смог придумать хорошее название для этой задачи, поэтому решил поучиться у LeetCode.
— Сунь-Цзы, Искусство войны

Вам даны три целых числа \(x_c\), \(y_c\) и \(k\). (\(-100 \leq x_c, y_c \leq 100\), \(1 \leq k \leq 1000\)).

Найдите такой набор из \(k\) различных точек (\(x_1, y_1\)), (\(x_2, y_2\)), \(\ldots\), (\(x_k, y_k\)) с целочисленными координатами на двумерной координатной плоскости, такой, что

  • центр\(^{\text{∗}}\) этого набора имеет координаты (\(x_c, y_c\)).
  • \(-10^9 \leq x_i, y_i \leq 10^9\) для всех \(i\) от \(1\) до \(k\)

Можно доказать, что всегда существует хотя бы один набор из \(k\) различных точек, удовлетворяющий этим условиям.

\(^{\text{∗}}\)Центром набора из \(k\) точек (\(x_1, y_1\)), (\(x_2, y_2\)), \(\ldots\), (\(x_k, y_k\)) является точка \(\left( \frac{x_1 + x_2 + \ldots + x_k}{k}, \frac{y_1 + y_2 + \ldots + y_k}{k} \right)\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Каждый набор входных данных содержит три целых числа \(x_c\), \(y_c\) и \(k\) (\(-100 \leq x_c, y_c \leq 100\), \(1 \leq k \leq 1000\)) — координаты центра и количество различных точек, которое необходимо вывести.

Гарантируется, что сумма \(k\) по всем наборам входных данных не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных выведите \(k\) строк, где \(i\)-я строка содержит два разделенных пробелом целых числа \(x_i\) и \(y_i\) (\(-10^9 \leq x_i, y_i \leq 10^9\)) — положение \(i\)-й точки.

Если ответов несколько, выведите любой из них. Можно показать, что при заданных ограничениях решение всегда существует.

Примечание

В первом наборе входных данных \(\left( \frac{10}{1}, \frac{10}{1} \right) = (10, 10)\).

Во втором наборе входных данных \(\left( \frac{-1 + 5 - 4}{3}, \frac{-1 -1 + 2}{3} \right) = (0, 0)\).

C. Выполните операции и максимизируйте счёт

Бинарный поиск жадные алгоритмы Конструктив Перебор реализация *1900

Я вижу хендл satyam343. У меня идут мурашки по телу. Пожалуйста, в этот раз больше задач про медианы. Я их обожаю. Пожалуйста, satyam343, мы верим в тебя.
— Самый большой поклонник satyam343

Вам дан массив \(a\) длины \(n\) и целое число \(k\). Вам также дан бинарный массив \(b\) длины \(n\).

Вы можете выполнить следующую операцию не более \(k\) раз:

  • Выбрать индекс \(i\) (\(1 \leq i \leq n\)) такой, что \(b_i = 1\). Установить \(a_i = a_i + 1\) (т.е. увеличить \(a_i\) на \(1\)).

Ваш счёт определяется как \(\max\limits_{i = 1}^{n} \left( a_i + \operatorname{median}(c_i) \right)\), где \(c_i\) обозначает массив длины \(n-1\), который вы получаете, удаляя \(a_i\) из \(a\). Другими словами, ваш счёт — это максимальное значение \(a_i + \operatorname{median}(c_i)\) среди всех \(i\) от \(1\) до \(n\).

Найдите максимальный счёт, который можно получить при оптимальном выполнении операций.

Для произвольного массива \(p\), \(\operatorname{median}(p)\) определяется как \(\left\lfloor \frac{|p|+1}{2} \right\rfloor\)-й элемент в отсортированном \(p\). Например, \(\operatorname{median} \left( [3,2,1,3] \right) = 2\) и \(\operatorname{median} \left( [6,2,4,5,1] \right) = 4\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Каждый набор входных данных начинается с двух целых чисел \(n\) и \(k\) (\(2 \leq n \leq 2 \cdot 10^5\), \(0 \leq k \leq 10^9\)) — длина \(a\) и количество операций, которые вы можете выполнить.

Следующая строка содержит \(n\) разделенных пробелом целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — массив \(a\).

Следующая строка содержит \(n\) разделенных пробелом целых чисел \(b_1, b_2, \ldots, b_n\) (\(b_i\) равно \(0\) или \(1\)) — массив \(b\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите на отдельной строке максимальное значение счёт, которое вы можете получить.

Примечание

Для первого набора входных данных оптимально выполнить \(5\) операций над обоими элементами и получить \(a = [8,8]\). Таким образом, максимальная оценка, которую мы можем получить, равна \(\max(8 + \operatorname{median}[8], 8 + \operatorname{median}[8]) = 16\), так как \(c_1 = [a_2] = [8]\). Можно доказать, что получить больший счёт невозможно.

Для второго набора входных данных вы не можете выполнить операции ни над одним элементом, поэтому \(a\) остается \([3,3,3]\). Таким образом, максимальная оценка, которую мы можем получить, равна \(3 + \operatorname{median}[3, 3] = 6\), так как \(c_1 = [a_2, a_3] = [3, 3]\). Можно доказать, что получить больший счёт невозможно.

E2. Удаление шаров с помощью слияния (сложная версия)

Бинарный поиск жадные алгоритмы Перебор разделяй и властвуй реализация Структуры данных *2500

Пейте воду.
— Сунь-Цзы, Искусство стать здоровым программистом

Это сложная версия задачи. Единственное отличие в том, что в этой версии \(x=1\). Вы можете делать взломы только в том случае, если обе версии задачи решены.

Вам даны два целых числа \(n\) и \(x\) (\(x=1\)). В ряд выстроены \(n\) шаров, пронумерованных от \(1\) до \(n\) слева направо. Изначально на \(i\)-м шаре записано значение \(a_i\).

Для каждого целого числа \(i\) от \(1\) до \(n\) мы определяем функцию \(f(i)\) следующим образом:

  • Предположим, что у вас есть множество \(S = \{1, 2, \ldots, i\}\).

  • В рамках одной операции вам нужно выбрать целое число \(l\) (\(1 \leq l < i\)) из \(S\) такое, что \(l\) не является наибольшим элементом \(S\). Предположим, что \(r\) — наименьший элемент \(S\), значение которого больше \(l\).

    • Если \(a_l > a_r\), то установить \(a_l = a_l + a_r\) и удалить \(r\) из \(S\).
    • Если \(a_l < a_r\), то установить \(a_r = a_l + a_r\) и удалить \(l\) из \(S\).
    • Если \(a_l = a_r\), вы выбираете целое число \(l\) или \(r\) для удаления из \(S\):
      • Если вы решили удалить \(l\) из \(S\), вы устанавливаете \(a_r = a_l + a_r\) и удаляете \(l\) из \(S\).
      • Если вы решили удалить \(r\) из \(S\), вы устанавливаете \(a_l = a_l + a_r\) и удаляете \(r\) из \(S\).

  • \(f(i)\) обозначает количество целых чисел \(j\) (\(1 \le j \le i\)) таких, что можно получить \(S = \{j\}\), выполнив вышеописанную операцию ровно \(i - 1\) раз.

Для каждого целого числа \(i\) от \(x\) до \(n\) необходимо найти \(f(i)\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(x\) (\(1 \leq n \leq 2 \cdot 10^5; x = 1\)) — количество шаров и наименьший индекс \(i\), для которого нужно найти \(f(i)\).

Вторая строка каждого набора входных данных содержит \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq 10^9\)) — начальное число, записанное на каждом шаре.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите на отдельной строке \(n-x+1\) целых числа, разделенных пробелом, где \(j\)-е целое число равняется \(f(x+j-1)\).

Примечание

Для первого набора входных данных ниже приведены возможные значения \(j\) для каждого \(f(i)\) от \(1\) до \(n\).

  • Для \(f(1)\) единственным возможным значением \(j\) является \(1\).
  • Для \(f(2)\) единственным возможным значением \(j\) является \(2\).
  • Для \(f(3)\) возможные значения \(j\): \(2\) и \(3\).
  • Для \(f(4)\) возможные значения \(j\): \(2\) и \(3\).
  • Для \(f(5)\) возможные значения \(j\): \(2\), \(3\) и \(4\).

A. Снова A+B?

математика реализация *800

Дано двузначное положительное целое число \(n\), найдите сумму его цифр.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 90\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит одно двузначное положительное целое число \(n\) (\(10 \leq n \leq 99\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число — сумму цифр числа \(n\).

B. Карточная игра

Конструктив Перебор реализация *1000

Сунит и Славик играют в карточную игру. Правила игры следующие:

  • Каждая карта имеет целочисленное значение от \(1\) до \(10\).
  • Каждый игрок получает \(2\) карты, которые лежат лицом вниз (поэтому игрок не знает свои карты).
  • Игра состоит ровно из двух раундов. В раунде оба игрока выбирают случайную неоткрытую карту и открывают её. Игрок, который открыл карту с более высоким значением, выигрывает раунд. В случае равенства никто не выигрывает раунд.
  • Игрок выигрывает игру, если он выигрывает строго больше раундов, чем другой игрок. В случае равенства никто не выигрывает игру.

Поскольку Сунит и Славик не лучшие друзья, вам нужно вычислить количество способов, при которых игра могла бы закончиться победой Сунита.

Для лучшего понимания, пожалуйста, ознакомьтесь с разделом примечаний.

Входные данные

Первая строка входных данных содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит \(4\) целых числа \(a_1\), \(a_2\), \(b_1\), \(b_2\) (\(1 \leq a_1, a_2, b_1, b_2 \leq 10\)), где \(a_1\) и \(a_2\) представляют карты Сунита, а \(b_1\) и \(b_2\) представляют карты Славика соответственно.

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество игр, которые Сунит выиграет среди всех возможных игр.

Примечание

Рассмотрим первый набор входных данных, когда Славик начинает с карт, имеющих значения \(2\) и \(6\), а Сунит начинает с карт, имеющих значения \(3\) и \(8\). Игра может пройти \(4\) различными способами:

  • Сунит открывает \(3\), а Славик открывает \(2\). Сунит выигрывает первый раунд. Затем Сунит открывает \(8\), а Славик открывает \(6\). Сунит выигрывает второй раунд. Поскольку Сунит выиграл \(2\) раунда, он выигрывает игру.

  • Сунит открывает \(3\), а Славик открывает \(6\). Славик выигрывает первый раунд. Затем Сунит открывает \(8\), а Славик открывает \(2\). Сунит выигрывает второй раунд. Никто не выигрывает, так как оба игрока выиграли равное количество раундов.

  • Сунит открывает \(8\), а Славик открывает \(6\). Сунит выигрывает первый раунд. Затем Сунит открывает \(3\), а Славик открывает \(2\). Сунит выигрывает второй раунд. Поскольку Сунит выиграл \(2\) раунда, он выигрывает игру.

  • Сунит открывает \(8\), а Славик открывает \(2\). Сунит выигрывает первый раунд. Затем Сунит открывает \(3\), а Славик открывает \(6\). Славик выигрывает раунд. Никто не выигрывает, так как оба игрока выиграли равное количество раундов.

C. Душ

жадные алгоритмы реализация *800

Как студент факультета компьютерных наук, Алекс сталкивается с трудной задачей — принятием душа. Он старается принимать душ ежедневно, но, несмотря на все его усилия, всегда возникают препятствия. Ему требуется \(s\) минут, чтобы принять душ, а в сутках всего \(m\) минут!

У него уже запланировано \(n\) задач на день. Задача \(i\) представлена интервалом \((l_i\), \(r_i)\), что означает, что Алекс занят и не может принять душ в этот временной интервал (в любой момент времени строго между \(l_i\) и \(r_i\)). Ни одна из задач не пересекается с другой.

Учитывая все \(n\) временных интервалов, сможет ли Алекс принять душ в этот день? Другими словами, будет ли у Алекса свободный временной интервал длиной не менее \(s\)?

В первом примере Алекс может принять душ в первые \(3\) минуты дня и не пропустить ни одну из задач.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(s\) и \(m\) (\(1 \leq n \leq 2 \cdot 10^5\); \(1 \leq s, m \leq 10^9\)) — количество временных интервалов, которые Алекс уже запланировал, время, необходимое Алексу для принятия душа, и количество минут в сутках.

Затем следуют \(n\) строк, \(i\)-я из которых содержит два целых числа \(l_i\) и \(r_i\) (\(0 \leq l_i < r_i \leq m\)) — временной интервал \(i\)-й задачи. Ни одна из задач не накладывается на другую.

Дополнительное ограничение на входные данные: \(l_i > r_{i-1}\) для каждого \(i > 1\).

Сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если Алекс может принять душ для данного набора входных данных, и «NO» (также без кавычек) в противном случае.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», и «Yes» будут признаны положительным ответом).

D. Экзамен Славика

жадные алгоритмы реализация Строки *1100

У Славика очень сложный экзамен, и ему нужна ваша помощь, чтобы его сдать. Вот задача, с которой он столкнулся:

Дана строка \(s\), которая состоит из строчных английских букв и, возможно, нуля или более «?».

Славик должен заменить каждый «?» на строчную английскую букву так, чтобы строка \(t\) стала подпоследовательностью (необязательно непрерывной) строки \(s\).

Выведите любую подходящую строку или скажите, что это невозможно, если не существует строки, которая соответствует условиям.

Входные данные

Первая строка содержит одно целое число \(T\) (\(1 \leq T \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одну строку \(s\) (\(1 \leq |s| \leq 2 \cdot 10^5\), и \(s\) состоит только из строчных английских букв и символов «?»)  — исходная строка, которую вы имеете.

Вторая строка каждого набора входных данных содержит одну строку \(t\) (\(1 \leq |t| \leq |s|\), и \(t\) состоит только из строчных английских букв)  — строка, которая должна быть подпоследовательностью строки \(s\).

Сумма \(|s|\) по всем наборам входных данных не превышает \(2 \cdot 10^5\), \(|x|\) обозначает длину строки \(x\).

Выходные данные

Для каждого набора входных данных, если такой строки не существует, как описано в условии, выведите «NO» (без кавычек).

В противном случае выведите «YES» (без кавычек). Затем выведите одну строку — строку, которая соответствует всем условиям.

Вы можете выводить «YES» и «NO» в любом регистре (например, строки «yEs», «yes», и «Yes» будут признаны положительным ответом).

Если возможно несколько ответов, вы можете вывести любой из них.

E. Тройные операции

дп математика реализация *1300

На доске Иви записаны все целые числа от \(l\) до \(r\), включительно.

В операции она делает следующее:

  • выбирает два числа \(x\) и \(y\) на доске, стирает их и на их месте записывает числа \(3x\) и \(\lfloor \frac{y}{3} \rfloor\). (Здесь \(\lfloor \bullet \rfloor\) обозначает округление вниз до ближайшего целого числа).

Какое минимальное количество операций необходимо Иви, чтобы сделать все числа на доске равными \(0\)? У нас есть доказательство, что это всегда возможно.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит два целых числа \(l\) и \(r\) (\(1 \leq l < r \leq 2 \cdot 10^5\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимых для того, чтобы сделать все числа на доске равными \(0\).

Примечание

В первом наборе входных данных мы можем выполнить \(5\) операций следующим образом: \(\) 1,2,3 \xrightarrow[x=1,\,y=2]{} 3,0,3 \xrightarrow[x=0,\,y=3]{} 1,0,3 \xrightarrow[x=0,\,y=3]{} 1,0,1 \xrightarrow[x=0,\,y=1]{} 0,0,1 \xrightarrow[x=0,\,y=1]{} 0,0,0 .\(\)

A. Победитель

реализация хэши *1500

Победитель популярной в Берляндии карточной игры «Берлоггинг» определяется по следующим правилам. Если на момент окончания игры существует только один игрок, набравший максимальное количество очков, то он и становится победителем.

Ситуация осложняется, если таких игроков несколько. Каждый кон игры некоторый игрок выигрывает или проигрывает некоторое количество очков. В записи о ходе игры это обозначается строкой «name score», где name это имя игрока, а score целое число обозначающее количество заработанных очков данным игроком. Если score — отрицательное число, это обозначает, что игрок проиграл в этом коне. Так вот, если на конец игры несколько игроков набрали максимум очков (пусть это число равно m), то выигрывает тот из них, кто первым набрал как минимум m очков. Перед началом игры у каждого игрока 0 очков. Гарантируется, что на момент окончания игры хотя бы у одного игрока положительное число очков.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000), n — количество конов сыгранной игры. Далее в n строках идут описания конов, в формате «name score» в хронологическом порядке, где name это строка из строчных букв латинского алфавита длины от 1 до 32, а score это целое число от -1000 до 1000 включительно.

Выходные данные

Выведите имя победителя игры «Берлоггинг».

A. Файловая система BerOS

реализация *1700

В новой операционной системе BerOS (кроме нескучных обоев) была введена новая очень удобная возможность — в записи пути к директории можно использовать в качестве разделителя не один традиционный слэш, а любое количество. Например, записи //usr///local//nginx/sbin// и /usr/local/nginx///sbin эквивалентны. Символ '/' (или несколько таких символов) в конце записи пути к директории необходим только в случае записи пути к корневой директории, которая может быть задана одним символом '/'.

Назовем нормализованной записью пути запись, в которой содержится наименьшее возможное количество символов '/'.

Ваша задача — для заданной записи пути найти нормализованную запись этого же пути.

Входные данные

Одна строка, состоящая из маленьких латинских букв и символов '/' — путь к какой-либо директории. Все пути начинаются как минимум с одного символа '/'. Длина строки — не более 100 символов. Строка не пуста.

Выходные данные

Путь в нормализованном виде.

B. Напитки

математика реализация *800

Маленький мальчик Вася очень любит апельсиновый сок, и поэтому в любом продукте и напитке у него на кухне обязательно содержится апельсиновый сок. В его холодильнике хранятся n напитков, объемная доля апельсинового сока в i-ом напитке составляет pi процентов.

Однажды Вася решил приготовить себе апельсиновый коктейль, и для этого он взял в равных пропорциях каждого из n напитков и смешал. После этого ему стало интересно, как много апельсинового сока содержится в его коктейле.

Найдите объемную долю апельсинового сока в получившемся напитке.

Входные данные

В первой строке входного файла содержится единственное целое число n (1 ≤ n ≤ 100) — количество апельсиновых напитков в холодильнике у Васи. Во второй строке находятся n целых чисел pi (0 ≤ pi ≤ 100) — объемная доля в процентах апельсинового сока в i-ом напитке. Числа разделены пробелом.

Выходные данные

Выведите объемную долю в процентах апельсинового сока в коктейле Васи. Ответ будет считаться верным, если его абсолютная или относительная погрешность не превышает 10  - 4.

Примечание

Пояснение к первому примеру: пусть Вася возьмет из холодильника каждого напитка по x миллилитров. Тогда количество чистого сока, которое будет в коктейле равно миллилитров. Общий объем коктейля равен x миллилитров, значит, объемная доля сока в коктейле равна , то есть, 66.(6) процентов.

C. Чемпионат по футболу

Перебор реализация *1800

Все совпадения с какими-либо реальными чемпионатами и видами спорта случайны.

Сборная Берляндии участвует в местном чемпионате по футболу, и сейчас в чемпионате проходит групповой этап. Опишем формальные правила местного чемпионата:

  • матч выигрывает та команда, которая забила больше голов в ворота противника;
  • за победу команде начисляется 3 очка, за ничью — 1 очко, за проигрыш — 0 очков;
  • группа состоит из 4 команд, и для ранжирования команд в группе играются 6 матчей: каждая команда с каждой играет ровно один раз;
  • в следующий этап чемпионата выходят команды, занявшие 1 и 2 место по результатам группового этапа.

В групповом этапе место команды определяется суммарным количеством набранных очков: чем больше очков, тем выше место. В случае, если у двух или более сборных совпадает количество очков, используются следующие критерии (критерии расположены в порядке приоритета, начиная с самого значимого):

  • разность общего количества забитых мячей и общего количества пропущенных мячей в чемпионате: выше место у команды, у которой этот показатель больше;
  • общее количество забитых мячей в чемпионате: выше место у команды, у которой этот показатель больше;
  • лексикографический порядок названий стран, за которые выступают команды: выше место у команды, у которой название лексикографически меньше.

В группе, где участвует команда Берляндии, уже известны результаты 5 матчей из 6, а точнее, остался последний матч, где сборная Берляндии играет с некоторой другой командой. Тренер сборной просит Вас найти такой счет X:Y (где X — количество голов, забитых Берляндией, а Y — количество голов, забитых оппонентом в этом матче), который удовлетворяет условиям:

  • X > Y, то есть Берляндия собирается выигрывать в этом матче;
  • после этого матча Берляндия попадает на 1 или 2 место в группе;
  • в случае неоднозначного выбора требуется выбрать счет X:Y, при котором величина X - Y принимает наименьшее значение;
  • если все еще невозможно однозначно определить счет, то нужно выбрать тот, в котором величина Y (количество пропущенных Берляндией голов) минимальна.
Входные данные

Входные данные состоят из пяти строк.

Каждая строка — это описание матча в формате «team1 team2 goals1:goals2» (без кавычек), которое обозначает, что команда team1 сыграла матч с командой team2, при этом команда team1 забила goals1 голов, а team2goals2 голов. Названия команд team1 и team2 — это непустые строки, состоящие из заглавных латинских букв, длиной не более 20 символов; goals1, goals2 — это целые числа от 0 до 9.

Команда Берляндии имеет название «BERLAND». Гарантируется, что команда Берляндии и еще одна из команд сыграли ровно 2 матча, а остальные — 3 матча.

Выходные данные

Выведите искомый счет в последнем матче в формате X:Y, где X — количество голов, забитых Берляндией, а Y — количество голов, забитых оппонентом. Если команда Берляндии при любом исходе не попадает на 1 или 2 место в группе, то выведите единственную строку «IMPOSSIBLE» (без кавычек).

Обратите внимание, что выводимый счет может быть сколь угодно большим, например 10:0.

Примечание

В первом примере финальный матч команда «BERLAND» проводит с командой «CERLAND». В случае выигрыша команды Берляндии со счетом 6:0 итоговая таблица примет вид:

  1. AERLAND (очков: 9, разность забитых и пропущенных: 4, забитые голы: 5)
  2. BERLAND (очков: 3, разность забитых и пропущенных: 0, забитые голы: 6)
  3. DERLAND (очков: 3, разность забитых и пропущенных: 0, забитые голы: 5)
  4. CERLAND (очков: 3, разность забитых и пропущенных: -4, забитые голы: 3)

Во втором примере команды «AERLAND» и «DERLAND» уже набрали 7 и 4 очков соответственно. Команда Берляндии наберет лишь 3 очка, что недостаточно для выхода в следующий этап соревнований.

D. Язык программирования

Бинарный поиск Перебор Разбор выражений реализация *1800

Недавно Валерий познакомился с совершенно новым языком программирования. Больше всего в этом языке его привлекли шаблонные функции и процедуры. Напомним, что шаблонами называются средства языка, предназначенные для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).

Валерий решил более подробно изучить шаблонные процедуры этого языка. Описание шаблонной процедуры состоит из имени процедуры и списка типов ее параметров. В качестве параметров шаблонных процедур могут использоваться параметры обобщенного типа T.

Вызов процедуры состоит из имени процедуры и списка переменных-параметров. Назовем процедуру подходящей для данного вызова, если выполняются условия:

  • ее имя совпадает с именем вызванной процедуры;
  • количество ее параметров совпадает с количеством параметров вызванной процедуры;
  • типы ее параметров совпадают с соответствующими типами переменных в вызове процедуры. Тип параметра совпадает с типом переменной, если параметр имеет обобщенный тип T, либо типы переменной и параметра совпадают.

Вам дано описание некоторого набора шаблонных процедур. Также дан список переменных, используемых в программе, а также непосредственные вызовы процедур с использованием описанных переменных. Для каждого вызова от Вас требуется посчитать количество процедур, подходящих данному вызову.

Входные данные

В первой строке задано единственное целое число n (1 ≤ n ≤ 1000) — количество шаблонных процедур. Далее в n строках задано описание процедур, в следующем формате:

«void procedureName (type_1, type_2, ..., type_t)» (1 ≤ t ≤ 5), где void — ключевое слово, procedureName — имя процедуры, type_i — тип очередного параметра. Типами параметров языка могут являться «int», «string», «double», а также ключевое слово «T», которое обозначает обобщенный тип.

В следующей строке задано единственное целое число m (1 ≤ m ≤ 1000) — количество используемых переменных. Далее в m строках задано описание переменных, в следующем формате:

«type variableName», где type — тип переменной, который может принимать значения «int», «string», «double», variableName — имя переменной.

В следующей строке задано единственное целое число k (1 ≤ k ≤ 1000) — количество вызовов процедур. Далее в k строках заданы вызовы процедур в следующем формате:

«procedureName (var_1, var_2, ..., var_t)» (1 ≤ t ≤ 5), где procedureName — имя процедуры, var_i — имя очередной переменной.

В строках описания переменных, шаблонных процедур и их вызовов могут присутствовать пробелы в начале строки, в конце строки, перед и после скобок и запятых. Пробелы могут присутствовать до и после ключевого слова void. Длина каждой строки входных данных не превосходит 100 символов. Имена переменных и процедур являются непустыми строками из латинских строчных букв и цифр длиной не более 10 символов. Отметим, что это — единственное ограничение на имена переменных и процедур. В вызовах процедур используются только описанные переменные. Имена переменных различны. Никакие две процедуры не совпадают. Две процедуры совпадают, если они имеют одинаковые имена, а также упорядоченные наборы типов их параметров совпадают.

Выходные данные

В каждую из k строк выведите единственное число. Число в i-ой строке означает количество подходящих шаблонных процедур под i-ый вызов. Вызовы нумеруются в том порядке, в котором они заданы во входных данных.

E. Тракторный институт

математика реализация теория чисел Тернарный поиск *2400

Пока большинство студентов все еще сдает экзамены, в тракторном институте сессия уже завершилась. В этом институте студенты изучают всего одну дисциплину — искусство тракторного дела. Поэтому за целую сессию в зачетку студента ставится всего одна оценка — тройка, четверка или пятерка. Двоечников, к сожалению, отчисляют.

В институте учится n студентов, и, как ни странно, каждый из них может получать стипендию. Каждый семестр размер стипендии меняется. Поскольку сессия толька завершилась, то самое время определить размер стипендии до конца следующего семестра.

Месячный бюджет стипендии тракторного института составляет s рублей. Чтобы распределить этот бюджет оптимально, необходимо придерживаться следующих правил:

  • Студенты, получившие одинаковые оценки за сессию, должны получать одинаковую стипендию;
  • Обозначим размер стипендии (в рублях) студентов, получивших оценки 3, 4 и 5 за экзамен, k3, k4 и k5 соответственно. Величины k3, k4 и k5 должны быть целыми числами и удовлетворять неравенствам 0 ≤ k3 ≤ k4 ≤ k5;
  • Пусть c3, c4, c5 — количество студентов, получивших оценку за сессию 3, 4 и 5 соответственно. Бюджет стипендии нужно потратить полностью, то есть c3·k3 + c4·k4 + c5·k5 = s;
  • Введем функцию — величину, показывающую насколько хорошо распределена стипендия между студентами. В оптимальном распределении функция f(k3, k4, k5) принимает минимально возможное значение.

Зная результаты сессии и размер бюджета s, от Вас требуется найти оптимальное распределение стипендии.

Входные данные

В первой строке заданы два целых числа n, s (3 ≤ n ≤ 300, 1 ≤ s ≤ 3·105) — количество студентов и размер бюджета стипендии соответственно. Во второй строке задано n целых чисел, где i-ое число означает оценку за экзамен i-го студента. Гарантируется, что каждую оценку получил хотя бы один студент.

Выходные данные

В единственной строке выведите три целых числа k3, k4 и k5 — искомые величины, обозначающие оптимальное распределение размеров стипендии. Если оптимальных ответов несколько, выведите любой из них. Если ответа не существует, выведите -1.

A. Первостепенная задача

математика реализация Строки *800

Дмитрий записал на доске \(t\) чисел, и это хорошо. Он уверен, что потерял среди них важное число \(n\), и это плохо.

Число \(n\) имело вид \(\text{10^x}\) (\(x \ge 2\)), где символ '\(\text{^}\)' обозначает возведение в степень. Что-то пошло не так, и Дмитрий при записи важного числа пропустил символ '\(\text{^}\)'. Например, вместо числа \(10^5\) он бы записал \(105\), а вместо \(10^{19}\) он бы записал \(1019\).

Дмитрий хочет понять, какие из чисел на доске могли быть важным числом, а какие нет.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество чисел на доске.

Далее следуют \(t\) строк, каждая из них содержит число \(a\) (\(1 \le a \le 10000\)) — очередное число с доски.

Выходные данные

Для каждого числа с доски выведите «YES», если оно могло быть важным числом и «NO» иначе.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

D. Right Left Wrong

жадные алгоритмы реализация *1200

Влад нашёл полоску из \(n\) клеток, пронумерованных слева направо от \(1\) до \(n\). На \(i\)-й клетке записаны положительное целое число \(a_i\) и буква \(s_i\), все \(s_i\) равны либо 'L' либо 'R'.

Влад предлагает вам попробовать набрать максимально возможное количество очков, сделав любое (возможно нулевое) количество операций.

За одну операцию вы можете выбрать два индекса \(l\) и \(r\) (\(1 \le l < r \le n\)), такие что \(s_l\) = 'L' и \(s_r\) = 'R' и сделать следующее:

  • прибавить к текущему счёту \(a_l + a_{l + 1} + \dots + a_{r - 1} + a_r\) очков;
  • заменить \(s_i\) на '.' для всех \(l \le i \le r\), то есть выбирать эти индексы вы больше не сможете.

Для примера рассмотрим следующую полоску:

\(3\)\(5\)\(1\)\(4\)\(3\)\(2\)
LRLLLR

Можно сначала выбрать \(l = 1\), \(r = 2\) и добавить к своему счёту \(3 + 5 = 8\)

\(3\)\(5\)\(1\)\(4\)\(3\)\(2\)
..LLLR

Затем выбрать \(l = 3\), \(r = 6\) и прибавить к счёту \(1 + 4 + 3 + 2 = 10\)

\(3\)\(5\)\(1\)\(4\)\(3\)\(2\)
......

В результате невозможно выполнить ещё одну операцию, а итоговый счёт равен \(18\).

Какой максимальный счёт можно набрать?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — длину полоски.

Вторая строка каждого набора содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^5\)) — числа, записанные на полоске.

Третья строка каждого набора содержит строку \(s\) из \(n\) символов 'L' и 'R'.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное возможное количество очков, которое можно набрать.

F. Закрась строки и столбцы

дп жадные алгоритмы математика реализация *1900

У вас есть \(n\) прямоугольников, \(i\)-й из которых имеет ширину \(a_i\) и высоту \(b_i\).

Вы можете неограниченное количество раз выполнить следующую операцию: выбрать прямоугольник и клетку в нём, а затем закрасить её.

Каждый раз, когда вы закрашиваете целиком какую-либо строку или столбец, вы получаете \(1\) балл. Ваша задача — набрать хотя бы \(k\) баллов за как можно меньшее число операций.

Допустим, у вас есть прямоугольник ширины \(6\) и высоты \(3\). Вы можете набрать \(4\) очка, закрасив все клетки в \(4\)-х любых столбцах, выполнив таким образом \(12\) операций.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

Первая строка описания каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 1000, 1 \le k \le 100\)) — количество прямоугольников в наборе и требуемое количество баллов.

Следующие \(n\) строк содержат описания прямоугольников. \(i\)-я строка содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 100\)) — ширину и высоту \(i\)-го прямоугольника.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество операций, необходимое для того, чтобы набрать хотя бы \(k\) очков. Если набрать хотя бы \(k\) очков невозможно, выведите -1.

H. Ксюша и загруженное множество

Бинарный поиск Перебор реализация Структуры данных *2200

Ксюша решила основать компанию по производству игр. Чтобы выделиться среди конкурентов и добиться успеха, она решила написать свой игровой движок. Движок должен поддерживать множество, изначально состоящее из \(n\) различных целых чисел \(a_1, a_2, \ldots, a_n\).

К множеству будут последовательно применяться \(m\) операций. Операции бывают следующих типов:

  • Вставить элемент \(x\) в множество;
  • Удалить элемент \(x\) из множества;
  • Сообщить \(k\)-загруженность множества.

\(k\)-загруженностью множества называется такое минимальное целое положительное число \(d\), что числа \(d, d + 1, \ldots, d + (k - 1)\) не встречаются в этом множестве. Например, \(3\)-загруженность множества \(\{3, 4, 6, 11\}\) равна \(7\), так как числа \(7, 8, 9\) отсутствуют в множестве, а никакое меньшее значение не подходит.

Ксюша занята менеджерскими делами, поэтому движок придётся писать вам. Реализуйте эффективную поддержку описанных операций.

Входные данные

В первой строке дано целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Далее следуют описания наборов.

В первой строке дано целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — начальный размер множества.

Во второй строке даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_1 < a_2 < \ldots < a_n \le 2 \cdot 10^6\)) — начальное состояние множества.

В третьей строке дано целое число \(m\) (\(1 \le m \le 2 \cdot 10^5\)) — количество операций.

В следующих \(m\) строках даны операции. Операции даны в следующем формате:

  • + \(x\) (\(1 \le x \le 2 \cdot 10^6\)) — вставить элемент \(x\) в множество (гарантируется, что \(x\) отсутствует в множестве);
  • - \(x\) (\(1 \le x \le 2 \cdot 10^6\)) — удалить элемент \(x\) из множества (гарантируется, что \(x\) присутствует в множестве);
  • ? \(k\) (\(1 \le k \le 2 \cdot 10^6\)) — вывести значение \(k\)-загруженности множества.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\), то же самое гарантируется для \(m\).

Выходные данные

Для каждого набора входных данных выведите ответы на операции типа «?».

A. Сделать все равными

жадные алгоритмы реализация *800

Вам дан циклический массив \(a_1, a_2, \ldots, a_n\).

Вы можете выполнить следующую операцию над \(a\) не более \(n - 1\) раз:

  • Пусть \(m\) — текущая длина \(a\). Вы можете выбрать любые два соседних элемента, где предыдущий элемент не больше следующего (в частности, \(a_m\) и \(a_1\) являются соседними, причём \(a_m\) — предыдущий), и удалить ровно один из них. Другими словами, выберите целое число \(i\) (\(1 \leq i \leq m\)), для которого выполняется \(a_i \leq a_{(i \bmod m) + 1}\), и удалите из \(a\) либо \(a_i\), либо \(a_{(i \bmod m) + 1}\).

Ваша цель — найти минимальное количество операций, необходимых для того, чтобы сделать все элементы в \(a\) равными.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)) — длина массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — элементы массива \(a\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую целое число: минимальное количество операций, необходимых для того, чтобы сделать все элементы в \(a\) равными.

Примечание

В первом наборе входных данных в \(a\) есть только один элемент, поэтому мы не можем выполнить ни одной операции.

Во втором наборе входных данных мы можем выполнить следующие операции, чтобы сделать все элементы в \(a\) равными:

  • выбрать \(i = 2\), удалить \(a_3\), тогда \(a\) станет \([1, 2]\).
  • выбрать \(i = 1\), удалить \(a_1\), тогда \(a\) станет \([2]\).

Можно доказать, что нельзя сделать все элементы в \(a\) равными, используя менее \(2\) операций, поэтому ответ — \(2\).

D. Самая длинная подпоследовательность

жадные алгоритмы Конструктив Перебор реализация Структуры данных *1900

Вам дана последовательность целых чисел \(a_1, a_2, \ldots, a_n\). Пусть \(S\) — множество всех непустых подпоследовательностей \(a\), в которых нет одинаковых элементов. Ваша цель — найти самую длинную последовательность в \(S\). Если таких несколько, найдите ту, которая минимизирует лексикографический порядок после умножения членов в нечетных позициях на \(-1\).

Например, при \(a = [3, 2, 3, 1]\), \(S = \{[1], [2], [3], [2, 1], [2, 3], [3, 1], [3, 2], [2, 3, 1], [3, 2, 1]\}\). Тогда \([2, 3, 1]\) и \([3, 2, 1]\) будут самыми длинными, а \([3, 2, 1]\) будет ответом, так как \([-3, 2, -1]\) лексикографически меньше, чем \([-2, 3, -1]\).

Последовательность \(c\) является подпоследовательностью последовательности \(d\), если \(c\) может быть получена из \(d\) путем удаления нескольких (возможно, нуля или всех) элементов.

Последовательность \(c\) лексикографически меньше последовательности \(d\) тогда и только тогда, когда выполняется одно из следующих условий:

  • \(c\) является префиксом \(d\), но \(c \ne d\);
  • в первой позиции, где \(c\) и \(d\) различаются, последовательность \(c\) имеет меньший элемент, чем соответствующий элемент в \(d\).
Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)) — длина \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — последовательность \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ в следующем формате:

Выведите целое число \(m\) в первой строке — длину \(b\).

Затем выведите \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) во второй строке — последовательность \(b\).

Примечание

В первом примере \(S = \{[1], [2], [3], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2], [2, 1, 3], [3, 2, 1]\}\). Среди них \([2, 1, 3]\) и \([3, 2, 1]\) — самые длинные, а \([-3, 2, -1]\) лексикографически меньше \([-2, 1, -3]\), поэтому \([3, 2, 1]\) — ответ.

Во втором примере \(S = \{[1]\}\), поэтому \([1]\) — ответ.

A. Дистанционная раскраска

Конструктив математика реализация *800

Вы получили сетку размером \(n\times m\) от таинственного источника. Источник также дал вам волшебную целую положительную константу \(k\).

Источник сказал вам покрасить сетку некоторыми цветами, удовлетворяя следующее условие:

  • Если \((x_1,y_1)\), \((x_2,y_2)\) — это две различные клетки одинакового цвета, то \(\max(|x_1-x_2|,|y_1-y_2|)\ge k\).

Вам не нравится использовать слишком много цветов. Пожалуйста, найдите минимальное количество цветов, необходимое для раскрашивания сетки.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1\le t\le1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит три целых числа \(n\), \(m\), \(k\) (\(1\le n,m,k\le10^4\)) — размеры сетки и магическая константа.

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество цветов, необходимое, чтобы покрасить сетку.

Примечание

В первом наборе входных данных одной из оптимальных конструкций является:

Во втором наборе входных данных цвета всех ячеек должны быть попарно различными, поэтому ответ — \(5\).

D2. Черепаха и задача MEX (сложная версия)

графы дп жадные алгоритмы математика поиск в глубину и подобное реализация *2100

Две версии — это разные задачи. В этой версии задачи нельзя выбирать одно и то же целое число дважды или более. Можно делать взломы только в том случае, если обе версии решены.

Однажды Черепаха играла с \(n\) последовательностями. Пусть длина \(i\)-й последовательности равна \(l_i\). Тогда \(i\)-я последовательность была \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, l_i}\).

Свинка дала Черепахе задачу, когда Черепаха играла. Условие задачи было следующим:

  • Сначала было неотрицательное целое число \(x\). Черепаха могла выполнять произвольное количество (возможно, ноль) операций с этим числом.
  • В каждой операции Черепаха могла выбрать целое число \(i\), такое что \(1 \le i \le n\) и \(i\) не было выбрано ранее, и сделать \(x\) равным \(\text{mex}^{\dagger}(x, a_{i, 1}, a_{i, 2}, \ldots, a_{i, l_i})\).
  • Черепаха должна была найти ответ, который был максимальным значением \(x\) после выполнения произвольного количества операций.

Черепаха без труда решила вышеуказанную задачу. Она определила \(f(k)\) как ответ на вышеуказанную задачу, когда начальное значение \(x\) было \(k\).

Затем Свинка дала Черепахе неотрицательное целое число \(m\) и попросил Черепаху найти значение \(\sum\limits_{i = 0}^m f(i)\) (т.е. значение \(f(0) + f(1) + \ldots + f(m)\)). К сожалению, она не смогла решить эту задачу. Пожалуйста, помогите ей!

\(^{\dagger}\text{mex}(c_1, c_2, \ldots, c_k)\) определяется как наименьшее неотрицательное целое число \(x\), которое не встречается в последовательности \(c\). Например, \(\text{mex}(2, 2, 0, 3)\) равно \(1\), \(\text{mex}(1, 2)\) равно \(0\).

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \(t\) (\(1 \le t \le 10^4\)). Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n, m\) (\(1 \le n \le 2 \cdot 10^5, 0 \le m \le 10^9\)).

Каждая из следующих \(n\) строк содержит несколько целых чисел. Первое целое число \(l_i\) (\(1 \le l_i \le 2 \cdot 10^5\)) представляет длину \(i\)-й последовательности, а следующие \(l_i\) целых числа \(a_{i, 1}, a_{i, 2}, \ldots, a_{i, l_i}\) (\(0 \le a_{i, j} \le 10^9\)) представляют элементы \(i\)-й последовательности.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\), а сумма \(\sum l_i\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — значение \(\sum\limits_{i = 0}^m f(i)\).

Примечание

В первом наборе входных данных, когда \(x\) изначально равен \(2\), Черепаха может выбрать \(i = 3\) и сделать \(x\) равным \(\text{mex}(x, a_{3, 1}, a_{3, 2}, a_{3, 3}, a_{3, 4}) = \text{mex}(2, 7, 0, 1, 5) = 3\). Можно доказать, что Черепаха не может сделать значение \(x\) больше \(3\), поэтому \(f(2) = 3\).

Можно увидеть, что \(f(0) = 3\), \(f(1) = 3\), \(f(2) = 3\), \(f(3) = 3\), и \(f(4) = 4\). Таким образом, \(f(0) + f(1) + f(2) + f(3) + f(4) = 3 + 3 + 3 + 3 + 4 = 16\).

Во втором наборе входных данных, когда \(x\) изначально равен \(1\), Черепаха может выбрать \(i = 1\) и сделать \(x\) равным \(\text{mex}(x, a_{1, 1}, a_{1, 2}, a_{1, 3}, a_{1, 4}, a_{1, 5}) = \text{mex}(1, 0, 2, 0, 4, 11) = 3\). Можно доказать, что Черепаха не может сделать значение \(x\) больше \(3\), поэтому \(f(1) = 3\).

Можно увидеть, что \(f(0) = 4\), \(f(1) = 3\), \(f(2) = 4\), \(f(3) = 3\), и \(f(4) = 4\). Таким образом, \(f(0) + f(1) + f(2) + f(3) + f(4) = 4 + 3 + 4 + 3 + 4 = 18\).

В четвертом наборе входных данных можно увидеть, что \(f(0) = 3\) и \(f(1) = 1\). Таким образом, \(f(0) + f(1) = 3 + 1 = 4\).

A. Ближайшая точка

математика реализация *800

Рассмотрим множество точек на прямой. Расстояние между двумя точками \(i\) и \(j\) равно \(|i - j|\).

Точка \(i\) из множества является ближайшей к точке \(j\) из множества, если в множестве нет другой точки \(k\), такой, что расстояние от \(j\) до \(k\) строго меньше расстояния от \(j\) до \(i\). Другими словами, все остальные точки из множества имеют расстояние до \(j\), большее или равное \(|i - j|\).

Например, рассмотрим множество точек \(\{1, 3, 5, 8\}\):

  • для точки \(1\) ближайшей точкой является \(3\) (другие точки имеют расстояние больше, чем \(|1-3| = 2\));
  • для точки \(3\) ближайшими точками являются \(1\) и \(5\);
  • для точки \(5\) ближайшей точкой является \(3\) (но не \(8\), так как расстояние до нее больше, чем \(|3-5|\));
  • для точки \(8\) ближайшей точкой является \(5\).

Вам дано множество точек. Вам нужно добавить целочисленную точку в это множество таким образом, чтобы она отличалась от каждой существующей точки в множестве и стала ближайшей точкой ко всем точкам в множестве. Возможно ли это?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк:

  • первая строка содержит одно целое число \(n\) (\(2 \le n \le 40\)) — количество точек в множестве;
  • вторая строка содержит \(n\) целых чисел \(x_1, x_2, \dots, x_n\) (\(1 \le x_1 < x_2 < \dots < x_n \le 100\)) — точки из множества.
Выходные данные

Для каждого набора входных данных выведите YES, если возможно добавить новую точку в соответствии с условиями задачи. В противном случае выведите NO.

Примечание

В первом примере точка \(7\) будет ближайшей как к \(3\), так и к \(8\).

Во втором примере невозможно добавить целочисленную точку так, чтобы она стала ближайшей как к \(5\), так и к \(6\), и отличалась от обеих.

D. Цветные порталы

Бинарный поиск графы жадные алгоритмы кратчайшие пути Перебор реализация Структуры данных *1600

На прямой расположено \(n\) городов. Города пронумерованы целыми числами от \(1\) до \(n\).

Для перемещения между городами используются порталы. Порталы бывают \(4\) цветов: синий, зеленый, красный и желтый. В каждом городе расположены порталы двух разных цветов. Из города \(i\) можно переместиться в город \(j\), если в них есть порталы одинакового цвета (например, между городом «красный-синий» и городом «синий-зеленый» можно перемещаться). Данное перемещение стоит \(|i-j|\) монет.

Ваша задача — ответить на \(q\) независимых запросов: посчитайте минимальную стоимость, чтобы переместиться из города \(x\) в город \(y\).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество городов и количество запросов, соответственно.

Вторая строка содержит \(n\) строк одного из следующих типов: BG, BR, BY, GR, GY или RY; \(i\)-я из них описывает порталы, находящиеся в \(i\)-м городе; символ B обозначает, что в городе есть портал синего цвета, G — зеленого, R — красного, а Y — желтого.

\(j\)-я из следующих \(q\) строк содержит два целых числа \(x_j\) и \(y_j\) (\(1 \le x_j, y_j \le n\)) — описание \(j\)-го запроса.

Дополнительные ограничения на входные данные:

  • сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\);
  • сумма \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).
Выходные данные

Для каждого запроса выведите одно целое число — минимальную стоимость, чтобы переместиться из города \(x\) в город \(y\) (или \(-1\), если это невозможно).

C. Лентяй Нарек

дп реализация Строки *1800

Нареку лень придумывать третью задачу этого контеста, поэтому его друг Артур предложил использовать ChatGPT. ChatGPT сгенерировал \(n\) задач, каждая из которых состоит из \(m\) букв, и Нарек рассматривает их как \(n\) строк. Чтобы усложнить задачу, он комбинирует задачи, выбирая некоторые из \(n\) строк (возможно, ни одной) и располагая их без изменения порядка. Его шанс решить задачу определяется как \(score_n - score_c\), где \(score_n\) — счёт Нарека, а \(score_c\) — счёт ChatGPT.

Нарек вычисляет \(score_n\), изучая выбранную строку (он двигается слева направо). Изначально он ищет букву \(\texttt{«n»}\), после неё буквы \(\texttt{«a»}\), \(\texttt{«r»}\), \(\texttt{«e»}\) и \(\texttt{«k»}\). Найдя все вхождения этих букв, он увеличивает \(score_n\) на \(5\) и возобновляет поиск \(\texttt{«n»}\) (он не возвращается назад, а просто продолжает с того места, на котором остановился).

После того как Нарек закончит, ChatGPT просматривает строку и увеличивает \(score_c\) на \(1\) для каждой буквы \(\texttt{«n»}\), \(\texttt{«a»}\), \(\texttt{«r»}\), \(\texttt{«e»}\), или \(\texttt{«k»}\), которые Нарек не смог использовать. Обратите внимание, что если Нарек не смог завершить последнее вхождение, найдя все \(5\) букв, то использованные им буквы учитываются в счёте ChatGPT \(score_c\), а Нарек не получает никаких очков, если он не закончил поиск всех 5 букв.

Помогите Нареку максимизировать значение \(score_n - score_c\), выбрав наиболее оптимальное подмножество начальных строк.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных даны два целых числа \(n, m\) (\(1 \le n, m \le 10^3\)) — количество строк и длина строк.

В следующих \(n\) строках даны \(n\) строк, каждая из которых имеет длину \(m\). В строках содержатся только строчные буквы латинского алфавита.

Сумма значений \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: максимально возможное значение \(score_n - score_c\).

Примечание

В первом наборе входных данных один из оптимальных ответов — когда Нарек не выбирает ни одну из строк, поэтому ответ равен \(0\). В качестве альтернативы он может выбрать все строки. В этом случае полная строка становится «nnaarreekk». Нарек может выбрать первые появления всех букв и добавить к счету \(5\). Его соперник добавит по \(1\) за все вторые появления, что в сумме составит \(5\). Поэтому ответ будет \(5 - 5 = 0\).

В третьем наборе входных данных единственный оптимальный ответ — когда Нарек не выбирает строку. Обратите внимание, что если бы он выбрал строку, то не смог бы найти последнюю букву «k», поэтому его счёт остался бы на уровне \(0\), а не стал бы \(5\). Затем ChatGPT добавил бы \(4\) за \(4\) буквы, и разница счётов стала бы \(0 - 4 = -4\).

В последнем наборе входных данных Нареку нужно выбрать первую и последнюю строки. Поместив эти две строки рядом друг с другом, он получает «\({\color{red}{n}}rr{\color{red}{a}}{\color{red}{r}}{\color{red}{e}}{\color{red}{k}}{\color{red}{n}}k{\color{red}{a}}{\color{red}{r}}{\color{red}{e}}{\color{red}{k}}{\color{blue}{z}}\)». Нарек может выбрать буквы, отмеченные красным цветом, и добавить к своему счету \(10\). Так как буквы чёрного цвета, которые оставил Нарек, может забрать соперник (они используются в слове «Нарек»), то он прибавляет к счету все остальные буквы и получает счет \(3\). Таким образом, ответ составляет \(10 - 3 = 7\).

D. Измените НОД

Бинарный поиск Перебор разделяй и властвуй реализация Структуры данных теория чисел *2400

Вам даны два массива \(a_1, a_2, \ldots, a_n\) и \(b_1, b_2, \ldots, b_n\).

Вы должны выполнить следующую операцию ровно один раз:

  • выбрать любые индексы \(l\) и \(r\) такие, что \(1 \le l \le r \le n\);
  • поменять местами \(a_i\) и \(b_i\) для всех \(i\) таких, что \(l \leq i \leq r\).

Найдите максимально возможное значение \(\text{gcd}(a_1, a_2, \ldots, a_n) + \text{gcd}(b_1, b_2, \ldots, b_n)\) после выполнения операции ровно один раз. Также найдите количество различных пар \((l, r)\), для которых достигается максимальное значение.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

В первой строке каждого набора входных данных дается одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество чисел в массивах.

В следующей строке вам дается \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — элементы массива \(a\).

В последней строке даны \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \le b_i \le 10^9\)) — элементы массива \(b\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два целых числа: максимальное значение \(\text{gcd}(a_1, a_2, \ldots, a_n) + \text{gcd}(b_1, b_2, \ldots, b_n)\) после выполнения операции ровно один раз, и количество подходящих пар.

Примечание

В первом, третьем и четвертом наборах входных данных ни в одном из массивов нельзя получить НОД больше \(1\), поэтому ответ — \(1 + 1 = 2\). Любая пара \((l, r)\) достигает одинаковый результат, например, в первом примере \(36\) такиз пар.

В последнем наборе входных данных нужно выбрать \(l = 1\), \(r = 2\) для максимизации ответа. В этом случае НОД в первом массиве будет\(5\), а во втором — \(1\), поэтому ответ равен \(5 + 1 = 6\), а количество пар равно \(1\).

E1. Игра Подугольник (простая версия)

дп жадные алгоритмы игры реализация *2100

Это простая версия задачи. Разница между двумя версиями заключается в ограничениях на переменные. Вы можете делать взломы, только если решены обе версии задачи.

Цовак и Нарек играют в игру. У них есть массив \(a\) и матрица целых чисел \(b\) с \(n\) строками и \(m\) столбцами, пронумерованных с \(1\). Ячейка в \(i\)-й строке и \(j\)-м столбце обозначается \((i, j)\).

Они ищут элементы \(a\) по очереди; первым начинает Цовак. Каждый раз игрок ищет в матрице клетку, содержащую текущий элемент \(a\) (Цовак ищет первый, Нарек — второй и т.д.). Допустим, игрок выбрал клетку \((r, c)\). Следующий игрок должен выбрать свою клетку в подматрице, начинающейся в \((r + 1, c + 1)\) и заканчивающейся в \((n, m)\) (подматрица может быть пустой, если \(r=n\) или \(c=m\)). Если игрок не может найти такую клетку (или оставшаяся подматрица пуста) или массив заканчивается (предыдущий игрок выбрал последний элемент), то он проигрывает.

Ваша задача — определить победителя, если игроки играют оптимально.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 300\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(l\), \(n\) и \(m\) (\(1 \le l, n, m \le 300\)) – длина массива и размер матрицы.

Вторая строка содержит \(l\) целых чисел \(a_1, a_2, a_3, \ldots a_l\) (\(1 \le a_i \le \min(7, n \cdot m)\)) – элементы массива \(a\).

В \(i\)-й из последующих \(n\) строк содержится \(m\) целых чисел \(b_{i,1}, b_{i,2}, b_{i,3}, \ldots b_{i,m}\) (\(1 \le b_{i,j} \le \min(7, n \cdot m)\), представляющих \(i\)-ю строку матрицы.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^5\).

Гарантируется, что сумма \(l\) по всем наборам входных данных не превосходит \(300\).

Выходные данные

Вы должны вывести \(t\) строк, \(i\)-я из которых содержит символ, представляющий ответ на \(i\)-й набор входных данных: «T», если победил Цовак, или «N», в противном случае (без кавычек).

Примечание

В первом наборе входных данных Цовак начинает с поиска \(1\). Существует только одно вхождение \(1\) в \((1,1)\), поэтому он выбирает его. Затем Нареку нужно найти \(2\) в подматрице \((2, 2)\), которая состоит только из двух последних элементов: \(5\) и \(2\). Он выбирает \(2\), и Цовак проигрывает, так как массив закончился.

Во втором наборе входных данных Цовак должен выбрать \(1\). В клетке \((n,m)\) есть \(1\), поэтому он выбирает эту клетку. Затем, поскольку подматрица \((n + 1, m + 1)\) пуста, Нарек не может найти \(2\), поэтому он проигрывает.

E2. Игра Подугольник (сложная версия)

дп жадные алгоритмы игры реализация Структуры данных *2500

Это простая версия задачи. Разница между двумя версиями заключается в ограничениях на переменные. Вы можете делать взломы, только если решены обе версии задачи.

Цовак и Нарек играют в игру. У них есть массив \(a\) и матрица целых чисел \(b\) с \(n\) строками и \(m\) столбцами, пронумерованных с \(1\). Ячейка в \(i\)-й строке и \(j\)-м столбце обозначается \((i, j)\).

Они ищут элементы \(a\) по очереди; первым начинает Цовак. Каждый раз игрок ищет в матрице клетку, содержащую текущий элемент \(a\) (Цовак ищет первый, Нарек — второй и т.д.). Допустим, игрок выбрал клетку \((r, c)\). Следующий игрок должен выбрать свою клетку в подматрице, начинающейся в \((r + 1, c + 1)\) и заканчивающейся в \((n, m)\) (подматрица может быть пустой, если \(r=n\) или \(c=m\)). Если игрок не может найти такую клетку (или оставшаяся подматрица пуста) или массив заканчивается (предыдущий игрок выбрал последний элемент), то он проигрывает.

Ваша задача — определить победителя, если игроки играют оптимально.

Примечание: поскольку входные данные велики, вам может потребоваться оптимизация ввода/вывода для этой задачи.

Например, в C++ достаточно использовать следующие строки в начале функции main():

int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
}
Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(l\), \(n\) и \(m\) (\(1 \le l, n, m \le 1500\)) – длина массива и размер матрицы.

Вторая строка содержит \(l\) целых чисел \(a_1, a_2, a_3, \ldots a_l\) (\(1 \le a_i \le n \cdot m\)) – элементы массива \(a\).

В \(i\)-й из последующих \(n\) строк содержится \(m\) целых чисел \(b_{i,1}, b_{i,2}, b_{i,3}, \ldots b_{i,m}\) (\(1 \le b_{i,j} \le n \cdot m\), представляющих \(i\)-ю строку матрицы.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(3 \cdot 10^6\).

Гарантируется, что сумма \(l\) по всем наборам входных данных не превосходит \(1500\).

Выходные данные

Вы должны вывести \(t\) строк, \(i\)-я из которых содержит символ, представляющий ответ на \(i\)-й набор входных данных: «T», если победил Цовак, или «N», в противном случае (без кавычек).

Примечание

В первом наборе входных данных Цовак начинает с поиска \(1\). Существует только одно вхождение \(1\) в \((1,1)\), поэтому он выбирает его. Затем Нареку нужно найти \(2\) в подматрице \((2, 2)\), которая состоит только из двух последних элементов: \(6\) и \(2\). Он выбирает \(2\), и Цовак проигрывает, так как массив закончился.

Во втором наборе входных данных Цовак должен выбрать \(1\). В клетке \((n,m)\) есть \(1\), поэтому он выбирает эту клетку. Затем, поскольку подматрица \((n + 1, m + 1)\) пуста, Нарек не может найти \(2\), поэтому он проигрывает.

D. Ирис и соседние произведения

жадные алгоритмы математика реализация Структуры данных *2600

Ирис только что научилась умножению на уроках математики. Однако, поскольку её мозг не в состоянии выдерживать слишком сложные вычисления, она не может перемножать два целых числа, произведение которых больше \(k\). В противном случае её мозг может взорваться!

Её учитель каждый день даёт ей сложную задачу в качестве домашнего задания на летних каникулах. Теперь ей дан массив \(a\), состоящий из \(n\) элементов, и ей нужно вычислить произведение каждой пары соседних элементов (то есть, \(a_1 \cdot a_2\), \(a_2 \cdot a_3\) и так далее). Ирис хочет, чтобы её мозг не перегружался, и для этого она хотела бы изменить массив \(a\) так, чтобы выполнялось условие \(a_i \cdot a_{i + 1} \leq k\) для всех \(1 \leq i < n\). Она может выполнять два типа операций:

  1. Она может переставить элементы массива \(a\) произвольным образом.
  2. Она может выбрать произвольный элемент массива \(a\) и изменить его значение на произвольное целое число от \(1\) до \(k\).

Ирис хочет минимизировать количество операций типа \(2\), которые она использует.

Однако это совершенно не конец летних каникул! Летние каникулы длятся \(q\) дней, и в \(i\)-й день Ирис просят решить математическое задание для подмассива \(b_{l_i}, b_{l_i + 1}, \ldots, b_{r_i}\). Помогите Ирис и скажите ей минимальное количество операций типа \(2\), которые ей нужно выполнить для каждого дня. Обратите внимание, что операции независимы для каждого дня, то есть массив \(b\) не изменяется.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 5\cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(q\) и \(k\) (\(2 \leq n \leq 10^5\), \(1 \leq q \leq 10^5\), \(1 \leq k \leq 10^6\)) — длина массива \(b\), количество дней и верхняя граница для вычисления произведения.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(1 \leq b_i \leq k\)) — элементы массива \(b\).

Затем следуют \(q\) строк, \(i\)-я из которых содержит два целых числа \(l_i\) и \(r_i\) (\(1 \leq l_i < r_i \leq n\)) — границы подмассива в \(i\)-й день.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\), и сумма \(q\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку, содержащую \(q\) целых числа — минимальное количество операций типа \(2\), необходимых для каждого дня.

Примечание

В первом наборе входных данных, так как Ирис всегда может перемножить \(1\) и \(1\), операции не требуются, поэтому ответ равен \(0\).

Во втором наборе входных данных, домашнее задание первого дня — \([1, 10, 9]\). Ирис может переставить его элементы, чтобы получить \([9, 1, 10]\), поэтому операции типа \(2\) не требуются. Домашнее задание второго дня — \([10, 9]\), и она может изменить один элемент, чтобы получить массив \([1, 9]\), поэтому требуется одна операция типа \(2\).

F. Краски Доры

графы Комбинаторика Конструктив Перебор реализация *3500

К сожалению, Дора пролила краску, когда рисовала мурал в классе. Дора рассматривает мурал как матрицу \(b\) размера \(n \times n\). Изначально \(b_{i,j} = 0\) для всех \(1 \le i, j \le n\).

У Доры есть только две кисти, которые имеют два разных цвета. За одну операцию она может покрасить матрицу одной из двух кистей:

  • Первая кисть имеет цвет \(1\) и может покрасить один столбец матрицы. То есть, Дора выбирает целое число \(1 \leq j \leq n\) и присваивает \(b_{i,j} := 1\) для всех \(1 \leq i \leq n\);
  • Вторая кисть имеет цвет \(2\) и может покрасить одну строку матрицы. То есть, Дора выбирает целое число \(1 \leq i \leq n\) и присваивает \(b_{i,j} := 2\) для всех \(1 \leq j \leq n\).

Дора раскрашивает матрицу так, чтобы полученная матрица \(b\) содержала только \(1\) и \(2\).

Для матрицы \(b\) обозначим \(f(b)\) как минимальное количество операций, необходимых, чтобы превратить начальную матрицу (содержащую только \(0\)) в \(b\). Красота матрицы \(b\) равна количеству способов раскрасить начальную матрицу за ровно \(f(b)\) операций, чтобы превратить её в \(b\). Если нет способа превратить начальную матрицу в \(b\), то красота \(b\) равна \(0\).

Однако Дора сделала случайную ошибку. В матрице \(a\), которую вы получили, ровно один элемент отличается от настоящей матрицы \(b\). То есть, существует ровно одна пара \((i, j)\) такая, что \(a_{i, j} = 3 - b_{i, j}\).

Пожалуйста, помогите Доре вычислить ожидаемую красоту настоящей матрицы \(b\) по модулю \(998\,244\,353\) (все возможные \(n^2\) ошибок имеют равную вероятность).

Поскольку размер матрицы слишком велик, Дора скажет вам только позиции \(m\) элементов цвета \(1\), а остальные \(n^2-m\) элементов имеют цвет \(2\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(2 \leq n \leq 2 \cdot 10^5\), \(0 \leq m \leq \min(10^6, n^2)\)) — размер матрицы и количество элементов цвета \(1\).

Затем следуют \(m\) строк, каждая из которых содержит два положительных целых числа \(x_i\) и \(y_i\) (\(1 \leq x_i, y_i \leq n\)) — обозначающие, что \(a_{x_i, y_i} = 1\).

Гарантируется, что если \(i \neq j\), то \((x_i, y_i) \neq (x_j, y_j)\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(4\cdot10^5\), а сумма \(m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — ожидаемую красоту настоящей матрицы \(b\), по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных матрица \(a = \left[\begin{matrix}1&1\\2&2\end{matrix}\right]\). Рассмотрим изменение элемента \((1,1)\) для вычисления ответа.

Можно доказать, что минимальное количество операций для раскрашивания начальной матрицы в \(\left[\begin{matrix}2&1\\2&2\end{matrix}\right]\) равно \(3\). Сначала мы можем покрасить первую строку в цвет \(2\), затем покрасить второй столбец в цвет \(1\), и наконец покрасить вторую строку в цвет \(2\). Процесс выглядит следующим образом:

\(\)\left[\begin{matrix}0&0\\0&0\end{matrix}\right]\Rightarrow\left[\begin{matrix}2&2\\0&0\end{matrix}\right]\Rightarrow\left[\begin{matrix}2&1\\0&1\end{matrix}\right]\Rightarrow\left[\begin{matrix}2&1\\2&2\end{matrix}\right]\(\)

Можно доказать, что это единственный способ раскрасить матрицу за \(3\) операции. Таким образом, красота матрицы \(\left[\begin{matrix}2&1\\2&2\end{matrix}\right]\) равна \(1\). Аналогично, если изменить любой другой элемент матрицы, красота всегда равна \(1\), поэтому ожидаемая красота настоящей матрицы \(b\) равна \(1\).

Во втором наборе входных данных матрица \(a = \left[\begin{matrix}1&2\\2&2\end{matrix}\right]\). Рассмотрим изменение элемента \((2, 2)\) для вычисления ответа.

Можно доказать, что невозможно раскрасить начальную матрицу в \(\left[\begin{matrix}1&2\\2&1\end{matrix}\right]\), поэтому её красота равна \(0\). Если изменить любой другой элемент матрицы, красота всегда равна \(2\), поэтому ожидаемая красота равна \(\frac{0 + 2 + 2 + 2}{4} = \frac{6}{4} \equiv 499\,122\,178 \pmod {998\,244\,353}\).

E. Чередующаяся строка

дп жадные алгоритмы Перебор реализация Строки Структуры данных *1500

Сакурако очень любит чередующиеся строки. Она называет строку \(s\) из строчных латинских букв чередующейся строкой, если символы на четных позициях одинаковы, если символы на нечетных позициях одинаковы и длина строки четная.

Например, строки 'abab' и 'gg' являются чередующимися, а строки 'aba' и 'ggwp' — нет.

Как хороший друг, вы решили подарить такую строку, но не смогли её найти. К счастью, вы можете выполнить два типа операций над строкой:

  1. Выберите индекс \(i\) и удалите из строки \(i\)-й символ, что уменьшит длину строки на \(1\). Такую операцию можно выполнить не более \(1\) раза;
  2. Выберите индекс \(i\) и замените \(s_i\) на любую другую букву.

Поскольку вы торопитесь, вам нужно определить минимальное количество операций, необходимых для превращения строки в чередующуюся.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\))  — количество наборов входных данных.

Первая строка каждого набора содержит одно число \(n\) (\(1 \le n\le 2\cdot 10^5\))  — длина строки.

Вторая строка каждого набора содержит строку \(s\), состоящую из строчных латинских букв.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого тестового случая выведите одно целое число — минимальное количество операций, необходимых для превращения строки \(s\) в чередующуюся.

Примечание

Для строки ababa можно удалить первый символ, чтобы получить baba, что является чередующейся строкой.

Для строки acdada можно изменить первые два символа, чтобы получить dadada, что является чередующейся строкой.

B. osu!mania

Перебор реализация *800

Вы играете в свою любимую ритм-игру, osu!mania. Макет вашей битмапы состоит из \(n\) строк и \(4\) столбцов. Поскольку ноты внизу ближе, вы будете обрабатывать самую нижнюю строку первой, а самую верхнюю строку последней. Каждая строка будет содержать ровно одну ноту, представленную как '#'.

Для каждой ноты \(1, 2, \dots, n\), в порядке обработки, выведите столбец, в котором появляется нота.

Входные данные

Первая строка содержит \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Для каждого набора входных данных первая строка содержит \(n\) (\(1 \leq n \leq 500\)) — количество строк битмапы.

Следующие \(n\) строк содержат \(4\) символа. \(i\)-я строка представляет собой \(i\)-ю строку битмапы сверху. Гарантируется, что символы являются либо '.' либо '#', и ровно один из символов является '#'.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(500\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел в новой строке — номер столбца, в котором появляется \(i\)-я в порядке обработки нота для всех \(i\) от \(1\) до \(n\).

C. Легенда о лягушке Лее

математика реализация *1100

Лягушка Лея путешествует по двумерной координатной плоскости. В данный момент она находится в точке \((0,0)\) и хочет добраться до точки \((x,y)\). За один ход она выбирает целое число \(d\) такое, что \(0 \leq d \leq k\) и прыгает на \(d\) позиций вперед в том направлении, в котором она смотрит.

Изначально она смотрит в положительном направлении оси \(x\). После каждого хода она будет чередовать направление взгляда между положительным направлением оси \(x\) и положительным направлением оси \(y\) (то есть, на втором ходу она будет смотреть в положительном направлении оси \(y\), на третьем ходу — в положительном направлении оси \(x\) и так далее).

Какое минимальное количество ходов ей нужно сделать, чтобы приземлиться в точке \((x,y)\)?

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Каждый набор входных данных содержит три целых числа \(x\), \(y\) и \(k\) (\(0 \leq x, y \leq 10^9, 1 \leq k \leq 10^9\)).

Выходные данные

Для каждого набора входных данных выведите количество прыжков, которые необходимо сделать Лее, в отдельной строке.

Примечание

В первом примере один из оптимальных наборов движений — это если Лея прыгает следующим образом: (\(0,0\)) \(\rightarrow\) (\(2,0\)) \(\rightarrow\) (\(2,2\)) \(\rightarrow\) (\(3,2\)) \(\rightarrow\) (\(3,5\)) \(\rightarrow\) (\(6,5\)) \(\rightarrow\) (\(6,8\)) \(\rightarrow\) (\(9,8\)) \(\rightarrow\) (\(9,11\)). Это занимает 8 прыжков.

G3. Запросы подмассивов Юнли (экстремальная версия)

дп реализация Структуры данных *2700

Это экстремальная версия задачи. В этой версии выход для каждого запроса отличается от легкой и сложной версий. Также гарантируется, что \(r \geq l+k-1\) для всех запросов.

Для произвольного массива \(b\) Юнли может выполнять следующую операцию любое количество раз:

  • Выбрать индекс \(i\). Установить \(b_i = x\), где \(x\) — любое целое число, которое она желает (\(x\) не ограничено интервалом \([1,n]\)).

Обозначим \(f(b)\) как минимальное количество операций, которые ей нужно выполнить, чтобы в массиве \(b\) существовал последовательный подмассив\(^{\text{∗}}\) длиной не менее \(k\).

Юнли дан массив \(a\) размером \(n\), и она задает вам \(q\) запросов. В каждом запросе вы должны вывести \(\sum_{i=l}^{r-k+1} \sum_{j=i+k-1}^{r} f([a_i, a_{i+1}, \ldots, a_j])\).

\(^{\text{∗}}\)Если существует последовательный подмассив длины \(k\), который начинается с индекса \(i\) (\(1 \leq i \leq |b|-k+1\)), то \(b_j = b_{j-1} + 1\) для всех \(i < j \leq i+k-1\).

Входные данные

Первая строка содержит \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(k\) и \(q\) (\(1 \leq k \leq n \leq 2 \cdot 10^5\), \(1 \leq q \leq 2 \cdot 10^5\)) — длину массива, длину последовательного подмассива и количество запросов.

Следующая строка содержит \(n\) целых чисел \(a_1, a_2, ..., a_n\) (\(1 \leq a_i \leq n\)).

Следующие \(q\) строк содержат по два целых числа \(l\) и \(r\) (\(1 \leq l \leq r \leq n\), \(r \geq l+k-1\)) — границы запроса.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\), а сумма \(q\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Выведите \(\sum_{i=l}^{r-k+1} \sum_{j=i+k-1}^{r} f([a_i, a_{i+1}, \ldots, a_j])\) для каждого запроса на новой строке.

Примечание

В первом запросе первого набора входных данных мы можем вычислить ответ на запрос следующим образом:

  • \(i = 4\) и \(j = 5\): \(f([2, 1])=1\), потому что Юнли может установить \(b_2=3\), что создаст последовательный подмассив размером \(2\) за \(1\) ход.
  • \(i = 4\) и \(j = 6\): \(f([2, 1, 2])=0\), потому что уже существует последовательный массив размером \(2\).
  • \(i = 5\) и \(j = 6\): \(f([1, 2])=0\), потому что уже существует последовательный массив размером \(2\).

Ответ на этот запрос равен \(1+0+0=1\).

A. Альтернированная сумма чисел

математика Перебор реализация *800

Вам задана последовательность целых чисел. Выведите альтернированную сумму этой последовательности. Иными словами, выведите \(a_1 - a_2 + a_3 - a_4 + a_5 - \dots\). То есть знаки плюс и минус чередуются, начиная с плюса.

Входные данные

Первая строка теста содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов тестовых данных. Затем следуют \(t\) наборов тестовых данных.

Первая строка набора тестовых данных содержит одно целое число \(n\) (\(1 \le n \le 50\)) — длина последовательности. Вторая строка набора тестовых данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)).

Выходные данные

Выведите \(t\) строк. Для каждого набора входных данных выведите искомую альтернированную сумму чисел.

B. Три брата

математика Перебор реализация *800

Три брата договорились о встрече. Пронумеруем братьев следующим образом: пусть старший брат имеет номер 1, средний брат имеет номер 2, а младший брат — номер 3.

Когда пришло время встречи, один из братьев опоздал. По заданным номерам двух братьев, которые пришли вовремя, вам предстоит определить номер опоздавшего брата.

Входные данные

В первой строке входных данных следуют два различных целых числа a и b (1 ≤ a, b ≤ 3, a ≠ b) — номера братьев, которые пришли на встречу вовремя. Номера даны в произвольном порядке.

Выходные данные

Выведите единственное целое число — номер брата, который опоздал на встречу.

F1. Игра на дереве (простая версия)

Бинарный поиск Деревья дп жадные алгоритмы игры Перебор реализация Структуры данных *2700

Это простая версия задачи. В этой версии \(\mathbf{u = v}\). Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Алиса и Боб играют в забавную игру на дереве. В эту игру играют на дереве из \(n\) вершин, пронумерованных от \(1\) до \(n\). Напомним, что дерево на \(n\) вершинах — это неориентированный связный граф с \(n - 1\) ребрами.

Алиса и Боб ходят по очереди, причём Алиса ходит первой. Каждый игрок начинает с какой-то вершины.

В свой ход игрок должен перейти из текущей вершины в соседнюю, которая ещё не была никем посещена до этого. Первый игрок, который не может сделать ход, проигрывает.

Вам даны две вершины \(u\) и \(v\). Представим простой путь из вершины \(u\) в \(v\) как массив \(p_1, p_2, p_3, \ldots, p_m\), где \(p_1 = u\), \(p_m = v\), между \(p_i\) и \(p_{i + 1}\) есть ребро для всех \(i\) (\(1 \le i < m\)).

Вы должны определить победителя игры, если Алиса начнёт в вершине \(1\), а Боб в вершине \(p_j\) для каждого \(j\) (где \(1 \le j \le m\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное число \(n\) (\(2 \le n \le 2 \cdot 10^5\)) — количество вершин дерева.

Каждая из следующих \(n - 1\) строк содержит два целых числа \(a\), \(b\) (\(1 \le a, b \le n\)), обозначающих неориентированное ребро между вершинами \(a\) и \(b\). Гарантируется, что данные ребра образуют дерево.

Последняя строка каждого набора входных данных содержит два целых числа \(u\) и \(v\) (\(2 \le u, v \le n\), \(\mathbf{u = v}\)).

Гарантируется, что путь между \(u\) и \(v\) не проходит через вершину \(1\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(m\) строк.

В \(i\)-й строке выведите победителя игры, если Алиса начинает с вершины \(1\), а Боб с вершины \(p_i\), выведите «Alice» (без кавычек), если выиграет Алиса, или «Bob» (без кавычек) в противном случае.

Примечание
Дерево из первого и второго примера.

В первом наборе входных данных путь будет иметь вид (\(2,2\)). Боб начинает в вершине \(2\), Алиса в своём первом ходу не сможет никуда пойти, и она проиграет.

Во втором наборе входных данных путь будет иметь вид (\(3,3\)). Боб начинает в вершине \(3\), Алиса переместится в вершину \(2\), и у Боба не останется вершин, которые можно посетить, и он проиграет.

A. Робин Помогает

жадные алгоритмы реализация *800

В каждом есть немного разбойника и немного героя.

Герой-разбойник Робин Гуд знаменит тем, что отнимает у богатых и отдает бедным.

Робин встречает \(n\) людей последовательно, начиная с \(1\)-го и заканчивая \(n\)-м. У \(i\)-го человека есть \(a_i\) золотых монет. Если \(a_i \ge k\), Робин заберет все \(a_i\) золотых монет, а если \(a_i=0\), Робин даст \(1\) золотую монету, если у него есть. Робин начинает с \(0\) золотых монет.

Узнайте, сколько людей получат золото от Робина.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\), \(k\) (\(1 \le n \le 50, 1 \le k \le 100\)) — количество людей и порог, при котором Робин Гуд забирает золото.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 100\)) — количество золота каждого человека.

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество людей, которые получат золото от Робина Гуда.

Примечание

В первом наборе входных данных Робин забирает \(2\) золота у первого человека и даёт золото второму.

Во втором наборе входных данных Робин забирает \(3\) золота и дает \(1\) золото каждому из следующих \(2\) людей.

В третьем наборе входных данных Робин забирает \(3\) золота и, таким образом, дает золото \(3\) другим людям.

G. Молочные дни

жадные алгоритмы Перебор реализация Структуры данных *2200

Что сделано, то сделано, и испорченное молоко не исправить.

Маленький Джон настолько мал, насколько ночь — это день, он был известен как гигант, возможно, ростом \(2.1\) метра. Это связано с его любовью к молоку.

В его молочном дневнике \(n\) записей, показывающих, что он приобрел \(a_i\) пинт свежего молока в день \(d_i\). Молоко теряет свежесть с течением времени и остается пригодным для питья максимум \(k\) дней. Другими словами, свежее молоко, приобретенное в день \(d_i\), будет пригодно для питья с дня \(d_i\) по день \(d_i+k-1\) включительно.

Каждый день маленький Джон пьет пригодное для питья молоко, максимум \(m\) пинт. Другими словами, если молока меньше \(m\) пинт, он выпьет все и не будет насыщен; если молока \(m\) пинт или больше, он выпьет ровно \(m\) пинт и будет насыщен, и это будет день молочного насыщения.

Маленький Джон всегда сначала пьет самое свежее пригодное для питья молоко.

Определите количество дней молочного насыщения маленького Джона.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1\leq t \leq 10^4\)), количество наборов входных данных.

Первая строка каждого набора входных данных состоит из трех целых чисел \(n\), \(m\), \(k\) (\(1\le n\), \(m\), \(k \le 10^5\)), количество записей в дневнике, максимальное количество пинт, необходимое для дня молочного насыщения, и продолжительность свежести молока.

Затем следуют \(n\) строк каждого набора входных данных, каждая с двумя целыми числами \(d_i\) и \(a_i\) (\(1\le d_i\), \(a_i \le 10^6\)), день, в который было приобретено молоко, и количество приобретенных пинт. Они отсортированы по возрастанию значений \(d_i\), и все значения \(d_i\) различны.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — количество дней молочного насыщения.

Примечание

В первом наборе входных данных \(5\) пинт молока хороши в течение \(3\) дней до порчи.

Во втором наборе входных данных произойдёт следующее:

  • в день \(1\) он получит \(5\) пинт молока и выпьет \(3\) из них (останется \(2\) пинты с дня \(1\));
  • в день \(2\) он получит \(7\) пинт молока и выпьет \(3\) из них (останется \(2\) пинты с дня \(1\) и \(4\) пинты с дня \(2\));
  • в день \(3\) он выпьет \(3\) пинты с дня \(2\) (останется \(2\) пинты с дня \(1\) и \(1\) пинта с дня \(2\));
  • в день \(4\) молоко приобретённое в день \(1\) испортится и он выпьет \(1\) пинту с дня \(2\) (больше молока не осталось).

A. Разбиение карт

2-sat жадные алгоритмы математика Перебор реализация *1600

У вас есть несколько карт. На каждой карте написано целое число от \(1\) до \(n\): в частности, для каждого \(i\) от \(1\) до \(n\) у вас есть \(a_i\) карт, на которых написано число \(i\).

Также существует магазин, в котором продается неограниченное количество карт каждого типа. У вас есть \(k\) монет, поэтому вы можете купить в общей сложности не более \(k\) новых карт, и карты, которые вы покупаете, могут содержать любые целые числа от \(\mathbf{1}\) до \(\mathbf{n}\), включительно.

После покупки новых карт вы должны разбить все свои карты на колоды согласно следующим правилам:

  • все колоды должны иметь одинаковый размер;
  • нет пары карт с одинаковым числом в одной колоде.

Найдите максимально возможный размер колоды после покупки карт и их оптимального разбиения.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\), \(k\) (\(1 \leq n \leq 2 \cdot 10^5\), \(0 \leq k \leq 10^{16}\)) — количество различных типов карт и количество монет.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^{10}\), \(\sum a_i \geq 1\)) — количество карт типа \(i\), имеющихся у вас в начале, для каждого \(1 \leq i \leq n\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимально возможный размер колоды при оптимальных действиях.

Примечание

В первом наборе входных данных вы можете купить одну карту с числом \(1\), и ваш набор карт станет таким: \([1, 1, 1, 1, 2, 2, 3, 3]\). Вы можете разбить их на колоды \([1, 2], [1, 2], [1, 3], [1, 3]\). Они все имеют размер \(2\), и все содержат разные значения. Можно показать, что невозможно получить разбиение с колодами размером больше \(2\), поэтому ответ — \(2\).

Во втором наборе входных данных вы можете купить две карты с числом \(1\) и одну карту с числом \(3\), и ваш набор карт станет таким: \([1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5]\). Его можно разбить на колоды \([1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 5], [2, 3, 5], [2, 4, 5]\). Можно показать, что нельзя получить разбиение с колодами размером больше \(3\), поэтому ответ — \(3\).

B. Сверхскорость

Бинарный поиск дп жадные алгоритмы реализация Структуры данных *1900

В ряд стоят \(n\) городов, пронумерованных \(1, 2, \ldots, n\) слева направо.

  • В момент времени \(1\) вы захватываете ровно один город, называемый начальным городом.
  • В моменты времени \(2, 3, \ldots, n\) вы можете выбрать город, соседний с уже захваченным, и захватить его.

Вы выиграете, если для каждого \(i\) вы захватите город \(i\) в момент времени не позже, чем \(a_i\). Выигрышная стратегия может существовать, а может и не существовать, в том числе в зависимости от стартового города. Сколько стартовых городов позволяют вам выиграть?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество городов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — сроки завоевания городов.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: количество стартовых городов, которые позволяют вам выиграть.

Примечание

В первом наборе входных данных города \(2\), \(3\) и \(4\) являются подходящими стартовыми городами.

Во втором наборе входных данных нет подходящих стартовых городов.

В третьем наборе входных данных единственным подходящим стартовым городом является город \(5\).

D. Максимум + минимум + количество

дп жадные алгоритмы матрицы реализация снм сортировки Структуры данных *2200

Дан массив целых положительных чисел \(a_1, a_2, \ldots, a_n\).

Вы можете раскрасить некоторые элементы массива в красный цвет, но при этом в нем не должно оказаться двух соседних красных элементов (т.е. для \(1 \leq i \leq n-1\) хотя бы один из \(a_i\) и \(a_{i+1}\) должен не быть красным).

Ваш счет — это максимальное значение красного элемента, плюс минимальное значение красного элемента, плюс количество красных элементов. Найдите максимальный счет, который вы можете получить.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина массива.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — заданный массив.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: максимально возможный счет, который можно получить, раскрасив некоторые элементы в красный цвет в соответствии с условием.

Примечание

В первом наборе входных данных вы можете раскрасить массив следующим образом: \([\color{red}{5}, 4, \color{red}{5}]\). Ваш счет составит \(\max([5, 5]) + \min([5, 5]) + \text{size}([5, 5]) = 5+5+2 = 12\). Это максимальный счет, который вы можете получить.

Во втором наборе входных данных вы можете раскрасить массив следующим образом: \([4, \color{red}{5}, 4]\). Ваш счет составит \(\max([5]) + \min([5]) + \text{size}([5]) = 5+5+1 = 11\). Это максимальный счет, который вы можете получить.

В третьем наборе входных данных вы можете раскрасить массив следующим образом: \([\color{red}{3}, 3, \color{red}{3}, 3, \color{red}{4}, 1, 2, \color{red}{3}, 5, \color{red}{4}]\). Ваш счет составит \(\max([3, 3, 4, 3, 4]) + \min([3, 3, 4, 3, 4]) + \text{size}([3, 3, 4, 3, 4]) = 4+3+5 = 12\). Это максимальный счет, который вы можете получить.

B. Отрезки для всех пар

математика реализация *1200

Вам даны \(n\) точек на оси \(x\) с возрастающими целыми положительными координатами \(x_1 < x_2 < \ldots < x_n\).

Для каждой пары \((i, j)\), такой что \(1 \leq i < j \leq n\), строится отрезок \([x_i, x_j]\). Отрезки замкнуты, т.е. отрезок \([a, b]\) содержит точки \(a, a+1, \ldots, b\).

Вам даны \(q\) запросов. В \(i\)-м запросе задается целое положительное число \(k_i\), и нужно определить, сколько точек с целочисленными координатами содержится в ровно \(k_i\) отрезках.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\), \(q\) (\(2 \le n \le 10^5\), \(1 \le q \le 10^5\)) — количество точек и количество запросов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(x_1, x_2, \ldots, x_n\) (\(1 \leq x_1 < x_2 < \ldots < x_n \leq 10^9\)) — координаты \(n\) точек.

Третья строка каждого набора входных данных содержит \(q\) целых чисел \(k_1, k_2, \ldots, k_q\) (\(1 \leq k_i \leq 10^{18}\)) — параметры \(q\) запросов.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\), и сумма \(q\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку с \(q\) целыми числами, где \(i\)-е число является ответом на \(i\)-й запрос.

Примечание

В первом наборе входных данных построен только отрезок \([101, 200]\). Ни одна точка не содержится ровно в \(2\) отрезках, и \(100\) точек \(101, 102, \ldots, 200\) содержатся ровно в \(1\) отрезке.

Во втором примере построены \(15\) отрезков: \([1, 2], [1, 3], [1, 5], [1, 6], [1, 7], [2, 3], [2, 5], [2, 6], [2, 7], [3, 5], [3, 6], [3, 7], [5, 6], [5, 7], [6, 7]\). Точки \(1, 7\) содержатся в ровно \(5\) отрезках; точки \(2, 4, 6\) содержатся в ровно \(9\) отрезках; точки \(3, 5\) содержатся в ровно \(11\) отрезках.

A. ЛНПП

Бинарный поиск битмаски жадные алгоритмы Перебор реализация Строки *800

Настоящее название этой задачи — «Лексикографически наибольшая подпоследовательность-палиндром» — слишком длинное, чтобы уместиться в заголовке страницы.

Дана строка s, состоящая только из строчных латинских букв. Найдите ее лексикографически наибольшую подпоследовательность, являющуюся палиндромом.

Непустую строку s[p1p2... pk] = sp1sp2... spk (1  ≤  p1 < p2 < ... < pk  ≤  |s|) будем называть подпоследовательностью строки s = s1s2... s|s|, где |s| — длина строки s. Например, строки «abcb», «b» и «abacaba» являются подпоследовательностями строки «abacaba».

Строка x = x1x2... x|x| лексикографически больше строки y = y1y2... y|y|, если либо |x| > |y| и x1 = y1, x2 = y2, ..., x|y| = y|y|, либо существует такое число r (r < |x|, r < |y|), что x1 = y1, x2 = y2, ..., xr = yr и xr  +  1 > yr  +  1. Символы в строках сравниваются как их ASCII-коды. Например, строка «ranger» лексикографически больше строки «racecar», а строка «poster» лексикографически больше строки «post».

Строка s = s1s2... s|s| называется палиндромом, если она в точности совпадает со строкой rev(s) = s|s|s|s| - 1... s1. Иными словами, строка называется палиндромом, если она читается одинаково как слева направо, так и справа налево. Например, строками-палиндромами являются «racecar», «refer» и «z».

Входные данные

В единственной строке записана непустая строка s, состоящая только из строчных букв латинского алфавита и имеющая длину не более 10.

Выходные данные

Выведите лексикографически наибольшую подпоследовательность строки s, являющуюся палиндромом.

Примечание

Из всех различных подпоследовательностей строки «radar» палиндромами являются «a», «d», «r», «aa», «rr», «ada», «rar», «rdr», «raar» и «radar». Лексикографически наибольшей из них является «rr».

C. Битовый баланс

битмаски математика расписания реализация Тернарный поиск хэши *1400

Даны три неотрицательных целых числа \(b\), \(c\) и \(d\).

Найдите неотрицательное целое число \(a \in [0, 2^{61}]\), такое что \((a\, |\, b)-(a\, \&\, c)=d\), где \(|\) и \(\&\) обозначают операцию побитового ИЛИ и операцию побитового И соответственно.

Если такое \(a\) существует, выведите его значение. Если решения не существует, выведите одно целое число \(-1\). Если существует несколько решений, выведите любое из них.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит три целых числа \(b\), \(c\) и \(d\) (\(0 \le b, c, d \le 10^{18}\)).

Выходные данные

Для каждого набора входных данных выведите значение \(a\) или \(-1\), если решения не существует. Обратите внимание, что \(a\) должно быть неотрицательным и не может превышать \(2^{61}\).

Примечание

В первом наборе входных данных \((0\,|\,2)-(0\,\&\,2)=2-0=2\). Так что \(a = 0\) является корректным ответом.

Во втором наборе входных данных никакое значение \(a\) не удовлетворяет уравнению.

В третьем наборе входных данных \((12\,|\,10)-(12\,\&\,2)=14-0=14\). Так что \(a = 12\) является корректным ответом.

C2. Координация презентации (сложная версия)

жадные алгоритмы Конструктив реализация сортировки Структуры данных *1900

Это сложная версия задачи. В двух версиях отличаются ограничения на \(q\) и ограничение по времени отличаются. В этой версии \(0 \leq q \leq 2 \cdot 10^5\). Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Команда, состоящая из \(n\) участников, пронумерованных от \(1\) до \(n\), должна представить слайд-шоу на большом собрании. Слайд-шоу содержит \(m\) слайдов.

Имеется массив \(a\) длины \(n\). Изначально участники собрания стоят в очереди в порядке \(a_1, a_2, \ldots, a_n\) от начала до конца. Слайд-шоу состоит из последовательного показа слайдов с \(1\) по \(m\). Каждый слайд будет представлен участником, стоящим в начале очереди. После представления каждого слайда вы можете переместить участника, стоящего в начале очереди, на любую позицию в очереди (без изменения порядка остальных участников). Например, предположим, что очередь участников имеет вид \([\color{red}{3},1,2,4]\). После того как участник \(3\) представит текущий слайд, вы можете изменить очередь участников на \([\color{red}{3},1,2,4]\), \([1,\color{red}{3},2,4]\), \([1,2,\color{red}{3},4]\) или \([1,2,4,\color{red}{3}]\).

Также имеется массив \(b\) длины \(m\). Слайд-шоу считается хорошим, если можно так перемещать участников после выступлений, чтобы слайд \(i\) был представлен участником \(b_i\) для всех \(i\) от \(1\) до \(m\).

Однако ваш назойливый начальник хочет сделать \(q\) обновлений массива \(b\). В \(i\)-м обновлении он выберет слайд \(s_i\) и участника \(t_i\) и присвоит \(b_{s_i} := t_i\). Заметим, что эти обновления постоянны, то есть изменения, внесенные в массив \(b\), будут применяться при обработке последующих обновлений.

Для каждого из \(q+1\) состояний массива \(b\) (начального состояния и после каждого из \(q\) обновлений) определите, является ли слайд-шоу хорошим.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\) и \(q\) (\(1 \le n, m \le 2 \cdot 10^5\), \(0 \leq q \leq 2 \cdot 10^5\)) — количество участников, количество слайдов и количество обновлений.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\ldots,a_n\) (\(1 \le a_i \le n\)) — начальный порядок расположения участников от начала до конца очереди. Гарантируется, что каждое целое число от \(1\) до \(n\) встречается в \(a\) ровно один раз.

Третья строка каждого набора входных данных содержит \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) (\(1 \le b_i \le n\)) — номера участников, которые должны представлять каждый слайд.

Каждая из следующих \(q\) строк содержит по два целых числа \(s_i\) и \(t_i\) (\(1 \le s_i \le m\), \(1 \le t_i \le n\)) — параметры обновления.

Гарантируется, что сумма \(n\), сумма \(m\) и сумма \(q\) по всем наборам входных данных не превосходят \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q+1\) строку, соответствующих \(q+1\) состоянию массива \(b\). Выведите «YA», если слайд-шоу хорошее, и «TIDAK» в противном случае.

Вы можете выводить ответ в любом регистре (верхнем или нижнем). Например, строки «YA», «Ya», «ya» и «YA» будут распознаны как положительные ответы.

Примечание

В первом наборе входных данных изначально вам не нужно перемещать участников, так как оба слайда будут представлены участником \(1\), который уже находится в начале очереди. После этого присваивается \(b_1 := 2\), теперь слайд \(1\) должен быть представлен участником \(2\). Это невозможно, так как участник \(1\) представит слайд \(1\) первым. Затем устанавливается \(b_1 = 1\), \(b\) становится таким же, как и начальный \(b\), что делает слайд-шоу хорошим.

D. Я хочу пить, босс

дп жадные алгоритмы реализация *2500

У Пака Чанека есть друг, который владеет киоском с напитками в столовой. Его друг продает напитки в течение \(n\) дней, начиная с дня \(1\) и заканчивая днем \(n\). Существует \(m\) видов напитков, пронумерованных от \(1\) до \(m\).

Прибыль от продажи напитка в конкретный день может быть разной. В день \(i\) прогнозируемая прибыль от продажи напитка типа \(j\) равна \(A_{i, j}\). Обратите внимание, что \(A_{i, j}\) может быть отрицательной, то есть продажа напитка фактически приведет к убыткам.

Пак Чанек хочет помочь своему другу спланировать продажи на \(n\) дней. В день \(i\) Пак Чанек должен выбрать для продажи как минимум один тип напитка. Более того, типы напитков, продаваемых в один день, должны образовывать подотрезок. Другими словами, в каждый день Пак Чанек будет выбирать \(i\) и \(j\) так, что \(1 \leq i \leq j \leq m\). Тогда будут проданы все виды напитков от \(i\) до \(j\) (включительно).

Однако для того, чтобы клиенты с предыдущего дня продолжали возвращаться, выбор типов напитков, проданных в день \(i\) (\(i>1\)), должен удовлетворять следующим условиям:

  • Хотя бы один тип напитка, проданный в день \(i\), должен быть продан и в день \(i-1\).
  • Хотя бы один тип напитка, проданный в день \(i\), должен не быть продан в день \(i-1\).

Дневная прибыль — это сумма прибылей от всех типов напитков, проданных в этот день. Общая прибыль по плану продаж — это сумма прибылей за \(n\) дней. Какую максимальную общую прибыль можно получить, если Пак Чанек оптимально спланирует продажи?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 2 \cdot 10^5\); \(3 \leq m \leq 2 \cdot 10^5\); \(n \cdot m \leq 2 \cdot 10^5\)) — количество строк и столбцов в таблице.

Следующие \(n\) строк каждого набора входных данных содержат по \(m\) целых чисел, где \(i\)-я строка содержит целые числа \(A_{i,1} A_{i,2}, \ldots, A_{i,m}\) (\(-10^9 \leq A_{i,j} \leq 10^9\)) — прибыль каждого типа напитков в \(i\)-й день.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число: максимальную прибыль, которую может получить Пак Чанек.

Примечание

Оптимальный план Пак Чанека:

  • В день \(1\) Пак Чанек продаст напитки с \(1\) по \(3\). Прибыль составит \(79+20+49 = 148\).
  • В день \(2\) Пак Чанек продаст напитки с \(2\) по \(4\). Прибыль составит \(9+109+24 = 142\).
  • В день \(3\) Пак Чанек продаст напитки с \(1\) по \(6\). Прибыль составит \(185\).

Таким образом, общая прибыль плана Пак Чанека составит \(148 + 142 + 185 = 475\).

E1. Цифровая деревня (простая версия)

бпф графы Деревья дп жадные алгоритмы математика Перебор поиск в глубину и подобное реализация снм Структуры данных *2300

Это простая версия задачи. В трех версиях отличаются ограничения на \(n\) и \(m\). Вы можете совершать взломы только в том случае, если решены все версии задачи.

Пак Чанек устанавливает интернет-связь в деревне Кхунтиен. Деревню можно представить как связный простой граф с \(n\) домами и \(m\) интернет-кабелями, соединяющими дом \(u_i\) и дом \(v_i\), каждый с задержкой \(w_i\).

Существует \(p\) домов, которым требуется интернет. Пак Чанек может установить серверы не более чем в \(k\) домов. Дома, которым нужен интернет, будут подключены к одному из серверов. Однако, поскольку каждый кабель имеет свою задержку, задержка, которую испытывает дом \(s_i\), нуждающийся в интернете, будет равна максимальной задержке кабелей между этим домом и сервером, к которому он подключен.

Для каждого \(k = 1,2,\ldots,n\), помогите Пак Чанеку определить минимальную суммарную задержку, которая может быть достигнута для всех домов, требующих интернет.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\), \(p\) (\(2 \le n \le 400\); \(n-1 \le m \le 400\); \(1 \le p \le n\)) — количество домов, количество кабелей и количество домов, которым нужен интернет.

Вторая строка каждого набора входных данных содержит \(p\) целых чисел \(s_1, s_2, \ldots, s_p\) (\(1 \le s_i \le n\)) — номера домов, которым нужен интернет. Гарантируется, что все элементы \(s\) различны.

В \(i\)-й из следующих \(m\) строк каждого набора входных данных содержатся три целых числа \(u_i\), \(v_i\) и \(w_i\) (\(1 \le u_i < v_i \le n\); \(1 \le w_i \le 10^9\)) — интернет-кабель, соединяющий дом \(u_i\) и дом \(v_i\) с задержкой \(w_i\). Гарантируется, что заданные ребра образуют простой связный граф.

Гарантируется, что сумма \(n^3\) и сумма \(m^3\) не превосходят \(10^8\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел: минимальное общее время ожидания, которое может быть достигнуто для всех домов, нуждающихся в интернете для каждого \(k = 1,2,\ldots,n\).

Примечание

В первом наборе входных данных для \(k=3\) одним из лучших решений является установка серверов в вершинах \(2\), \(6\) и \(8\) и получение следующей задержки:

  • задержка\((2) = 0\)
  • задержка\((5) = \max(3, 5) = 5\)
  • задержка\((6) = 0\)
  • задержка\((8) = 0\)
  • задержка\((9) = \max(2, 4) = 4\)

Таким образом, общая задержка составит \(9\).

A. Автобус в Пенхамо

жадные алгоритмы Конструктив математика реализация *800

Ya vamos llegando a Péeeenjamoo ♫♫♫

В Пенхамо едут \(n\) семей, чтобы стать свидетелями крупнейшего в Мексике марафона по выгуливанию куриц на поводках. \(i\)-я семья состоит из \(a_i\) человек. Все семьи будут путешествовать на одном автобусе, состоящем из \(r\) рядов с \(2\) сиденьями в каждом.

Человек считается счастливым, если:

  • Другой член семьи сидит в том же ряду, что и он; или
  • Он сидит один в своем ряду (рядом с пустым местом).

Определите максимальное количество счастливых людей при оптимальной рассадке. Обратите внимание, что в автобусе должны сидеть все.

Гарантируется, что все члены всех семей могут поместиться в автобусе. Формально, гарантируется, что \(\displaystyle\sum_{i=1}^{n}a_i \le 2r\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(r\) (\(1 \le n \le 100\); \(1 \le r \le 500\)) — количество семей и количество рядов в автобусе.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10\)) — количество членов семьи в каждой семье.

Выходные данные

Для каждого набора входных данных выведите максимальное количество счастливых людей при оптимальной рассадке.

Примечание

В первом наборе входных данных два члена первой семьи могут сидеть вместе в первом ряду, а два члена второй семьи могут сидеть вместе во втором ряду. Оставшийся член второй семьи может сидеть в третьем ряду вместе с членом третьей семьи. Такая рассадка показана ниже, и \(4\) счастливых человека окрашены в зеленый цвет.

\(\color{green}{1}\)\(\color{green}{1}\)
\(\color{green}{2}\)\(\color{green}{2}\)
\(2\)\(3\)

Для второго набора входных данных ниже показан возможный вариант рассадки с \(6\) счастливыми людьми.

\(\color{green}{3}\)\(\color{green}{3}\)
\(\color{green}{1}\)\(\color{green}{1}\)
\(\color{green}{2}\)\(\color{green}{2}\)

Для третьего набора входных данных ниже показана возможная рассадка с \(6\) счастливыми людьми.

\(\color{green}{4}\)\(\color{green}{4}\)
\(\color{green}{}\)\(\color{green}{2}\)
\(\color{green}{3}\)\(\color{green}{3}\)
\(\color{green}{1}\)\(\color{green}{}\)
\(\color{green}{}\)\(\color{green}{}\)

C. Джерримендеринг

дп реализация *1800

Все мы понемногу воруем. Но у меня только одна рука, а у моих противников — две.
Álvaro Obregón, бывший президент Мексики

Альваро и Хосе — единственные кандидаты, претендующие на пост президента Тепито — прямоугольной сетки из \(2\) строк и \(n\) столбцов, где каждая клетка представляет собой дом. Гарантируется, что \(n\) кратно \(3\).

Согласно системе голосования Тепито, сетка будет разбита на округа, состоящие из любых \(3\) домов, которые связаны между собой\(^{\text{∗}}\). Каждый дом будет принадлежать ровно одному округу.

Каждый округ будет голосовать один раз. Округ будет голосовать за Альваро или Хосе соответственно, если их выберут не менее \(2\) домов в этом округе. Таким образом, всего будет подано \(\frac{2n}{3}\) голосов.

Поскольку Альваро является действующим президентом, он точно знает, какого кандидата выберет каждый дом. Определите максимальное количество голосов, которое Альваро может получить, если он оптимально распределит дома по округам.

\(^{\text{∗}}\)Набор клеток является связанным, если между любыми \(2\) клетками существует путь, который требует только перемещения вверх, вниз, влево и вправо по клеткам набора.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(3 \le n \le 10^5\); \(n\) кратно \(3\)) — количество столбцов в Тепито.

В следующих двух строках содержится по строке длины \(n\). В \(i\)-й строке содержится строка \(s_i\), состоящая из символов \(\texttt{A}\) и \(\texttt{J}\). Если \(s_{i,j}=\texttt{A}\), то дом на пересечении \(i\)-й строки и \(j\)-го столбца выберет Альваро. В противном случае, если \(s_{i,j}=\texttt{J}\), дом проголосует за Хосе.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество округов, которое может выиграть Альваро, оптимально разделив дома на округа.

Примечание

На изображении ниже показано оптимальное разбиение на округа, которое Альваро может использовать для каждого набора входных данных в примере.

D1. Ассасин (простая версия)

Бинарный поиск интерактив Конструктив Перебор реализация *1900

Это простая версия задачи. В этой версии вы можете задать не более \(n+69\) вопросов. Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Это интерактивная задача.

На сборах сборной Мексики к IOI существует традиция играть в игру «Ассасин», которая похожа на «Among Us» или «Мафию».

Сегодня \(n\) игроков, пронумерованных от \(1\) до \(n\), будут играть в «Ассасин» со следующими тремя ролями:

  • Рыцарь: Рыцарь — это тот, кто всегда говорит правду.
  • Лжец: Лжец — это тот, кто всегда лжет.
  • Предатель: Предатель — это тот, кого все считают Рыцарем, а на самом деле он Лжец.

Каждому игроку будет назначена своя роль в игре. В игре будет ровно один Предатель, но может быть любое (возможно нулевое) количество Рыцарей и Лжецов.

Вы были ведущим игры, но случайно забыли роли всех игроков, поэтому вам нужно определить игрока, который является Предателем.

Чтобы определить Предателя, вы зададите несколько вопросов. В каждом вопросе вы выбираете двух игроков \(i\) и \(j\) (\(1 \leq i, j \leq n\); \(i \neq j\)) и спрашиваете, считает ли игрок \(i\), что игрок \(j\) — Рыцарь. Результаты этого вопроса приведены в таблице ниже.

РыцарьЛжецПредатель
РыцарьДаНетДа
ЛжецНетДаНет
ПредательНетДа
Значение ячейки в строке \(a\) и столбце \(b\) — это ответ на вопрос, когда \(i\) имеет роль \(a\), а \(j\) — роль \(b\). Например, «Да» в правой верхней ячейке принадлежит строке «Рыцарь» и столбцу «Предатель», поэтому это ответ на вопрос, когда \(i\) — Рыцарь, а \(j\) — Предатель.

Найдите Предателя не более чем за \(n + 69\) вопросов.

Заметьте, что итерактор адаптивен: роли игроков не фиксированы изначально и могут меняться в зависимости от ваших вопросов. Однако гарантируется, что существует такое распределение ролей, которое соответствует всем ранее заданным вопросам в ограничениях этой задачи.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(3 \le n \le 10^5\)) — количество людей, играющих в игру.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).

Протокол взаимодействия

Чтобы задать вопрос, выведите строку в следующем формате:

  • «? i j» (\(1 \leq i,j \leq n\); \(i \neq j\)) — спросить игрока \(i\), считает ли он игрока \(j\) Рыцарем.

Жюри выдаст «1», если игрок \(i\) считает игрока \(j\) Рыцарем, и «0» в противном случае.

Когда вы определите, какой игрок является Предателем, выведите строку в следующем формате:

  • «! i» (\(1 \leq i \leq n\)) — Предателем является игрок \(i\).

Обратите внимание, что ответы не учитываются в ограничении в \(n+69\) вопросов.

Если вы сделали некорректный вывод, использовали более \(n+69\) вопросов или неверно определили Предателя, жюри ответит «-1», и вы получите вердикт Неправильный ответ. Получив «-1», ваша программа должна немедленно завершиться. В противном случае вы можете получить произвольный вердикт, поскольку ваше решение продолжит чтение из закрытого потока.

После каждого вывода не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • sys.stdout.flush() в Python;
  • std::io::stdout().flush() в Rust;
  • смотрите документацию для других языков.

Формат взломов

Для взломов используйте следующий формат.

Первая строка должна содержать одно целое число \(t\) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать целое число \(n\), за которым следует строка «manual».

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(-1 \le a_i \le 1\)) — роли каждого игрока. \(1\) обозначает Рыцаря, \(0\) — Лжеца, а \(-1\) — Предателя. Предатель должен быть ровно один, то есть должен быть ровно один индекс \(i\) такой, что \(a_i=-1\).

В качестве примера приводим взлом, аналогичный примеру из условия:

2
7 manual
0 1 0 -1 0 1 0
4 manual
0 1 -1 0
Примечание

Обратите внимание, что примеры не представляют собой оптимальную стратегию задавания вопросов и приведены только для демонстрации формата взаимодействия. В частности, мы не можем определить, кто из игроков является Предателем, по вопросам, заданным в примерах.

В первом наборе входных данных игроки с индексами \(2\) и \(6\) — Рыцари, игроки с индексами \(1\), \(3\), \(5\) и \(7\) — Лжецы, а Предатель имеет индекс \(4\). Ниже приводится объяснение заданных вопросов:

  • В первом вопросе игрок \(i\) является Лжецом, и игрок \(j\) также Лжец. Ответ — «да», так как Лжецы всегда лгут.
  • Во втором вопросе игрок \(i\) — Лжец, а игрок \(j\) — Рыцарь. Ответ — «нет», так как Лжецы всегда лгут.
  • В третьем вопросе игрок \(i\) — Рыцарь, а игрок \(j\) — Лжец. Ответ — «нет», так как Рыцари всегда говорят правду.
  • В четвертом вопросе игрок \(i\) — Рыцарь, и игрок \(j\) также Рыцарь. Ответ — «да», так как Рыцари всегда говорят правду.
  • В пятом вопросе игрок \(i\) — Предатель, а игрок \(j\) — Лжец. Ответ — «да», так как Предатель всегда лжет.
  • В шестом вопросе игрок \(i\) — Предатель, а игрок \(j\) — Рыцарь. Ответ — «нет», так как Предатель всегда лжет.
  • В седьмом вопросе игрок \(i\) — Лжец, а игрок \(j\) — Предатель. Ответ — «нет», так как Лжецы всегда лгут, и Лжецы думают, что Предатель является Рыцарем.
  • В восьмом вопросе игрок \(i\) — Рыцарь, а игрок \(j\) — Предатель. Ответ — «да», так как Рыцари всегда говорят правду, и Рыцари думают, что Предатель является Рыцарем.

C. Ч+К+С

графы жадные алгоритмы Конструктив поиск в глубину и подобное реализация Строки хэши *2400

Вам даны два сильно связных\(^{\dagger}\) ориентированных графа, в каждом из которых ровно \(n\) вершин, но может быть разное количество рёбер. Посмотрев на них внимательно, вы заметили важную особенность — длина любого цикла в этих графах делится на \(k\).

Каждая из \(2n\) вершин относится ровно к одному из двух типов: входящая или исходящая. Для каждой вершины вам известен её тип.

Вам нужно определить, можно ли провести ровно \(n\) ориентированных рёбер между исходными графами так, чтобы выполнялись следующие четыре условия:

  • Концы любого добавленного ребра лежат в разных графах.
  • Из каждой исходящей вершины исходит ровно одно добавленное ребро.
  • В каждую входящую вершину входит ровно одно добавленное ребро.
  • В получившемся графе длина любого цикла делится на \(k\).

\(^{\dagger}\)Сильно связный граф — это граф, в котором из каждой вершины существует путь до любой другой вершины.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит единственное целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(2 \le k \le n \le 2 \cdot 10^5\)) — количество вершин в каждом из графов и значение, на которое делится длина каждого цикла.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(a_i \in \{0, 1\}\)). Если \(a_i = 0\), то вершина \(i\) первого графа является входящей. Если \(a_i = 1\), то вершина \(i\) первого графа является исходящей.

Третья строка каждого набора входных данных содержит одно целое число \(m_1\) (\(1 \le m_1 \le 5 \cdot 10^5\)) — количество рёбер в первом графе.

Следующие \(m_1\) строк содержат описания рёбер первого графа. \(i\)-я из них содержит два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — ребро в первом графе, ведущее из вершины \(v_i\) в вершину \(u_i\).

Далее в таком же формате следует описание второго графа.

Следующая строка содержит \(n\) целых чисел \(b_1, b_2, \ldots, b_n\) (\(b_i \in \{0, 1\}\)). Если \(b_i = 0\), то вершина \(i\) второго графа является входящей. Если \(b_i = 1\), то вершина \(i\) второго графа является исходящей.

Следующая строка содержит одно целое число \(m_2\) (\(1 \le m_2 \le 5 \cdot 10^5\)) — количество рёбер во втором графе.

Следующие \(m_2\) строк содержат описания рёбер второго графа. \(i\)-я из них содержит два целых числа \(v_i\) и \(u_i\) (\(1 \le v_i, u_i \le n\)) — ребро во втором графе, ведущее из вершины \(v_i\) в вершину \(u_i\).

Гарантируется, что оба графа являются сильно связными, а также длины всех циклов кратны \(k\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\). Гарантируется, что сумма \(m_1\) и сумма \(m_2\) по всем наборам входных данных не превосходят \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если можно провести \(n\) новых рёбер так, чтобы выполнялись все условия, и «NO» (без кавычек) иначе.

Вы можете выводить ответ в любом регистре (например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительный ответ).

Примечание

В первом наборе входных данных можно провести из первого графа во второй граф рёбра \((1, 3)\) и \((4, 2)\) (первое число в паре — номер вершины в первом графе, второе число в паре — номер вершины во втором графе), а из второго графа в первый граф провести рёбра \((1, 2)\), \((4, 3)\) (первое число в паре — номер вершины во втором графе, второе число в паре — номер вершины в первом графе).

Во втором наборе входных данных всего есть \(4\) входящих вершины и \(2\) исходящих, поэтому нельзя провести \(3\) рёбер.

C. Новая игра

Бинарный поиск жадные алгоритмы Перебор реализация сортировки *1300

Монокарп решил сыграть в новую игру. Для игры используется колода из \(n\) карточек, причем на \(i\)-й карточке записано ровно одно целое число \(a_i\).

В начале игры на первом ходе Монокарп может взять себе любую карточку из колоды. В процессе каждого следующего хода Монокарп может взять себе ровно одну карточку, на которой записано либо такое же число, которое было записано на карточке, взятой на предыдущем ходе, либо число на единицу большее, чем число, которое было записано на карточке, взятой на предыдущем ходе.

Иными словами, если на предыдущем ходе Монокарп взял себе карточку, на которой записано число \(x\), то на текущем ходе он может взять себе либо карточку, на которой записано число \(x\), либо карточку, на которой записано число \(x + 1\). Монокарп может взять любую карточку, которая удовлетворяет этим условиям, независимо от того, где именно она в колоде.

После того как Монокарп взял себе карточку на очередном ходе, она удаляется из колоды.

По правилам игры количество различных чисел, записанных на карточках, которые Монокарп забрал себе, не должно превышать \(k\).

Если после очередного хода Монокарп не может взять карточку, не нарушая описанных правил, игра заканчивается.

Перед вами стоит задача определить максимальное количество карточек, которые Монокарп может забрать себе из колоды в процессе игры, если на первом ходе он может взять любую карточку из колоды.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 200\,000\)) — количество карточек в колоде и максимальное количество различных чисел, которые могут быть записаны на карточках, которые Монокарп забирает себе.

Во второй строке следует последовательность целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^{9}\)), где \(a_i\) равно числу, которое записано на \(i\)-й карточке.

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превосходит \(200\,000\).

Выходные данные

Для каждого набора входных данных выведите максимальное количество карточек, которые Монокарп может забрать себе из колоды в процессе игры, если на первом ходе он может взять любую карточку из колоды.

Примечание

В первом примере Монокарпу нужно взять себе любую из карточек, на которых записано число \(3\). В процессе двух следующих ходов ему нужно взять себе две оставшиеся в колоде карточки, на которых записано число \(3\). В процессе трех следующих ходов ему нужно взять себе три карточки, на которых записано число \(4\). После этого Монокарп не сможет взять ни одной карточки из колоды, при этом у него будет \(6\) карточек.

D. Проверка характеристик

дп математика Перебор реализация Структуры данных *1800

Представьте себе игру, в которой вы играете за персонажа с двумя характеристиками: «Сила» и «Интеллект», которые изначально находятся на нулевом уровне.

В ходе игры вы получите \(m\) очков характеристик, которые позволят вам поднять их уровни — одно очко увеличивает одну из характеристик на один уровень. Но в процессе игры вы также сталкиваетесь с так называемыми «Проверками характеристик»: если ваша соответствующая характеристика достаточно высока, вы пройдете проверку; в противном случае вы провалите проверку.

Потратив некоторое время, вы наконец подготовили список, который содержит записи обо всех очках, которые вы получили, и всех проверках, с которыми столкнулись. И теперь вы задаетесь вопросом: каково максимальное количество проверок характеристик, которые вы можете пройти за одну игру, если будете разумно тратить очки?

Обратите внимание, что вы не можете изменить порядок записей.

Входные данные

В первой строке заданы два целых числа \(n\) и \(m\) (\(1 \le m \le 5000\); \(m < n \le 2 \cdot 10^6\)) — количество записей в списке и общее количество очков, которые вы получите в ходе игры.

Во второй строке заданы \(n\) целых чисел \(r_1, r_2, \dots, r_n\) (\(-m \le r_i \le m\)), где \(r_i\) кодирует \(i\)-ю запись:

  • Если \(r_i = 0\), то \(i\)-я запись является записью о получении одного очка характеристик. Вы можете потратить его на повышение уровня либо Силы, либо Интеллекта;
  • Если \(r_i > 0\), то это проверка Интеллекта: если ваш уровень Интеллекта больше или равен \(|r_i|\), вы проходите проверку.
  • Если \(r_i < 0\), то это проверка Силы: если ваш уровень Силы больше или равен \(|r_i|\), вы проходите проверку.

Дополнительное ограничение на входные данные: в заданной последовательности \(r_1, r_2, \dots, r_n\) ровно \(m\) элементов, равных \(0\).

Выходные данные

Выведите одно целое число — максимальное количество проверок, которые вы можете пройти.

Примечание

В первом тесте оптимально вложить каждое очко в Силу, поэтому вы провалите \(2\) проверки Интеллекта, но пройдете \(3\) проверки Силы.

Во втором тесте вы провалите обе проверки, так как первое очко характеристик приходит только после проверок.

В третьем тесте одной из оптимальных стратегий является:

  1. вложить первое очко в Интеллект;
  2. вложить второе очко в Силу;
  3. вложить третье очко в Силу;
В результате вы пройдете \(2\) проверки Интеллекта \(r_3\) и \(r_9\) и \(2\) проверки Силы \(r_7\) и \(r_8\).

C. Коллекционные фигурки

Бинарный поиск жадные алгоритмы Конструктив Перебор реализация Структуры данных *1500

Рядом с домом Монокарпа есть магазин, в котором продаются коллекционные фигурки. Скоро выйдет новый набор фигурок; в этом наборе содержится \(n\) фигурок, \(i\)-я фигурка стоит \(i\) монет и доступна для покупки с \(i\)-го дня по \(n\)-й день.

Для каждого из следующих \(n\) дней Монокарп знает, может ли он посетить магазин в этот день.

Каждый раз, когда Монокарп посещает магазин, он может купить любое количество фигурок, которые продаются в магазине (конечно, он не может купить фигурку, которая еще не доступна для покупки). Если Монокарп покупает хотя бы две фигурки в один день, он получает скидку, равную стоимости самой дорогой фигурки, которую он покупает (другими словами, он получает самую дорогую из фигурок, которые он покупает, бесплатно).

Монокарп хочет купить ровно одну \(1\)-ю фигурку, одну \(2\)-ю фигурку, ..., одну \(n\)-ю фигурку из набора. Он не может купить одну и ту же фигурку дважды. Какова минимальная сумма денег, которую он должен потратить?

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из двух строк:

  • первая строка содержит одно целое число \(n\) (\(1 \le n \le 4 \cdot 10^5\)) — количество фигурок в наборе (и количество дней);
  • вторая строка содержит строку \(s\) (\(|s| = n\), каждый \(s_i\) равен либо 0, либо 1). Если Монокарп может посетить магазин в \(i\)-й день, то \(s_i\) равно 1; в противном случае \(s_i\) равно 0.

Дополнительные ограничения на входные данные:

  • в каждом наборе входных данных \(s_n\) равно 1, так что Монокарп всегда сможет купить все фигурки в \(n\)-й день;
  • сумма \(n\) по всем наборам входных данных не превышает \(4 \cdot 10^5\).
Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальную сумму денег, которую Монокарп должен потратить.

Примечание

В первом наборе входных данных Монокарп покупает \(1\)-ю фигурку в \(1\)-й день и тратит \(1\) монету.

Во втором наборе входных данных Монокарп может купить \(1\)-ю и \(3\)-ю фигурки в \(3\)-й день, \(2\)-ю и \(4\)-ю фигурки в \(4\)-й день, а также \(5\)-ю и \(6\)-ю фигурки в \(6\)-й день. Тогда он потратит \(1+2+5=8\) монет.

В третьем наборе входных данных Монокарп может купить \(2\)-ю и \(3\)-ю фигурки в \(3\)-й день, а все остальные фигурки в \(7\)-й день. Тогда он потратит \(1+2+4+5+6 = 18\) монет.

D. Суммы на отрезках

Бинарный поиск дп математика реализация Структуры данных *1900

Дана последовательность целых чисел \([a_1, a_2, \dots, a_n]\). Обозначим \(s(l,r)\) как сумму элементов от \(a_l\) до \(a_r\) (т. е. \(s(l,r) = \sum\limits_{i=l}^{r} a_i\)).

Построим другую последовательность \(b\) размером \(\frac{n(n+1)}{2}\) следующим образом: \(b = [s(1,1), s(1,2), \dots, s(1,n), s(2,2), s(2,3), \dots, s(2,n), s(3,3), \dots, s(n,n)]\).

Например, если \(a = [1, 2, 5, 10]\), то \(b = [1, 3, 8, 18, 2, 7, 17, 5, 15, 10]\).

Вам даны \(q\) запросов. В \(i\)-м запросе вам даны два целых числа \(l_i\) и \(r_i\), и вам нужно вычислить \(\sum \limits_{j=l_i}^{r_i} b_j\).

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 3 \cdot 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10 \le a_i \le 10\)).

Третья строка содержит одно целое число \(q\) (\(1 \le q \le 3 \cdot 10^5\)).

Затем следуют \(q\) строк, \(i\)-я из которых содержит два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le \frac{n(n+1)}{2}\)).

Выходные данные

Выведите \(q\) целых числа, \(i\)-е из которых должно быть равно \(\sum \limits_{j=l_i}^{r_i} b_j\).

F. Мороженое в Бермарте

Деревья дп поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2700

В сети магазинов Бермарт продается мороженое. У каждого сорта мороженого есть два параметра: цена и вкусность.

Изначально есть один магазин с номером \(1\), в котором ничего не продаётся. Требуется обработать \(q\) запросов следующих типов:

  • \(1~x\) — открывается новый магазин, в котором продаются те же сорта мороженого, что и в магазине \(x\). Он получает первый свободный порядковый номер. Порядок появления сортов мороженого в новом магазине тот же, что и в магазине \(x\).
  • \(2~x~p~t\) — в магазине \(x\) в продаже появляется сорт мороженого с ценой \(p\) и вкусностью \(t\).
  • \(3~x\) — в магазине \(x\) исчезает из продажи сорт мороженого, который там появился раньше всего.
  • \(4~x~p\) — для магазина \(x\) надо найти максимальную суммарную вкусность поднабора сортов, которые там продаются, так, чтобы суммарная цена не превышала \(p\) (каждый сорт можно использовать в поднаборе не более одного раз).
Входные данные

В первой строке записано одно целое число \(q\) (\(1 \le q \le 3 \cdot 10^4\)) — количество запросов.

В каждой из \(q\) следующих строк записан очередной запрос в формате, описанном в условии:

  • \(1~x\);
  • \(2~x~p~t\) (\(1 \le p, t \le 2000\));
  • \(3~x\);
  • \(4~x~p\) (\(1 \le p \le 2000\)).

Дополнительные ограничения на входные данные:

  • \(x\) в каждом запросе не превышает текущего количества магазинов (то есть, \(1\) плюс количество запросов типа \(1\));
  • запрос типа \(3\) не применяется к магазину, в котором нет ни одного типа мороженого;
  • есть хотя бы один запрос типа \(4\).
Выходные данные

На каждый запрос типа \(4\) выведите одно целое число — для магазина \(x\) найдите максимальную суммарную вкусность поднабора сортов, которые там продаются, так, чтобы суммарная цена не превышала \(p\) (каждый сорт можно использовать в поднаборе не более одного раз).

A. Расстановка прямоугольников

геометрия математика реализация *800

Вы раскрашиваете бесконечную клетчатую плоскость, на которой все клетки изначально белые. Для этого вам дается \(n\) штампов. Каждый штамп является прямоугольником ширины \(w_i\) и высоты \(h_i\).

Вы примените каждый штамп ровно один раз, чтобы окрасить в чёрный цвет прямоугольник того же размера, что и штамп. Вы не можете поворачивать штамп; каждая клетка должна быть либо полностью покрыта штампом, либо не покрыта. Вы можете использовать штамп на любом прямоугольнике из клеток плоскости, даже если некоторые или все клетки, покрытые областью штампа, уже черные.

Какую минимальную сумму периметров связных областей черных квадратов можно получить после использования всех штампов?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 100\)).

В \(i\)-й из следующих \(n\) строк содержится по два целых числа \(w_i\) и \(h_i\) (\(1 \le w_i, h_i \le 100\)).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальную сумму периметров связных областей черных квадратов, которую можно получить после использования всех штампов.

Примечание

В первом наборе входных данных можно использовать штампы, как показано слева. Каждый штамп выделен своим цветом для наглядности.

После использования всех штампов осталась одна черная область (как показано справа), периметр которой равен \(20\). Можно показать, что не существует способа использования штампов, который дал бы меньший общий периметр.

Во втором наборе входных данных второй и третий штампы могут быть использованы полностью внутри первого, поэтому ответ — \(8\).

D1. Финальный диалог (простая версия)

Бинарный поиск графы дп жадные алгоритмы реализация *1700

Это простая версия задачи. Единственное отличие заключается в том, что в этой версии вам нужно вывести только минимальную суммарную стоимость операций. Вы можете делать взломы, только если обе версии задачи решены.

Даны массив \(a\) длины \(n\) и массив \(b\) длины \(m\) (\(b_i > b_{i+1}\) для всех \(1 \le i < m\)). Изначально значение \(k\) равно \(1\). Ваша цель — сделать массив \(a\) пустым, выполняя операции двух типов:

  • \(1\) тип: Если значение \(k\) меньше \(m\) и массив \(a\) не пуст, вы можете увеличить значение \(k\) на \(1\). Это не влечет за собой никаких затрат.
  • \(2\) тип: Удалить непустой префикс массива \(a\), такой, что его сумма не превосходит \(b_k\). Стоимость этой операции равна \(m - k\).

Вам нужно минимизировать суммарную стоимость последовательности операций, в результате которой массив \(a\) станет пустым. Если сделать массив пустым невозможно, выведите \(-1\). В противном случае выведите минимальную суммарную стоимость операций.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 3 \cdot 10^5\), \(\boldsymbol{1 \le n \cdot m \le 3 \cdot 10^5}\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)).

Третья строка каждого набора входных данных содержит \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) (\(1 \le b_i \le 10^9\)). Гарантируется, что \(b_i > b_{i+1}\) для всех \(1 \le i < m\).

Гарантируется, что сумма \(\boldsymbol{n \cdot m}\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если возможно сделать \(a\) пустым, выведите минимальную суммарную стоимость операций.

Если не существует последовательности операций, которая делает \(a\) пустым, то выведите одно число \(-1\).

Примечание

В первом наборе входных данных оптимальная последовательность операций, имеющая стоимость \(1\), выглядит следующим образом:

  • Выполните операцию типа \(2\). Выберите префикс \([9]\). Эта операция стоит \(1\).
  • Выполните операцию типа \(1\). Значение \(k\) теперь равно \(2\). Это не влечет за собой никаких затрат.
  • Выполните операцию типа \(2\). Выберите префикс \([3, 4]\). Эта операция стоит \(0\).
  • Выполните операцию типа \(2\). Выберите префикс \([3]\). Эта операция стоит \(0\).
  • Массив \(a\) стал пустым, а суммарная стоимость всех операций равна \(1\).

Во втором наборе входных данных невозможно удалить ни одного префикса массива, так как \(a_1 > b_1\), поэтому массив \(a\) нельзя сделать пустым ни одной последовательностью операций.

D2. Финальный диалог (сложная версия)

Бинарный поиск дп жадные алгоритмы реализация Структуры данных *2200

Это сложная версия задачи. Единственное отличие заключается в том, что в этой версии вам также нужно вывести количество оптимальных последовательностей операций. Вы можете делать взломы, только если обе версии задачи решены.

Даны массив \(a\) длины \(n\) и массив \(b\) длины \(m\) (\(b_i > b_{i+1}\) для всех \(1 \le i < m\)). Изначально значение \(k\) равно \(1\). Ваша цель — сделать массив \(a\) пустым, выполняя операции двух типов:

  • \(1\) тип: Если значение \(k\) меньше \(m\) и массив \(a\) не пуст, вы можете увеличить значение \(k\) на \(1\). Это не влечет за собой никаких затрат.
  • \(2\) тип: Удалить непустой префикс массива \(a\), такой, что его сумма не превосходит \(b_k\). Стоимость этой операции равна \(m - k\).

Вам нужно минимизировать суммарную стоимость последовательности операций, в результате которой массив \(a\) станет пустым. Если сделать массив пустым невозможно, выведите \(-1\). В противном случае выведите минимальную суммарную стоимость операций, а также количество последовательностей операций, имеющих минимальную стоимость. Так как это количество может быть очень большим, выведите остаток от его деления на \(10^9 + 7\).

Две последовательности операций считаются различными, если на любом шаге выбран другой тип операции или отличается размер удаляемого префикса.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 3 \cdot 10^5\), \(\boldsymbol{1 \le n \cdot m \le 3 \cdot 10^5}\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)).

Третья строка каждого набора входных данных содержит \(m\) целых чисел \(b_1, b_2, \ldots, b_m\) (\(1 \le b_i \le 10^9\)). Гарантируется, что \(b_i > b_{i+1}\) для всех \(1 \le i < m\).

Гарантируется, что сумма \(\boldsymbol{n \cdot m}\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, если можно сделать \(a\) пустым, выведите два целых числа. Первое должно быть минимальной общей стоимостью операций, а второе — количеством последовательностей операций, которые достигают этой минимальной стоимости, по модулю \(10^9 + 7\).

Если не существует последовательности операций, которая делает \(a\) пустым, то выведите одно число \(-1\).

Примечание

В первом наборе входных данных существует \(3\) оптимальных последовательностей операций, которые имеют стоимость \(1\):

  • Все \(3\) последовательности начинаются с операции типа \(2\), удаляющей префикс \([9]\), чтобы сделать \(a = [3, 4, 3]\), и данная операция имеет стоимость \(1\). Затем мы выполняем операцию типа \(1\), чтобы увеличить значение \(k\) на \(1\). Все последующие операции теперь имеют стоимость \(0\).
  • Одна последовательность продолжается удалением префикса \([3, 4]\), затем \([3]\).
  • Другая последовательность продолжается удалением префикса \([3]\), затем \([4, 3]\).
  • Другая последовательность продолжается удалением префикса \([3]\), затем \([4]\), затем \([3]\).

Во втором наборе входных данных невозможно удалить ни одного префикса массива, так как \(a_1 > b_1\), поэтому массив \(a\) нельзя сделать пустым ни одной последовательностью операций.

A. Приключения Алисы в "Шахматах"

математика Перебор реализация *900

Алиса пытается встретиться с Красной Королевой за городом! Сейчас Алиса находится в позиции \((0, 0)\), а Красная Королева — в позиции \((a, b)\). Алиса может двигаться только в четырех направлениях (на север, восток, юг или запад).

Более строго, если Алиса находится в точке \((x, y)\), она сделает одно из следующих действий:

  • пойдет на север (обозначается N), перемещаясь в \((x, y+1)\);
  • пойдет на восток (обозначается E), перемещаясь в \((x+1, y)\);
  • пойдет на юг (обозначается S), перемещаясь в \((x, y-1)\); или
  • пойдет на запад (обозначается W), перемещаясь в \((x-1, y)\).

Перемещения Алисы предопределены. У нее есть строка \(s\), представляющая последовательность движений, которые она выполняет слева направо. Как только она достигает конца строки, она бесконечно повторяет ту же последовательность движений.

Можешь ли ты помочь Алисе выяснить, встретится ли она когда-нибудь с Красной Королевой?

Входные данные

Каждый тест содержит несколько наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(a\), \(b\) (\(1 \le n\), \(a\), \(b \le 10\)) — длина строки и начальные координаты Красной Королевы.

Вторая строка содержит строку \(s\) длиной \(n\), состоящую только из символов N, E, S или W.

Выходные данные

Для каждого набора входных данных выведите одну строку «YES» или «NO» (без кавычек), обозначающую, встретится ли Алиса в конечном итоге с Красной Королевой.

Вы можете выводить ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes» и «YES» будут признаны положительными ответами.

Примечание

В первом наборе входных данных Алиса следует по пути \((0,0) \xrightarrow[\texttt{N}]{} (0,1) \xrightarrow[\texttt{E}]{} (1,1) \xrightarrow[\texttt{N}]{} (1,2) \xrightarrow[\texttt{E}]{} (2,2)\).

Во втором наборе входных данных Алиса никогда не сможет достичь Красной Королевы.

B. Приключения Алисы в перестановках

Бинарный поиск математика реализация *1400

Алиса перепутала слова трансмутация и перестановка! У неё есть массив \(a\), заданный тремя целыми числами \(n\), \(b\), \(c\): массив \(a\) имеет длину \(n\) и задаётся по правилу \(a_i = b\cdot (i - 1) + c\) для \(1\le i\le n\). Например, если \(n=3\), \(b=2\) и \(c=1\), то \(a=[2 \cdot 0 + 1, 2 \cdot 1 + 1, 2 \cdot 2 + 1] = [1, 3, 5]\).

Алисе очень нравятся перестановки \([0, \ldots, n-1]\)\(^{\text{∗}}\) и она хотела бы преобразовать \(a\) в перестановку. В одной операции Алиса заменяет максимальный элемент массива \(a\) на \(\operatorname{MEX}\)\(^{\text{†}}\) массива \(a\). Если в массиве \(a\) несколько максимальных элементов, Алиса выбирает самый левый для замены.

Можете ли вы помочь Алисе выяснить, сколько операций ей нужно выполнить, чтобы \(a\) впервые стал перестановкой? Если это невозможно, вы должны сообщить об этом.

\(^{\text{∗}}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(0\) до \(n-1\) в произвольном порядке. Обратите внимание, это немного отличается от обычного определения перестановки. Например, \([1,2,0,4,3]\) — перестановка, но \([0,1,1]\) не перестановка (\(1\) встречается в массиве дважды) и \([0,2,3]\) тоже не перестановка (\(n=3\), но в массиве встречается \(3\)).

\(^{\text{†}}\)\(\operatorname{MEX}\) массива — это наименьшее неотрицательное целое число, которое не принадлежит массиву. Например, \(\operatorname{MEX}\) массива \([0, 3, 1, 3]\) равно \(2\), а \(\operatorname{MEX}\) массива \([5]\) равно \(0\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит три целых числа \(n\), \(b\), \(c\) (\(1\le n\le 10^{18}\); \(0\le b\), \(c\le 10^{18}\)) — параметры массива.

Выходные данные

Для каждого набора входных данных, если массив никогда не сможет стать перестановкой, выведите одно целое число \(-1\). В противном случае выведите минимальное количество операций, необходимых для того, чтобы массив стал перестановкой.

Примечание

В первом наборе входных данных массив уже \([0, 1, \ldots, 9]\), поэтому операции не требуются.

В третьем наборе входных данных начальный массив равен \([1, 3, 5, \ldots, 199]\). После первой операции \(199\) преобразуется в \(0\). Во второй операции \(197\) преобразуется в \(2\). Если продолжать, потребуется ровно \(50\) операций, чтобы получить массив \([0, 1, 2, 3, \ldots, 99]\).

В четвертом наборе входных данных требуется две операции: \([1,1,1] \to [0,1,1] \to [0,2,1]\).

В пятом наборе входных данных процесс выглядит следующим образом: \([0,0,0] \to [1,0,0] \to [2,0,0] \to [1,0,0] \to [2,0,0]\). Этот процесс повторяется бесконечно, поэтому массив никогда не становится перестановкой, и ответ равен \(-1\).

D. Приключения Алисы в картах

графы дп жадные алгоритмы Конструктив реализация Структуры данных Тернарный поиск *2000

Алиса играет в карты с Дамой Червей, Королем Червей и Валетом Червей. В их карточной игре есть \(n\) различных типов карт. В данный момент у Алисы есть карта типа \(1\), и ей нужна карта типа \(n\), чтобы сбежать из Страны Чудес. У остальных игроков есть по одной карте каждого типа.

В этой карточной игре Алиса может обмениваться картами с тремя другими игроками. У каждого игрока есть свои предпочтения среди этих \(n\) типов, которые можно описать перестановками\(^{\text{∗}}\) \(q\), \(k\) и \(j\) для Дамы, Короля и Валета соответственно.

Игрок оценивает карту \(a\) больше, чем карту \(b\), если для их перестановки \(p\), \(p_a > p_b\). Тогда этот игрок готов обменять карту \(b\) с Алисой в обмен на карту \(a\). Предпочтения Алисы просты: она оценивает карту \(a\) больше, чем карту \(b\) если \(a > b\), и она будет обмениваться картами только в соответствии с этими предпочтениями.

Определите, может ли Алиса обменять карту типа \(1\) на карту типа \(n\), учитывая эти предпочтения. Если это возможно, приведите возможный набор обменов для этого.

\(^{\text{∗}}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2\le n\le 2\cdot 10^5\)) — количество типов карт.

Следующие три строки содержат предпочтения Дамы, Короля и Валета соответственно. Каждая из этих строк содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1\le p_i\le n\)) — перестановка, соответствующая предпочтениям игрока.

Сумма значений \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных в первой строке выведите одну строку «YES» или «NO» (без кавычек), обозначающую, может ли Алиса обменяться на карту \(n\).

Если первая строка была «YES», то на следующей строке выведите \(k\) — количество обменов, которые сделает Алиса. На следующих \(k\) строках выведите через пробел символ \(c\in \{\texttt{q}, \texttt{k}, \texttt{j}\}\) и целое число \(x\), обозначающее, что Алиса обменивается с игроком \(c\), чтобы получить карту \(x\). Должно быть так, что на \(k\)-й строке \(x = n\). Если существует несколько решений, выведите любое из них.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ. То же самое касается символа \(c\), обозначающего игрока в обмене (\(\texttt{Q}, \texttt{K}, \texttt{J}\) будут приняты наряду с их строчными вариантами).

Примечание

В первом наборе входных данных Алиса может обменяться с Королем, чтобы получить карту \(2\). Затем она может обменяться с Дамой, чтобы получить карту \(3\).

Во втором наборе входных данных, хотя Алиса может обменяться с Дамой, чтобы получить карту \(3\), с Королем, чтобы получить карту \(2\), а затем с Валетом, чтобы получить карту \(4\), это не является допустимым решением, так как оно не соответствует предпочтениям Алисы. Мы можем показать, что нет способа для Алисы получить карту \(4\).

F. Приключения Алисы в сложении

битмаски дп Перебор реализация *2700

Обратите внимание на необычное ограничение по памяти.

Чеширский Кот задал Алисе загадку: даны \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) и цель \(m\), существует ли способ вставить \(+\) и \(\times\) в круги выражения \(\)a_1 \circ a_2 \circ \cdots \circ a_n = m\(\) так, чтобы оно стало истинным? Мы следуем обычному порядку операций: \(\times\) выполняется перед \(+\).

Алиса отлично играет в шахматы, но она не сильна в математике. Пожалуйста, помогите ей найти выход из Страны Чудес!

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n, m\) (\(1\le n\le 2\cdot 10^5\); \(1\le m\le 10^4\)) — количество целых чисел и цель, соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0\le a_i\le 10^4\)) — элементы массива \(a\).

Сумма значений \(n\) по всем наборам входных данных не превосходит \(2\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите «YES» (без кавычек), если возможно достичь цель, вставив \(+\) или \(\times\), и «NO» в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Возможные решения для первых четырех наборов входных данных приведены ниже. \(\)\begin{align*} 2 \times 1 + 1 \times 1 \times 2 &= 4 \\ 2 \times 1 + 1 + 1 \times 2 &= 5 \\ 2 \times 1 + 1 + 1 + 2 &= 6 \\ 2 + 1 + 1 + 1 + 2 &= 7 \\ \end{align*}\(\) В пятом наборе входных данных невозможно получить \(8\).

A. Две задачи

Перебор реализация *1200

Мальчик Валера зарегистрировался на сайте Codeforces под ником Valera и написал свой первый Codeforces Round #300. Он похвастался другу Аркадию, что за свое первое соревнование набрал целых x баллов. Но Аркадий не поверил на слово другу и решил проверить, действительно ли Валера мог показать такой результат.

Он знает, что соревнование под номером 300 было необычным, поскольку в нем было всего две задачи. Соревнование длилось t минут, минуты нумеруются с нуля. Первая задача имела начальную стоимость a баллов, и каждую минуту эта стоимость уменьшалась на da баллов. Вторая задача имела начальную стоимость b баллов, и каждую минуту эта стоимость уменьшалась на db баллов. Таким образом, как только закончится нулевая минута соревнования, первая задача будет стоить a - da баллов, а вторая — b - db баллов. Гарантируется, что в любую минуту соревнования каждая задача имеет неотрицательную стоимость.

Аркадий просит Вас узнать, мог ли Валера получить за это соревнование ровно x баллов. При этом стоит считать, что Валера мог решить любое количество из предложенных задач. Также следует считать, что по каждой задаче Валера сделал не более одной попытки, причем обе задачи он мог отправить на проверку в одну и ту же минуту соревнования, начиная с минуты под номером 0 и заканчивая минутой под номером t - 1. Обращаем внимание, что посылать решение ровно через t минут после начала соревнование Валера не может.

Входные данные

В единственной строке входных данных заданы шесть целых чисел x, t, a, b, da, db (0 ≤ x ≤ 600; 1 ≤ t, a, b, da, db ≤ 300) — результат Валеры, длительность соревнования, начальная стоимость первой задачи, начальная стоимость второй задачи, количество баллов, на которое уменьшается стоимость первой задачи и второй задачи за одну минуту, соответственно.

Гарантируется, что в каждую минуту соревнования каждая задача имеет неотрицательную стоимость, то есть a - i·da ≥ 0 и b - i·db ≥ 0 для всех 0 ≤ i ≤ t - 1.

Выходные данные

Если Валера мог набрать за соревнование ровно x баллов выведите «YES», в противном случае выведите «NO» (без кавычек).

Примечание

В первом примере Валера мог поступить следующим способом: первую задачу сдать на минуте под номером 0, вторую задачу сдать на минуте под номером 2. Тогда за первую задачу оп получит 20 баллов, за вторую 10 баллов, что в сумме дает требуемые 30 баллов.

B. Игра на листочке

Перебор реализация *1300

В один не самый прекрасный вечер Валере было очень скучно. Чтобы немного себя развлечь, Валера нашел следующее занятие.

Он взял белый квадратный клетчатый лист бумаги, состоящий из n × n клеток. После этого он стал закрашивать белые клетки листа одну за другой в черный цвет. Всего он закрасил m различных клеток этого листа. Поскольку у Валеры была какая-то предрасположенность ко всему квадратному, его заинтересовал следующий вопрос — после какого хода впервые на листке можно найти черный квадрат со стороной 3. Однако Валера не знает ответ на этот вопрос и поэтому просит Вашей помощи.

От Вас требуется найти минимальный номер хода, после которого на клетчатом листке образовался хотя бы один квадрат черного цвета со стороной 3 или определить, что такого хода нет.

Входные данные

В первой строке задано два целых числа n и m (1 ≤ n ≤ 1000, 1 ≤ m ≤ min(n·n, 105)) — размер клетчатого листа и количество ходов соответственно.

Далее в m строках задано описание ходов. В i-ой строке находятся два числа xi, yi (1 ≤ xi, yi ≤ n) — номер строки и номер столбца, в котором находится клетка, закрашиваемая на i-ом ходе.

Все числа в строках разделены единичными пробелами. Гарантируется, что все ходы различны. Ходы нумеруются, начиная с 1, в том порядке, в котором они заданы во входных данных. Столбцы клетчатого листа бумаги нумеруются, начиная с 1, слева направо. Строки клетчатого листа бумаги нумеруются, начиная с 1, сверху вниз.

Выходные данные

В единственной строке выведите ответ на задачу — минимальный номер хода, после которого на листе образуется черный квадрат со стороной 3. Если такого хода не существует, выведите -1.

D. Удар по мячу

геометрия математика реализация *1700

В то время, когда Валера играл на стадионе в футбол, внезапно пошел дождь. Чтобы не промокнуть, Валера скрылся в коридоре подтрибунного помещения. Однако желание играть было настолько велико, что он решил потренировать удар по мячу прямо в этом коридоре. Валера отошел на достаточно большое расстояние, поставил мяч и совершил удар, после чего мяч, отскакивая от стен, потолка и пола коридора, ударился о выходную дверь. Так как мяч был влажный, он оставил на двери след. Теперь Валера хочет узнать координаты этого следа.

Опишем данное событие более формально. Мяч будем считать точкой в пространстве. Дверь коридора будем считать прямоугольником, расположенным в плоскости xOz таким образом, что левый нижний угол двери расположен в точке (0, 0, 0), а правый верхний — в точке (a, 0, b). Коридор будем считать прямоугольным параллелепипедом, бесконечным в сторону увеличения координаты y. При этом пол коридора будем считать плоскостью xOy, а потолок — плоскостью, параллельной xOy и проходящей через точку (a, 0, b). Будем также считать, что одна из стен — это плоскость yOz, а другая стена — это плоскость, параллельная yOz и проходящая через точку (a, 0, b).

Скажем, что мяч ударился о дверь тогда, когда его координата y стала равна 0. Таким образом координаты следа — это точка (x0, 0, z0), где 0 ≤ x0 ≤ a, 0 ≤ z0 ≤ b. Чтобы исполнить удар, Валера отходит от двери на расстояние m и ставит мяч по центру коридора в точку . После удара мяч летит со скоростью (vx, vy, vz). Это значит, что если мяч имел координаты (x, y, z), то через одну секунду он будет иметь координаты (x + vx, y + vy, z + vz).

Чтобы лучше понять введенную систему координат посмотрите рисунок в примечаниях.

При столкновении с потолком, полом или одной из стен коридора, мяч отскакивает в соответствии с законами отражения (угол падения равен углу отражения). В задаче рассматривается идеальная физическая модель, поэтому можно считать, что отсутствуют сопротивление воздуха, силы трения, какие-либо потери энергии.

Входные данные

В первой строке заданы три целых числа a, b, m (1 ≤ a, b, m ≤ 100), разделенные пробелами. Первые два числа задают точку (a, 0, b), через которую проходят потолок и одна из стен коридора, третье число — расстояние, на которое Валера отошел от двери.

Во второй строке через пробелы заданы три целых числа vx, vy, vz (|vx|, |vy|, |vz| ≤ 100, vy < 0, vz ≥ 0) — скорость мяча после удара.

Гарантируется, что мяч ударится о дверь.

Выходные данные

Выведите два вещественных числа x0, z0 — координаты x и z точки (x0, 0, z0), в которой мяч ударится о выходную дверь. Ответ будет считаться правильным, если его относительная или абсолютная погрешность не будет превышать 10  - 6.

Примечание

D. Любимая перестановка ЧТД

реализация сортировки Структуры данных *1700

ЧТД подарили перестановку\(^{\text{∗}}\) \(p\) длины \(n\). У него также есть строка \(s\) длины \(n\), содержащая только символы \(\texttt{L}\) и \(\texttt{R}\). ЧТД любит только те перестановки, которые отсортированы в неубывающем порядке. Чтобы отсортировать \(p\), он может выбирать любые из следующих операций и выполнять их любое количество раз:

  • Выбрать индекс \(i\) такой, что \(s_i = \texttt{L}\). Затем поменять местами \(p_i\) и \(p_{i-1}\). Гарантируется, что \(s_1 \neq \texttt{L}\).
  • Выбрать индекс \(i\) такой, что \(s_i = \texttt{R}\). Затем поменять местами \(p_i\) и \(p_{i+1}\). Гарантируется, что \(s_n \neq \texttt{R}\).

Ему также дается \(q\) запросов. В каждом запросе он выбирает индекс \(i\) и меняет \(s_i\) с \(\texttt{L}\) на \(\texttt{R}\) (или с \(\texttt{R}\) на \(\texttt{L}\)). Обратите внимание, что изменения постоянны.

После каждого запроса он спрашивает вас, можно ли отсортировать \(p\) в неубывающем порядке, выполнив вышеупомянутые операции любое количество раз. Обратите внимание, что перед каждым запросом перестановка \(p\) сбрасывается к своему исходному значению.

\(^{\text{∗}}\)Перестановка длины \(n\) — это массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\), расположенных в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) — не перестановка (\(2\) дважды встречается в массиве), и \([1,3,4]\) — тоже не перестановка (\(n=3\), но в массиве есть \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(3 \leq n \leq 2 \cdot 10^5\), \(1 \leq q \leq 2 \cdot 10^5\)) — длина перестановки и количество запросов.

Следующая строка содержит \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) (\(1 \leq p_i \leq n\), \(p\) — перестановка).

Следующая строка содержит \(n\) символов \(s_1s_2 \ldots s_n\). Гарантируется, что \(s_i\) — это либо \(\texttt{L}\), либо \(\texttt{R}\), \(s_1 = \texttt{R}\), а \(s_n = \texttt{L}\).

Следующие \(q\) строк содержат по одному целому числу \(i\) (\(2 \leq i \leq n-1\)), обозначающему, что \(s_i\) изменено с \(\texttt{L}\) на \(\texttt{R}\) (или с \(\texttt{R}\) на \(\texttt{L}\)). Запросы изменяют строку, то есть следующее изменение будет применяться к обновлённой строке.

Гарантируется, что сумма \(n\) и сумма \(q\) по всем наборам входных данных не превосходят \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите «YES» (без кавычек), если возможно отсортировать перестановку, или «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом наборе входных данных \(s = \texttt{RRRLL}\) после первого запроса. ЧТД может отсортировать \(p\) с помощью следующих операций:

  • Изначально, \(p = [1,4,2,5,3]\).
  • Выбрать \(i = 2\) и поменять местами \(p_2\) и \(p_{3}\). Теперь \(p = [1,2,4,5,3]\).
  • Выбрать \(i = 5\) и поменять местами \(p_5\) и \(p_{4}\). Теперь \(p = [1,2,4,3,5]\).
  • Выбрать \(i = 4\) и поменять местами \(p_4\) и \(p_{3}\). Теперь \(p = [1,2,3,4,5]\), то есть перестановка отсортирована в неубывающем порядке.

Можно показать, что невозможно отсортировать массив после выполнения трёх обновлений первого набора входных данных.

E. MEXимизируйте счёт

дп жадные алгоритмы Комбинаторика математика реализация Структуры данных *2200

Предположим, что мы разбиваем элементы массива \(b\) на \(k\) непустых мультимножеств \(S_1, S_2, \ldots, S_k\), где \(k\) — произвольное целое положительное число. Определим счёт \(b\) как максимальное значение \(\operatorname{MEX}(S_1)\)\(^{\text{∗}}\)\( + \operatorname{MEX}(S_2) + \ldots + \operatorname{MEX}(S_k)\) среди всех возможных разбиений \(b\) для любого целого числа \(k\).

Вашему завистнику дан массив \(a\) длины \(n\). Поскольку он знает, что вычислить счёт массива \(a\) для вас слишком просто, он просит вас вычислить сумму счётов всех \(2^n - 1\) непустых подпоследовательностей массива \(a\).\(^{\text{†}}\) Поскольку ответ может быть очень большим, выведите его по модулю \(998\,244\,353\).

\(^{\text{∗}}\)\(\operatorname{MEX}\) набора целых чисел \(c_1, c_2, \ldots, c_k\) определяется как наименьшее неотрицательное целое число \(x\), которое не встречается в наборе \(c\). Например, \(\operatorname{MEX}([0,1,2,2]) = 3\) и \(\operatorname{MEX}([1,2,2]) = 0\)

\(^{\text{†}}\)Последовательность \(x\) является подпоследовательностью последовательности \(y\), если \(x\) можно получить из \(y\), удалив несколько (возможно, ноль или все) элементов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — длина \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i < n\)) — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите ответ по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных мы должны рассмотреть семь подпоследовательностей:

  • \([0]\): Счёт равен \(1\).
  • \([0]\): Счёт равен \(1\).
  • \([1]\): Счёт равен \(0\).
  • \([0,0]\): Счёт равен \(2\).
  • \([0,1]\): Счёт равен \(2\).
  • \([0,1]\): Счёт равен \(2\).
  • \([0,0,1]\): Счёт равен \(3\).
Ответ для первого набора входных данных составляет \(1+1+2+2+2+3=11\).

В последнем наборе входных данных все подпоследовательности имеют счёт \(0\).

F. Орангутано-одобренный массив

Бинарный поиск дп жадные алгоритмы реализация Структуры данных *2400

Предположим, у вас есть массив \(b\). Изначально у вас также есть множество \(S\), которое содержит все различные элементы массива \(b\). Массив \(b\) называется орангутано-одобренным, если его можно сделать пустым, выполняя следующую операцию:

  • Выбрать индексы \(l\) и \(r\) (\(1 \leq l \leq r \leq |b|\)) такие, что \(v = b_l = b_{l+1} = \ldots = b_r\) и \(v\) присутствует в \(S\). Удалить \(v\) из \(S\), а также удалить все \(b_i\), для которых \(l \leq i \leq r\). Затем подвинуть элементы \(b_{r+1}, b_{r+2}, \ldots\) влево на позиции \(b_l, b_{l+1}, \ldots\) соответственно.

Вам дан массив \(a\) длины \(n\) и \(q\) запросов.

Каждый запрос состоит из двух индексов \(l\) и \(r\) (\(1 \le l \le r \le n\)), и вам нужно определить, является ли подмассив \(a_{l}, a_{l+1}, \ldots, a_r\) орангутано-одобренным.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1 \leq n,q \leq 2 \cdot 10^5\)) — длину \(a\) и количество запросов, соответственно.

Следующая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)) — элементы массива \(a\).

Следующие \(q\) строк содержат по два целых числа \(l\) и \(r\) — концы подмассивов для каждого запроса (\(1 \leq l \leq r \leq n\)).

Гарантируется, что сумма \(n\) и \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите «YES» (без кавычек), если подмассив от \(l\) до \(r\) является орангутано-одобренным, и «NO» (без кавычек) в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом запросе первого набора входных данных ответ — YES.

  • Изначально \(S=\{1,2\}\) и \(b=[1,2,2,1]\).
  • Выберите \(l=2\) и \(r=3\). Поскольку \(b_2=b_3=2\) находится в \(S\), мы можем удалить \(b_2\) и \(b_3\) из массива, а также удалить \(2\) из \(S\). Множество \(S\) становится \(\{1\}\), а массив — \([1,1]\).
  • Выберите \(l=1\) и \(r=2\). Поскольку \(b_1=b_2=1\) находится в \(S\), мы можем удалить \(b_1\) и \(b_2\) из массива, а также удалить \(1\) из \(S\). Множество \(S\) становится \(\{\}\), а массив — \([]\).
  • Поскольку массив теперь пуст, мы можем сказать, что исходный массив — орангутано-одобренный

В первом запросе второго набора входных данных ответ — NO, потому что можно показать, что подмассив \([2,1,2,1]\) не может стать пустым ни при какой последовательности корректных операций.

D. Пенчик и пустынный кролик

Бинарный поиск дп жадные алгоритмы поиск в глубину и подобное реализация снм Структуры данных *1700

Пенчик бросил себе вызов — выжить под полуденным солнцем в Аравийской пустыне!

На линейном оазисе в ряд растёт \(n\) пальм, обозначим их высоты \(a_i\). Во время прогулки Пенчик заметил пустынного кролика, который готовится прыгнуть вдоль линии пальм.

Кролик может перепрыгнуть с \(i\)-го дерева на \(j\)-е, если верно ровно одно из следующих условий:

  • \(j < i\) и \(a_j > a_i\): кролик может прыгнуть назад на более высокое дерево.
  • \(j > i\) и \(a_j < a_i\): кролик может прыгнуть вперёд на более низкое дерево.

Для каждого \(i\) от \(1\) до \(n\) определите максимальную высоту среди всех деревьев, которые может достичь кролик, если он начнёт с \(i\)-го дерева.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 5 \cdot 10^5\)) — количество деревьев.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — высоты деревьев.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел. \(i\)-е число должно равняться максимальной высоте среди всех деревьев, которые может достичь кролик, если он начнёт с дерева \(i\).

Примечание

В первом наборе входных данных высоты деревьев равны \(a = [2, 3, 1, 4]\).

  • Если кролик стартует с первого дерева, то он может перепрыгнуть на третье дерево, так как \(3 > 1\) и \(1 < 2\). Затем кролик может перепрыгнуть на второе дерево, так как \(2 < 3\) и \(3 > 1\). Можно доказать, что кролик не может допрыгнуть до четвёртого дерева; следовательно, максимальная высота дерева, до которого может допрыгнуть кролик, равна \(a_2 = 3\).
  • Если кролик стартует с четвёртого дерева, ему не нужно никуда прыгать, так как он уже находится на самом высоком дереве.

Во втором наборе входных данных кролик может прыгнуть на первое дерево независимо от того, с какого дерева он стартует.

В пятом наборе входных данных, если кролик начинает с пятого дерева, он может прыгнуть на четвёртое дерево. Затем кролик может перепрыгнуть на седьмое дерево и, наконец, достичь шестого дерева. Таким образом, максимальная высота дерева, до которого может добраться кролик, равна \(8\).

E. Деревья Пенчика и Хлои

Деревья дп жадные алгоритмы математика поиск в глубину и подобное реализация сортировки Структуры данных *2100

До отъезда Пенчика и Хлои в Сингапур оставалось всего несколько часов, и им не терпелось увидеть высоченные деревья в Сингапурском ботаническом саду! Пытаясь сдержать свое волнение, Пенчик смастерил дерево с корнями, чтобы занять Хлою и себя.

У Пенчика есть корневое дерево\(^{\text{∗}}\), состоящее из \(n\) вершин, пронумерованных от \(1\) до \(n\), с вершиной \(1\) в качестве корня. Хлоя может выбрать целое неотрицательное число \(d\), чтобы создать совершенное бинарное дерево\(^{\text{†}}\) глубины \(d\).

Поскольку Пенчик и Хлоя — хорошие друзья, Хлоя хочет, чтобы ее дерево было изоморфно\(^{\text{‡}}\) дереву Пенчика. Чтобы достичь этого, Хлоя может выполнить следующую операцию над своим деревом любое количество раз:

  • Выбрать ребро \((u,v)\), где \(u\) является родителем \(v\).
  • Удалить вершину \(v\) и все ребра, связанные с \(v\), а затем соединить всех бывших детей \(v\) непосредственно с \(u\).

В частности, операция над ребром \((u, v)\), где \(v\) — лист, удалит вершину \(v\) без добавления новых ребер.

Поскольку построение совершенного бинарного дерева может занять много времени, Хлоя хочет выбрать минимальное \(d\), такое, чтобы совершенное бинарное дерево глубины \(d\) можно было сделать изоморфным дереву Пенчика с помощью вышеописанной операции. Обратите внимание, что Хлоя не может менять корни деревьев.

\(^{\text{∗}}\)Деревом называется связный граф без циклов. Корневым деревом называется дерево, в котором одна из вершин специальная и называется корнем. Родителем вершины \(v\) называется первая вершина на простом пути от \(v\) до корня. У корня нет родителя. Ребенком вершины \(v\) называется любая вершина \(u\), для которой \(v\) является родителем. Листом называется любая вершина, у которой нет детей.

\(^{\text{†}}\)Полным бинарным деревом называется корневое дерево, в котором у каждой вершины \(0\) или \(2\) детей. Совершенное бинарное дерево — это полное бинарное дерево, в котором каждый лист находится на одинаковом расстоянии от корня. Глубина такого дерева равна расстоянию от корня до листа.

\(^{\text{‡}}\)Два дерева с корнями, равными \(r_1\) и \(r_2\) соответственно, считаются изоморфными, если существует такая перестановка вершин \(p\), что ребро \((u, v)\) существует в первом дереве тогда и только тогда, когда ребро \((p_u, p_v)\) существует во втором дереве, и \(p_{r_1} = r_2\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 10^6\)) — количество вершин в дереве Пенчика.

Вторая строка каждого набора входных данных содержит \(n-1\) целых чисел \(p_2, p_3, \ldots, p_n\) (\(1 \leq p_i \leq i-1\)) — родитель вершины \(i\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите в отдельной строке одно целое число: минимальную глубину совершенного бинарного дерева Хлои.

Примечание

В первом наборе входных данных можно создать совершенное бинарное дерево глубины \(2\).

Рассмотрим выполнение операции на ребре \(AC\). Рёбра \(AC\), \(CF\) и \(CG\) удаляются, а рёбра \(AF\) и \(AG\) добавляются.

Полученное дерево изоморфно дереву, заданному на входе. Можно доказать, что никакая последовательность операций над бинарным деревом глубины менее \(2\) не может привести к дереву, изоморфному дереву, заданному на входе.

Во втором наборе входных данных дерево уже изоморфно совершенному бинарному дереву глубины \(3\).

A. Схема

жадные алгоритмы математика реализация теория чисел *800

Алиса только что создала схему с \(n\) лампочками и \(2n\) переключателями. Каждый компонент (лампочка или переключатель) имеет два состояния: включен или выключен. Лампочки и переключатели расположены таким образом:

  • Каждая лампочка подключена к ровно двум переключателям.
  • Каждый переключатель подключен к ровно одной лампочке. Неизвестно, к какой лампочке подключен каждый переключатель.
  • Когда все переключатели выключены, все лампочки также выключены.
  • Если переключатель переключается (с включенного на выключенный или наоборот), состояние лампочки, к которой он подключен, также переключается.

Алиса принесла схему, которая показывает только состояния \(2n\) переключателей, своей сестре Ирис и задала ей загадку: каково минимальное и максимальное количество лампочек, которые могут быть включены?

Зная проделки своей младшей сестры слишком хорошо, Ирис не тратит больше секунды, чтобы дать Алисе правильный ответ. Можете ли вы сделать также?

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 50\)) — количество лампочек в схеме.

Вторая строка каждого набора входных данных содержит \(2n\) целых чисел \(a_1, a_2, \ldots, a_{2n}\) (\(0 \le a_i \le 1\)) — состояния переключателей в схеме. \(a_i = 0\) означает, что \(i\)-й переключатель выключен, а \(a_i = 1\) означает, что \(i\)-й переключатель включен.

Выходные данные

Для каждого набора входных данных выведите два целых числа — минимальное и максимальное количество лампочек, которые могут быть включены, соответственно.

Примечание

В первом наборе входных данных в схеме только одна лампочка, и ни один переключатель не включен, поэтому лампочка точно выключена.

Во втором наборе входных данных в схеме только одна лампочка, но один переключатель, подключенный к ней, включен, поэтому лампочка включена.

В третьем наборе входных данных в схеме только одна лампочка, оба переключателя включены, поэтому лампочка выключена, так как переключается дважды.

В четвёртом наборе входных данных, чтобы не было включенных лампочек, переключатели могут быть расположены следующим образом:

  • Переключатель \(1\) и переключатель \(4\) подключены к лампочке \(1\). Поскольку оба переключателя выключены, лампочка \(1\) также выключена.
  • Переключатель \(2\) и переключатель \(6\) подключены к лампочке \(2\). Поскольку оба переключателя выключены, лампочка \(2\) также выключена.
  • Переключатель \(3\) и переключатель \(5\) подключены к лампочке \(3\). Оба переключателя включены, поэтому лампочка \(3\) переключается дважды из своего первоначального выключенного состояния и, следовательно, также остается выключенной.

А чтобы включить \(2\) лампочки, переключатели могут быть расположены следующим образом:

  • Переключатель \(1\) и переключатель \(2\) подключены к лампочке \(1\). Поскольку оба переключателя выключены, лампочка \(1\) также выключена.
  • Переключатель \(3\) и переключатель \(4\) подключены к лампочке \(2\). Поскольку переключатель \(3\) включен, а переключатель \(4\) выключен, лампочка \(2\) переключается один раз из своего первоначального выключенного состояния, поэтому она включена.
  • Переключатель \(5\) и переключатель \(6\) подключены к лампочке \(3\). Поскольку переключатель \(5\) включен, а переключатель \(6\) выключен, лампочка \(3\) переключается один раз из своего первоначального выключенного состояния, поэтому она включена.

B. Медианы

жадные алгоритмы Конструктив математика реализация *1100

Дан массив \(a = [1, 2, \ldots, n]\), где \(n\)нечетное, и целое число \(k\).

Ваша задача — выбрать нечетное положительное целое число \(m\) и разбить массив \(a\) на \(m\) подмассивов\(^{\dagger}\) \(b_1, b_2, \ldots, b_m\) так, чтобы:

  • Каждый элемент массива \(a\) принадлежит ровно одному подмассиву.
  • Для всех \(1 \le i \le m\), \(|b_i|\)нечетное, т.е. длина каждого подмассива нечетная.
  • \(\operatorname{median}([\operatorname{median}(b_1), \operatorname{median}(b_2), \ldots, \operatorname{median}(b_m)]) = k\), т.е. медиана\(^{\ddagger}\) массива медиан всех подмассивов должна равняться \(k\). \(\operatorname{median}(c)\) обозначает медиану массива \(c\).

\(^{\dagger}\)Подмассив массива \(a\) длины \(n\) — это массив \([a_l, a_{l + 1}, \ldots, a_r]\) для некоторых целых чисел \(1 \le l \le r \le n\).

\(^{\ddagger}\)Медиана массива нечетной длины — это средний элемент после сортировки массива в неубывающем порядке. Например: \(\operatorname{median}([1,2,5,4,3]) = 3\), \(\operatorname{median}([3,2,1]) = 2\), \(\operatorname{median}([2,1,2,1,2,2,2]) = 2\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 5000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(k\) (\(1 \le k \le n < 2 \cdot 10^5\), \(n\)нечетное) — длина массива \(a\) и требуемая медиана массива медиан всех подмассивов.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных:

  • Если подходящего разбиения нет, выведите \(-1\) в одной строке.
  • В противном случае, в первой строке выведите нечетное целое число \(m\) (\(1 \le m \le n\)) — количество подмассивов в разбиении, а во второй строке выведите \(m\) различных целых чисел \(p_1, p_2 , p_3 , \ldots, p_m\) (\(1 = p_1 < p_2 < p_3 < \ldots < p_m \le n\)) — обозначающие левые границы каждого подмассива.

А именно, для корректного ответа \([p_1, p_2, \ldots, p_m]\):

  • \(b_1 = \left[ a_{p_1}, a_{p_1 + 1}, \ldots, a_{p_2 - 1} \right]\)
  • \(b_2 = \left[ a_{p_2}, a_{p_2 + 1}, \ldots, a_{p_3 - 1} \right]\)
  • \(\ldots\)
  • \(b_m = \left[ a_{p_m}, a_{p_m + 1}, \ldots, a_n \right]\).

Если существует несколько решений, вы можете вывести любое из них.

Примечание

В первом наборе входных данных при данном разбиении \(m = 1\) и \(b_1 = [1]\). Очевидно, что \(\operatorname{median}([\operatorname{median}([1])]) = \operatorname{median}([1]) = 1\).

Во втором наборе входных данных при данном разбиении \(m = 3\) и:

  • \(b_1 = [1]\)
  • \(b_2 = [2]\)
  • \(b_3 = [3]\)

Следовательно, \(\operatorname{median}([\operatorname{median}([1]), \operatorname{median}([2]), \operatorname{median}([3])]) = \operatorname{median}([1, 2, 3]) = 2\).

В третьем наборе входных данных нет корректного разбиения для \(k = 3\).

В четвертом наборе входных данных при данном разбиении \(m = 5\) и:

  • \(b_1 = [1, 2, 3]\)
  • \(b_2 = [4, 5, 6]\)
  • \(b_3 = [7, 8, 9]\)
  • \(b_4 = [10, 11, 12]\)
  • \(b_5 = [13, 14, 15]\)

Следовательно, \(\operatorname{median}([\operatorname{median}([1, 2, 3]), \operatorname{median}([4, 5, 6]), \operatorname{median}([7, 8, 9]), \operatorname{median}([10, 11, 12]), \operatorname{median}([13, 14, 15])]) = \operatorname{median}([2, 5, 8, 11, 14]) = 8\).

D. Генокракен

графы Деревья жадные алгоритмы интерактив Конструктив реализация Структуры данных *1800

Это интерактивная задача.

Очистив Прибрежную Зону, Гретель обнаружила монстра по имени Генокракен и удерживает его для своих научных исследований.

Нервная система монстра может быть представлена как дерево\(^{\dagger}\) из \(n\) вершин (на самом деле, всё не должно постоянно напоминать деревья\(\ldots\)), пронумерованных от \(0\) до \(n-1\), с вершиной \(0\) в качестве корня.

Цель Гретель — узнать точную структуру нервной системы монстра. Более конкретно, она хочет узнать значения \(p_1, p_2, \ldots, p_{n-1}\) дерева, где \(p_i\) (\(0 \le p_i < i\)) является прямым предком вершины \(i\) (\(1 \le i \le n - 1\)).

Она не знает точно, как расположены вершины, но знает несколько приятных фактов:

  • Если мы удалим корневую вершину \(0\) и все смежные ребра, то это дерево превратится в лес, состоящий только из путей\(^{\ddagger}\). Каждая вершина, которая изначально была смежной с вершиной \(0\), будет концом какого-то пути.
  • Вершины нумеруются таким образом, что если \(1 \le x \le y \le n - 1\), то \(p_x \le p_y\).
  • Вершина \(1\) гарантированно имеет ровно две смежные вершины (включая вершину \(0\)).
Дерево на этой картинке не удовлетворяет условию, потому что если мы удалим вершину \(0\), то вершина \(2\) (которая изначально была смежной с вершиной \(0\)) не будет концом пути \(4-2-5\).Дерево на этой картинке не удовлетворяет условию, потому что должно выполняться \(p_3 \le p_4\).Дерево на этой картинке не удовлетворяет условию, потому что вершина \(1\) имеет только одну смежную вершину.

Гретель может делать запросы к защитной камере:

  • «? a b» (\(1 \le a, b < n\), \(a \ne b\)) — камера проверит, содержит ли простой путь между вершинами \(a\) и \(b\) вершину \(0\).

Однако, чтобы избежать неожиданных последствий от чрезмерной стимуляции существа, Гретель хочет сделать не более \(2n - 6\) запросов. Хотя Гретель одарена, она не может сделать всё сразу, так что можете ли вы протянуть ей руку помощи?

\(^{\dagger}\)Дерево — это связный граф, в котором каждая пара различных вершин имеет ровно один простой путь, соединяющий их.

\(^{\ddagger}\)Путь — это дерево, вершины которого могут быть записаны в порядке \(v_1, v_2, \ldots, v_k\) так, что рёбра имеют вид \((v_i, v_{i+1})\) (\(1 \le i < k\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(4 \le n \le 10^4\)) — количество вершин в нервной системе Генокракена.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(10^4\).

Протокол взаимодействия

Для каждого набора входных данных взаимодействие начинается с чтения целого числа \(n\).

Затем вы можете делать запросы следующего вида:

  • «? a b» (без кавычек) (\(1 \le a, b < n\), \(a \ne b\)).

После запроса прочитайте целое число \(r\) — ответ на ваш запрос. Вам разрешено использовать не более \(2n - 6\) запросов этого типа.

  • Если простой путь между вершинами \(a\) и \(b\) не содержит вершину \(0\), вы получите \(r = 0\).
  • Если простой путь между вершинами \(a\) и \(b\) содержит вершину \(0\), вы получите \(r = 1\).
  • В случае, если вы сделаете более \(2n-6\) запросов или сделаете некорректный запрос, вы получите \(r = -1\). После получения такого ответа ваша программа должна немедленно завершиться, чтобы получить вердикт «Неправильный ответ». В противном случае вы можете получить произвольный вердикт, потому что ваше решение продолжит чтение из закрытого потока.

Когда вы определите структуру, выведите строку в формате «! \(p_1 \space p_2 \ldots p_{n-1}\)» (без кавычек), где \(p_i\) (\(0 \le p_i < i\)) обозначает индекс прямого предка вершины \(i\). Этот запрос не учитывается в лимите \(2n - 6\) запросов.

После решения одного набора входных данных программа должна сразу же переходить к следующему. После решения всех наборов входных данных программа должна быть немедленно завершена.

После вывода любого запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Интерактор неадаптивный. Дерево не меняется в процессе взаимодействия.

Взломы

Для взлома используйте следующий формат:

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(4 \le n \le 10^4\)) — количество вершин в нервной системе Генокракена.

Вторая строка каждого набора входных данных содержит \(n-1\) целых чисел \(p_1, p_2, \ldots, p_{n-1}\) (\(0 \le p_1 \le p_2 \le \ldots \le p_{n-1} \le n - 2\), \(0 \le p_i < i\)) — прямые предки вершин \(1\), \(2\), ..., \(n-1\) в системе соответственно.

В каждом наборе входных данных значения \(p_1, p_2, \ldots, p_{n-1}\) должны обеспечивать следующее в дереве:

  • Если мы удалим корневую вершину \(0\) и все смежные ребра, то это дерево превратится в лес, состоящий только из путей. Каждая вершина, которая изначально была смежной с вершиной \(0\), будет концом какого-то пути.
  • Вершина \(1\) имеет ровно две смежные вершины (включая вершину \(0\)).

Сумма \(n\) по всем наборам входных данных не должна превышать \(10^4\).

Примечание

В первом наборе входных данных нервная система Генокракена образует следующее дерево:

  • Ответ на «? 2 3» равен \(1\). Это означает, что простой путь между вершинами \(2\) и \(3\) содержит вершину \(0\).

Во втором наборе входных данных нервная система Генокракена образует следующее дерево:

  • Ответ на «? 2 3» равен \(1\). Это означает, что простой путь между вершинами \(2\) и \(3\) содержит вершину \(0\).
  • Ответ на «? 2 4» равен \(0\). Это означает, что простой путь между вершинами \(2\) и \(4\) не содержит вершину \(0\).

В третьем наборе входных данных нервная система Генокракена образует следующее дерево:

E. Сбалансированный

жадные алгоритмы Конструктив математика реализация Структуры данных *2400

Дан циклический массив \(a\) из \(n\) элементов, где \(n\)нечетное. За одну операцию вы можете сделать следующее:

  • Выберите индекс \(1 \le i \le n\) и увеличьте \(a_{i - 1}\) на \(1\), \(a_i\) на \(2\) и \(a_{i + 1}\) на \(1\). Элемент перед первым элементом является последним элементом, так как это циклический массив.

Циклический массив называется сбалансированным, если все его элементы равны между собой.

Найдите любую последовательность операций, чтобы сделать этот циклический массив сбалансированным, или определите, что это невозможно. Обратите внимание, что вам не нужно минимизировать количество операций.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 2 \cdot 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n < 2 \cdot 10^5\), \(n\)нечетное) — длина массива \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^{6}\)) — элементы массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных:

  • Если невозможно сделать циклический массив сбалансированным, выведите \(-1\).
  • В противном случае выведите \(n\) целых чисел \(v_1, v_2, \ldots, v_n\) (\(0 \leq v_i \leq 10^{18}\)) — где \(v_i\) обозначает количество операций, примененных к индексу \(i\). Можно доказать, что если существует какое-то решение, то существует решение при данных ограничениях. Если существует несколько решений при данных ограничениях, выведите любое из них.
Примечание

В первом наборе входных данных:

  • После \(1\) операции, примененной к индексу \(i = 2\), массив \(a = [3, 3, 3]\).

Во втором наборе входных данных:

  • После \(2\) операций, примененных к индексу \(i = 1\), массив \(a = [5, 4, 5]\).
  • После \(1\) операции, примененной к индексу \(i = 2\), массив \(a = [6, 6, 6]\).

В третьем наборе входных данных:

  • После \(2\) операций, примененных к индексу \(i = 1\), массив \(a = [5, 4, 1, 2, 3]\).
  • После \(3\) операций, примененных к индексу \(i = 3\), массив \(a = [5, 7, 7, 5, 3]\).
  • После \(2\) операций, примененных к индексу \(i = 5\), массив \(a = [7, 7, 7, 7, 7]\).

A. Сакурако и Косукэ

Конструктив математика реализация *800

Сакурако и Косукэ решили поиграть в игры с точкой на координатной прямой. Точка в настоящее время находится в позиции \(x=0\). Они будут по очереди делать ходы, и первой ходит Сакурако.

На каждом \(i\)-м ходу текущий игрок переместит точку в каком-то направлении на \(2\cdot i-1\) единиц. Сакурако всегда будет перемещать точку в отрицательном направлении, тогда как Косукэ всегда будет перемещать её в положительном направлении.

Другими словами, произойдет следующее:

  1. Сакурако изменит положение точки на \(-1\), теперь \(x = -1\)
  2. Косукэ изменит положение точки на \(3\), теперь \(x = 2\)
  3. Сакурако изменит положение точки на \(-5\), теперь \(x = -3\)
  4. \(\cdots\)

Они будут продолжать играть, пока абсолютное значение координаты точки не превысит \(n\). Более формально, игра продолжается, пока \(-n\le x\le n\). Можно доказать, что игра всегда закончится.

Ваша задача — определить, кто сделает последний ход.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1\le t\le 100\)) — количество игр, в которые сыграли Сакурако и Косукэ.

Каждая игра описывается одним числом \(n\) (\(1 \le n\le 100\)) — числом, которое определяет условие, при котором игра заканчивается.

Выходные данные

Для каждой из \(t\) игр выведите строку с результатом этой игры. Если последний ход сделала Сакурако, выведите «Sakurako» (без кавычек), иначе выведите «Kosuke».

B. Возрождение Рахша

жадные алгоритмы реализация Структуры данных *1000

Верный конь Рустама, Рахш, уже не тот, что раньше. Некогда могущественный и быстрый, Рахш со временем стал слабее. Рустам беспокоится, что если слишком много частей тела Рахша потеряют силу одновременно, Рахш может полностью остановиться. Чтобы поддержать своего спутника, Рустам решает укрепить Рахша, чтобы ни одна часть его тела не стала слишком слабой.

Тело Рахша можно представить в виде последовательности пятен, представленных бинарной строкой \(s\) длины \(n\), где символ \(0\) означает слабое место, а \(1\) — сильное. Цель Рустама — убедиться, что ни один интервал из \(m\) последовательных пятен не является полностью слабым (все пятна обозначены \(0\)).

К счастью, Рустам обладает особой способностью под названием Тимар, унаследованной от его матери Рудабе при рождении. С помощью Тимар он может выбрать любой отрезок длины \(k\) и мгновенно усилить его (изменить каждый символ на этом отрезке на \(1\)). Ваша задача состоит в том, чтобы определить минимальное число раз, которое Рустаму нужно использовать Тимар, чтобы на теле Рахша не осталось последовательных полностью слабых участков длины \(m\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три числа \(n\), \(m\), \(k\) (\(1 \le m, k \le n \le 2 \cdot 10^5\)). Вторая строка каждого набора входных данных содержит бинарную строку \(s\) длины \(n\), состоящую из символов \(s_1s_2 \ldots s_n\) (\(s_i \in \{\)0,1\(\}\) для всех \(1 \le i \le n\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите минимальное число раз, которое Рустаму необходимо использовать Тимар, чтобы поддерживать движение Рахша, гарантируя отсутствие последовательных полностью слабых участков длины \(m\).

Примечание

В первом наборе входных данных мы должны применить операцию к каждому символу 0.

Во втором наборе входных данных \(s\) уже удовлетворяет условию.

В третьем наборе входных данных мы можем выполнить операцию над интервалом \([3,4]\) для получения 001100.

C. Заперт в лабиринте ведьмы

графы Конструктив поиск в глубину и подобное реализация *1400

В четвёртом подвиге Рустама, легендарного героя из Шахнаме, старая ведьма создала волшебный лабиринт, чтобы заманить его в ловушку. Лабиринт представляет собой прямоугольную сетку, состоящую из \(n\) строк и \(m\) столбцов. Каждая клетка в лабиринте указывает в определенном направлении: вверх, вниз, влево или вправо. Ведьма заколдовала Рустама так, что всякий раз, когда он находится в клетке, он перемещается в следующую клетку в направлении, указанном этой клеткой.

Если Рустам в конце концов выйдет из лабиринта, он освободится от чар ведьмы и победит ее. Однако, если он будет вечно блуждать по лабиринту, то он останется там навсегда.

Ведьма еще не определила направления для всех клеток. Она хочет назначить направления для неуказанных клеток таким образом, чтобы количество клеток, начав из которых Рустам будет пойман навсегда, было максимальным. Ваша задача — найти это количество.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Для каждого набора входных данных:

  • Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n, m \leq 1000\)), представляющих количество строк и столбцов в лабиринте.
  • Каждая из следующих \(n\) строк содержит строку из \(m\) символов, представляющих направления в лабиринте. Каждый символ является одним из следующих:
    • U (вверх)
    • D (вниз)
    • L (влево)
    • R (вправо)
    • ? (неуказанное направление)

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимальное количество клеток, начиная из которых Рустам будет заперт навсегда, после оптимального назначения направлений неопределенным ячейкам.

Примечание

Назовём плохими клетки, начиная в которых Рустам не сможет выбраться. Остальные клетки назовём хорошими.

В первом наборе входных данных все клетки будут хорошими, независимо от ваших действий.

Во втором наборе входных данных, если вы назначите ? значения, как показано на рисунке ниже, все клетки будут плохими:

В третьем наборе входных данных, если вы назначите ? значения, как показано на рисунке ниже, у вас будет \(5\) плохих клеток (клетки, закрашенные красным):

D. Мудрость Дария

жадные алгоритмы Конструктив реализация сортировки *1600

Дарий Великий строит \(n\) каменных колонн, каждая из которых состоит из основания и либо \(0\), либо \(1\), либо \(2\) фрагментов надписей, расположенных сверху.

На каждом ходе Дарий может выбрать две колонны \(u\) и \(v\) такие, чтобы разница в количестве надписей между этими колоннами равнялась ровно \(1\), и перенести одну надпись с колонны с большим количеством надписей на другую. Гарантируется, что по крайней мере одна колонна содержит ровно \(1\) надпись.

Поскольку красота является главной опорой исторических зданий, Дарий хочет, чтобы колонны были расположены по возрастанию высоты. Чтобы избежать чрезмерных усилий работников, он просит вас спланировать последовательность из максимум \(n\) ходов, чтобы расположить колонны в порядке неубывания высоты, исходя из количества надписей. Минимизация количества ходов не требуется.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 3000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) — количество каменных колонн (\(1 \leq n \leq 2 \cdot 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\), где \(a_i \in \{0,1,2\}\) обозначает изначальное количество надписей на \(i\)-й колонне. Гарантируется, что по крайней мере на одной колонне находится ровно \(1\) надпись.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите целое число \(k\) — количество перемещений, использованных для сортировки колонн (\(0 \leq k \leq n\)).

Затем выведите \(k\) строк, каждая из которых содержит два целых числа \(u_i\) и \(v_i\) (\(1 \leq u_i, v_i \leq n\)), представляющие индексы колонн, участвующих в \(i\)-м перемещении. Во время каждого хода должно выполняться \(|a_{u_i} - a_{v_i}| = 1\), и одна надпись переносится с колонны с большим количеством надписей на другую.

Можно доказать, что при заданных ограничениях решение всегда существует.

Примечание

Состояние колонн в первом наборе входных данных:

  • Изначально: \(0, 2, 0, 1\)
  • После первого хода: \(0, 1, 0, 2\)
  • После второго хода: \(0, 0, 1, 2\)

Состояние колонн во втором наборе входных данных:

  • Изначально: \(1, 2, 0\)
  • После первого хода: \(0, 2, 1\)
  • После второго хода: \(0, 1, 2\)

В третьем наборе входных данных высоты колонн уже отсортированы в порядке возрастания.

G1. Часы Симурга (простая версия)

жадные алгоритмы Конструктив реализация сортировки *3500

Единственное различие между двумя версиями задачи заключается в том, учитываются ли пересечения во всех точках или только в целых точках.

Легендарная мифическая птица Симург отвечает за охрану обширных земель, и для этой цели она наняла \(n\) бдительных воинов. Каждый воин находится в боевой готовности в течение определенного отрезка времени \([l_i, r_i]\), где \(l_i\) — время начала (включительно), а \(r_i\) — время окончания (включительно), оба являются целыми положительными числами.

Один из доверенных советников Симурга, Зал, обеспокоен тем, что если несколько воинов будут караулить в одно и то же время и будут одеты в один и тот же цвет, они могут стать неотличимыми, что вызовет путаницу в дозоре. Чтобы предотвратить это, всякий раз, когда несколько воинов находятся на страже в один и тот же (возможно, нецелый) момент времени, должен быть хотя бы один цвет, который носит ровно один воин.

Таким образом, ваша задача состоит в том, чтобы определить минимальное необходимое количество цветов и назначить цвет \(c_i\) каждому отрезку дозора воина \([l_i, r_i]\) таким образом, чтобы для каждого (возможно, нецелого) момента времени \(t\) существовал цвет, который принадлежит ровно одному отрезку, содержащему \(t\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Для каждого набора входных данных:

  • Первая строка содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество воинов, размещенных Симургом.
  • Каждая из следующих \(n\) строк содержит по два целых числа \(l_i\) и \(r_i\) (\(1 \leq l_i \leq r_i \leq 10^9\)) — начало и окончание отрезка времени воина.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных:

  • Выведите минимальное необходимое количество цветов \(k\).
  • Затем выведите строку из \(n\) целых чисел \(c_i\) (\(1 \leq c_i \leq k\)), где каждое \(c_i\) — это цвет, присвоенный \(i\)-му воину.
Примечание

Мы можем представить отрезок наблюдения каждого воина в виде отрезка по оси X;

В 1 наборе входных данных у нас есть два независимых отрезка, которые могут быть окрашены в один и тот же цвет.

Во 2 наборе входных данных точка 2 является общей для двух отрезков, что означает, что мы не можем раскрасить их в один и тот же цвет.

В 3 наборе входных данных отрезки могут быть окрашены, как показано ниже (отрезки покрашены в выбранный цвет; области закрашены цветом, если данный цвет встречается в этот момент времени ровно один раз):

В 4 наборе входных данных отрезки могут быть окрашены, как показано ниже:

В 5 наборе входных данных отрезки могут быть окрашены, как показано ниже. Изображение справа демонстрирует пример неправильной раскраски для этого набора входных данных; на момент времени \(5.5\) нет уникального цвета:

G2. Часы Симурга (сложная версия)

жадные алгоритмы реализация *3500

Единственное различие между двумя версиями задачи заключается в том, учитываются ли пересечения во всех точках или только в целых точках.

Легендарная мифическая птица Симург отвечает за охрану обширных земель, и для этой цели она наняла \(n\) бдительных воинов. Каждый воин находится в боевой готовности в течение определенного отрезка времени \([l_i, r_i]\), где \(l_i\) — время начала (включительно), а \(r_i\) — время окончания (включительно), оба являются целыми положительными числами.

Один из доверенных советников Симурга, Зал, обеспокоен тем, что если несколько воинов будут караулить в одно и то же время и будут одеты в один и тот же цвет, они могут стать неотличимыми, что вызовет путаницу в дозоре. Чтобы предотвратить это, всякий раз, когда несколько воинов находятся на страже в один и тот же целый момент времени, должен быть хотя бы один цвет, который носит ровно один воин.

Таким образом, ваша задача состоит в том, чтобы определить минимальное необходимое количество цветов и назначить цвет \(c_i\) каждому отрезку дозора воина \([l_i, r_i]\) таким образом, чтобы для каждого (целого) момента времени \(t\) существовал цвет, который принадлежит ровно одному отрезку, содержащему \(t\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Для каждого набора входных данных:

  • Первая строка содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — количество воинов, размещенных Симургом.
  • Каждая из следующих \(n\) строк содержит по два целых числа \(l_i\) и \(r_i\) (\(1 \leq l_i \leq r_i \leq 10^9\)) — начало и окончание отрезка времени воина.

Сумма \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных:

  • Выведите минимальное необходимое количество цветов \(k\).
  • Затем выведите строку из \(n\) целых чисел \(c_i\) (\(1 \leq c_i \leq k\)), где каждое \(c_i\) — это цвет, присвоенный \(i\)-му воину.
Примечание

Мы можем представить отрезок наблюдения каждого воина в виде отрезка по оси X;

В 1 наборе входных данных отрезки могут быть окрашены, как показано ниже (отрезки покрашены в выбранный цвет; области закрашены цветом, если данный цвет встречается в этот момент времени ровно один раз):

Во 2 наборе входных данных отрезки могут быть окрашены, как показано ниже:

В 3 наборе входных данных интервалы могут быть окрашены, как показано ниже:

A. Скольжение

математика реализация *800

Красный не был предателем.

Имеется \(n\) строк по \(m\) человек. Пусть позиция в \(r\)-й строке и \(c\)-м столбце обозначается \((r, c)\). Люди пронумерованы по строкам, начиная с \(1\), т.е. человек с номером \((r-1)\cdot m+c\) изначально находится на позиции \((r, c)\).

Человек, находящийся на позиции \((r,c)\), решил уйти. Пусть он имел номер \(i\). Чтобы заполнить пробел, каждый человек с номером \(j>i\) переместится на позицию, на которой изначально находился человек с номером \(j-1\). Ниже приведена иллюстрация для случая, когда \(n=2\), \(m=3\), \(r=1\) и \(c=2\):

Вычислите сумму манхэттенских расстояний перемещения каждого человека. Если человек изначально находился на позиции \((r_0, c_0)\), а затем переместился на позицию \((r_1, c_1)\), то манхэттенское расстояние его перемещения составит \(|r_0-r_1|+|c_0-c_1|\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит \(4\) целых числа \(n\), \(m\), \(r\) и \(c\) (\(1\le r\le n\le 10^6\), \(1 \le c \le m \le 10^6\)), где \(n\) — количество строк, \(m\) — количество столбцов, а \((r,c)\) — позиция, на которой изначально находится ушедший человек.

Выходные данные

Для каждого набора входных данных выведите одно целое число — сумму манхэттенских расстояний.

Примечание

В первом наборе входных данных человек под номером \(2\) уходит, а расстояния перемещений людей под номерами \(3\), \(4\), \(5\) и \(6\) составляют \(1\), \(3\), \(1\) и \(1\) соответственно. Таким образом, ответ равен \(1+3+1+1=6\).

Во втором наборе входных данных человек с номером \(3\) уходит, а человек с номером \(4\) перемещается. Ответ равен \(1\).

D. Действительно, ещё одна задача о числах

Бинарный поиск жадные алгоритмы математика разделяй и властвуй реализация Структуры данных *1800

Three r there are's in strawberry.

Вам дан массив \(b\) длины \(m\). Вы можете выполнить следующую операцию любое количество раз (возможно, нулевое):

  • Выбрать два различных индекса \(i\) и \(j\), где \(\bf{1\le i < j\le m}\) и \(b_i\) является чётным числом, поделить \(b_i\) на \(2\) и умножить \(b_j\) на \(2\).

Ваша задача — максимизировать сумму массива после выполнения любого количества таких операций. Поскольку она может быть большой, выведите эту сумму по модулю \(10^9+7\).

Поскольку эта задача слишком простая, вам дается массив \(a\) длины \(n\), и вам нужно решить задачу для каждого префикса \(a\).

Другими словами, обозначив максимальную сумму \(b\) после выполнения любого количества таких операций как \(f(b)\), вам нужно вывести \(f([a_1])\), \(f([a_1,a_2])\), \(\ldots\), \(f([a_1,a_2,\ldots,a_n])\) по модулю \(10^9+7\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — длина \(a\).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — начальные значения массива \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел, являющимися ответами для каждого префикса \(a\) по модулю \(10^9+7\).

Примечание

Для каждого префикса в первом наборе входных данных возможен следующий массив после применения операций:

  • \([1]\): сумма равна \(1\);
  • \([1, 2]\): сумма равна \(3\);
  • \([1, 1, 6]\): сумма равна \(8\);
  • \([1, 1, 3, 8]\): сумма равна \(13\);
  • \([1, 1, 3, 1, 40]\): сумма равна \(46\);
  • \([1, 1, 3, 1, 5, 48]\): сумма равна \(59\);
  • \([1, 1, 3, 1, 5, 3, 112]\): сумма равна \(126\);
  • \([1, 1, 3, 1, 5, 3, 7, 128]\): сумма равна \(149\);
  • \([1, 1, 3, 1, 5, 3, 7, 1, 1152]\): сумма равна \(1174\);
  • \([1, 1, 3, 1, 5, 3, 7, 1, 9, 1280]\): сумма равна \(1311\).

E. Монстр

Бинарный поиск жадные алгоритмы Конструктив математика Перебор реализация Тернарный поиск *2300

Мужик, этот босс в Genshin такой сложный. Хорошо, что у них есть пополнение на \(6\) монет всего за \( \$4.99\). Мне следует быть осторожнее и не тратить больше, чем нужно, иначе мама меня поймает...

Вы сражаетесь с монстром со здоровьем \(z\), используя оружие с уроном \(d\). Изначально \(d=0\). Вы можете выполнять следующие действия.

  • Увеличить \(d\) — урон вашего оружия на \(1\), потратив \(x\) монет.
  • Атаковать монстра, нанеся ему \(d\) урона, потратив \(y\) монет.

Вы не можете выполнять первую операцию более \(k\) раз подряд.

Найдите минимальное количество монет, необходимое для того, чтобы победить монстра, нанеся ему хотя бы \(z\) урона.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1\le t\le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит 4 целых числа \(x\), \(y\), \(z\) и \(k\) (\(1\leq x, y, z, k\leq 10^8\)) — стоимость первой операции, стоимость второй операции, здоровье монстра и ограничение на первую операцию.

Выходные данные

Для каждого набора входных данных выведите минимальное количество монет, необходимое для победы над монстром.

Примечание

В первом наборе входных данных \(x = 2\), \(y = 3\), \(z = 5\) и \(k = 5\). Вот стратегия, которая обеспечивает наименьшую возможную стоимость в \(12\) монет:

  • Увеличить урон на \(1\), потратив \(2\) монеты.
  • Увеличить урон на \(1\), потратив \(2\) монеты.
  • Увеличить урон на \(1\), потратив \(2\) монеты.
  • Атаковать монстра, нанеся ему \(3\) урона, потратив \(3\) монеты.
  • Атаковать монстра, нанеся ему \(3\) урона, потратив \(3\) монеты.

Вы наносите в общей сложности \(3 + 3 = 6\) урона, побеждая монстра, который имеет \(5\) здоровья. Суммарное количество монет, которое вы потратите, составляет \(2 + 2 + 2 + 3 + 3 = 12\) монет.

Во втором наборе входных данных \(x = 10\), \(y = 20\), \(z = 40\) и \(k = 5\). Вот стратегия, которая позволяет достичь наименьшей возможной стоимости в \(190\) монет:

  • Увеличить урон на \(5\), что стоит \(5\cdot x\) = \(50\) монет.
  • Атаковать монстра один раз, нанеся ему \(5\) урона, потратив \(20\) монет.
  • Увеличить урон на \(2\), потратив \(2\cdot x\) = \(20\) монет.
  • Атаковать монстра \(5\) раз, нанеся \(5\cdot 7 = 35\) урона, потратив \(5\cdot y\) = \(100\) монет.

Всего вы нанесли \(5 + 35 = 40\) урона, победив монстра, у которого ровно \(40\) здоровья. Вы потратили \(50 + 20 + 20 + 100 = 190\) монет.

A. Квинтомания

реализация *800

Борис Ноткин сочиняет мелодии. Он представляет их в виде последовательности нот, где каждую ноту он кодирует целым числом от \(0\) до \(127\) включительно. Интервал между двумя нотами \(a\) и \(b\) равен \(|a - b|\) полутонов.

Борис считает мелодию идеальной, если между любыми двумя соседними нотами интервал составляет либо чистую кварту — \(5\) полутонов, либо чистую квинту — \(7\) полутонов.

После сочинения очередных мелодий он с энтузиазмом показывает вам свой сборник сочинений. Помогите Борису Ноткину понять, являются ли его мелодии идеальными.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 1000\)) — количество мелодий.

Каждая из них описывается двумя строками.

В первой строке вводится целое число \(n\) (\(2 \leq n \leq 50\)) — количество нот в мелодии.

Вторая строка содержит \(n\) целых чисел \(a_{1}, a_{2}, \dots, a_{n}\) (\(0 \leq a_{i} \leq 127\)) — ноты мелодии.

Выходные данные

Для каждой мелодии выведите «YES», если она является идеальной, иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

C. Аня и 1100

Перебор реализация *1100

Перебирая вещи в дальнем ящике, Аня нашла красивую строку \(s\), состоящую только из нулей и единиц.

Теперь она хочет сделать её ещё красивее, выполнив над ней \(q\) операций.

Каждая операция характеризуется двумя целыми числами \(i\) (\(1 \le i \le |s|\)) и \(v\) (\(v \in \{0, 1\}\)) и означает, что \(i\)-му символу строки присваивается значение \(v\) (то есть осуществляется присваивание \(s_i = v\)).

Но Аня любит число \(1100\), поэтому после каждого запроса просит вас сообщить ей, присутствует ли в её строке подстрока «1100» (то есть существует такое \(1 \le i \le |s| - 3\), что \(s_{i}s_{i + 1}s_{i + 2}s_{i + 3} = \texttt{1100}\)).

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка набора тестовых данных содержит строку \(s\) (\(1 \leq |s| \leq 2 \cdot 10^5\)), состоящую только из символов «0» и «1». Здесь \(|s|\) обозначает длину строки \(s\).

Следующая строка содержит целое число \(q\) (\(1 \leq q \leq 2 \cdot 10^5\)) — количество запросов.

Следующие \(q\) строк содержат по два целых числа \(i\) (\(1 \leq i \leq |s|\)) и \(v\) (\(v \in \{0, 1\}\)), характеризующих запрос.

Гарантируется, что сумма \(|s|\) по всем наборам входных данных не превышает \(2 \cdot 10^5\). Также гарантируется, что сумма \(q\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого запроса выведите «YES», если «1100» присутствует в строке Ани, иначе выведите «NO».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

D. Я люблю 1543

матрицы Перебор реализация *1300

Однажды утром Поликарп проснулся и понял: \(1543\) — самое любимое число в его жизни.

Первым же, что Поликарп в этот день увидел, как только открыл глаза, был большой настенный ковёр из \(n\) на \(m\) клеток, \(n\) и \(m\) — чётные. Каждая клетка содержит одну из цифр от \(0\) до \(9\).

Поликарпу стало интересно, сколько всего раз встретится запись числа \(1543\) во всех слоях\(^{\text{∗}}\) ковра при его обходе по часовой стрелке.

\(^{\text{∗}}\)Первым слоем ковра размеров \(n \times m\) называют замкнутую ленту длиной \(2 \cdot (n+m-2)\) и толщиной в \(1\) элемент, ограничивающую его внешнюю часть. Каждый следующий слой определяется как первый слой ковра, полученного путём удаления всех предыдущих слоёв из исходного ковра.

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных. Далее следуют описания наборов.

Первая строка каждого набора содержит пару чисел \(n\) и \(m\) (\(2 \leq n, m \leq 10^3\), \(n, m\) — чётные).

После этого следует \(n\) строк длины \(m\), состоящих из цифр от \(0\) до \(9\) — описание ковра.

Гарантируется, что сумма \(n \cdot m\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора выведите единственное число — суммарное количество раз, которое \(1543\) встречается во всех слоях ковра в порядке обхода по часовой стрелке.

Примечание
Вхождения \(1543\) в седьмом примере. Разные слои раскрашены в разные цвета.

A. Двойки

реализация *800

Кинич просыпается к началу нового дня. Он включает свой телефон, проверяет почту и находит загадочный подарок. Он решает распаковать подарок.

Кинич распаковывает массив \(a\) из \(n\) целых чисел. Изначально счет Кинича равен \(0\). Он будет выполнять следующую операцию любое количество раз:

  • Выберите такие два индекса \(i\) и \(j\) \((1 \leq i < j \leq n)\), что ни \(i\), ни \(j\) не были выбраны в каких-либо предыдущих операциях, и \(a_i = a_j\). Затем добавьте \(1\) к своему счету.

Выведите максимальный счет, который Кинич может достичь после выполнения вышеупомянутой операции любое количество раз.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 500\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 20\)) — длина массива \(a\).

Следующая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq n\)), разделенных пробелами.

Выходные данные

Для каждого набора входных данных выведите максимальный счет, который можно достичь на новой строке.

Примечание

В первом и третьем тестах Кинич не может выполнить никаких операций.

Во втором тесте Кинич может выполнить одну операцию с \(i=1\) и \(j=2\).

В четвертом тесте Кинич может выполнить одну операцию с \(i=1\) и \(j=4\).

B. Перехваченные входные данные

Перебор реализация *800

Чтобы помочь вам подготовиться к предстоящему контесту на Codeforces, Ситлали задала задачу на матрицу и пытается передать вам матрицу размером \(n\) на \(m\) через ваш поток ввода. В частности, ваш поток ввода должен содержать следующее:

  • Первая строка содержит два целых числа \(n\) и \(m\) — размеры сетки.
  • Следующие \(n\) строк содержат по \(m\) целых чисел — значения сетки.

Однако кто-то перехватил ваш поток ввода, перемешал все данные и поместил их в одну строку! Теперь есть \(k\) целых чисел, все в одной строке, и вы не знаете, что означало каждое целое число. Вместо того чтобы просить Ситлали повторно отправить ввод, вы решаете самостоятельно определить значения \(n\) и \(m\).

Выведите любое возможное значение \(n\) и \(m\), которые могла предоставить Ситлали.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(k\) (\(3 \leq k \leq 2 \cdot 10^5\)) — общее количество входных данных в вашем потоке ввода.

Следующая строка каждого набора входных данных содержит \(k\) целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \leq a_i \leq k\)) — перемешанные входные данные вашего потока ввода. Гарантируется, что \(n\) и \(m\) содержатся среди \(k\) целых чисел.

Гарантируется, что сумма \(k\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите два целых числа, одно возможное значение \(n\) и \(m\). Если существует несколько возможных ответов, выведите любой.

Примечание

В первом наборе входных данных первоначальный ввод мог быть следующим:

1 1

2

Во втором наборе входных данных первоначальный ввод мог быть следующим:

3 3

4 5 6

7 8 9

9 10 11

D. Divide OR Conquer

Бинарный поиск битмаски дп реализация Структуры данных *2400

You are given an array \([a_1, a_2, \ldots a_n]\) consisting of integers between \(0\) and \(10^9\). You have to split this array into several segments (possibly one) in such a way that each element belongs to exactly one segment.

Let the first segment be the array \([a_{l_1}, a_{l_1 + 1}, \ldots, a_{r_1}]\), the second segment be \([a_{l_2}, a_{l_2+ 1}, \ldots, a_{r_2}]\), ..., the last segment be \([a_{l_k}, a_{l_k+ 1}, \ldots, a_{r_k}]\). Since every element should belong to exactly one array, \(l_1 = 1\), \(r_k = n\), and \(r_i + 1 = l_{i+1}\) for each \(i\) from \(1\) to \(k-1\). The split should meet the following condition: \(f([a_{l_1}, a_{l_1 + 1}, \ldots, a_{r_1}]) \le f([a_{l_2}, a_{l_2+ 1}, \ldots, a_{r_2}]) \le \dots \le f([a_{l_k}, a_{l_k+1}, \ldots, a_{r_k}])\), where \(f(a)\) is the bitwise OR of all elements of the array \(a\).

Calculate the number of ways to split the array, and print it modulo \(998\,244\,353\). Two ways are considered different if the sequences \([l_1, r_1, l_2, r_2, \ldots, l_k, r_k]\) denoting the splits are different.

Input

The first line contains an integer \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — the length of the array \(a\).

The second line contains \(n\) integers \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10 ^9\)) — the elements of the given array.

Output

Print one integer — the number of ways to split the array, taken modulo \(998\,244\,353\).

Note

In the first two examples, every way to split the array is valid.

In the third example, there are three valid ways to split the array:

  • \(k = 3\); \(l_1 = 1, r_1 = 1, l_2 = 2, r_2 = 2, l_3 = 3, r_3 = 3\); the resulting arrays are \([3]\), \([4]\), \([6]\), and \(3 \le 4 \le 6\);
  • \(k = 2\); \(l_1 = 1, r_1 = 1, l_2 = 2, r_2 = 3\); the resulting arrays are \([3]\) and \([4, 6]\), and \(3 \le 6\);
  • \(k = 1\); \(l_1 = 1, r_1 = 3\); there will be only one array: \([3, 4, 6]\).

If you split the array into two arrays \([3, 4]\) and \([6]\), the bitwise OR of the first array is \(7\), and the bitwise OR of the second array is \(6\); \(7 > 6\), so this way to split the array is invalid.

G. Guess One Character

интерактив Конструктив реализация *1900

This is an interactive problem. You have to use flush operation right after printing each line. For example, in C++ you should use the function fflush(stdout) or cout.flush(), in Java or Kotlin — System.out.flush(), and in Python — sys.stdout.flush().

The jury has a string \(s\) consisting of characters 0 and/or 1. The length of this string is \(n\).

You can ask the following queries:

  • \(1\) \(t\) — "how many times does \(t\) appear in \(s\) as a contiguous substring?" Here, \(t\) should be a string consisting of characters 0 and/or 1; its length should be at least \(1\) and at most \(n\). For example, if the string \(s\) is 111011 and the string \(t\) is 11, the response to the query is \(3\).

You have to guess at least one character in the string \(s\) by asking no more than \(3\) queries. Note that giving the answer does not count as a query.

In every test and in every test case, the string \(s\) is fixed beforehand.

Interaction

Initially, the jury program sends one integer \(t\) (\(1 \le t \le 1000\)) — the number of test cases.

At the start of each test case, the jury program sends one integer \(n\) (\(2 \le n \le 50\)) — the length of the string.

After that, your program can submit queries to the jury program by printing the following line (do not forget to flush the output after printing a line!):

  • \(1\) \(t\) means asking a query "how many times does \(t\) appear in \(s\) as a contiguous substring?"

For every query, the jury prints one integer on a separate line. It is either:

  • the answer to your query, if the query is correct, and you haven't exceeded the query limit;
  • or the integer \(-1\), if your query is incorrect (for example, the constraint \(1 \le |t| \le n\) is not met or the string \(t\) contains characters other than 0 and 1) or if you have asked too many queries while processing the current test case.

To submit the answer, your program should send a line in the following format (do not forget to flush the output after printing a line!):

  • \(0\) \(i\) \(c\), where \(1 \le i \le n\) and \(c\) is either 0 or 1, meaning that \(s_i = c\).

If your guess is correct, the jury program will print one integer \(1\) on a separate line, indicating that you may proceed to the next test case (or terminate the program, if it was the last test case) and that the number of queries you have asked is reset. If it is not correct, the jury program will print one integer \(-1\) on a separate line.

After your program receives \(-1\) as the response, it should immediately terminate. This will lead to your submission receiving the verdict "Wrong Answer". If your program does not terminate, the verdict of your submission is undefined.

Note

In the example, there are \(3\) test cases: 101, 11 and 10. Note that everything after the // sign is a comment that explains which line means what in the interaction. The jury program won't print these comments in the actual problem, and you shouldn't print them. The empty lines are also added for your convenience, the jury program won't print them, and your solution should not print any empty lines.

J. Waiting for...

жадные алгоритмы реализация *800

Monocarp is waiting for a bus at the bus stop. Unfortunately, there are many people who want to ride a bus too.

You are given a list of events of two types:

  • B \(b_i\) — a bus with \(b_i\) free seats arrives at the stop;
  • P \(p_i\) — \(p_i\) people arrive at the stop.

These events are listed in a chronological order.

When a bus arrives, the following happens. All people at the bus stop (except for Monocarp) try to enter the bus. If there are enough free seats for all of them, then they all enter the bus. Otherwise, some people remain at the bus stop (the number of people who enter the bus is equal to the number of free seats).

If there is still at least one free seat after all people (except for Monocarp) enter the bus, then Monocarp can decide to enter this bus as well (but he might choose to wait for another bus). For each bus, you have to determine if it is possible for Monocarp to take that bus.

Input

The first line contains one integer \(n\) \((1 \le n \le 10^3)\) — the number of events.

Then, \(n\) lines follow. The \(i\)-th of them contains the description of the \(i\)-th event in one of the two following formats:

  • B \(b_i\) (\(1 \le b_i \le 10^6\)) — a bus with \(b_i\) free seats arrives at the stop;
  • P \(p_i\) (\(1 \le p_i \le 10^6\)) — \(p_i\) people arrive at the stop.

Additional constraint on the input: there is at least one event of type B.

Output

For each event of type B, print YES if it is possible for Monocarp to take the corresponding bus, or NO otherwise (case-insensitive).

M. Royal Flush

дп реализация *2800

Consider the following game. There is a deck, which consists of cards of \(n\) different suits. For each suit, there are \(13\) cards in the deck, all with different ranks (the ranks are \(2\), \(3\), \(4\), ..., \(10\), Jack, Queen, King and Ace).

Initially, the deck is shuffled randomly (all \((13n)!\) possible orders of cards have the same probability). You draw \(5\) topmost cards from the deck. Then, every turn of the game, the following events happen, in the given order:

  1. if the cards in your hand form a Royal Flush (a \(10\), a Jack, a Queen, a King, and an Ace, all of the same suit), you win, and the game ends;
  2. if you haven't won yet, and the deck is empty, you lose, and the game ends;
  3. if the game hasn't ended yet, you may choose any cards from your hand (possibly, all of them) and discard them. When a card is discarded, it is removed from the game;
  4. finally, you draw cards from the deck, until you have \(5\) cards or the deck becomes empty.

Your goal is to find a strategy that allows you to win in the minimum expected number of turns. Note that the turn when the game ends is not counted (for example, if the \(5\) cards you draw initially already form a Royal Flush, you win in \(0\) turns).

Calculate the minimum possible expected number of turns required to win the game.

Input

The only line contains one integer \(n\) (\(1 \le n \le 4\)) — the number of suits used in the game.

Output

Print the minimum expected number of turns.

Your answer will be considered correct if its absolute or relative error does not exceed \(10^{-6}\). Formally, let your answer be \(a\), and the jury's answer be \(b\). Your answer will be accepted if and only if \(\frac{|a - b|}{\max{(1, |b|)}} \le 10^{-6}\).

N. Fixing the Expression

реализация *800

An expression is a string consisting of three characters, where the first and the last characters are digits (from \(0\) to \(9\)), and the middle character is a comparison symbol (<, = or >).

An expression is true if the comparison symbol matches the digits (for example, if the first digit is strictly less than the last digit, the comparison symbol should be <).

For example, the expressions 1<3, 4>2, 0=0 are true, while 5>5, 7<3 are not.

You are given a string \(s\), which is an expression. Change as few characters as possible so that \(s\) becomes a true expression. Note that if \(s\) is already true, you should leave it as it is.

Input

The first line contains one integer \(t\) (\(1 \le t \le 300\)) — the number of test cases.

Each test case consists of one line containing the string \(s\) (\(|s| = 3\), the first and the last characters of \(s\) are digits, the second character is a comparison symbol).

Output

For each test case, print a string consisting of \(3\) characters — a true expression which can be obtained by changing as few characters as possible in \(s\). If there are multiple answers, print any of them.

B. Shohag любит строки

жадные алгоритмы Конструктив реализация Строки *1000

Для строки \(p\) определим \(f(p)\) — количество уникальных непустых подстрок\(^{\text{∗}}\) строки \(p\).

У Shohag есть строка \(s\). Помогите ему найти непустую строку \(p\), такую, что \(p\) является подстрокой \(s\), а \(f(p)\) чётно, или скажите, что такой строки не существует.

\(^{\text{∗}}\)Строка \(a\) является подстрокой строки \(b\), если \(a\) можно получить из \(b\), удалив несколько (возможно, ноль или все) символов из начала и несколько (возможно, ноль или все) символов из конца.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит строку \(s\) (\(1 \le |s| \le 10^5\)), состоящую из строчных латинских букв.

Гарантируется, что сумма длин \(s\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите непустую строку, удовлетворяющую условиям, или \(-1\), если такой строки не существует. Если существует несколько решений, выведите любое из них.

Примечание

В первом наборе входных данных мы можем выбрать \(p = \) abaa, потому что это подстрока \(s\), а уникальными подстроками \(p\) являются a, b, aa, ab, ba, aba, baa и abaa — всего \(8\) уникальных подстрок, что является чётным числом.

Во втором наборе входных данных мы можем выбрать только \(p = \) a, но у этой строки есть одна уникальная подстрока, что является нечётным числом, поэтому эта строка не подходит.

В третьем наборе входных данных вся строка содержит \(52\) уникальных подстроки, поэтому сама строка является корректным ответом.

E. Shohag любит инверсии

дп Комбинаторика математика реализация *2200

У Shohag есть массив целых чисел \(a\). Изначально \(a = [0, 1]\). Он может выполнять следующую операцию любое количество раз:

  • Пусть \(k\) — количество инверсий\(^{\text{∗}}\) в текущем массиве \(a\).
  • Вставить \(k\) на любую позицию в \(a\), в том числе возможно в начало или конец.

Например, если \(a = [4, 6, 2, 4]\), то количество инверсий равно \(k = 3\). Таким образом, после операции вы можете получить следующие массивы: \([\textbf{3}, 4, 6, 2, 4]\), \([4, \textbf{3}, 6, 2, 4]\), \([4, 6, \textbf{3}, 2, 4]\), \([4, 6, 2, \textbf{3}, 4]\), и \([4, 6, 2, 4, \textbf{3}]\).

По заданному целому числу \(n\), помогите Shohag подсчитать количество различных массивов длины \(n\), которые можно получить после выполнения операций, по модулю \(998\,244\,353\).

\(^{\text{∗}}\)Количество инверсий в массиве \(a\) — это количество пар индексов (\(i\), \(j\)) таких, что \(i < j\) и \(a_i > a_j\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая и единственная строка каждого набора входных данных содержит целое число \(n\) (\(2 \le n \le 10^6\)).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите целое число — количество массивов по модулю \(998\,244\,353\).

Примечание

В первом наборе входных данных можно получить следующие \(5\) массивов (вставленное количество инверсий выделено жирным шрифтом):

  • \([0, 1] \rightarrow [0, \textbf{0}, 1] \rightarrow [0, 0, 1, \textbf{0}]\),
  • \([0, 1] \rightarrow [0, \textbf{0}, 1] \rightarrow [0, 0, \textbf{0}, 1]\),
  • \([0, 1] \rightarrow [0, 1, \textbf{0}] \rightarrow [0, 1, 0, \textbf{1}]\),
  • \([0, 1] \rightarrow [0, 1, \textbf{0}] \rightarrow [0, 1, \textbf{1}, 0]\),
  • \([0, 1] \rightarrow [0, 1, \textbf{0}] \rightarrow [\textbf{1}, 0, 1, 0]\).

H1. Крутые прогулки с обменом (простая версия)

Конструктив реализация сортировки *3500

Это простая версия задачи. Единственное различие между двумя версиями задачи — количество операций, которые вы можете сделать. Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Вам дан массив \(a\) длины \(n\).

Крутая прогулка с обменом — это следующий процесс:

  • В сетке \(n \times n\) обозначим ячейку в строке \(i\) и столбце \(j\) как \((i, j)\). Вам нужно пройти от \((1,1)\) до \((n,n)\), делая только шаги вправо или вниз.
  • Формально, если вы находитесь в \((x,y)\) в данный момент, вы можете сделать шаг в \((x+1,y)\) или \((x,y+1)\), но вы не можете выйти за границы сетки.
  • Когда вы делаете шаг в \((i,j)\), вы должны поменять местами \(a_i\) и \(a_j\), если \(i \neq j\).

Вы можете выполнить не более \(2n+4\) крутых прогулок с обменом. Отсортируйте массив \(a_1, a_2, \ldots, a_n\) в неубывающем порядке. Можно показать, что это всегда можно сделать.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \leq n \leq 500\)) — длину массива.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\ldots ,a_n\) (\(1 \le a_i \le n\)) — элементы массива.

Гарантируется, что сумма \(n^2\) по всем наборам входных данных не превосходит \(2.5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных вывод должен состоять из нескольких строк:

  • Первая строка содержит целое число \(k\) (\(0 \leq k \leq 2n+4\)), представляющее количество крутых прогулок с обменом, которое вы выполняете.
  • Каждая из следующих \(k\) строк содержит строку \(s\) длины \(2n-2\), состоящую только из R и D, представляющую путь (буквы чувствительны к регистру). Для всех \(1 \le i \le 2n-2\), если \(s_i=\) R, то на \(i\)-м шаге вы идёте направо, иначе на \(i\)-м шаге вы идёте вниз.
Примечание

В первом наборе входных данных массив \(a\) уже является неубывающим, поэтому вам не нужно выполнять никаких прогулок.

Во втором наборе входных данных изначально \(a=[2,1,3]\).

На первой прогулке:

  • На \(1\)-м шаге вы делаете шаг вправо в клетку \((1,2)\). Затем, \(a=[1,2,3]\). Обратите внимание, что хотя массив \(a\) уже является неубывающим, вы не можете остановиться, пока не достигнете \((n,n)\).

  • На \(2\)-м шаге вы делаете шаг вправо в \((1,3)\). Тогда \(a=[3,2,1]\).

  • На \(3\)-м шаге вы делаете шаг вниз в \((2,3)\). Тогда, \(a=[3,1,2]\).

  • На \(4\)-м шаге вы спускаетесь в \((3,3)\). Тогда, \(a=[3,1,2]\).

На второй прогулке:

  • На \(1\)-м шаге вы опускаетесь в \((2,1)\). Тогда \(a=[1,3,2]\).

  • На \(2\)-м шаге вы делаете шаг вправо в \((2,2)\). Тогда, \(a=[1,3,2]\).

  • На \(3\)-м шаге вы делаете шаг вниз в \((3,2)\). Тогда, \(a=[1,2,3]\).

  • На \(4\)-м шаге вы опускаетесь в \((3,3)\). Тогда, \(a=[1,2,3]\).

После двух крутых прогулок с обменом, описанных выше, мы получаем \(a=[1,2,3]\), что является неубывающим массивом.

H2. Крутые прогулки с обменом (сложная версия)

Конструктив Конструктив Конструктив реализация сортировки *3500

Это сложная версия задачи. Единственное различие между двумя версиями задачи — количество операций, которые вы можете сделать. Вы можете совершать взломы только в том случае, если решены обе версии задачи.

Вам дан массив \(a\) длины \(n\).

Крутая прогулка с обменом — это следующий процесс:

  • В сетке \(n \times n\) обозначим ячейку в строке \(i\) и столбце \(j\) как \((i, j)\). Вам нужно пройти от \((1,1)\) до \((n,n)\), делая только шаги вправо или вниз.
  • Формально, если вы находитесь в \((x,y)\) в данный момент, вы можете сделать шаг в \((x+1,y)\) или \((x,y+1)\), но вы не можете выйти за границы сетки.
  • Когда вы делаете шаг в \((i,j)\), вы должны поменять местами \(a_i\) и \(a_j\), если \(i \neq j\).

Вы можете выполнить не более \(n+4\) крутых прогулок с обменом. Отсортируйте массив \(a_1, a_2, \ldots, a_n\) в неубывающем порядке. Можно показать, что это всегда можно сделать.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \leq n \leq 500\)) — длину массива.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1,a_2,\ldots ,a_n\) (\(1 \le a_i \le n\)) — элементы массива.

Гарантируется, что сумма \(n^2\) по всем наборам входных данных не превосходит \(2.5 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных вывод должен состоять из нескольких строк:

  • Первая строка содержит целое число \(k\) (\(0 \leq k \leq n+4\)), представляющее количество крутых прогулок с обменом, которое вы выполняете.
  • Каждая из следующих \(k\) строк содержит строку \(s\) длины \(2n-2\), состоящую только из R и D, представляющую путь (буквы чувствительны к регистру). Для всех \(1 \le i \le 2n-2\), если \(s_i=\) R, то на \(i\)-м шаге вы идёте направо, иначе на \(i\)-м шаге вы идёте вниз.
Примечание

В первом наборе входных данных массив \(a\) уже является неубывающим, поэтому вам не нужно выполнять никаких прогулок.

Во втором наборе входных данных изначально \(a=[2,1,3]\).

На первой прогулке:

  • На \(1\)-м шаге вы делаете шаг вправо в клетку \((1,2)\). Затем, \(a=[1,2,3]\). Обратите внимание, что хотя массив \(a\) уже является неубывающим, вы не можете остановиться, пока не достигнете \((n,n)\).

  • На \(2\)-м шаге вы делаете шаг вправо в \((1,3)\). Тогда \(a=[3,2,1]\).

  • На \(3\)-м шаге вы делаете шаг вниз в \((2,3)\). Тогда, \(a=[3,1,2]\).

  • На \(4\)-м шаге вы спускаетесь в \((3,3)\). Тогда, \(a=[3,1,2]\).

На второй прогулке:

  • На \(1\)-м шаге вы опускаетесь в \((2,1)\). Тогда \(a=[1,3,2]\).

  • На \(2\)-м шаге вы делаете шаг вправо в \((2,2)\). Тогда, \(a=[1,3,2]\).

  • На \(3\)-м шаге вы делаете шаг вниз в \((3,2)\). Тогда, \(a=[1,2,3]\).

  • На \(4\)-м шаге вы опускаетесь в \((3,3)\). Тогда, \(a=[1,2,3]\).

После двух крутых прогулок с обменом, описанных выше, мы получаем \(a=[1,2,3]\), что является неубывающим массивом.

E. Маленький Слоник и строки

реализация строковые суфф. структуры Структуры данных *2800

Маленький Слоник очень любит строки.

У него есть массив a из n строк, состоящих из строчных латинских букв. Пусть элементы массива пронумерованы от 1 до n, тогда элемент номер i обозначим ai. Для каждой строки ai (1 ≤ i ≤ n) Маленький Слоник хочет найти количество пар целых чисел l и r (1 ≤ l ≤ r ≤ |ai|) таких, что подстрока ai[l... r] является подстрокой как минимум k строк из массива a (включая i-ю строку).

Помогите Маленькому Слонику решить эту задачу.

Если вы не знакомы с основными обозначениями в строковых задачах, в примечании приведены соответствующие определения.

Входные данные

В первой строке задано два целых числа через пробел — n и k (1 ≤ n, k ≤ 105). В следующих n строках задан массив a. В i-ой строке записана непустая строка ai, состоящая из строчных латинских букв. Суммарная длина всех строк ai не превосходит 105.

Выходные данные

В единственной строке выведите n целых чисел разделенных единичными пробелами — i-е число является ответом для строки ai.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

Пусть задана строка a = a1a2... a|a|, тогда обозначим через |a| длину строки, а через aii-й символ строки.

Подстрокой a[l... r] (1 ≤ l ≤ r ≤ |a|) строки a называется строка alal + 1... ar.

Строка a является подстрокой строки b, если существует такая пара целых чисел l и r (1 ≤ l ≤ r ≤ |b|), что b[l... r] = a.

A. The Bento Box Adventure

реализация сортировки *1300

Image generated by ChatGPT 4o.

Boxed meals in Taiwan are very common, offering convenient and affordable nutrition-balanced choices for students and office workers. These meals typically include a variety of vegetables, protein, and rice, providing a well-rounded diet. With numerous options available at local self-service restaurants, they are a popular choice for those looking for a quick, healthy lunch.

There are five Taiwanese self-service restaurants numbered from 1 to 5. You plan to visit a different restaurant each day from Monday to Friday to pack a boxed meal for lunch. You've already visited one restaurant from Monday to Thursday, each time visiting a different one. Now, it's Friday, and you want to visit the last remaining restaurant that you haven't been to yet this week.

Write a program that takes as input the four restaurants you've already visited (one for each day from Monday to Thursday) and outputs the restaurant you should visit on Friday.

Input

A single line of input containing four integers \(a, b, c, d\), each between 1 and 5 (inclusive), representing the restaurant numbers you visited from Monday to Thursday, in order.

  • \(1\le a, b, c, d\le 5\)
  • All four numbers will be different.
Output

Output the restaurant number you should visit on Friday.

I. Auto Complete

Бинарный поиск Деревья реализация сортировки Строки Структуры данных хэши *2300

You are designing a snazzy new text editor, and you want to add a nifty auto-complete feature to help users save time. Here is how it will work: if a user types "App", your editor will magically suggest the word "Application"! Even better, users can personalize the words that auto-complete in your editor.

Your editor will support 4 kinds of operations (Let's say the current text in your editor is \(t\)):

  1. Add an auto complete pattern \(p_i\).
  2. Delete an auto complete pattern \(p_i\).
  3. Append a string \(s\) to the end of \(t\).
  4. Delete \(c\) characters from the end of \(t\). Note that if \(c\) is larger then the length of \(t\), delete all the characters from \(t\).

After each action, your editor should suggest an auto-complete candidate \(i\) that matches the following criteria:

  1. The string \(p_i\) has a prefix equal to \(t\).
  2. If there are multiple \(p_i\), pick the longest one.
  3. If there are still multiple \(p_i\), pick the one with the smallest lexicographic order.
  4. If there are still multiple \(p_i\), pick the one with the smallest ID.
To simplify the question, for each action, print the suggested auto complete pattern ID. If there's no match, print -1.

For example, let us say we have three candidates: "alice", "bob", and "charlie", with ID 1, 2, and 3. At first, there is nothing on the screen, so "charlie" (3) should be suggested because it is the longest. Then, let us say the user types "b". You should suggest "bob" (2) because it is the only one that starts with "b". Finally, let us say the user type "body". You should print -1 because there is no matched pattern.

Input

The first line contains an integer \(n\), followed by \(n\) lines, with each line containing an action.

There are four types of actions:

  1. \(i\) \(p_i\)
  2. \(i\)
  3. \(s\)
  4. \(c\)
The add actions are followed by an integer \(i\) and a pattern \(p_i\), which means the user wants to add a pattern with ID \(i\). The delete actions are followed by an integer \(i\), which means the user wants to delete \(p_i\) from the pattern set. The append actions are followed by a string \(s\), which means the user appends \(s\) to the end of \(t\). The backspace actions are followed by an integer \(c\), which means the user deletes \(c\) characters from the end of \(t\). All the parameters are splitted by a single space character.
  • \(1 \leq n \leq 10^6\)
  • The total number of characters in all \(p_i\) and \(s\) does not exceed \(2\times 10^6\).
  • \(1 \leq c \leq 2\times 10^6\)
  • The strings \(p_i\) and \(s\) may contain any printable characters, excluding all space characters (ASCII number in the range from \(33\) to \(126\)).
  • The ID \(i\) for each add operation is unique.
  • The ID \(i\) for each delete is guaranteed to be valid.
  • Each ID \(i\) satisfies \(0\le i \le n\).
Output

The program should output \(n\) lines. For each action, output an integer \(i\), which means that after the action, \(p_i\) is the suggested auto complete candidate. If there is no \(p_i\) that matches the requirement, output -1.

D. Рекомендации

реализация сортировки Структуры данных *1900

Предположим, вы работаете в некоем стриминговом сервисе. В сервисе присутствуют \(n\) активных пользователей и \(10^9\) треков, которые эти пользователи могут прослушивать. Пользователи могут ставить лайки трекам, и на основе лайков сервис должен рекомендовать им новые треки.

Треки пронумерованы от \(1\) до \(10^9\). Оказалось, что треки, которые нравятся \(i\)-му пользователю, образуют отрезок \([l_i, r_i]\).

Скажем, что пользователь \(j\) является предиктором для пользователя \(i\) (\(j \neq i\)), если пользователь \(j\) поставил лайки всем трекам, которые нравятся \(i\)-му пользователю (и, возможно, некоторым другим трекам тоже).

Также скажем, что трек сильно рекомендован для пользователя \(i\), если трек еще не понравился \(i\)-му пользователю, но он понравился каждому предиктору \(i\)-го пользователя.

Посчитайте количество сильно рекомендованных треков для каждого пользователя \(i\). Если у пользователя нет предикторов, то выведите \(0\) для него.

Входные данные

В первой строке задано одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следуют сами \(t\) наборов.

В первой строке каждого набора задано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — количество пользователей.

В следующих \(n\) строках задано по два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le 10^9\)) — отрезок треков, которые нравятся \(i\)-му пользователю.

Дополнительное ограничение на входные данные: сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел, где \(i\)-е целое число — это количество сильно рекомендованных треков для \(i\)-го пользователя (или \(0\), если у пользователя нет предикторов).

Примечание

В первом наборе входных данных:

  • у первого пользователя нет предикторов;
  • у второго пользователя нет предикторов;
  • у третьего пользователя два предиктора: пользователи \(1\) и \(2\); только трек \(3\) (из тех, которые еще не понравились третьему пользователю) понравился им обоим.

Во втором наборе входных данных второй пользователь является предиктором для первого пользователя. Поэтому все треки, кроме \(42\)-го, сильно рекомендованы для первого пользователя.

В третьем наборе входных данных у первого пользователя два предиктора: пользователи \(2\) и \(3\), но нет трека, который понравился бы им и не понравился бы самому пользователю.

E. Пары вершин

Бинарный поиск Деревья жадные алгоритмы Перебор поиск в глубину и подобное разделяй и властвуй реализация Структуры данных *2900

Дано дерево, состоящее из \(2n\) вершин. Напомним, что деревом называется связный неориентированный граф, в котором нет циклов. На каждой вершине написано одно целое число от \(1\) до \(n\). Каждое число от \(1\) до \(n\) написано ровно на двух различных вершинах. У каждой вершины также есть стоимость — вершина \(i\) стоит \(2^i\).

Требуется выбрать в дереве такое подмножество вершин, что:

  • подмножество связно; то есть, из каждой вершины подмножества можно добраться до любой другой вершины подмножества, проходя только через вершины подмножества;
  • каждое число от \(1\) до \(n\) написано хотя бы на одной вершине подмножества.

Среди всех таких подмножеств требуется найти такое, что суммарная стоимость вершин в нем минимальна. Обратите внимание, что не требуется минимизировать количество вершин в подмножестве.

Входные данные

В первой строке записано одно целое число \(n\) (\(1 \le n \le 2 \cdot 10^5\)).

Во второй строке записаны \(2n\) целых чисел \(a_1, a_2, \dots, a_{2n}\) (\(1 \le a_i \le n\)). Каждое число от \(1\) до \(n\) встречается ровно два раза.

В каждой из следующих \(2n-1\) строк записаны два целых числа \(v\) и \(u\) (\(1 \le v, u \le 2n\)) — ребра дерева. Данные ребра образуют валидное дерево.

Выходные данные

В первой строке выведите одно целое число \(k\) — количество вершин в подмножестве.

Во второй строке выведите \(k\) различных целых чисел от \(1\) до \(2n\) — номера вершин в выбранном подмножестве. Вершины можно выводить в произвольном порядке.

Примечание

На данных изображениях нарисованы ответы на первые два примера. В скобках около номеров вершин подписаны числа, написанные на них.

В первом примере есть такие валидные подмножества: \([2, 4, 5]\) (стоимость равна \(2^2 + 2^4 + 2^5 = 52\)), \([2, 4, 5, 6]\) (стоимость равна \(116\)), \([1, 6, 3]\) (стоимость равна \(74\)), \([2, 6, 3]\) (стоимость равна \(76\)) и многие другие.

Во втором примере стоимость подмножества \([4, 6, 3, 1]\) равна \(90\).

F. Два подотрезка

дп матрицы реализация Структуры данных *2600

Задано два целочисленных массива \(a\) и \(b\), оба размера \(n\).

Скажем, что стоимость подотрезка массива \([l, r]\) равна \(a_l + a_{l + 1} + \cdots + a_{r - 1} + a_r + b_l + b_r\). Если \(l=r\), то стоимость равна \(a_l + 2 \cdot b_l\).

Вам предстоит отвечать на запросы трех видов:

  • «\(1\) \(p\) \(x\)» — присвоить \(a_{p} := x\);
  • «\(2\) \(p\) \(x\)» — присвоить \(b_{p} := x\);
  • «\(3\) \(l\) \(r\)» — найти два непустых непересекающихся подотрезка у отрезка \([l, r]\) с максимальной суммарной стоимостью и вывести их суммарную стоимость.
Входные данные

В первой строке задано одно целое число \(n\) (\(2 \le n \le 2 \cdot 10^5\)).

Во второй строке заданы \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(-10^9 \le a_i \le 10^9\)).

В третьей строке заданы \(n\) целых чисел \(b_1, b_2, \dots, b_n\) (\(-10^9 \le b_i \le 10^9\)).

В четвертой строке задано одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)).

В следующих \(q\) строках заданы запросы: по одному в строке. Каждый запрос имеет один из трех типов:

  • «\(1\) \(p\) \(x\)» (\(1 \le p \le n\); \(-10^9 \le x \le 10^9\));
  • «\(2\) \(p\) \(x\)» (\(1 \le p \le n\); \(-10^9 \le x \le 10^9\));
  • «\(3\) \(l\) \(r\)» (\(1 \le l < r \le n\)).

Гарантируется, что есть хотя бы один запрос третьего типа.

Выходные данные

Для каждого запроса третьего типа выведите максимально возможную суммарную стоимость двух непустых непересекающихся подотрезков у отрезка \([l, r]\).

E. Преобразование матриц

битмаски графы жадные алгоритмы Перебор поиск в глубину и подобное реализация Структуры данных *2300

Даны две матрицы \(A\) и \(B\) размером \(n \times m\), заполненные целыми числами от \(0\) до \(10^9\). Вы можете выполнять следующие операции над матрицей \(A\) в любом порядке любое количество раз:

  • &=: выбрать два целых числа \(i\) и \(x\) (\(1 \le i \le n\), \(x \ge 0\)) и заменить каждый элемент в строке \(i\) на результат побитового И между числом \(x\) и этим элементом. Формально, для каждого \(j \in [1, m]\) элемент \(A_{i,j}\) заменяется на \(A_{i,j} \text{ & } x\);
  • |=: выбрать два целых числа \(j\) и \(x\) (\(1 \le j \le m\), \(x \ge 0\)) и заменить каждый элемент в столбце \(j\) на результат побитового ИЛИ между числом \(x\) и этим элементом. Формально, для каждого \(i \in [1, n]\) элемент \(A_{i,j}\) заменяется на \(A_{i,j} \text{ | } x\);

В разных операциях можно выбирать разные значения \(x\).

Определите, возможно ли преобразовать матрицу \(A\) в матрицу \(B\) с помощью нескольких (возможно, нуля) указанных операций.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следуют \(t\) наборов входных данных.

Каждый набор входных данных задается следующим образом:

  • первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10^3\); \(n \cdot m \le 10^3\)) — размеры матриц \(A\) и \(B\);
  • в следующих \(n\) строках содержится описание матрицы \(A\), где \(i\)-я строка содержит \(m\) целых чисел \(A_{i,1}, A_{i,2}, \dots, A_{i,m}\) (\(0 \le A_{i,j} \le 10^9\));
  • в следующих \(n\) строках содержится описание матрицы \(B\), где \(i\)-я строка содержит \(m\) целых чисел \(B_{i,1}, B_{i,2}, \dots, B_{i,m}\) (\(0 \le B_{i,j} \le 10^9\)).
Выходные данные

Для каждого набора входных данных выведите Yes, если можно преобразовать \(A\) в \(B\), или No в противном случае. Каждую букву можно выводить в любом регистре.

Примечание

Рассмотрим второй набор входных данных и приведем последовательность операций, позволяющих получить из матрицы \(A\) матрицу \(B\):

Изначально матрица выглядит так:

\(\begin{bmatrix} 10&10\\ 42&42\\ \end{bmatrix}\)

Применим операцию первого типа с параметрами \(i = 1\) и \(x = 0\). В результате получим матрицу:

\(\begin{bmatrix} 0&0\\ 42&42\\ \end{bmatrix}\)

Применим операцию первого типа с параметрами \(i = 2\) и \(x = 0\). В результате получим матрицу:

\(\begin{bmatrix} 0&0\\ 0&0\\ \end{bmatrix}\)

Применим операцию второго типа с параметрами \(j = 1\) и \(x = 21\). В результате получим матрицу:

\(\begin{bmatrix} 21&0\\ 21&0\\ \end{bmatrix}\)

Применим операцию второго типа с параметрами \(j = 2\) и \(x = 21\). В результате получим матрицу:

\(\begin{bmatrix} 21&21\\ 21&21\\ \end{bmatrix}\)

Таким образом, мы преобразовали матрицу \(A\) в матрицу \(B\).

F. Ним

битмаски дп жадные алгоритмы игры Комбинаторика кратчайшие пути Перебор реализация *2700

Кратко напомним правила игры «Ним». Имеется \(n\) кучек камней, при этом в кучке \(i\) изначально лежит какое-то число камней. Два игрока по очереди выбирают непустую кучку и берут из нее произвольное положительное (строго больше \(0\)) количество камней. Проигрывает тот, кто не может сделать ход.

Дан массив \(a\), состоящий из \(n\) целых чисел. Артем и Руслан решили играть в Ним на подотрезках массива. Каждый из \(q\) раундов определяется отрезком \((l_i, r_i)\), где элементы массива \(a_{l_i}, a_{l_i+1}, \dots, a_{r_i}\) рассматриваются как размеры кучек камней.

До начала игры Руслан может удалить любое количество кучек из выбранного подотрезка. Однако хотя бы одна кучка должна остаться, поэтому в рамках одного раунда он может удалить не более \((r_i - l_i)\) кучек. Разрешается удалить \(0\) кучек. После удаления ребята играют в Ним на всех оставшихся кучках из этого отрезка.

Все раунды независимы: удаления, произведенные в одном раунде, не влияют на исходный массив или другие раунды.

Руслану нужно удалить как можно больше кучек так, чтобы Артем, который будет ходить первым, проиграл.

Для каждого раунда определите:

  1. максимальное количество кучек, которые Руслан может удалить;
  2. количество способов выбрать максимальное количество кучек для удаления.

Два способа считаются различными, если существует такая позиция \(i\), что в одном из способов кучка на позиции \(i\) удаляется, а во втором — нет. Поскольку количество способов может быть большим, выведите его по модулю \(998\,244\,353\).

Если в каком-то раунде Руслан не может сделать так, чтобы Артем проиграл, выведите для этого раунда одно число -1.

Входные данные

Первая строка входных данных содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 10^5\)) — размер массива и количество раундов.

Вторая строка входных данных содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 50\)) — элементы исходного массива.

Далее следуют \(q\) строк, \(i\)-я из которых содержит два целых числа \(l_i, r_i\) (\(1 \le l_i \le r_i \le n\)) — границы отрезка, на котором ребята хотят сыграть в игру в \(i\)-м раунде.

Выходные данные

Для каждого раунда:

  • если Руслан может победить, выведите два целых числа — максимальное количество кучек, которые можно удалить, и количество способов удалить максимальное количество кучек, взятое по модулю \(998\,244\,353\);
  • иначе выведите -1.

G. Задача на запросы

Перебор реализация Структуры данных *3000

Дан массив \(a\), состоящий из \(n\) целых чисел. Вам нужно обработать \(q\) запросов двух типов:

  • \(1~p~x\) — присвоить элементу массива на позиции \(p\) значение \(x\);
  • \(2~l~r\) — подсчитать количество пар позиций \((i, j)\), где \(l \le i < j \le r\) и \(a_i \ne a_j\).

Обратите внимание, что запросы в этой задаче закодированы; каждый следующий запрос вы сможете раскодировать, вычислив ответ на предшествующий ему запрос второго типа.

Входные данные

Первая строка входных данных содержит одно целое число \(n\) (\(1 \le n \le 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le n\)).

Третья строка содержит одно целое число \(q\) (\(1 \le q \le 3 \cdot 10^5\)) — количество запросов.

Каждая из следующих \(q\) строк описывает запрос в одном из следующих форматов:

  • \(1~p'~x'\) (\(0 \le p', x' \le n-1\));
  • \(2~l'~r'\) (\(0 \le l', r' \le n-1\)).

Запросы закодированы следующим образом: пусть \(\mathit{last}\) будет ответом на последний уже обработанный запрос второго типа (изначально \(\mathit{last} = 0\)).

  • если тип запроса — \(1\), то \(p = ((p' + \mathit{last}) \bmod n) + 1\), \(x = ((x' + \mathit{last}) \bmod n) + 1\);
  • если тип запроса — \(2\), то \(l = ((l' + \mathit{last}) \bmod n) + 1\), \(r = ((r' + \mathit{last}) \bmod n) + 1\). Если получилось так, что \(l > r\), поменяйте их значения местами.

Не забудьте обновить значение \(\mathit{last}\) после ответа на каждый запрос второго типа.

Дополнительное ограничение на входные данные: есть хотя бы один запрос второго типа.

Выходные данные

На каждый запрос второго типа выведите ответ — количество пар позиций \((i, j)\), где \(l \le i < j \le r\) и \(a_i \ne a_j\).

Примечание

В первом примере реальные запросы (после декодирования) такие:

  • 2 1 3
  • 1 1 3
  • 2 1 3
  • 1 2 3
  • 2 1 3

B. Обычная задача

реализация Строки *800

На стеклянной витрине магазина написана строка, состоящая только из символов 'p', 'q' и 'w'. Ship проходит мимо магазина, стоя прямо перед стеклянной витриной, и наблюдает строку \(a\). Затем Ship заходит внутрь магазина, смотрит прямо на ту же стеклянную витрину и наблюдает строку \(b\).

Ship дает вам строку \(a\). Ваша задача — найти и вывести строку \(b\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 100\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит строку \(a\) (\(1 \leq |a| \leq 100\)) — строку, которую Ship наблюдает снаружи магазина. Гарантируется, что \(a\) содержит только символы 'p', 'q' и 'w'.

Выходные данные

Для каждого набора входных данных выведите строку \(b\), строку, которую Ship наблюдает изнутри магазина, на новой строке.

E. Безумная задача

Бинарный поиск жадные алгоритмы математика реализация теория чисел *1300

Даны пять целых чисел \(k\), \(l_1\), \(r_1\), \(l_2\) и \(r_2\). Вам нужно помочь Wave посчитать количество упорядоченных пар \((x, y)\), таких что выполняются все следующие условия:

  • \(l_1 \leq x \leq r_1\).
  • \(l_2 \leq y \leq r_2\).
  • Существует неотрицательное целое число \(n\), такое что \(\frac{y}{x} = k^n\).
Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Единственная строка каждого набора входных данных содержит пять целых чисел \(k\), \(l_1\), \(r_1\), \(l_2\) и \(r_2\) (\(2 \leq k \leq 10^9, 1 \leq l_1 \leq r_1 \leq 10^9, 1 \leq l_2 \leq r_2 \leq 10^9\)).

Выходные данные

Для каждого набора входных данных выведите количество подходящих упорядоченных пар \((x, y)\) на новой строке.

Примечание

В третьем наборе входных данных подходящие упорядоченные пары следующие:

  • \((5,15)\)
  • \((5,45)\)
  • \((6,18)\)
  • \((6,54)\)
  • \((7,21)\)
  • \((7,63)\)

В четвертом наборе входных данных единственная допустимая упорядоченная пара это \((1,1\,000\,000\,000)\)

G1. Средняя демоническая задача (легкая версия)

графы Деревья Паросочетания поиск в глубину и подобное реализация *1700

Это легкая версия задачи. Ключевое отличие между двумя версиями выделено жирным шрифтом.

Группа из \(n\) пауков собралась, чтобы обменяться плюшевыми игрушками. Изначально у каждого паука есть \(1\) плюшевая игрушка. Каждый год, если паук \(i\) имеет хотя бы одну плюшевую игрушку, он отдаст ровно одну плюшевую игрушку пауку \(r_i\). В противном случае он ничего не сделает. Обратите внимание, что все передачи плюшевых игрушек происходят одновременно. В этой версии, если у любого паука в любой момент времени больше \(1\) плюшевой игрушки, он выбросит все, кроме \(1\).

Процесс считается стабильным в текущем году, если у каждого паука количество плюшевых игрушек (до обмена в текущем году) совпадает с количеством плюшевых игрушек, которое у него было в предыдущем году (до обмена в предыдущем году). Обратите внимание, что год \(1\) никогда не может быть стабильным.

Найдите первый год, в котором процесс становится стабильным.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество пауков.

Следующая строка содержит \(n\) целых чисел \(r_1, r_2, \ldots, r_n\) (\(1 \leq r_i \leq n, r_i \neq i\)) — получатель плюшевой игрушки от каждого паука.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите целое число в новой строке, первый год, в котором процесс становится стабильным.

Примечание

Для второго набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

Для третьего набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 0]\). Затем происходит обмен в год \(2\). Обратите внимание, что, хотя два паука отдали пауку \(2\) плюшевые игрушки, паук \(2\) может оставить только одну плюшевую игрушку.
  • В год \(3\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 0, 1, 0]\). Затем происходит обмен в год \(3\).
  • В год \(4\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 0, 0, 0]\). Затем происходит обмен в год \(4\).
  • В год \(5\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 0, 0, 0]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

G2. Средняя демоническая задача (сложная версия)

графы Деревья дп поиск в глубину и подобное реализация снм *1900

Это сложная версия задачи. Ключевое отличие между двумя версиями выделено жирным шрифтом.

Группа из \(n\) пауков собралась, чтобы обменяться плюшевыми игрушками. Изначально у каждого паука есть \(1\) плюшевая игрушка. Каждый год, если паук \(i\) имеет хотя бы одну плюшевую игрушку, он отдаст ровно одну плюшевую игрушку пауку \(r_i\). В противном случае он ничего не сделает. Обратите внимание, что все передачи плюшевых игрушек происходят одновременно. В этой версии каждому пауку разрешено иметь более 1 плюшевой игрушки в любой момент времени.

Процесс считается стабильным в текущем году, если у каждого паука такое же количество плюшевых игрушек (до обмена в текущем году), как и в предыдущем году (до обмена в предыдущем году). Обратите внимание, что год \(1\) никогда не может быть стабильным.

Найдите первый год, в котором процесс становится стабильным.

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^4\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(2 \leq n \leq 2 \cdot 10^5\)) — количество пауков.

Следующая строка содержит \(n\) целых чисел \(r_1, r_2, \ldots, r_n\) (\(1 \leq r_i \leq n, r_i \neq i\)) — получатель плюшевой игрушки от каждого паука.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите целое число в новой строке, первый год, в котором процесс становится стабильным.

Примечание

Для второго набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

Для третьего набора входных данных:

  • В год \(1\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 1, 1, 1, 1]\). Затем происходит обмен в год \(1\).
  • В год \(2\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 2, 1, 1, 0]\). Затем происходит обмен в год \(2\).
  • В год \(3\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 3, 0, 1, 0]\). Затем происходит обмен в год \(3\).
  • В год \(4\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 4, 0, 0, 0]\). Затем происходит обмен в год \(4\).
  • В год \(5\) следующий массив показывает количество плюшевых игрушек у каждого паука: \([1, 4, 0, 0, 0]\). Поскольку этот массив такой же, как в предыдущем году, этот год является стабильным.

H. Сложная демоническая задача

дп Конструктив математика реализация Структуры данных *2100

Swing открывает фабрику блинов! Хорошая фабрика блинов должна хорошо уметь разравнивать вещи, поэтому Swing собирается протестировать свое новое оборудование на 2D матрицах.

Swing дана матрица \(n \times n\) \(M\), содержащая положительные целые числа. У него есть \(q\) запросов, которые он хочет вам задать.

Для каждого запроса он дает вам четыре целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) и просит вас разровнять подматрицу, ограниченную \((x_1, y_1)\) и \((x_2, y_2)\), в массив \(A\). Формально, \(A = [M_{(x1,y1)}, M_{(x1,y1+1)}, \ldots, M_{(x1,y2)}, M_{(x1+1,y1)}, M_{(x1+1,y1+1)}, \ldots, M_{(x2,y2)}]\).

Следующее изображение иллюстрирует разравнивание подматрицы, ограниченной красными пунктирными линиями. Оранжевые стрелки указывают направление, в котором элементы подматрицы добавляются в конец \(A\), а \(A\) показан внизу изображения.

После этого он спрашивает вас о значении \(\sum_{i=1}^{|A|} A_i \cdot i\) (сумма \(A_i \cdot i\) по всем \(i\)).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \leq t \leq 10^3\)) — количество наборов входных данных.

Первая строка каждого теста содержит два целых числа \(n\) и \(q\) (\(1 \leq n \leq 2000, 1 \leq q \leq 10^6\)) — размер \(M\) и количество запросов.

Следующие \(n\) строк содержат по \(n\) целых чисел, \(i\)-я из которых содержит \(M_{(i,1)}, M_{(i,2)}, \ldots, M_{(i,n)}\) (\(1 \leq M_{(i, j)} \leq 10^6\)).

Следующие \(q\) строк содержат четыре целых числа \(x_1\), \(y_1\), \(x_2\) и \(y_2\) (\(1 \leq x_1 \leq x_2 \leq n, 1 \leq y_1 \leq y_2 \leq n\)) — границы запроса.

Гарантируется, что сумма \(n\) по всем тестовым случаям не превышает \(2000\), а сумма \(q\) по всем тестовым случаям не превышает \(10^6\).

Выходные данные

Для каждого теста выведите результаты \(q\) запросов на новой строке.

Примечание

Во втором запросе первого набора входных данных, \(A = [9, 5, 5, 2]\). Поэтому сумма равна \(1 \cdot 9 + 2 \cdot 5 + 3 \cdot 5 + 4 \cdot 2 = 42\).

M. Mirror Maze

графы Перебор поиск в глубину и подобное реализация *1800

You are given a grid of \(R\) rows (numbered from \(1\) to \(R\) from north to south) and \(C\) columns (numbered from \(1\) to \(C\) from west to east). Every cell in this grid is a square of the same size. The cell located at row \(r\) and column \(c\) is denoted as \((r, c)\). Each cell can either be empty or have a mirror in one of the cell's diagonals. Each mirror is represented by a line segment. The mirror is type \(1\) if it is positioned diagonally from the southwest corner to the northeast corner of the cell, or type \(2\) for the other diagonal.

These mirrors follow the law of reflection, that is, the angle of reflection equals the angle of incidence. Formally, for type \(1\) mirror, if a beam of light comes from the north, south, west, or east of the cell, then it will be reflected to the west, east, north, and south of the cell, respectively. Similarly, for type \(2\) mirror, if a beam of light comes from the north, south, west, or east of the cell, then it will be reflected to the east, west, south, and north of the cell, respectively.

You want to put a laser from outside the grid such that all mirrors are hit by the laser beam. There are \(2 \cdot (R+C)\) possible locations to put the laser:

  • from the north side of the grid at column \(c\), for \(1 \leq c \leq C\), shooting a laser beam to the south;
  • from the south side of the grid at column \(c\), for \(1 \leq c \leq C\), shooting a laser beam to the north;
  • from the east side of the grid at row \(r\), for \(1 \leq r \leq R\), shooting a laser beam to the west; and
  • from the west side of the grid at row \(r\), for \(1 \leq r \leq R\), shooting a laser beam to the east.

Determine all possible locations for the laser such that all mirrors are hit by the laser beam.

Input

The first line consists of two integers \(R\) \(C\) (\(1 \leq R, C \leq 200\)).

Each of the next \(R\) lines consists of a string \(S_r\) of length \(C\). The \(c\)-th character of string \(S_r\) represents cell \((r, c)\). Each character can either be . if the cell is empty, / if the cell has type \(1\) mirror, or \ if the cell has type \(2\) mirror. There is at least one mirror in the grid.

Output

Output a single integer representing the number of possible locations for the laser such that all mirrors are hit by the laser beam. Denote this number as \(k\).

If \(k > 0\), then output \(k\) space-separated strings representing the location of the laser. Each string consists of a character followed without any space by an integer. The character represents the side of the grid, which could be N, S, E, or W if you put the laser on the north, south, east, or west side of the grid, respectively. The integer represents the row/column number. You can output the strings in any order.

Note

Explanation for the sample input/output #1

The following illustration shows one of the solutions of this sample.

Explanation for the sample input/output #2

The following illustration shows one of the solutions of this sample.

E2. Хеопс и контест (сложная версия)

жадные алгоритмы реализация *3500

Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии \(m\) произвольно. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

В Древнем Египте проходит соревнование по решению задач с \(n\) участниками, пронумерованными от \(1\) до \(n\). Каждый участник представляет определенный город; города пронумерованы от \(1\) до \(m\). Из каждого города есть как минимум один участник.

У \(i\)-го участника есть сила \(a_i\), специализация \(s_i\) и мудрость \(b_i\), при этом \(b_i \ge a_i\). Каждая задача в соревновании будет иметь некоторую сложность \(d\) и уникальную тему \(t\). \(i\)-й участник решит задачу, если

  • \(a_i \ge d\), т.е. его сила не меньше сложности задачи, или
  • \(s_i = t\), и \(b_i \ge d\), т.е. его специализация соответствует теме задачи, и его мудрость не меньше сложности задачи.

Хеопс хочет выбрать задачи таким образом, чтобы каждый участник из города \(i\) решил строго больше задач, чем каждый участник из города \(j\), для всех \(i < j\).

Пожалуйста, найдите набор из не более чем \(5n\) задач, где темы всех задач попарно различны, чтобы воля Хеопса была удовлетворена, или укажите, что это невозможно.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(T\) (\(1 \le T \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка содержит два целых числа \(n\), \(m\) (\(2 \le m \le n \le 3 \cdot {10}^5\)) — количество участников и количество городов.

Следующие \(n\) строк описывают участников. \(i\)-я строка содержит три целых числа — \(a_i\), \(b_i\), \(s_i\) (\(0 \le a_i, b_i, s_i \le {10}^9\), \(a_i \le b_i\)) — силу, мудрость и специализацию \(i\)-го участника соответственно.

Следующие \(m\) строк описывают города. В \(i\)-й строке первое число является целым \(k_i\) (\(1 \le k_i \le n\)) — количество участников из \(i\)-го города. За ним следуют \(k_i\) целых числа \(q_{i, 1}, q_{i, 2}, \ldots, q_{i, k_i}\) — (\(1 \le q_{i, j} \le n\), \(1 \le j \le k_i\)) — индексы участников из этого города. Гарантируется, что каждый участник упоминается ровно один раз.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(3 \cdot 10^5\).

Выходные данные

Если существует набор задач, который удовлетворяет условиям Хеопса, то в первой строке выведите одно целое число \(p\) (\(1 \le p \le 5n\)) — количество задач в вашем решении.

Затем выведите \(p\) строк, каждая из которых содержит два целых числа \(d\) и \(t\) (\(0 \le d, t \le {10}^9\)) — сложность и тема соответствующей задачи. Темы должны быть различными.

Если нет набора задач, который соответствует желаниям Хеопса, выведите \(-1\) вместо этого.

F2. Яндексовая клинопись (сложная версия)

жадные алгоритмы Конструктив реализация Структуры данных *3500

Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии нет ограничений на количество знаков вопроса. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Долгое время никто не мог расшифровать шумерскую клинопись. Все же она поддалась напору! Сегодня вам выпал шанс расшифровать Яндексовую клинопись.

Яндексовые клинописи задаются следующими правилами:

  1. Пустая строка является Яндексовой клинописью.
  2. Если вставить в Яндексовую клинопись три буквы «Y», «D» и «X» (каждую в одном экземпляре) таким образом, что после применения операции никакие две соседние буквы не стали равны, получится Яндексовая клинопись.
  3. Если строка не может быть получена с помощью описанных выше операций, она не является Яндексовой клинописью.

Вам задается шаблон. Шаблоном называется строка, состоящая из символов «Y», «D», «X» и «?».

Проверьте, существует ли способ заменить каждый знак вопроса на одну букву «Y», «D» или «X» так, чтобы получилась Яндексовая клинопись, и если он существует, выведите любой подходящий вариант, а также последовательность операций вставки, которая приводит к такой строке.

В этой версии задачи количество знаков вопроса может быть произвольным.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 5 \cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Каждый набор состоит из одной строки, содержащей шаблон длины \(n\) (\(3 \leq n < 2 \cdot 10^5\), \(n \bmod 3 = 0\)), состоящий только из символов «Y», «D», «X» и «?».

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите единственную строку, содержащую «NO», если не существует клинописи, подходящей под заданный шаблон.

Иначе, выведите на первой строке «YES», на второй — любую клинопись, которую можно получить. После вам необходимо вывести последовательность операций, приводящей к выведенной вами клинописи.

Последовательность операций описывается \(\frac{n}{3}\) тройками пар. Пара имеет вид c p, где \(c\) — один из символов «Y», «D» или «X», а \(p\) – позиция, на которую вставляется символ \(c\). Позиция для вставки – это количество символов, которое надо отступить от начала строки для вставки. Например, после вставки символа «D» в строку «YDX» с \(p=3\) получится строка «YDXD», а с \(p=0\) получится строка «DYDX». Заметьте, что индекс не может превышать текущую длину строки.

Операции применяются сверху вниз, слева направо. После вставки очередной тройки символов в получившейся строке не должно быть двух подряд идущих одинаковых символов.

Примечание

Во втором примере строка изменяется следующим образом: \("" \to \mathtt{YDX} \to \mathtt{YDXDYX}\).

A. Алена и квадратный пазл

математика реализация *800

Алена собирает необычный пазл. Она делает это в течение \(n\) дней следующим образом:

  • В первый день она начинает с того, что кладет центральный кусочек в центр стола.
  • В каждый следующий день она кладет определенное количество кусочков вокруг центрального кусочка по часовой стрелке, всегда полностью завершая каждый квадратный слой перед началом нового.

Так, она ставит первые \(14\) кусочков в следующем порядке:

Цвета обозначают слои. Третий слой еще не завершен.

Алена счастлива, если в конце дня собранная часть головоломки не имеет начатых, но не завершенных слоев. Вам дано количество кусочков, которые она кладет в каждый из дней. Найдите количество дней, когда Алена счастлива.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество дней.

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 100\), \(a_1 = 1\)), где \(a_i\) — это количество кусочков, которые Алена собирает в \(i\)-й день.

Гарантируется, что в каждом наборе входных данных в конце \(n\) дней нет незавершенных слоев.

Выходные данные

Для каждого набора входных данных выведите одно целое число: количество дней, когда Алена счастлива.

Примечание

В первом наборе входных данных в единственный день Алена завершает единственный слой.

Во втором наборе входных данных в первый день Алена завершает первый слой, а во второй день она завершает второй слой.

В третьем наборе входных данных она завершает второй слой за несколько дней.

В четвертом наборе входных данных она завершает второй слой и сразу же начинает следующий в тот же день, поэтому она не будет счастливой в этот день. Она счастлива только в первый и последний дни.

В пятом наборе Алена счастлива в первый, четвертый и последний дни.

A. Кевин и кодовый замок

жадные алгоритмы математика Перебор реализация теория чисел *800

Кевин попал из-за Грейс в ловушку в Прибрежной деревне. На выходе из деревни находится кодовый замок, который можно открыть только в том случае, если Кевин его разгадает.

В начале на кодовом замке написано целое число \( x \), и Кевин может ноль или больше раз выполнить любую из следующих двух операций:

  1. Если \( x \neq 33 \), он может выбрать две последовательные цифры \( 3 \) из \( x \) и удалить их одновременно. Например, если \( x = 13\,323 \), он может удалить вторую и третью \( 3 \), изменив \( x \) на \( 123 \).
  2. Если \( x \geq 33 \), он может изменить \( x \) на \( x - 33 \). Например, если \( x = 99 \), он может выбрать эту операцию, чтобы изменить \( x \) на \( 99 - 33 = 66 \).

Когда значение \( x \) на кодовом замке становится \( 0 \), Кевин может открыть замок и сбежать из деревни. Пожалуйста, определите, возможно ли Кевин открыть кодовый замок и сбежать.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит количество наборов \(t\) (\(1 \le t \le 10^4\)).

Единственная строка каждого набора содержит положительное целое число \(x\) (\(1\leq x\leq 10^9\)).

Выходные данные

Для каждого набора входных данных выведите «YES», если Кевин может открыть кодовый замок и сбежать, и «NO» в противном случае.

Вы можете выводить ответ в любом регистре (верхнем или нижнем). Например, строки «yEs», «yes», «Yes» и «YES» будут распознаны как положительные ответы.

Примечание

Решение в первом примере: \(165\xrightarrow{-33}132\xrightarrow{-33}99\xrightarrow{-33}66\xrightarrow{-33}33\xrightarrow{-33}0\).

Решение во втором примере: \(6369\xrightarrow{-33}6{\color{red}{33}}6\xrightarrow{\text{удалить «33»}}66\xrightarrow{-33}33\xrightarrow{-33}0\).

Для третьего набора можно доказать, что, независимо от выполняемых операций, \(666\) не может быть преобразовано в \(0\).

C. Кевин и бинарные строки

битмаски жадные алгоритмы Перебор реализация Строки *1200

Кевин обнаружил бинарную строку \(s\), которая начинается с 1 и передал её вам. Ваша задача — выбрать две непустые подстроки\(^{\text{∗}}\) строки \(s\) (которые могут пересекаться), чтобы максимизировать значение XOR этих двух подстрок.

XOR двух бинарных строк \(a\) и \(b\) определяется как результат операции \(\oplus\), примененной к двум числам, полученным путем представления \(a\) и \(b\) как бинарных чисел, где самый левый бит является старшим. Здесь \(\oplus\) обозначает операцию побитового исключающего ИЛИ (XOR).

Выбранные вами строки могут содержать ведущие нули.

\(^{\text{∗}}\)Строка \(a\) является подстрокой строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов с начала и нескольких (возможно, ни одного или всех) символов с конца.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов \(t\) (\(1 \le t \le 10^3\)).

Единственная строка каждого набора содержит бинарную строку \(s\), которая начинается с 1 (\(1\le\lvert s\rvert\le 5000\)).

Гарантируется, что сумма \(\lvert s\rvert\) по всем наборам не превышает \(5000\).

Выходные данные

Для каждого тестового случая выведите четыре целых числа \(l_1, r_1, l_2, r_2\) (\(1 \le l_1 \le r_1 \le |s|\), \(1 \le l_2 \le r_2 \le |s|\)) — в случае если две подстроки, которые вы выбрали, это \(s_{l_1} s_{l_1 + 1} \ldots s_{r_1}\) и \(s_{l_2} s_{l_2 + 1} \ldots s_{r_2}\).

Если есть несколько решений, выведите любое из них.

Примечание

В первом наборе мы можем выбрать \( s_2=\texttt{1} \) и \( s_1 s_2 s_3=\texttt{111} \), и \( \texttt{1}\oplus\texttt{111}=\texttt{110} \). Можно доказать, что невозможно получить больший результат. Кроме того, \( l_1=3\), \(r_1=3\), \(l_2=1\), \(r_2=3 \) также является допустимым решением.

Во втором наборе, \( s_1 s_2 s_3=\texttt{100} \), \( s_1 s_2 s_3 s_4=\texttt{1000} \), результат \( \texttt{100}\oplus\texttt{1000}=\texttt{1100} \), что является максимумом.

F. Кевин и математический класс

Деревья дп математика Перебор разделяй и властвуй реализация Структуры данных *2500

Кевин — студент из Вечно Спящего Города, который в настоящее время посещает математический класс, где учитель задает ему упражнения на деление.

На доске написаны две строки положительных целых чисел, каждая из которых содержит \( n \) чисел. Первая строка — это \( a_1, a_2, \ldots, a_n \), а вторая строка — \( b_1, b_2, \ldots, b_n \).

Для каждого упражнения на деление Кевин может выбрать любой отрезок \( [l, r] \) и найти минимальное значение \( x \) среди \( b_l, b_{l+1}, \ldots, b_r \). Затем он изменит каждое \( a_i \) для \( l \leq i \leq r \) на округление вверх от \( a_i \), деленного на \( x \).

Формально, он выбирает два целых числа \( 1 \leq l \leq r \leq n \), устанавливает \( x = \min_{l \leq i \leq r} b_i \), и изменяет все \( a_i \) для \( l \leq i \leq r \) на \( \lceil \frac{a_i}{x} \rceil \).

Кевин может покинуть класс и вернуться домой, когда все \( a_i \) станут равны \( 1 \). Он стремится уйти и хочет узнать минимальное количество упражнений на деление, необходимых для достижения этого.

Входные данные

Каждый тест содержит несколько наборов входных данных. Первая строка содержит количество наборов входных данных \( t \) (\( 1 \le t \le 10^4 \)).

Первая строка каждого набора входных данных содержит целое число \( n \) (\( 1 \le n \leq 2 \cdot 10^5 \)) — длина последовательностей \( a \) и \( b \).

Вторая строка каждого набора входных данных содержит \( n \) целых чисел \( a_1, a_2, \ldots, a_n \) (\( 1 \le a_i \le 10^{18} \)) — первая строка целых чисел на доске.

Третья строка каждого набора входных данных содержит \( n \) целых чисел \( b_1, b_2, \ldots, b_n \) (\( 2 \le b_i \le 10^{18} \)) — вторая строка целых чисел на доске.

Гарантируется, что сумма \( n \) по всем наборам входных данных не превышает \( 2 \cdot 10^5 \).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество упражнений на деление, необходимых для выхода из класса.

Примечание

Для первого примера: \( [{\color{red}{5,4}},2]\xrightarrow[\min(b_1,b_2)=3]{\text{операция на отрезке }[1,2]}[{\color{red}{2,2,2}}]\xrightarrow[\min(b_1,b_2,b_3)=2]{\text{операция на отрезке }[1,3]}[1,1,1] \).

Для второго примера: \( [{\color{red}{3,6,1}},3,2]\xrightarrow[\min(b_1,b_2,b_3)=3]{\text{операция на отрезке }[1,3]}[1,{\color{red}{2,1,3}},2]\xrightarrow[\min(b_2,b_3,b_4)=2]{\text{операция на отрезке }[2,4]}[1,1,1,{\color{red}{2,2}}]\xrightarrow[\min(b_4,b_5)=2]{\text{операция на отрезке }[4,5]}[1,1,1,1,1] \).

A. MEX-уничтожение

жадные алгоритмы реализация *800

Дракон Эвирир пробрался в замок волшебника и нашел таинственное приспособление. Врожденные инстинкты дракона заставили его поиграть с приспособлением (уничтожить его)...

Дракон Эвирир нашел массив длины \(n\) из целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\).

За одну операцию он может выбрать непустой подмассив\(^{\text{∗}}\) \(b\) массива \(a\) и заменить его одним числом — значением \(\operatorname{mex}(b)\)\(^{\text{†}}\). Он хочет использовать эту операцию некоторое количество раз, чтобы в результате массив \(a\) состоял только из нулей. Можно доказать, что это всегда возможно при заданных ограничениях.

Каково минимальное количество операций, необходимое для достижения цели?

\(^{\text{∗}}\)Массив \(c\) является подмассивом массива \(d\), если \(c\) может быть получен из \(d\) удалением нескольких (возможно, ни одного или всех) элементов с начала и нескольких (возможно, ни одного или всех) элементов с конца.

\(^{\text{†}}\)Наименьшее исключенное (MEX) набора чисел \(f_1, f_2, \ldots, f_k\) определяется как наименьшее неотрицательное целое число \(x\), которое не встречается в наборе чисел \(f\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 200\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 50\)) — длина \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел, разделенных пробелом — массив \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 100\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(500\).

Выходные данные

Для каждого набора входных данных выведите на отдельной строке минимальное количество операций, необходимых для получения массива \(a\), который содержит только нули.

Примечание

В первом наборе входных данных Эвирир может выбрать подмассив \(b = [1, 2, 3]\) и заменить его на \(\operatorname{mex}(1, 2, 3) = 0\), изменив \(a\) с \([0, \underline{1, 2, 3}]\) на \([0, 0]\) (где выбранный подмассив подчеркнут). Следовательно, ответ равен \(1\).

Во втором наборе входных данных \(a\) уже состоит только из \(0\), поэтому выполнение операций не требуется.

В третьем наборе входных данных Эвирир может изменять \(a\) следующим образом: \([1, \underline{0, 1, 0, 1}] \to [\underline{1, 2}] \to [0]\), так как \(\operatorname{mex}(0, 1, 0, 1) = 2\) и \(\operatorname{mex}(1, 2) = 0\).

В четвертом наборе входных данных Эвирир может выбрать в качестве \(b\) весь массив \(a\), изменив значение \(a\) с \([\underline{3, 1, 4, 1, 5}]\) на \([0]\).

B. Кис-кис-кис

Конструктив Паросочетания Перебор реализация *1300

Кошек привлекает «кис-кис-кис», но Эвирир, будучи достойным англоговорящим драконом, отзывается только на «pspspsp» с особыми условиями...

Дана строка \(s = s_1s_2\ldots s_n\) длины \(n\), состоящая из символов p, s и . (точка). Определите, существует ли перестановка\(^{\text{∗}}\) \(p\) длины \(n\), такая, что для каждого целого \(i\) (\(1 \le i \le n\)):

  • Если \(s_i\) равно p, то \([p_1, p_2, \ldots, p_i]\) образует перестановку (длины \(i\));
  • Если \(s_i\) равно s, то \([p_i, p_{i+1}, \ldots, p_{n}]\) образует перестановку (длины \(n-i+1\));
  • Если \(s_i\) равно ., то дополнительных ограничений нет.

\(^{\text{∗}}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит единственное целое число \(n\) (\(1 \le n \le 500\)) — длина \(s\).

Вторая строка каждого набора входных данных содержит строку \(s\) длины \(n\), состоящую из символов p, s и ..

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(5000\).

Выходные данные

Для каждого набора входных данных в первой строке выведите YES или NO. Выведите YES, если искомая перестановка существует, и NO в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

Для первого набора входных данных одна подходящая перестановка такова: \(p = [3, 4, 1, 2]\). Для неё выполняются все условия:

  • \(s_1 =\) s : \([p_1, p_2, p_3, p_4] = [3, 4, 1, 2]\) образует перестановку.
  • \(s_2 =\) . : Никаких дополнительных ограничений.
  • \(s_3 =\) s : \([p_3, p_4] = [1, 2]\) образует перестановку.
  • \(s_4 =\) p : \([p_1, p_2, p_3, p_4] = [3, 4, 1, 2]\) образует перестановку.

Для второго набора входных данных можно доказать, что не существует перестановки, удовлетворяющей всем ограничениям.

Для третьего набора входных данных одной перестановкой, удовлетворяющей условиям, является \(p = [1, 2, 3, 4, 5]\).

C. MEX-цикл

жадные алгоритмы Конструктив Перебор реализация *1500

У дракона Эвирира много друзей. У него есть целых 3 друга! Это на одного больше, чем у среднестатистического дракона.

Вам даны целые числа \(n\), \(x\), и \(y\). В кругу сидят \(n\) драконов, пронумерованных целыми числами \(1, 2, \ldots, n\). Для каждого \(i\) (\(1 \le i \le n\)) дракон номер \(i\) дружит с драконами \(i - 1\) и \(i + 1\) (здесь под номером \(0\) подразумевается дракон \(n\), а под номером \(n + 1\) подразумевается дракон \(1\)). Кроме того, драконы \(x\) и \(y\) дружат друг с другом (если они уже друзья, то ничего не меняется). Обратите внимание, что любая дружба является взаимной.

Выведите \(n\) целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\) таких, чтобы для каждого дракона \(i\) (\(1 \le i \le n\)) выполнялось следующее:

  • Пусть \(f_1, f_2, \ldots, f_k\) — друзья дракона \(i\). Тогда \(a_i = \operatorname{mex}(a_{f_1}, a_{f_2}, \ldots, a_{f_k})\).\(^{\text{∗}}\)

\(^{\text{∗}}\)Наименьшее исключенное (MEX) набора чисел \(c_1, c_2, \ldots, c_m\) определяется как наименьшее неотрицательное целое число \(t\), которое не встречается в наборе чисел \(c\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит три целых числа \(n\), \(x\), \(y\) (\(3 \le n \le 2 \cdot 10^5\), \(1 \le x < y \le n\)).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите на отдельной строке \(n\) целых неотрицательных чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le 10^9\)), которые удовлетворяют условию. Если существует несколько решений, выведите любое из них. Можно доказать, что при ограничениях задачи решение с \(0 \le a_i \le 10^9\) всегда существует.

Примечание

Для первого набора входных данных:

  • \(i = 1\): Друзья дракона \(1\) — драконы \(2, 3, 5\). \(\operatorname{mex}(a_2, a_3, a_5) = \operatorname{mex}(2, 1, 1) = 0 = a_1\), так что условие для дракона \(1\) выполнено.
  • \(i = 2\): Друзья дракона \(2\) — это драконы \(1, 3\). \(\operatorname{mex}(a_1, a_3) = \operatorname{mex}(0, 1) = 2 = a_2\).
  • \(i = 3\): Друзья дракона \(3\) — это драконы \(1, 2, 4\). \(\operatorname{mex}(a_1, a_2, a_4) = \operatorname{mex}(0, 2, 0) = 1 = a_3\).
  • \(i = 4\): Друзья дракона \(4\) — это драконы \(3, 5\). \(\operatorname{mex}(a_3, a_5) = \operatorname{mex}(1, 1) = 0 = a_4\).
  • \(i = 5\): Друзья дракона \(5\) — это драконы \(1, 4\). \(\operatorname{mex}(a_1, a_4) = \operatorname{mex}(0, 0) = 1 = a_5\).

E. Сломанные запросы

Бинарный поиск битмаски интерактив Конструктив Перебор реализация *2400

Вы — волшебник, чье творение было уничтожено драконом. Вы полны решимости выследить его с помощью волшебного AOE-трекера. Но с ним, похоже, кто-то играет...

Это интерактивная задача

Есть скрытый бинарный массив \(a\) длины \(n\) (\(\mathbf{n}\) является степенью 2) и скрытое целое число \(k\ (2 \le k \le n - 1)\). Массив \(a\) содержит ровно одну 1 (а все остальные элементы равны 0). Для двух целых \(l\) и \(r\) (\(1 \le l \le r \le n\)) определим сумму диапазона \(s(l, r) = a_l + a_{l+1} + \cdots + a_r\).

У вас есть волшебное устройство, которое принимает диапазоны и возвращает суммы диапазонов, но оно возвращает противоположный результат, когда диапазон имеет длину хотя бы \(k\). Формально, в одном запросе вы можете задать ему пару целых \([l, r]\), где \(1 \le l \le r \le n\), и он вернёт либо \(0\), либо \(1\), в соответствии со следующими правилами:

  • Если \(r - l + 1 < k\), то он вернёт \(s(l, r)\).
  • Если \(r - l + 1 \ge k\), то он вернёт \(1 - s(l, r)\).

Найдите \(k\), используя не более \(33\) запросов.

Устройство является неадаптивным. Это означает, что скрытые \(a\) и \(k\) фиксируются перед взаимодействием и не изменяются во время взаимодействия.

Протокол взаимодействия

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое положительное число \(n\) (\(4 \le n \le 2^{30}\)) — длину скрытого массива. Гарантируется, что \(\mathbf{n}\) — это степень 2; то есть \(n = 2^m\) для некоторого целого неотрицательного числа \(m\).

Вы можете делать запросы следующим образом — выведите одну строку вида «\(\mathtt{?}\,l\,r\)», где \(1 \le l \le r \le n\). После этого считайте одно целое число: \(0\) или \(1\), как описано в условии.

Если вы хотите дать ответ \(k\), выведите «\(\mathtt{!}\,k\)». Затем взаимодействие продолжается со следующим набором входных данных.

Вывод ответа не учитывается при подсчете количества выполненных запросов.

После вывода каждого запроса не забудьте вывести перевод строки и сбросить буфер вывода\(^{\text{∗}}\). В противном случае вы получите вердикт Решение «зависло».

На любом шаге взаимодействия, если вы считали \(-1\) вместо корректных данных, ваше решение должно немедленно завершиться. Это означает, что ваше решение получит вердикт Неправильный ответ из-за некорректного запроса или любой другой ошибки. Если программа не завершится, вы можете получить любой вердикт, так как ваша программа продолжит чтение из закрытого потока.

Взломы

Формат взломов должен быть следующим: первая строка должна содержать одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее должно следовать описание наборов входных данных.

Первая и единственная строка каждого набора входных данных должна содержать три целых числа \(n\), \(p\), и \(k\) (\(4 \le n \le 2^{30}\), \(1 \le p \le n\), \(2 \le k \le n - 1\)) — длина скрытого массива \(a\), позиция единственной 1 в \(a\) и скрытое \(k\). \(n\) должно быть степенью \(2\).

\(^{\text{∗}}\)Чтобы сбросить буфер вывода, используйте:

  • fflush(stdout) или cout.flush() в C++;
  • sys.stdout.flush() в Python;
  • смотрите документацию для других языков.
Примечание

В первом наборе входных данных \(k = 6\), а 1 в скрытом массиве находится на позиции 6, так что \(a = [0, 0, 0, 0, 0, 1, 0, 0]\).

  • Для запроса 3 5, поскольку \(5-3+1 = 3 < k\), устройство отвечает правильно. Поскольку значение 6 не входит в диапазон \([3, 5]\), устройство отвечает \(0\).
  • Для запроса 1 8, поскольку \(8 - 1 + 1 = 8 \ge k\), устройство неправильно отвечает \(0\).
  • Для запроса 4 8, поскольку \(8 - 4 + 1 = 5 < k\), устройство правильно отвечает \(1\).
  • Для запроса 3 8, поскольку \(8 - 3 + 1 = 6 \ge k\), устройство неправильно отвечает \(0\).
Затем решение в примере выводит \(6\), что является правильным ответом.

Во втором наборе входных данных \(k = 2\), а 1 в скрытом массиве находится на позиции 3, так что \(a = [0, 0, 1, 0]\).

Обратите внимание, что в примере решению может не хватать информации для определения \(k\).

F. MEX-ИЛИ-мания

битмаски Перебор реализация снм Структуры данных *2700

Последовательность чисел \(b_1, b_2, \ldots, b_n\) является хорошей, если \(\operatorname{mex}(b_1, b_2, \ldots, b_n) - (b_1 | b_2 | \ldots | b_n) = 1\). Здесь \(\operatorname{mex(c)}\) обозначает MEX\(^{\text{∗}}\) набора чисел \(c\), а \(|\) обозначает операцию побитового ИЛИ.

У Шохага есть целочисленная последовательность \(a_1, a_2, \ldots, a_n\). Он выполнит следующие \(q\) обновлений последовательности \(a\):

  • \(i\) \(x\) — увеличить \(a_i\) на \(x\).

После каждого обновления помогите Шохагу найти длину самого длинного хорошего подмассива\(^{\text{†}}\) массива \(a\).

\(^{\text{∗}}\)Наименьшее исключенное (MEX) набора чисел \(c_1, c_2, \ldots, c_k\) определяется как наименьшее неотрицательное целое число \(y\), которое не встречается в наборе чисел \(c\).

\(^{\text{†}}\)Массив \(d\) является подмассивом массива \(f\), если \(d\) может быть получен из \(f\) удалением нескольких (возможно, ни одного или всех) элементов с начала и нескольких (возможно, ни одного или всех) элементов с конца.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \le a_i \le n\)).

Следующие \(q\) строк каждого набора входных данных имеют следующий вид:

  • \(i\) \(x\) (\(1 \le i, x \le n\)) — это означает, что вы должны увеличить \(a_i\) на \(x\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\) и сумма \(q\) не превосходит \(10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) строк — в \(i\)-й строке выведите длину самого длинного хорошего подмассива \(a\) после \(i\)-го обновления.

Примечание

В первом наборе входных данных после первого обновления массив становится \([0, 0, 1, 0, 1, 1]\). Весь массив является хорошим, так как \(\operatorname{mex}([0, 0, 1, 0, 1, 1]) - (0 | 0 | 1 | 0 | 1 | 1) = 2 - 1 = 1\).

После второго обновления массив становится равен \([0, 0, 3, 0, 1, 1]\), и его подмассив \([0, 1, 1]\) имеет максимальную длину среди всех хороших подмассивов.

Наконец, после третьего обновления массив становится равен \([0, 0, 3, 0, 1, 4]\), и два его подмассива \([0, 0]\) и \([0, 1]\) имеют максимальную длину среди всех хороших подмассивов.

A. Маленький Слоник и Роздол

Перебор реализация *900

Маленький Слоник очень любит Украину. Особенно сильно он любит город Роздол.

Но постоянно находиться в Роздоле очень вредно, поэтому Маленький Слоник хочет съездить в какой-нибудь другой город. Маленький Слоник не любит тратить много времени на переезды, поэтому для своего путешествия он выберет город, проезд до которого занимает минимальное время. Если же таких городов несколько, то Маленький Слоник никуда не поедет.

Для каждого города кроме Роздола вам известно время, требуемое для путешествия в этот город. Определите в какой город поедет Маленький Слоник или выведите «Still Rozdil», если он останется в Роздоле.

Входные данные

В первой строке задано единственное целое число n (1 ≤ n ≤ 105) — количество городов. В следующей строке задано n целых чисел, разделенных единичными пробелами: i-ое число обозначает время, требуемое на проезд от города Роздол до i-го города. Времена — целые положительные числа, не превосходящие 109.

Можете считать, что все города пронумерованы от 1 до n включительно. Роздол в число пронумерованных городов не входит.

Выходные данные

В единственной строке выведите ответ — номер города, в который поедет Маленький Слоник. Если городов с минимальным временем проезда несколько, выведите «Still Rozdil» (без кавычек).

Примечание

В первом примере есть только два города, куда может съездить Маленький Слоник. Время путешествия до первого из них равно 7, до второго — 4. Ближайший к Роздолу город (он единственный) — второй, поэтому ответ 2.

Во втором примере ближайшими городами являются второй и пятый, время путешествия до них обоих равно 4, поэтому ответ — «Still Rozdil».

A. Переносы строк

реализация *800

У Кости есть текст \(s\) из \(n\) слов, состоящих из букв латинского алфавита. Также у него есть две полоски, на которые он должен выписать текст. На первую полоску помещается \(m\) символов, а на вторую — сколько угодно.

Костя должен выбрать число \(x\) и выписывает первые \(x\) слов из \(s\) на первую полоску, а все остальные — на вторую. Ради экономии места слова выписываются без отступов, но каждое слово должно полностью быть на одной полоске.

Так как место на второй полоске очень ценно, Костя просит вас выбрать максимальное возможное число \(x\), чтобы все слова \(s_1, s_2, \dots, s_x\) уместились на первую полоску длины \(m\).

Входные данные

Первая строка содержит целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n \le 50\); \(1 \le m \le 500\)) — число слов в списке и максимальное число символов, которое может быть в первой строке.

Следующие \(n\) строк содержат по одному слову \(s_i\) из строчных букв латинского алфавита, длина \(s_i\) не превышает \(10\).

Выходные данные

Для каждого набора входных данных выведите максимальное число слов \(x\), такое что первые \(x\) слов имеют суммарную длину не больше \(m\).

E. Три строки

дп реализация Строки *1500

Даны три строки: \(a\), \(b\) и \(c\), состоящие из строчных латинских букв. Строка \(c\) была получена следующим образом:

  1. На каждом шаге случайно выбиралась строка \(a\) или строка \(b\), и первый символ выбранной строки удалялся из неё и приписывался в конец строки \(c\), пока одна из строк не заканчивалась. После этого оставшиеся символы непустой строки добавлялись в конец \(c\).
  2. Затем в строке \(c\) было произвольно изменено некоторое количество символов.

Например, из строк \(a=\color{red}{\text{abra}}\) и \(b=\color{blue}{\text{cada}}\) без замен символов могли получиться строки \(\color{blue}{\text{ca}}\color{red}{\text{ab}}\color{blue}{\text{d}}\color{red}{\text{ra}}\color{blue}{\text{a}}\), \(\color{red}{\text{abra}}\color{blue}{\text{cada}}\), \(\color{red}{\text{a}}\color{blue}{\text{cada}}\color{red}{\text{bra}}\).

Найдите минимальное количество символов, которые могли быть изменены в строке \(c\).

Входные данные

Первая строка входных данных содержит одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных.

Первая строка каждого набора содержит одну строку из строчных латинских букв \(a\) (\(1 \leq |a| \leq 10^3\)) — первая строка. Где \(|a|\) обозначает длину строки \(a\).

Вторая строка каждого набора содержит одну строку из строчных латинских букв \(b\) (\(1 \leq |b| \leq 10^3\)) — вторая строка. Где \(|b|\) обозначает длину строки \(b\).

Третья строка каждого набора содержит одну строку из строчных латинских букв \(c\) (\(|c| = |a| + |b|\)) — третья строка.

Гарантируется, что сумма \(|a|\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\). Также сумма \(|b|\) по всем наборам входных данных не превосходит \(2 \cdot 10^3\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное количество символов, которые могли быть изменены в строке \(c\).

C. Подготовка к экзамену

Конструктив реализация *1000

Монокарп готовится к своему первому экзамену в университете. Программа экзамена состоит из \(n\) вопросов, пронумерованных от \(1\) до \(n\). На экзамене Монокарпу попадется один из \(m\) различных билетов; каждый билет состоит из ровно \(n-1\) различных вопросов. Каждый билет \(i\) характеризуется одним числом \(a_i\), которое является индексом единственного вопроса, который отсутствует в \(i\)-м билете. Например, если \(n = 4\) и \(a_i = 3\), то \(i\)-й билет содержит вопросы \([1, 2, 4]\).

Во время экзамена Монокарп получит один из этих \(m\) билетов. Затем профессор заставит Монокарпа ответить на все вопросы из билета. Таким образом, Монокарп сдаст экзамен только в том случае, если он знает все вопросы из билета.

Монокарп знает ответы на \(k\) вопросов \(q_1, q_2, \dots, q_k\). Для каждого билета определите, сдаст ли Монокарп экзамен, если он получит этот билет.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Каждый набор входных данных состоит из трех строк:

  • первая строка содержит три целых числа \(n\), \(m\) и \(k\) (\(2 \le n \le 3 \cdot 10^5\); \(1 \le m, k \le n\));
  • вторая строка содержит \(m\) различных целых чисел \(a_1, a_2, \dots, a_m\) (\(1 \le a_i \le n\); \(a_i < a_{i+1}\));
  • третья строка содержит \(k\) различных целых чисел \(q_1, q_2, \dots, q_k\) (\(1 \le q_i \le n\); \(q_i < q_{i+1}\)).

Дополнительные ограничения на входные данные:

  • сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).
Выходные данные

Для каждого набора входных данных выведите строку из \(m\) символов. \(i\)-й символ должен быть 1, если Монокарп сдаст экзамен, если он получит \(i\)-й билет, или 0, если Монокарп не сдаст.

Примечание

В первом наборе входных данных Монокарп знает вопросы \([1, 3, 4]\). Рассмотрим все билеты:

  • первый билет состоит из вопросов \([2, 3, 4]\). Монокарп не знает \(2\)-й вопрос, поэтому он не сдаст;
  • второй билет состоит из вопросов \([1, 3, 4]\). Монокарп знает все эти вопросы, поэтому он сдаст;
  • третий билет состоит из вопросов \([1, 2, 4]\). Монокарп не знает \(2\)-й вопрос, поэтому он не сдаст;
  • четвертый билет состоит из вопросов \([1, 2, 3]\). Монокарп не знает \(2\)-й вопрос, поэтому он не сдаст.

F. Джокер

жадные алгоритмы математика Перебор реализация *2000

Рассмотрим колоду из \(n\) карт. Позиции в колоде пронумерованы от \(1\) до \(n\) сверху вниз. На \(m\)-й позиции расположен джокер.

К колоде последовательно применяются \(q\) операций. Во время \(i\)-й операции необходимо взять карту на \(a_i\)-й позиции и переместить её либо в начало, либо в конец колоды. Например, если колода имеет вид \([2, 1, 3, 5, 4]\), и \(a_i=2\), то после операции колода будет \([1, 2, 3, 5, 4]\) (карту со второй позиции перенесли в начало) или \([2, 3, 5, 4, 1]\) (карту со второй позиции перенесли в конец).

Ваша задача — посчитать количество различных позиций, в которых может находиться джокер после каждой из операций.

Входные данные

Первая строка содержит одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных.

Первая строка каждого набора содержит три целых числа \(n\), \(m\) и \(q\) (\(2 \le n \le 10^9\); \(1 \le m \le n\); \(1 \le q \le 2 \cdot 10^5\)).

Вторая строка содержит \(q\) целых чисел \(a_1, a_2, \dots, a_q\) (\(1 \le a_i \le n\)).

Дополнительное ограничение на входные данные: сумма \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите \(q\) целых чисел — количество различных позиций, в которых может находиться джокер после каждой из операций.

F. Искренний матричный комплемент

дп жадные алгоритмы математика Перебор реализация Структуры данных *2600

3, 2, 1, ... We are the — RiOI Team!
— Felix & All, Special Thanks 3
  • Питер: Хорошие новости! Моя задача T311013 была одобрена!
  • \(\delta\): Я рад, что у моего компьютера разрядилась батарея, иначе я бы поучаствовал в раунде wyrqwq и получил бы отрицательную дельту.
  • Феликс: [thumbs_up] Условие задачи про удалённую песню!
  • Аквавейв: Нужно ли мне оплакивать свою химию?
  • Е.Космос: что?
  • Трайн: Хлеб.
  • Ирис: И почему же я всегда только тестирую задачи?

Пройдет время, и мы, возможно, встретимся снова. Оглядываясь назад на прошлое, можно сказать, что каждый прожил ту жизнь, которую хотел.

У Аквавейва есть матрица \(A\) размера \(n\times m\), элементы которой могут быть только целыми числами в диапазоне \([1, k]\) включительно. В матрице некоторые ячейки уже заполнены целым числом, в то время как остальные в данный момент не заполнены и обозначаются числом \(-1\).

Вы собираетесь заполнить все незаполненные ячейки в \(A\). После этого пусть \(c_{u,i}\) будет обозначать количество вхождений элемента \(u\) в \(i\)-ю строку. Аквавейв определяет красоту матрицы следующим образом:

\(\)\sum_{u=1}^k \sum_{i=1}^{n-1} c_{u,i} \cdot c_{u,i+1}.\(\)

Вы должны найти максимально возможную красоту \(A\) после оптимального заполнения пробелов.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 2\cdot 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n\), \(m\) и \(k\) (\(2 \leq n \leq 2\cdot 10^5\), \(2 \leq m \leq 2\cdot 10^5\), \(n \cdot m \leq 6\cdot 10^5\), \(1 \leq k \leq n\cdot m\)) — количество строк и столбцов матрицы \(A\) и диапазон целых чисел в матрице соответственно.

Затем следуют \(n\) строк, \(i\)-я строка содержит \(m\) целых числа \(A_{i,1},A_{i,2},\ldots,A_{i,m}\) (\(1 \leq A_{i,j} \leq k\) или \(A_{i,j} = -1\)) — элементы в \(A\).

Гарантируется, что сумма \(n\cdot m\) по всем наборам входных данных не превосходит \(6\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — максимально возможную красоту.

Примечание

В первом наборе входных данных матрица \(A\) уже определена. Её красота равняется

\(\)\sum_{u=1}^k \sum_{i=1}^{n-1} c_{u,i} \cdot c_{u,i+1} = c_{1,1}\cdot c_{1,2} + c_{1,2}\cdot c_{1,3} + c_{2,1}\cdot c_{2,2} + c_{2,2}\cdot c_{2,3} + c_{3,1}\cdot c_{3,2} + c_{3,2}\cdot c_{3,3} = 1\cdot 1 + 1\cdot 1 + 2\cdot 0 + 0\cdot 1 + 0\cdot 2 + 2\cdot 1 = 4.\(\)

Во втором наборе входных данных можно заполнить матрицу следующим образом:

\(\) \begin{bmatrix} 2 &3 &3 \\ 2 &2 &3 \end{bmatrix}, \(\)

и получить значение \(4\). Можно доказать, что это максимально возможный ответ, который можно получить.

В третьем наборе входных данных одной из возможных оптимальных конфигураций является:

\(\) \begin{bmatrix} 1 &1 &1 \\ 1 &2 &1 \\ 1 &1 &4 \end{bmatrix}. \(\)

В четвертом наборе входных данных одной из возможных оптимальных конфигураций является:

\(\) \begin{bmatrix} 1 &3 &2 &3 \\ 1 &3 &2 &1 \\ 3 &1 &5 &1 \end{bmatrix}. \(\)

В пятом наборе входных данных одной из возможных оптимальных конфигураций является:

\(\) \begin{bmatrix} 5 &5 &2 \\ 1 &8 &5 \\ 7 &5 &6 \\ 7 &7 &4 \\ 4 &4 &4 \end{bmatrix}. \(\)

H. Деликатные анти-монотонные операции

Конструктив реализация *3500

I shall be looking for you who would be out of Existence.
— HyuN, Disorder

В жизни всегда много повторяющихся задач. Ирис они всегда не нравились, поэтому она отказывается их повторять. Однако время нельзя повернуть вспять; нам нужно только двигаться вперед.

Формально, у Ирис есть целочисленная последовательность \(a_1, a_2, \ldots, a_n\), где каждое число в последовательности находится между \(1\) и \(w\) включительно. Гарантируется, что \(w \geq 2\).

Ирис определяет операцию как выбор двух чисел \(a_i, a_{i+1}\), удовлетворяющих \(a_i = a_{i+1}\), а затем изменение их на два произвольных целых числа в пределах диапазона \([1, w]\). Ирис не нравится равенство, поэтому она должна гарантировать \(a_i \neq a_{i+1}\) после операции. Каждая пара \(a_i, a_{i+1}\) может быть выбрана несколько раз.

Ирис хочет узнать максимально возможную сумму всех элементов \(a\) после нескольких (возможно, нуля) операций, а также минимальное количество операций, необходимое для достижения этого максимального значения.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(w\) (\(1 \leq n \leq 2\cdot 10^5\), \(2 \leq w \leq 10^8\)) — длина массива и максимально допустимое значение элементов.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \leq a_i \leq w\)) — элементы массива.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^6\).

Выходные данные

Для каждого набора входных данных выведите два целых числа — максимально возможную сумму всех элементов \(a\) и минимальное количество требуемых операций соответственно.

Примечание

В первом наборе входных данных никаких операций не может быть выполнено, поэтому ответами являются \(\sum a_i = 15\) и \(0\), соответственно.

Во втором наборе входных данных операции могут быть выполнены следующим образом:

\(\)[3, 1, 2, 3, 4, \underline{1, 1}] \rightarrow [3, 1, 2, 3, \underline{4, 4}, 5] \rightarrow [3, 1, 2, \underline{3, 3}, 5, 5] \rightarrow [3, 1, \underline{2, 2}, 5, 5, 5] \rightarrow [3, \underline{1, 1}, 5, 5, 5, 5] \rightarrow [\underline{3, 3}, 5, 5, 5, 5, 5] \rightarrow [4, 5, 5, 5, 5, 5, 5]\(\)

Можно показать, что это оптимально, поэтому мы должны вывести \(\sum a_i = 34\) и количество операций \(6\), соответственно.

D. Пугало

жадные алгоритмы математика реализация *2000

На своей апельсиновой плантации мужчина из Флориды получает очередное спам-письмо, доставленное вороной. Естественно, он отправляет его обратно самым неудобным из возможных способов.

Ворона сидит на позиции \(0\) числовой прямой. Есть \(n\) пугал, расположенных на целочисленных координатах \(a_1, a_2, \ldots, a_n\) вдоль числовой прямой. Эти пугала были зачарованы, что позволяет им перемещаться влево и вправо со скоростью \(1\) единица в секунду.

Ворона боится пугал и хочет держаться на расстоянии по крайней мере \(k\) от ближайшего пугала, расположенного на позиции вороны или левее. Для этого ворона использует свою способность к телепортации следующим образом:

  • Пусть \(x\) — текущее положение вороны, а \(y\) — максимальная координата пугала, такая, что \(y \le x\). Если \(x - y < k\), то есть пугало находится слишком близко, то ворона мгновенно телепортируется на позицию \(y + k\).

Эта телепортация происходит мгновенно и непрерывно. Ворона будет продолжать проверять, нет ли пугал, расположенных на её позиции или слева от неё, и телепортироваться всякий раз, когда кто-то подойдет слишком близко (что может произойти в нецелый момент времени). Обратите внимание, что помимо телепортации, ворона не будет передвигаться сама по себе.

Ваша задача состоит в том, чтобы определить минимальное время, необходимое для того, чтобы ворона оказалась на позиции, большей или равной \(\ell\). При этом пугала двигаются оптимально, чтобы позволить вороне достичь своей цели. Для удобства мы просим вывести значение, вдвое больше минимального времени, необходимого вороне для достижения целевой позиции \(\ell\). Можно доказать, что это значение всегда будет целым числом.

Обратите внимание, что пугала могут стартовать, останавливаться или менять направление в любой момент (возможно, в нецелые моменты времени).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит три целых числа \(n, k, \ell\) (\(1 \leq n \leq 2 \cdot 10^5\), \(1 \leq k \leq \ell \leq 10^8\)) — количество пугал, расстояние телепортации и целевое положение вороны, соответственно.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_1 \leq a_2 \leq \ldots \leq a_n \leq \ell\)) — начальные позиции \(n\) пугал.

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число, представляющее удвоенное минимальное время, необходимое вороне для телепортации в положение, большее или равное \(\ell\).

Примечание

В первом наборе входных данных ворона мгновенно телепортируется на позицию \(3\) из-за пугала на позиции \(0\). Затем это пугало может переместиться на позицию \(2\), заставляя ворону непрерывно постепенно перемещаться из положения \(3\) в положение \(5\), завершая путешествие за \(2\) секунды. Следовательно, ответ равен \(4\).

Во втором наборе входных данных пугало \(1\) и пугало \(2\) могут переместиться на позиции \(0\) и \(3\) соответственно за \(2\) секунды, в то время как пугало \(3\) остается на позиции \(5\). Ворона телепортируется на позицию \(2\) благодаря пугалу \(1\). Затем пугало \(1\) перемещается вправо, в то время как пугало \(2\) и пугало \(3\) перемещаются влево в течение \(0.5\) секунд. Это приводит к тому, что ворона непрерывно перемещается из положения \(2\) в положение \(2.5\) из-за того, что пугало \(1\) перемещается вправо из положения \(0\). По истечении этой половины секунды пугала окажутся на позициях \(0.5, 2.5, 4.5\). Пугало \(2\), теперь находящееся на позиции \(2.5\), заставляет ворону мгновенно телепортироваться на позицию \(4.5\), а пугало \(3\) на позиции \(4.5\) заставляет её мгновенно телепортироваться на позицию \(6.5\), что превосходит \(\ell = 5\). Таким образом, ворона завершает перемещение за \(2.5\) секунды, а ответ равен \(5\).

Можно показать, что это минимально возможное время для обоих наборов входных данных.

B. Найдите перестановку

графы Перебор поиск в глубину и подобное реализация сортировки *1300

Вам дан неориентированный граф с \(n\) вершинами, пронумерованными от \(1\) до \(n\). Этот граф кодирует секретную перестановку\(^{\text{∗}}\) \(p\) длины \(n\). Граф строится следующим образом:

  • Для каждой пары целых чисел \(1 \le i < j \le n\), между вершиной \(p_i\) и вершиной \(p_j\) добавляется неориентированное ребро тогда и только тогда, когда \(p_i < p_j\). Обратите внимание, что ребро добавляется не между вершинами \(i\) и \(j\), а между вершинами соответствующих им элементов. Обратитесь к примечаниям для лучшего понимания.

Ваша задача состоит в том, чтобы восстановить и вывести перестановку \(p\). Можно доказать, что перестановка \(p\) может быть определена однозначно.

\(^{\text{∗}}\)Перестановкой длины \(n\) является массив, состоящий из \(n\) различных целых чисел от \(1\) до \(n\) в произвольном порядке. Например, \([2,3,1,5,4]\) — перестановка, но \([1,2,2]\) не перестановка (\(2\) встречается в массиве дважды) и \([1,3,4]\) тоже не перестановка (\(n=3\), но в массиве встречается \(4\)).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 500\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \le n \le 1000\)).

В \(i\)-й из следующих \(n\) строк содержится \(n\) символов \(g_{i, 1}g_{i, 2}\ldots g_{i, n}\) (\(g_{i, j} = \mathtt{0}\) или \(g_{i, j} = \mathtt{1}\)) — матрица смежности. \(g_{i, j} = \mathtt{1}\) тогда и только тогда, когда существует ребро между вершинами \(i\) и \(j\).

Гарантируется, что существует перестановка \(p\), которая генерирует данный граф. Также гарантируется, что граф неориентирован и не имеет петель, то есть выполняется \(g_{i, j} = g_{j, i}\) и \(g_{i, i} = \mathtt{0}\).

Гарантируется, что сумма значений \(n\) по всем наборам входных данных не превосходит \(1000\).

Выходные данные

Для каждого набора входных данных выведите \(n\) целых чисел \(p_1, p_2, \ldots, p_n\) — восстановленную перестановку.

Примечание

В первом наборе входных данных \(p = [1]\). Поскольку нет пар \(1 \le i < j \le n\), в графе нет рёбер.

Граф для второго набора входных данных показан ниже. Например, когда мы выбираем \(i = 3\) и \(j = 4\), мы добавляем ребро между вершинами \(p_i = 1\) и \(p_j = 3\), потому что \(p_i < p_j\). Однако, когда мы выбираем \(i = 2\) и \(j = 3\), то \(p_i = 2\) и \(p_j = 1\), так что \(p_i < p_j\) не выполняется. Поэтому мы не добавляем ребро между \(2\) и \(1\).

В третьем наборе входных данных в графе нет рёбер, поэтому нет пар целых чисел \(1 \le i < j \le n\) таких, что \(p_i < p_j\). Следовательно, \(p = [6, 5, 4, 3, 2, 1]\).

D. Заказ мерча

жадные алгоритмы математика матрицы реализация Структуры данных *2000

«Т-поколение» решило закупить мерч на различные нужды, таким образом, у них есть \(n\) различных кофт, пронумерованных от \(1\) до \(n\). Где \(i\)-я кофта имеет размер \(a_i\). Теперь им нужно отправить какой-нибудь подотрезок кофт на олимпиаду. Необходимо, чтобы кофты подошли как можно большему количеству людей, но при том, чтобы не пришлось брать их слишком много.

Им нужно выбрать два индекса \(l\) и \(r\) (\(1 \le l \le r \le n\)) и максимизировать значение удобства, равное \(\)\operatorname{max} (a_l, a_{l + 1}, \ldots, a_r) - \operatorname{min} (a_l, a_{l + 1}, \ldots, a_r) - (r - l),\(\) то есть, разброс размеров минус количество кофт.

Иногда размеры кофт меняются, известно, что было \(q\) изменений размеров. В каждом изменении размер некоторой \(p\)-й кофты становится равным \(x\).

Помогите кружку и определите максимальное значение удобства среди всех возможных пар \((l, r)\) изначально, а также после каждого изменения размера.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)) — количество кофт и количество изменений размеров.

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^9\)) — размеры кофт.

В каждой из следующих \(q\) строк каждого набора входных данных содержатся два целых числа \(p\) и \(x\) (\(1 \le p \le n\), \(1 \le x \le 10^9\)) — очередное изменение размеров.

Гарантируется, что сумма значений \(n\) и сумма значений \(q\) по всем наборам входных данных не превосходит \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите максимальное значение удобства по всем возможным парам \((l, r)\) до всех действий, а также после изменения размеров.

Примечание

Рассмотрим первый пример.

  • До изменений можно взять все кофты, тогда значение удобства будет равно \(\operatorname{max} (a_1, a_2) - \operatorname{min} (a_1, a_2) - (2 - 1) = 10 - 1 - 1 = 8\).
  • После первого запроса размеры обеих кофт будут равны \(10\), можно взять только первую кофту и значение удобства будет равно \(10 - 10 - 0 = 0\).
  • После второго запроса размер первой кофты будет равен \(10\), а второй \(2\), можно взять все кофты и значение удобства будет равно \(\operatorname{max} (a_1, a_2) - \operatorname{min} (a_1, a_2) - (2 - 1) = 10 - 2 - 1 = 7\).

F1. Кевин и бинарная строка (простая версия)

жадные алгоритмы реализация *2100

Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии строка \(t\) состоит только из «0» и «1». Вы можете делать взломы только в том случае, если решили все версии этой задачи.

У Кевина есть бинарная строка \(s\) длины \(n\). Кевин может выполнять следующую операцию:

  • Выбрать два соседних блока строки \(s\) и поменять их местами.

Блок — это максимальная по включению подстрока\(^{\text{∗}}\) из одинаковых символов. Формально, обозначим подстроку \(s_l s_{l+1} \ldots s_r\) как \(s[l,r]\). Тогда \(s[l,r]\) является блоком, если выполняются все условия:

  • \(l=1\) или \(s_l\not=s_{l-1}\).
  • \(s_l=s_{l+1} = \ldots = s_{r}\).
  • \(r=n\) или \(s_r\not=s_{r+1}\).

Соседними блоками являются два блока \(s[l_1,r_1]\) и \(s[l_2,r_2]\), для которых \(r_1+1=l_2\).

Например, если \(s=\mathtt{000}\,\mathbf{11}\,\mathbf{00}\,\mathtt{111}\), Кевин может выбрать два блока \(s[4,5]\) и \(s[6,7]\) и поменять их местами, преобразовав \(s\) в \(\mathtt{000}\,\mathbf{00}\,\mathbf{11}\,\mathtt{111}\).

Дана строка \(t\) длины \(n\), состоящая из символов «0», «1» и «?». Кевин хочет определить минимальное количество операций, необходимых для получения строки, для которой выполняется следующее условие: для любого индекса \(i\) (\(1\le i\le n\)), если \(t_i\not=\) '?', то \(s_i=t_i\). Если это невозможно, выведите \(-1\).

\(^{\text{∗}}\)Строка \(a\) является подстрокой строки \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) символов с начала и нескольких (возможно, ни одного или всех) символов с конца.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит строку \(s\), состоящую из «0» и «1».

Вторая строка каждого набора входных данных содержит строку \(t\), состоящую из «0» и «1».

Гарантируется, что \(s\) и \(t\) имеют одинаковую длину.

Гарантируется, что сумма длин \(s\) по всем наборам входных данных не превосходит \(4\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно целое число — минимальное необходимое количество операций. Если это невозможно, выведите \(-1\).

Примечание

В первом наборе входных данных возможная последовательность операций приведена в условии.

Во втором наборе входных данных можно применить такую последовательность операций:

  • Переставить блоки \([2, 2], [3, 3]\): \(s\) станет \(\mathtt{001101}\).
  • Переставить блоки \([3, 4], [5, 5]\): \(s\) станет \(\mathtt{000111}\).
  • Переставить блоки \([1, 3], [4, 6]\): \(s\) станет \(\mathtt{111000}\).

E2. Игра (сложная версия)

графы Деревья игры поиск в глубину и подобное реализация Структуры данных *3000

Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии вам нужно найти все возможные вершины, которые может выбрать Чирно. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Чирно и Дайёсей играют в игру с деревом\(^{\text{∗}}\) из \(n\) вершин, корнем которого является вершина \(1\). Значение \(i\)-й вершины равно \(w_i\). Они по очереди делают ходы; первым ходит Чирно.

На каждом ходу, предполагая, что противник выбрал \(j\) на последнем ходу, игрок может выбрать любую оставшуюся вершину \(i\), удовлетворяющую условию \(w_i>w_j\), и удалить поддерево\(^{\text{†}}\) вершины \(i\). В частности, Чирно может выбрать любую вершину и удалить её поддерево на первом ходу.

Первый игрок, который не может сделать ход, выигрывает, и они оба надеются победить. Найдите все возможные вершины, которые может выбрать Чирно на первом ходу, чтобы выиграть, если оба игрока будут играть оптимально.

\(^{\text{∗}}\)Деревом называется связный граф без циклов.

\(^{\text{†}}\)Вершина \(u\) принадлежит поддереву вершины \(i\), если любой путь от \(1\) до \(u\) проходит через \(i\).

Входные данные

Первая строка ввода содержит одно целое число \(t\) (\(1 \leq t \leq 10^5\)) — количество наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \le n \le 4\cdot 10^5\)) — количество вершин в дереве.

Вторая строка содержит \(n\) целых чисел \(w_1,w_2,\ldots,w_n\) (\(1 \le w_i \le n\)) — значения вершин.

Следующие \(n-1\) строк содержат ребра дерева. \(i\)-я строка содержит два целых числа \(u_i,v_i\) (\(1\le u_i,v_i \le n\), \(u_i \neq v_i\)) — ребро, соединяющее \(u_i\) и \(v_i\). Гарантируется, что заданные ребра образуют дерево.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(4\cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одну строку.

Если Чирно может выиграть, выведите несколько чисел. Первое число \(k\) обозначает количество возможных вершин, которые она может выбрать на первом ходу. Следующие \(k\) чисел обозначают данные вершины в порядке возрастания.

В противном случае выведите «0» (без кавычек).

Примечание

В первом наборе входных данных:

  1. Если Чирно выберет \(1\) или \(3\) на первом ходу, Дайёсей не сможет сделать ход, поэтому Дайёсей выигрывает.
  2. Если Чирно выберет \(2\) или \(4\) на первом ходу, Дайёсей сможет выбрать только \(3\), но после этого Чирно не сможет сделать ход, поэтому Чирно выигрывает.

Таким образом, все возможные вершины, которые может выбрать Чирно — это \(2\) и \(4\).

Во втором наборе входных данных, независимо от того, какую вершину выберет Чирно, Дайёсей не сможет сделать ход, поэтому Дайёсей выигрывает.

В третьем и четвертом наборах входных данных единственной возможной вершиной, которую может выбрать Чирно на первом ходу, является \(2\).

В пятом наборе входных данных все возможные вершины, которые может выбрать Чирно на первом ходу — это \(3,4,6,7\) и \(10\).

D. Игра с треугольниками

Бинарный поиск геометрия жадные алгоритмы математика Перебор реализация Структуры данных Тернарный поиск *2000

Даже маленькому Джону нужны деньги, чтобы купить дом. Но он недавно потерял работу; как же он теперь заработает деньги? Конечно, играя в игру, которая дает ему деньги в качестве награды! Ну, может быть, не в те игры, о которых вы думаете.

На плоскости есть \(n+m\) различных точек \((a_1,0), (a_2,0), \ldots, (a_{n},0), (b_1,2), (b_2,2), \ldots, (b_{m},2)\). Изначально ваш счет равен \(0\). Чтобы увеличить свой счет, вы можете выполнить следующую операцию:

  • Выберите три различные точки, которые не лежат на одной прямой.
  • Увеличьте свой счет на площадь треугольника, образованного этими тремя точками.
  • Затем удалите три точки с плоскости.
Пример игры, где операция выполняется дважды.

Пусть \(k_{\max}\) — максимальное количество операций, которое можно выполнить. Например, если нельзя выполнить эту операцию ни разу, то \(k_\max\) равно \(0\). Кроме того, определим \(f(k)\) как максимальный возможный счет, который можно получить, выполнив операцию ровно \(k\) раз. Здесь \(f(k)\) определено для всех целых чисел \(k\), таких что \(0 \le k \le k_{\max}\).

Найдите значение \(k_{\max}\) и найдите значения \(f(x)\) для всех целых чисел \(x=1,2,\ldots,k_{\max}\) независимо.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le {3 \cdot 10^4}\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит два целых числа \(n\) и \(m\) (\(1 \le n,m \le 2 \cdot 10^5\)).

Вторая строка каждого набора входных данных содержит \(n\) попарно различных целых чисел \(a_1,a_2,\ldots,a_{n}\) — точки на \(y=0\) (\(-10^9 \le a_i \le 10^9\)).

Третья строка каждого набора входных данных содержит \(m\) попарно различных целых чисел \(b_1,b_2,\ldots,b_{m}\) — точки на \(y=2\) (\(-10^9 \le b_i \le 10^9\)).

Гарантируется, что сумма \(n\) и сумма \(m\) по всем наборам входных данных не превышают \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных, учитывая, что максимальное количество операций равно \(k_{\max}\), вы должны вывести не более двух строк:

  • Первая строка содержит значение \(k_{\max}\);
  • Вторая строка содержит \(k_{\max}\) целых числа, обозначающих \(f(1),f(2),\ldots,f(k_{\max})\). Вы можете опустить эту строку, если \(k_{\max}\) равно \(0\).

Обратите внимание, что в условиях этой задачи можно показать, что все значения \(f(x)\) являются целыми числами, не превышающими \(10^{16}\).

Примечание

В первом наборе входных данных есть \(1+3=4\) точки \((0,0),(0,2),(1,2),(-1,2)\).

Можно показать, что вы не можете выполнить две или более операций. Значение \(k_{\max}\) равно \(1\), и вас просят только о значении \(f(1)\).

Вы можете выбрать \((0,0)\), \((-1,2)\) и \((1,2)\) в качестве трех вершин треугольника. После этого ваш счет увеличивается на площадь треугольника, которая равна \(2\). Затем три точки удаляются с плоскости. Можно показать, что максимальное значение вашего счета после выполнения одной операции равно \(2\). Следовательно, значение \(f(1)\) равно \(2\).

В пятом наборе входных данных есть \(8+2=10\) точек.

Можно показать, что вы не можете выполнить три или более операций. Значение \(k_{\max}\) равно \(2\), и вас просят о значениях \(f(1)\) и \(f(2)\).

Чтобы максимизировать счет с помощью только одной операции, вы можете выбрать три точки \((198\,872\,582,0)\), \((-1\,000\,000\,000,2)\) и \((1\,000\,000\,000,2)\). Затем три точки удаляются с плоскости. Можно показать, что максимальное значение вашего счета после выполнения одной операции равно \(2\,000\,000\,000\). Следовательно, значение \(f(1)\) равно \(2\,000\,000\,000\).

Чтобы максимизировать счет с помощью ровно двух операций, вы можете выбрать следующую последовательность операций.

  • Выберите три точки \((-509\,489\,796,0)\), \((553\,177\,666,0)\) и \((-1\,000\,000\,000,2)\). Три точки удаляются.
  • Выберите три точки \((-400\,714\,529,0)\), \((564\,040\,265,0)\) и \((1\,000\,000\,000,2)\). Три точки удаляются.

Тогда счет после двух операций становится \(2\,027\,422\,256\). Можно показать, что максимальное значение вашего счета после выполнения ровно двух операций равно \(2\,027\,422\,256\). Следовательно, значение \(f(2)\) равно \(2\,027\,422\,256\).

F1. Считать не весело (Простая версия)

графы Деревья дп Комбинаторика математика поиск в глубину и подобное реализация снм Структуры данных хэши *2400

Это простая версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\) и \(n\) меньше. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Теперь Маленький Джон богат, и поэтому он наконец-то покупает дом, достаточно большой, чтобы вместить его и его любимую скобочную последовательность. Но каким-то образом он оказался с большим количеством скобок! Разочарованный, он пробивает потолок с помощью «ладони Будды».

Скобочная последовательность называется правильной, если она может быть построена по следующей формальной грамматике:

  1. Пустая последовательность \(\varnothing\) сбалансирована.
  2. Если скобочная последовательность \(A\) правильная, то \(\mathtt{(}A\mathtt{)}\) также является правильной.
  3. Если скобочные последовательности \(A\) и \(B\) правильные, то и их конкатенированная последовательность \(A B\) также правильная.

Например, последовательности «(())()», «()», «(()(()))» и пустая последовательность являются правильными, в то время как «(()» и «(()))(» — нет.

Дана правильная скобочная последовательность \(s\), пара индексов \((i,j)\) (\(i<j\)) называется хорошей, если \(s_i\) — это «(», а \(s_j\) — это «)», и две скобки добавляются одновременно в соответствии с правилом 2 при построении последовательности \(s\). Например, последовательность «(())()» имеет три разные хорошие пары: \((1,4)\), \((2,3)\) и \((5,6)\). Можно показать, что любая правильная скобочная последовательность из \(2n\) скобок содержит ровно \(n\) различных пар скобок, и использование любого порядка правил для построения одной и той же последовательности скобок приведет к одному и тому же набору пар скобок.

Эмили будет играть в игру по угадыванию скобок с Джоном. Игра проходит следующим образом.

Изначально у Джона есть правильная скобочная последовательность \(s\), содержащая \(n\) различных пар скобок, которая не известна Эмили. Джон говорит Эмили значение \(n\) и просит Эмили угадать последовательность.

На протяжении \(n\) ходов Джон дает Эмили следующие подсказки на каждом ходе:

  • \(l\;r\): Последовательность \(s\) содержит пару скобок \((l,r)\).

Гарантируется, что подсказки, которые Джон дает Эмили, попарно различны и не противоречат друг другу.

В какой-то момент Эмили может быть уверена, что правильная скобочная последовательность, удовлетворяющая подсказкам, данным до сих пор, уникальна. Например, предположим, что Эмили знает, что \(s\) имеет \(3\) хорошие пары, и она содержит пару скобок \((2,5)\). Из \(5\) правильных скобочных последовательностей с \(3\) хорошими парами существует только одна такая последовательность «((()))» с парой скобок \((2,5)\). Следовательно, можно увидеть, что Эмили не всегда нужно \(n\) ходов, чтобы угадать \(s\).

Чтобы как можно раньше узнать содержимое \(s\), Эмили хочет знать количество различных правильных скобочных последовательностей, которые соответствуют подсказкам после каждого хода. Конечно, это не легкая задача для Эмили, особенно когда ей дано настолько много хороших пар. Теперь ваша очередь помочь Эмили. Учитывая подсказки, вы должны найти ответ до всех ходов и после каждого хода. Поскольку ответы могут быть огромными, вам нужно найти их по модулю \(998\,244\,353\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^3\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора содержит одно целое число \(n\) (\(2 \le n \le 5000\)) — количество хороших пар.

Затем каждая из следующих \(n\) строк содержит два целых числа \(l_i\) и \(r_i\), представляющих \(i\)-ю подсказку (\(1 \le l_i < r_i \le 2n\)).

Подсказки в одном наборе входных данных попарно различны и не противоречат друг другу.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(5000\).

Выходные данные

Для каждого набора выведите \(n+1\) целых числа в одной строке:

  • Первое целое число — это ответ до всех подсказок, по модулю \(998\,244\,353\).
  • Для всех \(i \ge 1\), \(i+1\)-е целое число — это ответ после \(i\)-й подсказки, по модулю \(998\,244\,353\).
Примечание

Первый пример из примера объясняется в описании задачи.

Третий пример из примера объясняется следующим образом.

Можно показать, что существует \(132\) сбалансированных последовательностей скобок с \(6\) парами скобок. Ответы после каждой подсказки следующие:

  1. Вам дана хорошая пара \((2,3)\). Существует \(42\) правильных скобочных последовательностей, имеющих хорошую пару \((2,3)\).
  2. Вам дана хорошая пара \((1,6)\). Существует \(5\) правильных скобочных последовательностей, имеющих хорошие пары \((2,3)\), \((1,6)\).
  3. Вам дана хорошая пара \((7,8)\). Существуют \(2\) правильных скобочных последовательностей, имеющих три хорошие пары. Это строки «(()())()(())» и «(()())()()()», соответственно.
  4. Вам дана хорошая пара \((9,12)\). Существует только одна правильная скобочная последовательность, содержащая четыре хорошие пары. Таким образом, содержимое \(s\) имеет вид «(()())()(())».

Тогда количество правильных скобочных последовательностей после пятой и шестой подсказки равно \(1\), поскольку вы уже знаете содержимое \(s\).

F2. Считать не весело (Сложная версия)

графы Деревья Комбинаторика поиск в глубину и подобное реализация снм Структуры данных *2700

Это сложная версия задачи. Отличие между версиями заключается в том, что в этой версии ограничения на \(t\) и \(n\) больше. Вы можете делать взломы только в том случае, если решили все версии этой задачи.

Теперь Маленький Джон богат, и поэтому он наконец-то покупает дом, достаточно большой, чтобы вместить его и его любимую скобочную последовательность. Но каким-то образом он оказался с большим количеством скобок! Разочарованный, он пробивает потолок с помощью «ладони Будды».

Скобочная последовательность называется правильной, если она может быть построена по следующей формальной грамматике:

  1. Пустая последовательность \(\varnothing\) сбалансирована.
  2. Если скобочная последовательность \(A\) правильная, то \(\mathtt{(}A\mathtt{)}\) также является правильной.
  3. Если скобочные последовательности \(A\) и \(B\) правильные, то и их конкатенированная последовательность \(A B\) также правильная.

Например, последовательности «(())()», «()», «(()(()))» и пустая последовательность являются правильными, в то время как «(()» и «(()))(» — нет.

Дана правильная скобочная последовательность \(s\), пара индексов \((i,j)\) (\(i<j\)) называется хорошей, если \(s_i\) — это «(», а \(s_j\) — это «)», и две скобки добавляются одновременно в соответствии с правилом 2 при построении последовательности \(s\). Например, последовательность «(())()» имеет три разные хорошие пары: \((1,4)\), \((2,3)\) и \((5,6)\). Можно показать, что любая правильная скобочная последовательность из \(2n\) скобок содержит ровно \(n\) различных пар скобок, и использование любого порядка правил для построения одной и той же последовательности скобок приведет к одному и тому же набору пар скобок.

Эмили будет играть в игру по угадыванию скобок с Джоном. Игра проходит следующим образом.

Изначально у Джона есть правильная скобочная последовательность \(s\), содержащая \(n\) различных пар скобок, которая не известна Эмили. Джон говорит Эмили значение \(n\) и просит Эмили угадать последовательность.

На протяжении \(n\) ходов Джон дает Эмили следующие подсказки на каждом ходе:

  • \(l\;r\): Последовательность \(s\) содержит пару скобок \((l,r)\).

Гарантируется, что подсказки, которые Джон дает Эмили, попарно различны и не противоречат друг другу.

В какой-то момент Эмили может быть уверена, что правильная скобочная последовательность, удовлетворяющая подсказкам, данным до сих пор, уникальна. Например, предположим, что Эмили знает, что \(s\) имеет \(3\) хорошие пары, и она содержит пару скобок \((2,5)\). Из \(5\) правильных скобочных последовательностей с \(3\) хорошими парами существует только одна такая последовательность «((()))» с парой скобок \((2,5)\). Следовательно, можно увидеть, что Эмили не всегда нужно \(n\) ходов, чтобы угадать \(s\).

Чтобы как можно раньше узнать содержимое \(s\), Эмили хочет знать количество различных правильных скобочных последовательностей, которые соответствуют подсказкам после каждого хода. Конечно, это не легкая задача для Эмили, особенно когда ей дано настолько много хороших пар. Теперь ваша очередь помочь Эмили. Учитывая подсказки, вы должны найти ответ до всех ходов и после каждого хода. Поскольку ответы могут быть огромными, вам нужно найти их по модулю \(998\,244\,353\).

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(2 \le n \le 3 \cdot 10^5\)) — количество хороших пар.

Затем каждая из следующих \(n\) строк содержит два целых числа \(l_i\) и \(r_i\), представляющих \(i\)-ю подсказку (\(1 \le l_i < r_i \le 2n\)).

Подсказки в одном наборе входных данных попарно различны и не противоречат друг другу.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(3 \cdot 10^5\).

Выходные данные

Для каждого набора выведите \(n+1\) целых числа в одной строке:

  • Первое целое число — это ответ до всех подсказок, по модулю \(998\,244\,353\).
  • Для всех \(i \ge 1\), \(i+1\)-е целое число — это ответ после \(i\)-й подсказки, по модулю \(998\,244\,353\).
Примечание

Первый пример из примера объясняется в описании задачи.

Третий пример из примера объясняется следующим образом.

Можно показать, что существует \(132\) сбалансированных последовательностей скобок с \(6\) парами скобок. Ответы после каждой подсказки следующие:

  1. Вам дана хорошая пара \((2,3)\). Существует \(42\) правильных скобочных последовательностей, имеющих хорошую пару \((2,3)\).
  2. Вам дана хорошая пара \((1,6)\). Существует \(5\) правильных скобочных последовательностей, имеющих хорошие пары \((2,3)\), \((1,6)\).
  3. Вам дана хорошая пара \((7,8)\). Существуют \(2\) правильных скобочных последовательностей, имеющих три хорошие пары. Это строки «(()())()(())» и «(()())()()()», соответственно.
  4. Вам дана хорошая пара \((9,12)\). Существует только одна правильная скобочная последовательность, содержащая четыре хорошие пары. Таким образом, содержимое \(s\) имеет вид «(()())()(())».

Тогда количество правильных скобочных последовательностей после пятой и шестой подсказки равно \(1\), поскольку вы уже знаете содержимое \(s\).

A. Скибидус и Амог'у

жадные алгоритмы Конструктив Перебор реализация Строки *800

Скибидус приземляется на чужой планете, где местное племя Амог говорит на языке Амог'у. В Амог'у существуют две формы существительных: единственное и множественное.

Учитывая, что корень существительного записывается как \(S\), две формы записываются следующим образом:

  • Единственное: \(S\) \(+\) «us»
  • Множественное: \(S\) \(+\) «i»

Здесь \(+\) обозначает конкатенацию строк. Например, abc \(+\) def \(=\) abcdef.

Например, когда \(S\) записывается как «amog», то форма единственного числа записывается как «amogus», а форма множественного числа записывается как «amogi». Обратите внимание, что существительные Амог'у могут иметь пустой корень — в частности, «us» является формой единственного числа для «i».

Дано существительное Амог'у в форме единственного числа, пожалуйста, преобразуйте его в соответствующее существительное во множественном числе.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 100\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Единственная строка каждого набора входных данных содержит строку \(W\), которая является существительным Амог'у в единственном числе. Гарантируется, что \(W\) состоит только из строчных английских букв, имеет длину не более \(10\) и заканчивается на «us».

Выходные данные

Для каждого набора входных данных выведите соответствующее существительное во множественном числе на отдельной строке.

A. Идентификация объектов

графы жадные алгоритмы интерактив реализация *1400

Это интерактивная задача.

Вам дан массив \(x_1, \ldots, x_n\) из чисел от \(1\) до \(n\). Также у жюри есть заранее фиксированный, но скрытый от вас массив \(y_1, \ldots, y_n\) из чисел от \(1\) до \(n\). Элементы массива \(y\) вам неизвестны. Дополнительно известно, что для всех \(i\) выполнено \(x_i \neq y_i\), а также все пары \((x_i, y_i)\) различны.

Жюри загадало один из двух объектов, вам нужно угадать, какой именно:

  • Объект A: Ориентированный граф на \(n\) вершинах с номерами от \(1\) до \(n\), и с \(n\) рёбрами вида \(x_i \to y_i\).
  • Объект B: \(n\) точек на координатной плоскости. \(i\)-я точка имеет координаты \((x_i, y_i)\).

Чтобы отгадать, какой объект загадало жюри, вы можете делать запросы. В одном запросе вы должны задать два числа \(i, j\) \((1 \leq i, j \leq n, i \neq j)\). В ответ вам будет возвращено одно число:

  • Если жюри загадало Объект A, вам вернут длину кратчайшего пути (в рёбрах) от вершины \(i\) до вершины \(j\) в графе, или же \(0\), если пути нет.
  • Если жюри загадало Объект B, вам вернут Манхэттенское расстояние между точками \(i\) и \(j\), то есть: \(|x_i -x_j| + |y_i - y_j|\)

У вас есть \(2\) запроса, чтобы определить, какой из объектов загадало жюри.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Протокол взаимодействия

Взаимодействие начинается со считывания \(n\) (\(3 \leq n \leq 2 \cdot 10^5\)) — длина массива \(x\) и \(y\), в начале каждого набора входных данных.

Далее, в следующей строке считайте \(n\) целых чисел: \(x_1, x_2, \ldots, x_n\) (\(1 \leq x_i \leq n\)) — элементы массива \(x\).

Массив \(y_1, y_2, \ldots, y_n\) фиксирован для каждого теста. Иными словами, интерактор не адаптивен.

Гарантируется, что \(x_i \neq y_i\) для всех \(1 \leq i \leq n\), а также все пары \((x_i, y_i)\) различны.

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Чтобы задать запрос, выведите «? \(i\) \(j\)» (без кавычек, \(1 \le i, j \le n, i \neq j\)). Затем вы должны считать ответ на запрос, который является целым неотрицательным числом.

Чтобы дать ответ, выведите «! A», если загадан Объект A или «! B» если загадан Объект B (вывод без кавычек). Заметьте, что вывод ответа не считается одним из \(2\) запросов.

После вывода каждого запроса не забудьте вывести перевод строки и сбросить буфер вывода\(^{\text{∗}}\). В противном случае вы получите вердикт Решение «зависло». На любом шаге взаимодействия, если вы считали \(-1\) вместо корректных данных, ваше решение должно немедленно завершиться. Это означает, что ваше решение получит вердикт Неправильный ответ из-за некорректного запроса или любой другой ошибки. Если программа не завершится, вы можете получить любой вердикт, так как ваша программа продолжит чтение из закрытого потока. Обратите внимание, что если запрос корректный, ответ на него никогда не будет равен \(-1\).

Взломы

Первая строка должна содержать целое число \(t\) (\(1 \le t \le 1000\)) — количество наборов входных данных.

Первая строка каждого набора входных данных должна содержать целое число \(n\) (\(3 \le n \le 2 \cdot 10^5\)) — длину загаданного массива.

Вторая строка каждого набора должна содержать \(n\) целых чисел — \(x_1, x_2, \ldots, x_n\) (\(1 \le x_i \le n\)).

Третья строка каждого набора должна содержать \(n\) целых чисел — \(y_1, y_2, \ldots, y_n\) (\(1 \le y_i \le n\)).

Необходимо, чтобы \(x_i \neq y_i\) для всех \(1 \le i \le n\), а также все пары \((x_i, y_i)\) должны быть различны.

В четвёртой строке должен содержаться один символ: A или B, обозначающий, какой из объектов вы хотите загадать.

Сумма \(n\) по всем наборам не должна превосходить \(2 \cdot 10^5\).

\(^{\text{∗}}\)Чтобы сбросить буфер вывода, используйте:

  • fflush(stdout) или cout.flush() в C++;
  • sys.stdout.flush() в Python;
  • смотрите документацию для других языков.
Примечание

В первом наборе входных данных \(x = [2,2,3]\), \(y = [1,3,1]\) и загадан Объект A.

Во втором наборе входных данных \(x = [5,1,4,2,3]\), \(y = [3,3,2,4,1]\) и загадан объект B.

B. Белая магия

дп жадные алгоритмы Конструктив реализация Структуры данных *1900

Назовём последовательность чисел \(a_1, a_2, \ldots, a_n\) магической, если для всех \(1 \leq i \leq n-1\) верно, что: \(\operatorname{min}(a_1, \ldots, a_i) \geq \operatorname{mex}(a_{i+1}, \ldots, a_n)\). В частности, любая последовательность длины \(1\) является магической.

Наименьшее исключенное (MEX) набора чисел \(a_1, a_2, \ldots, a_k\) определяется как наименьшее неотрицательное целое число \(t\), которое не встречается в наборе чисел \(a\).

Вам дана последовательность \(a\) из \(n\) целых неотрицательных чисел. Найдите максимально возможную длину магической подпоследовательности\(^{\text{∗}}\) последовательности \(a\).

\(^{\text{∗}}\)Последовательность \(a\) является подпоследовательностью \(b\), если \(a\) может быть получена из \(b\) удалением нескольких (возможно, ни одного или всех) элементов на произвольных позициях.

Входные данные

Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число \(t\) (\(1 \le t \le 10^4\)) — количество наборов входных данных. Далее следует описание наборов входных данных.

Первая строка каждого набора входных данных содержит целое число \(n\) (\(1 \leq n \leq 2 \cdot 10^5\)) — длину последовательности \(a\).

Вторая строка каждого набора входных данных содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(0 \leq a_i \leq 10^9\)) — элементы последовательности \(a\).

Гарантируется, что сумма \(n\) по всем наборам входных данных не превышает \(2 \cdot 10^5\).

Выходные данные

Для каждого набора входных данных выведите одно число — максимально возможную длину магической подпоследовательности последовательности \(a\).

Примечание

В первом наборе входных данных сама последовательность \([4, 3, 2, 1, 0]\) является магической, так как:

  • \(\operatorname{min}(4) = 4, \operatorname{mex}(3, 2, 1, 0) = 4\). \(4 \geq 4\)
  • \(\operatorname{min}(4, 3) = 3, \operatorname{mex}(2, 1, 0) = 3\). \(3 \geq 3\)
  • \(\operatorname{min}(4, 3, 2) = 2, \operatorname{mex}(1, 0) = 2\). \(2 \geq 2\)
  • \(\operatorname{min}(4, 3, 2, 1) = 1, \operatorname{mex}(0) = 1\). \(1 \geq 1\)

Во втором наборе входных данных последовательность \([4, 3, 3, 2, 1, 0]\) не является магической, так как \(\operatorname{min}(4, 3) = 3, \operatorname{mex}(3, 2, 1, 0) = 4\), \(3 < 4\). Но подпоследовательность \([4, 3, 2, 1, 0]\) этой последовательности является магической, поэтому ответ \(5\).

E. Тропический сезон

Бинарный поиск жадные алгоритмы реализация Структуры данных *3300

Перед вами находятся \(n\) бочек бесконечной вместимости. В \(i\)-й бочке изначально находится \(a_i\) килограмм воды. В этой задаче мы считаем, что все бочки сами по себе весят одинаково.

Вам известно, что на поверхности ровно одной из бочек распределено небольшое количество тропического яда, общий вес нанесённого яда составляет \(0.179\) килограмм. Но вы не знаете, на какой именно бочке находится яд. Ваша задача определить эту ядовитую бочку.

Все бочки стоят на весах. К сожалению, весы не показывают точный вес каждой из бочек. Вместо этого, для каждой пары бочек они показывают результат сравнения между весами этих бочек. Таким образом, для любых двух бочек вы можете определить, совпадают ли их веса, а если нет, вес какой из бочек больше. Яд и вода учитываются в весе бочки.

Весы работают постоянно, и информацию с них можно использовать в неограниченном количестве.

Также вам доступны переливания. Вы можете переливать воду из любой бочки в любую другую в любых количествах.

Но для переливания вам надо взять в руки бочку, из которой вы будете переливать, поэтому если это окажется ядовитая бочка, вы умрёте. Такого исхода допустить нельзя.

Однако в ядовитую бочку наливать воду можно, её вы не касаетесь.

Другими словами, вы можете выбрать числа \(i, j, x\) (\(i \neq j, 1 \leq i, j \leq n, 0 < x \leq a_i\), бочка под номером \(i\) не является ядовитой) и выполнить \(a_i := a_i - x\), \(a_j := a_j + x\). Где \(x\) не обязательно является целым числом.

Возможно ли гарантированно определить, в какой из бочек яд, и остаться живым, используя переливания и информацию с весов? Вам известно, что яд находится ровно на одной из бочек.

Также мы просим вас обработать \(q\) запросов. В каждом запросе либо удаляется одна из имеющихся бочек, либо добавляется дополнительная бочка с каким-то количеством воды. После каждого запроса надо ответить, возможно ли гарантированно определить ядовитую бочку, если известно, что она ровно одна?

Входные данные

Первая строка содержит два целых числа \(n\) и \(q\) (\(1 \le n, q \le 2 \cdot 10^5\)).

Вторая строка содержит \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le 10^6\)) — объёмы воды в имеющихся бочках.

В следующих \(q\) строках вводятся запросы, по одному в строке. Каждый запрос имеет вид, либо + x, либо - x, что означает, соответственно, добавление и удаление бочки с \(x\) килограммами воды. Гарантируется, что при запросе - x одна из имеющихся бочек имеет объём \(x\), а также, что по ходу запросов всегда остаётся хотя бы одна бочка. Во всех запросах выполняется \(1 \leq x \leq 10^6\).

Выходные данные

Выведите \(q+1\) строку, ответ на задачу до всех запросов и после каждого запроса. Если возможно определить ядовитую бочку, выведите «Yes», иначе «No».

Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.

Примечание

В первом тесте, до всех запросов, веса бочек \([2, 2, 4, 11]\). Вы можете посмотреть на значение сравнения первой и второй бочки. Если результат не равенству, можно однозначно заключить, что бочка с большим весом — ядовитая. Если же результат равенству, обе бочки неядовиты. Тогда можно перелить всё содержимое первой бочки во вторую. После чего во второй и в третьей бочки будет по \(4\) килограмма воды. Посмотрим на значение сравнения второй и третьей бочки. Если результат не равенству, бочка с большим весом — ядовитая. Иначе, обе бочки не ядовитые. И единственная бочка, которая может быть ядовитой — бочка 4. Итого с такой стратегией, мы можем безопасно определить ядовитую бочку.

D. Призы, призы и еще раз призы

реализация *1200

Вася, как и многие другие люди, любит участвовать в различных розыгрышах и лотереях. Сейчас он собирает упаковки от известного шоколадного батончика «Юпитер». По условиям акции на каждой упаковке написано целое число — количество баллов, которое прибавляется к балансу участника при покупке этого батончика. Накопив некоторое количество баллов, участник акции может прийти в центр выдачи призов и обменять их на призы, при этом стоимость выбранного приза просто вычитается из баланса игрока.

Вася не только покупал батончики, но и вел записи, сколько баллов стоила каждая упаковка. Также, он помнит, что всегда придерживался жадной стратегии — как только у него появлялась возможность получить хотя бы один приз, он шел в центр выдачи и менял баллы на призы. При этом если был выбор между несколькими призами, то он выбирал самый дорогой. Если после обмена у него оставалось достаточное количество баллов для получения еще как минимум одного приза, то Вася продолжал обмен баллов.

В акции участвовали следующие призы (они отсортированы в порядке увеличения стоимости):

  • кружка (стоимость a баллов),
  • полотенце (стоимость b баллов),
  • сумка (стоимость c баллов),
  • велосипед (стоимость d баллов),
  • автомобиль (стоимость e баллов).

Теперь Вася хочет вспомнить, какие же призы он получил. Вам известна последовательность p1, p2, ..., pn, где pi означает сколько баллов получил Вася за i-ый батончик. Последовательность баллов задана в хронологическом порядке. Также вы знаете числа a, b, c, d, e. Ваша задача — найти сколько и каких призов Вася получил, а также сколько баллов у него осталось после завершения всех операций.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 50) — количество упаковок от батончиков, за которые Вася получал баллы. Во второй строке записаны целые числа p1, p2, ..., pn (1 ≤ pi ≤ 109), разделенные пробелами. В третьей строке записано 5 чисел a, b, c, d, e (1 ≤ a < b < c < d < e ≤ 109) — стоимости призов.

Выходные данные

Выведите в первую строку 5 целых чисел, разделенных пробелами — количество кружек, полотенец, сумок, велосипедов и автомобилей, которые получил Вася, соответственно. Во вторую строку выведите одно целое число — сколько баллов осталось у Васи после завершения всех операций обмена.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере после первого батончика Вася получил 3 балла и сразу же обменял 2 из них на кружку. Затем после второго батончика Вася выиграл сумку, а после третьего — полотенце. В конце у Васи осталось 3 - 2 + 10 - 10 + 4 - 4 = 1 баллов.

A. Jabber ID

реализация Строки *1900

Jabber ID на национальном берляндском сервисе «Babber» должен иметь вид <username>@<hostname>[/resource], где

  • <username> — это последовательность латинских букв любого регистра, цифр и символа подчеркивания «_», длина <username> от 1 до 16 символов.
  • <hostname> — это последовательность слов, разделенных точками (символами «.»), где каждое слово может содержать допустимые символы для <username>, длина каждого слова от 1 до 16. Длина <hostname> — от 1 до 32.
  • <resource> — это последовательность латинских букв любого регистра, цифр и символа подчеркивания «_», длина <resource> от 1 до 16 символов.

Квадратные скобки указывают на опциональность заключенного в них — содержимое квадратных скобок может присутствовать или нет.

Вот примеры корректных Jabber ID: [email protected], [email protected]/contest.

Ваша задача написать программу, которая проверяет заданную строку на соответствие описанным правилам.

Входные данные

Входной файл состоит из единственной строки длинной от 1 до 100 символов. Каждый символ имеет ASCII-код от 33 до 127.

Выходные данные

Выведите YES или NO.

B. Пересечение

математика реализация *2000

Задано два множества точек на плоскости. Первое из них задается уравнением A1x + B1y + C1 = 0, а второе — уравнением A2x + B2y + C2 = 0.

Выведите мощность пересечения двух заданных множеств.

Входные данные

В первой строке записано три целых числа через пробел A1, B1, C1. Во второй строке записано три целых числа через пробел A2, B2, C2. Все числа от -100 до 100.

Выходные данные

Выведите мощность искомого множества точек. Выведите -1, если пересечение содержит бесконечное число точек.

A. Цепная передача

Перебор реализация *900

Цепная передача Васиного велосипеда состоит из двух частей: n звездочек закреплены на оси педалей, а m звездочек — на оси заднего колеса. С помощью цепи вращение педалей передается на заднее колесо.

Известно, что i-ая звездочка на оси педалей имеет ai (0 < a1 < a2 < ... < an) зубьев, а j-ая звездочка на оси заднего колеса имеет bj (0 < b1 < b2 < ... < bm) зубьев. Любая пара (i, j) (1 ≤ i ≤ n1 ≤ j ≤ m) называется передачей и задает номера звездочек, на которых в данный момент закреплена цепь. Для передачи (i, j) передаточное число равно величине .

Так как Васе нравятся целые числа, он хочет найти такие передачи (i, j), что их передаточные числа целые. С другой стороны, Васе нравится быстрая езда, поэтому среди всех «целочисленных» передач (i, j), он хочет выбрать передачи с максимальным передаточным числом. Помогите ему найти количество таких передач.

В задаче дробь обозначает деление в вещественных числах, то есть округление не производится.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 50) — количество звездочек на оси педалей велосипеда. Во второй строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 104) в порядке строгого возрастания.

В третьей строке входных данных записано целое число m (1 ≤ m ≤ 50) — количество звездочек на оси заднего колеса. В четвертой строке записаны m целых чисел b1, b2, ..., bm (1 ≤ bi ≤ 104) в порядке строгого возрастания.

Гарантируется, что существует хотя бы одна передача (i, j), что ее передаточное число — целое. Числа в строках разделяются пробелами.

Выходные данные

Выведите количество «целочисленных» передач, которые имеют максимальное значение передаточного числа среди всех «целочисленных» передач.

Примечание

В первом примере максимальное целое передаточное число равно 3. Существуют две передачи, которые имеют такое передаточное число. Для одной из них a1 = 4, b1 = 12, а для другой a2 = 5, b3 = 15.

C. Крестики

Перебор реализация *2100

На доске нарисовано клетчатое поле из n строк и m столбцов, строки пронумерованы с 1 сверху вниз, а столбцы — с 1 слева направо. Клетку поля на пересечении строки номер i и столбца номер j будем обозначать (i, j).

Шестерку чисел (a, b, c, d, x0, y0) в которой 0 ≤ a, b, c, d назовем крестиком и сопоставим ему множество клеток (x, y) таких, что выполняется хотя бы одно из двух условий:

  • |x0 - x| ≤ a и |y0 - y| ≤ b
  • |x0 - x| ≤ c и |y0 - y| ≤ d
На рисунке изображен крестик (0, 1, 1, 0, 2, 3) на поле 3 × 4.

Ваша задача — найти количество различных шестерок чисел (a, b, c, d, x0, y0), задающих крестики площадью равной s, которые полностью помещаются на заданном поле n × m. Крестик полностью помещается на поле, если любая его клетка находится в пределах поля (то есть для любой принадлежащей крестику клетки (x, y) выполняется 1 ≤ x ≤ n; 1 ≤ y ≤ m). Площадью крестика называется количество принадлежащих ему клеток.

Обратите внимание, что два крестика считаются различными, если упорядоченные шестерки, описывающие их, различаются, даже если эти крестики совпадают как множества клеток.

Входные данные

Входные данные состоят из единственной строки, в которой записаны три целых числа n, m и s (1 ≤ n, m ≤ 500, 1 ≤ s ≤ n·m). Числа разделены пробелом.

Выходные данные

Выведите единственное целое число — количество различных шестерок, задающих крестики площадью s и полностью помещающихся на поле размером n × m.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере искомые шестерки: (0, 0, 0, 0, 1, 1), (0, 0, 0, 0, 1, 2), (0, 0, 0, 0, 2, 1), (0, 0, 0, 0, 2, 2).

Во втором примере искомые шестерки: (0, 1, 1, 0, 2, 2), (0, 1, 1, 0, 2, 3), (1, 0, 0, 1, 2, 2), (1, 0, 0, 1, 2, 3).

A. Замощение шестиугольниками

математика реализация *1200

Несколько веков назад Берляндия была королевством. Король Берляндии очень любил математику. Именно поэтому, впервые посетив один из своих многочисленных дворцов, он обратил внимание на пол одного из залов, замощенный шестиугольными плитками.

Как оказалось, зал тоже имеет форму шестиугольника. Король обошел зал по периметру и установил, что к каждой из шести сторон прилегают a, b, c, a, b и c плиток соответственно.

Чтобы лучше понять происходящее, взгляните на картинку, на которой изображен подобный шестиугольник для a = 2, b = 3 и c = 4.

По легенде, получив a, b и c, король Берляндии почти мгновенно вычислил общее количество плиток на полу зала. А вы так сможете?

Входные данные

В первой строке записано три целых числа a, b и c (2 ≤ a, b, c ≤ 1000).

Выходные данные

Выведите единственное число — общее количество плиток на полу зала.

B. Формирование команд

поиск в глубину и подобное реализация *1700

На стадион пришли n студентов. Они хотят сыграть в футбол, а для этого нужно разделиться на две команды с одинаковым количеством человек в каждой.

Известно, что в собравшейся компании имеются заклятые враги. У каждого студента имеется не более двух заклятых врагов. Причем, если студент A заклятый враг студента B, то студент B заклятый враг студента A.

Студенты хотят разделиться так, чтобы никакие два заклятых врага не оказались в одной команде. В случае, если нужным способом разделиться нельзя, некоторым студентам придется посидеть на скамейке запасных.

Определите какое наименьшее количество студентов придется отправить на скамейку запасных, чтобы можно было сформировать две команды описанным способом и матч наконец-то начался.

Входные данные

В первой строке записаны два целых числа n и m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100) — количество студентов и количество пар заклятых врагов соответственно.

В следующих m строках описаны отношения вражды между студентами. Каждое отношение вражды описывается двумя числами ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — номера враждующих студентов. Каждое из отношений вражды приведено в списке ровно один раз. Гарантируется, что у каждого студента не более двух заклятых врагов.

Можете считать, что студенты некоторым образом пронумерованы различными целыми числами от 1 до n.

Выходные данные

Выведите единственное целое число — наименьшее количество студентов, которое нужно отправить на скамейку запасных, чтобы начать матч.

A. Горный пейзаж

Конструктив Перебор реализация *1100

Маленький Болек нашел картину, на которой изображены n горных вершин. Изображение n горных вершин представляет собой незамкнутую ломаную, состоящую из 2n отрезков. Отрезки проходят через 2n + 1 точек с координатами (1, y1), (2, y2), ..., (2n + 1, y2n + 1), i-й отрезок соединяет точку (i, yi) и точку (i + 1, yi + 1). Для любого четного i (2 ≤ i ≤ 2n) выполняется yi - 1 < yi и yi > yi + 1.

Назовем вершину ломаной с четной x координатой горным пиком.

На рисунке слева изображена изначальная картина, на рисунке справа изображена картина после действий Болека. Затронутые пики помечены красным, k = 2.

Болек решил похулиганить. Он выбрал ровно k горных пиков, стер отрезки проходящие через эти пики, увеличил высоту каждого выбранного пика на единицу (то есть увеличил координату y соответствующих точек), а затем дорисовал недостающие отрезки так, чтобы получился новый рисунок горных вершин. Обозначим точки, через которые проходит новая ломаная на рисунке, который изменил Болек, через (1, r1), (2, r2), ..., (2n + 1, r2n + 1).

Вам задан полученный Болеком рисунок. Восстановите исходный рисунок.

Входные данные

В первой строке записаны два целых числа через пробел n и k (1 ≤ k ≤ n ≤ 100). В следующей строке записаны 2n + 1 целых чисел через пробел r1, r2, ..., r2n + 1 (0 ≤ ri ≤ 100)y-координаты вершин ломаной на рисунке Болека.

Гарантируется, что данный рисунок можно получить описанными действиями из некоторого рисунка горных вершин.

Выходные данные

Выведите 2n + 1 целых чисел y1, y2, ..., y2n + 1y-координаты вершин ломаной на первоначальном рисунке. Если ответов несколько выведите любой.

B. Аэропорт

реализация *1100

Лелик и Болек едут за границу на самолете. Сейчас в местном аэропорте действует акция под названием «Выбери Самолет». Условия акции таковы:

  • пассажир сам выбирает самолет, в котором он полетит;
  • пусть в выбранном самолете на данный момент x (x > 0) свободных мест, тогда билет на такой самолет стоит x злотых.

Очередь из n пассажиров уже выстроилась перед единственной билетной кассой аэропорта. Лелик и Болек еще не встали в очередь, но им уже интересно: какое максимальное и минимальное количество злотых может заработать администрация аэропорта, если все n пассажиров будут покупать билеты по этой акции?

Пассажиры покупают билеты по очереди, сначала первый в очереди, потом второй, и так далее до n-го.

Входные данные

В первой строке записано два целых числа n и m (1 ≤ n, m ≤ 1000) — количество пассажиров в очереди и количество самолетов в аэропорте соответственно. В следующей строке записано m целых чисел a1, a2, ..., am (1 ≤ ai ≤ 1000)ai обозначает количество свободных мест в i-ом самолете перед началом продажи билетов.

Числа в строках разделяются пробелами. Гарантируется, что суммарное количество свободных мест не меньше, чем n.

Выходные данные

Выведите два целых числа — максимальное и минимальное количество злотых, которое может заработать администрация аэропорта соответственно.

Примечание

В первом тестовом примере количество пассажиров равно количеству свободных мест, поэтому при любом выборе самолетов заработанная сумма будет одинаковая.

Во втором примере, чтобы максимизировать заработанную сумму 1-ый в очереди должен купить билет на 1-ый самолет, 2-ой в очереди — на 2-ой самолет, 3-ий в очереди — на 3-ий самолет, 4-ый в очереди — на 1-ый самолет. Чтобы минимизировать заработанную сумму 1-ый в очереди должен купить билет на 1-ый самолет, 2-ой в очереди — на 1-ой самолет, 3-ий в очереди — на 2-ий самолет, 4-ый в очереди — на 2-ый самолет.

A. k-Строка

реализация Строки *1000

Строка называется k-строкой, если она может быть представлена в виде k копий некоторой строки, записанных подряд. Например, строка aabaabaabaab является одновременно 1-строкой, 2-строкой и 4-строкой, но не является 3-строкой, 5-строкой, 6-строкой и так далее. Очевидно, любая строка является 1-строкой.

Вам задана строка s из строчных букв латинского алфавита и целое положительное число k. Требуется переставить буквы в строке s таким образом, чтобы результат являлся k-строкой.

Входные данные

В первой строке входных данных записано целое число k (1 ≤ k ≤ 1000). Вторая строка содержит s, все символы в s — строчные латинские буквы. Длина строки s удовлетворяет неравенству 1 ≤ |s| ≤ 1000, где |s| — длина строки s.

Выходные данные

Переупорядочите буквы в строке s так, чтобы результат являлся k-строкой. В единственную строку выходных данных выведите результат. Если решений несколько, выведите любое из них.

Если решения не существует, выведите «-1» (без кавычек).

B. Только сегодня! Супер цена 999 бурлей!

реализация *1400

Поликарп — начинающий бизнесмен. Недавно он с удивлением обнаружил, что рынок бумажных ножниц совершенно свободен! Не долго думая, Поликарп занялся производством и продажей таких ножниц.

Поликарп посчитал, что оптимальная цена для продажи таких ножниц составляет p бурлей. Однако он где-то читал, что цены вроде «Только сегодня! Супер цена 999 бурлей!» привлекают покупателей. Поэтому Поликарп решил согласиться на небольшое понижение цены, если оно приводит к описанному эффекту.

Поликарп согласен сбросить цену не более чем на d бурлей так, чтобы количество девяток на конце получившейся цены оказалось максимальным. Если существует несколько способов это сделать, он выберет максимальную из возможных цен.

Обратите внимание, что Поликарп считает только конечные девятки в цене.

Входные данные

В первой строке записаны два целых числа p и d (1 ≤ p ≤ 1018; 0 ≤ d < p) — начальная цена ножниц и максимальное возможное падение в цене.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Выведите искомую цену — максимальную из цен, которые заканчиваются на наибольшее количество девяток и не более чем на d меньше p.

Выводимое значение не должно содержать лидирующих нулей.

A. Маленький Слоник и проблема

реализация сортировки *1300

У Маленького Слоника проблема — кто-то трогал его отсортированный по неубыванию массив a длины n и, возможно, поменял некоторые элементы этого массива местами.

Маленький Слоник не хочет звонить в полицию до тех пор пока не поймет, мог ли он сам случайно изменить массив. Он считает, что мог случайно изменить массив a, только если массив a можно отсортировать за не больше чем одну операцию обмена элементов массива (не обязательно соседних). То есть Маленький Слоник мог случайно поменять местами два каких-то элемента массива.

Помогите Маленькому Слонику, определите, мог ли он сам случайно изменить отсортированный по неубыванию массив a.

Входные данные

В первой строке задано единственное целое число n (2 ≤ n ≤ 105) — размер массива a. В следующей строке заданы n целых положительных чисел, разделенных единичными пробелами и не превосходящих 109, — массив a.

Обратите внимание, что элементы массива не обязательно различные числа.

Выходные данные

В единственной строке выведите «YES» (без кавычек), если Маленький Слоник мог сам случайно изменить массив, и «NO» (без кавычек) в противоположном случае.

Примечание

В первом примере массив уже отсортирован, поэтому для его сортировки требуется 0 операций обмена, что не больше чем 1. Таким образом ответ «YES».

Во втором примере массив можно отсортировать, поменяв элементы 1 и 3 местами, поэтому для его сортировки требуется 1 операция обмена. Таким образом ответ «YES».

В третьем примере массив нельзя отсортировать за не более чем одну операцию обмена, поэтому ответ «NO».

A. Маленький Слоник и функция

математика реализация *1000

Маленький Слоник увлекается рекурсивными функциями.

В этот раз это функция сортировки. Пусть есть перестановка a из целых чисел от 1 до n, включительно. Через ai обозначим i-ое число перестановки. Тогда рекурсивная функция Маленького Слоника f(x) для сортировки первых x чисел перестановки работает следующим образом:

  • Если x = 1, то прекратить выполнение функции.
  • Иначе, вызвать f(x - 1), а после этого сделать swap(ax - 1, ax) (поменять местами x-ое и (x - 1)-ое числа перестановки a).

Преподаватель Маленького Слоника считает, что такая функция работает не корректно. Но, что-бы не получить двойку, Маленький Слоник хочет каким-то образом показать работоспособность его функции. Помогите ему — найдите такую перестановку чисел от 1 до n, включительно, что, после выполнения функции Маленького Слоника (а именно вызова f(n)), перестановка будет отсортирована по возрастанию.

Входные данные

В единственной строке записано целое число n (1 ≤ n ≤ 103) — размер перестановки.

Выходные данные

В единственную строку выведите n различных чисел от 1 до n — искомая перестановка. Числа в строке разделяйте пробелами.

Гарантируется, что ответ существует.

B. Маленький Слоник и числа

реализация *1300

Маленький Слоник любит числа.

У него есть целое положительное число x. Маленький Слоник хочет найти количество положительных целых чисел d таких, что d является делителем x, а также x и d имеют хотя-бы одну общую цифру (одинаковую) в десятичном представлении.

Помогите Маленькому Слонику найти описанное количество.

Входные данные

В единственной строке записано целое число x (1 ≤ x ≤ 109).

Выходные данные

В единственную строку выведите целое число — ответ на задачу.

A. Шушанчики и последовательность

Перебор реализация *1200

Однажды шушанчики нашли последовательность из n целых чисел, записанную на доске. Шушанчики умеют выполнять с ней одну операцию, которая состоит из двух шагов:

  1. Дописать в конец последовательности число, равное k-му от начала числу в текущей последовательности;
  2. Стереть первое число текущей последовательности.

Шушанчиков очень заинтересовал вопрос: через сколько операций все числа на доске станут одинаковыми, и станут ли они одинаковыми когда-нибудь вообще.

Входные данные

В первой строке записаны два целых числа через пробел n и k (1 ≤ k ≤ n ≤ 105).

Во второй строке записаны n целых чисел через пробел: a1, a2, ..., an (1 ≤ ai ≤ 105) — найденная последовательность.

Выходные данные

Выведите минимальное число операций, требуемых, чтобы все числа на доске стали одинаковыми, или -1, если этого невозможно добиться.

Примечание

В первом тестовом примере после первой операции на доске будет записана последовательность [1, 1, 1]. Значит одной операции достаточно, чтобы все числа стали одинаковые. Таким образом ответ равен единице.

Во втором тестовом примере последовательность никогда не будет состоять из одинаковых чисел. В ней всегда будут содержаться как минимум два различных числа 3 и 1. Таким образом ответ равен -1.

B. Космические таблицы

реализация Структуры данных *1300

У Ассоциации Свободных Метеоров (АСМ) возникла проблема: поскольку метеоры движутся, во Вселенско-Космическую Описательную Шуточную Программу (ВКОШП) необходимо добавить специальный модуль, обрабатывающий это движение.

ВКОШП хранит некоторую секретную информацию о метеорах в виде таблицы n × m, в ячейках которой находятся целые числа. В связи со сменой порядка метеоров во Вселенной в главный модуль ВКОШП поступают следующие запросы:

  • Запрос на обмен местами двух строк таблицы;
  • Запрос на обмен местами двух столбцов таблицы;
  • Запрос на получение секретного числа в определенной клетке таблицы.

Поскольку главный модуль ВКОШП является критичным, то написание функционала работы с таблицей решили поручить вам.

Входные данные

В первой строке через пробел записаны три целых числа n, m и k (1 ≤ n, m ≤ 1000, 1 ≤ k ≤ 500000) — количество строк, столбцов таблицы и количество запросов соответственно.

В следующих n строках записаны по m чисел через пробел — изначальное состояние таблицы. Каждое число p в таблице целое и удовлетворяет неравенству 0 ≤ p ≤ 106.

В следующих k строках записаны запросы в формате «si xi yi», где si — один из символов «с», «r» или «g», а xi, yi — два целых числа.

  • Если si = «c», то текущий запрос — запрос на обмен столбцов с номерами xi и yi местами (1 ≤ x, y ≤ m, x ≠ y);
  • Если si = «r», то текущий запрос — запрос на обмен строк с номерами xi и yi местами (1 ≤ x, y ≤ n, x ≠ y);
  • Если si = «g», то текущий запрос — запрос на получение числа, стоящего в xi-ой строке в yi-ом столбце (1 ≤ x ≤ n, 1 ≤ y ≤ m).

Считайте, что строки таблицы нумеруются сверху вниз от 1 до n, а столбцы слева направо от 1 до m.

Выходные данные

Для каждого запроса на получение числа (si = «g») выведите требуемое число. Ответы на запросы выводите в том порядке, в котором запросы заданы во входных данных.

Примечание

Давайте посмотрим, как изменяется таблица во втором тестовом примере.

После выполнения первой операции таблица примет следующий вид:

2 1 4

1 3 5

После выполнения второй операции она примет такой вид:

1 3 5

2 1 4

На третий запрос (какое число стоит в первом ряду в третьем столбце) ответом будет 5.

C. Сокращение дробей

математика реализация сортировки теория чисел *1800

Для запутывания противников Галактическая Империя использует особый формат представления дробей. Дроби представлены как два набора целых чисел. Произведение чисел из первого набора дает числитель дроби, из второго — знаменатель дроби. Однако, обнаружилось, что программы для работы с дробями в таком представлении неполны, в них отсутствует поддержка операции сокращения дробей. Реализуйте эту операцию, и Империя не забудет вас.

Входные данные

В первой строке входного файла через пробел записаны два целых числа n, m (1 ≤ n, m ≤ 105) — количество чисел в первом наборе (числитель) и во втором наборе (знаменатель) соответственно.

Во второй строке записаны n целых чисел через пробел: a1, a2, ..., an (1 ≤ ai ≤ 107) — числа, произведение которых дает числитель.

В третьей строке записаны m целых чисел через пробел: b1, b2, ..., bm (1 ≤ bi ≤ 107) — числа, произведение которых дает знаменатель.

Выходные данные

Выведите ответ на задачу в формате аналогичном формату входных данных. Количества чисел в выводимых наборах nout, mout должны удовлетворять неравенству 1 ≤ nout, mout ≤ 105, а сами числа в наборах aout, i и bout, i — неравенству 1 ≤ aout, i, bout, i ≤ 107.

Числа в строках разделяйте пробельными символами. Выведенная дробь должна быть сокращена, то есть не должно существовать такого целого x (x > 1), что числитель и знаменатель выведенной дроби делятся на x. Если подходящих ответов несколько — выведите любой.

Примечание

В первом тестовом примере числитель равен 1000, знаменатель — 500. Если сократить дробь 1000/500 на наибольший общий делитель числителя и знаменателя (на 500), получается дробь 2/1.

Во втором тестовом примере числитель равен 2000, знаменатель — 300. Если сократить дробь 2000/300 на наибольший общий делитель числителя и знаменателя (на 100), получается дробь 20/3.

A. Скобочная последовательность

Разбор выражений реализация Структуры данных *1700

Скобочной последовательностью называется строка, состоящая только из символов «(», «)», «[» и «]».

Правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов «1» и «+». Например, скобочные последовательности «()[]», «([])» — правильные (полученные выражения: «(1)+[1]», «([1+1]+1)»), а «](» и «[» — нет. Пустая строка является правильной скобочной последовательностью по определению.

Подстрокой s[l... r] (1 ≤ l ≤ r ≤ |s|) строки s = s1s2... s|s| (где |s| — длина строки s) называется строка slsl + 1... sr. Пустая подстрока по определению считается подстрокой любой строки.

Вам дана не обязательно правильная скобочная последовательность. Найдите ее подстроку, которая является правильной скобочной последовательностью и при этом содержит как можно больше скобок «[».

Входные данные

В первой и единственной строке записана скобочная последовательность — строка, состоящая только из символов «(», «)», «[» и «]». Гарантируется, что строка непустая и ее длина не превышает 105 символов.

Выходные данные

В первой строке выведите единственное целое число — количество скобок «[» в оптимальной подстроке. Во второй строке выведите саму подстроку. Если существует несколько оптимальных подстрок выведите любую.

B. Массив

битмаски реализация *1500

Задан массив a, состоящий из n целых чисел: a1, a2, ..., an. Требуется найти минимальный по включению отрезок [l, r] (1 ≤ l ≤ r ≤ n) такой, что среди чисел al,  al + 1,  ...,  ar ровно k различных чисел.

Отрезок [l, r] (1 ≤ l ≤ r ≤ n; l, r — целые) длины m = r - l + 1, удовлетворяющий заданному свойству, называется минимальным по включению, если не существует удовлетворяющего этому свойству отрезка [x, y] длины меньшей m такого, что 1 ≤ l ≤ x ≤ y ≤ r ≤ n. Обратите внимание, что отрезок [l, r] не обязан быть минимальным по длине среди всех отрезков удовлетворяющих заданному свойству.

Входные данные

В первой строке через пробел записаны два целых числа: n и k (1 ≤ n, k ≤ 105). Во второй строке через пробел записаны n целых чисел a1, a2, ..., an — элементы массива a (1 ≤ ai ≤ 105).

Выходные данные

Выведите через пробел пару целых чисел l и r (1 ≤ l ≤ r ≤ n) такую, что отрезок [l, r] является ответом на задачу. Если искомого отрезка не существует, выведите «-1 -1» без кавычек. Если правильных ответов несколько, выведите любой.

Примечание

В первом примере среди чисел a1 и a2 ровно два различных.

Во втором примере отрезок [2, 5] является минимальным по включению отрезком с тремя разными числами, но не является минимальным по длине среди таких отрезков.

В третьем примере нет ни одного отрезка с четырьмя разными числами.

D. Змейка

битмаски графы поиск в глубину и подобное реализация *2200

Напомним правила одной очень популярной игры, которая называется «Змейка» (эта игра также известна как «Удав», «Питон» или «Червяк»).

Игровое поле представляет собой прямоугольную таблицу размера n × m. Некоторые клетки поля считаются непроходимыми (стены), все остальные клетки поля проходимы.

Вы управляете змейкой, которая состоит из сегментов. Каждый сегмент занимает ровно одну проходимую клетку поля, причем в любой проходимой клетке находится не более одного сегмента. Все сегменты пронумерованы целыми числами от 1 до k, где k — длина змейки. Сегмент с номером 1 называется головой, а с номером k — хвостом. Для любого i (1 ≤ i < k) клетки поля, в которых находятся сегменты с номерами i и i + 1, являются соседними, то есть имеют общую сторону.

В одной из проходимых клеток поля находится яблоко. Цель змейки — достичь яблока и съесть его (то есть сделать так, чтобы голова оказалась в той же клетке, где и яблоко).

В процессе игры змейка двигается. За один ход змейка может переместить голову в одну из соседних клеток поля. При этом все остальные сегменты подтягиваются за головой. То есть каждый сегмент с номером i (1 < i ≤ k) перемещается в клетку, где только что находился сегмент с номером i - 1. Считайте, что перемещение всех сегментов, включая голову, происходит одновременно (смотри второй тестовый пример). Если после хода голова змейки оказывается в непроходимой клетке или в клетке, в которой находится другой сегмент, то змейка умирает. Поэтому такие ходы мы будем считать недопустимыми.

Ваша задача — определить наименьшее количество допустимых ходов, необходимых для того, чтобы змейка достигла яблока.

Входные данные

В первой строке записаны два целых числа через пробел n и m (1 ≤ n, m ≤ 15) — количество строк и столбцов игрового поля.

В следующих n строках описано игровое поле. В каждой из этих строк записано по m символов. Символ «#» обозначает стену, «.» обозначает проходимую клетку, «@» обозначает яблоко. Сегмент змейки номер один обозначается символом «1», сегмент номер два — символом «2» и так далее.

Описание игрового поля не содержит никаких символов кроме «#», «.», «@» и цифр (кроме цифры 0). Гарантируется, что описанное поле корректно. Гарантируется, что на описанном поле находится ровно одно яблоко и ровно одна змейка, длина которой не меньше 3 и не больше 9.

Выходные данные

В выходной файл выведите единственное целое число — наименьшее количество ходов, необходимое для достижения яблока. Если яблока достичь невозможно, выведите -1.

C. Юбилей

математика матрицы реализация Структуры данных теория чисел *2400

Меньше 60 лет осталось до того, как исполнится 900 лет со дня рождения известного итальянского математика Леонардо Фибоначчи. Безусловно, к такому важному юбилею надо заранее основательно подготовиться.

Дима убежден, что неплохо было бы к знаменательной дате научиться решать следующую задачу: дано множество A, состоящее из чисел l, l + 1, l + 2, ..., r; рассмотрим все его k-элементные подмножества; для каждого такого подмножества найдем наибольший общий делитель чисел Фибоначчи с порядковыми номерами, заданными элементами подмножества. Среди всех найденных наибольших общих делителей Диму интересует самый большой.

Дима просил напомнить, что числа Фибоначчи — элементы числовой последовательности, в которой F1 = 1, F2 = 1, Fn = Fn - 1 + Fn - 2 для n ≥ 3.

У Димы впереди еще больше полувека, чтобы решить поставленную задачу, а у Вас всего два часа. Посчитайте остаток от деления искомого наибольшего общего делителя на m.

Входные данные

В первой строке записаны четыре целых числа через пробел m, l, r и k (1 ≤ m ≤ 109; 1 ≤ l < r ≤ 1012; 2 ≤ k ≤ r - l + 1).

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Выведите единственное целое число — остаток от деления искомого наибольшего общего делителя на m.

B. Эффективный подход

реализация *1100

Однажды на командной тренировке Васе, Пете и Саше досталась задача, в которой нужно было реализовать линейный поиск в массиве.

Линейный поиск, по мнению мальчиков, работает следующим образом. В заранее выбранном порядке элементы массива поочередно сравниваются с числом, которое требуется найти. Как только найден элемент массива, равный искомому, поиск завершается. Эффективностью алгоритма считается количество совершенных сравнений. Чем меньше линейный поиск совершил сравнений, тем он эффективнее.

Вася убежден, что линейный поиск будет работать эффективнее, если последовательно перебирать элементы, начиная с 1-го (в задаче считается, что элементы массива проиндексированы от 1 до n) и заканчивая n-м. А Петя говорит, что Вася неправ: меньше сравнений понадобится, если перебирать последовательно элементы, начиная с n-го и заканчивая 1-м. Саша утверждает, что оба подхода равноценны.

Чтобы наконец приступить к задаче, сокомандники решили положить конец спорам, сравнив два подхода на примере. Для этого они взяли массив, являющийся перестановкой целых чисел от 1 до n, а также сгенерировали m запросов вида: найти в массиве элемент со значением bi. Они хотят для обоих подходов посчитать, сколько сравнений суммарно понадобится линейному поиску, чтобы ответить на все запросы. Если меньше сравнений понадобится сделать первому подходу, то победителем в споре будет считаться Вася. Если второму — Петя. Если же оба подхода выполнят одинаковое количество сравнений, верх в споре одержит Саша.

Но вот незадача: линейный поиск работает слишком медленно. Поэтому до конца тренировки мальчики так и не узнают, кто же был прав, если не вмешаться вовремя. Помогите ребятам определить, кто победит в споре.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество элементов в массиве. Во второй строке записаны n различных целых чисел через пробел a1, a2, ..., an (1 ≤ ai ≤ n) — элементы массива.

В третьей строке записано целое число m (1 ≤ m ≤ 105) — количество запросов. В последней строке записаны m целых чисел через пробел b1, b2, ..., bm (1 ≤ bi ≤ n) — запросы на поиск. Обратите внимание, запросы могут повторяться.

Выходные данные

Выведите два целых числа: сколько сравнений понадобится Васиному подходу, а сколько — Петиному. Числа разделяйте пробельными символами.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере Васин подход совершит одно сравнение (он начинает с 1-го элемента и сразу же находит требуемое число), а Петин — два (сначала он производит сравнение со 2-м элементом массива, а затем, поскольку в ходе первого сравнения искомый элемент не найден, с 1-м).

Во втором примере, наоборот, Васиному подходу понадобится два сравнения (сначала с 1-м элементом, а затем со 2-м), а Петин найдет искомое значение за одно сравнение (сразу же со 2-м элементом).

A. Не смешите мои подковы

реализация *800

Конь Валера собрался с друзьями на вечеринку. Он давно следит за тенденциями моды и поэтому знает, что сейчас очень популярно носить все подковы разного цвета. С прошлого года у Валеры остались четыре подковы, но, возможно, некоторые из них имеют одинаковый цвет. В этом случае, чтобы не ударить в грязь лицом перед своими стильными товарищами, ему нужно сходить в магазин и купить дополнительно несколько каких-нибудь подков.

К счастью в магазине продаются подковы всех возможных цветов, и у Валеры имеется достаточно денег, чтобы купить любые четыре. Однако в целях экономии он хотел бы потратить как можно меньше денег, поэтому вам нужно помочь Валере и определить, какое минимальное количество подков нужно купить, чтобы он смог надеть на вечеринку четыре подковы различного цвета.

Входные данные

В первой строке через пробел записаны четыре целых числа s1, s2, s3, s4 (1 ≤ s1, s2, s3, s4 ≤ 109) — цвета подков, имеющихся у Валеры.

Считайте, что все возможные цвета пронумерованы целыми числами.

Выходные данные

Выведите единственное целое число — минимальное количество подков, которое нужно купить.

B. Две таблицы

Перебор реализация *1400

Вам заданы две прямоугольные таблицы размерами na × ma и nb × mb клеток, состоящие из нулей и единиц. Будем считать, что строки и столбцы обеих таблиц нумеруются, начиная с 1. Тогда элемент первой таблицы, стоящий на пересечении i-ой строки и j-ого столбца, обозначим за ai, j; элемент второй таблицы, стоящий на пересечении i-ой строки и j-ого столбца, обозначим за bi, j.

Пару целых чисел (x, y) назовем сдвигом второй таблицы, относительно первой. Коэффициентом совпадения сдвига (x, y) назовем величину:

где переменные i, j принимают только такие значения, при которых выражение ai, j·bi + x, j + y имеет смысл. Более формально, должны выполняться неравенства 1 ≤ i ≤ na, 1 ≤ j ≤ ma, 1 ≤ i + x ≤ nb, 1 ≤ j + y ≤ mb. Если не существует значений переменных i, j, удовлетворяющих заданным неравенствам, значение суммы считается равным 0.

Ваша задача — среди всех возможных сдвигов найти сдвиг с максимальным коэффициентом совпадения.

Входные данные

В первой строке через пробел записаны два целых числа na, ma (1 ≤ na, ma ≤ 50) — количество строк и столбцов в первой таблице. Далее в na строках записано по ma символов — элементы первой таблицы. Каждый символ является либо «0», либо «1».

В следующей строке через пробел записаны два целых числа nb, mb (1 ≤ nb, mb ≤ 50) — количество строк и столбцов во второй таблице. Далее записаны элементы второй таблицы в формате аналогичном первой таблице.

Гарантируется, что в первой таблице есть хотя бы одна единица. Гарантируется, что во второй таблице есть хотя бы одна единица.

Выходные данные

Выведите через пробел два целых числа x, y (|x|, |y| ≤ 109) — сдвиг с максимальным коэффициентом совпадения. Если существует несколько решений, выведите любое.

B. Т-простые числа

Бинарный поиск математика реализация теория чисел *1300

Известно, что простыми называются целые положительные числа, у которых ровно два различных положительных делителя. По аналогии назовем целое положительное число t Т-простым, если у t ровно три различных положительных делителя.

Вам дан массив, состоящий из n целых положительных чисел. Для каждого из них определите, является ли оно Т-простым или нет.

Входные данные

Первая строка содержит единственное целое число — количество чисел в массиве, n (1 ≤ n ≤ 105). Следующая строка содержит n целых чисел xi (1 ≤ xi ≤ 1012), разделенных пробелами.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Выведите n строк: i-тая строка должна содержать «YES» (без кавычек), если число xi является Т-простым, и «NO» (без кавычек), если не является.

Примечание

В приведенном тесте даны три числа. Первое число 4 имеет ровно три делителя — 1, 2 и 4, поэтому ответ для этого числа — «YES». Второе число 5 имеет два делителя (1 и 5), а третье число 6 — четыре делителя (1, 2, 3, 6), поэтому ответ для них — «NO».

A. Идеальная перестановка

математика реализация *800

Перестановкой называется упорядоченный набор чисел p1, p2, ..., pn, состоящий из n различных целых положительных чисел, каждое из которых не больше чем n. Обозначим i-тый элемент перестановки p через pi. Число n будем называть размером перестановки p1, p2, ..., pn.

Николай очень любит перестановки. Некоторые перестановки особенно нравятся Николаю. Их он называет идеальными. Идеальная перестановка, это такая перестановка p, что для любого i (1 ≤ i ≤ n) (n — размер перестановки) верно, что ppi = i и pi ≠ i. Вас он просит для заданного n вывести любую идеальную перестановку размера n.

Входные данные

В единственной строке записано единственное целое число n (1 ≤ n ≤ 100) — размер перестановки.

Выходные данные

Если идеальной перестановки размера n не существует — выведите единственное число -1. Иначе выведите n различных чисел от 1 до n, p1, p2, ..., pn — перестановку p, являющуюся идеальной. Выведенные числа разделяйте пробельными символами.

A. Левши и правши

реализация *1200

Одним прекрасным октябрьским днем учитель математики Василий Петрович зашел в класс и увидел в кабинете n учеников, которые сидели за партами, по два человека за партой. Василий Петрович быстро понял, что число n — четное. У Василия Петровича, как у настоящего математика, все ученики пронумерованы целыми числами от 1 до n.

Однако Василию Петровичу совершенно не понравилось, как расселись дети по партам. По его мнению, ученики, чьи номера отличаются на 1, не могут сидеть вместе, так как они все время болтают друг с другом, мешают остальным и вообще ведут себя плохо.

С другой стороны, если на левом месте парты сидит ученик-правша, а на правом — ученик-левша, то они постоянно ударяются локтями, мешая друг другу. В остальных случаях ученики, сидящие за одной партой, друг другу не мешают.

Василий Петрович отлично знает, кто из учеников левши, а кто — правши, и он просит Вас придумать любой порядок, который удовлетворяет этим двум нехитрым условиям (ученики не болтают и не ударяются локтями). Гарантируется, что входные данные таковы, что хотя бы один способ рассадить учеников всегда существует.

Входные данные

В первой строке входного файла дано единственное целое четное число n (4 ≤ n ≤ 100) — количество учеников в классе. Во второй строке содержится ровно n заглавных латинских букв «L» и «R». Если i-ая буква во второй строке равна «L», то ученик номер i — левша, а иначе он правша.

Выходные данные

Выведите пар целых чисел, по одной паре в строке. В i-ой строке выведите номера учеников, которые будут сидеть за партой i-й партой. Первое число в паре означает ученика, который сидит слева, а второе — ученика, который сидит справа. Числа в парах разделяйте пробелами. Если решений несколько, выведите любое из них.

C. Погода

дп реализация *1300

Ученые много говорят о проблемах глобального потепления и похолодания Земли. Действительно, подобные природные явления сильно влияют на все живое на нашей планете.

Не оставили равнодушным эти проблемы и нашего героя Васю. Он решил провести небольшой эксперимент и понаблюдать, как ежедневно изменяется температура на улице. Он повесил на балконе термометр и каждое утро записывал его показания. В течение последних n дней он делал свои измерения. Таким образом, он получил последовательность t1, t2, ..., tn чисел, в которой i-ое число обозначает температуру в i-ый день.

Изучив температурную статистику в других городах, Вася пришел в выводу, что в городе все в порядке с экологией, если температура на улице сначала некоторое ненулевое количество дней отрицательная, а затем некоторое ненулевое количество дней положительная. Более формально, должно существовать целое положительное число k (1 ≤ k ≤ n - 1) такое, что t1 < 0, t2 < 0, ..., tk < 0 и при этом tk + 1 > 0, tk + 2 > 0, ..., tn > 0. В частности, температура никогда не должна равняться нулю. Если это условие не выполняется, Вася решит, что в его городе существуют экологические проблемы, и сильно расстроится.

Вы не хотите, чтобы Вася огорчился. Поэтому Вы хотите выбрать несколько значений температуры и изменить их таким образом, чтобы условие Васи выполнялось. Вам требуется узнать, какое наименьшее количество значений температуры придется для этого изменить.

Входные данные

В первой строке задано единственное целое число n (2 ≤ n ≤ 105) — количество дней, в которые Вася делал измерения.

Во второй строке задана последовательность из n целых чисел t1, t2, ..., tn (|ti| ≤ 109) — последовательность значений температуры. Числа ti разделены одиночными пробелами.

Выходные данные

Выведите единственное целое число — ответ на поставленную задачу.

Примечание

Пояснение к первому примеру: есть два способа изменить ровно одно число так, чтобы последовательность стала удовлетворять Васиному условию. Можно заменить первую единицу на любое отрицательное число, либо заменить -2 на любое положительное число.

D. Кино

реализация *1600

В Берляндии всего m актеров. У каждого актера свой идентификатор — целое число от 1 до m (у разных актеров разные идентификаторы). Вася очень любит смотреть берляндские фильмы с берляндскими актерами, и у него есть k любимых актеров. Мальчик посмотрел анонсы фильмов на следующий месяц и записал про каждый фильм следующую информацию: название фильма, количество актеров, которые в нем снимались, и идентификаторы этих актеров. Причем названия фильмов и количество актеров он переписать успел, а вот идентификаторы некоторых актеров нет. Вася посмотрел на свои записи и задумался: какие же из фильмов станут его любимыми, а какие нет. После того, как Вася узнает точные актерские составы всех фильмов, любимые фильмы будут определяться так: фильм становится любимым фильмом, если ни в каком другом фильме из Васиного списка не играет больше любимых актеров.

Помогите мальчику для каждого фильма определить, что этот фильм:

  • точно будет любимым фильмом,
  • точно не будет любимым фильмом,
  • может как быть любимым, так и не быть.
Входные данные

В первой строке входного файла записаны два целых числа m и k (1 ≤ m ≤ 100, 1 ≤ k ≤ m) — количество актеров в Берляндии и количество любимых актеров Васи.

Во второй строке содержатся k различных целых чисел ai (1 ≤ ai ≤ m) — идентификаторы любимых актеров Васи.

В третьей строке содержится единственное целое число n (1 ≤ n ≤ 100) — количество фильмов в Васином списке.

Далее следует n блоков строк, в каждом из которых содержится описание очередного фильма. Описание i-го фильма содержит 3 строки:

  • в первой из них содержится строка si (si состоит из маленьких латинских букв и может иметь длину от 1 до 10 символов включительно) — название фильма,
  • во второй — целое неотрицательное число di (1 ≤ di ≤ m) — количество актеров, играющих в этом фильме,
  • в третьей — di целых чисел bi, j (0 ≤ bi, j ≤ m) — идентификаторы актеров, играющих в этом фильме. Если bi, j = 0, то это значит, что Вася не помнит идентификатор j-го актера. Гарантируется, что в перечне актеров для одного фильма не встречается двух одинаковых.

Названия всех фильмов различны. Числа в строках разделяются одиночными пробелами.

Выходные данные

В выходной файл выведите n строк. В i-ой строке выведите:

  • 0, если i-ый фильм точно будет любимым,
  • 1, если i-ый фильм точно будет нелюбимым,
  • 2, если i-ый фильм может быть как любимым, так и нелюбимым.
Примечание

Пояснение ко второму примеру:

  • В фильме jumanji теоретически может играть от 1 до 3 любимых Васей актеров.
  • В фильме theeagle играют все три любимых актера, поскольку актер, которого Вася не запомнил, может иметь только идентификатор 5.
  • В фильме matrix может играть только один любимый актер.
  • В фильме sourcecode не играет никто из любимых актеров.

Таким образом, фильм theeagle — точно любимый, фильмы matrix и sourcecode — точно нелюбимые, а фильм jumanji может являться как любимым (если в нем играют все три любимых актера), так и нелюбимым.

E. Лига Чемпионов

реализация *1600

Осенью этого года две российские команды вышли в групповой этап самого престижного клубного футбольного соревнования в мире — Лиги Чемпионов УЕФА. Сейчас эти команды уже начали играть на групповом этапе и ведут борьбу за выход в плей-офф. В данной задаче нас будет интересовать процесс жеребьевки группового этапа, то есть процедуры разбиения команд на группы.

Процесс жеребьевки выглядит следующим образом (правила, описанные в данной задаче, несколько упрощены по отношению к реальным). Пусть в групповом этапе будут принимать участие n команд (n кратно четырем). Команды должны быть разбиты на группы по четыре команды в каждой. Обозначим количество групп через m (). Каждая команда имеет рейтинг — целое число, характеризующее предыдущие достижения команды. Команды упорядочиваются по убыванию рейтинга (никакие две команды не имеют одинаковый рейтинг).

После этого формируются четыре «корзины», каждая из которых будет содержать m команд: первые m команд с наибольшим рейтингом попадают в первую корзину, следующие m команд — во вторую, и так далее.

Далее m - 1 раз повторяется следующая процедура. Случайным образом выбирается по команде из каждой корзины: сначала из первой, затем из второй, потом из третьей, и в последнюю очередь из четвертой. Выбранные команды образуют очередную группу. После этого они удаляются из своих корзин.

Четыре команды, оставшиеся в корзинах после выполнения (m - 1) описанных процедур, образуют последнюю группу.

В реальной жеребьевке случайный выбор команды из корзины производится людьми — как правило, известными в прошлом футболистами. За неимением таковых среди нас, воспользуемся генератором случайных чисел, который устроен следующим образом. Его параметрами являются четыре целых положительных числа x, a, b, c. Каждый раз, когда происходит обращение к генератору случайных чисел, он производит следующие действия:

  • вычисляет ;
  • заменяет параметр x на величину y (выполняет присваивание );
  • возвращает x в качестве очередного случайного числа.

Операция означает взятие остатка от деления: , .

Генератор случайных чисел будет использован в жеребьевке так: каждый раз, когда будет необходимо случайным образом выбрать команду из корзины, с его помощью будет генерироваться случайное число k. Команды, которые еще остаются в корзине, считаются пронумерованными последовательными целыми числами от 0 до s - 1 в порядке убывания рейтинга, где s — текущий размер корзины. Тогда из корзины выбирается команда с номером .

По заданным Вам списку команд и параметрам генератора случайных чисел, определите результат жеребьевки.

Входные данные

В первой строке входного файла записано целое число n (4 ≤ n ≤ 64, n кратно четырем) — количество команд, принимающих участие в жеребьевке. Во второй строке записаны четыре целых числа x, a, b, c, разделенные пробелами (1 ≤ x, a, b, c ≤ 1000) — параметры генератора случайных чисел. Каждая из следующих n строк описывает по одной команде. Описание состоит из названия команды и ее рейтинга, разделенных одиночным пробелом. Название команды состоит из строчных и прописных букв латинского алфавита и имеет длину от 1 до 20 символов. Рейтинг команды это целое число от 0 до 1000. Названия всех команд различны. Рейтинги всех команд также различны.

Выходные данные

Выведите распределение команд на группы. Группы выводите в порядке их составления в процессе жеребьевки. Группы нумеруйте последовательными заглавными буквами латинского алфавита, начиная с буквы 'A'. Внутри каждой группы выводите названия команд по одной в строке, в порядке убывания рейтинга команды. Смотрите примеры к условию для уточнения формата выходных данных.

Примечание

В данном примере генератор случайных чисел будет вызван четыре раза:

  • ,
  • ,
  • ,
  • .

G. Тренировки

Конструктив разделяй и властвуй реализация *1600

До ежегодного чемпионата Берляндии по футболу осталось совсем немного времени. Поэтому тренер «Мясгазочки» решил возобновить тренировки, прерванные по неопределенным причинам на неопределенный срок. Всего в «Мясгазочке» играет n футболистов. У каждого футболиста в команде есть номер — уникальное целое число от 1 до n. Для подготовки к чемпионату тренер Калич Евгеньевич решил провести некоторое количество тренировок.

Над тем, как нужно проводить тренировки, Калич Евгеньевич думал долгими ночами своего отпуска. Он пришел к очень сложной схеме тренировок. Каждая тренировка состоит из одной игры, в которой участвуют все n игроков команды. Игроки некоторым образом разбиваются на две команды. При этом в командах может быть разное количество игроков, но в каждой из команд должно оказаться хотя бы по одному игроку.

Тренер стремится к тому, чтобы после серии тренировок для каждой пары игроков существовала хотя бы одна тренировка, во время которой они играли в разных командах. Поскольку силы игроков ограничены, тренер хочет достигнуть цели за наименьшее число тренировок.

Помогите ему составить расписание тренировок.

Входные данные

В единственной строке входного файла находится целое число n (2 ≤ n ≤ 1000).

Выходные данные

В первой строке выведите m — наименьшее количество тренировок, которое придется провести тренеру. Затем выведите описания тренировок в m строках.

В i-ой из этих строк выведите fi — количество игроков в первой команде во время i-й тренировки (1 ≤ fi < n), и fi чисел от 1 до n — номера игроков в первой команде. Все остальные игроки во время этой тренировки будут играть во второй команде. Числа в строке разделяйте пробелами. Номера игроков выводите в любом порядке. Если оптимальных решений несколько, выведите любое из них.

E. Задача с Числами

дп Комбинаторика математика реализация теория чисел *2600

Обозначим количество делителей положительного целого числа n как d(n). Вам дано три числа a, b и c. Ваша задача — вычислить следующую сумму:

Найдите остаток от деления этой суммы на 1073741824 (230).

Входные данные

В первой строке записаны три целых числа через пробел — a, b и c (1 ≤ a, b, c ≤ 2000).

Выходные данные

Выведите единственное целое число — остаток от деления искомой суммы на 1073741824 (230).

Примечание

Пояснение к первому примеру.

  • d(1·1·1) = d(1) = 1;
  • d(1·1·2) = d(2) = 2;
  • d(1·2·1) = d(2) = 2;
  • d(1·2·2) = d(4) = 3;
  • d(2·1·1) = d(2) = 2;
  • d(2·1·2) = d(4) = 3;
  • d(2·2·1) = d(4) = 3;
  • d(2·2·2) = d(8) = 4.

Следовательно, ответ — 1 + 2 + 2 + 3 + 2 + 3 + 3 + 4 = 20.

A. Девушка или Юноша

Перебор реализация Строки *800

В наши дни очень много парней ставят себе фотографии красивых девушек на аватарки на форумах. Из-за этого очень часто сложно определить пол пользователя на форуме. В прошлом году наш герой пообщался в чате на форуме с одной красоткой (как он думал). После этого наш герой и предполагаемая красотка стали общаться еще чаще и в конце концов стали парой в сети.

Но вчера наш герой захотел увидеть свою красотку в реальной жизни и, каково же было его удивление, когда красоткой оказался здоровенный мужчина! Наш герой очень расстроился и теперь он, наверное, никогда больше не сможет полюбить. Сейчас к нему пришла в голову идея, как по имени пользователя определить его пол.

Вот его метод: если количество различных символов в имени пользователя нечетное, тогда пользователь мужского пола, иначе — женского. Вам дана строка, обозначающая имя пользователя, помогите нашему герою определить по ней пол пользователя по описанному методу.

Входные данные

В первой строке записана непустая строка, состоящая только из строчных букв латинского алфавита — имя пользователя. Эта строка состоит из не более чем 100 букв.

Выходные данные

Если пользователь оказался женского пола по методу нашего героя, выведите «CHAT WITH HER!» (без кавычек), иначе, выведите «IGNORE HIM!» (без кавычек).

Примечание

Рассмотрим первый тестовый пример. В этом примере в имени пользователя «wjmzbmr» 6 различных символов. Это символы: «w», «j», «m», «z», «b», «r». Таким образом по методу нашего героя «wjmzbmr» женского пола, то есть надо вывести «CHAT WITH HER!».

B. Простая Задача с Числами

реализация теория чисел *1300

Обозначим количество делителей положительного целого числа n как d(n). Вам дано три числа a, b и c. Ваша задача — вычислить следующую сумму:

Найдите остаток от деления этой суммы на 1073741824 (230).

Входные данные

В первой строке записаны три целых числа через пробел — a, b и c (1 ≤ a, b, c ≤ 100).

Выходные данные

Выведите единственное целое число — остаток от деления искомой суммы на 1073741824 (230).

Примечание

Пояснение к первому примеру.

  • d(1·1·1) = d(1) = 1;
  • d(1·1·2) = d(2) = 2;
  • d(1·2·1) = d(2) = 2;
  • d(1·2·2) = d(4) = 3;
  • d(2·1·1) = d(2) = 2;
  • d(2·1·2) = d(4) = 3;
  • d(2·2·1) = d(4) = 3;
  • d(2·2·2) = d(8) = 4.

Следовательно, ответ — 1 + 2 + 2 + 3 + 2 + 3 + 3 + 4 = 20.

A. Свободная касса

реализация *1000

Валера — директор круглосуточного кафе быстрого питания. Волшебным образом ему удалось узнать, что завтра его кафе посетят n человек. Для каждого человека известно время, в которое он придет: i-тый человек придет ровно в hi часов mi минут. Каждого клиента обслуживают меньше чем за минуту, однако, если клиент приходит и видит, что свободных касс нет, то он отказывается ждать и сразу же покидает заведение.

Валера очень жадный, поэтому он хочет обслужить завтра всех n посетителей (так он получит больше прибыли). Однако для этого нужно, чтобы количество работающих касс в каждый момент времени было не меньше, чем количество клиентов, пришедших в это время в кафе.

Помогите Валере подсчитать, какое наименьшее количество касс должно завтра работать в его кафе, чтобы можно было обслужить всех посетителей.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105), обозначающее количество посетителей кафе.

В каждой из следующих n строк через пробел записаны два целых числа hi и mi (0 ≤ hi ≤ 23; 0 ≤ mi ≤ 59), обозначающие время прихода i-того человека в кафе.

Обратите внимание, что времена заданы в хронологическом порядке. Все времена заданы в пределах одних суток.

Выходные данные

Выведите единственное целое число — наименьшее количество касс, необходимое для обслуживания всех клиентов завтра.

Примечание

В первом примере одной кассы недостаточно для того, чтобы обслужить всех клиентов, так как в момент времени 8:10 в кафе придут два человека. Соответственно, если в кафе будет одна касса, то один из этих посетителей направится к ней, а другой не станет ждать, пока она освободится, и уйдет.

Во втором примере все клиенты приходят в разное время, поэтому одной кассы достаточно.

B. Таблица Юнга

реализация сортировки *1500

Вам задана таблица a, состоящая из n строк, пронумерованных от 1 до n. В i-ой строке таблицы a содержится ci клеточек, при этом для всех i (1 < i ≤ n) выполняется ci ≤ ci - 1.

Обозначим за s общее количество клеточек таблицы a, то есть . Известно, что в каждой клеточке таблицы a записано единственное целое число от 1 до s, при этом все записанные числа различны.

Пусть клеточки i-той строки таблицы a пронумерованы от 1 до ci, тогда обозначим число, записанное в j-той клеточке i-той строки, за ai, j. Вам необходимо посредством нескольких операций обмена переупорядочить числа в таблице так, чтобы выполнялись следующие условия:

  1. для всех i, j (1 < i ≤ n; 1 ≤ j ≤ ci) выполняется ai, j > ai - 1, j;
  2. для всех i, j (1 ≤ i ≤ n; 1 < j ≤ ci) выполняется ai, j > ai, j - 1.

За одну операцию обмена разрешается выбрать две различных клеточки таблицы и поменять записанные в них числа местами, то есть число, которое до применения операции было записано в первой из выбранных клеток, после применения операции будет записано во второй. Аналогично, число, которое до применения операции было записано во второй из выбранных клеток, после применения операции будет записано в первой.

Переупорядочите числа требуемым способом. Учтите, что Вам разрешается выполнить любое количество операций не превосходящее s. Минимизировать количество операций не требуется.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 50), обозначающее количество строк в таблице. Во второй строке через пробел записаны n целых чисел ci (1 ≤ ci ≤ 50; ci ≤ ci - 1) — количества клеточек в соответствующих строках.

В следующих n строках задана таблица а. В i-той из них через пробел записаны ci целых чисел: j-тое число в этой строке обозначает ai, j.

Гарантируется, что все заданные числа ai, j положительны и не превосходят s. Гарантируется, что все ai, j различны.

Выходные данные

В первой строке выведите единственное целое число m (0 ≤ m ≤ s), обозначающее количество произведенных операций обмена.

В следующих m строках выведите описание этих операций обмена. В i-той из них выведите через пробел четыре целых числа xi, yi, pi, qi (1 ≤ xi, pi ≤ n; 1 ≤ yi ≤ cxi; 1 ≤ qi ≤ cpi). Выведенные числа обозначают операцию обмена содержимого клеток axi, yi и api, qi. Обратите внимание, что операцией обмена можно менять содержимое различных клеток таблицы. Выводите обмены в том порядке, в котором они должны производиться.

D. Ленточное Программирование

реализация Структуры данных *2900

Существует язык программирования, в котором каждая программа представлена непустой последовательностью символов «<» и «>» и цифр. Объясним, как работает интерпретатор этого языка программирования. Программа интерпретируется посредством движения указателя команды (IP), который состоит из двух частей.

  • Указатель текущего символа (CP);
  • Указатель направления (DP), который может указывать налево или направо;

Изначально CP указывает на крайний левый символ в последовательности, а DP указывает направо.

Мы повторяем следующие шаги до тех пор, пока CP впервые укажет куда-то за пределы последовательности.

  • Если CP указывает на цифру, то интерпретатор выводит эту цифру. Затем CP перемещается на один шаг согласно направлению DP. После этого значение написанной в последовательности цифры уменьшается на один. Если выведенная цифра была 0, значит, ее нельзя уменьшить. Поэтому она удаляется из последовательности, и длина последовательности уменьшается на один.
  • Если CP указывает на «<» или «>», то направление DP меняется на «влево» или «вправо», соответственно. Затем CP двигается на один шаг согласно DP. Если новый символ, на который указывает CP — это «<» или «>», то предыдущий символ будет удален из последовательности.

Если в какой-то момент выполнения программы CP выходит за пределы последовательности, то выполнение программы завершается.

Очевидно, что любая программа на этом языке завершается после некоторого количества шагов.

У Вас есть последовательность s1, s2, ..., sn, состоящая из символов «<», «>» и чисел. Вы должны ответить на q запросов. Каждый запрос характеризуется двумя целыми числами l и r и спрашивает, сколько раз будет выведена каждая цифра, если мы запустим последовательность sl, sl + 1, ..., sr как независимую программу на описанном языке.

Входные данные

В первой строке входных данных содержатся два целых числа n и q (1 ≤ n, q ≤ 105) — длина последовательности s и количество запросов.

Вторая строка содержит s, последовательность из «<», «>» и цифр (0..9), записанных слева направо. Заметьте, что символы s не разделяются пробелами.

Каждая из следующих q строк содержит по два целых числа li и ri (1 ≤ li ≤ ri ≤ n)i-ый запрос.

Выходные данные

Для каждого запроса выведите 10 целых чисел, записанных через пробел: x0, x1, ..., x9, где xi равняется количеству выведенных цифр i при выполнении соответствующей программы из запроса. Выводите ответы на запросы в том порядке, в каком запросы даны во входных данных.

A. Два Мешка Картошки

жадные алгоритмы математика реализация *1200

У Валеры было два мешка картошки, в первом из них было x (x ≥ 1) картофелин, а во втором — y (y ≥ 1) картофелин. Валера — очень рассеянный мальчик, поэтому первый мешок картошки (в нем было x картофелин) Валера потерял. Валера хорошо помнит, что суммарное количество картофелин (x + y) в обоих мешках, во-первых, было не больше n, a, во-вторых, делилось на k.

Помогите Валере определить сколько картофелин могло быть в первом мешке. Выведите все такие возможные количества в возрастающем порядке.

Входные данные

В первой строке записаны три целых числа через пробел y, k, n (1 ≤ y, k, n ≤ 109;  ≤ 105).

Выходные данные

Выведите список целых чисел разделенных пробельными символами — все возможные значения x в возрастающем порядке. Каждое значение, должно быть выведено ровно один раз.

Если нет ни одного подходящего значения x, выведите единственное целое число -1.

B. Простое Ленточное Программирование

Перебор реализация *1500

Существует язык программирования, в котором каждая программа представлена непустой последовательностью символов «<» и «>» и цифр. Объясним, как работает интерпретатор этого языка программирования. Программа интерпретируется посредством движения указателя команды (IP), который состоит из двух частей.

  • Указатель текущего символа (CP);
  • Указатель направления (DP), который может указывать налево или направо;

Изначально CP указывает на крайний левый символ в последовательности, а DP указывает направо.

Мы повторяем следующие шаги до тех пор, пока CP впервые укажет куда-то за пределы последовательности.

  • Если CP указывает на цифру, то интерпретатор выводит эту цифру. Затем CP перемещается на один шаг согласно направлению DP. После этого значение написанной в последовательности цифры уменьшается на один. Если выведенная цифра была 0, значит, ее нельзя уменьшить. Поэтому она удаляется из последовательности, и длина последовательности уменьшается на один.
  • Если CP указывает на «<» или «>», то направление DP меняется на «влево» или «вправо», соответственно. Затем CP двигается на один шаг согласно DP. Если новый символ, на который указывает CP — это «<» или «>», то предыдущий символ будет удален из последовательности.

Если в какой-то момент выполнения программы CP выходит за пределы последовательности, то выполнение программы завершается.

Очевидно, что любая программа на этом языке завершается после некоторого количества шагов.

У Вас есть последовательность s1, s2, ..., sn, состоящая из символов «<», «>» и чисел. Вы должны ответить на q запросов. Каждый запрос характеризуется двумя целыми числами l и r и спрашивает, сколько раз будет выведена каждая цифра, если мы запустим последовательность sl, sl + 1, ..., sr как независимую программу на описанном языке.

Входные данные

В первой строке входных данных содержатся два целых числа n и q (1 ≤ n, q ≤ 100) — длина последовательности s и количество запросов.

Вторая строка содержит s, последовательность из «<», «>» и цифр (0..9), записанных слева направо. Заметьте, что символы s не разделяются пробелами.

Каждая из следующих q строк содержит по два целых числа li и ri (1 ≤ li ≤ ri ≤ n)i-ый запрос.

Выходные данные

Для каждого запроса выведите 10 целых чисел, записанных через пробел: x0, x1, ..., x9, где xi равняется количеству выведенных цифр i при выполнении соответствующей программы из запроса. Выводите ответы на запросы в том порядке, в каком запросы даны во входных данных.

B. Чемпионы Формулы-1

реализация *1500

Чемпионат Формула-1 состоит из серии гонок, называемых Гран-при. После каждой гонки первым 10 гонщикам начисляются призовые очки в соответствие с занятым местом: 25, 18, 15, 12, 10, 8, 6, 4, 2, 1. По завершении чемпионата гонщик с наибольшим количеством очков объявляется чемпионом. Если таких несколько, чемпионом объявляется тот из них, у кого больше побед (т. е. первых мест). Если таких все еще несколько, выбирается тот из них, у кого больше вторых мест, и так далее, пока есть места, по которым можно сравнивать.

В прошлом году была предложена, но отклонена другая система подсчета очков. По ней чемпион — тот, у кого больше побед. Если таких несколько, то чемпион — тот из них, у кого больше призовых очков. Если таких все еще несколько, то дальнейшее сравнение происходит так же, как и в исходной системе подсчета очков, т. е. сравнивается количество вторых, третьих, четвертых мест и так далее.

Вам даны результаты всех Гран-при сезона. Ваша задача — определить чемпионов по обеим системам подсчета очков. Гарантируется, что в обеих системах чемпион определяется однозначно.

Входные данные

В первой строке записано целое число t (1 ≤ t ≤ 20) — количество гонок (Гран-при). Далее следуют описания всех гонок. Описание каждой гонки начинается с целого числа n (1 ≤ n ≤ 50) на отдельной строчке — количество гонщиков, участвовавших в данной гонке. В следующих n строках заданы результаты гонки, каждая строка содержит имя гонщика. Имена гонщиков даны в порядке от первого до последнего места. Имена состоят из строчных и заглавных латинских букв и имеют длину не более 50 символов. При сравнении имен большие и маленькие буквы следует различать.

Выходные данные

Выведите ровно две строки. В первой должно быть записано имя чемпиона по исходной системе подсчета очков, а во второй — имя чемпиона по предложенной системе.

Примечание

Не гарантируется, что каждый гонщик участвовал в каждой гонке. В чемпионате учитываются все гонщики, участвовавшие хотя бы в одной гонке. Суммарное число гонщиков, участвовавших в чемпионате, не превосходит 50.

C. Последовательность точек

геометрия математика реализация *1800

Даны точки на плоскости с целыми координатами: M0, A0, A1, ..., An - 1, где n — нечетное число. Определим бесконечную последовательность точек Mi следующим образом: Mi симметрична Mi - 1 относительно (для любого натурального числа i). Точка B симметрична A относительно M, если M — центр отрезка AB. Для заданного j найдите точку Mj.

Входные данные

В первой строке записано нечетное целое число n (1 ≤ n ≤ 105), и целое число j (1 ≤ j ≤ 1018) — индекс требуемой точки последовательности. В следующей строке через пробел записаны два целых числа — координаты точки M0. Далее следуют n строк, в i-ой строке через пробел записаны координаты точки Ai - 1. Все координаты не превосходят по модулю 1000.

Выходные данные

Выведите через пробел координаты точки Mj.

C. Mirror Box

геометрия реализация *2000

Mirror Box is a name of a popular game in the Iranian National Amusement Park (INAP). There is a wooden box, 105 cm long and 100 cm high in this game. Some parts of the box's ceiling and floor are covered by mirrors. There are two negligibly small holes in the opposite sides of the box at heights hl and hr centimeters above the floor. The picture below shows what the box looks like.

In the game, you will be given a laser gun to shoot once. The laser beam must enter from one hole and exit from the other one. Each mirror has a preset number vi, which shows the number of points players gain if their laser beam hits that mirror. Also — to make things even funnier — the beam must not hit any mirror more than once.

Given the information about the box, your task is to find the maximum score a player may gain. Please note that the reflection obeys the law "the angle of incidence equals the angle of reflection".

Input

The first line of the input contains three space-separated integers hl, hr, n (0 < hl, hr < 100, 0 ≤ n ≤ 100) — the heights of the holes and the number of the mirrors.

Next n lines contain the descriptions of the mirrors. The i-th line contains space-separated vi, ci, ai, bi; the integer vi (1 ≤ vi ≤ 1000) is the score for the i-th mirror; the character ci denotes i-th mirror's position — the mirror is on the ceiling if ci equals "T" and on the floor if ci equals "F"; integers ai and bi (0 ≤ ai < bi ≤ 105) represent the x-coordinates of the beginning and the end of the mirror.

No two mirrors will share a common point. Consider that the x coordinate increases in the direction from left to right, so the border with the hole at height hl has the x coordinate equal to 0 and the border with the hole at height hr has the x coordinate equal to 105.

Output

The only line of output should contain a single integer — the maximum possible score a player could gain.

Note

The second sample is depicted above. The red beam gets 10 + 50 + 5 + 35 + 8 + 2 = 110 points and the blue one gets 120.

The red beam on the picture given in the statement shows how the laser beam can go approximately, this is just illustration how the laser beam can gain score. So for the second sample there is no such beam that gain score 110.

F. Race

Перебор реализация *2300

The Old City is a rectangular city represented as an m × n grid of blocks. This city contains many buildings, straight two-way streets and junctions. Each junction and each building is exactly one block. All the streets have width of one block and are either vertical or horizontal. There is a junction on both sides of each street. We call two blocks adjacent if and only if they share a common side. No two blocks of different streets are adjacent and no two junctions are adjacent.

There is an annual festival and as a part of it, The Old Peykan follows a special path in the city. This path starts from a block in a street, continues with many junctions and ends in a block of some street. For each street block, we know how much time it takes for the Old Peykan to go from this block to an adjacent block. Also the Old Peykan can go from each junction to its adjacent street blocks in one minute. Of course Old Peykan can't go to building blocks.

We know the initial position of the Old Peykan and the sequence of junctions that it passes to reach its destination. After passing all the junctions and reaching the destination, it will stay there forever. Your task is to find out where will the Old Peykan be k minutes after it starts moving. Consider that The Old Peykan always follows the shortest path that passes through the given sequence of junctions and reaches the destination.

Note that the Old Peykan may visit some blocks more than once.

Input

The first line of input contains three integers m, n and k (3 ≤ m, n ≤ 100, 1 ≤ k ≤ 100000). Next m lines are representing the city's map. Each of them containts n characters, each character is a block:

  • Character "#" represents a building.
  • Digits "1", "2", ..., "9" represent a block of an street and this digit means the number of minutes it takes for the Old Peykan to pass this block.
  • Characters "a", "b", ..., "z" means that this block is a junction and this character is it's name. All the junction names are unique.

Consider that all blocks have the coordinates: the j-th in the i-th line have coordinates (i, j) (1 ≤ i ≤ m, 1 ≤ j ≤ n).

The (m + 2)th line contains two integers rs and cs (1 ≤ rs ≤ m, 1 ≤ cs ≤ n), string s and another two integers re and ce (1 ≤ re ≤ m, 1 ≤ ce ≤ n). The path starts from block (rs, cs), continues through junctions in the order that is specified by s and will end in block (re, ce). Length of s is between 1 and 1000.

It's guaranteed that string s denotes a correct path from the start position to the end position and string s doesn't contain two consecutive equal letters. Also start position (rs, cs) and the end position (re, ce) are street blocks.

Output

In a single line print two integers rf and cf — (rf, cf) being the position of the Old Peykan after exactly k minutes.

A. Игра в монетку

Перебор реализация *1100

Петя и Вася играют в монетку. Их друг Валера назначен судьей. Смысл игры очень простой. Сначала Вася x раз подкидывает монетку, затем Петя y раз подкидывает монетку. Если выпадает орел, то игрок, подкинувший монетку, получает одно очко. Если выпадает решка, никто очков не получает. Выигрывает игрок, у которого в конце игры будет больше очков. При равенстве очков объявляется ничья.

В какой-то момент Валера сбился со счета, и поэтому не может точно сказать, какой счет был в конце игры. Однако кое-что он запомнил наверняка. Он помнит, что за всю игру у Васи орел выпал не менее a раз, а у Пети не менее b раз. Более того, он знает, что победителем игры был объявлен Вася. По этой информации Валера хочет узнать всевозможные исходы игры, которые не противоречат его воспоминаниям.

Входные данные

В единственной строке заданы четыре целых числа x, y, a, b (1 ≤ a ≤ x ≤ 100, 1 ≤ b ≤ y ≤ 100). Числа в строке разделены пробелом.

Выходные данные

В первой строке выведите целое число n — количество возможных исходов игры. Далее в n строках выведите сами исходы. В i-ую строку через пробел выведите пару чисел ci, di — количество выпавших орлов у Васи и Пети соответственно в i-ом исходе игры. Пары чисел (ci, di) выводите в строго возрастающем порядке.

Напоминаем, что пара чисел (p1, q1) меньше пары чисел (p2, q2) если p1 < p2, либо p1 = p2 и при этом q1 < q2.

B. Большой отрезок

реализация сортировки *1100

На координатной прямой задано n отрезков, i-ый отрезок начинается в позиции li и заканчивается в позиции ri. Будем обозначать такой отрезок через [li, ri].

Вы предположили, что один из заданных отрезков покрывает все остальные. Другими словами, существует такой отрезок из заданного набора, в котором содержатся все остальные. Теперь вы хотите убедиться в своем предположении. Найдите отрезок из набора, который покрывает все остальные заданные отрезки, и выведите его номер. Если такого отрезка не существует, выведите -1.

Формально будем считать, что отрезок [a, b] покрывает отрезок [c, d], если выполняется условие a ≤ c ≤ d ≤ b.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 105) — количество отрезков. В следующих n строках содержатся описания отрезков. В i-ой строке через пробел заданы два целых числа li, ri (1 ≤ li ≤ ri ≤ 109) — границы i-ого отрезка.

Гарантируется, что никакие два отрезка не совпадают.

Выходные данные

Выведите единственное целое число — номер отрезка, который покрывает все остальные отрезки набора. Если решения не существует, выведите -1.

Отрезки нумеруются с 1 в порядке их появления во входных данных.

C. Колорадский жук

поиск в глубину и подобное реализация *2200

У дяди Вани в огороде большое поле картошки размером (1010 + 1) × (1010 + 1) квадратных метров. Поле разделено на квадратные грядки, каждая грядка занимает один квадратный метр.

Дядя Ваня знает, что скоро начнется нашествие колорадских жуков, которые могут уничтожить весь урожай. Для борьбы с насекомыми, дядя Ваня хочет опрыскать некоторые грядки инсектицидами.

И вот дядя Ваня вышел на поле, встал в самый центр центральной грядки поля и опрыскал эту грядку инсектицидами. Теперь он собирается сделать серию перемещений и обработать еще несколько грядок. В ходе каждого из перемещений дядя Ваня двигается влево, вправо, вверх или вниз по полю на некоторое целое количество метров. По пути дядя Ваня обрабатывает все грядки, на которые наступает. Другими словами грядки, которые имеют хоть какое-то пересечение с траекторией дяди Вани, оказываются обработанными инсектицидами.

Когда дядя Ваня закончил работу, он записал на листочек все свои перемещения. Теперь он хочет узнать количество грядок, которые не будут заражены после нашествия колорадских жуков.

Известно, что нашествие колорадских жуков происходит по следующей схеме. Сначала заражается некоторая грядка на границе поля. После этого любая грядка, которая не заражена и не обработана химикатами, имеющая общую сторону с некоторой зараженной грядкой, оказывается зараженной. Помогите дяде Ване, определите количество грядок, которые не будут заражены колорадским жуком.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000) — количество перемещений дяди Вани.

В следующих n строках задано описание перемещений дяди Вани. В i-ой из этих строк описывается i-ое по счету перемещение. Каждое перемещение задано в формате «di xi», где di — символ, определяющий направление перемещения («L», «R», «U» или «D» для направлений «влево», «вправо», «вверх» и «вниз» соответственно), а xi (1 ≤ xi ≤ 106) — целое число, определяющее количество метров, на которое происходит перемещение.

Выходные данные

Выведите единственное целое число — количество грядок, которые не будут заражены колорадским жуком.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

A. Мы делили апельсин

реализация *900

Однажды тетя Света купила в магазине апельсин. Апельсин состоял из n·k долек, пронумерованых целыми числами от 1 до n·k.

Дома тетю Свету ждут k ребятишек. Недавно ребята узнали, что она несет домой апельсин и решили заранее его поделить. Для этого каждый ребенок записал у себя на листочке номер дольки, которую он хотел бы получить: i-ый (1 ≤ i ≤ k) ребенок записал номер ai (1 ≤ ai ≤ n·k). Совершенно случайно, все числа ai оказались различными.

Теперь ребятам интересно узнать, как разделить апельсин так, чтобы выполнялись условия:

  • каждому ребенку достались ровно n долек апельсина;
  • i-ому ребенку обязательно досталась долька с номером ai;
  • никакая долька не досталась двум ребятам одновременно.

Помогите ребятам, разделите апельсин, выполнив описанные выше требования.

Входные данные

В первой строке записаны два целых числа n, k (1 ≤ n, k ≤ 30). Во второй строке записаны k целых чисел через пробел a1, a2, ..., ak (1 ≤ ai ≤ n·k), где ai — номер дольки апельсина, которая понравилась i-ому ребенку.

Гарантируется, что все числа ai различные.

Выходные данные

Выведите ровно n·k различных целых чисел. Первые n чисел обозначают номера долек, которые достанутся первому ребенку, вторые n чисел обозначают номера долек, которые достанутся второму ребенку, и так далее. Выведенные числа разделяйте пробельными символами.

Номера долек для ребенка можно выводить в любом порядке. Гарантируется, что ответ всегда существует. Если существует несколько правильных ответов, выведите любой.

A. Системный администратор

реализация *800

Поликарп — системный администратор. Под его чутким надзором находятся два сервера — a и b. Чтобы быть в курсе функционирования серверов, Поликарп выполняет команды «ping a» и «ping b». Каждая команда ping посылает ровно десять пакетов на сервер, указанный в аргументе команды. Результатом выполнения команды являются два целых числа x и y (x + y = 10; x, y ≥ 0). Эти числа обозначают, что x пакетов успешно дошли по сети до соответствующего сервера, а y пакетов были потеряны.

За сегодняшний рабочий день Поликарп выполнил всего n команд ping. Теперь для каждого сервера Поликарп хочет узнать, «жив» этот сервер или нет. Поликарп считает, что сервер «жив», если не менее половины из всех отправленных на этот сервер пакетов успешно дошли до него по сети.

Помогите Поликарпу, по заданным командам и их результатам определите для каждого сервера, «жив» этот сервер или нет.

Входные данные

В первой строке записано единственное целое число n (2 ≤ n ≤ 1000) — количество выполненных Поликарпом команд. В каждой из следующих n строк записано по три числа — описание команд. В i-той из этих строк записаны три целых числа через пробел ti, xi, yi (1 ≤ ti ≤ 2; xi, yi ≥ 0; xi + yi = 10). Если ti = 1, то i-тая команда — это «ping a», иначе i-тая команда — «ping b». Числа xi, yi обозначают результат выполнения этой команды, то есть xi пакетов успешно дошли до соответствующего сервера, а yi пакетов были потеряны.

Гарантируется, что во входных данных есть хотя бы одна команда «ping a» и хотя бы одна команда «ping b».

Выходные данные

В первой строке выведите строку «LIVE» (без кавычек) если сервер a «жив», иначе выведите «DEAD» (без кавычек).

Во второй строке выведите состояние сервера b в аналогичном формате.

Примечание

Рассмотрим первый тестовый пример, в нем на сервер a всего было отправлено 10 пакетов, 5 из них дошли. Следовательно, не менее половины из всех отправленных на этот сервер пакетов успешно дошли до него по сети. На сервер b всего было отправлено 10 пакетов, 6 из них дошли. Следовательно, не менее половины из всех отправленных на этот сервер пакетов успешно дошли до него по сети.

Рассмотрим второй тестовый пример, в нем на сервер a всего было отправлено 20 пакетов, 10 из них дошли. Следовательно, не менее половины из всех отправленных на этот сервер пакетов успешно дошли до него по сети. На сервер b всего было отправлено 10 пакетов, 0 из них дошли. Следовательно, менее половины из всех отправленных на этот сервер пакетов успешно дошли до него по сети.

B. Интернет-адрес

реализация Строки *1100

Вася — активный пользователь сети Интернет. Однажды ему очень понравился интернет-ресурс, поэтому он записал его адрес к себе в блокнот. Известно, что адрес записанного ресурса имеет формат:

<протокол>://<домен>.ru[/<контекст>]

Где:

  • <протокол> — может быть равен либо «http» (без кавычек) либо «ftp» (без кавычек),
  • <домен> — непустая строка, состоящая из строчных букв латинского алфавита,
  • часть /<контекст> — может отсутствовать, если она присутствует, то <контекст> — это непустая строка, состоящая из строчных букв латинского алфавита.

Если строка <контекст> отсутствует в адресе, то дополнительный символ «/» не ставится. Таким образом, в адресе либо два символа «/» (те, что идут перед доменом), либо три (один дополнительный перед контекстом).

Когда мальчик пришел домой, он обнаружил, что записанный адрес в блокноте не содержит никаких знаков препинания. Наверное, Вася сильно торопился и не стал записывать символы «:», «/», «.».

Помогите Васе восстановить возможный адрес записанного интернет ресурса.

Входные данные

В первой строке записана непустая строка, которую Вася записал в блокнот. Эта строка состоит только из строчных букв латинского алфавита.

Гарантируется, что заданная строка содержит не более 50 букв. Гарантируется, что заданная строка может быть получена из некоторого корректного, описанного выше, адреса интернет-ресурса.

Выходные данные

Выведите единственную строку — адрес интернет-ресурса, который понравился Васе. Если существует несколько адресов, подходящих под ограничения задачи, разрешается вывести любой.

Примечание

Во втором тестовом примере также возможны ответы: «ftp://httpruru.ru» и «ftp://httpru.ru/ru».

E. Происшествие в клубе

жадные алгоритмы реализация *1400

Не везет Поликарпу последнее время! Не успел Поликарп устроиться в клуб «Двоичный кот» охранником, как в клубе произошло ограбление. Украдены все запасы мороженого.

В ночь ограбления Поликарп аккуратно вел записи о посетителях клуба. Каждый раз, когда посетитель заходил в клуб, он ставил в своих записях символ «+». Аналогично, каждый раз, когда посетитель выходил из клуба, он ставил в своих записях символ «-». Известно, что все события входа и выхода происходили последовательно, то есть никакие два не происходили одновременно. Поликарп не помнит был ли кто-либо в клубе на момент начала его смены и на момент окончания.

В настоящий момент следствие интересует вопрос — какое наименьшее количество различных людей мог видеть Поликарп. Следует считать, что он видит любого входящего и выходящего человека. Каждый человек мог входить и выходить произвольное количество раз.

Входные данные

Единственная строка входных данных содержит последовательность символов «+» и «-», символы записаны подряд без каких-либо разделителей. Символы записаны в порядке возникновения соответствующих событий. Заданная последовательность имеет длину от 1 до 300 символов, включительно.

Выходные данные

Выведите искомое минимальное количество человек.

F. Анализ потока логов

Бинарный поиск Перебор реализация Строки *2000

Вам задан поток логов о предупреждениях в программе. Каждая запись потока логов представляет собой строку в формате:

«2012-MM-DD HH:MM:SS:MESSAGE» (без кавычек).

Строка «MESSAGE» состоит из пробелов, заглавных и строчных букв латинского алфавита, а также символов «!», «.», «,», «?». Строка «2012-MM-DD» определяет корректную дату в 2012 году. Строка «HH:MM:SS» определяет корректное время в 24 часовом формате.

Описанная запись потока логов обозначает, что в определенное в записи время произошло некоторое предупреждение в программе (описание предупреждения содержит строка «MESSAGE»).

Ваша задача вывести первый момент времени, когда количество предупреждений за последние n секунд стало не менее m.

Входные данные

В первой строке входных данных записаны два целых числа через пробел n и m (1 ≤ n, m ≤ 10000).

Вторая и остальные строки входных данных представляют собой поток логов. Во второй строке входных данных записана первая запись потока логов, в третьей строке — вторая запись потока логов и так далее. Каждая запись потока логов имеет формат описанный выше. Все записи заданы в хронологическом порядке, то есть записи о предупреждениях заданы в порядке их появления в программе.

Гарантируется, что в логе есть хотя бы одна запись. Гарантируется, что суммарная длина всех строк потока логов не превышает 5·106 (в частности, это означает, что длина одной строки не превышает 5·106 символов). Гарантируется, что все заданные даты и времена корректны, а строка «MESSAGE» во всех записях не пустая.

Выходные данные

Если не существует искомого момента времени выведите -1. Иначе выведите строку в формате «2012-MM-DD HH:MM:SS» (без кавычек) — первый момент времени, когда количество предупреждений за последние n секунд стало не менее m.

A. Шкафы

реализация *800

Как-то раз, туманным Стокгольмским утром, Карлсон решил подкрепиться запасами варения в доме своего друга — малыша Свантесона. К счастью для Карлсона в доме его друга не оказалось никого. Голодным Карлсон оставаться был не намерен, так что решил самостоятельно найти себе еду в доме малыша Свантесона.

Взгляд Карлсона сразу же пал на n деревянных шкафов, стоящих на кухне. Он тут же догадался, что в этих шкафах спрятаны заветные запасы варенья. Карлсон с жадностью стал летать по кухне, открывать и закрывать дверцы шкафов, хватать и опустошать все банки с вареньем, которые ему удавалось найти.

И вот, все банки с вареньем пусты, Карлсон наелся и не хочет оставлять следов своего пребывания, чтобы не подводить своего друга. Каждый из шкафов имеет две дверцы: левую и правую. Карлсон помнит, что когда он примчался на кухню, левые дверцы всех шкафов были в одинаковом положении (открыты или закрыты), аналогично все правые дверцы шкафов также были в одинаковом положении (открыты или закрыты). Карлсон хочет, чтобы к моменту появления дома хозяев это условие также выполнялось. Карлсон не помнит, в каком именно положении находились все левые дверцы, также он не помнит в каком положении находились все правые дверцы. Поэтому ему неважно в каком именно положении будут все левые или правые дверцы. Главное — чтобы все левые дверцы были в одинаковом положении и все правые дверцы были в одинаковом положении. Например, все левые дверцы могут быть закрыты, а все правые — открыты.

За одну секунду Карлсон может открыть или закрыть одну дверцу какого-либо шкафа. Он понимает, что до прихода хозяев осталось очень мало времени, поэтому хочет знать минимальное количество секунд t, за которое он сможет привести дверцы всех шкафов в нужное ему положение.

Ваша задача — написать программу, которая определит искомое количество секунд t.

Входные данные

Первая строка входных данных содержит единственное целое число n — количество шкафов на кухне (2 ≤ n ≤ 104). Далее следует n строк, каждая из которых содержит по два целых числа li и ri (0 ≤ li, ri ≤ 1). Число li равно единице, если левая дверца i-ого шкафа открыта, иначе — число li равно нулю. Аналогично число ri равно единице, если правая дверца i-ого шкафа открыта, иначе — число ri равно нулю.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственной строке выходных данных выведите единственное целое число t — минимальное количество секунд, которое потребуется Карлсону чтобы привести дверцы всех шкафов в нужное ему положение.

A. Шкафы

реализация *800

Как-то раз, туманным Стокгольмским утром, Карлсон решил подкрепиться запасами варения в доме своего друга — малыша Свантесона. К счастью для Карлсона в доме его друга не оказалось никого. Голодным Карлсон оставаться был не намерен, так что решил самостоятельно найти себе еду в доме малыша Свантесона.

Взгляд Карлсона сразу же пал на n деревянных шкафов, стоящих на кухне. Он тут же догадался, что в этих шкафах спрятаны заветные запасы варенья. Карлсон с жадностью стал летать по кухне, открывать и закрывать дверцы шкафов, хватать и опустошать все банки с вареньем, которые ему удавалось найти.

И вот, все банки с вареньем пусты, Карлсон наелся и не хочет оставлять следов своего пребывания, чтобы не подводить своего друга. Каждый из шкафов имеет две дверцы: левую и правую. Карлсон помнит, что когда он примчался на кухню, левые дверцы всех шкафов были в одинаковом положении (открыты или закрыты), аналогично все правые дверцы шкафов также были в одинаковом положении (открыты или закрыты). Карлсон хочет, чтобы к моменту появления дома хозяев это условие также выполнялось. Карлсон не помнит, в каком именно положении находились все левые дверцы, также он не помнит в каком положении находились все правые дверцы. Поэтому ему неважно в каком именно положении будут все левые или правые дверцы. Главное — чтобы все левые дверцы были в одинаковом положении и все правые дверцы были в одинаковом положении. Например, все левые дверцы могут быть закрыты, а все правые — открыты.

За одну секунду Карлсон может открыть или закрыть одну дверцу какого-либо шкафа. Он понимает, что до прихода хозяев осталось очень мало времени, поэтому хочет знать минимальное количество секунд t, за которое он сможет привести дверцы всех шкафов в нужное ему положение.

Ваша задача — написать программу, которая определит искомое количество секунд t.

Входные данные

Первая строка входных данных содержит единственное целое число n — количество шкафов на кухне (2 ≤ n ≤ 104). Далее следует n строк, каждая из которых содержит по два целых числа li и ri (0 ≤ li, ri ≤ 1). Число li равно единице, если левая дверца i-ого шкафа открыта, иначе — число li равно нулю. Аналогично число ri равно единице, если правая дверца i-ого шкафа открыта, иначе — число ri равно нулю.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственной строке выходных данных выведите единственное целое число t — минимальное количество секунд, которое потребуется Карлсону чтобы привести дверцы всех шкафов в нужное ему положение.

A. Шкафы

реализация *800

Как-то раз, туманным Стокгольмским утром, Карлсон решил подкрепиться запасами варения в доме своего друга — малыша Свантесона. К счастью для Карлсона в доме его друга не оказалось никого. Голодным Карлсон оставаться был не намерен, так что решил самостоятельно найти себе еду в доме малыша Свантесона.

Взгляд Карлсона сразу же пал на n деревянных шкафов, стоящих на кухне. Он тут же догадался, что в этих шкафах спрятаны заветные запасы варенья. Карлсон с жадностью стал летать по кухне, открывать и закрывать дверцы шкафов, хватать и опустошать все банки с вареньем, которые ему удавалось найти.

И вот, все банки с вареньем пусты, Карлсон наелся и не хочет оставлять следов своего пребывания, чтобы не подводить своего друга. Каждый из шкафов имеет две дверцы: левую и правую. Карлсон помнит, что когда он примчался на кухню, левые дверцы всех шкафов были в одинаковом положении (открыты или закрыты), аналогично все правые дверцы шкафов также были в одинаковом положении (открыты или закрыты). Карлсон хочет, чтобы к моменту появления дома хозяев это условие также выполнялось. Карлсон не помнит, в каком именно положении находились все левые дверцы, также он не помнит в каком положении находились все правые дверцы. Поэтому ему неважно в каком именно положении будут все левые или правые дверцы. Главное — чтобы все левые дверцы были в одинаковом положении и все правые дверцы были в одинаковом положении. Например, все левые дверцы могут быть закрыты, а все правые — открыты.

За одну секунду Карлсон может открыть или закрыть одну дверцу какого-либо шкафа. Он понимает, что до прихода хозяев осталось очень мало времени, поэтому хочет знать минимальное количество секунд t, за которое он сможет привести дверцы всех шкафов в нужное ему положение.

Ваша задача — написать программу, которая определит искомое количество секунд t.

Входные данные

Первая строка входных данных содержит единственное целое число n — количество шкафов на кухне (2 ≤ n ≤ 104). Далее следует n строк, каждая из которых содержит по два целых числа li и ri (0 ≤ li, ri ≤ 1). Число li равно единице, если левая дверца i-ого шкафа открыта, иначе — число li равно нулю. Аналогично число ri равно единице, если правая дверца i-ого шкафа открыта, иначе — число ri равно нулю.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственной строке выходных данных выведите единственное целое число t — минимальное количество секунд, которое потребуется Карлсону чтобы привести дверцы всех шкафов в нужное ему положение.

A. Шкафы

реализация *800

Как-то раз, туманным Стокгольмским утром, Карлсон решил подкрепиться запасами варения в доме своего друга — малыша Свантесона. К счастью для Карлсона в доме его друга не оказалось никого. Голодным Карлсон оставаться был не намерен, так что решил самостоятельно найти себе еду в доме малыша Свантесона.

Взгляд Карлсона сразу же пал на n деревянных шкафов, стоящих на кухне. Он тут же догадался, что в этих шкафах спрятаны заветные запасы варенья. Карлсон с жадностью стал летать по кухне, открывать и закрывать дверцы шкафов, хватать и опустошать все банки с вареньем, которые ему удавалось найти.

И вот, все банки с вареньем пусты, Карлсон наелся и не хочет оставлять следов своего пребывания, чтобы не подводить своего друга. Каждый из шкафов имеет две дверцы: левую и правую. Карлсон помнит, что когда он примчался на кухню, левые дверцы всех шкафов были в одинаковом положении (открыты или закрыты), аналогично все правые дверцы шкафов также были в одинаковом положении (открыты или закрыты). Карлсон хочет, чтобы к моменту появления дома хозяев это условие также выполнялось. Карлсон не помнит, в каком именно положении находились все левые дверцы, также он не помнит в каком положении находились все правые дверцы. Поэтому ему неважно в каком именно положении будут все левые или правые дверцы. Главное — чтобы все левые дверцы были в одинаковом положении и все правые дверцы были в одинаковом положении. Например, все левые дверцы могут быть закрыты, а все правые — открыты.

За одну секунду Карлсон может открыть или закрыть одну дверцу какого-либо шкафа. Он понимает, что до прихода хозяев осталось очень мало времени, поэтому хочет знать минимальное количество секунд t, за которое он сможет привести дверцы всех шкафов в нужное ему положение.

Ваша задача — написать программу, которая определит искомое количество секунд t.

Входные данные

Первая строка входных данных содержит единственное целое число n — количество шкафов на кухне (2 ≤ n ≤ 104). Далее следует n строк, каждая из которых содержит по два целых числа li и ri (0 ≤ li, ri ≤ 1). Число li равно единице, если левая дверца i-ого шкафа открыта, иначе — число li равно нулю. Аналогично число ri равно единице, если правая дверца i-ого шкафа открыта, иначе — число ri равно нулю.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственной строке выходных данных выведите единственное целое число t — минимальное количество секунд, которое потребуется Карлсону чтобы привести дверцы всех шкафов в нужное ему положение.

A. Шкафы

реализация *800

Как-то раз, туманным Стокгольмским утром, Карлсон решил подкрепиться запасами варения в доме своего друга — малыша Свантесона. К счастью для Карлсона в доме его друга не оказалось никого. Голодным Карлсон оставаться был не намерен, так что решил самостоятельно найти себе еду в доме малыша Свантесона.

Взгляд Карлсона сразу же пал на n деревянных шкафов, стоящих на кухне. Он тут же догадался, что в этих шкафах спрятаны заветные запасы варенья. Карлсон с жадностью стал летать по кухне, открывать и закрывать дверцы шкафов, хватать и опустошать все банки с вареньем, которые ему удавалось найти.

И вот, все банки с вареньем пусты, Карлсон наелся и не хочет оставлять следов своего пребывания, чтобы не подводить своего друга. Каждый из шкафов имеет две дверцы: левую и правую. Карлсон помнит, что когда он примчался на кухню, левые дверцы всех шкафов были в одинаковом положении (открыты или закрыты), аналогично все правые дверцы шкафов также были в одинаковом положении (открыты или закрыты). Карлсон хочет, чтобы к моменту появления дома хозяев это условие также выполнялось. Карлсон не помнит, в каком именно положении находились все левые дверцы, также он не помнит в каком положении находились все правые дверцы. Поэтому ему неважно в каком именно положении будут все левые или правые дверцы. Главное — чтобы все левые дверцы были в одинаковом положении и все правые дверцы были в одинаковом положении. Например, все левые дверцы могут быть закрыты, а все правые — открыты.

За одну секунду Карлсон может открыть или закрыть одну дверцу какого-либо шкафа. Он понимает, что до прихода хозяев осталось очень мало времени, поэтому хочет знать минимальное количество секунд t, за которое он сможет привести дверцы всех шкафов в нужное ему положение.

Ваша задача — написать программу, которая определит искомое количество секунд t.

Входные данные

Первая строка входных данных содержит единственное целое число n — количество шкафов на кухне (2 ≤ n ≤ 104). Далее следует n строк, каждая из которых содержит по два целых числа li и ri (0 ≤ li, ri ≤ 1). Число li равно единице, если левая дверца i-ого шкафа открыта, иначе — число li равно нулю. Аналогично число ri равно единице, если правая дверца i-ого шкафа открыта, иначе — число ri равно нулю.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственной строке выходных данных выведите единственное целое число t — минимальное количество секунд, которое потребуется Карлсону чтобы привести дверцы всех шкафов в нужное ему положение.

A. Шкафы

реализация *800

Как-то раз, туманным Стокгольмским утром, Карлсон решил подкрепиться запасами варения в доме своего друга — малыша Свантесона. К счастью для Карлсона в доме его друга не оказалось никого. Голодным Карлсон оставаться был не намерен, так что решил самостоятельно найти себе еду в доме малыша Свантесона.

Взгляд Карлсона сразу же пал на n деревянных шкафов, стоящих на кухне. Он тут же догадался, что в этих шкафах спрятаны заветные запасы варенья. Карлсон с жадностью стал летать по кухне, открывать и закрывать дверцы шкафов, хватать и опустошать все банки с вареньем, которые ему удавалось найти.

И вот, все банки с вареньем пусты, Карлсон наелся и не хочет оставлять следов своего пребывания, чтобы не подводить своего друга. Каждый из шкафов имеет две дверцы: левую и правую. Карлсон помнит, что когда он примчался на кухню, левые дверцы всех шкафов были в одинаковом положении (открыты или закрыты), аналогично все правые дверцы шкафов также были в одинаковом положении (открыты или закрыты). Карлсон хочет, чтобы к моменту появления дома хозяев это условие также выполнялось. Карлсон не помнит, в каком именно положении находились все левые дверцы, также он не помнит в каком положении находились все правые дверцы. Поэтому ему неважно в каком именно положении будут все левые или правые дверцы. Главное — чтобы все левые дверцы были в одинаковом положении и все правые дверцы были в одинаковом положении. Например, все левые дверцы могут быть закрыты, а все правые — открыты.

За одну секунду Карлсон может открыть или закрыть одну дверцу какого-либо шкафа. Он понимает, что до прихода хозяев осталось очень мало времени, поэтому хочет знать минимальное количество секунд t, за которое он сможет привести дверцы всех шкафов в нужное ему положение.

Ваша задача — написать программу, которая определит искомое количество секунд t.

Входные данные

Первая строка входных данных содержит единственное целое число n — количество шкафов на кухне (2 ≤ n ≤ 104). Далее следует n строк, каждая из которых содержит по два целых числа li и ri (0 ≤ li, ri ≤ 1). Число li равно единице, если левая дверца i-ого шкафа открыта, иначе — число li равно нулю. Аналогично число ri равно единице, если правая дверца i-ого шкафа открыта, иначе — число ri равно нулю.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственной строке выходных данных выведите единственное целое число t — минимальное количество секунд, которое потребуется Карлсону чтобы привести дверцы всех шкафов в нужное ему положение.

D. Конфеты - каждому!

Бинарный поиск жадные алгоритмы реализация *2300

Скоро Новый год. Мы все вместе в Простоквашино уедем. Будем там на лыжах кататься, печку топить, а в Новый год карнавал устроим. Ты нарядишься казаком или узбеком. Будешь вкусный плов готовить и казачью песню петь про ракитовый куст.
Эдуард Николаевич Успенский

В деревне Простоквашино празднуют Новый год. Дядя Федор вместе со своими друзьями — котом Матроскиным и псом Шариком решил угостить всех жителей на своей улице конфетами. Дядя Федор и его друзья решили, что жителям каждого дома на их улице они подарят по одному килограмму конфет. Таким образом им потребуется столько килограммов конфет, сколько домов есть на их улице.

Улицу, где живут трое из Простоквашино, можно мысленно разбить на n последовательных участков одинаковой длины. С любого участка можно перейти на один из соседних участков за одну единицу времени. Каждый из участков бывает одного из трех типов: пустой участок, участок с домом или участок с магазином. В магазине Дядя Федор и его друзья могут купить конфеты, но не более одного килограмма конфет в одном магазине (продавцы заботятся о том, чтобы жители деревни не злоупотребляли сладким).

После того, как трое из Простоквашино выйдут из своего дома, они окажутся на первом участке дороги. Для попадания на этот участок дороги тоже требуется одна единица времени. Можно считать, что Дядя Федор и его друзья могут нести неограниченное число килограммов конфет. Каждый раз, когда они оказываются на участке с домом, они могут отдать один килограмм конфет жителям дома, а могут просто перейти на другой участок. Если трое из Простоквашино уже отдавали конфеты жителям какого-то дома, то еще раз они этого сделать не могут. Аналогично, если Дядя Федор и его друзья находятся на участке с магазином, то они могут либо купить в нем килограмм конфет, либо пропустить этот магазин. Если в каком-то магазине они уже купили килограмм конфет, то продавец их запомнил и второй раз не продаст им больше ни грамма конфет. Временем на покупку и вручение конфет можно пренебречь. Дядя Федор с котом Матроскиным и псом Шариком не хотят, чтобы жители хотя бы одного дома остались без угощения.

Трое из Простоквашино хотят потратить не более t единиц времени на раздачу конфет, чтобы успеть подготовиться к празднованию Нового года. Для того, чтобы успеть раздать все конфеты, возможно, придется изначально взять с собой дополнительно k килограммов конфет.

Дядя Федор хочет знать минимальное число k килограммов конфет, которое необходимо взять с собой, чтобы успеть угостить жителей каждого дома на своей улице сладостями.

Ваша задача — написать программу, которая определит минимально возможное значение k.

Входные данные

Первая строка входных данных содержит два целых числа n и t, разделенных пробелами (2 ≤ n ≤ 5·105, 1 ≤ t ≤ 109). Вторая строка входных данных содержит n символов, i-ый из которых равен «H» (если i-ый участок содержит дом), «S» (если i-ый участок содержит магазин) или «.» (если i-ый участок не содержит ни дома, ни магазина).

Гарантируется, что имеется хотя бы один участок с домом.

Выходные данные

Если не существует ни одного значения k, при котором возможно не более, чем за t единиц времени угостить обитателей всех домов, то в единственной строке выведите «-1» (без кавычек). Иначе в единственной строке выведите минимально возможное значение k.

Примечание

В первом примере магазинов столько же, сколько и домов. Если не брать с собой ни одного килограмма конфет, то для того, чтобы угостить жителей самого первого дома потребуется сделать хотя бы один шаг назад, на что у друзей из Простоквашино абсолютно нет времени. Если же взять с собой один килограмм конфет, то возвращаться ни разу не потребуется.

Во втором примере число магазинов равняется числу домов и времени предостаточно. Можно купить во всех магазинах конфеты пройдя улицу в одном направлении и раздать их при проходе в обратном направлении.

В третьем примере на улице меньше магазинов, чем домов. Придется друзьями из Простоквашино взять недостающее число килограммов конфет с собой из дома.

B. Телефонные номера

реализация *1100

Телефонный номер в Берляндии представляет собой последовательность из n цифр. Часто чтобы было проще запомнить номер, его разбивают на группы из двух или трех цифр. Например, номер 1198733 проще запомнить как 11-987-33. Ваша задача — по заданному телефонному номеру найти любое его разбиение на группы из двух или трех цифр.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 100) — количество цифр в телефонном номере. Во второй строке записано n цифр — телефонный номер, который требуется разбить на группы.

Выходные данные

Выведите любое разбиение данного номера на группы из двух или трех цифр. Разделяйте группы символом -. Если решений несколько, выведите любое.

B. Игра с перестановками

математика реализация *1800

Маленький Петя очень любит перестановки. Недавно мама подарила ему перестановку q1, q2, ..., qn длины n.

Перестановкой a длины n будем называть последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ n), все числа которой различны.

Больше чем перестановки Петя любит только играть с маленькой Машей. Оказалось, у Маши тоже есть перестановка длины n. Петя решил во что бы то ни стало, получить такую же перестановку. Для этого он придумал игру со следующими правилами:

  • Перед началом игры Петя записывает на доске перестановку 1, 2, ..., n. После чего Петя делает ровно k ходов, описанных ниже.
  • На очередном ходу бросается монета. Если выпал орел, то выполняется пункт 1, если решка — пункт 2.
    1. Пусть на доске в данный момент записана перестановка p1, p2, ..., pn. Тогда записанная на доске перестановка p стирается, а вместо нее записывается следующая: pq1, pq2, ..., pqn. Иными словами, к перестановке p применяется перестановка q, подаренная Пете.
    2. Все действия аналогичны пункту 1, за исключением того что на доску записывается перестановка t, такая что: tqi = pi для всех i от 1 до n. Иными словами, к перестановке p применяется перестановка, обратная к q.

Известно, что после k-го хода на доске оказалась перестановка Маши s1, s2, ..., sn. Кроме того, известно, что в процессе игры до k-го хода перестановка Маши ни разу не встретилась на доске. Обратите внимание, что в игре ровно k ходов, то есть в процессе игры монетка подбрасывалась ровно k раз.

Ваша задача — определить, возможна ли описанная ситуация, либо сообщить, что Петя что-то перепутал. Смотрите примеры из условия и разъяснения к ним для лучшего понимания.

Входные данные

В первой строке записаны два целых числа n и k (1 ≤ n, k ≤ 100). Во второй строке записаны n целых чисел через пробел q1, q2, ..., qn (1 ≤ qi ≤ n) — перестановка, подаренная Пете. В третьей строке записана Машина перестановка s, в аналогичном формате.

Гарантируется, что заданные последовательности q и s — корректные перестановки.

Выходные данные

Если описанная в условии ситуация возможна, выведите «YES» (без кавычек), иначе — выведите «NO» (без кавычек).

Примечание

В первом примере перестановка Маши совпадает с перестановкой, которая была записана на доске перед началом игры. Следовательно, нарушается условие, что перед выполнением k ходов, перестановка Маши ни разу не встречалась на доске.

Во втором примере описанная ситуация возможна, в случае если после подбрасывания монетки выпала решка.

В третьем примере возможная последовательность выпадений монетки такая: орел-решка-решка.

В четвертом примере возможна следующая последовательность выпадений монетки: орел-орел.

E. Дерево и таблица

Деревья дп поиск в глубину и подобное реализация *3000

Маленький Петя очень любит деревья. Недавно мама подарила ему дерево с 2n вершинами. Петя сразу же решил расположить это дерево на прямоугольной таблице, состоящей из 2 строк и n столбцов так, чтобы выполнялись следующие условия:

  1. Каждой клетке таблицы соответствует ровно одна вершина дерева и наоборот, каждой вершине дерева соответствует ровно одна клетка таблицы.
  2. Если две вершины дерева соединены ребром, то соответствующие им клетки имеют общую сторону.

Сейчас Пете интересно, сколько существует способов расположить его дерево на таблице. Он называет два расположения различными, если существует вершина дерева, которой соответствуют разные клетки таблицы в этих двух расположениях. Поскольку большие числа очень пугают Петю, выведите остаток от деления ответа на 1000000007 (109 + 7).

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 105). Следующие (2n - 1) строк содержат по два целых числа ai и bi (1 ≤ ai, bi ≤ 2nai ≠ bi), которые обозначают номера вершин, соединенных соответствующим ребром.

Считайте, что вершины дерева пронумерованы целыми числами от 1 до 2n. Гарантируется, что заданный во входных данных граф является деревом, то есть связным ациклическим неориентированным графом.

Выходные данные

Выведите единственное целое число — искомое количество способов расположить дерево на таблице, взятое по модулю 1000000007 (109 + 7).

Примечание

Пояснение к примеру 1 (ниже представлены все 12 вариантов расположения дерева на таблице):


1-3-2 2-3-1 5 4 6 6 4 5
| | | | | | | | | | | |
5 4 6 6 4 5 1-3-2 2-3-1

4-3-2 2-3-4 5-1 6 6 1-5
| | | | | | | |
5-1 6 6 1-5 4-3-2 2-3-4

1-3-4 4-3-1 5 2-6 6-2 5
| | | | | | | |
5 2-6 6-2 5 1-3-4 4-3-1

A. Маленький xor

Перебор реализация *1100

Маленький Петя очень любит массивы, состоящие из целых неотрицательных чисел. Недавно мама подарила ему один такой массив, состоящий из n элементов. Петя сразу решил найти в нем отрезок из подряд идущих элементов, такой что xor всех чисел из этого отрезка максимален. Помогите ему в этом.

Под операцией xor подразумевается побитовое исключающее «ИЛИ», которое обозначается как «xor» в языке Pascal и «^» в C/C++/Java.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — количество элементов в массиве. Во второй строке записаны сами числа из массива, через пробел. Все числа целые, неотрицательные и строго меньше 230.

Выходные данные

Выведите единственное целое число — искомый максимальный xor отрезка последовательных элементов.

Примечание

В первом примере одним из оптимальных отрезков является отрезок, состоящий из первого и второго элемента массива, если считать что элементы массива нумеруются начиная с единицы.

Во втором примере оптимальный отрезок всего один, в нем содержится ровно один элемента массива (элемент номер три).

E. Принтер

Бинарный поиск реализация сортировки Структуры данных *2200

Рассмотрим сетевой принтер, который функционирует следующим образом. Он начинает работать в момент времени 0. Каждую секунду он может напечатать одну страницу текста. В некоторые моменты времени на принтер поступают задания на печать. Известно, что на принтер поступило n заданий. Пронумеруем задания последовательными целыми числами от 1 до n. Тогда задание с номером i характеризуется тремя целыми числами: ti — временем поступления задания, si — объемом задания (в страницах) и pi — приоритетом задания. Приоритеты всех заданий различны.

В тот момент, когда задание поступает на принтер, оно попадает в очередь и находится там до тех пор, пока все страницы из этого задания не будут напечатаны. Принтер выбирает страницу для печати каждый раз, когда заканчивает печатать какую-то страницу, либо в те моменты, когда поступает новое задание, а принтер был свободен. Среди всех заданий, имеющихся в очереди в данный момент, принтер выбирает задание с наибольшим приоритетом и в следующую секунду печатает очередную еще не напечатанную страницу из этого задания. Считайте, что задание попадает в очередь мгновенно, поэтому если в некоторый момент времени t задание только что поступило, то принтер уже может выбирать его для печати.

Вам дана полная информация о всех заданиях, кроме одного: для него неизвестен приоритет. Однако же известно, в какое время была завершена печать последней страницы из этого задания. По этой информации найдите неизвестное значение приоритета, а также определите времена окончания печати каждого из заданий.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 50000). Следующие n строк описывают задания. В i-й из этих строк записаны три целых числа ti, si и pi, разделенные одиночными пробелами (0 ≤ ti ≤ 109, 1 ≤ si, pi ≤ 109). Ровно для одного из заданий (пусть его номер x) вместо приоритета записано число -1. Все приоритеты различны. В последней строке записано целое число T — время завершения печати последней страницы задания с номером x (1 ≤ T ≤ 1015). Числа ti не обязательно различны. Задания записаны во входных данных в произвольном порядке.

Выходные данные

В первой строке выведите целое число px — приоритет задания с номером x (1 ≤ px ≤ 109, помните, что все приоритеты должны быть различны). Далее выведите n целых чисел, в i-ое из которых обозначает время завершения печати последней страницы задания с номером i.

Гарантируется, что хотя бы одно решение существует. Если решений несколько, выведите любое из них.

Примечание

Рассмотрим первый тестовый пример. Пусть неизвестный приоритет равен 4, тогда посекундное описание действий принтера:

  • начало 1-ой секунды (момент времени 0). В очереди задание номер 2. Начинает печататься первая страница этого задания;
  • начало 2-ой секунды (момент времени 1). В очереди задания номер 2 и 3. Начинает печататься первая страница задания номер 3;
  • начало 3-ой секунды (момент времени 2). В очереди задания номер 2 и 3. Начинает печататься вторая страница задания номер 3;
  • начало 4-ой секунды (момент времени 3). В очереди задания номер 2 и 3. Начинает печататься третья (последняя) страница задания номер 3. Таким образом, к концу 4-ой секунды это задание будет напечатано;
  • начало 5-ой секунды (момент времени 4). В очереди задания номер 2 и 1. Начинает печататься первая страница задания номер 1;
  • начало 6-ой секунды (момент времени 5). В очереди задания номер 2 и 1. Начинает печататься вторая страница задания номер 1;
  • начало 7-ой секунды (момент времени 6). В очереди задания номер 2 и 1. Начинает печататься третья (последняя) страница задания номер 1. Таким образом, к концу 7-ой секунды это задание будет напечатано;
  • начало 8-ой секунды (момент времени 7). В очереди задание номер 2. Начинает печататься вторая (последняя) страница задания номер 2. Таким образом, к концу 8-ой секунды это задание будет напечатано.

В итоге, задание номер 1 напечатано к концу 7-ой секунды, как и требовалось. А задания 2 и 3 напечатаны к концу 8-ой и 4-ой секунды соответственно.

B. Размер жюри

Перебор реализация *1500

В 2013-м году авторский коллектив Берляндского государственного университета должен подготовить задачи к n олимпиадам. Будем считать, что олимпиады пронумерованы последовательными целыми числами от 1 до n. Про каждую олимпиаду известно, сколько членов жюри должно участвовать в ее подготовке, а также время, требуемое на подготовку задач для нее. А именно, олимпиаду с номером i должны готовить pi человек в течение ti дней, причем подготовка олимпиады должна вестись непрерывный промежуток времени и закончиться ровно за день до олимпиады. Непосредственно в день олимпиады члены жюри, которые ее готовили, уже над ней не работают.

К примеру, если олимпиада состоится 9 декабря, и на ее подготовку требуется 7 человек и 6 дней, то все эти 7 членов жюри будут работать над задачами этой олимпиады с 3-го декабря по 8-е декабря (9-го декабря эти члены жюри уже не будут работать над задачами этой олимпиады, то есть некоторые из них могут начать готовить задачи какой-то другой олимпиады). А если олимпиада проводится 3 ноября и требует 5 дней подготовки, то члены жюри будут работать с 29-го октября по 2-е ноября.

Чтобы не перегружать членов жюри, было введено такое правило: один член жюри не может в один и тот же день работать над задачами для разных олимпиад. Напишите программу, которая определяет, какое наименьшее количество человек должно входить в состав жюри, чтобы все олимпиады могли быть подготовлены в срок.

Входные данные

В первой строке записано целое число n — количество олимпиад в 2013-м году (1 ≤ n ≤ 100). Каждая из следующих n строк содержит по четыре целых числа mi, di, pi и ti — месяц и день олимпиады (заданы без лидирующих нулей), требуемое количество членов жюри и время, требуемое на подготовку i-й олимпиады (1 ≤ mi ≤ 12, di ≥ 1, 1 ≤ pi, ti ≤ 100), di не превосходит количества дней в месяце mi. Олимпиады заданы в произвольном порядке. В один день может проводиться несколько олимпиад.

Для решения задачи используйте современный (Григорианский) календарь. Обратите внимание, все даты заданы в 2013 году. Этот год не является високосным, следовательно, в феврале 28 дней. Обратите внимание, подготовка некоторой олимпиады может начаться в 2012 году.

Выходные данные

Выведите единственное число — минимальный размер жюри.

D. Крысы

графы кратчайшие пути Перебор поиск в глубину и подобное реализация *2300

В подвале магазина, которым владеет Василий Петрович, расплодились крысы. Василий Петрович, возможно, и не замечал бы их присутствия, но они повадились пробираться на склад и красть оттуда продукты. Василий Петрович не может с этим больше мириться: он должен уничтожить крыс в подвале. Поскольку мышеловки уже изжили себя и совсем не помогают, а крысиным ядом потом можно отравиться и самому, он избрал радикальный способ: взорвать в подвале две гранаты (больше у него нет).

В данной задаче мы будем представлять подвал магазина в виде прямоугольной таблицы из n × m клеток. Некоторые клетки заняты стенами, а остальные — свободны. Василий Петрович понаблюдал за крысами и выяснил, что в определенный момент времени они ложатся спать, причем все время в одни и те же места. В этот удобный момент он и хочет взорвать гранаты. На плане своего подвала он отметил те клетки, в которых спят крысы. Эти клетки, разумеется, не заняты стенами.

Гранату можно взорвать только в клетке, не занятой стеной. Взрывная волна от гранаты распространяется следующим образом. Будем считать, что подрыв гранаты происходит в момент времени 0. В этот начальный момент времени взорвана только клетка, где подорвали гранату. Если в момент времени t взорвана некоторая клетка, то в момент времени t + 1 будут взорваны те соседние по стороне клетки, которые не заняты стенами (некоторые из них могли быть взорваны и до этого). Взрывная волна распространяется ровно d секунд, после чего мгновенно угасает.

Пример распространения взрывной волны: на первой картинке ситуация до взрыва, а на последующих картинках показаны взорванные клетки на моменты времени 0,1,2,3 и 4. Таким образом взрывная волна на картинке распространяется d = 4 секунды.

Василий Петрович интересуется, можно ли выбрать две клетки для подрыва гранат таким образом, чтобы все клетки, в которых спят крысы, оказались взорваны. Напишите программу, которая это выясняет.

Входные данные

В первой строке записаны три целых числа n, m и d, разделенных одиночными пробелами (4 ≤ n, m ≤ 1000, 1 ≤ d ≤ 8). В следующих n строках записана таблица, задающая план подвала. Каждая строка таблицы состоит из m символов. Символ «X» означает, что соответствующая клетка занята стеной, символ «.» означает свободную клетку, символ «R» — свободную клетку, в которой спят крысы.

Гарантируется, что первая и последняя строки, а также первый и последний столбцы состоят из символов «X». На плане есть хотя бы две клетки, не занятые стенами. Имеется хотя бы одна клетка, в которой спят крысы.

Выходные данные

Если невозможно взорвать все клетки, в которых спят крысы, выведите единственное целое число -1. Иначе выведите через пробел четыре целых числа r1, c1, r2, c2, означающих, что одну из гранат следует взорвать в клетке (r1, c1), а другую — в клетке (r2, c2).

Считайте, что строки таблицы пронумерованы сверху вниз от 1 до n, а столбцы слева направо от 1 до m. Поскольку r1 и r2 задают номера строк, а c1 и c2 — номера столбцов в таблице, то должны выполняться ограничения: 1 ≤ r1, r2 ≤ n, 1 ≤ c1, c2 ≤ m. В одной и той же клетке дважды взрывать гранату нельзя. Взрывные волны гранат могут пересекаться. Возможно, взрыв одной из гранат не уничтожит ни одной крысы, а взрыв другой уничтожит всех.

E. Общежитие

дп реализация *2100

Студент Вася приехал учиться в Берляндский государственный университет из деревни, поэтому живет в общежитии. Семестр длится n дней, и в каждый из этих дней родители присылают ему еды. Утром i-го дня ему приходит ai килограмм еды, которую можно есть как в текущий, так и на следующий день (затем еда портится и становится непригодной к употреблению).

Каждый день Вася съедает v килограмм еды. Известно, что родители Васи не допустят, чтобы он голодал, поэтому еды Васе хватает всегда. У Васи есть m друзей, которые иногда у него живут. Пусть друзья пронумерованы числами от 1 до m. Друг с номером j живет у Васи со дня номер lj по день номер rj включительно. Также j-му другу в день необходимо съесть fj килограмм еды. Обычно друзья Васи питаются в столовой, но иногда щедрый Вася кормит некоторых из них. Каждый день Вася может покормить каких-то друзей, которые живут у него в этот день (а может и не кормить никого).

Каждый раз, когда Вася угощает друга, он дает ему ровно столько еды, сколько необходимо другу в день, и Васин рейтинг популярности в университете повышается на единицу. Вася не может угощать одного и того же друга несколько раз в течение одного дня. Кроме того, он прекрасно знает, что режим питания нарушать нельзя, и поэтому он обязательно должен съедать в день v килограмм еды.

Вася хочет таким образом выбирать, кого он будет кормить в каждый из дней в семестре, чтобы его рейтинг стал как можно больше. Изначально рейтинг Васи равен 0, потому что он первокурсник.

Входные данные

В первой строке записаны два целых числа n и v (1 ≤ n, v ≤ 400). Во второй строке записано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 400), разделенных одиночными пробелами. Значение ai обозначает, что в утро i-го дня приходит ai килограмм еды, которую можно есть в день i и/или в день i + 1 (затем эта еда портится). Гарантируется, что если Вася не будет никого угощать, то существует способ так питаться, что каждый день он будет съедать v килограмм еды.

В третьей строке записано целое число m (1 ≤ m ≤ 400). Каждая из следующих m строк описывает одного друга Васи: j-я из этих строк содержит три целых числа lj, rj, fj (1 ≤ lj ≤ rj ≤ n, 1 ≤ fj ≤ 400), разделенные одиночными пробелами.

Выходные данные

В первой строке выведите наибольший рейтинг, которого Вася сможет достичь. Далее в n строках выведите, кого из друзей нужно кормить в каждый из дней. В i-й из этих строк сначала выведите количество друзей, которых следует угостить в i-й день, а затем перечислите номера этих друзей. Друзей в этих списках выводите в любом порядке. Если оптимальных решений несколько, выведите любое из них.

A. Тренировки Егора

реализация *800

Егор — начинающий бодибилдер. Сегодня в спортзале тренер выдал ему программу тренировки. Все что в ней было написано, это n целых чисел a1, a2, ..., an. Эти числа обозначают, что Егору нужно выполнить сегодня ровно n упражнений, причем i-тое по порядку упражнение Егор должен повторить ai раз.

Егор, пока-что, делает всего три вида упражнений: упражнения «на грудь», упражнения «на бицепс» и упражнения «на спину». Причем, его тренировка — циклическая, то есть первое упражнение, которое он выполняет, «на грудь», второе — «на бицепс», третье — «на спину», четвертое — «на грудь», пятое — «на бицепс», и так далее до n-го упражнения.

Сейчас Егора интересует, а какую мышцу он накачает больше всего на своей тренировке. Известно, что больше всего он накачает ту мышцу, упражнение на которую он повторит максимальное количество раз. Помогите Егору, определите, какую мышцу он накачает больше всего.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 20). Во второй строке задано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 25) — количество повторений упражнений.

Выходные данные

Выведите слово «chest» (без кавычек), если больше всего Егор накачает грудь, «biceps» (без кавычек), если больше всего Егор накачает бицепсы или «back» (без кавычек), если больше всего Егор накачает спину.

Гарантируется, что входные данные таковы, что ответ на задачу однозначен.

Примечание

В первом примере Егор выполняет 2 повторения упражнения на грудь, 8 на бицепс и 0 на спину, поэтому больше всего он накачает бицепс.

Во втором примере Егор выполняет 5 повторений упражнения на грудь, 1 на бицепс и 10 на спину, поэтому больше всего он накачает спину.

В третьем примере Егор выполняет 18 повторений упражнения на грудь, 12 на бицепс и 8 на спину, поэтому больше всего он накачает грудь.

B. Разбор кода

реализация *1200

Маленький Виталик любит разные алгоритмы. Сегодня он изобрел новый алгоритм специально для Вас. Алгоритм Виталика работает со строкой s, состоящей из символов «x» и «y», и в процессе выполнения использует две следующие операции:

  1. Найти в строке два подряд идущих символа таких, что первый из них равен «y», а второй «x» и поменять их местами. Если имеется несколько подходящих пар символов, выбирается пара символов, которая находится ближе к началу строки.
  2. Найти в строке два подряд идущих символа таких, что первый из них равен «x», а второй «y» и удалить их из строки. Если имеется несколько подходящих пар символов, выбирается пара символов, которая находится ближе к началу строки.

Входными данными для нового алгоритма является строка s, а сам алгоритм работает следующим образом:

  1. Если к строке можно применить хотя бы одну из описанных операций, перейти к шагу 2 алгоритма. Иначе закончить выполнение алгоритма, и вывести текущую строку.
  2. Если можно применить операцию 1, то применить операцию 1. Иначе применить операцию 2. После применения операции перейти к шагу 1 алгоритма.

Теперь Виталику интересно, что будет выведено в результате работы алгоритма, если на вход алгоритма подается строка s.

Входные данные

В первой строке содержится непустая строка s.

Гарантируется, что строка состоит только из символов «x» и «y». Гарантируется, что строка состоит из не более чем 106 символов. Гарантируется, что в результате работы алгоритма, не будет получена пустая строка.

Выходные данные

В единственную строку выведите строку, которая будет выведена в результате работы алгоритма, если на вход алгоритма подается строка s.

Примечание

В первом тесте алгоритм закончится после прохождения первого пункта, так как никакую операцию применить нельзя. Таким образом строка не изменится.

Во втором тесте ход преобразований будет таким:

  1. строка «yxyxy» превращается в строку «xyyxy»;
  2. строка «xyyxy» превращается в строку «xyxyy»;
  3. строка «xyxyy» превращается в строку «xxyyy»;
  4. строка «xxyyy» превращается в строку «xyy»;
  5. строка «xyy» превращается в строку «y».

В результате будет выведена строка «y».

В третьем тесте произойдет только одно преобразование: строка «xxxxxy» превращается в строку «xxxx». Таким образом ответом будет строка «xxxx».

D. Остап и квадрат

Бинарный поиск математика реализация *1800

У Остапа есть электронная таблица размера n × n, каждая клетка которой может быть выключена или включена. Он хочет чтобы на поле были включены не менее чем c клеток, когда это условие будет выполнено — Остап станет счастливым.

Будем считать, что строки таблицы пронумерованы сверху вниз от 1 до n, а столбцы — слева направо от 1 до n. Изначально включена ровно одна клетка с координатами (x, y) (x — номер строки, y — номер столбца), а все остальные клетки находятся в выключенном состоянии. Далее каждую секунду происходит включение выключенных клеток, у которых есть включенные соседние по стороне клетки.

Для клетки с координатами (x, y) соседними по стороне являются клетки с координатами (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1).

Через сколько секунд Остап станет счастливым?

Входные данные

В первой строке содержится четыре целых числа, разделенных пробелами, n, x, y, c (1 ≤ n, c ≤ 109; 1 ≤ x, y ≤ nc ≤ n2).

Выходные данные

В единственную строку выведите целое число — ответ на задачу.

Примечание

В первом тесте изначально закрашена одна клетка, по этому ответ 0. Во втором тесте все события будут происходить как показано на картинке. .

E. Фурло и Рубло и Игра

игры математика реализация *2200

Фурло и Рубло играют в игру. На столе лежат n кучек монет, в кучке номер i лежит ai монет. Фурло и Рубло делают ходы по очереди, Фурло ходит первым. За один ход разрешается:

  • выбрать какую-то кучку, обозначим текущее количество монет в ней через x;
  • выбрать некоторое целое число y (0 ≤ y < xx1 / 4 ≤ y ≤ x1 / 2) и уменьшить количество монет в этой кучке до y. Другими словами после описанного хода игрока в выбранной кучке останется y монет.

Игрок, который не может сделать ход — проигрывает.

Ваша задача — узнать, кто выиграет в данной игре, если и Фурло и Рубло играют оптимально.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 77777) — количество кучек. В следующей строке заданы n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 777777777777) — размеры кучек. Числа разделены одиночными пробелами.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Если при оптимальной игре обоих выиграет Фурло — выведите «Furlo», иначе выведите «Rublo». Ответы выводите без кавычек.

A. Розетки

жадные алгоритмы реализация сортировки *1100

У Васи дома много устройств, которые работают от электричества. У него есть n сетевых фильтров, чтобы через них подключать устройства к электросети, i-ый сетевой фильтр имеет ai розеток.

Всего у Васи в квартире m устройств, а также k электрических розеток, к которым можно подключать сетевые фильтры или устройства напрямую. Конечно, сетевые фильтры можно подключать к другим сетевым фильтрам. Устройство (или сетевой фильтр) считается подключенным к электричеству, либо если оно подключено к одной из k электрических розеток, либо если оно подключено к какому-то подключенному к электричеству сетевому фильтру.

Какое минимальное количество сетевых фильтров из заданного набора понадобится Васе, чтобы подключить все имеющиеся устройства к электросети? Обратите внимание, что все устройства и сетевые фильтры при подключении занимают одну розетку и что к одной розетке можно подключить либо одно устройство, либо один сетевой фильтр.

Входные данные

В первой строке заданы три целых числа n, m, k (1 ≤ n, m, k ≤ 50) — количество сетевых фильтров, количество устройств и количество розеток, к которым можно подключаться напрямую, соответственно. Во второй строке через пробел заданы целые числа a1, a2, ..., an (1 ≤ ai ≤ 50) — число ai означает количество розеток на i-ом сетевом фильтре.

Выходные данные

Выведите единственное целое число — минимальное количество сетевых фильтров, которое потребуется для подключения всех устройств. Если все устройства подключить невозможно, используя даже все сетевые фильтры, выведите -1.

Примечание

В первом тестовом примере можно подключить первый сетевой фильтр напрямую к электросети. После такого подключения получится 5 (3 на фильтре и 2 оставшиеся для подключения напрямую) свободных розеток для дальнейшего подключения к электросети. Таким образом, одного фильтра достаточно для подключения 5 устройств.

Один из оптимальных способов подключения во втором тестовом примере — подключить второй сетевой фильтр напрямую, а четвертый сетевой фильтр подключить в одну из розеток на втором сетевом фильтре. В таком случае получится ровно 7 (1 для подключения напрямую, 2 на втором фильтре, 4 на четвертом фильтре) свободных розеток для дальнейшего подключения к электросети. Используя один фильтр, подключить 7 устройств никак не получится.

B. Игра в кубики

жадные алгоритмы игры реализация *1300

Петя и Вася захотели немного поиграть. Они нашли n кубиков красного цвета и m кубиков синего цвета. Игра заключается в следующем: игроки по очереди берут по одному кубику одного из двух цветов и выставляют их в ряд слева направо (всего будет выставлено n + m кубиков в ряд). Первым ходит Петя. Задача Пети — получить как можно больше пар соседних кубиков одного цвета. Задача Васи — получить как можно больше пар соседних кубиков разных цветов.

Количество очков Пети в игре — это количество пар соседних в ряду кубиков одного цвета, количество очков Васи в игре — это количество пар соседних в ряду кубиков разного цвета. От Вас требуется узнать счет в конце игры (количество очков Пети и Васи соответственно), если оба мальчика играют оптимально. «Играть оптимально» означает в первую очередь максимизировать количество своих очков, а во вторую — минимизировать количество очков соперника.

Входные данные

В единственной строке через пробел записаны два целых числа n и m (1 ≤ n, m ≤ 105) — количество красных и синих кубиков соответственно.

Выходные данные

В единственную строку через пробел выведите два числа — количество очков Пети и Васи соответственно при оптимальной игре обоих.

Примечание

В первом тестовом примере для Пети оптимально самым первым ходом выставить в ряд синий кубик. После этого хода останутся только красные кубики, поэтому на конец игры ряд кубиков (слева направо) будет иметь следующий вид: [синий, красный, красный, красный]. Значит, Петя получит 2 очка, а Вася — 1 очко.

Если бы первым ходом Петя выставил красный кубик, то, при дальнейшей оптимальной игре обоих мальчиков, Петя получил бы 1 очко, а Вася — 2 очка.

E. Жадный Лифт

реализация Структуры данных *2200

В m-этажном (m > 1) офисе международной корпорации CodeForces установили новейшую систему управления лифтом. Она работает следующим образом.

Все этажи офиса последовательно пронумерованы целыми числами от 1 до m. В момент времени t = 0 лифт находится на первом этаже, лифт пустой и никто не ждет лифта на других этажах. Далее, в моменты времени ti (ti > 0) к лифту подходят люди. Для простоты будем считать, что один человек пользуется лифтом только один раз в рассматриваемый промежуток времени. Для каждого человека известно 3 параметра: момент времени, в который человек подходит к лифту, этаж, на котором человек находится изначально, и этаж, на который он хочет попасть.

Передвижение лифта между этажами происходит следующим образом. В момент времени t (t ≥ 0, t — целое) лифт всегда находится на каком-то этаже. Лифт сначала выпускает всех людей, которые находятся в лифте и хотят попасть на текущий этаж. Затем он впускает всех людей, которые ждут лифта на текущем этаже. Если человек подходит к лифту ровно в момент времени t, то он успевает в него сесть. Можно считать, что все эти действия (посадка и высадка из лифта) совершаются мгновенно. После этого лифт решает, в каком направлении ему переместиться, и в момент времени (t + 1) лифт попадает на выбранный этаж.

Лифт выбирает направление движения по следующему алгоритму.

  • Если лифт пустой, и в текущий момент времени ни на одном этаже никто его не ждет, то лифт остается на текущем этаже.
  • Иначе, пусть лифт находится на этаже номер x (1 ≤ x ≤ m). Тогда лифт вычисляет «приоритеты» направлений pup и pdown: pup — это сумма количества людей, которые ждут лифт на этажах с номерами больше x, и количества людей в лифте, которые хотят попасть на этаж с номером больше x; pdown — это сумма количества людей, которые ждут лифт на этажах с номерами меньше x, и количества людей в лифте, которые хотят попасть на этаж с номером меньше x. Если pup ≥ pdown, то лифт поднимается на один этаж выше текущего (то есть с этажа x на этаж x + 1), иначе лифт опускается на один этаж ниже текущего (то есть с этажа x на этаж x - 1).

Ваша задача состоит в том, чтобы промоделировать работу лифта и для каждого человека сказать момент времени, когда он окажется на нужном ему этаже. Обратите внимание, лифт достаточно большой, чтобы вместить всех людей одновременно.

Входные данные

В первой строке заданы два целых числа, разделенных пробелом: n, m (1 ≤ n ≤ 105, 2 ≤ m ≤ 105) — количество людей и этажей в здании соответственно.

В следующих n строках содержатся по три целых числа, разделенных пробелами: ti, si, fi (1 ≤ ti ≤ 109, 1 ≤ si, fi ≤ m, si ≠ fi) — момент времени, когда i-тый человек начнет ждать лифта, номер этажа, на котором изначально находится i-тый человек, и номер этажа, на который он хочет попасть.

Выходные данные

Выведите n строк. В i-той строке выведите единственное целое число — момент времени, в который i-тый человек попадет на нужный ему этаж. Люди пронумерованы в том порядке, в котором они заданы во входных данных.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере лифт действовал следующим образом:

  • t = 1. Лифт находится на этаже номер 1. Лифт пуст. На этаже номер 2 ждет один человек. pup = 1 + 0 = 1, pdown = 0 + 0 = 0, pup ≥ pdown. Значит, лифт перемещается на этаж номер 2.
  • t = 2. Лифт находится на этаже номер 2. В лифт заходит один человек, который хочет попасть на этаж номер 7. pup = 0 + 1 = 1, pdown = 0 + 0 = 0, pup ≥ pdown. Значит, лифт перемещается на этаж номер 3.
  • t = 3. Лифт находится на этаже номер 3. В лифте находится один человек, который хочет попасть на этаж номер 7. На этажах с номерами 4 и 6 лифт ждут два человека. pup = 2 + 1 = 3, pdown = 0 + 0 = 0, pup ≥ pdown. Значит, лифт перемещается на этаж номер 4.
  • t = 4. Лифт находится на этаже номер 4. В лифте находится один человек, который хочет попасть на этаж номер 7. В лифт заходит один человек, который хочет попасть на этаж номер 8. На этаже с номером 6 лифт ждет один человек. pup = 1 + 2 = 3, pdown = 0 + 0 = 0, pup ≥ pdown. Значит, лифт перемещается на этаж номер 5.
  • t = 5. Лифт находится на этаже номер 5. В лифте находятся два человека, которые хотят попасть на этажи с номерами 7 и 8 соответственно. На этаже с номером 6 лифт ждет один человек. pup = 1 + 2 = 3, pdown = 0 + 0 = 0, pup ≥ pdown. Значит, лифт перемещается на этаж номер 6.
  • t = 6. Лифт находится на этаже номер 6. В лифте находятся два человека, которые хотят попасть на этажи с номерами 7 и 8 соответственно. В лифт заходит один человек, который хочет попасть на этаж номер 5. pup = 0 + 2 = 2, pdown = 0 + 1 = 1, pup ≥ pdown. Значит, лифт перемещается на этаж номер 7.
  • t = 7. Лифт находится на этаже номер 7. Из лифта выходит человек, который хотел попасть на этаж номер 7. В лифте находятся два человека, которые хотят попасть на этажи с номерами 8 и 5 соответственно. pup = 0 + 1 = 1, pdown = 0 + 1 = 1, pup ≥ pdown. Значит, лифт перемещается на этаж номер 8.
  • t = 8. Лифт находится на этаже номер 8. Из лифта выходит человек, который хотел попасть на этаж номер 8. В лифте находится один человек, который хочет попасть на этаж номер 5. pup = 0 + 0 = 0, pdown = 0 + 1 = 1, pup < pdown. Значит, лифт перемещается на этаж номер 7.
  • t = 9. Лифт находится на этаже номер 7. В лифте находится один человек, который хочет попасть на этаж номер 5. pup = 0 + 0 = 0, pdown = 0 + 1 = 1, pup < pdown. Значит, лифт перемещается на этаж номер 6.
  • t = 10. Лифт находится на этаже номер 6. В лифте находится один человек, который хочет попасть на этаж номер 5. pup = 0 + 0 = 0, pdown = 0 + 1 = 1, pup < pdown. Значит, лифт перемещается на этаж номер 5.
  • t = 11. Лифт находится на этаже номер 5. Из лифта выходит человек, который хотел попасть на этаж номер 5. Лифт пуст и никто его не ждет, а значит, лифт остается на этаже номер 5.

B. Маленький Слоник и магический квадрат

Перебор реализация *1100

Маленький Слоник очень любит магические квадраты.

Магическим квадратом называется таблица размера 3 × 3, в каждой ячейке которой записано некоторое целое положительное число. При этом суммы чисел во всех строках, столбцах и диагоналях таблицы равны между собой. На картинке ниже показан магический квадрат, во всех строках, столбцах и диагоналях которого сумма чисел равна 15.

Маленький Слоник запомнил один магический квадрат. Он стал выписывать на листок бумаги этот квадрат, но пока выписывал забыл все три элемента главной диагонали магического квадрата. К счастью, Маленький Слоник точно запомнил, что все элементы магического квадрата не превосходили 105.

Помогите Маленькому Слонику, восстановите исходный магический квадрат по его записям.

Входные данные

В первых трех строках входных данных заданы записи Маленького Слоника. В первой строке записаны элементы первой строки магического квадрата, во второй — второй строки, в третьей — третьей строки. Вместо элементов главной диагонали, которые забыл Маленький Слоник, записаны нули.

Гарантируется, что в записях ровно три нуля и все они располагаются на главной диагонали. Гарантируется, что все положительные числа в таблице не превосходят 105.

Выходные данные

Выведите три строки, в каждой строке выведите по три целых числа — магический квадрат Маленького Слоника. Если существует несколько магических квадратов, разрешается вывести любой. Обратите внимание, все выведенные числа должны быть положительными и не должны превосходить 105.

Гарантируется, что хотя бы один магический квадрат, удовлетворяющий условиям, существует.

C. Паркет

жадные алгоритмы Комбинаторика Конструктив реализация *2000

Однажды Вася решил положить паркет у себя в гостиной, которая имела размеры n × m метров. У Васи были плитки трех типов: a плиток 1 × 2 метра, b плиток 2 × 1 метра и c плиток 2 × 2 метра. Помогите Васе выяснить, получится ли у него положить паркет в гостиной, и если получится, найдите один из возможных способов это сделать. Васе не обязательно использовать все имеющиеся плитки.

Входные данные

В первой строке входных данных через пробел записаны 5 целых чисел n, m, a, b, c (1 ≤ n, m ≤ 100, 0 ≤ a, b, c ≤ 104), n и m — размеры гостиной, a, b и c — соответственно число плиток 1 × 2, 2 × 1 и 2 × 2. Поворачивать плитки не разрешается.

Выходные данные

Если положить паркет, используя имеющиеся плитки, невозможно, выведите IMPOSSIBLE. Иначе выведите один из возможных вариантов паркета в гостиной — выведите n строк по m строчных латинских букв в каждой. Две соседние по стороне клетки должны содержать одинаковые буквы, если эти клетки относятся к одной и той же плитке, и различные буквы в противном случае. Разные плитки могут обозначаться одной и той же буквой (см. примеры). Если решений несколько, выведите любое.

A. Добавление цифр

математика реализация *1400

У Васи есть два числа: a и b. Однако, число a кажется Васе слишком коротким. По этой причине он решил n раз повторить операцию удлинения числа a.

Одна операция удлинения числа состоит в дописывании к числу ровно одной цифры (в десятичной системе счисления) справа таким образом, чтобы полученное число делилось на Васино число b. Если невозможно получить число, которое делится на b, то операцию удлинения применять нельзя.

Ваша задача состоит в том, чтобы помочь Васе и вывести число, которое может получиться у Васи при применении к числу a операции удлинения n раз.

Входные данные

В первой строке входных данных содержится три целых числа: a, b, n (1 ≤ a, b, n ≤ 105).

Выходные данные

В единственной строке выведите целое число без лидирующих нулей, которое может получиться у Васи при применении к числу a операции удлинения n раз. Если такого числа не существует, то выведите число -1. Если возможных ответов несколько выведите любой.

B. Древнее пророчество

Перебор реализация Строки *1600

Древнее Пророчество, найденное недавно, по мнению ученых содержит в себе точную дату Конца Света. Пророчество представляет собой строку, состоящую только из цифр и символов «-».

Будем говорить, что какая-либо дата упоминается в Пророчестве, если существует подстрока Пророчества, представляющая собой запись этой даты в формате «dd-mm-yyyy». Количеством упоминаний даты будем называть количество таких подстрок в Пророчестве. Например, в Пророчестве «0012-10-2012-10-2012» дата 12-10-2012 упоминается два раза (первый раз — «0012-10-2012-10-2012», второй — «0012-10-2012-10-2012»).

Дата Конца Света — это такая корректная дата, что количество ее упоминаний в Пророчестве строго больше, чем у любой другой корректной даты.

Дата называется корректной, если год лежит в диапазоне от 2013 до 2015, месяц — от 1 до 12, а номер дня строго больше нуля и не превышает количество дней в текущем месяце. Обратите внимание, что дата записывается в формате «dd-mm-yyyy», это значит, что, при необходимости, к числу месяцев или дней дописываются лидирующие нули. Другими словами дата «1-1-2013» не записана в формате «dd-mm-yyyy», а дата «01-01-2013» — записана в нем.

Обратите внимание, что между 2013 и 2015 годами нет ни одного високосного года.

Входные данные

В первой строке содержится Пророчество: непустая строка, состоящая только из цифр и символов «-». Длина Пророчества не превышает 105 символов.

Выходные данные

В единственной строке выведите дату Конца Света. Гарантируется, что такая дата существует и единственна.

C. Коробки и шарики

жадные алгоритмы Конструктив реализация *1700

У маленького мальчика Васи в комнате стояло n коробок с шариками. Коробки стояли в ряд и были пронумерованы числами от 1 до n слева направо.

Однажды Вася выбрал одну из коробок, пусть она имеет номер i, вынул из нее все шарики (гарантируется, что в этой коробке изначально был хотя бы один шарик) и начал класть по одному шарику в коробки с номерами i + 1, i + 2, i + 3 и так далее. Если Вася кладет шарик в коробку номер n, то следующий шарик он положит в коробку 1, затем в коробку 2 и так далее. Так он действовал пока в его руках не осталось ни одного шарика. Возможно, что Вася положит несколько шариков в одну и ту же коробку, а также возможно, что один или несколько шариков попадут в коробку номер i. В случае i = n первый шарик Вася положит в коробку 1, затем в коробку 2 и так далее.

Например, пусть изначально у Васи было четыре коробки, и в первой коробке лежало 3 шарика, во второй — 2, в третьей — 5, в четвертой — 4 шарика. Тогда если i = 3, то Вася вынет все пять шариков из третьей коробки и разложит их в коробки с номерами: 4, 1, 2, 3, 4. После всех действий Васи шарики будут лежать в коробках таким образом: в первой коробке — 4, во второй — 3, в третьей — 1, в четвертой — 6.

На данный момент Вася совсем забыл, как изначально располагались шарики в коробках, но он знает, как они лежат сейчас, и число x — номер коробки, куда он положил последний из вынутых шариков.

Он просит Вас помочь найти начальное расположение шариков в коробках.

Входные данные

В первой строке входных данных находятся два целых числа — n и x (2 ≤ n ≤ 105, 1 ≤ x ≤ n), означающие количество коробок и номер коробки, куда Вася положил последний шарик, соответственно. Во второй строке через пробел записаны n целых чисел a1, a2, ..., an, где число ai (0 ≤ ai ≤ 109, ax ≠ 0) означает количество шариков в коробке номер i после того, как Вася выполнил все действия.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Выведите n целых чисел, где i-ое означает количество шариков в коробке номер i до начала действий Васи. Числа при выводе разделяйте пробелами. Если существует несколько правильных решений, то разрешается вывести любое.

A. Рома и счастливые цифры

реализация *800

Рома любит счастливые числа Маленького Слоника из Львова.

Напомним, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

У Ромы есть n целых положительных чисел. Его интересует вопрос: в скольких из этих чисел количество счастливых цифр не превосходит k? Помогите ему, напишите программу, которая решает эту задачу.

Входные данные

В первой строке заданы два целых числа n, k (1 ≤ n, k ≤ 100). Во второй строке заданы n целых чисел ai (1 ≤ ai ≤ 109) — числа, которые есть у Ромы.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственную строку выведите целое число — ответ на задачу.

Примечание

В первом примере все числа содержат менее четырех счастливых цифр, поэтому ответ — 3.

Во втором примере не подходит число 447, так как оно содержит более двух счастливых цифр. Все остальные числа подходят, поэтому ответ — 2.

A. Красивая матрица

реализация *800

Перед Вами матрица размера 5 × 5, состоящая из 24-x нулей и единственной единицы. Строки матрицы пронумеруем числами от 1 до 5 сверху вниз, столбцы матрицы пронумеруем числами от 1 до 5 слева направо. За один ход разрешается применить к матрице одно из двух следующих преобразований:

  1. Поменять местами две соседние строки матрицы, то есть строки с номерами i и i + 1 для некоторого целого i (1 ≤ i < 5).
  2. Поменять местами два соседних столбца матрицы, то есть столбцы с номерами j и j + 1 для некоторого целого j (1 ≤ j < 5).

Вы считаете, что матрица будет выглядеть красиво, если единственная единица этой матрицы будет находиться в ее центре (в клетке, которая находится на пересечении третьей строки и третьего столбца). Посчитайте, какое минимальное количество ходов потребуется, чтобы сделать матрицу красивой.

Входные данные

Входные данные состоят из пяти строк, в каждой из которых записаны пять целых чисел: j-ое число в i-ой строке входных данных обозначает элемент матрицы, стоящий на пересечении i-ой строки и j-ого столбца. Гарантируется, что матрица состоит из 24-x нулей и единственной единицы.

Выходные данные

Выведите единственное целое число — минимальное количество действий, которое требуется, чтобы сделать матрицу красивой.

B. Квадраты

жадные алгоритмы реализация сортировки *900

Вася нашел лист бумаги, на котором была нарисована система координат. В этой системе координат были построены n различных квадратов. Пронумеруем квадраты целыми числами от 1 до n. Оказалось, что точки с координатами (0, 0) и (ai, ai) являются противоположными углами i-ого квадрата.

Вася хочет найти такую целочисленную точку (координаты которой — целые числа) на плоскости, которая принадлежит ровно k нарисованным квадратам. Будем говорить, что точка принадлежит квадрату, если либо она находится внутри него, либо на его границе.

Помогите Васе найти точку, удовлетворяющую описанным ограничениям.

Входные данные

В первой строке через пробел заданы два целых числа n, k (1 ≤ n, k ≤ 50). Во второй строке через пробел заданы целые числа a1, a2, ..., an (1 ≤ ai ≤ 109).

Гарантируется, что все заданные квадраты различны.

Выходные данные

В единственной строке через пробел выведите два целых числа x и y (0 ≤ x, y ≤ 109) — координаты точки, которая принадлежит ровно k квадратам. Если ответов несколько, разрешается вывести любой из них.

Если ответа не существует, выведите «-1» (без кавычек).

C. Круг чисел

Перебор поиск в глубину и подобное реализация *2000

Вася написал на доске по кругу в некотором порядке n различных целых чисел от 1 до n. Затем он соединил дугами пары чисел (a, b) (a ≠ b), которые либо являются непосредственными соседями друг друга в круге, либо существует число c, такое что a и с являются непосредственными соседями, а также b и c являются непосредственными соседями. Нетрудно догадаться, что в итоге Вася нарисовал n дуг.

Например, если числа по кругу написаны в порядке 1, 2, 3, 4, 5 (по часовой стрелке), то дугами будут соединены пары чисел (1, 2), (2, 3), (3, 4), (4, 5), (5, 1), (1, 3), (2, 4), (3, 5), (4, 1) и (5, 2).

С тех пор прошло немало времени, числа с доски были давно стерты, но не так давно Вася нашел у себя листочек с выписанными n парами чисел, которые были соединены дугами на доске. Вася просит вас найти порядок чисел в круге по этим парам.

Входные данные

В первой строке входных данных записано единственное целое число n (5 ≤ n ≤ 105) — количество чисел в круге. Далее в n строках даны пары целых чисел ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — числа, соединенные дугами.

Гарантируется, что никакая пара чисел, соединенных дугой, не задана во входных данных более одного раза. Пары и числа в парах заданы в произвольном порядке.

Выходные данные

Если Вася где-то ошибся, и не существует ни одного способа расположить числа от 1 до n на круге согласно условию, то выведите единственное число «-1» (без кавычек). Иначе выведите любую подходящую последовательность из n различных целых чисел от 1 до n.

Если существует несколько решений, то разрешается вывести любое. В частности, не имеет значения от какого числа начинать последовательность, описывающую порядок, также неважно по часовой стрелке выписывать числа или против.

A. Спастись от камней

Конструктив реализация Структуры данных *1200

Жила-была себе мирно в лесу Белка Лисска, но беды приходят неожиданно. С горы падают камни. Изначально Белка Лисска находится на интервале [0, 1]. Потом упадут n камней, а Лисска будет убегать от камней. Камни последовательно пронумерованы от 1 до n в порядке их падения.

Камни всегда падают точно в центр интервала Лисски. Когда Лисска занимает интервал [k - d, k + d] и камень падает в точку k, белочка бежит налево или направо. Если она убежит налево, ее новый интервал будет [k - d, k]. Если побежит направо, ее новый интервал будет [k, k + d].

Вам дана строка s длины n. В строке s i-ый символ — это либо «l», либо «r», то есть, когда падает i-ый камень, Лиска побежит налево или направо, соответственно. Найдите последовательность номеров камней слева направо после того, как упадут все n камней.

Входные данные

Во входных данных содержится единственная строка. Единственная строка содержит строку s (1 ≤ |s| ≤ 106). Каждый символ в s будет либо «l», либо «r».

Выходные данные

Выведите n строк — в i-ой строке надо вывести номер i-го слева камня.

Примечание

В первом примере расположения камней 1, 2, 3, 4, 5 будут , соответственно. Поэтому надо вывести последовательность: 3, 5, 4, 2, 1.

A. Цветные камешки (упрощ. редакция)

реализация *800

Дана последовательность разноцветных камней. Цвет каждого камня — красный, зеленый, или синий. Также дана строка s. В строке s i-ый символ (1-индексация) обозначает цвет i-ого камня. Если символ «R», «G», или «B», то цвет соответствующего камня — красный, зеленый или синий, соответственно.

Изначально белка Лисска стоит на первом камне. Вы выполняете инструкции один или более раз.

Каждая инструкция может быть одного из трех типов: «RED», «GREEN», или «BLUE». После выполнения инструкции c, если Лисска стоит на камне цвета c, она перепрыгнет на камень вперед, иначе Лисска не двигается.

Вам задана строка t. Количество инструкций равняется длине строки t, а i-ый символ строки t обозначает i-ую выполняемую инструкцию.

Посчитайте конечное местоположение Лисски (номер камня, на котором она будет стоять) после выполнения всех инструкций и выведите его в 1-индексации. Гарантируется, что Лисска не выпрыгивает за пределы последовательности в процессе выполнения инструкций.

Входные данные

Входные данные состоят из двух строк. Первая строка содержит строку s (1 ≤ |s| ≤ 50). Вторая строка содержит строку t (1 ≤ |t| ≤ 50). Символы в каждой строке будут «R», «G», или «B». Гарантируется, что Лисска не выпрыгивает из последовательности.

Выходные данные

Выведите номер камня (в 1-индексации), на котором окажется Лисска после выполнения инструкций.

B. Деревья у дороги (упрощ. редакция)

жадные алгоритмы реализация *1000

Белка Лисска любит орехи. Дано n деревьев (пронумерованных от 1 до n с запада на восток), посаженных вдоль улицы. На вершине каждого дерева растет по вкуснейшему ореху. Высота древа i равна hi. Лисска хочет съесть все орехи.

Сейчас Лисска сидит у корня дерева с номером 1. За одну секунду Лисска может выполнить одно из следующих действий:

  • Забраться по дереву на единицу высоты вверх или вниз.
  • Съесть орех на вершине текущего дерева.
  • Перепрыгнуть на следующее дерево. В этом действии высота расположения Лисс не меняется. Более формально, когда Лисска находится на высоте h дерева i (1 ≤ i ≤ n - 1), она прыгает на высоту h дерева i + 1. Это действие нельзя выполнить, если h > hi + 1.

Посчитайте минимальное время (в секундах), необходимое для того, чтобы съесть все орехи.

Входные данные

В первой строке содержится целое число n (1  ≤  n ≤ 105) — количество деревьев.

В следующих n строках содержатся высоты деревьев: i-ая строка содержит целое число hi (1 ≤ hi ≤ 104) — высота дерева с номером i.

Выходные данные

Выведите единственное целое число — минимальное время, необходимое для того, чтобы съесть все орехи, в секундах.

A. Камни на столе

реализация *800

На столе в ряд выложены n камней, каждый из которых может быть красного, зеленого или синего цвета. Посчитайте, какое минимальное количество камней нужно убрать со стола, чтобы любые два соседних камня имели разные цвета. Камни в ряду считаются соседними, если между ними нет других камней.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 50) — количество камней на столе.

В следующей строке задана строка s, обозначающая цвета камней. Будем считать, что камни в ряду пронумерованы целыми числами от 1 до n слева направо. Тогда i-ый символ s равен «R», если i-ый камень красного цвета, «G» — если он зеленого цвета, и «B» — если он синего цвета.

Выходные данные

Выведите единственное целое число — ответ на задачу.

B. Очередь в школе

Конструктив кратчайшие пути Паросочетания реализация *800

На перемене в школьной столовой образовалась очередь из n человек, в которой стоят мальчики и девочки. Изначально ребята встали в таком порядке, в котором они забежали в столовую. Однако через некоторое время мальчикам стало неловко, что они стоят в очереди перед девочками, и они стали каждую секунду пропускать девочек вперед.

Опишем процесс более точно. Пусть позиции в очереди последовательно пронумерованы целыми числами от 1 до n, причем тот, кто стоит на позиции номер 1 обслуживается первым. Тогда, если в момент времени x на i-ой позиции стоит мальчик, а на (i + 1)-ой — девочка, то в момент времени x + 1 на i-ой позиции будет находиться девочка, а на (i + 1)-ой — мальчик. Моменты времени заданы в секундах.

Вам задано расположение ребят в начальный момент времени, определите, как будет выглядеть очередь через t секунд.

Входные данные

В первой строке заданы два целых числа n и t (1 ≤ n, t ≤ 50), обозначающие количество ребят в очереди и время, спустя которое требуется определить, как будет выглядеть очередь.

В следующей строке задана строка s, обозначающая начальную расстановку школьников. Если на i-ой позиции в очереди стоит мальчик, то i-ый символ строки s равен «B», иначе i-ый символ равен «G».

Выходные данные

Выведите строку a, обозначающую расположение ребят в очереди спустя t секунд. Если на i-ой позиции через заданное время будет стоять мальчик, то i-ый символ a должен быть равен «B», иначе он должен быть равен «G».

B. Кнопки

математика реализация *1000

Манао пытается взломать очень любопытный замок. На замке есть n кнопок, которые нужно нажать в определенной последовательности, чтобы открыть его. Когда происходит нажатие на какую-либо кнопку, она либо остается зажатой, что означает, что она действительно является следующей в последовательности, либо она сбрасывается вместе со всеми зажатыми в данный момент кнопками. Когда одновременно оказываются зажаты все кнопки, замок открывается.

Рассмотрим пример с тремя кнопками. Скажем, последовательность нажатия кнопок, открывающая замок, равна: {2, 3, 1}. Если сначала нажать на кнопки 1 или 3, они немедленно сбросятся. Если нажать на кнопку 2, она останется зажатой. Если после нажатия кнопки 2 нажать на кнопку 1, то все кнопки сбросятся. Если же после нажатия кнопки 2 нажать на кнопку 3 — она останется зажатой вместе с кнопкой 2. При двух зажатых кнопках остается лишь нажать на кнопку 1, чтобы замок открылся.

Манао не знает последовательность, в которой нужно нажимать кнопки, чтобы открыть замок. Зато он очень умный и будет действовать оптимально. Вычислите количество нажатий, которое ему придется произвести для открытия замка в худшем случае.

Входные данные

Единственная строка содержит целое число n (1 ≤ n ≤ 2000) — количество кнопок у замка.

Выходные данные

В единственной строке выведите количество нажатий в худшем случае.

Примечание

Рассмотрим первый тестовый пример. Манао может не повезти с первым нажатием и он нажмет не на ту кнопку, на которую надо было нажимать первой. В таком случае вторым ходом он уже может отгадать первую кнопку. А третьим — вторую кнопку. Таким образом, в худшем случае ему понадобится всего 3 нажатия.

C. Красивые множества точек

Конструктив реализация *1500

Манао изобрел новый математический термин — красивое множество точек. Он называет множество точек на плоскости красивым, если выполняются следующие условия:

  1. Координаты каждой точки множества — целые числа.
  2. Для любых двух точек из этого множества, расстояние между ними — нецелое число.

Рассмотрим все точки (x, y), удовлетворяющие неравенствам: 0 ≤ x ≤ n; 0 ≤ y ≤ m; x + y > 0. Выберите из них как можно больше точек, так чтобы все выбранные точки образовывали красивое множество.

Входные данные

В единственной строке записаны два разделенных пробелом целых числа n и m (1 ≤ n, m ≤ 100).

Выходные данные

В первой строке выведите целое число — размер найденного красивого множества k. В следующих k строках выведите по паре разделенных пробелом целых чисел — соответственно x- и y- координаты выбранных в множество точек.

Если существует несколько оптимальных решений, разрешается вывести любое.

Примечание

Рассмотрим первый пример. Расстояние между точками (0, 1) и (1, 2) равно , между (0, 1) и (2, 0) — , между (1, 2) и (2, 0) — . Таким образом, эти точки составляют красивое множество. Красивое множество с больше чем тремя точками из заданных точек выбрать невозможно. Заметьте, что это не единственный возможный ответ.

A. Следующий тест

реализация сортировки *1200

Система разработки задач «Полигон» упрощает и систематизирует процесс создания задач по программированию для соревнований и тренировок. При добавлении теста в ручном режиме соответствующая форма предлагает ввести номер теста. Так как в большинстве случаев очевидно какой номер теста предполагает разработчик задачи, система сама предлагает значение по умолчанию. Это значение вычисляется как наименьшее положительное целое число, которое не является номером добавленного ранее теста.

Ваша задача повторить эту функциональность. Напишите программу, которая по списку добавленных ранее тестов находит значение по умолчанию для номера теста на форме его добавления.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 3000) — количество уже добавленных тестов в систему. Вторая строка содержит последовательность различных целых чисел a1, a2, ..., an (1 ≤ ai ≤ 3000) — номера уже добавленных тестов. Номера заданы в произвольном порядке и разделены пробелами.

Выходные данные

Выведите искомое значение по умолчанию.

A. Завидный забор

геометрия математика реализация *1100

Эмускальду надо построить забор вокруг фермы, но вот самому это делать ему лень. Так что юноша приобрел робота-заборостройщика.

Эмускальду хочется, чтобы забор представлял собой правильный многоугольник. К сожалению, его робот строит забор, двигаясь по единственному пути. При этом робот может соединять стороны забора только под заданным углом a.

Сможет ли робот построить забор, который хочет Эмускальд? Иными словами, существует ли правильный многоугольник с углами, равными a?

Входные данные

Первая строка входных данных содержит целое число t (0 < t < 180) — количество тестов. Каждая из последующих t строк содержит единственное целое число a (0 < a < 180) — угол, под которым робот может соединять стороны, в градусах.

Выходные данные

Для каждого теста выведите в единственной строке «YES» (без кавычек), если робот может построить тот забор, который хочет Эмускальд. Если это невозможно, выведите «NO» (без кавычек).

Примечание

В первом тесте невозможно построить забор, так как не существует правильного многоугольника с углами .

Во втором тесте забор представляет собой правильный треугольник, а в последнем тесте — квадрат.

B. Обсуждения

жадные алгоритмы реализация Структуры данных *1400

Эмускальд подсел на Codeforces — теперь он постоянно обновляет главную страницу, чтобы не пропустить никаких изменений в списке прямого эфира. Ему нравится читать обсуждения (треды), каждое обсуждение состоит из нескольких сообщений.

Прямой эфир отображает список n различных обсуждений, упорядоченных по времени последнего сообщения в обсуждении. Когда в обсуждении публикуется очередное сообщение, оно перемещается на вершину списка. Никакие два сообщения в различных обсуждениях никогда не публикуются одновременно.

Эмускальд дочитал все свои открытые обсуждения. Теперь он обновляет главную страницу, надеясь найти еще немного новых сообщений. Обновив станицу, Эмускальд заметил, что новые обсуждения не появились в списке, а на i-м месте в списке стоит обсуждение, которое занимало ai-ое место до обновления. Эмускальд не хочет терять времени на перечитывание старых сообщений, поэтому он хочет открыть только обсуждения с новыми сообщениями.

Помогите Эмускальду узнать количество обсуждений, которые наверняка содержат новые сообщения. Обсуждение x наверняка содержит новое сообщение, если не существует такой последовательности публикаций новых сообщений, для которой выполняются оба следующих условия:

  1. обсуждение x не обновлено (в нем не опубликовано новое сообщение);
  2. порядок 1, 2, ..., n обсуждений в списке меняется на a1, a2, ..., an.
Входные данные

Первая строка входных данных содержит целое число n, количество обсуждений (1 ≤ n ≤ 105). В следующей строке записан список из n целых чисел a1, a2, ..., an через пробел, где ai (1 ≤ ai ≤ n) — это старое положение i-ого обсуждения в новом списке. Гарантируется, что все ai различны.

Выходные данные

Выведите единственное целое число — количество обсуждений, которые наверняка содержат новое сообщение.

Примечание

В первом тесте обсуждения 2 и 5 поставлены перед обсуждением 1, значит, в этих обсуждениях должны быть новые сообщения. Обсуждения 1, 3 и 4 могут не содержать новых сообщений, если новые сообщения есть только в обсуждениях 2 и 5.

Во втором тесте может вообще не быть новых сообщений, потому что порядок обсуждений не изменился.

В третьем тесте только в обсуждении a4 может не быть новых сообщений.

C. Секрет

Конструктив реализация *1500

Самый Великий Секрет состоит из n слов, пронумерованных натуральными числами от 1 до n. Секрет требуется разделить между k Хранителями (пронумеруем их натуральными числами от 1 до k), i-ый Хранитель получает непустое множество слов c номерами из множества Ui = (ui, 1, ui, 2, ..., ui, |Ui|). Здесь и далее будем подразумевать, что при записи элементов множества они перечисляются в порядке возрастания.

Скажем, что секрет надежно хранится, если выполняются следующие условия:

  • для любых двух индексов i, j (1 ≤ i < j ≤ k) пересечение множеств Ui и Uj — пустое множество;
  • объединение множеств U1, U2, ..., Uk — это множество (1, 2, ..., n);
  • в каждом множестве Ui его элементы ui, 1, ui, 2, ..., ui, |Ui| не образуют арифметическую прогрессию (в частности должно выполняться |Ui| ≥ 3).

Напомним, что элементы множества (u1, u2, ..., us) образуют арифметическую прогрессию, если существует такое число d, что для всех i (1 ≤ i < s) выполняется: ui + d = ui + 1. Например, элементы множеств (5), (1, 10) и (1, 5, 9) образуют арифметические прогрессии, а множеств (1, 2, 4) и (3, 6, 8) — не образуют.

Вам требуется найти разбиение множества слов на подмножества U1, U2, ..., Uk, чтобы секрет был надежно сохранен, либо указать, что искомого разбиения не существует.

Входные данные

Входные данные состоят из единственной строки, в которой записаны два целых числа n и k (2 ≤ k ≤ n ≤ 106) — количество слов в секрете и количество Хранителей. Числа разделены единственным пробелом.

Выходные данные

Если не существует ни одного способа надежно хранить секрет, то выведите единственное целое число «-1» (без кавычек). Иначе выведите n целых чисел, i-ое из которых означает номер Хранителя, которому принадлежит i-ое слово секрета.

Если существует несколько решений, то выведите любое.

A. Дима и друзья

математика реализация *1000

Дима и его друзья всю ночь играли в прятки в квартире Димы. В результате квартира Димы стала грязной. Утром ребята решили, что нужно убраться в квартире.

Чтобы решить, кто именно будет убираться в квартире, друзья хотят воспользоваться считалочкой. Сначала все ребята встанут в круг; затем каждый из них покажет на одной руке сколько-то пальцев (от одного до пяти); после чего ребята отсчитают по кругу, начиная от Димы, столько людей, сколько всего пальцев было показано. Человек, на котором остановится отсчет, будет убирать квартиру.

Например, если в прятки играли Дима и один его друг, а во время считалки было показано 7 пальцев, то квартиру будет убирать Дима. Если бы было показано 2 пальца или, к примеру, 8 пальцев, тогда бы квартиру пришлось убирать его другу.

Дима знает, сколько пальцев покажет во время считалки каждый из его друзей. Сейчас его интересует количество способов показать некоторое количество пальцев на одной руке (от одного до пяти), так чтобы ему не пришлось убираться в квартире. Помогите Диме.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 100) — количество друзей Димы. Сам Дима не считается другом самого себя. Во второй строке даны n целых положительных чисел не превышающих 5 — количества пальцев, которые покажут друзья Димы во время считалки.

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственную строку выведите ответ на задачу.

Примечание

В первом примере Дима может показать 1, 3 или 5 пальцев. Если Дима покажет 3 пальца, то отсчет будет идти следующим образом: Дима, Друг, Дима, Друг.

Во втором примере Дима может показать 2 или 4 пальца.

B. Дима и последовательность

математика реализация *1400

Дима увлекается последовательностями чисел. Сейчас у него есть последовательность a1, a2, ..., an, состоящая из n целых положительных чисел. А так же у Димы есть функция f(x), которую можно определить следующим рекуррентным соотношением:

  • f(0) = 0;
  • f(2·x) = f(x);
  • f(2·x + 1) = f(x) + 1.

Диму заинтересовал вопрос: сколько существует пар индексов (i, j) (1 ≤ i < j ≤ n), таких что f(ai) = f(aj). Помогите ему, посчитайте, сколько таких пар.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 105). Во второй строке даны n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 109).

Числа в строках разделены одиночными пробелами.

Выходные данные

В единственную строку выведите ответ на задачу.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере любая пара (i, j) подойдет, поэтому ответ — 3.

Во втором примере подходит только пара (1, 2).

C. Дима и лесенка

реализация Структуры данных *1500

У Димы есть лесенка, которая состоит из n ступенек. Первая ступенька имеет высоту a1, вторая — a2, последняя — an (1 ≤ a1 ≤ a2 ≤ ... ≤ an).

Дима решил поиграться с лесенкой, поэтому он бросает сверху на лесенку прямоугольные коробки: i-тая коробка имеет ширину wi и высоту hi. Каждую коробку Дима бросает вертикально вниз на первые wi ступенек лесенки, то есть коробка покрывает ступеньки с номерами 1, 2, ..., wi. Каждая брошенная коробка летит вертикально вниз, до тех пор пока не случится хотя бы одно их двух следующих событий:

  • низ коробки коснется верха одной из ступенек;
  • низ коробки коснется верха одной из уже брошенных коробок.

Учитывается только касание горизонтальных сторон ступенек и коробок, при этом касание углами не учитывается. В частности из этого следует, что коробка шириной wi не может коснуться ступеньки с номером wi + 1.

Вам задано описание лесенки и последовательность, в которой Дима кидал коробки на нее. Для каждой коробки определите, на какой высоте окажется низ этой коробки после приземления. Считайте, что очередная коробка бросается уже после приземления предыдущей.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество ступенек у лесенки. Во второй строке задана неубывающая последовательность, состоящая из n целых чисел, a1, a2, ..., an (1 ≤ ai ≤ 109ai ≤ ai + 1).

В следующей строке задано целое число m (1 ≤ m ≤ 105) — количество коробок. В каждой из следующих m строк записана пара целых чисел wi, hi (1 ≤ wi ≤ n; 1 ≤ hi ≤ 109) — размер i-той брошенной коробки.

Числа в строках разделяются пробелами.

Выходные данные

Выведите m целых чисел — для каждой коробки высоту, на которой окажется низ этой коробки после приземления. Ответы для коробок выводите в порядке, в котором коробки заданы во входных данных.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

На картинке изображен первый тестовый пример.

E. Зеркальная комната

реализация Структуры данных *3000

Представьте таблицу размера n × m, где некоторые ячейки заблокированы. У ячейки в верхнем левом углу координаты — (1, 1), а у ячейки в правом нижнем углу — (n, m). Всего в таблице существуют k заблокированных ячеек, остальные ячейки — пустые. Вы пускаете луч лазера из центра пустой ячейки (xs, ys) в одном из диагональных направлений (то есть северо-восток, северо-запад, юго-запад или юго-восток). Если луч попадает в заблокированную ячейку или на границу таблицы, то он отражается. Поведение отражения луча в разных ситуациях показано на рисунке ниже.

Заметим, что через некоторое время луч попадает в бесконечный цикл. Посчитайте количество пустых ячеек, через которые луч проходит хотя бы однажды. Считается, что луч проходит через ячейку, если он проходит через ее центр.

Входные данные

Первая строка входных данных содержит три целых числа n, m и k (1 ≤ n, m ≤ 105, 0 ≤ k ≤ 105). Каждая из следующих k строк содержит два целых числа xi и yi (1 ≤ xi ≤ n, 1 ≤ yi ≤ m), числа обозначают положение i-ой заблокированной ячейки.

Последняя строка содержит два целых числа xs, ys (1 ≤ xs ≤ n, 1 ≤ ys ≤ m) и направление луча, равное «NE», «NW», «SE» или «SW». Эти строки соответствуют направлениям ( - 1, 1), ( - 1,  - 1), (1, 1), (1,  - 1).

Гарантируется, что никакие две блокируемые ячейки не имеют одинаковых координат.

Выходные данные

В единственной строке выходных данных выведите количество пустых ячеек, через которые луч проходит хотя бы раз.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

A. Уходя, гасите свет!

реализация *900

Ленни играет в игру на таблице, состоящей из 3 × 3 лампочек. В начале игры все лампочки включены. Если нажать на какую-то лампочку, то переключится и она, и все соседние с ней по стороне лампочки. Под переключением подразумевается, что если лампочка была выключена — она включится и, если была включена — выключится. Цель игры — выключить все лампочки.

Немного поиграв, Ленни нажал каждую лампочку некоторое количество раз. Вам дано количество нажатий для каждой лампочки. Ваша задача — вывести текущее состояние каждой лампочки.

Входные данные

Во входных данных записаны три строки. В каждой строке записано по три целых числа, каждое от 0 до 100, включительно: j-ое число в i-той строке обозначает количество нажатий j-той лампочки в i-том ряду таблицы.

Выходные данные

Выведите три строки, в каждой строке выведите по три символа: j-ый символ i-ой строки равен «1» тогда и только тогда, когда соответствующая лампочка включена. В противном случае он равен «0».

B. Выпуклая фигура

Конструктив реализация *1700

Рассмотрим таблицу размера n × m. Изначально все ячейки таблицы закрашены белым цветом. Ленни закрасил некоторые из ячеек (по красней мере, одну) черным. Назовем таблицу выпуклой, если можно пройти от любой черной ячейки до любой другой черной ячейки (разрешено переходить с ячейки на любую из соседних по стороне черных ячеек), изменяя направление не больше одного раза на протяжении пути. На картинке ниже левая таблица выпуклая, а правая — нет, поскольку существуют две ячейки, путь между которыми в любом случае требует более одного изменения направления движения.

Во входных данных задана таблица. Скажите Ленни, является она выпуклой или нет.

Входные данные

Первая строка входных данных содержит два целых числа n и m (1 ≤ n, m ≤ 50) — размер таблицы. В каждой из следующих n строк содержится по m символов «B» или «W». Символ «B» обозначает черную ячейку таблицы, а «W» обозначает белую ячейку таблицы.

Гарантируется, что в таблице содержится хотя бы одна черная ячейка.

Выходные данные

В единственной строке выходных данных выведите «YES», если таблица выпуклая, в противном случае выведите «NO». Кавычки не выводите.

A. Проблемные обеды

реализация *900

После написания очередного соревнования по программированию, три Кролика решили пообедать. Тренер выделил команде Кроликов на обед ровно k единиц времени.

У Кроликов есть список, состоящий из n ресторанов, в которых они могут перекусить: i-ый ресторан характеризуется двумя целыми числами fi и ti. Величина ti показывает время, которое Кролики затратят на обед в i-ом ресторане. Если время ti превосходит по величине время k, выделенное тренером на обед, то удовольствие, которое получат Кролики, пообедав в этом ресторане, будет равно fi - (ti - k). Иначе, удовольствие, которое получат Кролики, будет равно fi.

Ваша задача — найти величину максимального удовольствия, которое могут получить Кролики от обеда в зависимости от выбора ресторана. Кролики должны выбрать ровно один ресторан для обеда. Обратите внимание, что величина удовольствия не всегда является положительной величиной.

Входные данные

Первая строка входных данных содержит два целых числа, разделенных пробелом — n (1 ≤ n ≤ 104) и k (1 ≤ k ≤ 109) — количество ресторанов в списке Кроликов и время, выделенное тренером на обед, соответственно. Каждая из следующих n строк содержит два целых числа, разделенных пробелом — fi (1 ≤ fi ≤ 109) и ti (1 ≤ ti ≤ 109) — характеристики i-того ресторана.

Выходные данные

В единственной строке выведите целое число — величину максимального удовольствия, которое получат Кролики от обеда.

C. Девочка и максимальная сумма

жадные алгоритмы реализация сортировки Структуры данных *1500

Девочка очень любит задачи про запросы на массиве.

Однажды ей попалась довольно известная задача: дан массив из \(n\) элементов (элементы массива проиндексированы от 1); также есть \(q\) запросов, каждый из которых задается парой целых чисел \(l_i\), \(r_i\) \((1 \le l_i \le r_i \le n)\). Для каждого запроса необходимо найти сумму всех элементов массива с индексами от \(l_i\) до \(r_i\) включительно.

Такая задача показалась Девочке довольно скучной. Она решила, что перед тем, как отвечать на запросы, она перемешает элементы массива, причем так, чтобы сумма ответов на все запросы была максимально возможной. Ваша задача — найти значение этой максимальной суммы.

Входные данные

Первая строка содержит два целых числа \(n\) (\(1 \le n \le 2\cdot10^5\)) и \(q\) (\(1 \le q \le 2\cdot10^5\)), разделенных пробелом — количество элементов в массиве и количество запросов, соответственно.

Следующая строка содержит \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 2\cdot10^5\)), разделенных пробелами — элементы массива.

Каждая из следующих \(q\) строк содержит два целых числа \(l_i\) и \(r_i\) (\(1 \le l_i \le r_i \le n\)), разделенных пробелом — \(i\)-й запрос.

Выходные данные

В единственной строке выведите целое число — максимальную сумму ответов на запросы после перемешивания элементов массива.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

D. Девочка и максимальный XOR

битмаски дп жадные алгоритмы математика реализация *1700

Девочка очень любит задачи про битовые операции. Вот одна из них.

Вам дано два целых числа l и r. Рассмотрим значения величины для всех пар целых чисел a и b (l ≤ a ≤ b ≤ r). Ваша задача — найти максимальное значение, среди всех рассматриваемых.

Выражение обозначает применение операции побитового исключающего или к числам x и y. Данная операция есть во всех современных языках программирования, например, в языке C++ и Java она обозначается «^», в Pascal — «xor».

Входные данные

В единственной строке записаны разделенные пробелом целые числа l и r (1 ≤ l ≤ r ≤ 1018).

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

В единственной строке выведите целое число — максимальное значение для всех пар чисел a, b (l ≤ a ≤ b ≤ r).

C. Игра

игры реализация *2400

Два игрока играют в следующую игру. Изначально у игроков имеется нож и прямоугольный лист бумаги, разделенный сеткой на одинаковые квадратные клетки единичного размера. Участники делают ходы по очереди, проигрывает тот, кто не может сделать ход. За один ход игрок может провести ножом вдоль любого отрезка линии сетки (необязательно от края до края). Участок бумаги, по которому провели ножом хотя бы один раз, считается разрезанным. Чтобы игра не зациклилась, на ход накладывается ограничение: каждый ход должен разрезать какой-то новый участок бумаги ненулевой длины.

Очевидно, что игра завершится, когда весь лист будет разрезан на клетки 1 × 1. В процессе игры запрещается перемещать части листа. Также запрещается проводить разрезы вдоль границы. Координаты концов каждого разреза должны быть целыми числами.

Вам дан лист бумаги размером n × m, на котором уже кто-то сделал k разрезов. Ваша задача — определить, кто выиграет при оптимальной игре, если игроки начнут играть на данном листе. В случае победы первого игрока также требуется найти выигрышный первый ход.

Входные данные

В первой строке записано три целых числа n, m, k (1 ≤ n, m ≤ 109, 0 ≤ k ≤ 105) — размеры листа бумаги и количество разрезов. Далее следует k строк по четыре целых числа в каждой xbi, ybi, xei, yei (0 ≤ xbi, xei ≤ n, 0 ≤ ybi, yei ≤ m) — координаты концов существующих разрезов.

Гарантируется, что каждый разрез имеет ненулевую длину, является либо вертикальным, либо горизонтальным, и не проходит по границе листа.

Разрезы могут пересекаться, накладываться и даже совпадать. То есть не гарантируется, что разрезы были получены в результате какой-то корректной игры.

Выходные данные

Если выигрывает второй игрок, выведите «SECOND». Иначе в первой строке выведите «FIRST», а во второй строке — любой выигрышный ход первого игрока (координаты концов разреза в том же формате, что и во входных данных).

A. Кольцевая

реализация *800

На кольцевой линии берляндского метро расположено n станций. Известны расстояния между всеми парами соседних станций:

  • d1 — расстояние между 1-ой и 2-ой станцией;
  • d2 — расстояние между 2-ой и 3-ой станцией;

    ...

  • dn - 1 — расстояние между n - 1-ой и n-ой станцией;
  • dn — расстояние между n-ой и 1-ой станцией.

Поезда ходят по кольцевой линии в обоих направлениях. Найдите кратчайшее расстояние между станциями с номерами s и t.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество станций на кольцевой линии. Во второй строке записано n целых чисел d1, d2, ..., dn (1 ≤ di ≤ 100) — расстояния между парами соседних станций. В третьей строке записано два целых числа s и t (1 ≤ s, t ≤ n) — номера станций, между которыми требуется найти кратчайшее расстояние. Эти номера могут совпадать.

Числа в строках разделяются одиночными пробелами.

Выходные данные

Выведите одно число — длину кратчайшего пути между станциями с номерами s и t.

Примечание

В первом примере длина пути 1 → 2 → 3 равна 5, длина пути 1 → 4 → 3 равна 13.

Во втором примере длина пути 4 → 1 равна 100, длина пути 4 → 3 → 2 → 1 равна 15.

В третьем примере длина пути 3 → 1 равна 1, длина пути 3 → 2 → 1 равна 2.

В четвертом примере номера станций совпадают, поэтому кратчайшее расстояние равно 0.

A. Точка на спирали

геометрия Перебор реализация *1400

Конь Валера живет на плоскости. На его плоскости задана декартова система координат. Также на его плоскости нарисована бесконечная спираль. Спираль состоит из отрезков: [(0, 0), (1, 0)], [(1, 0), (1, 1)], [(1, 1), ( - 1, 1)], [( - 1, 1), ( - 1,  - 1)], [( - 1,  - 1), (2,  - 1)], [(2,  - 1), (2, 2)] и так далее. Таким образом, эта бесконечная спираль проходит через каждую точку плоскости с целыми координатами.

Конь Валера живет на плоскости в точке с координатами (0, 0). Он хочет прогуляться вдоль спирали до точки с координатами (x, y). У Коня Валеры четыре ноги, поэтому ему очень сложно поворачивать. Посчитайте, сколько раз ему придется повернуть, если он будет идти по спирали от точки (0, 0) до точки (x, y).

Входные данные

В первой строке заданы два целых числа x и y (|x|, |y| ≤ 100).

Выходные данные

Выведите единственное целое число — сколько раз придется повернуть Валере.

B. Книги

Бинарный поиск Перебор реализация *1400

Когда у Валеры появляется свободное время, он идет в библиотеку и читает книги. Вот и сегодня у него появилось t свободных минут для чтения. Поэтому Валера взял n книг в библиотеке и для каждой книги оценил: какое время потребуется, чтобы ее прочитать. Пронумеруем книги целыми числами от 1 до n. Для прочтения i-той книги Валере требуется ai минут.

Валера решил, что он выберет произвольную книгу с номером i и будет читать книги друг за другом, начиная с этой книги. Другими словами, сначала он прочитает книгу c номером i, затем книгу с номером i + 1, затем книгу с номером i + 2 и так далее. Он продолжает этот процесс до тех пор, пока либо не закончится его свободное время, либо не прочитает книгу с номером n. Каждую книгу Валера читает целиком, то есть он не читает книгу, которую не успеет дочитать до конца из-за нехватки свободного времени.

Посчитайте максимальное количество книг, которое Валера сможет прочитать.

Входные данные

В первой строке заданы два целых числа n и t (1 ≤ n ≤ 105; 1 ≤ t ≤ 109) — количество книг и количество свободных минут у Валеры соответственно. Во второй строке задана последовательность из n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 104), в которой число ai обозначает количество минут, которое требуется для прочтения i-ой книги.

Выходные данные

Выведите единственное целое число — максимальное количество книг, которое Валера сможет прочитать.

C. Лесенка

дп реализация *1700

Вам задан массив, состоящий из n целых чисел a1, a2, ..., an. Также задано m запросов, i-ый запрос описывается двумя целыми числами li, ri. Числа li, ri обозначают подотрезок исходного массива, то есть последовательность чисел ali, ali + 1, ali + 2, ..., ari. Для каждого запроса нужно проверить, является ли соответствующий ему подотрезок лесенкой.

Лесенкой назовем последовательность целых чисел b1, b2, ..., bk такую, что сначала она не убывает, а затем не возрастает. Другими словами, существует такое целое число x (1 ≤ x ≤ k), что выполняется неравенство: b1 ≤ b2 ≤ ... ≤ bx ≥ bx + 1 ≥ bx + 2... ≥ bk. Обратите внимание, что неубывающая и невозрастающая последовательности также считаются лесенками.

Входные данные

В первой строке заданы два целых числа n и m (1 ≤ n, m ≤ 105) — количество элементов массива и количество запросов соответственно. Во второй строке задана последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109), в которой число ai обозначает i-ый элемент массива.

Далее в m строках заданы описания запросов. В i-ой строке задано описание i-ого запроса, состоящее из двух целых чисел li, ri (1 ≤ li ≤ ri ≤ n) — границы подотрезка исходного массива.

Числа в строках разделяются одиночными пробелами.

Выходные данные

Выведите m строк, в i-ой строке выведите слово «Yes» (без кавычек), если подотрезок, соответствующий i-ому запросу, является лесенкой, или слово «No» (без кавычек) в противном случае.

A. Задача Бендера

реализация *1600

Робот Бендер решил сделать Фраю подарок на день рождения. Он вбил n гвоздей и в определенном порядке пронумеровал их. Робот решил сделать из имеющихся у него железных прутьев картину, представляющую собой замкнутую ломаную, вершинами которой являются гвозди в заданном порядке, а отрезки ломаной параллельны осям координат. Самопересечения допускаются. Бендер может взять подходящий прут, согнуть его ровно один раз в любом месте под углом 90 градусов и прикрепить местом сгиба к еще не занятому гвоздю, а два конца прикрепить к двум соседним. Гвоздь считается незанятым, если к нему не прикреплен ни один прут (ни конец, ни место сгиба). Никакой прут нельзя использовать дважды. Вы можете использовать не все прутья.

Помогите Бендеру решить эту непростую задачу.

Входные данные

В первой строке даны два натуральных числа n и m (4 ≤ n ≤ 500, 2 ≤ m ≤ 500, n четно) — количество гвоздей и прутьев соответственно. В следующих n строках даны координаты гвоздей в том порядке, в котором они соединяются ломаной. В (n + 2)-ой строке заданы m чисел — длины прутьев. Все координаты — целые числа, не превосходящие по модулю 104. Длины прутьев — целые числа от 1 до 200 000. Никакой прут нельзя использовать дважды. Гарантируется, что все отрезки заданной ломаной параллельны осям координат и никакие 3 подряд идущих гвоздя не лежат на одной прямой.

Выходные данные

Если задача Бендера неразрешима, выведите NO. Иначе в первой строке выведите YES, а во второй строке выведите n чисел — i-ое число — номер прута, место сгиба которого прикреплена к i-ому гвоздю, или -1, если нет такого прута.

Если решений несколько, выведите любое.

B. Байк и максимальный XOR

реализация Структуры данных *1800

Байк очень любит искать второй максимальный элемент в последовательности. Вторым максимальным элементом в последовательности различных чисел x1, x2, ..., xk (k > 1) называется такой максимальный элемент xj, что выполняется неравенство: .

Счастливым числом последовательности различных целых положительных чисел x1, x2, ..., xk (k > 1) называется число, равное побитовому исключающему ИЛИ максимального элемента последовательности и второго максимального элемента последовательности.

Вам задана последовательность различных целых положительных чисел s1, s2, ..., sn (n > 1). Обозначим за s[l..r] (1 ≤ l < r ≤ n) последовательность sl, sl + 1, ..., sr. Ваша задача — среди всех счастливых чисел последовательностей s[l..r] найти максимальное.

Обратите внимание, что, так как все числа в последовательности s различны, все заданные определения имеют смысл.

Входные данные

В первой строке записано целое число n (1 < n ≤ 105). В следующей строке записаны n различных целых чисел s1, s2, ..., sn (1 ≤ si ≤ 109).

Выходные данные

Выведите единственное целое число — максимальное счастливое число среди всех счастливых чисел последовательностей s[l..r].

Примечание

В первом тестовом примере Вы можете выбрать s[4..5] = {4, 3}, счастливое число равно (4 xor 3)  =  7. Также можно выбрать s[1..2].

Во втором тестовом примере Вы должны выбрать s[2..5] = {8, 3, 5, 7}.

C. Игра на дереве

Деревья математика реализация Теория вероятностей *2200

У Мумиджу есть корневое дерево, состоящее из n вершин. Вершины дерева пронумерованы целыми числами от 1 до n. Корень дерева имеет номер 1. Мумиджу решил поиграть в игру на этом дереве.

Игра состоит из нескольких шагов. На каждом шаге Мумиджу выбирает одну из оставшихся вершин дерева (обозначим ее v) и удаляет из дерева все вершины поддерева с корнем в вершине v. Сама вершина v тоже удаляется. Игра заканчивается, когда в дереве не остается вершин. Другими словами, игра заканчивается после шага, на котором выбрана вершина с номером 1.

Каждый раз Мумиджу выбирает новую вершину равновероятно среди всех оставшихся вершин. Ваша задача — найти математическое ожидание количества шагов в описанной игре.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество вершин дерева. В следующих n - 1 строках заданы ребра дерева. В i-той строке записаны целые числа ai, bi (1 ≤ ai, bi ≤ nai ≠ bi) — номера вершин, которые соединены i-тым ребром.

Гарантируется, что заданный граф является деревом.

Выходные данные

Выведите единственное вещественное число — математическое ожидание количества шагов в описанной игре.

Ответ будет считаться правильным, если его относительная или абсолютная погрешность не превышает 10 - 6.

Примечание

В первом тестовом примере возможны два случая. Первый — это сразу удалить корень, второй — удалить корень после одного шага. Таким образом, математическое ожидание количества шагов равно:

1 × (1 / 2) + 2 × (1 / 2) = 1.5

Второй пример более сложный. Два случая из трех приводят нас к задаче, эквивалентной первому тестовому примеру, третий случай — удалить корень на первом шаге. Таким образом, математическое ожидание количества шагов равно:

1 × (1 / 3) + (1 + 1.5) × (2 / 3) = (1 / 3) + (5 / 3) = 2

D. Максимальная сумма k подотрезков

графы Потоки реализация Структуры данных *2800

Рассмотрим последовательность целых чисел a1, a2, ..., an. Вам требуется выполнять запросы двух типов:

  • Формат запроса «0 i val». В ответ на запрос нужно выполнить присвоение: ai = val.
  • Формат запроса «1 l r k». В ответ на запрос нужно вывести максимальную сумму не более чем k непересекающихся подотрезков последовательности al, al + 1, ..., ar. Формально, вам нужно выбрать не более чем k пар целых чисел (x1, y1), (x2, y2), ..., (xt, yt) (l ≤ x1 ≤ y1 < x2 ≤ y2 < ... < xt ≤ yt ≤ rt ≤ k) таких, чтобы сумма ax1 + ax1 + 1 + ... + ay1 + ax2 + ax2 + 1 + ... + ay2 + ... + axt + axt + 1 + ... + ayt была как можно больше. Обратите внимание, что требуется выбрать не более чем k подотрезков. В частности, можно выбрать 0 подотрезков. В таком случае описанная сумма считается равной нулю.
Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество чисел в последовательности. В следующей строке записаны n целых чисел a1, a2, ..., an (|ai| ≤ 500).

В третьей строке записано целое число m (1 ≤ m ≤ 105) — количество запросов. В следующих m строках записаны запросы в формате, описанном в условии.

Для всех запросов на изменение элемента выполняются ограничения: 1 ≤ i ≤ n, |val| ≤ 500.

Для всех запросов на подсчет максимальной суммы не более чем k непересекающихся подотрезков выполняются ограничения: 1 ≤ l ≤ r ≤ n, 1 ≤ k ≤ 20. Гарантируется, что количество запросов на подсчет максимальной суммы не более чем k непересекающихся подотрезков не превышает 10000.

Выходные данные

Для каждого запроса на подсчет максимальной суммы не более чем k непересекающихся подотрезков выведите ответ — максимальную сумму. Ответы на запросы выводите в порядке следования запросов во входных данных.

Примечание

В первом запросе первого примера можно выбрать единственную пару (1, 9). Таким образом, описанная сумма будет равна 17.

Взгляните на второй запрос первого примера. Как выбрать два подотрезка? (1, 3) и (7, 9)? Нет, конечно: сумма (1, 3) и (7, 9) равняется 20, в то время как при оптимальном выборе (1, 7) и (9, 9) сумма равняется 25.

Ответ на третий запрос равняется 0, мы предпочитаем ничего не выбирать, если на данном интервале все числа отрицательные.

E. Трансформация последовательности

дп математика Перебор реализация Структуры данных *3000

Вам задана неубывающая последовательность x1, x2, ..., xn (1 ≤ x1 ≤ x2 ≤ ... ≤ xn ≤ q). Также Вам заданы два целых числа a и b (a ≤ ba·(n - 1) < q).

Ваша задача преобразовать последовательность x1, x2, ..., xn в некоторую последовательность y1, y2, ..., yn (1 ≤ yi ≤ qa ≤ yi + 1 - yi ≤ b). Определим стоимость преобразования как сумму: . Требуется выбрать такую последовательность y, что описанная стоимость преобразования минимальна.

Входные данные

В первой строке заданы четыре целых числа n, q, a, b (2 ≤ n ≤ 6000; 1 ≤ q, a, b ≤ 109a·(n - 1) < qa ≤ b).

Во второй строке задана неубывающая последовательность целых чисел x1, x2, ..., xn (1 ≤ x1 ≤ x2 ≤ ... ≤ xn ≤ q).

Выходные данные

В первой строке выведите n вещественных чисел — искомую последовательность y1, y2, ..., yn (1 ≤ yi ≤ qa ≤ yi + 1 - yi ≤ b). Во второй строке выведите минимальную стоимость преобразования, то есть .

Если существует несколько оптимальных ответов, можно вывести любой из них.

Ответ будет считаться правильным, если относительная или абсолютная погрешность не будет превышать 10 - 6.

A. Капитализация слова

реализация Строки *800

Капитализация — это запись слова, в которой первая буква слова записывается как прописная буква. Ваша задача, вывести капитализацию заданного слова.

Обратите внимание, что в капитализации все буквы слова кроме первой остаются не измененными.

Входные данные

В первой строке записано непустое слово. Слово состоит из строчных и прописных букв латинского алфавита. Длина заданного слова не превосходит 103 букв.

Выходные данные

Выведите капитализацию слова.

B. Ближайшая дробь

Перебор реализация *1700

Даны три положительных целых числа x, y, n. Надо найти ближайшую дробь к дроби , имеющую знаменатель, не превышающий n.

Формально, надо найти такую пару целых чисел a, b (1 ≤ b ≤ n; 0 ≤ a), чтобы значение было минимально возможным.

Если есть несколько «ближайших» дробей, выберите дробь с наименьшим знаменателем. Если есть несколько «ближайших» дробей с наименьшим знаменателем, выберите дробь с наименьшим числителем.

Входные данные

В единственной строке содержатся три целых числа x, y, n (1 ≤ x, y, n ≤ 105).

Выходные данные

Выведите необходимую дробь в формате «a/b» (без кавычек).

A. Bit++

реализация *800

Классический язык программирования в Битландии — Bit++. Этот язык очень необычный и сложный!

Особенность языка Bit++ состоит в том, что в нем ровно одна переменная, которая называется x. Также в этом языке есть две операции:

  • Операция ++ увеличивает значение, хранящееся в переменной x на 1.
  • Операция -- уменьшает значение, хранящееся в переменной x на 1.

Предложение в языке Bit++ — это последовательность, состоящая из ровно одной операции и ровно одной переменной x. Предложение записывается без пробелов, то есть может содержать только символы: «+», «-», «X». Выполнить предложение, значит выполнить операцию, которая содержится в предложении.

Программа на языке Bit++ — это последовательность предложений, каждое из которых требуется выполнить. Выполнить программу, значит выполнить все ее предложения.

Вам задана программа на языке Bit++. Перед выполнением программы в переменной x хранится значение 0. Выполните программу и выведите значение, которое будет храниться в переменной x после выполнения программы.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 150) — количество предложений в программе. В каждой из следующих n строк записано по предложению. Каждое предложение состоит из ровно одной операции (++ или --) и ровно одной переменной x (обозначается буквой «X»). Таким образом, не бывает пустых предложений. Операция и переменная могут быть записаны в любом порядке.

Выходные данные

Выведите единственное целое число — значение, которое будет храниться в переменной x после выполнения программы.

C. XOR или OR

Конструктив математика реализация *1500

Необъяснимый народ эти битландцы. Все-то они делают по-своему. У них свой алфавит и свое определение строки.

Битландская строка — это строка, которая состоит только из символов «0» и «1».

BitHaval (мэр Битландии) любит поиграть с битландскими строками. Он берет некоторую битландскую строку a и затем применяет к ней несколько (возможно, ноль) операций. За одну операцию мэр может выбрать любые два соседних символа строки, обозначим один из них через x, второй — через y. После чего он считает две величины p и q: p = x xor y, q = x or y. Далее, один из двух выбранных символов мэр заменяет на p, второй — на q.

Операция xor обозначает операцию битового исключающего ИЛИ. Операция or обозначает операцию битового ИЛИ.

Например, строка 11 может быть за одну операцию преобразована в строку 10 или в строку 01. Строка 1 не может быть преобразована ни в какую другую строку.

Вам заданы две битландские строки a и b. Ваша задача — определить, сможет ли мер за несколько (возможно, ноль) описанных операций получить из строки a строку b.

Входные данные

В первой строке записана битландская строка a, во второй строке записана битландская строка b. Строки могут иметь разную длину.

Гарантируется, что заданные строки состоят только из символов «0» и «1». Строки не пустые, их длина не превышает 106.

Выходные данные

Выведите «YES» — если преобразовать a в b можно, иначе выведите «NO». Кавычки выводить не нужно.

A. Коровки и последовательность

Конструктив реализация Структуры данных *1600

Бесси с коровками играют с последовательностями, и им нужна Ваша помощь. Игра начинается с последовательности, изначально содержащей только одно число 0, во время игры коровки выполняют n операций. Операции бывают следующих типов:

  1. Прибавить целое число xi к каждому из ai первых элементов последовательности.
  2. Добавить целое число ki к концу последовательности (размер последовательности увеличивается на 1).
  3. Удалить последний элемент последовательности. Таким образом, размер последовательности уменьшается на один. Обратите внимание, что эту операцию можно выполнить, только если в последовательности есть по меньшей мере два элемента.

После каждой операции коровкам интересно знать среднее арифметическое всех чисел в последовательности. Помогите им!

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 2·105) — количество операций. Следующие n строк описывают операции. Каждая строка начинается с целого числа ti (1 ≤ ti ≤ 3), обозначающего тип операции (см. выше). Если ti = 1, то за ним последуют два целых числа ai, xi (|xi| ≤ 103; 1 ≤ ai). Если ti = 2, то за ним последует единственное целое число ki (|ki| ≤ 103). Если ti = 3, то за ним ничего не последует.

Гарантируется, что все операции корректны (не затрагивают несуществующих элементов) и что в последовательности всегда будет хотя бы одно целое число.

Выходные данные

Выведите n строк, в каждой должно содержаться среднее арифметическое всех чисел в последовательности после выполнения соответствующей операции.

Ответ считается корректным, если абсолютная или относительная погрешность не превышает 10 - 6.

Примечание

Во втором примере последовательность преобразуется следующим образом:

A. Коровки и первообразные корни

математика реализация теория чисел *1400

Коровки только что узнали, что такое первообразный корень! Вам дано простое число p, первообразный корень — целое число x (1 ≤ x < p), такое, что ни одно из целых чисел x - 1, x2 - 1, ..., xp - 2 - 1 не делится на p, при этом число xp - 1 - 1 делится на p.

К сожалению, на вычисление первообразных корней уходит много времени, так что коровкам нужна Ваша помощь. Вам дано простое число p, помогите коровкам найти количество первообразных корней .

Входные данные

Во входных данных содержится единственная строка, в которой записано целое число p (2 ≤ p < 2000). Гарантируется, что p является простым числом.

Выходные данные

В единственной строке выведите количество первообразных корней .

Примечание

Единственный первообразный корень 2.

Первообразные корни 2 и 3.

B. Коровки и игра в покер

Перебор реализация *1000

За столом сидят n коровок и играют в покер. Сейчас на кону у каждого игрока статус — либо «ALLIN», либо «IN», либо «FOLDED», статус не меняется весь кон. Игрок, статус которого не «FOLDED», может накалить атмосферу, раскрыв карты. Но на ставки влиять нельзя, так что раскрыть карты можно только если у всех остальных игроков статус — либо «ALLIN», либо «FOLDED». Статус данного игрока может быть либо «ALLIN», либо «IN».

Найдите количество коровок, которые могут сейчас раскрыть карты, не повлияв на ставки.

Входные данные

В первой строке записано единственное целое число n (2 ≤ n ≤ 2·105). Во второй строке записано n символов, каждый за них — «A», «I», или «F»: i-ый символ равен «A», если статус i-го игрока равен «ALLIN», «I» — если статус i-го игрока равен «IN», или «F» — если статус i-го игрока равен «FOLDED».

Выходные данные

Первая строка должна содержать единственное целое число, обозначающее количество игроков, которые могут раскрыть карты в данный момент.

Примечание

В первом примере коровки номер 1, 4, 5 и 6 могут раскрыть карты. Во втором примере только коровка номер 3 может раскрыть карты.

A. Немного убывающие перестановки

жадные алгоритмы реализация *1100

Перестановкой p называется упорядоченный набор чисел p1,  p2,  ...,  pn, состоящий из n различных целых положительных чисел, каждое из которых не больше чем n. Обозначим i-ый элемент перестановки p через pi. Число n будем называть размером или длиной перестановки p1,  p2,  ...,  pn.

Коэффициентом убывания перестановки p1, p2, ..., pn назовем количество таких i (1 ≤ i < n), что pi > pi + 1.

Ваша задача состоит в том, чтобы по заданным числам n и k вывести перестановку длины n с коэффициентом убывания, равным k.

Входные данные

В единственной строке находятся два целых числа, разделенные пробелом: n, k (1 ≤ n ≤ 105, 0 ≤ k < n) — длина перестановки и коэффициент убывания.

Выходные данные

В единственной строке выведите n целых чисел, разделяя их пробелами: p1, p2, ..., pn — перестановку длины n с коэффициентом убывания k.

Если существует несколько перестановок, удовлетворяющих условию, то можно вывести любую из них. Гарантируется, что перестановка с искомыми параметрами существует.

B. Найди шарик

реализация *1200

Петя и Вася играют в следующую игру. У Пети есть n непрозрачных стаканов, стоящих в ряд. Места, на которых стоят стаканы, пронумерованы целыми числами от 1 до n слева направо. Обратите внимание, что пронумерованы места, а не сами стаканы.

Сначала Петя кладет шарик под стакан, стоящий на месте номер s. Затем Петя совершает некоторое (возможно, нулевое) количество операций перемешивания. Одна операция перемешивания состоит в перемещении стакана на первом месте на место p1, стакана на втором месте на место p2 и так далее. То есть стакан с места i переместится на место pi. Считайте, что все перемещения стаканов происходят одновременно. Во время перемешивания стаканов шарик не перекатывается из стакана в стакан, он перемещается вместе с тем стаканом, в который его положили изначально.

После всех операций перемешивания Петя показывает Васе, что шарик оказался на месте t. Задача Васи состоит в том, чтобы сказать, какое минимальное количество операций перемешивания совершил Петя, или определить, что Петя совершил ошибку, и шарик не мог попасть из позиции s в позицию t.

Входные данные

В первой строке содержатся три целых числа: n, s, t (1 ≤ n ≤ 105; 1 ≤ s, t ≤ n) — количество стаканов, начальное положение шарика и конечное положение шарика. Во второй строке содержатся n целых чисел, разделенных пробелами: p1, p2, ..., pn (1 ≤ pi ≤ n) — параметры операции перемешивания. Гарантируется, что все pi различны.

Обратите внимание, что s может быть равно t.

Выходные данные

Если шарик может переместиться с места s на место t, то в единственной строке выведите целое неотрицательное число — минимальное количество операций перемешивания, необходимых для того, чтобы шарик попал на место t. Если же это невозможно, то выведите число -1.

C. Получаем перестановку

жадные алгоритмы реализация сортировки *1200

Перестановкой p называется упорядоченный набор чисел p1,  p2,  ...,  pn, состоящий из n различных целых положительных чисел, каждое из которых не больше чем n. Обозначим i-й элемент перестановки p через pi. Число n будем называть размером или длиной перестановки p1,  p2,  ...,  pn.

Вам дана последовательность целых чисел a1, a2, ..., an. За один ход разрешается уменьшить или увеличить любое число на единицу. Посчитайте, какое наименьшее число ходов необходимо, чтобы получить из данной последовательности перестановку.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 3·105) — размер искомой перестановки. Во второй строке записаны n целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109).

Выходные данные

Выведите единственное целое число — минимальное количество ходов.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом примере нужно уменьшить первое число на единицу, и затем увеличить второе число на единицу. В результате получится перестановка (2, 1).

Во втором примере за 6 ходов можно получить перестановку (1, 3, 2).

D. Сумма перестановок

meet-in-the-middle битмаски дп Комбинаторика реализация *1900

Перестановкой p называется упорядоченный набор чисел p1,  p2,  ...,  pn, состоящий из n различных целых положительных чисел, каждое из которых не больше чем n. Обозначим i-ый элемент перестановки p через pi. Число n будем называть размером или длиной перестановки p1,  p2,  ...,  pn.

Петя решил ввести операцию суммы на множестве перестановок длины n. Пусть заданы две перестановки длины n: a1, a2, ..., an и b1, b2, ..., bn. Суммой перестановок a и b Петя назвал такую перестановку c длины n, у которой ci = ((ai - 1 + bi - 1) mod n) + 1 (1 ≤ i ≤ n).

Операция обозначает взятие остатка от деления числа x на число y.

Очевидно, что не для всех перестановок a и b будет существовать перестановка c, являющаяся их суммой. Из-за этого Петя расстроился и попросил Вас для заданного n посчитать количество таких пар перестановок a и b длины n, что существует перестановка c, являющаяся суммой a и b. Пара перестановок x, y (x ≠ y) и пара перестановок y, x считаются различными парами.

Так как ответ может получиться достаточно большим, выведите его остаток от деления на 1000000007 (109 + 7).

Входные данные

В единственной строке находится целое число n (1 ≤ n ≤ 16).

Выходные данные

В единственной строке выведите целое неотрицательное число — количество таких пар перестановок a и b, что существует перестановка c, которая является суммой a и b, по модулю 1000000007 (109 + 7).

B. Сдвиги

реализация *2200

Джон Доу нашел формулу красивой перестановки.

Рассмотрим перестановку p = p1, p2, ..., pn. Определим преобразование f этой перестановки:

где k (k > 1) — это целое число, параметр преобразования, r — это такое максимальное целое число, что rk ≤ n. Если rk = n, то элементы prk + 1, prk + 2 и далее опускаются. Другими словами, описанное преобразование перестановки p делает циклический сдвиг влево каждого из последовательных блоков длины k, а также последнего блока, длина которого равна остатку от деления n на k.

Джон Доу считает, что перестановка f(f( ... f(p = [1, 2, ..., n], 2) ... , n - 1), n) является красивой. К сожалению, он не может быстро найти интересующую его красивую перестановку. Поэтому он обратился за помощью к Вам.

Вам требуется найти красивую перестановку для заданного n. Для лучшего понимания условия обратите внимание на разбор третьего тестового примера.

Входные данные

В единственной строке записано целое число n (2 ≤ n ≤ 106).

Выходные данные

Выведите через пробел n различных целых чисел от 1 до n — красивую перестановку, размера n.

Примечание

Разберем третий тестовый пример:

  • f([1, 2, 3, 4], 2) = [2, 1, 4, 3]
  • f([2, 1, 4, 3], 3) = [1, 4, 2, 3]
  • f([1, 4, 2, 3], 4) = [4, 2, 3, 1]

C. Самая главная последовательность

жадные алгоритмы реализация *2100

Как вы знаете, недавно Вова стал новым шаманом города Крайняя Туле. И теперь знание о правильных скобочных последовательностях перешло к нему. Шаманы города Крайняя Туле издавна используют много разных типов скобок. Тип скобки — это целое положительное число. Шаманы определяют правильную скобочную последовательность следующим образом:

  • Пустая последовательность является правильной скобочной последовательностью.
  • Если {a1, a2, ..., al} и {b1, b2, ..., bk} — правильные скобочные последовательности, то последовательность {a1, a2, ..., al, b1, b2, ..., bk} (их конкатенация) тоже является правильной скобочной последовательностью.
  • Если {a1, a2, ..., al} — правильная скобочная последовательность, то последовательность тоже является правильной скобочной последовательностью, где v (v > 0) — целое число.

Например, последовательности {1, 1,  - 1, 2,  - 2,  - 1} и {3,  - 3} являются правильными скобочными последовательностями, а {2,  - 3} — нет.

Более того, став шаманом, Вова узнает самую главную правильную скобочную последовательность {x1, x2, ..., xn}, состоящую из n целых чисел. Так как последовательность x — самая главная, Вова решил на всякий случай ее зашифровать.

Шифровка состоит из двух последовательностей. В первой последовательности {p1, p2, ..., pn} записаны типы скобок, то есть pi = |xi| (1 ≤ i ≤ n). Во второй последовательности {q1, q2, ..., qt} записаны t целых чисел — некоторые позиции (возможно не все), на которых в последовательности {x1, x2, ..., xn} стояли отрицательные числа.

К несчастью, Вова забыл самую главную последовательность, но у него сохранилась шифровка: последовательности {p1, p2, ..., pn} и {q1, q2, ..., qt}. Помогите Вове восстановить последовательность x по шифровке. Если существует несколько последовательностей, соответствующих шифровке, нужно восстановить любую, если не существует ни одной требуемой последовательности, нужно об этом сообщить.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 106). Во второй строке записаны n целых чисел: p1, p2, ..., pn (1 ≤ pi ≤ 109).

В третьей строке записано целое число t (0 ≤ t ≤ n) и после него t различных целых чисел q1, q2, ..., qt (1 ≤ qi ≤ n).

Числа в каждой строке отделены друг от друга пробелами.

Выходные данные

Выведите единственную строку «NO» (без кавычек), если Вова ошибся, и подходящей последовательности {x1, x2, ..., xn} не существует.

Иначе выведите в первую строку «YES» (без кавычек), а во вторую — n целых чисел x1, x2, ..., xn (|xi| = pixqj < 0). Если существует несколько последовательностей, соответствующих шифровке, разрешается вывести любую.

A. IQ-тест

Перебор реализация *1100

В городе Крайняя Туле при приеме на работу часто требуют пройти IQ-тест.

Тест заключается в следующем: испытуемому выдают листок бумаги, на котором нарисован клетчатый квадрат 4 × 4, часть клеток которого окрашено в черный цвет, а часть — в белый. Нужно перекрасить не более одной клетки в другой цвет так, чтобы на рисунке появился квадрат 2 × 2, полностью состоящий из клеток одного цвета. Если такой квадрат уже есть, испытуемый должен просто сказать об этом и тест будет пройден.

Вам требуется написать программу, которая определяет, можно ли пройти тест. Тест пройти нельзя, если при перекрашивании любой клетки или при бездействии не найдется квадратов 2 × 2, состоящих из клеток одного цвета.

Входные данные

В четырех строках записаны по четыре символа: j-й символ i-й строки равен «.», если клетка в i-й строке и j-м столбце квадрата покрашена в белый цвет, и «#», если в черный.

Выходные данные

Выведите «YES» (без кавычек), если тест можно пройти, и «NO» (без кавычек) в противном случае.

Примечание

В первом тестовом примере достаточно перекрасить первую клетку второй строки. После этого перекрашивания требуемый квадрат 2 × 2 будет находиться на пересечении 1-й и 2-й строки с 1-м и 2-м столбцом.

C. Пингвин Поло и операция XOR

математика реализация *1700

Пингвин Поло очень любит перестановки. Но больше всего он любит перестановки целых чисел от 0 до n, включительно.

Для перестановки p = p0, p1, ..., pn Поло определил ее красоту — число .

Выражение обозначает применение операции побитового исключающего «ИЛИ» к числам x и y. Данная операция есть во всех современных языках программирования, например, в языке C++ и Java она обозначается символом «^», в Pascal — «xor».

Помогите ему найти среди всех перестановок целых чисел от 0 до n перестановку с максимальной красотой.

Входные данные

В единственной строке задано целое положительное число n (1 ≤ n ≤ 106).

Выходные данные

В первой строке выведите целое число m — максимально возможную красоту, в следующей строке выведите любую перестановку целых чисел от 0 до n, красота которой равна m.

Если существует несколько подходящих перестановок, разрешается вывести любую.

E. Пингвин Поло и счастливые числа

дп математика реализация *2800

Всем известно, что счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Например, числа 47, 744, 4 являются счастливыми, а 5, 17, 467 — не являются.

У пингвина Поло есть два целых положительных числа l и r (l < r), причем оба они являются счастливыми числами. Более того, их длины (то есть количество цифр в десятичной записи без лидирующих нулей) равны между собой.

Пусть n — количество различных счастливых чисел, каждое из которых не больше r и не меньше l, а aii-ое по величине из них. Найдите a1·a2 + a2·a3 + ... + an - 1·an. Так как ответ может быть достаточно большим, выведите его остаток от деления на 1000000007 (109 + 7).

Входные данные

В первой строке задано целое положительное число l, а во второй — целое положительное число r (1 ≤ l < r ≤ 10100000). Числа заданы без лидирующих нулей.

Гарантируется, что длины заданных чисел равны между собой и что оба они являются счастливыми числами.

Выходные данные

В единственной строке выведите целое число — ответ на задачу по модулю 1000000007 (109 + 7).

A. Пингвин Поло и отрезки

Перебор реализация *1100

Маленький пингвин Поло очень любит целочисленные отрезки, то есть пары целых чисел [lr] (l ≤ r).

У него есть множество, состоящее из n целочисленных отрезков: [l1r1], [l2r2], ..., [lnrn]. Известно, что никакие два отрезка этого множества не пересекаются. За один шаг Поло может расширить любой отрезок множества на 1 влево или на 1 вправо, то есть из отрезка [lr] получить либо отрезок [l - 1; r], либо — [lr + 1].

Величиной множества отрезков, состоящего из n отрезков [l1r1], [l2r2], ..., [lnrn], назовем количество целых чисел x таких, что существует целое число j, для которого выполняется неравенство, lj ≤ x ≤ rj.

Найдите минимальное количество шагов, которое требуется, чтобы величина множества отрезков Поло делилась на k.

Входные данные

В первой строке заданы два целых числа n и k (1 ≤ n, k ≤ 105). В каждой из следующих n строк задан отрезок в виде пары целых чисел li и ri ( - 105 ≤ li ≤ ri ≤ 105), записанных через пробел.

Гарантируется, что никакие два отрезка не пересекаются. Другими словами, для любых двух целых чисел i, j (1 ≤ i < j ≤ n) выполняется неравенство, min(ri, rj) < max(li, lj).

Выходные данные

В единственной строке выведите целое число — ответ на задачу.

B. Пингвин Поло и матрица

дп Перебор реализация сортировки Тернарный поиск *1400

У маленького пингвина Поло есть матрица n × m, состоящая из целых чисел. Пронумеруем строки матрицы от 1 до n сверху вниз, а столбцы от 1 до m слева направо. Обозначим через aij элемент матрицы, стоящий на пересечении i-ой строки и j-го столбца.

За один шаг пингвин может добавить к любому элементу матрицы или отнять от любого элемента матрицы число d. Найдите минимальное количество шагов, которое требуется для того, чтобы все элементы матрицы были равны между собой. Если описанное невозможно, сообщите об этом.

Входные данные

В первой строке заданы три целых числа n, m и d (1 ≤ n, m ≤ 100, 1 ≤ d ≤ 104) — размеры матрицы и параметр d. В следующих n строках записана матрица: j-тое целое число в i-той строке — элемент матрицы aij (1 ≤ aij ≤ 104).

Выходные данные

В единственной строке выведите целое число — минимальное количество шагов, которое требуется для того, чтобы все элементы матрицы были равны между собой. Если описанное невозможно, выведите «-1» (без кавычек).

B. Светофор

реализация *1500

Из пункта A в пункт B со скоростью v м/с едет машина. Действие происходит на оси Ox. На расстоянии d метров, считая от A, находится светофор. Начиная с момента времени 0, первые g секунд на светофоре говорит зеленый свет, следующие r секунд на нем говорит красный свет, затем снова g секунд зеленый и так далее.

Машина может мгновенно разгоняться от 0 до v и, наоборот, может мгновенно тормозить от v до 0. Считается, что она проезжает на светофоре на зеленый свет мгновенно. Если машина подъезжает к светофору в момент, когда на нем только загорелся красный, она не успевает проехать. Но если она подъезжает в момент, когда только загорелся зеленый, она может проехать. Машина выезжает из пункта A в момент времени 0.

За какое наименьшее время машина сможет доехать из пункта A до пункта B, не нарушая при этом правил дорожного движения?

Входные данные

В первой строке записаны целые числа l, d, v, g, r (1 ≤ l, d, v, g, r ≤ 1000, d < l) — соответственно расстояние между A и B (в метрах), расстояние от A до светофора, скорость машины, время зеленого света, время красного света.

Выходные данные

Выведите одно число — за какое наименьшее время машина сможет приехать из пункта A в пункт B. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 6.

C. Почтовые штампы

графы поиск в глубину и подобное реализация Структуры данных *1700

Однажды Васе в руки попалось бумажное письмо в конверте. Вася знает, что когда работники Берляндской почты пересылают письмо напрямую из города «A» в город «B» они ставят на него либо штамп «A B», либо «B A». К сожалению, часто невозможно напрямую переслать письмо из города отправителя в город получателя, поэтому письмо пересылается через некоторые промежуточные города. Работники почты никогда не пересылают письмо по циклу, то есть письмо не может побывать в одном городе дважды. Вася уверен, что при каждой пересылке они исправно ставят штампы.

На конверте Васиного письма n почтовых штампов. Он понимает, что возможных маршрута следования письма всего два. Но штампов очень много, и Вася не может сам определить ни один из этих маршрутов. Поэтому он просит вас помочь ему. Найдите один из возможных маршрутов следования письма.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — числа почтовых штампов на конверте. Далее следует n строк по два целых числа — описания штампов. Каждый штамп описывается номерами городов, между которыми письмо пересылалось. Номера городов — целые числа от 1 до 109. Номера всех городов различны. Каждой пересылке письма соответствует ровно один почтовый штамп. Гарантируется, что описанные штампы соответствуют корректному маршруту следования письма из одного города в некоторый другой.

Выходные данные

Выведите n + 1 число — номера городов в одном из двух возможных маршрутов в порядке следования письма.

A. Таинственные строки

*особая задача реализация *1400

Входные данные

Входные данные содержат целое число a (1 ≤ a ≤ 40).

Выходные данные

Выведите единственную строку.

B. QR код

*особая задача реализация *1500

Входные данные

Входные данные содержат два целых числа a1, a2 (0 ≤ ai ≤ 32), разделенные пробелом.

Выходные данные

Выведите единственное целое число.

C. WTF?

*особая задача Деревья Паросочетания реализация *1700


HAI
I HAS A TUX
GIMMEH TUX
I HAS A FOO ITS 0
I HAS A BAR ITS 0
I HAS A BAZ ITS 0
I HAS A QUZ ITS 1
TUX IS NOW A NUMBR
IM IN YR LOOP NERFIN YR TUX TIL BOTH SAEM TUX AN 0
I HAS A PUR
GIMMEH PUR
PUR IS NOW A NUMBR
FOO R SUM OF FOO AN PUR
BAR R SUM OF BAR AN 1
BOTH SAEM BIGGR OF PRODUKT OF FOO AN QUZ AN PRODUKT OF BAR BAZ AN PRODUKT OF FOO AN QUZ
O RLY?
YA RLY
BAZ R FOO
QUZ R BAR
OIC
IM OUTTA YR LOOP
BAZ IS NOW A NUMBAR
VISIBLE SMOOSH QUOSHUNT OF BAZ QUZ
KTHXBYE
Входные данные

Входные данные состоят из от 1 до 10 строк, i-тая строка содержит целое число xi (0 ≤ xi ≤ 9).

Выходные данные

Выведите единственное вещественное число. Ответ будет считаться правильным, если его абсолютная или относительная погрешность не превышает 10 - 4.

D. Orange

*особая задача реализация *1400

Входные данные

В первой строке входных данных содержится строка (длиной от 1 до 50 символов, включительно). Каждый символ строки — это заглавная или прописная буква латинского алфавита.

Во второй строке записано целое число от 0 до 26, включительно.

Выходные данные

Выведите требуемую строку.

A. Разговоры в Spyke

*особая задача реализация сортировки *800

Поликарп — директор большой корпорации. В этой корпорации работает n секретарей, каждый из которых пользуется известной VoIP-системой Spyke для ведения переговоров в течение рабочего дня. Известно, что, когда два человека устанавливают телефонное соединение Spyke, сеть Spyke присваивает этому разговору уникальный идентификационный номер (целое положительное число) — номер сессии.

Как-то раз Поликарп захотел узнать, кто из секретарей разговаривает по Spyke, а кто — нет. Он выписал для каждого секретаря номер сессии его разговора, или 0, если этот секретарь сейчас не разговаривает по Spyke.

Помогите Поликарпу по этим данным определить, сколько пар секретарей сейчас ведут разговор между собой. Если в данные Поликарпа закралась ошибка, и описанная ситуация никак не могла произойти, требуется сообщить об этом.

Обратите внимание, секретари могут разговаривать по Spyke не только друг с другом — возможны разговоры с внешними собеседниками. Также не разрешены конференции Spyke — то есть в каждом разговоре должны участвовать ровно два собеседника.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 103) — количество секретарей в корпорации Поликарпа. В следующей строке записаны n целых чисел через пробел: id1, id2, ..., idn (0 ≤ idi ≤ 109). Число idi равно номеру сессии разговора секретаря номер i, если он разговаривает в данный момент по Spyke, или равно нулю, в противном случае.

Считайте, что секретари пронумерованы от 1 до n некоторым образом.

Выходные данные

Выведите единственное целое число — количество пар секретарей, которые ведут разговор между собой, или -1, если в данные Поликарпа закралась ошибка, и описанная ситуация никак не могла произойти.

Примечание

В первом тестовом примере есть два телефонных разговора между секретарями: секретарь номер 2 и секретарь номер 4, секретарь номер 3 и секретарь номер 5.

Во втором тестовом примере описанная ситуация невозможна, так как не разрешены конференции.

B. Аргументы командной строки

*особая задача реализация Строки *1300

В данной задаче используется описание свойств командной строки, близкое к тому, что вы привыкли видеть в настоящих операционных системах. Однако, в деталях существуют отличия в поведении. Внимательно прочтите условие, используйте его как формальный документ при разработке решения.

В операционной системе Pindows лексемами командной строки являются строки — первая из них трактуется как имя запускаемой программы, а последующие как ее аргументы. Например, выполняя команду « run.exe one, two . », мы передаем командной строке Pindows четыре лексемы: «run.exe», «one,», «two», «.». Более формально, если мы выполняем команду, которая представима строкой s (и не содержит кавычек), то лексемами командной строки являются максимальные по включению подстроки строки s, которые не содержат пробелов.

Для того, чтобы передать в качестве лексемы командной строки строку с пробелами или пустую строку, используются двойные кавычки. Блок символов, который должен рассматриваться как одна лексема, берется в кавычки. При этом вложенные кавычки запрещаются — то есть про каждое вхождение символа «"» можно однозначно сказать — что это, открывающие кавычки или закрывающие. Например, выполняя команду «"run.exe o" "" " ne, " two . " " », мы передаем командной строке Pindows шесть лексем: «run.exe o», «» (пустая строка), « ne, », «two», «.», « » (единичный пробел).

Гарантируется, что каждая из лексем командной строки окружена с обеих сторон пробелами или упирается в соответствующий край командной строки. Из этого, например, следует, что открывающие кавычки либо являются первым символом строки, либо слева от них находится пробел.

Вам задана строка, состоящая из прописных, строчных букв латинского алфавита, цифр, символов «.,?!"» и пробелов. Гарантируется, что эта строка — корректная командная строка OS Pindows. Выведите все лексемы этой командной строки. Считайте, что символ «"» используется в команде только для выделения единого блока символов в одну лексему командной строки, в частности, из этого следует, что таких символов в заданной строке четное количество.

Входные данные

В единственной строке задана непустая строка s. Строка s состоит из не более чем 105 символов. Каждый символ — это либо прописная, либо строчная буква латинского алфавита, либо цифра, либо один из символов «.,?!"», либо пробел.

Гарантируется, что заданная строка — некоторая корректная командная строка OS Pindows. Гарантируется, что в заданной командной строке есть хотя бы одна лексема.

Выходные данные

В первой строке выведите первую лексему, во второй строке — вторую, и так далее. Для наглядности слева от каждой лексемы выведите символ «<» (меньше), а справа — символ «>» (больше). Выводите лексемы в том порядке, в котором они встречаются в команде.

Строго следуйте описанному формату вывода. Для лучшего понимания формата вывода посмотрите тестовые примеры.

C. Маска подсети

*особая задача битмаски Перебор реализация *1600

В задаче используется упрощенная модель адресов в TCP/IP, внимательно прочтите условие.

Поликарп устроился на работу системным администратором. Как-то раз к нему в руки попали n IP-адресов. Каждый IP-адрес — это 32-битное число, представленное в виде четверки десятичных 8-битных чисел (без лидирующих нулей), записанных через точку. Например, запись 0.255.1.123 обозначает корректный IP-адрес, а записи 0.256.1.123 и 0.255.1.01 — нет. В данной задаче произвольная четверка 8-битных чисел является корректным IP-адресом.

Поработав администратором, Поликарп узнал, что, зная IP-адрес, можно, используя маску подсети, получить адрес сети, которой принадлежит этот IP-адрес.

Маска подсети — это IP-адрес, обладающий следующим свойством: если записать этот IP-адрес, как 32-битную строку, то он представим в виде «11...11000..000». Другими словами, в маске подсети сначала идет один или более единичный бит, а затем один или более нулевой бит (всего битов 32). Например, IP-адрес 2.0.0.0 не является корректной маской подсети, так как его 32-битная запись имеет вид 00000010000000000000000000000000.

Для получения адреса сети IP-адреса нужно выполнить операцию побитового «и» («and») IP-адреса и маски подсети. Например, если маска подсети 255.192.0.0, а IP-адрес 192.168.1.2, то адрес сети равен 192.128.0.0. При побитовом «и» в записи результата бит равен 1 тогда и только тогда, когда у обоих операндов соответствующие биты единичные.

Теперь Поликарп хочет найти все сети, которым принадлежат его IP-адреса. К сожалению, Поликарп потерял маску подсети. К счастью, Поликарп запомнил, что его IP-адреса принадлежали ровно k различным сетям. Помогите Поликарпу найти маску подсети, такую, что его IP-адреса будут принадлежать ровно k различным сетям. Если таких масок несколько, найдите ту, в битовой записи которой наименьшее количество единиц. Если таких масок не существует, сообщите об этом.

Входные данные

В первой строке записаны два целых числа n и k (1 ≤ k ≤ n ≤ 105) — количество IP-адресов и сетей. В следующих n строках записаны сами IP-адреса. Гарантируется, что все IP-адреса различны.

Выходные данные

В единственной строке выведите IP-адрес маски подсети, в формате описанном в условии, если требуемая маска подсети существует. Иначе выведите -1.

A. SMS-центр

реализация *1100

В некоторой большой организации, в которой работает Поликарп, находится собственный sms-центр. Задачей центра является рассылка сотрудникам различной важной информации. Поликарп решил проверить эффективность работы sms-центра.

Для этого он попросил предоставить ему данные о работе sms-центра за некоторый период времени. В ответ Поликарп получил список из n заданий, поступавших в sms-центр корпорации. Каждое задание описывалось временем поступления в sms-центр и количеством sms-сообщений, которое нужно было отослать. Более формально, i-ое задание описывалось двумя целыми числами ti и ci — моментом времени (секундой) поступления и количеством sms-сообщений соответственно.

Поликарп знает, что sms-центр может отсылать не более одного sms-сообщения в секунду. Для организации отправки сообщений sms-центр использует очередь. Рассмотрим некоторый момент времени x, sms-центр будет функционировать в момент времени x следующим образом:

  1. Если в момент времени x очередь сообщений не пуста, тогда происходит отправка сообщения из очереди (сообщение берется из головы очереди). Иначе отправка сообщения в момент времени x не происходит.
  2. Если в момент времени x поступило задание на отправку сообщений, то в очередь добавляются все сообщения из этого задания (сообщения добавляются в хвост очереди). Обратите внимание, ни одно из этих сообщений не может быть отправлено в момент времени x, так как решение об отправке или не отправке сообщения в момент времени x принимается в пункте 1 до добавления этих сообщений.

По результатам анализа выполнения всех n заданий Поликарп хочет посчитать две величины: момент времени, когда было отправлено последнее sms-сообщение, а также максимальный размер очереди в некоторый момент времени. Помогите ему посчитать эти две характеристики, по которым он оценит эффективность работы sms-центра.

Входные данные

В первой строке задано единственное целое число n (1 ≤ n ≤ 103) — количество заданий рассылки сообщений. Далее в n строках заданы описания заданий: в i-ой строке через пробел заданы два целых числа ti и ci (1 ≤ ti, ci ≤ 106) — момент времени (секунда) поступления i-го задания и количество сообщений, которое нужно отправить, соответственно.

Гарантируется, что все задания поступали в различные моменты времени. Гарантируется, что задания отсортированы в хронологическом порядке, то есть ti < ti + 1 для всех целых i (1 ≤ i < n).

Выходные данные

В единственную строку через пробел выведите два целых числа — момент времени, когда было отправлено последнее sms-сообщение и максимальный размер очереди в некоторый момент времени.

Примечание

В первом тестовом примере:

  • секунда 1 — первое сообщение появилось в очереди, размер очереди 1;
  • секунда 2 — первое сообщение отправлено, второе сообщение появилось в очереди, размер очереди 1;
  • секунда 3 — второе сообщение отправлено, размер очереди 0,

Таким образом, максимальный размер очереди 1, последнее сообщение отправлено в секунду 3.

B. Топология сети

графы реализация *1200

В задаче используется упрощенная модель топологий сетей, внимательно прочтите условие задачи и используйте его как формальный документ при разработке решения.

Поликарп продолжает работать системным администратором в некоторой большой корпорации. Компьютерная сеть этой корпорации состоит из n компьютеров, некоторые из которых соединены кабелем. Компьютеры пронумеруем целыми числами от 1 до n. Известно, что любые два компьютера соединены кабелем непосредственно или через другие компьютеры.

Поликарп решил узнать топологию этой сети. Сетевая топология — это способ описания конфигурации сети, схема расположения и соединения сетевых устройств.

Поликарп знает три основные топологии сети: шина, кольцо и звезда. Шина — это топология, которая представляет собой общий кабель, к которому подсоединены все компьютеры. Кольцо — топология, в которой каждый компьютер соединен кабелем только с двумя другими. Звезда — это топология, в которой все компьютеры сети присоединены к единому центральному узлу.

Представим каждую из этих топологий сети в виде связного неориентированного графа. Под шиной будем понимать связный граф, являющийся единственным путем, то есть граф, в котором все вершины соединены с двумя другими, за исключением двух вершин, которые являются началом и концом пути. Под кольцом будем понимать связный граф, в котором все вершины соединены с двумя другими. Под звездой будем понимать связный граф, в котором выделена единственная центральная вершина, которая соединена со всеми остальными вершинами. Для лучшего понимания ознакомьтесь с рисунком.

(1) — шина, (2) — кольцо, (3) — звезда

Вам задан связный неориентированный граф, характеризующий компьютерную сеть корпорации, в которой работает Поликарп. Помогите ему узнать, к какой из данных топологий относится заданная компьютерная сеть. Если это невозможно определить, сообщите, что топология этой сети неизвестна.

Входные данные

В первой строке через пробел заданы два целых числа n и m (4 ≤ n ≤ 105; 3 ≤ m ≤ 105) — количество вершин и ребер в графе соответственно. Далее в m строках задано описание ребер графа. В i-той строке через пробел задана пара целых чисел xi, yi (1 ≤ xi, yi ≤ n) — номера вершин, которые соединяет i-ое ребро.

Гарантируется, что заданный граф является связным. Между любыми двумя вершинами существует не более одного ребра. Ни одно ребро не соединяет вершину саму с собой.

Выходные данные

В единственную строку выведите название топологии сети, к которой относится заданный граф. Если ответом является шина, выведите «bus topology» (без кавычек), если ответом является кольцо, выведите «ring topology» (без кавычек), если ответом является звезда, выведите «star topology» (без кавычек). Если ни один из этих типов не подходит, выведите «unknown topology» (без кавычек).

A. Шаасс и Осколы

математика реализация *800

Шаасс решил поохотиться на птиц. Есть n электрических проводов, параллельных друг другу. Провода пронумерованы от 1 до n сверху вниз. На каждом проводе некоторое количество осколов сидят в рядок, на i-ом проводе сидит ai осколов. Осколы — это такие вкуснейшие птицы, они гнездятся рядом с Шаассом.

Иногда Шаассу удается подстрелить одну птицу, птица умирает (обозначим номер провода, на котором сидела эта птица как i). После чего все птицы слева от нее на проводе i пугаются и перепрыгивают вверх на провод номер i - 1. Если выше проводов нет, то они улетают. Также, все птицы справа от подстреленной перепрыгивают вниз на провод i + 1, а если такого провода нет, то они улетают.

Шаасс подстрелил m птиц. Зная изначальное количество птиц на каждом проводе, скажите, сколько птиц будет сидеть на каждом проводе после охоты.

Входные данные

Первая строка входных данных содержит целое число n, (1 ≤ n ≤ 100). Следующая строка содержит разделенные пробелом целые числа a1, a2, ..., an, (0 ≤ ai ≤ 100).

В третьей строке записано целое число m, (0 ≤ m ≤ 100). В каждой из следующих m строк записано по два целых числа, xi и yi. Эти числа означают, что в i-ый раз Шаасс подстрелил yi-ую птицу слева на xi-ом проводе, (1 ≤ xi ≤ n, 1 ≤ yi). Гарантируется, что в этот момент на xi-ом проводе будет как минимум yi птиц.

Выходные данные

В i-ой строке выведите количество птиц на i-ом проводе.

D. Шаасс и робот-маляр

Перебор реализация теория чисел *2500

Шаассу кажется, что на кухне скучно, когда там вся плитка на полу белая. Пол на его кухне вымощен n·m квадратными плитками в форме прямоугольника размера n × m. И вот юноша решил покрасить некоторые плитки черным, так чтобы получилась «шахматная раскраска». То есть, никакие две соседние плитки не должны быть одного цвета.

Для покраски Шаасс хочет задействовать робота-маляра. Вначале робот стоит на плитке (xs, ys) на границе кухни и направлен диагонально (то есть, смотрит влево-вверх, влево-вниз, вправо-вверх или вправо-вниз). Гуляя по кухне, робот закрашивает любую плитку, на которую он ступает, даже если эта плитка уже была закрашена. На покраску плитки требуется одна единица черной краски. Если в любой момент робот натолкнется на кухонную стену, он оттолкнется от нее по законам отражения. Обратите внимание, плитка закрашивается в тот момент, когда робот наступает на нее, шагая из другой плитки, то есть при изменении направления на одной и той же плитке закрашивания этой плитки не происходит. Плитка, на которой стоит робот в самом начале тоже закрашивается.

Робот прекращает покраску, как только пол становится стилизован под шахматную доску. Вам даны размеры кухни и позиция робота. Посчитайте, сколько краски потребит робот, пока не закрасит пол.

Рассмотрим изображенный ниже пример.

Если робот начинает движение с плитки номер 1 (плитки с координатами (1, 1)) таблицы слева, направляясь вниз-вправо, то он пройдет по плиткам 1354236 и потратит на этом пути 7 единиц черной краски, пока не остановится на плитке номер 6. Но если он начнет с плитки номер 1, как в таблице справа, направляясь вниз-вправо, то он застрянет в цикле плиток 1, 2, и 3.

Входные данные

В первой строке содержатся два целых числа n и m, (2 ≤ n, m ≤ 105). Во второй строке содержатся два целых числа xs и ys (1 ≤ xs ≤ n, 1 ≤ ys ≤ m) и исходное направление робота. Направление представлено одной из следующих строк: «UL» (направление вверх-влево), «UR» (вверх-вправо), «DL» (вниз-влево) or «DR» (вниз-вправо).

Заметьте, что запись (xs, ys) означает, что плитка находится в xs-ом ряду сверху и в ys-ом столбце слева на кухне.

Гарантируется, что изначально робот стоит на границе кухни (то есть в клетке, у которой менее четырех соседей по стороне).

Выходные данные

Выведите количество краски, которое затратит робот на окраску кухонного пола на манер шахматной доски. Или, если эта цель не будет достигнута, выведите -1.

Пожалуйста, не используйте спецификатор %lld для чтения и записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

A. Егор и массив

реализация Структуры данных *1400

У Егора есть массив a = a1, a2, ..., an и m операций. Каждая операция имеет вид: li, ri, di, (1 ≤ li ≤ ri ≤ n). Применить операцию i к массиву значит, элементы массива c номерами li, li + 1, ..., ri, увеличить на величину di.

Егор записал на листочке бумаги k запросов. Каждый запрос имеет вид: xi, yi, (1 ≤ xi ≤ yi ≤ m), что означает, что нужно применить к массиву операции с номерами xi, xi + 1, ..., yi.

Сейчас Егор хочет узнать, какой будет массив a после выполнения всех запросов. Помогите Егору.

Входные данные

В первой строке заданы целые числа n, m, k (1 ≤ n, m, k ≤ 105). Во второй строке заданы n целых чисел: a1, a2, ..., an (0 ≤ ai ≤ 105) — изначальный массив.

В следующих m строках заданы операции, операция с номером i записана тремя целыми числами: li, ri, di, (1 ≤ li ≤ ri ≤ n), (0 ≤ di ≤ 105).

В следующих k строках заданы запросы, запрос с номером i записан двумя целыми числами: xi, yi, (1 ≤ xi ≤ yi ≤ m).

Числа в строках разделяются одиночными пробелами.

Выходные данные

В единственную строку выведите n целых чисел a1, a2, ..., an — массив, который получит Егор после применения всех запросов. Выведенные числа разделяйте пробелами.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

A. Следы на снегу

жадные алгоритмы реализация *1300

Представьте себе прямую заснеженную дорогу, разделенную на n блоков. Блоки пронумерованы от 1 до n слева направо. Если шагнуть с i-го блока на (i + 1)-ый блок, то останется след правой ноги на i-ом блоке. Аналогично, если шагнуть с i-го на (i - 1)-ый блок, то на i-ом блоке останется след левой ноги. Если на i-ом блоке уже есть след, то новый след покроет старый.

Вначале на дороге следов не было. Затем белая медведица Алиса начинает свое путешествие с s-го блока, совершает некоторую последовательность шагов и останавливается на t-ом блоке. Известно, что Алиса никогда не уходит с дороги.

Дано описание Алисиных следов. Ваша задача — найти пару возможных значений s, t, глядя на следы.

Входные данные

В первой строке входных данных содержится целое число n (3 ≤ n ≤ 1000).

Во второй строке содержится описание дороги — строка, состоящая из n символов. Каждый символ — это или «.» (блок без следа), или «L» (блок с левым следом), или «R» (блок с правым следов).

Гарантируется, что данная строка содержит, по крайней мере, один символ, не равный «.». Также, первый и последний символы всегда будут «.». Гарантируется, что решение существует.

Выходные данные

Выведите два целых числа через пробел — значения s и t. Если есть несколько возможных решений, можете вывести любое из них.

Примечание

Первый тестовый пример показан на картинке.

B. На рыбалку

жадные алгоритмы Перебор реализация *1200

Белые мишки отправились на рыбалку. Они собираются сесть в лодку и доплыть от (sx, sy) до (ex, ey). Однако лодка поддается управлению только силы ветра. Каждую секунду ветер дует в одном из следующих направлений: на восток, на юг, на запад или на север. Предположим, что на данный момент лодка находится в (x, y).

  • Если ветер дует на восток, то лодка поплывет на (x + 1, y).
  • Если ветер дует на юг, то лодка поплывет на (x, y - 1).
  • Если ветер дует на запад, то лодка поплывет на (x - 1, y).
  • Если ветер дует на север, то лодка поплывет на (x, y + 1).

Мишки могут остановить лодку, бросив якорь. Тогда лодка остается на (x, y), независимо от того куда дует ветер. Зная направление ветра в следующие t секунд, определите самый ранний момент, когда они смогут приплыть к (ex, ey).

Входные данные

В первой строке записаны пять целых чисел t, sx, sy, ex, ey (1 ≤ t ≤ 105,  - 109 ≤ sx, sy, ex, ey ≤ 109). Начальная и конечная позиции будут различаться.

Во второй строке записано t символов, i-ый символ описывает направление ветра в секунду номер i. В соответствии с ветром символ может быть равен: «E» (восток), «S» (юг), «W» (запад) или «N» (север).

Выходные данные

Если можно доплыть до (ex, ey) в течение t секунд, выведите самое раннее время, когда мишкам это удастся. В противном случае выведите «-1» (без кавычек).

Примечание

В первом примере можно бросить якорь в секунды 1, 3 и двигаться в секунды 2, 4.

Во втором примере мишкам не удастся доплыть до пункта назначения.

B. Белочка Ксюша

Перебор реализация *900

Белочка Ксюша стоит в начале прямой дороги, которая разделена на n секторов. Сектора пронумерованы от 1 до n слева направо. Изначально, Ксюша стоит в секторе 1.

Ксюша хочет пройти всю дорогу, то есть попасть в сектор n. К сожалению, на дороге есть камни. Как известно, Ксюша терпеть не может камни, поэтому на своем пути она не хочет наступать на сектора, в которых есть камни.

Белочка Ксюша — спортсменка. С сектора i она может перепрыгнуть на любой из секторов i + 1, i + 2, ..., i + k.

Помогите Ксюше! По заданному описанию дороги сообщите, сможет ли она дойти до конца дороги, ни разу не наступив на камень?

Входные данные

В первой строке записаны два целых числа n и k (2 ≤ n ≤ 3·105, 1 ≤ k ≤ 3·105). В следующей строке записано n символов — описание дороги: i-ый символ равен «.», если i-ый сектор не содержит камней, иначе он равен «#».

Гарантируется, что первый и последний символы равны «.».

Выходные данные

Выведите «YES» (без кавычек) — если Ксюша сможет пройти дорогу, иначе выведите «NO» (без кавычек).

C. Крестики-нолики

игры Перебор реализация *1800

Все, наверное, знакомы с игрой крестики-нолики. Правила в самом деле очень просты. Игроки по очереди ставят на свободные клетки поля 3 × 3 знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд три своих фигур по вертикали, горизонтали или диагонали, выигрывает и игра заканчивается. Первый ход делает игрок, ставящий крестики. В том случае, если все поле заполнено, но никакие три фигуры в ряд не стоят, то объявляется ничья.

Вам задано поле 3 × 3, на котором каждая клетка свободна или занята крестиком или ноликом. Ваша задача указать игрока (first или second), ход которого ожидается или вывести один из четырех вердиктов:

  • illegal — если заданная игровая позиция не может появиться в ходе игры, т.е. является некорректной;
  • the first player won — если в заданной игровой позиции первый игрок только что победил;
  • the second player won — если в заданной игровой позиции второй игрок только что победил;
  • draw — если в заданной игровой позиции только что наступила ничья.
Входные данные

Входные данные состоят из трех строк, каждая из которых содержит по три символа: «.», «X» или «0» (точку, заглавную букву X или ноль).

Выходные данные

Выведите один из шести вердиктов: first, second, illegal, the first player won, the second player won или draw.

B. Codeforces World Finals

реализация *1700

Царю Цопе много раз докладывали о стремительно набирающем популярность сайте Codeforces, на котором собираются светлейшие умы нашего человечества, — ради тренировки и дальнейшего просветления своих умов. И Цопа недавно осознал: если он хочет поработить весь мир, то для этого ему необходимо отдать приказ организовать всемирный турнир Codeforces. Цопа уверен, — после этого его поступка все светлейшие умы добровольно перейдут в его подчинение, и самая сложная часть плана порабощения мира будет осуществлена.

Финальный раунд Codeforces World Finals 20YY назначен на дату DD.MM.YY, где DD — день проведения раунда, MM — месяц, а YY — последние 2 цифры года. Васе посчастливилось стать первым в истории Берляндии участником, вышедшим в финал. Но есть одна проблема: по правилам соревнования, все участники на момент финального раунда должны быть не младше 18 лет, а Вася родился в день BD.BM.BY. Эта дата написана в Васином паспорте, копию которого он уже отправил организаторам соревнования. Но Вася узнал, что в разных странах форматы записи дат отличаются, например, в США обычно сначала записывается номер месяца, затем день, а потом год. Вася хочет узнать, а можно ли так переставить числа в его дате рождения, чтобы на момент DD.MM.YY ему было хотя бы 18 лет. Ведь тогда он сможет сказать, что в его родной Берляндии даты записываются по-другому. Помогите ему справиться с этой задачей.

По еще одному странному правилу, участник должен родиться в том же столетии, в котором проводится финал. Допускается, если участнику исполняется 18 ровно в день финала.

Так как мы рассматриваем годы проведения финала исключительно с 2001 до 2099, то високосным годом будем считать среди них такие, которые делятся на 4.

Входные данные

В первой строке задана дата DD.MM.YY, во второй строке задана дата BD.BM.BY. Гарантируется, что обе даты корректны, и номера годов YY и BY всегда лежат в отрезке [01;99].

Могло оказаться, что по паспорту Вася родился уже после финала. В этом случае он все равно может менять местами числа в дате.

Выходные данные

Если можно переставить числа в дате рождения так, чтобы на момент DD.MM.YY Васе было хотя бы 18 лет, выведите YES. Иначе выведите NO.

Каждое число содержит ровно две цифры, и обозначает день, месяц или год в дате. Учтите, что разрешается переставлять любые числа, но не цифры.

A. Массив

Конструктив Перебор реализация *1100

У Виталия есть массив из n различных целых чисел. Виталий хочет разделить этот массив на три непустых множества так, чтобы были выполнены условия:

  1. Значение произведения всех чисел в первом множестве было меньше нуля ( < 0).
  2. Значение произведения всех чисел во втором множестве было больше нуля ( > 0).
  3. Произведение всех чисел в третьем множестве было равно нулю.
  4. Каждое число из исходного массива должно находиться ровно в одном из множеств.

Помогите Виталию. Разделите заданный массив.

Входные данные

В первой строке входных данных записано целое число n (3 ≤ n ≤ 100). Во второй строке через пробел записаны n различных целых чисел a1, a2, ..., an (|ai| ≤ 103) — элементы массива.

Выходные данные

В первой строке выведите целое число n1 (n1 > 0) — количество чисел в первом множестве. Далее выведите n1 чисел — числа, которые попали в первое множество.

В следующей строке выведите целое число n2 (n2 > 0) — количество чисел во втором множестве. Далее выведите n2 чисел — числа, которые попали во второе множество.

В следующей строке выведите целое число n3 (n3 > 0) — количество чисел в третьем множестве. Далее выведите n3 чисел — числа, которые попали в третье множество.

Выведенные множества должны удовлетворять описанным условиям. Гарантируется, что решение существует. Если существует несколько решений, разрешается вывести любое.

A. Евгений и массив

реализация *800

У Евгения есть массив a = a1, a2, ..., an, состоящий из n целых чисел. Каждое число ai равно или 1, или -1. Также есть m запросов:

  • Запрос номер i представляется в виде пары целых чисел li, ri (1 ≤ li ≤ ri ≤ n).
  • Ответом на запрос будет число 1, если можно так переставить элементы массива a, что сумма ali + ali + 1 + ... + ari = 0, в противном случае ответом на запрос будет число 0.

Помогите Евгению, ответьте на все его запросы.

Входные данные

В первой строке записаны целые числа n и m (1 ≤ n, m ≤ 2·105). Во второй строке записаны n целых чисел a1, a2, ..., an (ai = -1, 1). В следующих m строках заданы запросы Евгения. В i-той строке записаны целые числа li, ri (1 ≤ li ≤ ri ≤ n).

Выходные данные

Выведите m целых чисел — ответы на запросы Евгения в порядке их следования во входных данных.

B. Евгений и плейлист

Бинарный поиск реализация *1200

Евгений любит слушать музыку. В плейлисте Евгения играет n песен. Известно, что песня номер i имеет продолжительность ti минут. Каждую песню плейлиста Евгений слушает, возможно, более одного раза. Песню номер i он слушает ci раз. Плейлист Евгения построен следующим образом: сначала c1 раз играет песня номер 1, потом c2 раз играет песня номер 2, ..., в конце cn раз играет песня номер n.

Евгений выписал себе на листочек m моментов времени, в которые ему понравились песни. Теперь для каждого такого момента, он хочет узнать номер песни, которая играла в этот момент времени. Момент времени x обозначает, что Евгений хочет знать, какая песня играла в x-ую от начала минуту прослушивания плейлиста.

Помогите Евгению, выведите требуемые номера песен.

Входные данные

В первой строке заданы два целых числа n, m (1 ≤ n, m ≤ 105). В следующих n строках заданы пары целых чисел. В i-ой строке записаны целые числа ci, ti (1 ≤ ci, ti ≤ 109) — описание плейлиста. Гарантируется, что суммарная продолжительность плейлиста не более 109 .

В следующей строке записаны m целых положительных чисел v1, v2, ..., vm, которые описывают времена, выписанные Евгением. Гарантируется, что не существует момента времени vi, когда музыка уже не играла. Гарантируется, что vi < vi + 1 (i < m).

Момент времени vi обозначает, что Евгений хочет знать, какая песня играла в vi-ую от начала минуту прослушивания плейлиста.

Выходные данные

Выведите m целых чисел — i-ое число должно быть равно номеру песни, которая играла в vi минуту от начала прослушивания плейлиста.

A. Тройка счастливых перестановок

Конструктив математика реализация *1300

Байк увлекается перестановками. Перестановка длины n представляет собой последовательность целых чисел, такую, что каждое число от 0 до (n - 1) встречается в ней ровно один раз. Например, [0, 2, 1] — это перестановка длины 3, а вот [0, 2, 2] и [1, 2, 3] — нет.

Тройка перестановок длины n (a, b, c) называется Счастливой Тройкой Перестановок тогда и только тогда, когда . Переменная ai обозначает i-ый элемент перестановки a. Описанное выше модульное равенство означает, что остатки после деления ai + bi на n и деления ci на n равны.

Теперь у Байка есть целое число n и он хочет найти Счастливую Тройку Перестановок. Пожалуйста, помогите ему!

Входные данные

В первой строке содержится единственное целое число n (1 ≤ n ≤ 105).

Выходные данные

Если не существует Счастливой Тройки Перестановок длины n, выведите -1.

В противном случае следует вывести три строки. В каждой строке содержится по n целых чисел через пробел. В первой строке надо вывести перестановку a, во второй — перестановку b, в третьей — перестановку c.

Если ответов несколько, выведите любой.

Примечание

В примере 1, тройка перестановок ([1, 4, 3, 2, 0], [1, 0, 2, 4, 3], [2, 4, 0, 1, 3]) является счастливой, так как выполняются следующие условия:

  • ;
  • ;
  • ;
  • ;
  • .

В примере 2 легко заметить, что счастливых троек перестановок вообще нет.

B. Прямоугольная загадка II

математика реализация *1700

Дана прямоугольная сетка размера n × m. Введем систему координат на сетке. Итак, каждая точка на сетке имеет координаты — пару целых чисел (x, y) (0 ≤ x ≤ n, 0 ≤ y ≤ m).

Ваша задача — найти наибольший подпрямоугольник на сетке (x1, y1, x2, y2), содержащий данную точку (x, y), такой, что соотношение длин его сторон равняется (a, b). Иными словами, должны выполняться следующие условия: 0 ≤ x1 ≤ x ≤ x2 ≤ n, 0 ≤ y1 ≤ y ≤ y2 ≤ m, .

Стороны этого подпрямоугольника должны быть параллельны осям координат. Величины x1, y1, x2, y2 должны быть целыми.

Если существует несколько ответов, найдите ближайший к (x, y) подпрямоугольник. Здесь «ближайший» означает, что Евклидово расстояние между (x, y) и центром прямоугольника как можно меньше. Если все равно существует несколько ответов, выведите лексикографически минимальный. Здесь «лексикографически минимальный» означает, что мы должны рассматривать подпрямоугольник как последовательность целых чисел (x1, y1, x2, y2), так, что можно выбрать из них лексикографически минимальную.

Входные данные

В первой строке записано шесть целых чисел n, m, x, y, a, b (1 ≤ n, m ≤ 109, 0 ≤ x ≤ n, 0 ≤ y ≤ m, 1 ≤ a ≤ n, 1 ≤ b ≤ m).

Выходные данные

Выведите четыре целых числа x1, y1, x2, y2, обозначающие обнаруженный вложенный прямоугольник с левым нижним углом в (x1, y1), а правым верхним — в (x2, y2).

B. Календарь

Перебор реализация *1300

Сейчас повсеместно используется Григорианский календарь, он фактически стал международным стандартом и используется в гражданских целях почти по всему миру. Григорианская реформа поправила Юлианскую систему високосных годов так:

Каждый год, который делится на четыре без остатка, является високосным, за исключением годов, которые делятся на 100 без остатка. Если «столетние» года делятся на 400, то они все же являются високосными. Например, 1900 год не високосный, а 2000 високосный.

В этой задаче Вам даны две даты, от Вас требуется посчитать, сколько между ними дней. Помните, что в високосном году в феврале содержится непривычное количество дней.

Смотрите тестовые примеры, для понимания какие из границ включаются в ответ, а какие нет.

Входные данные

Первые две строки содержат две даты, каждая дата записана в формате yyyy:mm:dd (1900 ≤ yyyy ≤ 2038 и yyyy:mm:dd — корректная дата).

Выходные данные

Выведите единственное целое число — ответ на задачу.

A. Странное сложение

Конструктив Перебор реализация *1600

Вася, к сожалению, умеет складывать только пары чисел (a, b) такие, что для каждого разряда десятичной записи хотя бы одно из чисел имеет цифру 0 в этом разряде. Например, Вася может сложить числа 505 и 50, но не может сложить 1 и 4.

У Васи есть множество из k различных целых неотрицательных чисел d1, d2, ..., dk.

Вася хочет выбрать из этого множества несколько чисел так, чтобы любые два выбранных числа он мог сложить. Какое максимальное количество чисел он может выбрать требуемым способом?

Входные данные

В первой строке входных данных задано целое число k (1 ≤ k ≤ 100) — количество чисел.

В второй строке записаны k различных целых чисел через пробел d1, d2, ..., dk (0 ≤ di ≤ 100).

Выходные данные

В первую строку выведите одно целое число n — максимальное количество выбранных чисел. Во второй строке выведите n различных целых неотрицательных чисел — искомые числа.

Если возможных решений несколько — выведите любое из них. Числа можно выводить в любом порядке.

B. Цепные дроби

математика Перебор реализация *1700

Цепной дробью высоты n называется дробь вида . Вам даны два рациональных числа, одно представлено в виде , а второе в виде конечной цепной дроби высоты n. Проверьте, равны ли они.

Входные данные

В первой строке через пробел записаны два целых числа p, q (1 ≤ q ≤ p ≤ 1018) — числитель и знаменатель первой дроби.

Во второй строке записано целое число n (1 ≤ n ≤ 90) — высота второй дроби. В третьей строке через пробел записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1018) — цепная дробь.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

Выведите «YES», если эти дроби равны и «NO» в противном случае.

Примечание

В первом примере .

Во втором примере .

В третьем примере .

C. Иван и степени двойки

жадные алгоритмы реализация *1600

У Ивана есть массив из n целых неотрицательных чисел a1, a2, ..., an. Иван знает, что этот массив отсортирован по неубыванию.

Иван выписал себе на листочек целые числа 2a1, 2a2, ..., 2an. И теперь ему интересно, какое минимальное количество целых чисел вида 2b (b ≥ 0) ему нужно дописать на листок так, чтобы сумма всех чисел, записанных на листочке, была равна 2v - 1 для некоторого целого v (v ≥ 0).

Помогите Ивану, найдите требуемое количество чисел.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105). Во второй строке входных данных записаны n целых чисел через пробел a1, a2, ..., an (0 ≤ ai ≤ 2·109). Гарантируется, что a1 ≤ a2 ≤ ... ≤ an.

Выходные данные

Выведите единственное целое число — ответ на задачу.

Примечание

В первом примере ничего не нужно дописывать, сумма чисел уже равна 23 - 1 = 7.

Во втором примере нужно дописать числа 20, 21, 22.

A. Конфеты

реализация *800

У Поликарпа есть n конфет и m друзей (n ≥ m). На Новый Год он хочет сделать каждому другу подарок, состоящий из конфет. Поликарп собирается подарить все конфеты и хочет сделать это наиболее честным (то есть равномерным) образом. Он хочет выбрать такие ai, где ai — количество конфет в подарке i-му другу, что наибольшее из ai отличается от наименьшего из ai как можно меньше.

Например, если n делится на m, то всем друзьям он подарит одинаковое количество конфет, то есть максимальное ai не будет отличаться от минимального.

Входные данные

В единственной строке входных данных содержится пара записанных через пробел целых положительных чисел n, m (1 ≤ n, m ≤ 100; n ≥ m) — количество конфет и количество друзей у Поликарпа.

Выходные данные

Выведите искомую последовательность a1, a2, ..., am, где ai — количество конфет в подарке i-го друга. Все числа ai должны быть положительные целые, в сумме составлять n, максимальное из них должно отличаться от минимального на наименьшую возможную величину.

Значения ai выводите в любом порядке, числа разделяйте пробелами.

A. Эволюция червей

реализация *1200

Профессор Васечкин изучает эволюцию земляных червей. Недавно он выдвинул гипотезу о том, что все черви эволюционируют делением. Всего в Берляндии n видов червей. Черви этих видов имеют длины a1, a2, ..., an. Чтобы обосновать свою теорию, профессору нужно найти 3 различных вида, что длина червей одного вида равна сумме длин червей двух других видов. Помогите ему справиться с этой задачей.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество видов червей. На следующей строке через пробел записано n целых чисел ai (1 ≤ ai ≤ 1000) — длины червей всех видов.

Выходные данные

Выведите 3 различных целых числа i j k (1 ≤ i, j, k ≤ n) — номера видов червей, для которых выполняется ai = aj + ak. Если таких не существует, выведите -1. Если решений несколько, выведите любое. Допустимо, что aj = ak.

A. Эволюция червей

реализация *1200

Профессор Васечкин изучает эволюцию земляных червей. Недавно он выдвинул гипотезу о том, что все черви эволюционируют делением. Всего в Берляндии n видов червей. Черви этих видов имеют длины a1, a2, ..., an. Чтобы обосновать свою теорию, профессору нужно найти 3 различных вида, что длина червей одного вида равна сумме длин червей двух других видов. Помогите ему справиться с этой задачей.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество видов червей. На следующей строке через пробел записано n целых чисел ai (1 ≤ ai ≤ 1000) — длины червей всех видов.

Выходные данные

Выведите 3 различных целых числа i j k (1 ≤ i, j, k ≤ n) — номера видов червей, для которых выполняется ai = aj + ak. Если таких не существует, выведите -1. Если решений несколько, выведите любое. Допустимо, что aj = ak.

A. Эволюция червей

реализация *1200

Профессор Васечкин изучает эволюцию земляных червей. Недавно он выдвинул гипотезу о том, что все черви эволюционируют делением. Всего в Берляндии n видов червей. Черви этих видов имеют длины a1, a2, ..., an. Чтобы обосновать свою теорию, профессору нужно найти 3 различных вида, что длина червей одного вида равна сумме длин червей двух других видов. Помогите ему справиться с этой задачей.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество видов червей. На следующей строке через пробел записано n целых чисел ai (1 ≤ ai ≤ 1000) — длины червей всех видов.

Выходные данные

Выведите 3 различных целых числа i j k (1 ≤ i, j, k ≤ n) — номера видов червей, для которых выполняется ai = aj + ak. Если таких не существует, выведите -1. Если решений несколько, выведите любое. Допустимо, что aj = ak.

A. Эволюция червей

реализация *1200

Профессор Васечкин изучает эволюцию земляных червей. Недавно он выдвинул гипотезу о том, что все черви эволюционируют делением. Всего в Берляндии n видов червей. Черви этих видов имеют длины a1, a2, ..., an. Чтобы обосновать свою теорию, профессору нужно найти 3 различных вида, что длина червей одного вида равна сумме длин червей двух других видов. Помогите ему справиться с этой задачей.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество видов червей. На следующей строке через пробел записано n целых чисел ai (1 ≤ ai ≤ 1000) — длины червей всех видов.

Выходные данные

Выведите 3 различных целых числа i j k (1 ≤ i, j, k ≤ n) — номера видов червей, для которых выполняется ai = aj + ak. Если таких не существует, выведите -1. Если решений несколько, выведите любое. Допустимо, что aj = ak.

A. Эволюция червей

реализация *1200

Профессор Васечкин изучает эволюцию земляных червей. Недавно он выдвинул гипотезу о том, что все черви эволюционируют делением. Всего в Берляндии n видов червей. Черви этих видов имеют длины a1, a2, ..., an. Чтобы обосновать свою теорию, профессору нужно найти 3 различных вида, что длина червей одного вида равна сумме длин червей двух других видов. Помогите ему справиться с этой задачей.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество видов червей. На следующей строке через пробел записано n целых чисел ai (1 ≤ ai ≤ 1000) — длины червей всех видов.

Выходные данные

Выведите 3 различных целых числа i j k (1 ≤ i, j, k ≤ n) — номера видов червей, для которых выполняется ai = aj + ak. Если таких не существует, выведите -1. Если решений несколько, выведите любое. Допустимо, что aj = ak.

A. Эволюция червей

реализация *1200

Профессор Васечкин изучает эволюцию земляных червей. Недавно он выдвинул гипотезу о том, что все черви эволюционируют делением. Всего в Берляндии n видов червей. Черви этих видов имеют длины a1, a2, ..., an. Чтобы обосновать свою теорию, профессору нужно найти 3 различных вида, что длина червей одного вида равна сумме длин червей двух других видов. Помогите ему справиться с этой задачей.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество видов червей. На следующей строке через пробел записано n целых чисел ai (1 ≤ ai ≤ 1000) — длины червей всех видов.

Выходные данные

Выведите 3 различных целых числа i j k (1 ≤ i, j, k ≤ n) — номера видов червей, для которых выполняется ai = aj + ak. Если таких не существует, выведите -1. Если решений несколько, выведите любое. Допустимо, что aj = ak.

B. Сисадмин Вася

жадные алгоритмы реализация Строки *1500

Адрес электронной почты в Берляндии — это строка вида A@B, где A и B — любые непустые строки из маленьких латинских букв.

Вася работает сисадмином в компании «Берсофт». Он хранит список адресов электронной почты всех сотрудников компании в виде одной большой строки, где все адреса записаны через запятую в произвольном порядке. Один и тот же адрес может быть записан более одного раза.

Однажды по непонятной причине все запятые в Васином списке исчезли, и все адреса «склеились». У Васи осталась одна большая строка, в которой адреса электронной почты записаны подряд без каких-либо разделителей, и невозможно определить, где заканчивается один адрес и начинается другой. К несчастью, именно в этот же день Васино начальство потребовало от Васи исходный список всех адресов. Теперь Вася хочет расцепить адреса произвольным образов (вряд ли начальство будет разбираться). Помогите ему это сделать.

Входные данные

В первой строке содержится список всех адресов электронной почты без разделителей. Длина строки не меньше 1 и не превосходит 200. Гарантируется, что строка состоит только из маленьких латинских букв и символов «@».

Выходные данные

Если не существует такого списка корректных (по берляндским правилам) адресов электронной почты, что после удаления запятых список совпадает с заданной строкой, выведите No solution. Иначе выведите сам список. Один и тот же адрес может быть записан в этом списке более одного раза. Если решений несколько, выведите любое.

C. Расписание

реализация *1700

С началом нового учебного года в Берляндском Государственном Университете было составлено новое расписание занятий. Согласно этому расписанию, в аудитории 31 проходят занятия у n групп. Для каждой группы известно время начала и конца занятий в этой аудитории. Оказалось, что провести занятия во всех n группах одновременно невозможно — занятия некоторых групп пересекаются по времени. Если в некоторый момент времени у одной группы занятия заканчиваются, а у другой — начинаются, считается, что они не пересекаются.

Деканат хочет отменить занятия ровно в одной группе так, чтобы занятия всех остальных групп не пересекались по времени. Ваша задача — найти все способы сделать это.

Входные данные

В первой строке записано число n (1 ≤ n ≤ 5000) — количество групп, у которых есть занятия в аудитории 31. Далее следует n строк по два целых числа li ri (1 ≤ li < ri ≤ 106) — время начала и окончания занятий i-ой группы. Могло оказаться, что изначально все занятия не пересекаются (см. пример 1).

Выходные данные

Выведите одно целое число k — число способов отменить занятия ровно в одной группе, так чтобы занятия у всех остальных групп не пересекались. На следующей строке выведите k чисел — номера групп, в которых можно отменить занятия. Группы нумеруются начиная с 1 в том порядке, в котором они заданы во входных данных. Выводите номера в порядке возрастания.

D. Шоколадка

поиск в глубину и подобное реализация *2000

У Васи есть прямоугольная плитка шоколада W × H долек. Он определил декартову систему координат так, что точка (0, 0) соответствует левому нижнему углу шоколадки, а точка (W, H) — правому верхнему. Одна долька шоколадки соответствует квадрату 1 × 1 с целочисленными координатами. Вася решил разделить шоколадку на куски разломами. Каждый разлом представляет собой параллельный одной из осей координат отрезок, проходящий от одной стороны куска до другой. То есть каждый разлом проходит вдоль линии x = xc или y = yc, где xc и yc — некоторые целые числа. Каждый разлом делит один кусок шоколадки на два непустых куска. После того как Вася разломил один кусок на два, получившиеся куски он разламывает отдельно и независимо друг от друга. При этом он не перемещает куски шоколадки. Вася сделал n разломов и записал их в блокнот в произвольном порядке. В результате у него получилось n + 1 кусков. Теперь он хочет посчитать их площади. Вася человек ленивый, и поэтому он просит вас сделать это за него.

Входные данные

В первой строке записано три целых числа W, H и n (1 ≤ W, H, n ≤ 100) — ширина шоколадки, высота шоколадки и число разломов соответственно. Далее следует n строк по 4 целых числа xi, 1, yi, 1, xi, 2, yi, 2 — координаты концов отрезка i-ого разлома (0 ≤ xi, 1 ≤ xi, 2 ≤ W, 0 ≤ yi, 1 ≤ yi, 2 ≤ H, либо xi, 1 = xi, 2, либо yi, 1 = yi, 2). Разломы записаны в произвольном порядке.

Гарантируется, что множество разломов корректно, то есть существует такой порядок проведения заданных разломов, что очередной разлом разделяет ровно один кусок ровно на две части.

Выходные данные

Выведите n + 1 чисел — площади получившихся кусков в порядке возрастания.

A. Ближайшая пара

Конструктив реализация *1300

На данный момент Тайни изучает вычислительную геометрию. Когда он пытался решить задачу под названием «Ближайшая пара точек на плоскости», то обнаружил, что код, имеющий неверную временную сложность, был засчитан как правильный, а не отвергнут по причине превышения лимита времени.

Задача выглядит следующим образом. Вам дано n точек на плоскости, найдите пару точек, между которыми минимальное расстояние. Расстояние между (x1, y1) и (x2, y2) равняется .

Псевдокод кода с неверной сложностью имеет следующий вид:


ввести n
for i from 1 to n
ввести координаты i-той точки в переменную p[i]
отсортировать массив p[] в первую очередь по возрастанию x координаты, во вторую по возрастанию y
d=INF //здесь INF — это достаточно большое число
tot=0
for i from 1 to n
for j from (i+1) to n
++tot
if (p[j].x-p[i].x>=d) then break //обратите внимание, что "break" используется
//только для того, чтобы выйти из цикла "for j"
d=min(d,distance(p[i],p[j]))
вывести d

В этом коде значение tot можно рассматривать как время выполнения кода. Так как компьютер выполняет фиксированное количество операций в секунду, значение tot не должно превышать k для того, чтобы не превысить лимит времени.

Вы — первоклассный хакер. Не поможете Тайни сгенерировать данные для теста, на которых код получит превышение лимита времени?

Входные данные

В первой строке записаны два целых числа через пробел — n и k (2 ≤ n ≤ 2000, 1 ≤ k ≤ 109).

Выходные данные

Если данных, при которых код получит TLE (превышение лимита времени), не существует, выведите «no solution» (без кавычек); в противном случае, выведите n строк, так чтобы i-ая строка содержала два целых числа xi, yi (|xi|, |yi| ≤ 109) — координаты i-ой точки.

Должны выполняться следующие условия:

  • Все точки должны быть различны.
  • |xi|, |yi| ≤ 109.
  • После запуска данного кода значение tot должно превосходить k.

A. Чье это предложение?

реализация Строки *1100

Однажды liouzhou_101 получил логи чата между Фредой и Рейнбоу. Из любопытства он хотел узнать, какое предложение сказала Фреда, а какое сказал Рейнбоу. Исходя из своего опыта, он знал, что Фреда всегда говорит в конце предложений «lala.», а Рейнбоу всегда говорит в начале предложения «miao.» Помогите liouzhou_101, для каждого предложения из записей чата определите, чье это предложение?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 10), количество предложений в логах чата. Каждая из следующих n строк содержит предложения. Предложение — это строка, которая может содержать только из латинских букв (A-Z, a-z), подчеркиваний (_), запятых (,), точек (.) и пробелов ( ). Его длина не превышает 100.

Выходные данные

Для каждого предложения выведите «Freda's», если предложения сказала Фреда, «Rainbow's», если предложение было сказано Рейнбоу, или «OMG>.< I don't know!», если liouzhou_101 не может определить, чье это предложение. Он не может распознать, чье это предложение, если оно содержит и «miao.» в начале, и «lala.» в конце, либо не содержит ни одного из них.

A. Илья и банковский счет

реализация теория чисел *900

Илья — очень умный лев, который живет в необычном городе ZooVille. В этом городе у всех зверей есть свои права и обязательства. Более того, у них даже есть свой банковский счет. Состояние банковского счета — это целое число. Состояние банковского счета может быть отрицательным числом. Это значит, что владелец счета должен банку.

У льва Ильи скоро день рождения, поэтому ему подарили много подарков. Один из них (подарок главного банка ZooVille) — это возможность не более одного раза удалить последнюю или предпоследнюю цифру состояния его банковского счета. Например, если состояние банковского счета Ильи равно -123, то Илья может удалить последнюю его цифру и получить состояние счета равное -12, также он может удалить предпоследнюю его цифру и получить состояние счета равное -13. Конечно, Илье разрешается не пользоваться возможностью удалить цифру из счета.

Илья не очень силен в математике и именно поэтому он просит Вас помочь максимизировать свой банковский счет. Найдите, какое максимальное состояние банковского счета можно получить, используя подарок банка.

Входные данные

В единственной строке задано целое число n (10 ≤ |n| ≤ 109) — состояние счета Ильи.

Выходные данные

В единственной строке выведите целое число — максимальное состояние банковского счета, которое может получить Илья.

Примечание

В первом тестовом примере Илье не выгодно использовать подарок.

Во втором тестовом примере можно удалить цифру 1 и получить состояние счета равное 0.

B. Илья и запросы

дп реализация *1100

Лев Илья хочет помочь всем своим друзьям со сдачей экзаменов. Чтобы сдать экзамен по информатике нужно решить следующую задачу.

Даны строка s = s1s2... sn (n — длина строки), состоящая только из символов «.» и «#», и m запросов. Каждый запрос описывается парой целых чисел li, ri (1 ≤ li < ri ≤ n). Ответ на запрос li, ri — это количество таких целых чисел i (li ≤ i < ri), что si = si + 1.

Лев Илья хочет помочь друзьям, но кто же поможет ему. Помогите Льву Илье, решите задачу.

Входные данные

В первой строке записана строка s длины n (2 ≤ n ≤ 105). Гарантируется, что заданная строка состоит только из символов «.» и «#».

В следующей строке записано целое число m (1 ≤ m ≤ 105) — количество запросов. В каждой из следующих m строк записано описание соответствующего запроса. В i-той строке записаны целые числа li, ri (1 ≤ li < ri ≤ n).

Выходные данные

Выведите m целых чисел — ответы на запросы в том порядке, в котором запросы заданы во входных данных.

C. Илья и матрица

жадные алгоритмы Конструктив реализация сортировки *1400

Илья — очень добрый лев, который любит математику. Из всех математических объектов Илья больше всего любит матрицы. Сейчас перед ним стоит непростая задача о матрицах, которую нужно решить.

Заданы квадратная матрица размера 2n × 2n и 4n целых чисел. Нужно разместить все эти числа в матрице (каждое число поместить в отдельную ячейку) так, чтобы красота полученной матрицы с числами была максимальна.

Красотой матрицы размера 2n × 2n называется целое число, получаемое по следующему алгоритму:

  1. Найти максимальный элемент в матрице. Обозначим его за m.
  2. Если n = 0, тогда красота матрицы равна m. Иначе, матрицу можно разбить на 4 непересекающиеся подматрицы размера 2n - 1 × 2n - 1, тогда красота матрицы равна сумме числа m и четырех красот описанных подматриц.

Как можно заметить, этот алгоритм — рекурсивный.

Помогите Илье, решите задачу и выведите результирующую максимальную красоту матрицы.

Входные данные

В первой строке записано целое число 4n (1 ≤ 4n ≤ 2·106). В следующей строке находится 4n целых чисел ai (1 ≤ ai ≤ 109) — числа, которые нужно разместить в матрице размера 2n × 2n.

Выходные данные

В единственную строку выведите максимальное значение красоты полученной матрицы.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

Рассмотрим второй пример, числа в матрице надо расставить следующим способом:


1 2
3 4

Тогда красота матрицы будет равна: 4 + 1 + 2 + 3 + 4 = 14.

A. Сережа и контест

реализация *1600

На последнем раунде Сережи на сайте Codesecrof произошло много падений сервера, в результате чего было решено, что для некоторых участников раунд будет нерейтинговым.

Пусть в соревновании принимали участие n человек. Пусть участник, занявший первое место, имеет рейтинг a1, участник, занявший второе место — a2, ..., участник на n-ом месте имеет рейтинг an. Тогда изменение рейтинга на сайте Codesecrof вычисляется по формуле .

После окончания раунда руководство Codesecrof опубликовало таблицу участников раунда с изменениями рейтинга. Было решено, что для тех участников, для которых di < k, раунд может быть засчитан как нерейтинговый. Но каково же было удивление руководства, когда они обнаружили, что таблица участников с изменениями рейтинга динамическая. Другими словами, когда какой-то участник исключается из рейтинга, он удаляется из таблицы результатов, при этом изменения рейтинга пересчитываются в соответствии с новой таблицей. И конечно же, все заявки на исключение из рейтинга рассматриваются с учетом текущей таблицы.

Известно, что среди всех поданных заявок на исключение из рейтинга первой всегда удовлетворяется заявка от участника с наилучшим местом (наименьшим по номеру), для которого di < k. Также известно, что заявки на исключение из рейтинга подали все участники соревнования.

Теперь Сереже очень интересно, сколько участников могут быть исключены из рейтинга соревнования, а также номера этих участников в первоначальной таблице в порядке их исключения из рейтинга. Обратите внимание на разбор первого тестового примера для лучшего понимания условия.

Входные данные

В первой строке заданы два целых числа n, k (1 ≤ n ≤ 2·105,  - 109 ≤ k ≤ 0). Во второй строке задано n целых чисел через пробел a1, a2, ..., an (1 ≤ ai ≤ 109) — рейтинги участников соревнования, в порядке их расположения в первоначальной таблице результатов.

Выходные данные

Выведите номера участников, в том порядке, в котором они были удалены из таблицы. Выводите изначальные номера участников, то есть те, которые они имели в изначальной таблице.

Примечание

Рассмотрим первый тестовый пример.

  1. Первоначально последовательность рейтингов участников соревнования равна [5, 3, 4, 1, 2]. По этой последовательности можно посчитать последовательность изменений рейтинга: [0, -9, -13, 8, 14]. По условию задачи первым будет выполнена заявка участника, занявшего второе место.
  2. После того, как участник на втором месте будет исключен из рейтинга, последовательность рейтингов участников соревнования будет равна [5, 4, 1, 2]. По этой последовательности можно посчитать новую последовательность изменений рейтинга: [0, -8, 2, 6]. По условию задачи будет выполнена заявка участника, занявшего второе место. В первоначальной таблице этот участник занимал третье место.
  3. Новая последовательность рейтингов равна [5, 1, 2], новая последовательность изменений рейтингов равна [0, -1, 1]. Будет выполнена заявка участника на втором месте, первоначально этот участник занимал четвертое место.
  4. Новая последовательность рейтингов [5, 2]. Новая последовательность изменений рейтингов [0, 0]. Больше никакие заявки не будут выполнены.

Таким образом, нужно вывести 2, 3, 4.

B. Сережа и массив

реализация *1200

У Сережи есть массив, состоящий из n целых чисел, a1, a2, ..., an. Сережа — активный мальчик, поэтому сейчас он собирается выполнить m операций. Каждая из этих операций будет иметь один из трех следующих видов:

  1. Сделать vi-ый элемент массива равным xi. Другими словами, выполнить присвоение avi = xi.
  2. Увеличить каждый элемент массива на yi. Другими словами, выполнить n присвоений ai = ai + yi (1 ≤ i ≤ n).
  3. Выписать на листок qi-ый элемент массива. То есть элемент aqi.

Помогите Сереже, выполните все его операции.

Входные данные

В первой строке записаны целые числа n, m (1 ≤ n, m ≤ 105). Во второй строке записаны n целых чисел через пробел a1, a2, ..., an (1 ≤ ai ≤ 109) — исходный массив.

Следующие m строк описывают операции, i-ая строка описывает i-ую операцию. Первое число в i-ой строке — целое число ti (1 ≤ ti ≤ 3), которое обозначает тип операции. Если ti = 1, то далее следуют два целых числа vi и xi, (1 ≤ vi ≤ n, 1 ≤ xi ≤ 109). Если ti = 2, то далее следует целое число yi (1 ≤ yi ≤ 104). Если же ti = 3, то далее следует целое число qi (1 ≤ qi ≤ n).

Выходные данные

Для каждой операции третьего типа выведите значение aqi. Значения выводите в порядке следования соответствующих запросов во входных данных.

F1. Солнышки и лучики

поиск в глубину и подобное реализация *2200

Умный Бобер увлекся рисованием. Он рисует солнышки. Однако, в какой-то момент Умный Бобер понял, что просто рисовать солнышки ему скучно. И он решил разработать программу, которая будет обрабатывать его рисунки. Вам дано изображение, нарисованное Бобром. Оно будет иметь два цвета: один для фона, второй для солнышек на изображении. Ваша задача будет заключаться в том, чтобы посчитать число солнышек на изображении и для каждого из них посчитать число лучиков.

Солнышко представляет собой произвольно повернутый эллипс с лучиками. Под лучиком будем понимать отрезок соединяющий границу эллипса с некоторой точкой вне эллипса.

Изображение, на котором все солнышки являются кругами.
Изображение, на котором все солнышки являются эллипсами, оси которых параллельны координатным осям.
Изображение, на котором все солнышки являются эллипсами с поворотом.

Гарантируется, что:

  • Никакие два солнышка не имеют общих точек.
  • Толщина лучиков будет составлять 3 пикселя.
  • Длины осей эллипсов, соответствующих солнышкам, будут лежать в пределах от 40 до 200 пикселей.
  • Никакие два лучика не пересекаются.
  • Длины всех лучиков будет лежать в пределах от 10 до 30 пикселей.
Входные данные

Первая строка содержит два целых числа h и w — высота и ширина изображения (1 ≤ h, w ≤ 1600). Следующие h строк будут содержать по w целых чисел, разделенных пробелами. Они описывают рисунок Умного Бобра. Каждое из этих чисел будет равно либо 0 (фон изображения), либо 1 (цвет солнышка).

Ограничения на входные данные для получения 30 баллов (подзадача F1):

  • Все солнышки на изображении имеют форму кругов.

Ограничения на входные данные для получения 70 баллов (подзадачи F1+F2):

  • Все солнышки на изображении имеют форму эллипсов, оси которых параллельны координатным осям.

Ограничения на входные данные для получения 100 баллов (подзадачи F1+F2+F3):

  • Все солнышки на изображении имеют форму эллипсов, которые могут быть произвольным образом повернуты.
Выходные данные

Первая строка должна содержать ровно одно целое число k — количество солнышек на рисунке Бобра. Вторая строка должна содержать ровно k целых чисел, разделенных пробелами. Эти числа будут соответствовать количеству лучиков на каждом из солнышек. Числа во второй строке должны быть отсортированы по возрастанию.

Примечание

Для каждого уровня сложности Вам предлагается пример исходных данных. Скачать примеры можно на http://www.abbyy.ru/sun.zip.

B. Муравьи

Перебор реализация *2000

Во время исследования поведения муравьев в графеновых трубках на целочисленной решетке было сделано следующее важное наблюдение об их поведении: каждую минуту в каждом узле (x, y), в котором находится хотя бы четыре муравья, выделяется ровно одна группа из четырех муравьев, и они разбегаются по одному по трубкам в соседние узлы (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1). Никаких других движений муравьи не совершают. Муравьи никоим образом не мешают друг другу.

Ученые запустили колонию из n муравьев в центр графеновой плоскости (0, 0) и хотят узнать, сколько муравьев окажется в определенных узлах в тот момент, когда муравьи перестанут бегать.

Входные данные

Первая строка содержит целые числа n (0 ≤ n ≤ 30000) и t (1 ≤ t ≤ 50000), где n — количество муравьев в колонии, t — количество запросов. Каждая из следующих t строк содержит координаты узлов-запросов: целые числа xi, yi ( - 109 ≤ xi, yi ≤ 109). Запросы могут повторяться.

Гарантируется, что наступит момент, когда муравьи не смогут больше совершать движения и процесс остановится.

Выходные данные

Выведите t чисел, по одному на строчку — количества муравьев в соответствующих узлах в конце забега.

Примечание

В первом примере колония состоит всего из одного муравья, и никаких движений не происходит.

Во втором примере колония состоит из 6 муравьев. На первой минуте 4 муравья из (0, 0) разбегаются в соседние узлы. После этого процесс останавливается.

B. Энергетические строчки

реализация Строки *1300

Володя любит слушать хэви-метал и иногда — читать. Особый интерес для Володи представляют тексты про его любимый музыкальный стиль.

Володя называет строчку энергетической, если она начинается на «heavy» и заканчивается на «metal». Когда Володя читает текст, он отмечает в нем все энергетические подстрочки и становится ужасно довольным (подстрокой Володя называет последовательность подряд идущих символов в тексте). Совсем недавно он, прочитав особенно впечатляющий текст, испытал небывалый прилив сил и решил похвастаться перед друзьями, назвав им точное количество энергетических подстрок в этом тексте. Помогите Володе посчитать, сколько было энергетических подстрок в прочитанном им тексте. Две подстроки считаются различными, если они встречаются в разных местах в тексте.

Для простоты будем считать, что текст Володи задается единственной строкой.

Входные данные

Во входных данных содержится единственная непустая строка, состоящая только из строчных букв латинского алфавита. Длина строки не превышает 106 символов.

Выходные данные

Выведите единственное число — количество энергетических подстрок в данной строке.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d).

Примечание

В первом примере в строке «heavymetalisheavymetal» дважды встречается энергетическая подстрока «heavymetal», кроме того, вся строка «heavymetalisheavymetal» является энергетической.

Во втором примере в строке «heavymetalismetal» есть две энергетические подстрочки: «heavymetal» и «heavymetalismetal».

B. Психи - в шеренгу!

реализация Структуры данных *1900

Дана шеренга из n психов. Каждому психу дан идентификатор — уникальное целое число от 1 до n. На каждом ходе каждый псих, имеющий идентификатор больше, чем у психа справа (если такой есть) убивает своего соседа справа в шеренге. Обратите внимание, что псих может убить и быть убитым на одном и том же ходе.

Вам дано исходное расположение психов в шеренге. Подсчитайте, сколько необходимо ходов до момента времени, после которого никто никого не будет убивать. Прочитайте пояснение к тестовому примеру, чтобы лучше понять условие.

Входные данные

В первой строке входных данных записано целое число n, обозначающее количество психов, (1 ≤ n ≤ 105). Во второй строке записан список из n различных целых чисел от 1 до n, включительно — идентификаторы психов в шеренге слева направо.

Числа в строках разделяются одиночными пробелами.

Выходные данные

Выведите количество ходов, после которых шеренга не будет меняться.

Примечание

В первом примере шеренга психов меняется так: [10 9 7 8 6 5 3 4 2 1]  →  [10 8 4]  →  [10]. Итого, есть два хода.

B. Азбука Борзе

Разбор выражений реализация *800

Сейчас в Берляндии популярна троичная система счисления. Для телеграфной передачи чисел, записанных в троичной системе счисления, используется азбука Борзе. Цифра 0 передается как «.», 1 как «-.», 2 как «--». Расшифровка кода Борзе чисел — очень важная и ответственная работа. Ваша задача — расшифровать заданное в коде Борзе троичное число.

Входные данные

В первой строке записано число в коде Борзе. Длина кода не меньше 1 и не больше 200 символов. Гарантируется, что заданная строка — корректный код Борзе некоторого числа в троичной системе счисления (число могло содержать лидирующие нули).

Выходные данные

Выведите расшифровку заданного кода Борзе. Расшифрованное число может содержать лидирующие нули.

D. Созвездие

реализация *1600

Карта звездного неба Берляндии представляет собой клетчатое поле n × m клеток. В каждой клетке либо есть звезда, либо нет. Любимое созвездие всех берляндских астрономов — созвездие Крест. Это созвездие образуют любые такие 5 различных звезд, что для некоторого целого числа x (радиуса созвездия) выполняется:

  • 2-ая находится в той же вертикали что и 1-ая, но на x клеток выше
  • 3-я находится в той же вертикали что и 1-ая, но на x клеток ниже
  • 4-ая находится в той же горизонтали что и 1-ая, но на x клеток левее
  • 5-ая находится в той же горизонтали что и 1-ая, но на x клеток правее

Таких различных созвездий может быть очень много, поэтому все они нумеруются целыми числами от единицы следующим образом: при сравнении двух созвездий, меньший номер получает то, радиус которого меньше, при их равенстве — то, средняя звезда которого находится выше средней звезды другого, при равенстве — то, средняя звезда которого левее.

Ваша задача — по заданной карте звездного неба Берляндии найти k-ое по счету созвездие Крест.

Входные данные

В первой строке записаны три целых числа n, m и k (1 ≤ n, m ≤ 300, 1 ≤ k ≤ 3·107) — высота и ширина карты и номер нужного созвездия соответственно. Левый верхний угол имеет координаты (1, 1), а правый нижний — (n, m). Далее следует n строк по m символов — описание карты. j-ый символ в i-ой строке — «*» если в соответствующей клетке звезда, «.» если в соответствующей клетке пусто.

Выходные данные

Если на карте меньше k созвездий, выведите -1. Иначе выведите 5 строк по два целых числа в каждой — координаты звезд нужного созвездия. Звезды выводите в порядке: центральная, верхняя, нижняя, левая, правая.

E. Прятки

геометрия реализация *2400

Вася и Петя играют в прятки. Петя спрятался, а Вася должен его найти. В помещении, где они играют, есть всего одна непрозрачная стена и одно двустороннее зеркало. Вася и Петя представляют собой точки с координатами (xv, yv) и (xp, yp) соответственно. Стена — это отрезок, соединяющий точки с координатами (xw, 1, yw, 1) и (xw, 2, yw, 2), а зеркало — отрезок, соединяющий точки (xm, 1, ym, 1) и (xm, 2, ym, 2).

Если препятствие имеет общую точку с линией обзора, считается, что ребята не видят друг друга через эту линию обзора. Если зеркало имеет общую точку с линией обзора, считается, что ребята могут увидеть друг друга в зеркале, то есть происходит отражение. Отражение от зеркала происходит по обычным физическим законам: угол падения равен углу отражения. Падающий луч находится в той же полуплоскости относительно зеркала, что и отраженный. То есть чтобы увидеть друг друга в зеркало, Вася и Петя должны находиться по одну и ту же сторону от прямой, содержащей зеркало (см. пример 1). Если линия обзора проходит параллельно зеркалу, отражения не происходит, при этом зеркало не рассматривается как препятствие (см. пример 4).

Васе стало интересно, может ли он увидеть Петю, не сходя с места. Помогите ему справиться с этой задачей.

Входные данные

В первой строке записано два числа xv и yv — координаты Васи.

Во второй строке записано два числа xp и yp — координаты Пети.

В третьей строке записано 4 числа xw, 1, yw, 1, xw, 2, yw, 2 — координаты стены.

В четвертой строке записано 4 числа xm, 1, ym, 1, xm, 2, ym, 2 — координаты зеркала.

Все координаты — целые числа, не превосходящие по модулю 104. Гарантируется, что отрезки не имеют общих точек, Вася и Петя не находятся ни на каком из отрезков, координаты Васи и Пети не совпадают, отрезки не вырождаются в точки.

Выходные данные

Выведите YES если Вася может увидеть Петю, не сдвигаясь с места, иначе выведите NO.

A. Ciel и робот

Бинарный поиск математика реализация *1700

У лисы Ciel есть робот на плоскости. Изначально робот расположен в (0, 0). Лиса Ciel написала программу для этого робота. Программа представляет из себя строку s. Каждый символ строки s обозначает перемещение робота. Всего есть четыре вида перемещений:

  • 'U': шаг вверх, (x, y)  →  (x, y+1);
  • 'D': шаг вниз, (x, y)  →  (x, y-1);
  • 'L': шаг влево, (x, y)  →  (x-1, y);
  • 'R': шаг вправо, (x, y)  →  (x+1, y).

Робот выполняет операции перемещения из строки s слева направо. Выполнив все операции строки s, он начинает выполнять их снова с начала строки s. Он делает это снова и снова, до бесконечности.

Помогите лисе Ciel определить, окажется ли робот в точке (a, b) когда-нибудь.

Входные данные

Первая строка содержит два целых числа a и b, ( - 109 ≤ a, b ≤ 109). Вторая строка содержит строку s (1 ≤ |s| ≤ 100, s состоит только из символов 'U', 'D', 'L', 'R') — программа робота.

Выходные данные

Выведите "Yes", если робот окажется в (a, b), в противном случае выведите "No".

Примечание

В первом и втором тесте программа — это строка "RU", так что робот пойдет вправо, затем вверх, затем вправо, затем вверх и так далее.

Робот пройдет по точкам (0, 0)  →  (1, 0)  →  (1, 1)  →  (2, 1)  →  (2, 2)  →  ...

Итак, он может дойти до (2, 2), но не до (1, 2).

A. Квадрат и прямоугольники

реализация *1500

Красная шапочка нарисовала n прямоугольников. Углы прямоугольников имеют целочисленные координаты, а их ребра параллельны осям Ox и Oy. Прямоугольники могут касаться друг друга, но не могут пересекаться (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Ваша задача — определить, образуют ли нарисованные прямоугольники квадрат. Иными словами, определите, существует ли такой квадрат, что множество точек, лежащих внутри или на границе хотя бы одного прямоугольника, в точности равно множеству точек, лежащих внутри или на границе этого квадрата.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 5). Каждая из следующих n строк содержит четыре целых числа, которые описывают один прямоугольник: x1, y1, x2, y2 (0 ≤ x1 < x2 ≤ 31400, 0 ≤ y1 < y2 ≤ 31400) — x1 и x2 обозначают x-координаты левой и правой стороны прямоугольника, y1 и y2 обозначают y-координаты нижней и верхней стороны прямоугольника.

Прямоугольники не пересекаются (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Выходные данные

В единственную строку выведите «YES», если нарисованные прямоугольники образуют квадрат, или «NO» в противном случае.

A. Квадрат и прямоугольники

реализация *1500

Красная шапочка нарисовала n прямоугольников. Углы прямоугольников имеют целочисленные координаты, а их ребра параллельны осям Ox и Oy. Прямоугольники могут касаться друг друга, но не могут пересекаться (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Ваша задача — определить, образуют ли нарисованные прямоугольники квадрат. Иными словами, определите, существует ли такой квадрат, что множество точек, лежащих внутри или на границе хотя бы одного прямоугольника, в точности равно множеству точек, лежащих внутри или на границе этого квадрата.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 5). Каждая из следующих n строк содержит четыре целых числа, которые описывают один прямоугольник: x1, y1, x2, y2 (0 ≤ x1 < x2 ≤ 31400, 0 ≤ y1 < y2 ≤ 31400) — x1 и x2 обозначают x-координаты левой и правой стороны прямоугольника, y1 и y2 обозначают y-координаты нижней и верхней стороны прямоугольника.

Прямоугольники не пересекаются (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Выходные данные

В единственную строку выведите «YES», если нарисованные прямоугольники образуют квадрат, или «NO» в противном случае.

A. Квадрат и прямоугольники

реализация *1500

Красная шапочка нарисовала n прямоугольников. Углы прямоугольников имеют целочисленные координаты, а их ребра параллельны осям Ox и Oy. Прямоугольники могут касаться друг друга, но не могут пересекаться (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Ваша задача — определить, образуют ли нарисованные прямоугольники квадрат. Иными словами, определите, существует ли такой квадрат, что множество точек, лежащих внутри или на границе хотя бы одного прямоугольника, в точности равно множеству точек, лежащих внутри или на границе этого квадрата.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 5). Каждая из следующих n строк содержит четыре целых числа, которые описывают один прямоугольник: x1, y1, x2, y2 (0 ≤ x1 < x2 ≤ 31400, 0 ≤ y1 < y2 ≤ 31400) — x1 и x2 обозначают x-координаты левой и правой стороны прямоугольника, y1 и y2 обозначают y-координаты нижней и верхней стороны прямоугольника.

Прямоугольники не пересекаются (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Выходные данные

В единственную строку выведите «YES», если нарисованные прямоугольники образуют квадрат, или «NO» в противном случае.

A. Квадрат и прямоугольники

реализация *1500

Красная шапочка нарисовала n прямоугольников. Углы прямоугольников имеют целочисленные координаты, а их ребра параллельны осям Ox и Oy. Прямоугольники могут касаться друг друга, но не могут пересекаться (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Ваша задача — определить, образуют ли нарисованные прямоугольники квадрат. Иными словами, определите, существует ли такой квадрат, что множество точек, лежащих внутри или на границе хотя бы одного прямоугольника, в точности равно множеству точек, лежащих внутри или на границе этого квадрата.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 5). Каждая из следующих n строк содержит четыре целых числа, которые описывают один прямоугольник: x1, y1, x2, y2 (0 ≤ x1 < x2 ≤ 31400, 0 ≤ y1 < y2 ≤ 31400) — x1 и x2 обозначают x-координаты левой и правой стороны прямоугольника, y1 и y2 обозначают y-координаты нижней и верхней стороны прямоугольника.

Прямоугольники не пересекаются (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Выходные данные

В единственную строку выведите «YES», если нарисованные прямоугольники образуют квадрат, или «NO» в противном случае.

A. Квадрат и прямоугольники

реализация *1500

Красная шапочка нарисовала n прямоугольников. Углы прямоугольников имеют целочисленные координаты, а их ребра параллельны осям Ox и Oy. Прямоугольники могут касаться друг друга, но не могут пересекаться (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Ваша задача — определить, образуют ли нарисованные прямоугольники квадрат. Иными словами, определите, существует ли такой квадрат, что множество точек, лежащих внутри или на границе хотя бы одного прямоугольника, в точности равно множеству точек, лежащих внутри или на границе этого квадрата.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 5). Каждая из следующих n строк содержит четыре целых числа, которые описывают один прямоугольник: x1, y1, x2, y2 (0 ≤ x1 < x2 ≤ 31400, 0 ≤ y1 < y2 ≤ 31400) — x1 и x2 обозначают x-координаты левой и правой стороны прямоугольника, y1 и y2 обозначают y-координаты нижней и верхней стороны прямоугольника.

Прямоугольники не пересекаются (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Выходные данные

В единственную строку выведите «YES», если нарисованные прямоугольники образуют квадрат, или «NO» в противном случае.

A. Квадрат и прямоугольники

реализация *1500

Красная шапочка нарисовала n прямоугольников. Углы прямоугольников имеют целочисленные координаты, а их ребра параллельны осям Ox и Oy. Прямоугольники могут касаться друг друга, но не могут пересекаться (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Ваша задача — определить, образуют ли нарисованные прямоугольники квадрат. Иными словами, определите, существует ли такой квадрат, что множество точек, лежащих внутри или на границе хотя бы одного прямоугольника, в точности равно множеству точек, лежащих внутри или на границе этого квадрата.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 5). Каждая из следующих n строк содержит четыре целых числа, которые описывают один прямоугольник: x1, y1, x2, y2 (0 ≤ x1 < x2 ≤ 31400, 0 ≤ y1 < y2 ≤ 31400) — x1 и x2 обозначают x-координаты левой и правой стороны прямоугольника, y1 и y2 обозначают y-координаты нижней и верхней стороны прямоугольника.

Прямоугольники не пересекаются (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Выходные данные

В единственную строку выведите «YES», если нарисованные прямоугольники образуют квадрат, или «NO» в противном случае.

A. Квадрат и прямоугольники

реализация *1500

Красная шапочка нарисовала n прямоугольников. Углы прямоугольников имеют целочисленные координаты, а их ребра параллельны осям Ox и Oy. Прямоугольники могут касаться друг друга, но не могут пересекаться (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Ваша задача — определить, образуют ли нарисованные прямоугольники квадрат. Иными словами, определите, существует ли такой квадрат, что множество точек, лежащих внутри или на границе хотя бы одного прямоугольника, в точности равно множеству точек, лежащих внутри или на границе этого квадрата.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 5). Каждая из следующих n строк содержит четыре целых числа, которые описывают один прямоугольник: x1, y1, x2, y2 (0 ≤ x1 < x2 ≤ 31400, 0 ≤ y1 < y2 ≤ 31400) — x1 и x2 обозначают x-координаты левой и правой стороны прямоугольника, y1 и y2 обозначают y-координаты нижней и верхней стороны прямоугольника.

Прямоугольники не пересекаются (то есть не существует точки, которая принадлежит внутренности более одного прямоугольника).

Выходные данные

В единственную строку выведите «YES», если нарисованные прямоугольники образуют квадрат, или «NO» в противном случае.

A. Игра с переворачиванием

дп Перебор реализация *1200

Яхубу стало скучно и он придумал игру, в которую надо играть на бумаге.

Яхуб выписывает n целых чисел a1, a2, ..., an. Каждое из этих целых чисел может быть равно 0 или 1. Ему разрешено выполнить ровно одно действие: выбрать два индекса i и j (1 ≤ i ≤ j ≤ n) и перевернуть все значения ak, позиции которых находятся на отрезке [i, j] (то есть i ≤ k ≤ j). Перевернуть значение x, значит выполнить операцию x = 1 - x.

Цель игры — получить максимальное количество единиц после ровно одного хода. Напишите программу, которая решает маленькую игру Яхуба.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100). Во второй строке записано n целых чисел: a1, a2, ..., an. Гарантируется, что каждое из этих n чисел равняется либо 0, либо 1.

Выходные данные

Выведите целое число — максимальное количество единиц, которое можно получить после ровно одного хода.

Примечание

В первом случае надо перевернуть отрезок от 2 до 5 (i = 2, j = 5). Такой переворот превращает последовательность в: [1 1 1 0 1]. Итого, в ней теперь четыре единицы. Мы никак не сможем превратить последовательность в [1 1 1 1 1].

Во втором случае, если мы перевернем только второй и третий элементы (i = 2, j = 3), все числа будут равны 1.

A. Игра с переворачиванием

дп Перебор реализация *1200

Яхубу стало скучно и он придумал игру, в которую надо играть на бумаге.

Яхуб выписывает n целых чисел a1, a2, ..., an. Каждое из этих целых чисел может быть равно 0 или 1. Ему разрешено выполнить ровно одно действие: выбрать два индекса i и j (1 ≤ i ≤ j ≤ n) и перевернуть все значения ak, позиции которых находятся на отрезке [i, j] (то есть i ≤ k ≤ j). Перевернуть значение x, значит выполнить операцию x = 1 - x.

Цель игры — получить максимальное количество единиц после ровно одного хода. Напишите программу, которая решает маленькую игру Яхуба.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100). Во второй строке записано n целых чисел: a1, a2, ..., an. Гарантируется, что каждое из этих n чисел равняется либо 0, либо 1.

Выходные данные

Выведите целое число — максимальное количество единиц, которое можно получить после ровно одного хода.

Примечание

В первом случае надо перевернуть отрезок от 2 до 5 (i = 2, j = 5). Такой переворот превращает последовательность в: [1 1 1 0 1]. Итого, в ней теперь четыре единицы. Мы никак не сможем превратить последовательность в [1 1 1 1 1].

Во втором случае, если мы перевернем только второй и третий элементы (i = 2, j = 3), все числа будут равны 1.

A. Игра с переворачиванием

дп Перебор реализация *1200

Яхубу стало скучно и он придумал игру, в которую надо играть на бумаге.

Яхуб выписывает n целых чисел a1, a2, ..., an. Каждое из этих целых чисел может быть равно 0 или 1. Ему разрешено выполнить ровно одно действие: выбрать два индекса i и j (1 ≤ i ≤ j ≤ n) и перевернуть все значения ak, позиции которых находятся на отрезке [i, j] (то есть i ≤ k ≤ j). Перевернуть значение x, значит выполнить операцию x = 1 - x.

Цель игры — получить максимальное количество единиц после ровно одного хода. Напишите программу, которая решает маленькую игру Яхуба.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100). Во второй строке записано n целых чисел: a1, a2, ..., an. Гарантируется, что каждое из этих n чисел равняется либо 0, либо 1.

Выходные данные

Выведите целое число — максимальное количество единиц, которое можно получить после ровно одного хода.

Примечание

В первом случае надо перевернуть отрезок от 2 до 5 (i = 2, j = 5). Такой переворот превращает последовательность в: [1 1 1 0 1]. Итого, в ней теперь четыре единицы. Мы никак не сможем превратить последовательность в [1 1 1 1 1].

Во втором случае, если мы перевернем только второй и третий элементы (i = 2, j = 3), все числа будут равны 1.

A. Игра с переворачиванием

дп Перебор реализация *1200

Яхубу стало скучно и он придумал игру, в которую надо играть на бумаге.

Яхуб выписывает n целых чисел a1, a2, ..., an. Каждое из этих целых чисел может быть равно 0 или 1. Ему разрешено выполнить ровно одно действие: выбрать два индекса i и j (1 ≤ i ≤ j ≤ n) и перевернуть все значения ak, позиции которых находятся на отрезке [i, j] (то есть i ≤ k ≤ j). Перевернуть значение x, значит выполнить операцию x = 1 - x.

Цель игры — получить максимальное количество единиц после ровно одного хода. Напишите программу, которая решает маленькую игру Яхуба.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100). Во второй строке записано n целых чисел: a1, a2, ..., an. Гарантируется, что каждое из этих n чисел равняется либо 0, либо 1.

Выходные данные

Выведите целое число — максимальное количество единиц, которое можно получить после ровно одного хода.

Примечание

В первом случае надо перевернуть отрезок от 2 до 5 (i = 2, j = 5). Такой переворот превращает последовательность в: [1 1 1 0 1]. Итого, в ней теперь четыре единицы. Мы никак не сможем превратить последовательность в [1 1 1 1 1].

Во втором случае, если мы перевернем только второй и третий элементы (i = 2, j = 3), все числа будут равны 1.

A. Игра с переворачиванием

дп Перебор реализация *1200

Яхубу стало скучно и он придумал игру, в которую надо играть на бумаге.

Яхуб выписывает n целых чисел a1, a2, ..., an. Каждое из этих целых чисел может быть равно 0 или 1. Ему разрешено выполнить ровно одно действие: выбрать два индекса i и j (1 ≤ i ≤ j ≤ n) и перевернуть все значения ak, позиции которых находятся на отрезке [i, j] (то есть i ≤ k ≤ j). Перевернуть значение x, значит выполнить операцию x = 1 - x.

Цель игры — получить максимальное количество единиц после ровно одного хода. Напишите программу, которая решает маленькую игру Яхуба.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100). Во второй строке записано n целых чисел: a1, a2, ..., an. Гарантируется, что каждое из этих n чисел равняется либо 0, либо 1.

Выходные данные

Выведите целое число — максимальное количество единиц, которое можно получить после ровно одного хода.

Примечание

В первом случае надо перевернуть отрезок от 2 до 5 (i = 2, j = 5). Такой переворот превращает последовательность в: [1 1 1 0 1]. Итого, в ней теперь четыре единицы. Мы никак не сможем превратить последовательность в [1 1 1 1 1].

Во втором случае, если мы перевернем только второй и третий элементы (i = 2, j = 3), все числа будут равны 1.

A. Игра с переворачиванием

дп Перебор реализация *1200

Яхубу стало скучно и он придумал игру, в которую надо играть на бумаге.

Яхуб выписывает n целых чисел a1, a2, ..., an. Каждое из этих целых чисел может быть равно 0 или 1. Ему разрешено выполнить ровно одно действие: выбрать два индекса i и j (1 ≤ i ≤ j ≤ n) и перевернуть все значения ak, позиции которых находятся на отрезке [i, j] (то есть i ≤ k ≤ j). Перевернуть значение x, значит выполнить операцию x = 1 - x.

Цель игры — получить максимальное количество единиц после ровно одного хода. Напишите программу, которая решает маленькую игру Яхуба.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100). Во второй строке записано n целых чисел: a1, a2, ..., an. Гарантируется, что каждое из этих n чисел равняется либо 0, либо 1.

Выходные данные

Выведите целое число — максимальное количество единиц, которое можно получить после ровно одного хода.

Примечание

В первом случае надо перевернуть отрезок от 2 до 5 (i = 2, j = 5). Такой переворот превращает последовательность в: [1 1 1 0 1]. Итого, в ней теперь четыре единицы. Мы никак не сможем превратить последовательность в [1 1 1 1 1].

Во втором случае, если мы перевернем только второй и третий элементы (i = 2, j = 3), все числа будут равны 1.

A. Игра с переворачиванием

дп Перебор реализация *1200

Яхубу стало скучно и он придумал игру, в которую надо играть на бумаге.

Яхуб выписывает n целых чисел a1, a2, ..., an. Каждое из этих целых чисел может быть равно 0 или 1. Ему разрешено выполнить ровно одно действие: выбрать два индекса i и j (1 ≤ i ≤ j ≤ n) и перевернуть все значения ak, позиции которых находятся на отрезке [i, j] (то есть i ≤ k ≤ j). Перевернуть значение x, значит выполнить операцию x = 1 - x.

Цель игры — получить максимальное количество единиц после ровно одного хода. Напишите программу, которая решает маленькую игру Яхуба.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100). Во второй строке записано n целых чисел: a1, a2, ..., an. Гарантируется, что каждое из этих n чисел равняется либо 0, либо 1.

Выходные данные

Выведите целое число — максимальное количество единиц, которое можно получить после ровно одного хода.

Примечание

В первом случае надо перевернуть отрезок от 2 до 5 (i = 2, j = 5). Такой переворот превращает последовательность в: [1 1 1 0 1]. Итого, в ней теперь четыре единицы. Мы никак не сможем превратить последовательность в [1 1 1 1 1].

Во втором случае, если мы перевернем только второй и третий элементы (i = 2, j = 3), все числа будут равны 1.

A. IQ-тест

реализация *1800

При подготовке к тесту на IQ Петя заметил, что довольно часто встречаются задания вида: дана последовательность чисел, нужно найти в ней закономерность и дописать следующее число. Пока что Петя справляется только с арифметическими и геометрическими прогрессиями.

Арифметической прогрессией называется последовательность вида a1, a1 + d, a1 + 2d, ..., a1 + (n - 1)d, где a1 и d произвольные числа.

Геометрической прогрессией называется последовательность чисел b1, b2 = b1q, ..., bn = bn - 1q, где b1 ≠ 0, q ≠ 0, q ≠ 1.

К сожалению, у Пети проблемы с устным счетом. Он просит вас написать программу, определяющую, является ли заданная последовательность арифметической или геометрической прогрессией, и находящую следующее число. В случае если последовательность не является ни арифметической, ни геометрической прогрессией, или если невозможно продолжить прогрессию целым числом, Петя просит вас выводить его счастливое число 42.

Входные данные

В первой строке задана последовательность из четырех целых чисел от 1 до 1000 включительно.

Выходные данные

Выведите одно целое число — ответ на задачу. Если заданные четыре числа образуют арифметическую прогрессию, то выведите ее следующий член. Аналогично, если заданные четыре числа образуют геометрическую прогрессию, то выведите ее следующий член. В противном случае выведите 42.

Примечание

В этой задаче очень слабые претесты!

A. Что у нас на ужин?

жадные алгоритмы реализация *1200

В одной малоизвестной, но очень красивой стране Ватерляндии обитает милая акула Валерия. Как и у всех акул, зубы у нее расположены в несколько рядов, а питается она преимущественно карасиками. Одной из отличительных особенностей Валерии является то, что поедая одного карасика, она использует только один ряд зубов, остальные зубы в это время «отдыхают».

Долго наша героиня бороздила морские просторы в поисках своих любимых карасиков, пока не произошло с ней большое несчастье. Однажды у Валерии разболелись зубы, и ей пришлось обратиться к местному стоматологу, омару Ашоту. Будучи профессионалом, Ашот очень быстро избавил Валерию от зубной боли. Кроме того, он сумел определить причину развившегося кариеса (за что впоследствии получил прозвище Кэп).

Оказалось, что Валерия кушает слишком много карасиков. Чтобы предостеречь акулу от повторного возникновения зубной боли, Ашот определил для каждого зуба Валерии его остаточную жизнеспособность. Остаточной жизнеспособностью зуба стоматолог назвал величину, равную числу карасиков, которых можно съесть, используя этот зуб. Каждый раз, когда Валерия будет съедать карасика, жизнеспособность всех зубов, задействованных при этом, будет уменьшаться на единицу, и как только жизнеспособность хотя бы одного зуба станет отрицательной, акуле вновь придется обратиться за помощью стоматолога.

Опечаленная этими известиями, Валерия вернулась домой, где ее уже поджидала порция заранее заготовленных карасиков. Конечно же, акула не могла отказаться от своей горячо любимой пищи, но желания вновь оказаться в стоматологическом кресле у Валерии также не было. Поэтому она решила, что съест максимальное число имеющихся у нее карасиков, но при этом такое, чтобы жизнеспособность никакого зуба не становилась отрицательной.

Поскольку Валерия не сильна в математике, она попросила вас помочь ей определить суммарное число карасиков, которыми она сможет отужинать.

Напомним, что при поедании одного карасика Валерия использует ровно один ряд зубов, причем жизнеспособность каждого зуба, принадлежащего этому ряду, уменьшается на единицу.

Входные данные

В первой строке задано три целых числа n, m, k (1 ≤ m ≤ n ≤ 1000, 0 ≤ k ≤ 106) — общее число зубов у Валерии, количество зубных рядов и количество карасиков, имеющихся у Валерии на ужин, соответственно. В следующих n строках содержится по два целых числа: r (1 ≤ r ≤ m) — номер ряда, которому принадлежит соответствующий зуб, и c (0 ≤ c ≤ 106) — его остаточная жизнеспособность.

Гарантируется, что в каждом ряду находится положительное число зубов.

Выходные данные

В первую строку выведите наибольшее число карасиков, которыми Валерия сможет поужинать.

A. Тортминатор

Перебор реализация *800

Дан квадратный торт, который имеет вид таблицы размером r × c. Каждая ячейка таблицы содержит либо гадкую клубничку, либо является пустой. Например, торт размера 3 × 4 может выглядеть так:

Тортминатор намерен съесть этот торт! Каждый раз, когда он ест, он выбирает строку или столбец, не содержащие гадкой клубнички, а содержащие по крайней мере одну несъеденную ячейку торта. Затем Тортминатор поедает все выбранные им ячейки торта. Тортминатор может есть сколько угодно раз.

Пожалуйста, выведите максимальное количество ячеек, которые может съесть Тортминатор.

Входные данные

Первая строка содержит два целых числа r и c (2 ≤ r, c ≤ 10), обозначающих количество строк и количество столбцов в торте. Следующие r строк содержат по c символов — j-ый символ i-ой строки обозначает содержимое ячейки в строке i и столбце j, и имеет одно из следующих значений:

  • символ '.' обозначает ячейку торта без гадкой клубнички;
  • символ 'S' обозначает ячейку торта с гадкой клубничкой.
Выходные данные

Выведите максимальное количество ячеек торта, которые может съесть тортминатор.

Примечание

В первом примере возможная стратегия поедания максимального количества ячеек торта следующая (выполнено 3 поедания).

A. Выпьем?

реализация *1300

Всем известно, что жители Берляндии ведут здоровый образ жизни. Особенно студенты. Берляндские студенты настолько суровы, что пьют исключительно апельсиновый сок!

Вот и вчера на шашлыках студент Вася и его одногруппники употребляли лишь этот полезный напиток. После того как закончился первый ящик сока, они решили сыграть в одну простую игру. Все n человек, присутствовавшие на шашлыках, сели в круг (каждый получил, таким образом, уникальный номер bi от 0 до n - 1). Начинал игру человек под номером 0 (в этот раз это был Вася). Все ходы в игре нумеровались целыми числами, начиная с 1. Если j-ый ход доставался человеку с номером bi, то этот человек действовал следующим образом:

  1. он показывал на человека с номером (bi + 1) mod n либо локтем, либо кивком головы (x mod y — остаток от деления x на y);
  2. если j ≥ 4 и игроки, совершавшие ходы под номерами j - 1, j - 2, j - 3, во время этих ходов сделали то же движение, что и игрок bi на текущем ходу, то он выпивал стакан сока;
  3. ход передавался человеку с номером (bi + 1) mod n.

Человек, на которого показал игрок, ходивший последним, уже не совершал никаких действий.

К сожалению, Вася выпил слишком много сока и уже не помнит, в чем заключалась цель игры. Однако у Васи осталась записанная последовательность действий всех участников (включая его самого). Теперь Вася хочет выяснить, какое наибольшее количество сока он мог бы выпить, если бы действовал оптимально (при неизменных действиях других игроков). Помогите ему.

Можно считать, что при любом варианте развития событий сока хватило бы на всех.

Входные данные

В первой строке записано единственное целое число n (4 ≤ n ≤ 2000) — количество участников игры. Вторая строка описывает саму игру: i-ый символ этой строки равен 'a', если участник, ходивший i-ым, показал на следующего человека локтем, и 'b' — если кивком головы. Игра продолжалась не менее 1 и не более 2000 ходов.

Выходные данные

Выведите единственное целое число — количество стаканов сока, которое выпил бы Вася, если бы действовал оптимально.

Примечание

В обоих примерах Васе доставались два хода — 1 и 5. В первом примере Вася мог выпить стакан сока во время пятого хода, если бы показал на следующего человека кивком головы. В этом случае последовательность ходов имела бы вид «abbbb». Во втором примере Вася в любом случае не выпил бы ни одного стакана сока, поскольку движения, сделанные во время 3 и 4 ходов, отличаются.

B. Максимальная абсурдность

дп реализация Структуры данных *1500

В Берляндии продолжаются реформы. К примеру, на вчерашнем заседании парламент Берляндии принял целых n законов (каждому из них присвоен уникальный номер от 1 до n). Сегодня все эти законы лежат на столе у президента Берляндии дяди Вовы, которому они были переданы на подпись.

В этот раз дядя Вова планирует подписать 2k законов. Он решил выбрать ровно два непересекающихся отрезка целых чисел от 1 до n длиной k и подписать все законы, номера которых попадают в эти отрезки. Более формально, дядя Вова выберет два целых числа a, b (1 ≤ a ≤ b ≤ n - k + 1, b - a ≥ k) и подпишет все законы с номерами, лежащими в отрезках [aa + k - 1] и [bb + k - 1] (концы отрезков включаются).

При выборе подписываемых законов дядя Вова, разумеется, будет руководствоваться мнением общества. Всеберляндский центр изучения общественного мнения (ВЦИОМ) провел опросы среди населения и на их основе предоставил президенту отчет, в котором для каждого закона указана его средняя абсурдность с точки зрения респондентов. Как истинный патриот, дядя Вова хочет подписать законы, имеющие максимальную суммарную абсурдность. Помогите ему.

Входные данные

В первой строке записаны два целых числа n и k (2 ≤ n ≤ 2·105, 0 < 2k ≤ n) — количество законов, принятых парламентом, и длина одного отрезка в списке законов соответственно. В следующей строке записано n целых чисел x1, x2, ..., xn — абсурдность каждого из законов (1 ≤ xi ≤ 109).

Выходные данные

Выведите два целых числа a, b — начальные номера законов в отрезках, которые следует выбрать дяде Вове (это значит, что президент подпишет законы с номерами из отрезков [aa + k - 1] и [bb + k - 1]). Если существует несколько решений, выведите то, в котором число a минимально. Если вариантов подписания по-прежнему несколько, выведите тот, в котором число b минимально.

Примечание

В первом примере дядя Вова подпишет законы с номерами из отрезков [1;2] и [4;5]. Суммарная абсурдность подписанных законов составит 3 + 6 + 1 + 6 = 16.

Во втором примере дядя Вова подпишет законы с номерами из отрезков [1;2] и [3;4]. Суммарная абсурдность подписанных законов составит 1 + 1 + 1 + 1 = 4.

E. Двоичный ключ

дп жадные алгоритмы реализация *2400

Пусть p и q — строки положительной длины, называемые контейнером и ключом соответственно, причём строка q состоит лишь из символов 0 и 1. Рассмотрим несложный алгоритм, выделяющий сообщение s из заданного контейнера p:


i = 0;
j = 0;
s = <>;
пока i меньше длины строки p
{
если q[j] == 1, то приписать справа к строке s символ p[i];
увеличить переменные i, j на единицу;
если значение переменной j равно длине строки q, то j = 0;
}

В приведенном псевдокоде i, j — целочисленные переменные, s — строка, '=' — оператор присваивания, '==' — операция сравнения, '[]' — операция получения символа строки с заданным индексом, '<>' — пустая строка. Предполагается, что нумерация символов во всех строках начинается с нуля.

Понятно, что реализовать данный алгоритм довольно легко, а потому перед Вами будет стоять несколько другая задача. Необходимо построить минимальный лексикографически ключ длины k, при использовании которого приведенный выше алгоритм выделит из контейнера p сообщение s (или выяснить, что такого ключа не существует).

Входные данные

Первые две строки входных данных — непустые строки p и s (1 ≤ |p| ≤ 106, 1 ≤ |s| ≤ 200), задающие контейнер и сообщение соответственно. Строки могут содержать любые символы с ASCII-кодами от 32 до 126 включительно.

Третья строка содержит единственное целое число k (1 ≤ k ≤ 2000) — длину ключа.

Выходные данные

Выведите искомый ключ (строку длины k, состоящую только из символов 0 и 1). Если ключа не существует, выведите единственный символ 0.

Примечание

Строка x = x1x2... xp лексикографически меньше строки y = y1y2... yq, если либо p < q и x1 = y1, x2 = y2, ... , xp = yp, либо существует такое число r (0 ≤ r < min(p, q)), что x1 = y1, x2 = y2, ..., xr = yr и xr + 1 < yr + 1. Символы строк сравниваются по своим ASCII-кодам.

D. Характеристики прямоугольников

Бинарный поиск битмаски Перебор реализация сортировки *2100

Геральд обнаружил табличку, состоящую из n строк и m столбцов, в каждой клетке которой целое число. Как видный специалист по прямоугольным таблицам, он сейчас же посчитал характеристику этой таблицы, то есть, минимальное из чисел в углах этой таблицы. Однако полученная величина ему не понравилась — она показалась ему слишком уж маленькой. И чтобы сделать эту величину побольше, он решил немного обрезать таблицу: удалить несколько столбцов слева и несколько справа, а также несколько строк сверху и несколько — снизу. Найдите, какой максимальной может стать характеристика таблицы после такого обрезания. Учтите, что в таблице должно остаться хотя бы две строки и хотя бы два столбца. При этом количество обрезаемых с каждой из четырех сторон строк или столбцов может быть нулевым.

Входные данные

В первой строке даны через пробел два целых числа n и m (2 ≤ n, m ≤ 1000). В следующих n строках описана таблица. В i-той из этих строк перечислены через пробел целые числа ai, 1, ai, 2, ..., ai, m (0 ≤ ai, j ≤ 109)m чисел стоящих в i-той строке таблицы.

Выходные данные

Выведите единственное целое число — ответ на задачу.

Примечание

В первом тестовом примере Геральд ничего не может поделать со своим недовольством — в таблице всего две строки и два столбца.

Во втором тестовом примере, как бы Геральд не обрезал таблицу, все равно хотя бы в одном из углов будет 0.

A. Пакетики с конфетами

реализация *1000

У Геральда есть n младших братьев и так сложилось, что их количество четно. Однажды он купил для них n2 пакетиков конфет. Так получилось, что в одном пакетике оказалась одна конфета, в одном — две конфеты, в одном — три, и так далее. Вообще, для любого целого числа k от 1 до n2 у него оказался ровно один пакетик с k конфетами.

Помогите ему выдать каждому брату по n пакетиков конфет так, чтобы все братья получили одинаковое количество конфет.

Входные данные

В единственной строке дано единственное целое число n (n четное, 2 ≤ n ≤ 100) — количество братьев у Геральда.

Выходные данные

Пусть Геральд пронумерует своих братьев номерами от 1 до n. Вам надо вывести n строк, в i-ой строке нужно вывести n целых чисел — количество конфет в пакетиках, предназначающихся i-тому брату. Конечно, все эти числа должны быть различны и быть в пределах от 1 до n2. Числа в строках можно выводить в любом порядке.

Гарантируется, что при заданных ограничениях решение существует.

Примечание

В примере продемонстрировано, как может действовать Геральд, если у него два брата. В таком случае, в его пакетиках 1, 2, 3 и 4 конфеты. Он может отдать одному брату пакетики с 1 и с 4 конфетами, а другому — пакетики с 2 и 3 конфетами.

A. Медведь Василий и треугольник

математика реализация *1000

У медведя Василия есть любимый прямоугольник, одна вершина которого находится в точке (0, 0), а противоположная — в точке (x, y). Конечно, стороны любимого прямоугольника Василия параллельны осям координат.

Кроме прямоугольников Василий любит треугольники, у которых одна из вершин находится в точке B = (0, 0). Поэтому сегодня он просит Вас найти две точки A = (x1, y1) и C = (x2, y2), такие, что одновременно выполняются следующие условия:

  • координаты точек: x1, x2, y1, y2 — целые числа, причем выполняется неравенство: x1 < x2;
  • треугольник, образуемый точками A, B и C, — прямоугольный и равнобедренный ( — прямой);
  • все точки любимого прямоугольника содержатся внутри или на границе треугольника ABC;
  • площадь треугольника ABC как можно меньше.

Помогите медведю, найдите требуемые точки. Не сложно доказать, что искомые точки единственны.

Входные данные

В первой строке записаны два целых числа x, y ( - 109 ≤ x, y ≤ 109, x ≠ 0, y ≠ 0).

Выходные данные

Выведите в единственной строке четыре целых числа x1, y1, x2, y2 — координаты требуемых точек.

Примечание

Иллюстрация к первому примеру

C. Медведь Василий и последовательность

жадные алгоритмы Перебор реализация теория чисел *1800

У медведя Василия есть последовательность целых положительных чисел a1, a2, ..., an. Медведь Василий хочет выписать из них несколько чисел себе на листок так, чтобы красота выписанных чисел была максимальна.

Красотой выписанных чисел b1, b2, ..., bk медведь называет такое максимальное целое неотрицательное число v, что число b1 and b2 and ... and bk делится без остатка на число 2v. Если же такого числа v не существует (то есть для любого целого неотрицательного v число b1 and b2 and ... and bk делится без остатка на 2v), красота выписанных чисел равна -1.

Подскажите медведю, какие числа ему нужно выписать, чтобы красота выписанных чисел была максимальна. Если же существует несколько способов выписать числа, следует выбрать тот, при котором медведь выпишет наибольшее количество чисел.

Здесь выражение x and y означает применение к числам x и y операции побитового И. В языках программирования C++ и Java эта операция обозначается как «&», на Pascal она обозначается как «and».

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105). Во второй строке записаны n целых чисел через пробел a1, a2, ..., an (1 ≤ a1 < a2 < ... < an ≤ 109).

Выходные данные

В первой строке выведите единственное число k (k > 0) — количество чисел, которые надо выписать. Во второй строке выведите k целых чисел b1, b2, ..., bk — числа, которые нужно выписать. Числа b1, b2, ..., bk разрешается выводить в любом порядке, однако все они должны быть различными. Если существует несколько способов выписать числа, следует выбрать тот, при котором количество выписанных чисел максимально. Если все равно существует несколько способов, разрешается вывести любой.

E. Медведь Василий и покраска квадрата

битмаски дп Комбинаторика реализация *2700

У медведя Василия есть два любимых целых числа n и k, а также карандаш. Кроме того, у него есть k банок с акварельными красками различных цветов. Все банки пронумерованы некоторым образом от 1 до k включительно. В банке с номером i находится краска i-ого цвета.

Изначально на координатной плоскости медведь нарисовал карандашом четыре отрезка. Все они имеют в качестве конца точку (0, 0), а качестве начала они имеют следующие точки: (0, 2n), (0,  - 2n), (2n, 0), ( - 2n, 0). Далее для каждого i = 1, 2, ..., n медведь нарисовал два квадрата. Первый квадрат имеет следующие координаты вершин: (2i, 0), ( - 2i, 0), (0,  - 2i), (0, 2i). Второй квадрат имеет следующие координаты вершин: ( - 2i - 1,  - 2i - 1), ( - 2i - 1, 2i - 1), (2i - 1,  - 2i - 1), (2i - 1, 2i - 1). После всего этого медведь нарисовал еще один квадрат: (1, 0), ( - 1, 0), (0,  - 1), (0, 1). Все точки, упомянутые выше, образуют множество точек A.

Пример полученного рисунка при n = 0

Пример полученного рисунка при n = 2

Медведь решил покрасить полученный рисунок за k ходов, i-ый ход состоит из следующих этапов:

  1. Медведь выбирает 3 различных точки в множестве А так, чтобы между любой парой выбранных точек на рисунке существовал отрезок. Внутри области, ограниченной выбранными точками и отрезками между ними, не должно быть точек, уже покрашенных некоторой акварельной краской.
  2. Медведь закрашивает в i-ый цвет область, ограниченную выбранными точками и отрезками.

Отметим, что после k-ого хода некоторые части рисунка могут остаться непокрашенными.

Медведь попросил Вас определить количество различных способов покраски его рисунка. Способом покраски Василий называет последовательность трехэлементных множеств точек, выбранных им на каждом из ходов. Две последовательности множеств считаются различными, если существует такое число i (1 ≤ i ≤ k), что i-ые члены этих последовательностей не совпадают как множества. Так как искомое количество способов покраски может быть довольно большим, требуется найти лишь остаток от деления его на число 1000000007 (109 + 7).

Входные данные

Первая строка содержит два целых числа n и k, записанные через пробел (0 ≤ n, k ≤ 200).

Выходные данные

Выведите ровно одно число — ответ на задачу по модулю 1000000007 (109 + 7).

A. Математика спешит на помощь

жадные алгоритмы реализация сортировки Строки *800

Начинающий математик Ксения учится в третьем классе. Сейчас в школе она проходит операцию сложения.

Учитель записал на доске сумму нескольких чисел, которую требуется посчитать. Чтобы было проще считать, в сумме используются только числа 1, 2 и 3. Но и этого Ксении мало. Ксения только учится считать, и поэтому она может посчитать сумму, только если слагаемые в сумме идут в порядке неубывания. Например, сумму 1+3+2+1 она посчитать не может, а суммы 1+1+2 и 3+3 может.

Вам задана сумма, которая записана на доске. Переставьте слагаемые и выведите ее в виде, в котором Ксения сможет посчитать сумму.

Входные данные

В первой строке записана непустая строка s — сумма, которую нужно посчитать Ксении. Строка s не содержит пробелов, состоит только из цифр и знаков «+» и является корректной суммой чисел 1, 2 и 3. Длина строки s не более 100 символов.

Выходные данные

Выведите новую сумму, которую сможет посчитать Ксения.

B. Ксюша и кольцевая дорога

реализация *1000

Ксюша живет в городе, в котором на главной кольцевой дороге находятся n домов. Дома кольцевой пронумерованы от 1 до n по часовой стрелке, по счастливой случайности движение на кольцевой одностороннее и организовано также по часовой стрелке.

Недавно Ксюша переехала на кольцевую в дом с номером 1. В связи с переездом у нее появилось m дел, чтобы сделать i-ое дело, нужно находиться в доме с номером ai, а также сделать все дела с номерами меньше i. Изначально, Ксюша находится в доме с номером 1, найдите какое минимальное количество времени ей нужно потратить, чтобы выполнить все дела, если на переезд между двумя соседними домами на кольцевой требуется одна единица времени.

Входные данные

В первой строке записаны два целых числа n и m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105). В второй строке записаны m целых чисел a1, a2, ..., am (1 ≤ ai ≤ n). Обратите внимание, что Ксюша может иметь несколько дел подряд в одном и том же доме.

Выходные данные

Выведите единственное целое число — сколько времени придется потратить Ксюше, чтобы сделать все дела.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом тестовом примере последовательность передвижений Ксюши по кольцевой в оптимальном решении выглядит следующим образом: 1 → 2 → 3 → 4 → 1 → 2 → 3. Итого тратится 6 единиц времени.

A. Разведка 2

реализация *800

По кругу стоят n солдат. Для каждого солдата известен его рост ai. Разведку нужно послать таких двух соседних солдат, которые меньше всего различаются по росту, то есть для которых |ai - aj| минимально. Так каждый из них будет наименее заметен на фоне другого. Выведите любую пару солдат, которых можно послать в разведку.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 100) — количество солдат. Далее следуют описания всех солдат, в том порядке, в котором они стоят. Солдаты стоят покругу. Солдаты задаются величинами своего роста — через пробел записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1000). Солдаты (их росты) заданы по или против часовой стрелки.

Выходные данные

Выведите два целых числа — номера соседних солдат, которых нужно отправить в разведку. Если оптимальных решений несколько, выведите любое из них. Учтите, что солдаты стоят по кругу.

C. Список

Разбор выражений реализация сортировки Строки *1300

Компания «Bersoft» работает над новой версией своего самого известного текстового редактора, Bord 2010. В Bord, как и во многих других текстовых редакторах, должна быть реализована возможность печати многостраничных документов. Пользователь перечисляет через запятую (без пробелов) номера страниц документа, которые он хочет распечатать.

Вам поручено написать часть программы, выполняющую «нормализацию» списка. На вход вашей программе подается список, который ввел пользователь. Ваша программа должна вывести этот список в формате l1-r1,l2-r2,...,lk-rk, где ri + 1 < li + 1 для всех i от 1 до k - 1, и li ≤ ri. Новый список должен содержать все страницы которые ввел пользователь и ничего больше. Повторные появлений одной и той же страницы в списке пользователя следует игнорировать. В случае, если для некоторого элемента i нового списка li = ri, этот элемент необходимо выводить как li, а не «li - li».

Например, список 1,2,3,1,1,2,6,6,2 нужно вывести в виде 1-3,6.

Входные данные

В единственной строке содержится список, введенный пользователем. Всего в списке не меньше одного и не больше 100 чисел. Гарантируется, что этот список представляет собой не превосходящие 1000 натуральные числа, перечисленные через запятую, не содержит никаких других символов, кроме цифр и запятых, не может заканчиваться на запятую, и числа не содержат лидирующих нулей. К тому же строка не начинается с запятой и не содержит более одной запятой подряд.

Выходные данные

Выведите список в требуемом формате.

E. Столкновения

математика Перебор реализация *2000

На числовой прямой находятся n шариков. На момент времени 0 для каждого известна его координата xi, скорость vi (возможно, отрицательная) и масса mi. Радиусом шариков можно пренебречь.

Шарики сталкиваются абсолютно упруго. То есть если два шарика массой m1 и m2 со скоростями v1 и v2 сталкиваются, их новые скорости будут:

.

Требуется найти, где каждый шарик будет находиться через t секунд.

Входные данные

В первой строке записано два целых числа n и t (1 ≤ n ≤ 10, 0 ≤ t ≤ 100) — количество шариков и продолжительность процесса. Далее следует n строк по три целых числа в каждой: xi, vi, mi (1 ≤ |vi|, mi ≤ 100, 0 ≤ |xi| ≤ 100) — координата, скорость и масса шарика номер i в момент времени 0.

Гарантируется, что изначально никакие два шарика не находятся в одном и том же месте. Кроме того, гарантируется, что в одном столкновении не будет участвовать одновременно более двух шариков (т.е. три и более шарика никогда не окажутся в одной точке в отрезке времени [0;t]).

Выходные данные

Выведите n чисел — координаты шариков через t секунд. Выводите числа не менее чем с 4 знаками после десятичной точки.

C. Про туриста

Комбинаторика математика реализация *1600

Яхуб — ярый поклонник туристов. Он и сам хочет стать туристом и поэтому запланировал поездку. На прямой дороге расположены n пунктов назначения, Яхуб хочет посетить их все. Он начинает экскурсию с километра номер 0. Яхубу известно как расположены пункты назначения на дороге. Он знает последовательность целых чисел a1, a2, ..., an, в которой число ak обозначает, что k-тый пункт назначения находится на расстоянии ak километров от точки начала экскурсии. Известно, что никакие два пункта не расположены в одном и том же месте.

Яхуб хочет посетить каждый пункт ровно один раз. Обратите внимание, что если Яхуб пересекает какой-то пункт назначения по дороге к другому пункту, это не считается посещением. То есть, если Яхуб двигается к какому-то пункту, чтобы посетить его, и по дороге встречает непосещенный пункт, такое событие не считается посещением пункта. Также, после того как Яхуб посетит свой последний пункт назначения, он не возвращается на километр 0, то есть в последнем пункте путешествие заканчивается.

Расстояние между пунктом, находящемся на километре x, и следующим пунктом, находящемся на километре y, считается равным |x - y| километров. «Путем» называется порядок прохождения пунктов назначения. Яхуб может посещать пункты в том порядке, в каком хочет, лишь бы он посетил все n пунктов назначения и при этом не посетил никакой пункт более одного раза.

Яхуб начинает выписывать на бумаге все возможные пути. Для каждого пути он отмечает расстояние, которое надо будет пройти, если следовать этому пути. Яхуб хочет найти среднее количество километров в пути. Ему уже наскучило выписывать все пути, поэтому он просит Вас помочь ему.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 105). В следующей строке записаны n различных целых чисел a1, a2, ..., an (1 ≤ ai ≤ 107).

Выходные данные

Выведите два целых числа — числитель и знаменатель дроби, равной требуемому среднему значению. Дробь должна быть несократимая.

Примечание

Рассмотрим 6 возможных путей:

  • [2, 3, 5]: суммарное пройденное расстояние равно |2 – 0| + |3 – 2| + |5 – 3| = 5;
  • [2, 5, 3]: |2 – 0| + |5 – 2| + |3 – 5| = 7;
  • [3, 2, 5]: |3 – 0| + |2 – 3| + |5 – 2| = 7;
  • [3, 5, 2]: |3 – 0| + |5 – 3| + |2 – 5| = 8;
  • [5, 2, 3]: |5 – 0| + |2 – 5| + |3 – 2| = 9;
  • [5, 3, 2]: |5 – 0| + |3 – 5| + |2 – 3| = 8.

Таким образом средняя длина пути в километрах = = .

A. Ксюша и делители

жадные алгоритмы реализация *1200

У математика Ксюши есть последовательность, состоящая из n (n делится на 3) целых положительных чисел, каждое из которых не больше 7. Она хочет разбить эту последовательность на тройки, так, чтобы для каждой тройки a, b, c выполнялись условия:

  • a < b < c;
  • a делит b, b делит c.

Конечно, Ксюша хочет, чтобы каждый элемент последовательности принадлежал ровно одной тройке. Отсюда следует, что, если требуемое разбиение существует, то в нем троек.

Помогите Ксюше, найдите требуемое разбиение или сообщите, что такого не существует.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 99999) — количество элементов в последовательности. В следующей строке записаны n целых положительных чисел, каждое из которых не больше 7.

Гарантируется, что n делится на 3.

Выходные данные

Если требуемое разбиение существует, выведите троек. Каждую тройку выводите как значения элементов, которые в нее входят. Значения выводите в порядке возрастания. Тройки и числа в тройках разделяйте пробельными символами. Если существует несколько решений, разрешается вывести любое.

Если решения не существует, выведите -1.

B. Ксюша и шпионы

жадные алгоритмы Перебор реализация *1500

Перед грозным детективом Ксюшей выстроились в ряд n (n ≥ 2) иностранных шпионов. Будем считать, что шпионы пронумерованы от 1 до n слева направо.

У шпиона номер s хранится важная записка. Он должен передать ее шпиону номер f. Допрос шпионов проходит в несколько этапов. В течение одного этапа шпион, у которого сейчас хранится важная записка, может передать записку одному из своих соседей в ряду. Другими словами, если этот шпион имеет номер x, он может передать записку одному из шпионов x - 1 или x + 1 (если x = 1 или x = n, то у шпиона только один сосед). Также в течение этапа шпион может сохранить записку у себя и никому ее не передавать.

Но не все так просто, в течение m этапов Ксюша пристально наблюдает за некоторыми шпионами. А именно, в течение этапа номер ti (этапы нумеруются, начиная с 1) Ксюша наблюдает за шпионами с номерами li, li + 1, li + 2, ..., ri (1 ≤ li ≤ ri ≤ n). Конечно, если в течение какого-то этапа за шпионом наблюдают, он не может ни передавать записку, ни принимать ее от другого шпиона. Иначе Ксюша сразу раскроет хитрый заговор шпионов. Тем не менее, если шпион на текущем этапе сохраняет записку у себя, даже если Ксюша наблюдает за ним, она ничего не обнаружит.

Вам заданы s и f, а также в какие моменты и за кем следит Ксюша. Определите, как нужно действовать шпионам, чтобы передать записку от шпиона s до шпиона f как можно быстрее (за минимальное количество этапов).

Входные данные

В первой строке записаны четыре целых числа n, m, s и f (1 ≤ n, m ≤ 105; 1 ≤ s, f ≤ ns ≠ fn ≥ 2). В каждой из следующих m строк записаны три целых числа ti, li, ri (1 ≤ ti ≤ 109, 1 ≤ li ≤ ri ≤ n). Гарантируется, что t1 < t2 < t3 < ... < tm.

Выходные данные

Выведите k символов в одну строку: i-ый символ в строке должен обозначать действие шпионов на этапе номер i. Если на этапе номер i шпион, у которого находится записка, должен передать ее шпиону с меньшим номером, i-ый символ должен быть равен «L». Если на этапе номер i шпион, у которого находится записка, должен передать ее шпиону с большим номером, i-ый символ должен быть равен «R». Если шпион должен оставить записку у себя на i-ом этапе, i-ый символ должен быть равен «X».

В результате применения выведенной последовательности действий шпион s должен передать записку шпиону f. Количество выведенных символов k должно быть как можно меньше. Ксюша не должна обнаружить, что шпионы передают записку.

Если существует несколько оптимальных ответов, разрешается вывести любой. Гарантируется, что ответ существует.

B. Переменный ток

жадные алгоритмы реализация Структуры данных *1600

Безумный ученый Майк только что завершил сборку новой установки для поиска внеземного разума! Он так торопился запустить ее в первый раз, что подключил провода питания не глядя и принялся за опыты. Впоследствии Майк заметил, что эти провода переплелись между собой и что их теперь придется распутывать.

Установку питают два провода: «плюс» и «минус», которые идут по полу от стены (слева) до самой установки (справа). Как в стене, так и в установке на одинаковой высоте имеется по два контакта, к которым в каком-то порядке подключены провода. Провода считаются запутанными, если есть места, где один провод проходит над другим. Например, на картинке ниже таких мест четыре (вид сверху):

Майк знает, в какой последовательности провода проходят друг над другом. Он также заметил, что слева провод «плюс» всегда подключен к верхнему контакту (так, как на картинке). Майк хотел бы распутать провода, не отсоединяя их от контактов и не трогая саму установку. Определите, удастся ли ему это сделать. Считайте, что провода можно передвигать как угодно, что провода могут произвольно растягиваться, но не могут рваться.

Для лучшего понимания задачи рекомендуется прочитать пояснения ко всем тестовым примерам.

Входные данные

В единственной строке ввода дана последовательность символов «+» и «-» длиной n (1 ≤ n ≤ 100000). На i-той (1 ≤ i ≤ n) позиции последовательности находится символ «+», если на i-том шаге от стены провод «плюс» проходит над проводом «минус», и символ «-» иначе.

Выходные данные

Выведите «Yes» (без кавычек), если провода можно распутать, или же «No» (без кавычек), если провода распутать нельзя.

Примечание

Первый пример соответствует картинке, приведенной в условии. Чтобы распутать провода, можно сначала «плюс» отвести вниз, избавившись от двух пересечений в середине, а потом провести его под «минусом», убрав и пересечения по краям.

Во втором примере провод «плюс» делает один полный оборот вокруг «минуса». Следовательно, распутать провода нельзя:

В третьем примере провод «плюс» просто два раза подряд проходит сверху над «минусом». Приподняв и переместив «плюс» выше, провода можно распутать:

В четвертом примере «минус» один раз проходит над «плюсом». Не трогая саму установку, нельзя сделать так, чтобы провода не проходили один на другим:

A. Магниты

реализация *800

Безумный ученый Майк развлекается, составляя ряды домино. В качестве домино Майк использует прямоугольные магниты с полюсами «плюс» и «минус». Если друг к другу приблизить два магнита, то одноименные полюса отталкиваются, а разноименные полюса притягиваются.

Майк начинает с того, что горизонтально кладет на стол один магнит. На каждом следующем шаге Майк продолжает ряд справа, приставляя еще один магнит горизонтально. В зависимости от того, как Майк положил магнит на стол, тот либо притягивается к предыдущему (тогда образуется «островок» из нескольких магнитов вместе), либо отталкивается от предыдущего (тогда Майк кладет новый магнит на некотором расстоянии справа от предыдущего). Считается, что магнит, лежащий отдельно от других, тоже образует свой «островок».

Майк выложил в ряд несколько магнитов. Определите, сколько «островков» получилось в ряду.

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 100000) — количество магнитов. Далее следуют n строк: i-я строка (1 ≤ i ≤ n) содержит символы «01», если Майк положил i-ый по порядку магнит в положении «плюс-минус», и символы «10», если Майк положил этот магнит в положении «минус-плюс».

Выходные данные

В единственной строке выходных данных выведите количество «островков», получившихся в ряду.

Примечание

Первый тест соответствует рисунку. В этом тесте три «островка» размером три, один и два магнита.

Во втором тесте два «островка» по два магнита.

A. Вычитание в ряду

Конструктив реализация сортировки *1300

Вы хотите выстроить в ряд n целых чисел a1, a2, ..., an в некотором порядке. Назовем стоимостью расположения сумму разностей между всеми парами соседних чисел.

Более формально, обозначим некоторое расположение чисел в строке последовательностью x1, x2, ..., xn, где x — это перестановка последовательности a. Стоимость такого расположения x — это (x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn).

Найдите наибольшую возможную стоимость расположения. После этого выведите лексикографически наименьшую последовательность x, соответствующую некоторому расположению с наибольшей возможной стоимостью.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 100). Во второй строке записано n целых чисел через пробел a1, a2, ..., an (|ai| ≤ 1000).

Выходные данные

Выведите требуемую последовательность x1, x2, ..., xn. Последовательность x должна быть лексикографически наименьшей перестановкой a, соответствующей некоторому расположению с наибольшей возможной стоимостью.

Примечание

В примере стоимость выведенного расположения равна (100 - ( - 50)) + (( - 50) - 0) + (0 - 50) + (50 - ( - 100)) = 200. Не существует расположения с большей стоимостью, а среди всех расположений со стоимостью 200 выведенное является лексикографически наименьшим.

Последовательность x1, x2, ... , xp лексикографически меньше последовательности y1, y2, ... , yp, если существует такое число r (0 ≤ r < p), что x1 = y1, x2 = y2, ... , xr = yr и xr + 1 < yr + 1.

B. Неподвижные точки

математика Перебор реализация *1100

Перестановка длины n — это последовательность целых чисел такая, что каждое целое число от 0 до (n - 1) встречается в ней ровно один раз. Например, последовательность [0, 2, 1] представляет собой перестановку длины 3, а вот [0, 2, 2] и [1, 2, 3] — нет.

Неподвижная точка функции — это такая точка, которую отображение функции переводит в нее же. Перестановку можно рассматривать как взаимно-однозначную функцию. Дадим определение неподвижной точки перестановки. Целое число i называется неподвижной точкой перестановки a0, a1, ..., an - 1 тогда и только тогда, когда ai = i. Например, перестановка [0, 2, 1] имеет 1 неподвижную точку, а перестановка [0, 1, 2] имеет 3 неподвижные точки.

Дана перестановка a. Вам разрешено не более одного раза поменять местами два элемента перестановки. Какое наибольшее количество неподвижных точек можно получить в перестановке? Обратите внимание, что вам разрешено сделать не более одного обмена местами.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105). Во второй строке записано n целых чисел a0, a1, ..., an - 1 — данная перестановка.

Выходные данные

Выведите единственное целое число — максимальное количество неподвижных точек, которое можно получить в перестановке, используя не более одного обмена двух элементов местами.

A. Очередь в кино

жадные алгоритмы реализация *1100

Только-только вышел новый фильм про «Крепкого орешка», а у кассы за билетами в кино n человек уже выстроились в огромную очередь. Каждый из них имеет только одну купюру номиналом 100, 50 или 25 рублей. Билет на «Крепкого орешка» стоит 25 рублей. Сможет ли кассир, обслуживающий очередь, продать каждому билет и выдать сдачу, если изначально в кассе нет денег и кассир продает билеты строго в порядке очереди?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество людей в очереди. В следующей строке записаны n целых чисел, каждое из которых равно 25, 50 или 100 — номиналы купюр у людей. Числа заданы в порядке от начала очереди (от кассы) к концу очереди.

Выходные данные

Выведите «YES» (без кавычек) если кассир сможет продать билет каждому и выдать сдачу, или «NO» (без кавычек) иначе.

B. Раскраска забора

дп жадные алгоритмы реализация Структуры данных *1700

Игорь влюбился в Таню. Чтобы показать, насколько сильно он ее любит, Игорь хочет написать на заборе число напротив дома Тани. Игорь считает, что чем больше число он напишет, тем больше у него шансов покорить Таню.

К сожалению, Игорь смог добыть только v литров краски. Сделав расчеты, Игорь решил, что на цифру d ему понадобится ad литров краски. К тому же до Игоря дошли слухи, что Таня терпеть не может нули. Поэтому Игорь не будет их использовать в написании числа.

Помогите Игорю определить максимальное число, которое он может написать на заборе.

Входные данные

В первой строке записано целое число v (0 ≤ v ≤ 106). Во второй строке записано девять положительных целых чисел a1, a2, ..., a9 (1 ≤ ai ≤ 105).

Выходные данные

Выведите самое большое число, которое удастся написать Игорю на заборе. Если краски не хватит ни на одну цифру (Игорь не сможет ничего написать) выведите -1.

A. Кручу, верчу, запутать хочу!

реализация *1000

Сегодня у жителей города «З» соревнование по игре «Кручу, верчу». Все жители города собрались на главной площади и затаив дыхание следят за действиями ведущего. Ведущий ставит на стол 3 непрозрачных стаканчика дном вверх, располагая их в ряд. Далее он публично кладет шарик под один из стаканчиков и начинает очень быстро менять стаканчики местами, делая ровно 3 обмена. После этого зрителям дается ровно одна попытка сказать, где находится шарик, и в случае правильного ответа получить приз. А вы сможете угадать, где шарик?

Входные данные

Первая строка входных данных содержит число от одного до трех — номер стаканчика, под которым шарик лежит перед обменами. Следующие три строки описывают обмены. Описание каждого обмена содержит два различных числа от одного до трех — номера стаканчиков, которые ведущий поменял местами при этом обмене. Стаканчики нумеруются слева направо, после каждого обмена перенумеровываются опять слева направо. Иначе говоря, номер 1 всегда соответствует левому стаканчику, номер 2 — среднему и номер 3 — правому.

Выходные данные

В первой строке выведите число от одного до трех — номер стаканчика, в котором окажется шарик после всех обменов.

B. Склад

реализация *1700

В старые времена, когда мир был красивее, солнце светило ярче, трава была зеленее, а колбаса была вкуснее, самым могущественным государством была страна Арляндия. В ее столице и работал наш герой ДравДэ. Он не умел писать программы, придумывать задачи (вообще в те времена редкие люди видели компьютеры вживую), но наш герой и так неплохо жил — он работал на складе с волшебным, но безалкогольным напитком Огудар-Олок. Мы не будем вдаваться в подробности его профессии, но в данной задаче рассмотрим упрощенную модель склада.

Пусть наш склад состоит из одного стеллажа. Сам стеллаж состоит из n полок, каждая из которых разделена на m ячеек. Полки нумеруются сверху вниз начиная с 1, а ячейки в каждой полке — слева направо, также начиная с 1. В каждую ячейку помещается ровно один ящик напитка, и ДравДэ, даже при всем своем желании, не сможет положить туда еще ящик, если ячейка уже занята. В процессе своей работы ДравДэ нередко замечает, что требуется положить ящик в ячейку, когда там уже что-то лежит. В этом случае ДравДэ делает очень просто: он не трогает эту занятую ячейку, а смотрит на следующую справа от нее. Если она свободна — то место под ящик найдено, и он ставит его туда; иначе он смотрит дальше и ищет первую свободную ячейку справа. Если до конца этой полки не найдется ни одного свободного места, то он начинает рассматривать полку, которая находится под текущей, а потом следующую и т. д. При этом, каждый раз при переходе на новую полку поиск места начинается с ее начала. Если ДравДэ так и не смог найти свободного места для ящика, то он, не медля ни секунды, прямо на рабочем месте выпивает весь напиток из него, а пустую тару выкидывает, таким образом пряча все следы своего преступления.

Однажды, после бурного застолья с напитком Огудар-Олок, ДравДэ попросил вас помочь ему. В отличие от него, вы умеете писать программы, и поэтому вам не составит никакой сложности промоделировать процесс учета ящиков на складе.

Процесс учета состоит из запросов двух видов:

  • «+1 x y id» (где x, y — это целые числа, 1 ≤ x ≤ n, 1 ≤ y ≤ m, а id — строка из строчных латинских букв длиной от 1 до 10 символов). Этот запрос означает, что на склад поступил ящик с идентификатором id, который нужно положить на полку номер x в ячейку номер y. Если эта ячейка уже занята, используйте правила, описанные выше. Гарантируется, что в любой момент времени описываемого процесса идентификаторы всех ящиков, присутствующих на складе в данный момент, различны. На этот запрос не нужно отвечать.
  • «-1 id» (где id — строка из строчных латинских букв длиной от 1 до 10 символов). Этот запрос означает, что со склада нужно изъять ящик с идентификатором id. На этот запрос нужно вывести ответ (см. формат выходных данных).
Входные данные

В первой строке входного файла заданы целые числа n, m и k (1 ≤ n, m ≤ 30, 1 ≤ k ≤ 2000) — высота, ширина стеллажа и количество операций на складе, которые вам нужно обработать. Далее в k строках заданы запросы в порядке их поступления в формате, описанном выше.

Выходные данные

Для каждого запроса вида «-1 id» выведите два числа на отдельной строке — номер полки и номер ячейки, в котором лежал ящик с данным идентификатором. Если на складе в момент запроса не было ящика с таким идентификатором, то выведите «-1 -1» без кавычек.

A. TL

жадные алгоритмы Перебор реализация *1200

Валера решил подготовить раунд для Codesecrof. У него уже есть одна задача, в которой он хочет выставить ограничение по времени (TL).

Валера уже написал n верных решений. Для каждого верного решения он знает время его работы (в секундах). Также Валера написал m неправильных решений, и для каждого неправильного решения он знает время его работы (в секундах).

Предположим, Валера установит в задаче TL v секунд. Тогда будем говорить, что решение пройдет системное тестирование, если время его работы не больше v секунд. Также будем говорить, что решение пройдет системное тестирование с «запасом», если время его работы a секунд удовлетворяет неравенству 2a ≤ v.

В результате, Валера решил выставить такой TL v секунд, что выполнятся все условия:

  1. v — целое положительное число;
  2. все верные решения пройдут системное тестирование;
  3. хотя бы одно верное решение пройдет системное тестирование с «запасом»;
  4. все неверные решения не пройдут системное тестирование;
  5. значение v минимально среди всех TL, для которых верны условия 1, 2, 3, 4.

Помогите Валере, найдите наиболее подходящий TL или определите, что такого TL не существует.

Входные данные

В первой строке записаны два целых числа n, m (1 ≤ n, m ≤ 100). Во второй строке записаны n целых чисел через пробел a1, a2, ..., an (1 ≤ ai ≤ 100) — время работы каждого из n верных решений в секундах. В третьей строке записаны m целых чисел через пробел b1, b2, ..., bm (1 ≤ bi ≤ 100) — время работы каждого из m неверных решений в секундах.

Выходные данные

Если подходящее значение TL существует, выведите его. Иначе, выведите -1.

C. Бомбы

жадные алгоритмы реализация сортировки *1600

У Вас есть робот, задачей которого является уничтожение бомб, расположенных на координатной плоскости. А именно, на координатной плоскости расположены n бомб, причем i-ая бомба расположена в точке с координатами (xi, yi). Известно, что никакие две бомбы не расположены в одной точке и что никакая бомба не расположена в точке с координатами (0, 0).

Изначально робот расположен в точке с координатами (0, 0). Для удобства будем обозначать парой (x, y) — текущее положение робота. Для того, чтобы уничтожить все бомбы, робот должен выполнить несколько операций, каждая операция одного из следующих трех типов:

  1. Формат операции — «1 k dir». Во время выполнения операции робот k (k ≥ 1) раз перемещается в направлении dir. Всего робот может двигаться только в 4 направления: «R», «L», «U», «D». За одно перемещение в зависимости от направления dir робот переходит в одну из следующих точек: (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1) (точки заданы соответственно направлениям). Запрещено выполнять перемещение из точки (x, y), если хотя бы одна из точек пути (кроме точки, в которую мы в конечном итоге придем k-ым перемещением) содержит бомбу.
  2. Формат операции — «2». Во время выполнения операции робот поднимает бомбу в точке (x, y) и кладет ее в специальный контейнер, расположенный в роботе. Таким образом робот может переносить бомбу из любой точки в любую другую точку. Операцию запрещено выполнять, если в точке (x, y) нет бомбы. Запрещено поднимать бомбу, если в контейнере у робота уже есть бомба.
  3. Формат операции — «3». Во время выполнения операции робот достает бомбу из контейнера и уничтожает ее. Разрешается выполнять эту операцию, только если робот находится в точке (0, 0). Запрещено выполнять операцию, если в контейнере нет бомбы.

Помогите роботу, найдите последовательность операций минимальной длины, с помощью которой робот уничтожит все бомбы на координатной плоскости.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105) — количество бомб на координатной плоскости. В следующих n строках содержится по два целых числа. В i-ой строке содержатся числа xi, yi ( - 109 ≤ xi, yi ≤ 109) — координаты i-ой бомбы. Гарантируется, что никакие две бомбы не содержатся в одной точке и что никакая бомба не расположена в точке (0, 0).

Выходные данные

В первой строке выведите единственное число k — минимальное количество операций, необходимых для уничтожения всех бомб. В следующих строках выведите описания этих k операций в формате, указанном в условии. Если существует несколько последовательностей, разрешается вывести любую. Гарантируется, что существует решение, где k ≤ 106.

A. Джефф и округления

дп жадные алгоритмы математика реализация *1800

Джефф получил в подарок 2n действительных чисел a1, a2, ..., a2n. Мальчик ненавидит нецелые числа, поэтому он решил слегка изменить подаренные числа. А именно, Джефф последовательно выполняет n операций, каждая из которых:

  • выбрать два не выбиравшихся ранее индекса i и j (i ≠ j);
  • округлить элемент ai к ближайшему целому числу, которое не больше ai (ai присвоить ai ⌋);
  • округлить элемент aj к ближайшему целому числу, которое не меньше aj (aj присвоить aj ⌉).

Тем не менее Джефф не хочет обижать человека, который подарил ему последовательность. Поэтому мальчик хочет выполнить операции так, чтобы значение модуля разницы между суммой элементов перед выполнением операций и суммой элементов после выполнения всех операций было как можно меньше. Помогите Джеффу найти минимальное значение модуля разницы.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 2000). Следующая строка содержит 2n действительных чисел a1, a2, ..., a2n (0 ≤ ai ≤ 10000), заданных с ровно тремя знаками после точки. Числа разделены пробелами.

Выходные данные

В единственную строку выведите вещественное число — искомую разницу с ровно тремя знаками после точки.

Примечание

В первом тесте нужно выполнить операции следующим образом: (i = 1, j = 4), (i = 2, j = 3), (i = 5, j = 6). В таком случае разница будет равна |(0 + 0.5 + 0.75 + 1 + 2 + 3) - (0 + 0 + 1 + 1 + 2 + 3)| = 0.25.

A. Джефф и цифры

математика Перебор реализация *1000

У Джеффа есть n карточек, на каждой карточке нарисована либо цифра 0, либо цифра 5. Джефф может выбрать некоторые карточки и выложить их в ряд — получится некоторое число. Какое максимальное число, делящееся на 90, Джефф может выложить из имеющихся у него карточек?

Выложенное число не должно содержать лидирующих нулей, при этом считается, что число 0 не содержит лидирующих нулей. Джеффу не обязательно использовать все карточки.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 103). В следующей строке записано n целых чисел a1, a2, ..., an (ai = 0 или ai = 5). Число ai обозначает цифру, которая записана на i-ой карточке.

Выходные данные

В единственную строку выведите ответ на задачу — максимальное число, которое делится на 90. Если из карточек нельзя составить ни одно число, которое делится на 90, выведите -1.

Примечание

В первом тесте единственное число кратное 90, которое можно сложить — это 0.

Во втором тесте можно сложить число 5555555550, оно кратно 90.

B. Джефф и периоды

реализация сортировки *1300

Как-то раз Джефф раздобыл последовательность целых чисел a1, a2, ..., an длиной n. Мальчик сразу же решил проанализировать последовательность. Для этого ему нужно найти все значения x, для которых выполняются условия:

  • x встречается в последовательности a.
  • Рассмотрим все номера элементов последовательности a, которые совпадают с x (такие i, что ai = x). Эти номера, отсортированные по возрастанию, должны образовывать арифметическую прогрессию.

Помогите Джеффу, найдите все x, которые удовлетворяют условиям.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 105). Следующая строка содержит целые числа a1, a2, ..., an (1 ≤ ai ≤ 105). Числа разделены пробелами.

Выходные данные

В первую строку выведите число t — количество подходящих x. В каждой из следующих t строк выведите два целых числа x и px, где x — очередное подходящее значение, px — разность прогрессии номеров (если x встречается в последовательности ровно один раз, px должно быть равно 0). Пары выводите в порядке возрастания x.

Примечание

В первом тесте элемент 2 встречается в последовательности ровно один раз, следовательно p2 = 0.

A. Домино

математика реализация *1200

У Валеры имеется n костей домино, выложенных в ряд. Каждая кость состоит из двух половинок — верхней и нижней. На каждой из половинок записано число от 1 до 6. Валера очень любит четные числа, поэтому он хочет, чтобы сумма чисел, записанных на верхних половинках, и сумма чисел, записанных на нижних половинках, были четными.

Для того, чтобы это произошло, Валера может поворачивать кости на 180 градусов. После поворота верхняя и нижняя половинки кости меняются местами. Данное действие занимает у Валеры одну секунду. Помогите Валере узнать, какое минимальное количество времени он должен потратить на повороты домино, чтобы его желание исполнилось.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 100), обозначающее количество костей, имеющихся у Валеры. В следующих n строках через пробел заданы два целых числа xi, yi (1 ≤ xi, yi ≤ 6). Первоначально число xi записано на верхней половинке i-ой кости, yi — на нижней.

Выходные данные

Выведите единственное целое число — минимальное требуемое количество времени. Если Валере ни за какое время не удастся исполнить задуманное, выведите  - 1.

Примечание

В первом тестовом примере сумма чисел на верхних половинках костей равна 10, а сумма на нижних равна 6. Оба числа четные, поэтому Валере не требуется совершать никаких действий.

Во втором примере у Валеры имеется всего одна кость. На одной из ее половинок записано число 3, поэтому как бы Валера не повернул эту кость, одна из сумм всегда будет нечетной.

В третьем примере Валере достаточно повернуть первую кость, и тогда сумма на верхних половинках будет равна 10, а сумма на нижних половинках — 8.

B. Две кучки

жадные алгоритмы Комбинаторика Конструктив математика реализация сортировки *1900

У Валеры имеется n кубиков, на каждом из которых записано целое число от 10 до 99. Он произвольным образом выбирает n кубиков и откладывает в первую кучку. Оставшиеся кубики образуют вторую кучку.

Валера решил поиграть с кубиками. Для этого он достает кубик из первой кучки и записывает число, изображенное на нем. Затем он достает кубик из второй кучки и дописывает к имеющимся двум цифрам справа двузначное число, изображенное на этом кубике. В итоге у Валеры получается четырехзначное число, первые две цифры которого записаны на кубике из первой кучки, а вторые две — на кубике из второй кучки.

Валера увлекается арифметикой, поэтому он с легкостью посчитал количество различных четырехзначных чисел, которые можно получить в его забавной игре. Другой вопрос, а как разделить кубики на кучки так, чтобы можно было получить как можно больше различных четырехзначных чисел. Этого Валера не знает, поэтому хочет спросить у вас.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 100). Во второй строке через пробел заданы n целых чисел ai (10 ≤ ai ≤ 99), обозначающих числа, изображенные на кубиках.

Выходные данные

В первой строке выведите целое число — максимально возможное количество различных четырехзначных чисел, которое может получить Валера. Во второй строке выведите n целых чисел bi (1 ≤ bi ≤ 2), число bi обозначает номер кучки в которую Валера должен отнести i-ый кубик.

Если существует несколько вариантов разбиения кубиков на кучки, дающих максимально возможное количество различных четырехзначных чисел, которое может получить Валера, выведите любой из них.

Примечание

В первом примере Валера может отложить первый кубик в первую кучку, а второй — во вторую. В этом случае он сможет получить число 1099. Если же он поместит в первую кучку второй кубик, а во вторую — первый, то он сможет получить число 9910. В обоих случаях максимальное количество различных чисел равно единице.

Во втором тестовом примере Валера сможет получить числа 1313, 1345, 2413, 2445. Обратите внимание, что если бы Валера отложил в первую кучку первый и третий кубики, то он смог бы получить лишь два числа 1324 и 1345.

C. Найдите максимум

математика реализация теория чисел *1600

У Валеры имеется массив a, состоящий из n целых чисел a0, a1, ..., an - 1, и функция f(x) принимающая в качестве своего единственного аргумента целое число от 0 до 2n - 1. Значение f(x) считается по формуле , где значение bit(i) равно единице, если в двоичном представлении числа x в i-ой позиции стоит 1, или нулю в противном случае.

Например, если n = 4, а x = 11 (11 = 20 + 21 + 23), тогда f(x) = a0 + a1 + a3.

Помогите Валере найти максимум функции f(x) среди всех x, для которых выполняется неравенство: 0 ≤ x ≤ m.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество элементов массива. В следующей строке через пробел записаны n целых чисел a0, a1, ..., an - 1 (0 ≤ ai ≤ 104) — элементы массива a.

В третьей строке записана последовательность нулей и единиц без пробелов s0s1... sn - 1 — двоичное представление числа m. Число m равно .

Выходные данные

Выведите единственное целое число — максимальное значение функции f(x) среди всех .

Примечание

В первом тестовом примере m = 20 = 1, f(0) = 0, f(1) = a0 = 3.

Во втором примере m = 20 + 21 + 23 = 11, а максимальное значение функции равно f(5) = a0 + a2 = 17 + 10 = 27.

A. Вася и цифровой корень

Конструктив реализация *1100

Недавно Вася узнал, что такое цифровой корень числа и решил поделиться этим знанием с вами.

Пусть S(n) — сумма цифр числа n, к примеру, S(4098) = 4 + 0 + 9 + 8 = 21. Тогда цифровой корень числа n равен:

  1. dr(n) = S(n), если S(n) < 10;
  2. dr(n) = dr( S(n) ), если S(n) ≥ 10.

К примеру, dr(4098)  =  dr(21)  =  3.

Вася боится больших чисел, поэтому он работает только с числами до 101000. Для всех таких чисел он доказал, что dr(n)  =  S( S( S( S(n) ) ) ) (n ≤ 101000).

Теперь Вася хочет быстро находить числа с заданным цифровым корнем, но пока не научился этого делать и обратился за помощью к вам. Ваша задача — по заданным числам k и d найти число, состоящее из ровно k цифр (лидирующие нули не допускаются), цифровой корень которого равен d, или определить, что такого числа не существует.

Входные данные

В первой строке задано два целых числа k и d (1 ≤ k ≤ 1000; 0 ≤ d ≤ 9).

Выходные данные

В единственной строке выведите любое подходящее число без лидирующих нулей или «No solution» (без кавычек), если не существует подходящего числа.

Выведенное число должно состоять из ровно k цифр. Считается, что число 0 не содержит лидирующих нулей.

Примечание

Для первого тестового примера dr(5881)  =  dr(22)  =  4.

Для второго тестового примера dr(36172)  =  dr(19)  =  dr(10)  =  1.

B. Вася и общественный транспорт

жадные алгоритмы реализация *1100

Вася часто пользуется общественным транспортом. В городе он делится на два типа: троллейбусы и автобусы. В городе есть n автобусов и m троллейбусов, автобусы пронумерованы числами от 1 до n, троллейбусы — числами от 1 до m.

Общественный транспорт не является бесплатным. Есть 4 типа билетов:

  1. Билет на один проезд на некотором автобусе или троллейбусе. Стоит c1 бурлей;
  2. Билет на неограниченное количество проездов на некотором автобусе или троллейбусе. Стоит c2 бурлей;
  3. Билет на неограниченное количество проездов на всех автобусах или на всех троллейбусах. Стоит c3 бурлей;
  4. Билет на неограниченное количество проездов на всех автобусах и троллейбусах. Стоит c4 бурлей.

Вася точно знает, сколько раз он будет пользоваться каждым автобусом и троллейбусом. Он обратился к Вам за помощью, чтобы найти минимальную сумму бурлей, которую ему придется потратить на билеты.

Входные данные

В первой строке содержится четыре целых числа c1, c2, c3, c4 (1 ≤ c1, c2, c3, c4 ≤ 1000) — цены билетов.

Во второй строке содержится два целых числа n и m (1 ≤ n, m ≤ 1000) — количество автобусов и троллейбусов, которые использует Вася.

Третья строка содержит n целых чисел ai (0 ≤ ai ≤ 1000)ai обозначает, сколько раз Вася использует автобус номер i.

Четвертая строка содержит m целых чисел bi (0 ≤ bi ≤ 1000)bi обозначает, сколько раз Вася использует троллейбус номер i.

Выходные данные

Выведите единственное целое число — минимальную сумму бурлей, которую Васе придется потратить на билеты.

Примечание

В первом примере выгодно купить два билета первого типа (на первый автобус), один билет второго типа (на второй автобус) и один билет третьего типа (на все троллейбусы). В сумме — (2·1) + 3 + 7 = 12 бурлей.

Во втором примере выгодно купить один билет четвертого типа.

В третьем примере выгодно купить два билета третьего типа: на все автобусы и на все троллейбусы.

B. Ксюша и Хемминг

математика реализация *1900

Ксюша — начинающий программист. Сегодня на паре по программированию она изучила, что такое расстояние Хемминга.

Расстоянием Хемминга между двумя строками s = s1s2... sn и t = t1t2... tn равной длины n называется величина . Запись [si ≠ ti] является нотацией Айверсона и обозначает: если si ≠ ti — единицу, иначе — ноль.

Теперь Ксюша хочет посчитать расстояние Хемминга между двумя длинными строками a и b. Первая строка a — это конкатенация n копий строки x, то есть . Вторая строка b — это конкатенация m копий строки y.

Помогите Ксюше, вычислите требуемое расстояние Хемминга по заданным n, x, m, y.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 1012). Во второй строке записана непустая строка x. В третьей строке записана непустая строка y. Обе строки состоят из не более чем 106 строчных букв латинского алфавита.

Гарантируется, что строки a и b, полученные по входным данным, имеют одинаковую длину.

Выходные данные

Выведите единственное целое число — искомое расстояние Хемминга.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом тестовом примере строка a равна строке b и равна 100 буквам a. Так как строки равны, расстояние Хемминга между ними равно нулю.

Во втором тестовом примере у строк a и b различаются 3-ый, 5-ый, 6-ой, и 7-ой символы. Таким образом расстояние Хемминга равно 4.

В третьем тестовом примере строка a равна rzrrzr, а строка bazazaz. Строки отличаются во всех символах кроме 2-го, расстояние Хемминга между ними равно 5.

C. Купе

жадные алгоритмы Комбинаторика Конструктив реализация *2100

Команда школьников из города S направляется на Всеберляндскую олимпиаду по информатике. Традиционно, ребята едут на поезде. Всем школьникам купили билеты в один вагон, состоящий из n купе (в каждом купе едут ровно четыре человека). Известно, что если в купе едут один или два школьника-олимпиадника, то им становится скучно, а если едут три или четыре школьника-олимпиадника, то в этом купе весело на протяжении всей поездки.

Школьники хотят поменяться с другими людьми так, чтобы ни в каком купе, где едут школьники, им не было скучно. Чтобы поменяться с другим человеком местами, нужно убедить его, что это действительно необходимо. Школьники не могут самостоятельно найти нужные аргументы, поэтому они обратились за помощью к сочувствующей им проводнице. Проводница, пользуясь своим жизненным опытом, может уговорить любого пассажира поменяться местами с кем-то из школьников.

Однако, проводница не хочет терять время на уговоры зря, поэтому хочет узнать, какое минимальное количество людей ей надо уговорить поменяться местами со школьниками. Ваша задача — найти это количество.

После всех обменов в каждом купе должно остаться либо ни одного школьника, либо три или четыре школьника.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 106) — количество купе в вагоне. Во второй строке записано n целых чисел a1, a2, ..., an — количества школьников, едущих в каждом из купе (0 ≤ ai ≤ 4). Гарантируется, что в поезде едет хотя бы один школьник.

Выходные данные

В случае, если никакая последовательность обменов местами остальных людей со школьниками не приведет к желаемому результату, выведите число «-1» (без кавычек). В противном случае, выведите наименьшее количество людей, которых нужно уговорить поменяться местами.

E. Ксюша и строковая задача

дп реализация Строки строковые суфф. структуры хэши *3000

На олимпиаде по информатике программисту Ксюше попалась задача на строки. К сожалению, Ксюша не сильна в строковых алгоритмах. Помогите ей решить задачу.

Строкой s назовем последовательность символов s1s2... s|s|, где записью |s| будем обозначать длину строки.

Подстрокой s[i... j] строки s будем называть строку sisi + 1... sj.

Строка s является строкой Грея, если она удовлетворяет условиям:

  • длина строки |s| нечетная;
  • символ встречается в строке ровно один раз;
  • либо |s| = 1, либо подстроки и равны между собой и являются строками Грея.

Например, строки «abacaba», «xzx», «g» являются строками Грея, а строки «aaa», «xz», «abaxcbc» — нет.

Красотой строки p называется сумма квадратов длин всех подстрок строки p, которые являются строками Грея. Другими словами, рассмотрим все пары значений i, j (1 ≤ i ≤ j ≤ |p|). Если подстрока p[i... j] является строкой Грея, к красоте нужно прибавить (j - i + 1)2.

В задаче Ксюше задана строка t, состоящая из символов латинского алфавита. Ей разрешается изменить не более одного символа этой строки на любой другой символ латинского алфавита. Задача состоит в том, чтобы получить строку как можно большей красоты.

Входные данные

В первой строке записана непустая строка t (1 ≤ |t| ≤ 105). Строка t состоит только из строчных латинских букв.

Выходные данные

Выведите искомое максимальное значение красоты, которое удастся получить Ксюше.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Примечание

В первом тестовом примере из заданной строки можно получить строку p = «zbz». В такой строке строками Грея являются подстроки p[1... 1], p[2... 2], p[3... 3] и p[1... 3]. Итого, красота строки p получается равна 12 + 12 + 12 + 32 = 12. Более красивую строку получить нельзя.

Во втором тестовом примере можно не применять никаких операций. Изначальная строка имеет наибольшую возможную красоту.

A. Кружок школьников

жадные алгоритмы Перебор реализация *1000

В начале учебного года в Берляндском государственном университете начинает работать городской кружок школьников по программированию. Кружок будет проходить в двух группах: начальной и продвинутой. Для того, чтобы распределить школьников на группы, было проведено тестирование. По его результатам каждый школьник получил оценку от 1 до m баллов. Известно, что c1 школьников получили 1 балл, c2 школьников получили 2 балла, ..., cm школьников получили максимальные m баллов. Теперь нужно объявить проходной балл k (целое число от 1 до m): все школьники, набравшие строго меньше k баллов, попадут в начальную группу, а те, кто набрал хотя бы k баллов, в продвинутую. Известно, что если размер группы школьников больше чем y, то в университете не найдется аудитории, чтобы их вместить. Также известно, что если в группе меньше x школьников, то она слишком маленькая и с ней нецелесообразно вести занятия. Таким образом, всех школьников нужно разбить на две группы так, чтобы размер каждой был от x до y включительно. Помогите подобрать проходной балл таким образом, чтобы эти ограничения выполнялись.

Входные данные

В первой строке записано целое число m (2 ≤ m ≤ 100). Во второй строке записаны m целых чисел c1, c2, ..., cm, разделенные одиночными пробелами (0 ≤ ci ≤ 100). В третьей строке записаны через пробел два целых числа x и y (1 ≤ x ≤ y ≤ 10000). Хотя бы одно ci отлично от 0.

Выходные данные

Если невозможно выбрать проходной балл таким образом, чтобы размер каждой из получившихся групп был не меньше чем x, и не больше чем y, выведите 0. Иначе выведите целое число от 1 до m — предлагаемый вами проходной балл. Если возможных ответов несколько, выведите любой из них.

Примечание

В первом примере в начальную группу попадают 7 школьников, в продвинутую — 6.

Во втором примере также правильным является ответ 3.

B. День Флага

Конструктив реализация *1400

В Берляндии приближается государственный праздник — День Флага. В честь этого события Президент страны решил устроить большой танцевальный вечер, организацию которого он поручил вашему агентству. При этом он поставил несколько условий:

  • всего должны быть исполнены m танцев;
  • в каждом танце должны участвовать ровно три человека;
  • в каждом танце должен участвовать один танцор в белой форме, один танцор в красной форме и один танцор в синей форме (это цвета государственного флага Берляндии).

В распоряжении агенства есть n танцоров, причем, их число может быть меньше, чем 3m. То есть, какие-то танцоры, возможно, будут участвовать более чем в одном танце, но при этом они все должны быть задействованы. Однако, если в каком-то танце участвуют два или более танцоров, которые уже танцевали ранее, то этот танец перестает быть зрелищным. Ваше агентство не может этого допустить, поэтому в каждом танце участвует максимум один танцор, который танцевал ранее.

На основании всех этих критериев был составлен план из m танцев: на каждый танец было определено по три танцора, которые будут в нем участвовать. Вам же было поручено определить для каждого из n танцоров цвет формы так, чтобы выполнялось третье условие Президента: в каждом танце должен быть танцор в белой форме, танцор в красной форме и танцор в синей форме. При этом танцоры не могут менять свою форму между танцами.

Входные данные

В первой строке через пробел заданы два целых числа n (3 ≤ n ≤ 105) и m (1 ≤ m ≤ 105) — количество танцоров и количество танцев соответственно. Далее идёт m строк, описывающих танцы в порядке их исполнения. В i-ой строке находятся три различных целых числа — номера танцоров, участвующих в i-ом танце. Танцоры пронумерованы от 1 до n. Каждый танцор принимает участие хотя бы в одном танце.

Выходные данные

Выведите через пробел n чисел: i-ое из этих чисел должно обозначать цвет формы i-го танцора (1 — белый, 2 — красный, 3 — синий). Если подходящих решений несколько, выведите любое из них. Гарантируется, что хотя бы одно решение существует.

A. Дима и непрерывная линия

Перебор реализация *1400

Дима и Сережа живут в обыкновенной общажной двушке. Однажды у Димы было свидание с его девушкой, и он попросил Сережу покинуть комнату. В качестве компенсации Сережа свалил на Диму свое домашнее задание.

Учитель дал Сереже координаты n различных точек на оси абсцисс и попросил последовательно соединить их полуокружностями в определенном порядке: сначала соединить первую со второй, потом вторую с третьей, потом третью с четвертой и так далее до n-ой точки. Две точки с координатами (x1, 0) и (x2, 0) соединяются полуокружностью, проходящей над осью абсцисс, с диаметром, совпадающим с отрезком между точками. Сереже нужно узнать, будет ли линия на рисунке иметь самопересечения. Для уточнения, посмотрите на рисунок, который Сережа показал Диме (на левом рисунке линия имеет самопересечения, на правом — не имеет).

Сережа — мальчик не маленький, поэтому координаты точек могут быть достаточно большими. Помогите Диме справится с этой задачей.

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 103). Вторая строка содержит n различных целых чисел x1, x2, ..., xn ( - 106 ≤ xi ≤ 106)i-ая точка имеет координаты (xi, 0). Точки не обязательно отсортированы по x координате.

Выходные данные

В единственной строке выведите «yes» (без кавычек), если линия имеет самопересечения. В противном случае выведите «no» (без кавычек).

Примечание

Первый тест из условия изображен на рисунке слева, второй — на рисунке справа.

C. Дима и контейнеры

жадные алгоритмы Конструктив реализация *2000

Скоро у Димы день рождения! Большой праздник! Сережа подарит Диме свое отсутствие в комнате и не будет мешать Диме и Инне праздновать день рождения. Инна подарит Диме стек, очередь и дек.

Своим подарком Инна хочет проверить, насколько Дима хороший программист. Для этого она будет поочередно давать Диме команды. Команды бывают двух типов:

  1. Добавить заданное число в один из контейнеров. Причем в очередь и стек можно добавлять элементы только в конец, в дек можно добавлять элементы как в начало, так и в конец.
  2. Извлечь из не более чем трех различных контейнеров по числу. Все извлеченные числа сказать Инне, после чего опустошить все контейнеры. Причем в контейнере очередь можно извлекать числа только из начала, в стеке — только из конца, в деке — из начала и из конца. Нельзя извлекать числа из пустых контейнеров.

Каждый раз, когда Дима выполняет команду второго типа, Инна целует Диму некоторое число (возможно, ноль) раз. Дима знает Инну как облупленную, он уверен, что это число равно сумме извлеченных из контейнеров чисел на данной операции.

Как уже было сказано, Дима знает Инну как облупленную, ему известно, какие команды Инна будет давать Диме и в каком порядке. Помогите Диме найти стратегию, используя которую, он получит как можно больше поцелуев на свой день рождения!

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 105) — количество команд Инны. Далее следует n строк, описывающих команды Инны. Каждая строка содержит целое число:

  1. Целое число a (1 ≤ a ≤ 105) означает, что Инна дает Диме команду добавить число a в один из контейнеров.
  2. Целое число 0 означает, что Инна просит Диму сделать не более трех операций извлечения из различных контейнеров.
Выходные данные

Каждой команде из входных данных должна соответствовать одна строка выходных данных — действие Димы.

Для команды первого типа (добавление) выведите одну из строк в соответствии с выбором Димы:

  • pushStack — добавить в конец стека;
  • pushQueue — добавить в конец очереди;
  • pushFront — добавить в начало дека;
  • pushBack — добавить в конец дека.

Для команды второго типа выведите сначала целое число k (0 ≤ k ≤ 3), обозначающее количество операций извлечения, затем выведите k слов разделенных пробелом. Слова могут быть:

  • popStack — извлечь из конца стека;
  • popQueue — извлечь из начала очереди;
  • popFront — извлечь из начала дека;
  • popBack — извлечь из конца дека.

Выведенные операции не должны извлекать чисел из пустых контейнеров. А также должны извлекать числа из разных контейнеров.

Выведенная последовательность действий должна приводить к максимальному количеству поцелуев. Если существует несколько последовательностей действий, приводящих к максимальному количеству поцелуев, разрешается вывести любую из них.

E. Дима и пинки

графы Перебор реализация снм *2300

Дима хороший. Очень. Но всему хорошему приходит конец...

Сережа собирается надавать Диме пинков. Для этого Сережа разделил комнату на единичные квадраты. Теперь комната представляет собой прямоугольник, состоящий из единичных квадратов, размера n × m.

Первоначально Сережа поставил Диму в центр некоторого единичного квадрата. Затем он начал давать Диме пинков (известно, что он дал Диме как минимум один пинок). Каждый раз, когда Дима получает пинок, он подлетает и перемешается в одном из четырех направлений (вверх, вниз, влево, вправо) на k (k > 1) единиц длины. Сережа очень добрый, поэтому он пинает Диму так, что тот никогда не ударяется о стены (то есть не вылетает за пределы прямоугольной комнаты). Еще Сережа очень оригинальный, поэтому он пинает Диму так, что тот никогда не пролетает над одним и тем же отрезком, который соединяет центры двух соседних по стороне квадратов, дважды.

Сережа долго пинал Диму. Но Дима не злопамятный — Дима записывает. Поэтому Дима пометил все квадраты, в которых он находился и над центрами которых он пролетал. Дима совершенно не помнит, с какой силой его пинал Сережа. Он хочет восстановить по своим записям все возможные варианты. Помогите ему, найдите все такие значения k, что Сережа мог пинать Диму так, что тот перемещался по комнате на k единиц от одного пинка.

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 103) — размеры комнаты.

Далее следует n строк, содержащих по m чисел aij — записи Димы: aij = 1, если Дима стоял в клеточке (i, j) или пролетал над ней. В противном случае aij = 0.

Известно, что как минимум одно значение aij равно 1.

Выходные данные

В единственной строке выведите в возрастающем порядке все k (k > 1), при которых могли получиться такие записи Димы. Если таких k не существует и Дима выдумал всю эту историю с пинками, выведите -1.

A. Таблица

жадные алгоритмы Конструктив реализация *1000

У Семена есть прямоугольная таблица, состоящая из n строк и m столбцов. Семен пронумеровал строки таблицы, начиная от единицы, сверху вниз, а столбцы — начиная от единицы, слева направо. Ячейку, расположенную на пересечении x-ой строки и y-ого столбца, будем обозначать парой чисел (x, y). Углами таблицы будем называть ячейки: (1, 1), (n, 1), (1, m), (n, m).

Семен считает, что в этой таблице некоторые ячейки являются хорошими. Причем известно, что ни одна хорошая ячейка не является углом таблицы.

Изначально все ячейки таблицы бесцветны. Семен хочет покрасить все ячейки своей таблицы. За один ход он может выбрать любую хорошую ячейку таблицы (x1, y1), произвольный угол таблицы (x2, y2) и закрасить все ячейки таблицы (p, q), для которых выполняются оба неравенства: min(x1, x2) ≤ p ≤ max(x1, x2), min(y1, y2) ≤ q ≤ max(y1, y2).

Помогите Семену! Определите минимальное количество операций, необходимых ему для покраски всех ячеек таблицы. Обратите внимание, что одну ячейку разрешается покрасить несколько раз.

Входные данные

В первой строке заданы ровно два целых числа n, m (3 ≤ n, m ≤ 50).

Далее в n строках задано описание ячеек таблицы. А именно, в i-ой строке задано m целых чисел через пробел ai1, ai2, ..., aim. Если aij равно нулю, то ячейка (i, j) не является хорошей, иначе — aij равно единице. Гарантируется, что хотя бы одна ячейка является хорошей. Гарантируется, что ни одна хорошая ячейка не является углом.

Выходные данные

Выведите единственное число — минимальное количество операций, необходимых Семену для осуществления его затей.

Примечание

В первом примере последовательность операций может быть такой:

  • В первый раз нужно выбрать ячейку (2, 2) и угол (1, 1).
  • Во второй раз нужно выбрать ячейку (2, 2) и угол (3, 3).
  • В третий раз нужно выбрать ячейку (2, 2) и угол (3, 1).
  • В четвертый раз нужно выбрать ячейку (2, 2) и угол (1, 3).

В втором примере последовательность операций может быть такой:

  • В первый раз нужно выбрать ячейку (3, 1) и угол (4, 3).
  • Во второй раз нужно выбрать ячейку (2, 3) и угол (1, 1).

A. Внеземной разум

реализация *1300

Недавно Вася заинтересовался поиском внеземного разума. Он собрал простейший приемник внеземных сигналов и n дней подряд снимал с него показания. В каждый из n дней Вася записывал в блокнот 1, если он получил внеземной сигнал, и 0, если не получил. Вася считает, что он нашел внеземной разум, если все полученные внеземные сигналы приходили с некоторой периодичностью, т. е. все интервалы между последовательными полученными сигналами равны между собой. Иначе Вася считает, что все сигналы посылали никому не интересные неразумные инопланетяне. Помогите Вася по данным с приемника определить, нашел ли он внеземной разум.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — количество дней наблюдения за приемником. Во второй строке записано n символов 1 или 0 — показания приемника в каждый из n дней. Гарантируется, что в заданной последовательности показаний не менее трех единиц.

Выходные данные

Если Вася обнаружил внеземной разум, выведите YES, иначе выведите NO.

B. Фрактал

реализация *1600

С тех пор, как знаменитый берляндский абстракционист Калевич узнал о фракталах, они превратились в основную тему его творчества. Каждое утро художник берет лист клетчатой бумаги и первым делом создает шаблон для будущей картины. Он выделяет квадрат размером n × n клеток и закрашивает некоторые из них в черный цвет. Затем он берет чистый квадратный лист и рисует фрактал по следующему алгоритму:

Шаг 1. Лист делится на n2 одинаковых квадратов и часть из них закрашивается в черный цвет в соответствии с заготовленным шаблоном.

Шаг 2. Каждый из квадратов, оставшихся белыми, разбивается на n2 меньших квадратов, некоторые из них закрашиваются в соответствии с шаблоном.

На каждом из последующих шагов повторяются действия шага 2.

К сожалению, эта рутинная работа отнимает у гениального художника много времени. Калевич давно мечтает об автоматизации описанного процесса, чтобы самому перейти к созданию трехмерных (и даже четырехмерных!) фракталов.

Входные данные

В первой строке заданы целые числа n и k (2 ≤ n ≤ 3, 1 ≤ k ≤ 5), где k — количество шагов алгоритма. В следующих n строках записано по n символов, задающих шаблон. Символ «.» обозначает белую клетку, символ «*» — черную. Гарантируется, что шаблон содержит хотя бы одну белую клетку.

Выходные данные

В выходной файл выведите матрицу размера nk × nk, представляющую собой картину после применения k шагов алгоритма.

C. Тарелки

геометрия реализация *2200

Однажды у Пети было такое хорошее настроение, что он решил помочь маме вымыть посуду. В раковине скопилось n грязных тарелок. Геометрически каждая тарелка представляет собой усеченный конус. Толщиной стенок и дна тарелки можно пренебречь. Вымытые тарелки Петя складывает одну на другую естественным образом, то есть так, что их вертикальные оси совпадают (см. рисунок). Вам будет задан порядок, в котором Петя моет тарелки. Определите высоту полученной конструкции, т.е. расстояние от дна самой нижней тарелки в стопке до верха самой верхней тарелки.

Входные данные

В первой строке входного файла задано целое число n (1 ≤ n ≤ 3000). Каждая из последующих n строк содержит по 3 целых числа h, r и R (1 ≤ h ≤ 10000, 1 ≤ r < R ≤ 10000), обозначающих высоту тарелки, радиус ее дна и радиус ее верха. Тарелки заданы во входном файле в том порядке, в котором Петя складывает их на стол.

Выходные данные

Выведите высоту полученной конструкции с точностью не менее 10 - 6.

E. Два пути

графы Конструктив реализация снм *2600

Как-то раз археологи нашли m таинственных бумажек, на каждой из которых была написана пара целых чисел. Известно, что в древние времена очень любили записывать номера дорог, по которым ходили, в виде «a b» или «b a», где a, b — номера двух различных городов, между которыми шла дорога. Также известно, что таинственные бумаги — это листы из двух путевых дневников (для каждого нового путешествия раньше всегда заводили новый дневник).

В течение одного путешествия странник мог проходить по одной и той же дороге несколько раз в одном или разных направлениях, но в этом случае он ровно столько же раз делал запись об этой дороге в своем дневнике. Кроме того, археологи предполагают, что направление движения путника по дороге никак не влияло на запись в дневнике: запись «a b» могла относиться как к дороге из a в b, так и к дороге из b в a.

Археологи очень хотят расположить страницы в правильной последовательности и восстановить два маршрута путешествия, но, увы, они не сильны в программировании, так что настал ваш час. Помогите им!

Входные данные

В первой строке входных данных находится целое число m (1 ≤ m ≤ 10000). В каждой из последующих m строк описана одна бумага. Каждое описание состоит из пары целых чисел a, b (1 ≤ a, b ≤ 10000, a ≠ b).

Выходные данные

В первой строке выведите число L1 — длину первого пути, т.е. количество бумаг в его описании. В следующей строке через пробел выведите L1 чисел — номера бумаг, описывающих первый из путей. В третьей и четвертой строках аналогичным образом выведите длину второго пути L2 и сам путь. Оба пути должны содержать по крайней мере по одной дороге, т.е. должно выполняться L1 > 0 и L2 > 0. Бумаги нумеруются числами от 1 до m в соответствии с порядком их задания во входном файле. Номера следует выводить в том порядке, в каком путешественник проходил соответствующие дороги. Если решений несколько, выведите любое из них.

Если построить два таких пути невозможно, выведите «-1».

Не забудьте, что использовать нужно все записи ровно по одному разу, т.е. L1 + L2 = m.

A. Левко и восстановление массива

жадные алгоритмы реализация *1700

Левко сильно любит массив a1, a2, ... , an, состоящий из целых чисел. Именно поэтому Левко много играет с массивом a, выполняя различные операции с ним. Каждая операция, которую выполняет Левко, имеет один из двух следующих типов:

  1. Увеличить все элементы от li до ri на di. Другими словами выполнить присвоения aj = aj + di для всех j, удовлетворяющих неравенству: li ≤ j ≤ ri.
  2. Найти максимум элементов от li до ri. То есть посчитать значение .

К большому сожалению, недавно Левко потерял свой массив. К счастью, у Левко остались записи всех операций, которые он выполнял с массивом a. Помогите Левко — по записям операций найдите хотя бы один подходящий массив. Результаты всех операций для найденного массива должны совпадать с результатами из записей. Левко точно помнит, что в его массиве все числа не превосходили 109 по модулю, поэтому он просит вас найти именно такой массив.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 5000) — размер массива и количество операций в записях Левко соответственно.

Следующие m строк описывают операции, i-ая строка описывает i-ую операцию. Первое число в i-ой строке — целое число ti (1 ≤ ti ≤ 2), которое обозначает тип операции. Если ti = 1, то далее следуют три целых числа li, ri и di (1 ≤ li ≤ ri ≤ n,  - 104 ≤ di ≤ 104) — описание операции первого типа. Если ti = 2, то далее следуют три целых числа li, ri и mi (1 ≤ li ≤ ri ≤ n,  - 5·107 ≤ mi ≤ 5·107) — описание операции второго типа.

Операции заданы в том порядке, в котором Левко выполнял их со своим массивом.

Выходные данные

В первой строке выведите «YES» (без кавычек), если решение существует, и «NO» (без кавычек) в противном случае.

Если решение все-таки существует, то во второй строке выведите n целых чисел a1, a2, ... , an (|ai| ≤ 109) — найденный массив.

A. Левко и таблица

Конструктив реализация *800

Левко очень любит таблицы, состоящие из n строк и n столбцов. Особенно он любит красивые таблицы. Красивыми Левко называет таблицы, у которых сумма элементов в каждой строке и в каждом столбце равна k.

К сожалению, он не знает ни одной такой таблицы. Вам нужно помочь ему найти хотя бы одну.

Входные данные

В единственной строке задано два целых числа n и k (1 ≤ n ≤ 100, 1 ≤ k ≤ 1000).

Выходные данные

Выведите любую красивую таблицу. Левко не любит очень большие числа, поэтому все элементы таблицы не должны превышать по своему абсолютному значению 1000.

Если существует несколько подходящих таблиц, разрешается вывести любую.

Примечание

В первом примере сумма в первой строке 1 + 3 = 4, во второй строке 3 + 1 = 4, в первом столбце 1 + 3 = 4 и во втором столбце 3 + 1 = 4. Существуют и другие красивые таблицы для этого примера.

Во втором примере сумма элементов в каждой строке и каждом столбце равна 7. Также возможны и другие таблицы, удовлетворяющие условию.

B. Петя и лестницы

реализация сортировки *1100

Мальчик Петя очень любит лестницы, при этом ему скучно по ним просто ходить — он любит перепрыгивать некоторые ступеньки. Стоя на какой-то ступеньке, он может прыгнуть на следующую ступеньку, перепрыгнуть через одну ступеньку или сразу через две. Но некоторые ступеньки слишком грязные, и Петя не хочет на них наступать.

Сейчас Петя стоит на первой ступеньке лестницы, состоящей из n ступенек. Также он знает номера грязных ступенек этой лестницы. Помогите Пете определить, может ли он пропрыгать всю лестницу и попасть на ступеньку с номером n, ни разу не побывав на грязной ступеньке.

Следует отметить, что Петя всегда бывает на первой и последней ступеньках, следовательно, если одна из них грязная, то Петя не сможет выбрать маршрут, проходящий только по чистым ступенькам.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n ≤ 109, 0 ≤ m ≤ 3000) — количество ступенек в лестнице и количество грязных ступенек соответственно. Во второй строке через пробел записаны m различных целых чисел d1, d2, ..., dm (1 ≤ di ≤ n) — номера грязных ступенек (в произвольном порядке).

Выходные данные

Выведите «YES», если Петя может добраться до ступеньки с номером n, наступая только на чистые ступеньки. В противном случае выведите «NO».

C. Сортировка вставками

дп математика реализация Структуры данных *1900

Петя — начинающий программист. Он уже освоил базовые возможности языка C++ и приступил к изучению алгоритмов. Первым алгоритмом, с которым он познакомился, стала сортировка вставками. Петя уже написал код, реализующий этот алгоритм и сортирующий по неубыванию заданный целочисленный ноль-индексированный массив a размера n.

for (int i = 1; i < n; i = i + 1)
{
int j = i;
while (j > 0 && a[j] < a[j - 1])
{
swap(a[j], a[j - 1]); // поменять местами элементы a[j] и a[j - 1]
j = j - 1;
}
}

Петя подает на вход этого алгоритма исключительно массивы, являющиеся перестановками чисел от 0 до n - 1. Он уже выбрал перестановку, которую хочет отсортировать, но решил предварительно поменять местами какие-то два её элемента. Петя хочет выбрать эти элементы таким образом, чтобы количество вызовов функции swap, выполняемых сортировкой, было минимальным. Помогите Пете определить, каким количеством способов можно выполнить обмен с соблюдением этого требования.

Гарантируется, что во входной перестановке всегда можно поменять местами два элемента таким образом, чтобы уменьшилось количество вызовов функции swap.

Входные данные

В первой строке записано единственное целое число n (2 ≤ n ≤ 5000) — количество чисел в перестановке. Во второй строке содержатся n различных целых чисел от 0 до n - 1 включительно — сама перестановка.

Выходные данные

Выведите два целых числа: минимальное количество вызовов функции swap и количество таких пар (i, j), что обмен элементов входной перестановки с индексами i и j позволяет достичь этого минимального количества вызовов.

Примечание

В первом примере подходят пары (0, 3) и (0, 4).

Во втором примере подходят пары (0, 4), (1, 4), (2, 4) и (3, 4).

A. Соробан

реализация *800

Как вы знаете, Япония является страной с едва ли не самым большим количеством электронных устройств на душу населения. С учетом этого кажется удивительным тот факт, что в начальной школе в Японии для обучения счету повсеместно используется деревянный Соробан — японский аналог счетов. Конечно, у этого явления есть свои веские причины, но мы не будем их обсуждать, а обратим свое внимание на устройство Соробана.

Соробан состоит из некоторого количества спиц, на которые нанизаны по пять костяшек. Будем считать, что спицы расположены горизонтально. На каждой спице одна костяшка (самая левая) отделена от остальных перегородкой. Эта костяшка называется небесной, а четыре остальных — земными. Каждая спица отвечает за представление одной цифры от 0 до 9. Значение цифры получается по следующему простому алгоритму:

  • Положить значение цифры равным 0.
  • Если небесная костяшка прижата вправо, то прибавить 5.
  • Прибавить к результату количество земных костяшек, прижатых влево.

Таким образом, верхняя спица на рисунке представляет цифру 0, средняя – цифру 2, а нижняя – цифру 7. Будем считать, что верхняя спица означает младший разряд числа, поэтому число, представленное на рисунке — 720.

Напишите программу, которая выводит, как представляется на Соробане заданное вам число n.

Входные данные

В первой строке записано целое число n (0 ≤ n < 109).

Выходные данные

Выведите описание десятичных разрядов числа n в порядке от младших к старшим, по одному в строке. При выводе костяшки обозначайте заглавной латинской буквой 'O', части спицы символом '-', а перегородку символом '|'. Выводите столько разрядов, сколько цифр содержится в десятичной записи числа n без лидирующих нулей. Считается, что у числа 0 лидирующих нулей нет.

C. Исправление опечаток

жадные алгоритмы реализация *1400

Многие современные текстовые редакторы автоматически проверяют вводимый текст на наличие ошибок, а некоторые редакторы даже предлагают варианты исправления ошибок.

В этой задаче вам предлагается реализовать небольшую функциональность по исправлению двух типов опечаток в слове. Будем считать, что наличие трех или более одинаковых букв подряд является опечаткой (например, слово «helllo» записано с опечаткой). Кроме того, наличие пары одинаковых букв и непосредственно следом другой пары одинаковых букв тоже является опечаткой (например, слова «helloo» и «wwaatt» записаны с опечатками).

Напишите программу, которая удаляет из слова наименьшее количество букв так, чтобы слово не содержало описанных выше опечаток. Разрешается удалять буквы как с обоих концов слова, так и из его середины.

Входные данные

В единственной строке входных данных записано слово s длиной от 1 до 200000 символов. Заданное слово s состоит из строчных букв латинского алфавита.

Выходные данные

Выведите такое слово t, которое не содержит описанных в условии задачи опечаток и получено из s удалением наименьшего количества букв.

Если решений несколько, выведите любое из них.

Примечание

Вторым допустимым ответом на тест из условия является вывод «heloo».

E. Два круга

Перебор реализация Структуры данных *2500

Пусть задана таблица n × m, заполненная целыми числами. Клетку в i-ой строке и j-ом столбце будем обозначать (i, j). Таким образом, (1, 1) является левой верхней клеткой таблицы, а (n, m) — правой нижней. Назовем кругом радиуса r с центром в клетке (i0, j0) множество таких клеток (i, j), что . Будем рассматривать только такие круги, которые не выходят за пределы таблицы, то есть у которых r + 1 ≤ i0 ≤ n - r и r + 1 ≤ j0 ≤ m - r.

Круг радиуса 3 с центром в (4, 5).

Найдите два таких непересекающихся круга заданного радиуса r, что сумма чисел в клетках, принадлежащим этим кругам, максимальна. Два круга пересекаются, если найдется клетка, принадлежащая обоим кругам. Поскольку может быть более одного способа выбрать пару кругов с максимальной суммой, то нас будет интересовать еще и количество таких пар. Посчитайте количество неупорядоченных пар кругов, то есть, к примеру, пара кругов радиуса 2 с центрами в (3, 4) и (7, 7) это та же самая пара, что и пара кругов радиуса 2 с центрами в (7, 7) и (3, 4).

Входные данные

В первой строке записано три целых числа n, m и r (2 ≤ n, m ≤ 500, r ≥ 0). Каждая из следующих n строк содержит по m целых чисел в диапазоне от 1 до 1000 — элементы таблицы. Строки таблицы перечислены сверху вниз, элементы в строках — слева направо. Гарантируется, что существует хотя бы один круг радиуса r, не выходящий за пределы таблицы.

Выходные данные

Выведите два числа — максимальную сумму чисел в клетках, которые находятся в двух непересекающихся кругах, и количество пар непересекающихся кругов с максимальной суммой. Если не существует ни одной пары непересекающихся кругов, то выведите 0 0.

A. Матрица

Комбинаторика реализация Структуры данных *1600

Дана строка из десятичных цифр s. Определим bij = si·sj. Найдите в матрице b количество таких прямоугольников, что сумма bij для всех клеток (i, j), являющихся элементами прямоугольника, в каждом прямоугольнике равна a.

Прямоугольником в матрице называется четверка чисел (x, y, z, t) (x ≤ y, z ≤ t). Элементами прямоугольника называются все клетки (i, j), такие, что x ≤ i ≤ y, z ≤ j ≤ t.

Входные данные

В первой строке записано целое число a (0 ≤ a ≤ 109), во второй строке записана строка из десятичных цифр s (1 ≤ |s| ≤ 4000).

Выходные данные

Выведите единственное целое число — ответ на задачу.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

A. Хорошее число

реализация *1100

Назовем число k-хорошим, если оно содержит все цифры, не превосходящие k (0, ..., k). Вам дано число k и массив a из n чисел. Найдите количество k-хороших чисел в a (каждое число нужно посчитать столько раз, сколько оно входит в массив a).

Входные данные

В первой строке записаны целые числа n и k (1 ≤ n ≤ 100, 0 ≤ k ≤ 9). В i-й из следующих n строк записано без ведущих нулей целое число ai (1 ≤ ai ≤ 109).

Выходные данные

Выведите единственное целое число — количество k-хороших чисел в a.

B. Отрезок Фибоначчи

реализация *1100

Дан массив a1, a2, ..., an. Отрезок [l, r] (1 ≤ l ≤ r ≤ n) называется хорошим, если ai = ai - 1 + ai - 2, для всех i (l + 2 ≤ i ≤ r).

Определим функцию len([l, r]) = r - l + 1, len([l, r]) называется длиной отрезка [l, r]. Отрезок [l1, r1], длиннее отрезка [l2, r2], если len([l1, r1]) > len([l2, r2]).

Требуется найти в массиве a хороший отрезок наибольшей длины. Заметьте, что отрезок, длины 1 или 2 всегда хороший.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105) — количество элементов в массиве. Во второй строке записаны целые числа: a1, a2, ..., an (0 ≤ ai ≤ 109).

Выходные данные

Выведите длину самого длинного хорошего отрезка в массиве a.

A. Дима и вахта

реализация *1100

Со времен прошлого раунда ничего не изменилось, Дима и Инна все также любят друг друга и хотят быть вместе. С Сережей договорились, осталось договориться с вахтой...

В общежитии Димы есть четыре вахты. Каждый день работает две вахтерши. Каждую вахтершу можно задобрить подарком, купив ей шоколадку или сок. Для каждой вахтерши известна минимальная цена шоколадки, которую она может принять в качестве подарка, и минимальная цена сока, который она может принять в качестве подарка. Если шоколадка для вахтерши стоит меньше минимальной цены на шоколадку для этой вахтерши, или сок для вахтерши стоит меньше минимальной цены на сок для этой вахтерши, вахтерша не примет такой подарок.

Чтобы пройти через вахту, нужно задобрить обеих вахтерш.

В магазине есть неограниченное количество соков и шоколадок любой целой цены, начиная от 1. Дима хочет выбрать некоторую вахту, купить по одному угощению каждой вахтерше из этой вахты и потратить при этом ровно n рублей.

Помогите ему выбрать вахту, через которую провести Инну, либо скажите, что это невозможно, только учтите, что в этом случае Инна очень расстроится!

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 105) — количество денег, которое хочет потратить Дима. Далее следуют четыре строки, описывающие вахты. Каждая строка содержит по четыре целых числа a, b, c, d (1 ≤ a, b, c, d ≤ 105) — минимальная цена шоколадки и минимальная цена сока для первой вахтерши, минимальная цена шоколадки и минимальная цена сока для второй вахтерши соответственно.

Выходные данные

В единственной строке выходных данных через пробел выведите три целых числа: номер вахты, стоимость первого угощения и стоимость второго угощения. Если нет вахты, через которую Дима может провести Инну при таких условиях, в единственной строке выведите -1.

Вахты нумеруются от 1 до 4 в соответствии с порядком, указанном во входных данных.

Если существует несколько решений, разрешается вывести любое.

Примечание

Пояснение к примеру 1.

Единственным способом потратить 10 рублей, купив угощения, которые будут не меньше установленной вахтой цен, будет купить обоим вахтершам из первой вахты шоколадку по 5 рублей.

Пояснение к примеру 2.

Чтобы задобрить первую вахту, нужно 12 рублей, вторую — 14, четвертую — 16. Поэтому, единственная вахта, которую мы можем задобрить — третья. Собственно, мы можем купить шоколадку за 4 рубля первой вахтерше и сок за 6 рублей второй.

B. Дима и дела

Перебор реализация *1200

Благодаря вам Дима чудесно провел выходные, но пришло время делать дела. Естественно, что Дима, как и все мужчины, у которых есть женщина, все делает не правильно.

Инна и Дима сейчас вместе в одной комнате. Инна ругает Диму за каждое дело, которое он делает в ее присутствии. Поругав Диму за какое-то дело, Инна удаляется в другую комнату и там ходит по кругу, причитая, какой у нее непутевый суженый. За это время Дима спокойно успевает сделать k - 1 дело. Затем Инна возвращается и за следующее дело, сделанное в ее присутствии, вновь ругает Диму, после чего снова удаляется в другую комнату. Описанное продолжается до тех пор, пока Дима не сделает все свои дела.

Всего у Димы n дел, каждое из которых имеет уникальный номер от 1 до n. Дима любит порядок, поэтому он делает дела последовательно, начиная с некоторого дела. Например, если у Димы всего 6 дел, то если он начнет с 5-го дела, порядок дел будет следующий: сначала Дима сделает 5-ое дело, потом 6-ое, потом 1-ое, потом 2-ое, 3-е, 4-е.

Инна так часто и систематично ругает Диму (исключительно любя и по делу!), что Дима уже выучил наизусть с какой силой Инна ругает его за каждое дело. Помогите Диме выбрать первое дело так, чтобы в сумме его ругали как можно слабее.

Входные данные

Первая строка входных данных содержит два целых числа n, k (1 ≤ k ≤ n ≤ 105). Вторая строка содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 103), где ai — сила, с которой Инна ругает Диму, если присутствует в комнате, когда он делает i-ое дело.

Гарантируется, что n делится на k.

Выходные данные

В единственной строке выведите номер дела, с которого стоит начать Диме, чтобы в сумме его ругали как можно слабее. Если существует несколько решений, выведите то, у которого номер первого дела минимальный.

Примечание

Пояснение к тесту 1.

Если Дима сделает первое дело первым, Инна поругает его с силой 3, затем Дима успевает сделать одно дело (так как k = 2), затем Инна ругает его за третье дело с силой 1, после чего ругает его за пятое с силой 5. Таким образом Диму ругают с суммарной силой 3 + 1 + 5 = 9. Если бы Дима начал со второго дела, к примеру, Инна поругала бы его за дела 2, 4 и 6 с силой 2 + 6 + 4 = 12.

Пояснение к тесту 2.

Во втором тесте k = 5, а значит, между делами, за которые его ругают, Дима успевает сделать 4 дела. Таким образом Инна ругает Диму за дела с номерами 1 и 6 (если он начнет с 1 или 6), 2 и 7 (если с 2 или 7) и так далее. Оптимальнее всего начать с дела 3 или 8, из них 3 с меньшим номером, поэтому ответ 3.

E. Дима и волшебная гитара

математика Перебор реализация *2200

Дима очень любит Инну, поэтому он решил написать ей песню. У Димы есть волшебная гитара, у которой n струн и m ладов. Звукоизвлечение на гитаре происходит следующим образом: чтобы сыграть ноту, нужно зажать одну из струн на одном из ладов, а затем дернуть эту струну. Обозначим ноту, которую играет Димина гитара, если на ней сыграть i-ую струну зажатую на j-ом ладу, переменной aij. Известно, что Димина гитара может играть k различных нот, при этом вполне вероятно, что некоторые ноты можно сыграть несколькими способами. Другими словами, возможно, aij = apq при (i, j) ≠ (p, q).

Дима уже написал песню — последовательность из s нот. Чтобы сыграть песню нужно последовательно сыграть ноты из песни на гитаре, причем каждую ноту можно играть любым из доступных способов. Дима понял, что есть очень много способов сыграть песню, и хочет сыграть ее так, чтобы она выглядела как можно сложнее (выкобеЙнивается).

Будем обозначать способ сыграть песню последовательностью пар (xi, yi) (1 ≤ i ≤ s) таких, что xi-ая струна на yi-ом ладу издает i-ую ноту песни. Сложностью перехода между парами (x1, y1) и (x2, y2) назовем значение + . Сложностью способа сыграть песню назовем максимальную из сложностей переходов между соседними парами в способе.

Помогите Диме определить максимально возможную сложность способа сыграть его песню! Пусть парень выглядит круто!

Входные данные

Первая строка входных данных содержит четыре целых числа n, m, k и s (1 ≤ n, m ≤ 2000, 1 ≤ k ≤ 9, 2 ≤ s ≤ 105).

Далее следует n строк по m целых чисел aij (1 ≤ aij ≤ k) в каждой. Число в строке номер i в столбце j (aij) означает ноту, которую издает гитара на i-ой струне на j-ом ладу.

Последняя строка входных данных содержит s чисел qi (1 ≤ qi ≤ k) — последовательность нот из песни.

Выходные данные

В единственной строке выведите одно число — максимально возможную сложность песни.

A. Сережа и алгоритм

реализация Структуры данных *1500

Сережа любит самые разные алгоритмы. Недавно он придумал новый алгоритм, на вход которому подается строка. Обозначим входную строку алгоритма как q = q1q2... qk. Алгоритм состоит из двух шагов:

  1. Найти любую непрерывную подпоследовательность (подстроку) из трех символов строки q, которая не равна ни одной из строк «zyx», «xzy», «yxz». Если q не содержит ни одной такой подпоследовательности, завершить алгоритм, иначе перейти к шагу 2.
  2. Переставить буквы в найденной подпоследовательности случайным образом, перейти к шагу 1.

Сережа считает, что алгоритм корректно работает на строке q, если существует хоть какая-то ненулевая вероятность того, что алгоритм завершится. Если же алгоритм в любом случае будет работать бесконечно долго на строке, считается, что он работает некорректно на ней.

Сережа хочет протестировать свой алгоритм. Для этого у него есть строка s = s1s2... sn, состоящая из n символов. Мальчик проводит серию из m тестов. В качестве i-го теста он подает на вход алгоритму строку slisli + 1... sri (1 ≤ li ≤ ri ≤ n). К сожалению, его реализация алгоритма работает слишком долго, поэтому Сережа обратился к вам за помощью. Для каждого теста (li, ri) определите, отработает алгоритм корректно на этом тесте или нет.

Входные данные

В первой строке содержится непустая строка s, ее длина (n) не превосходит 105. Гарантируется, что строка s состоит только из символов: 'x', 'y', 'z'.

Вторая строка содержит целое число m (1 ≤ m ≤ 105) — количество тестов. Следующие m строк содержат сами тесты. В i-ой строке записана пара целых чисел li, ri (1 ≤ li ≤ ri ≤ n).

Выходные данные

Для каждого теста выведите «YES» (без кавычек), если алгоритм работает корректно на соответствующем тесте и «NO» (без кавычек) в противном случае.

Примечание

В первом тесте в первом и втором тесте алгоритм всегда закончит работу за один шаг. В четвертом запросе можно получить строку «xzyx», на которой алгоритм закончит работу. В остальных запросах алгоритм работает некорректно.

A. Сережа и вешалка

реализация *1000

Сережа — хозяин ресторана вместительностью n человек. Как и полагается, в холле ресторана есть вешалка с n крючками. Каждый посетитель ресторана может воспользоваться крючком и повесить на него свою одежду. Стоимость использования i-го крючка — ai рублей. На один крючок может повесить одежду только один человек.

Сегодня вечером к Сереже в ресторан придут m гостей. Естественно, что каждый гость хочет повесить свои вещи на еще незанятый крючок с минимальной стоимостью (если таких крючков несколько, то на любой такой). Однако если в момент, когда придет очередной гость, на вешалке не будет свободных крючков, Сережа должен заплатить гостю штраф в размере d рублей.

Помогите Сереже узнать прибыль в рублях, возможно отрицательную, которую он получит за сегодняшний вечер. Считайте, что перед приходом гостей вешалка полностью свободна, все гости приходят в разное время, никто кроме m гостей не посещает ресторан Сережи в этот вечер.

Входные данные

Первая строка содержит два целых числа n и d (1 ≤ n, d ≤ 100). Следующая строка содержит целые числа a1, a2, ..., an (1 ≤ ai ≤ 100). Третья строка содержит целое число m (1 ≤ m ≤ 100).

Выходные данные

В единственную строку выведите целое число — ответ на задачу.

Примечание

В первом тесте после прихода всех гостей обе вешалки будут заняты, поэтому Сережа получит прибыль 1 + 2 = 3 рублей.

Во втором тесте после прихода всех гостей обе вешалки будут заняты, но и Сережа заплатит штраф 8 раз, поэтому его прибыль составит 3 - 8 =  - 5 рублей.

A. Валера и тарелки

жадные алгоритмы реализация *900

Валера — ленивый студент. У него дома имеются m чистых глубоких тарелок и k чистых плоских тарелок.

Валера распланировал, что он будет кушать ближайшие n дней. Поскольку Валера ленив, каждый день он будет есть ровно одно блюдо. При этом, чтобы съесть блюдо, ему нужна ровно одна чистая тарелка. Известно, что Валера умеет готовить всего два типа блюд. Блюда первого типа можно есть только из глубоких тарелок, а блюда второго типа можно есть и из глубоких тарелок, и из плоских тарелок.

Когда Валера поест, тарелка, из которой он ел, становится грязной. Убеждения Валеры не позволяют ему есть из грязных тарелок, поэтому иногда перед едой ему нужно будет помыть тарелку. Определите, какое минимальное количество раз Валере потребуется помыть тарелку, если он будет действовать оптимально.

Входные данные

В первой строке входных данных задано три целых числа n, m, k (1 ≤ n, m, k ≤ 1000) — количество распланированных дней, количество чистых глубоких тарелок и количество чистых плоских тарелок.

Во второй строке заданы n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 2). Если ai равно единице, то в день i Валера будет есть блюдо первого типа. Если ai равно двум, то в день i Валера будет есть блюдо второго типа.

Выходные данные

Выведите единственное целое число — какое минимальное количество раз Валере потребуется помыть тарелку.

Примечание

В первом примере Валера будет мыть глубокую тарелку только в третий день, поэтому ответ равен единице.

Во втором примере все четыре дня Валера будет есть блюда первого типа, а поскольку глубоких тарелок всего три, то он будет мыть тарелку ровно один раз.

В третьем примере все три дня Валера будет есть блюда второго типа, а поскольку их можно есть из тарелок обоих типов, то мыть тарелку не потребуется ни разу.

B. Валера и олимпиада

Конструктив математика реализация *1400

Валера очень любит участвовать в олимпиадах. Особенно в олимпиадах по программированию. Сегодня он поучаствовал в олимпиаде в составе команды, состоящей из n студентов (включая Валеру). Соревнование было индивидуальное, поэтому каждый студент в команде решал задачи индивидуально.

После олимпиады Валера заинтересовался результатами участников. Ему удалось выяснить, что:

  • каждый студент в команде набрал не менее l очков и не более r очков;
  • в сумме все участники команды набрали ровно sall очков;
  • сумма очков тех k членов команды, которые набрали наибольшее количество очков, равна sk; более формально, если a1, a2, ..., an — очки, которые получили студенты команды, в невозрастающем порядке (a1 ≥ a2 ≥ ... ≥ an), то sk = a1 + a2 + ... + ak.

Однако Валера не узнал, сколько в точности очков набрал каждый из n студентов. Валера попросил вас восстановить любое распределение очков между студентами команды, удовлетворяющее всем перечисленным выше условиям.

Входные данные

В первой строке входных данных задано ровно шесть целых чисел n, k, l, r, sall, sk (1 ≤ n, k, l, r ≤ 1000; l ≤ r; k ≤ n; 1 ≤ sk ≤ sall ≤ 106).

Гарантируется, что входные данные таковы, что ответ существует.

Выходные данные

Выведите ровно n целых чисел a1, a2, ..., an — количество баллов, набранное каждым из студентов. Если существует несколько решений, разрешается вывести любое. Выводить распределение баллов можно в любом порядке.

B. Компьютерная игра

жадные алгоритмы реализация *1800

Петя, старший брат Васи, очень любит играть в компьютерные игры. В одной из своих любимых игр Петя дошел до последнего уровня, на котором происходит битва с боссом.

Во время прохождения игры Петя находил свитки с заклинаниями, и теперь ему предстоит их использовать. Опишем, как происходит бой на этом уровне:

1) У босса есть два параметра max — начальное количество здоровья, и reg — ежесекундная регенерация.

2) У каждого свитка также есть два параметра: powi — сила заклинания, измеряемая в процентах — максимальное количество здоровья босса, отсчитываемое от исходного, при котором можно использовать данный свиток (т. е. если у босса больше powi процентов здоровья, свиток применять нельзя); и dmgi — урон в секунду, который получает босс, если использовать этот свиток. Как только какой-то свиток использован, он пропадает, и на босса накладывается еще одно заклинание, которое будет наносить ему dmgi урона каждую секунду до конца игры.

Действия в бою в течение одной секунды, происходят в следующем порядке: сначала босс получает урон от всех заклинаний, наложенных на него, затем восстанавливает reg здоровья (при этом, больше чем max здоровья получиться не может), а затем игрок может использовать очередной свиток (не больше одного в секунду).

Босс считается поверженным, если в конце какой-то секунды количество здоровья стало неположительным ( ≤ 0).

Помогите Пете определить, может ли он выиграть с имеющимся набором свитков, и если может, то за какое минимальное количество секунд он сможет это сделать.

Входные данные

В первой строке записаны три целых числа N, max и reg (1 ≤ N, max, reg ≤ 1000) — количество свитков, и параметры босса. В следующих N строках записаны по два целых числа powi и dmgi — параметры i-го свитка (0 ≤ powi ≤ 100, 1 ≤ dmgi ≤ 2000).

Выходные данные

В случае если Петя не сможет пройти этот уровень, в единственной строке выведите NO.

Иначе в первой строке выведите YES. Во второй строке выведите минимальное время, через которое босс может быть повержен и количество использованных свитков. В следующих строках для каждого использованного свитка выведите через пробел количество секунд, прошедших с начала боя, до его использования и номер использованного свитка. Свитки нумеруются с 1 в том порядке, в котором они заданы во входных данных. Считается, что первый свиток можно использовать через 0 секунд.

Свитки выводите в том порядке, в котором их нужно использовать. Запрещается использовать свитки после того как босс повержен.

B. Берляндское лото

реализация *1300

Последнее время в Берляндии очень популярен национальный вариант игры «лото». В игре принимают участие n игроков, у каждого есть своя карточка с числами. Числа на каждой карточке различны, но на разных карточках могут быть одинаковые числа. На карточке i-го игрока записаны mi чисел.

Во время игры ведущий, не глядя, достает из мешка по одному бочонку с написанным на нем номером. Он громко и отчетливо произносит его номер вслух, а затем откладывает бочонок в сторону. Все участники, на карточке которых есть названное число, вычеркивают его. Выигрывает тот, кто первым вычеркнет все числа со своей карточки. Если несколько человек одновременно первыми вычеркивают все числа со своих карточек, то объявляется ничья и победителей в игре нет. В начале игры мешок содержит 100 бочонков, пронумерованных от 1 до 100, и номера всех бочонков различны.

Напишите программу, которая по заданным карточкам для каждого игрока определяет, может ли он стать победителем в игре при наиболее благоприятном для него развитии событий.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 100) — количество игроков. Далее следует n строк, каждая описывает карточку очередного игрока. Строка, описывающая карточку, начинается с числа mi (1 ≤ mi ≤ 100) — количества чисел на карточке i-го игрока. Далее следует последовательность целых чисел ai, 1, ai, 2, ..., ai, mi (1 ≤ ai, k ≤ 100) — числа на карточке i-го игрока. Числа в строках разделяются единичными пробелами.

Гарантируется, что в пределах каждой карточки все номера различны.

Выходные данные

Выведите n строк, i-я строка должна содержать слово «YES» (без кавычек), если i-й игрок может оказаться победителем, и «NO» (без кавычек) в противном случае.

D. Сломанный монитор

жадные алгоритмы Конструктив Перебор реализация *2100

У Иннокентия беда — cломался монитор компьютера. Теперь некоторые пиксели его монитора являются «битыми», то есть всегда имеют черный цвет. Как следствие, Иннокентий не может играть в обыкновенные компьютерные игры. В настоящий момент он играет в следующую игру со своим младшим братом Поликарпом.

Иннокентий вслепую пишет программу, которая на черном экране рисует квадратную белую рамку шириной в один пиксель. Так как монитор неисправен, то некоторые пиксели, которые должны быть белыми, остаются черными. Глядя на результат работы программы на экране, Поликарп должен угадать позицию и размер рамки Иннокентия. Поликарпу не очень нравится игра, но Иннокентий убедил брата играть, ведь «игра развивает фантазию и наблюдательность».

Помогите Поликарпу, автоматизировав его участие в игре. Напишите программу, которая находит такую возможную квадратную рамку, что:

  • ширина рамки составляет 1 пиксель,
  • рамка полностью помещается на экране,
  • все белые пиксели монитора расположены на рамке,
  • из всех рамок, которые удовлетворяют предыдущим трем условиям, искомая рамка должна иметь наименьший размер.

Формально, квадратная рамка представляет собой такие пиксели сплошного квадрата, которые находятся на краю квадрата, то есть не являются полностью окруженными другими пикселями квадрата. Например, если рамка имеет размер d = 3, то она состоит из 8 пикселей, если ее размер d = 2, то из 4, а если d = 1, то она вырождается в один пиксель.

Входные данные

В первой строке содержится разрешение монитора в виде пары целых чисел n, m (1 ≤ n, m ≤ 2000). Следующие n строк содержат ровно по m символов — состояние пикселей монитора на момент игры. Символ «.» (точка) соответствует черному пикселю, а символ «w» (строчная латинская буква w) — белому. Гарантируется, что хотя бы один пиксель монитора — белый.

Выходные данные

Выведите экран монитора, обозначив искомую рамку символами «+» (знак «плюс»). Те пиксели, которые во время игры были белыми, изменять не следует. Их следует выводить, используя «w». Если возможных вариантов размещения рамки минимального размера несколько, выведите любой из них.

Если искомой рамки не существует, то выведите вместо n строк единственную строку, содержащую число -1.

Примечание

В первом примере размер искомой рамки равен 4. Во втором примере размер искомой рамки равен 3. В третьем примере искомая рамка имеет размер 1. В четвертом примере искомой рамки не существует.

A. K-периодичный массив

жадные алгоритмы математика реализация *1000

В данной задаче речь пойдет только о массивах, все элементы которых равны 1 и/или 2.

Массив a называется k-периодичным, если его длина делится нацело на k, и существует такой массив b длины k, что a представляет собой записанный ровно раз подряд массив b. Иными словами, массив a является k-периодичным, если он имеет период длины k.

Например, любой массив является n-периодичным, где n — длина массива. Массив [2, 1, 2, 1, 2, 1] является одновременно 2-периодичным и 6-периодичным, а массив [1, 2, 1, 1, 2, 1, 1, 2, 1] является одновременно 3-периодичным и 9-периодичным.

Для заданного массива a, состоящего только из единиц и двоек, найдите наименьшее количество элементов, которые необходимо изменить, чтобы он стал k-периодичным. Если массив уже является k-периодичным, то искомое значение равно 0.

Входные данные

В первой строке входных данных содержится пара целых положительных чисел n, k (1 ≤ k ≤ n ≤ 100), где n — длина массива, а значение k делит нацело n. Вторая строка содержит последовательность элементов заданного массива a1, a2, ..., an (1 ≤ ai ≤ 2), aii-й элемент массива.

Выходные данные

Выведите наименьшее количество элементов массива, которые надо изменить, чтобы он стал k-периодическим. Если массив уже является k-периодичным, то выведите 0.

Примечание

В первом примере достаточно заменить четвертый элемент с 2 на 1, тогда массив примет вид [2, 1, 2, 1, 2, 1].

Во втором примере заданный массив уже 4-периодичный.

В третьем примере достаточно каждое вхождение двойки заменить на единицу. В этом случае массив примет вид [1, 1, 1, 1, 1, 1, 1, 1, 1] — этот массив одновременно 1-, 3- и 9-периодичный.

D. Сосуды

Деревья реализация снм Структуры данных *1800

Есть система из n сосудов, расположенных один над другим так, как показано на рисунке ниже. Представим, что сосуды пронумерованы числами от 1 до n в порядке от самого верхнего к самому нижнему, объем i-го сосуда равен ai литров.

Изначально все сосуды пустые. В некоторые сосуды наливают воду, при этом вся вода, не поместившаяся в i-й сосуд, переливается в (i + 1)-й. Жидкость, не поместившаяся в n-й сосуд, выливается на пол.

Ваша задача состоит в том, чтобы промоделировать наливание воды в сосуды. Для этого вам потребуется обрабатывать два типа запросов:

  1. Долить в pi-й сосуд xi литров воды;
  2. Вывести, сколько воды находится в ki-м сосуде.

При ответе на второй запрос можно считать, что вся вода, налитая до этого момента, уже успела перелиться между сосудами.

Входные данные

В первой строке записано целое число n — количество сосудов (1 ≤ n ≤ 2·105). Во второй строке записаны n целых чисел a1, a2, ..., an — вместимости сосудов (1 ≤ ai ≤ 109). Вместимости сосудов не обязательно возрастают от верхних сосудов к нижним (см. второй пример). В третьей строке записано целое число m — количество запросов (1 ≤ m ≤ 2·105). Каждая из следующих m строк содержит описание одного запроса. Запрос первого типа задается как «pi xi», запрос второго типа — как «ki» (1 ≤ pi ≤ n, 1 ≤ xi ≤ 109, 1 ≤ ki ≤ n).

Выходные данные

На каждый запрос второго типа в отдельной строке выведите количество воды в соответствующем сосуде.

A. Весело нажимать на панели

реализация *900

Мальчик-огуречик обожает Kyubeat, известную музыкальную игру.

В Kyubeat есть 16 панелей для игры, расположенных в таблице 4 × 4. Когда загорается какая-то панель, на нее надо нажать.

У каждой панели есть предпочтительное время, в которое ее нужно нажать. Мальчик-огуречик может в один момент нажать одной рукой не более k панелей. Мальчик-огуречик пытается нажать все панели в предпочтительное время. Если он не может нажать панели в предпочтительное время двумя руками, то он не достигнет своей цели.

Вам дана одна таблица Kyubeat из музыки, которую слушает Мальчик-огуречик. Скажите ему, может ли он нажать на все панели в предпочтительное время.

Входные данные

В первой строке записано единственное целое число k (1 ≤ k ≤ 5) — количество панелей, которые мальчик-огуречик может нажать одной своей рукой.

В следующих 4 строках записано по 4 символа (цифры от 1 до 9 или точка) — таблица игры. Если на панели записано число i, то значит, надо нажать эту панель во время i. Если на панели записана точка, значит, эту панель нажимать не обязательно.

Выходные данные

Выведите «YES» (без кавычек), если мальчик сможет нажать все панели как нужно. В противном случае выведите «NO» (без кавычек).

Примечание

В третьем тестовом примере мальчик не может достигнуть цели. Он сможет нажать двумя руками панели в момент времени 1, но не сможет нажать панели двумя руками в момент времени 2.

B. Весело составлять последовательности

Бинарный поиск математика реализация *1600

Определим S(n) для положительного целого числа n следующим образом: количество цифр в десятичной записи числа n. Например, S(893) = 3, S(114514) = 6.

Вы хотите составить последовательность из целых чисел, следующих друг за другом, начиная с числа m (m, m + 1, ...). Но для того, чтобы добавить в последовательность число n, надо заплатить S(nk.

Вы можете потратить w, при этом последовательность необходимо сделать как можно длиннее. Напишите программу, сообщающую максимальную длину последовательности.

Входные данные

В первой строке записано три целых числа w (1 ≤ w ≤ 1016), m (1 ≤ m ≤ 1016), k (1 ≤ k ≤ 109).

Пожалуйста, не используйте спецификатор %lld для чтения и записи 64-битных целых чисел на C++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

Выходные данные

В первой строке выведите целое число — ответ на задачу.

A. Инна и розовое пони

жадные алгоритмы реализация *2000

У Димы с Инной все хорошо! Прямо сейчас Инна сидит на волшебной поляне и играет с розовым пони. Дима тоже захотел поиграть. Он принес шахматную доску размером n × m, одну очень вкусную конфету и два числа a и b.

Дима положил шахматную доску перед Инной и разместил конфету в позиции (i, j) на доске. Мальчик сказал, что отдаст конфету, если она окажется в одной из угловых клеток доски. При этом он поставил условие, что разрешается совершать только действия следующего вида:

  • переместить конфету из позиции (x, y) на доске в позицию (x - a, y - b);
  • переместить конфету из позиции (x, y) на доске в позицию (x + a, y - b);
  • переместить конфету из позиции (x, y) на доске в позицию (x - a, y + b);
  • переместить конфету из позиции (x, y) на доске в позицию (x + a, y + b).

Разумеется, Дима запретил перемещать конфету за пределы шахматной доски.

Инна и пони стали двигать конфету по доске. Им интересно: какое минимальное количество разрешенных действий нужно совершить, чтобы конфета, изначально находившаяся в позиции (i, j), оказалась в одном из углов шахматной доски. Помогите им с этой задачей!

Входные данные

В первой строке входных данных находится шесть целых чисел n, m, i, j, a, b (1 ≤ n, m ≤ 106; 1 ≤ i ≤ n; 1 ≤ j ≤ m; 1 ≤ a, b ≤ 106).

Считайте, что строки шахматной доски пронумерованы от 1 до n сверху вниз, а столбцы — от 1 до m слева направо. Позицией (i, j) в условии обозначается клетка шахматной доски на пересечении строки с номером i и столбца с номером j. Углы доски — это позиции: (1, m), (n, 1), (n, m), (1, 1).

Выходные данные

В единственной строке выведите целое число — минимальное количество ходов, необходимое для получения конфеты.

Если Инна и пони не могут получить конфету, действуя по правилам Димы, в единственной строке выведите «Poor Inna and pony!» без кавычек.

Примечание

Пояснение к примеру 1:

Инна и пони могут перевести конфету в позицию (1 + 2, 3 + 2) = (3, 5), из нее они могут перевести конфету в позиции (3 - 2, 5 + 2) = (1, 7) и (3 + 2, 5 + 2) = (5, 7). Данные позиции соответствуют угловым клеткам шахматной доски. Таким образом ответ на этот тестовый пример равен двум.

C. Инна и Дима

графы дп поиск в глубину и подобное реализация *1900

Инна и Дима купили в магазине табличку размера n × m. В каждой ячейке этой таблички записана одна из букв: «D», «I», «M», «A».

Инна любит Диму, поэтому она хочет, двигаясь по табличке, собрать его имя как можно больше раз. Для этого Инна действует следующим образом:

  1. изначально Инна выбирает некоторую ячейку таблицы, в которой записана буква «D»;
  2. затем Инна может перейти в одну из соседних по стороне ячеек таблицы, в которой записана буква «I»; затем из этой ячейки она может перейти в одну из соседних по стороне ячеек таблицы, в которой записана буква «M»; затем в одну из соседних по стороне ячеек таблицы, в которой записана буква «A», после чего Инна считает, что собрала целиком имя своего возлюбленного;
  3. следующим ходом Инна может перейти в одну из соседних по стороне ячеек таблицы, в которой записана буква «D», и далее аналогичным образом продолжить набор имени DIMA. Инна никогда не пропускает буквы, то есть из буквы «D» она всегда переходит в букву «I», из буквы «I» — в букву «M», из буквы «M» — в букву «A», а из буквы «A» — в букву «D» для начала набора имени еще раз.

В зависимости от выбора первоначальной ячейки таблицы Инна может собрать слово DIMA либо бесконечное количество раз, либо некоторое положительное конечное количество раз, либо вообще не может собрать слово DIMA ни разу. Помогите Инне определить, какое максимальное количество раз она может собрать слово DIMA.

Входные данные

Первая строка входных данных содержит два целых числа n и m (1 ≤ n, m ≤ 103).

Далее следует n строк, описывающих таблицу Инны и Димы. Каждая строка содержит m символов. Каждый символ — это один из символов: «D», «I», «M», «A».

Обратите внимание, не гарантируется, что таблица содержит хотя бы одну букву «D».

Выходные данные

Если Инна не может собрать ни одного слова DIMA, в единственной строке выведите «Poor Dima!» без кавычек. Если Инна может собрать бесконечное количество слов DIMA, выведите «Poor Inna!» без кавычек. Иначе выведите целое число — какое максимальное количество раз Инна сможет собрать слово DIMA.

Примечание

Пояснения к примерам:

В первом тестовом примере, Инна не может собрать слово DIMA ни разу.

Во втором тестовом примере, Инна может собрать бесконечное количество слов DIMA. Для этого она должна двигаться по часовой стрелке, начиная от правого нижнего угла.

В третьем тестовом примере, выгоднее всего изначально выбрать ячейку в левом верхнем углу таблицы. Начиная от этой ячейки, можно собрать слово DIMA 4 раза.

E. Инна и пупсики

Бинарный поиск геометрия реализация снм Структуры данных *2600

Инна, Дима и Сережа собрались в комнате. На улице холодно, поэтому Сережа предложил ребятам поиграть в настольную игру «Пупсики».

Поле для игры в «Пупсики» представляет собой безграничную плоскость, на которой находятся n синих пупсиков и m красных. Каждый пупсик — это отрезок, который растет во времени. В момент времени t синий пупсик (x, y) представляет собой синий отрезок с концами в точках (x - t, y + t), (x + t, y - t). Аналогично, в момент времени t красный пупсик (x, y) представляет собой красный отрезок с концами в точках (x + t, y + t), (x - t, y - t) плоскости. Первоначально, в момент времени t = 0, все пупсики — это точки на плоскости.

Цель игры — найти первый целочисленный момент времени, в который на плоскости будет существовать прямоугольник ненулевой площади, стороны которого целиком покрываются некоторыми пупсикам (сторона может быть покрыта несколькими пупсиками). Более формально, для любой точки границы прямоугольника должен существовать пупсик, которому эта точка принадлежит. При этом нужно считать, что пупсики являются замкнутыми отрезками, то есть содержат свои конечные точки.

Вам заданы позиции все пупсиков — помогите ребятам найти требуемый момент времени.

Входные данные

Первая строка входных данных содержит два целых числа n и m (1 ≤ n, m ≤ 2000).

В следующих n строках заданы координаты синих пупсиков. В i-той строке записаны целые числа xi, yi — координаты очередного пупсика. В следующих m строках заданы координаты m красных пупсиков в аналогичном формате.

Все координаты во входных данных не превосходят 106 по модулю. Обратите внимание, что все пупсики стоят в различных точках.

Выходные данные

В единственной строке выведите целое число — ответ на задачу. Если прямоугольник никогда не появится на плоскости, выведите «Poor Sereja!» без кавычек.

B. Наибольшая подматрица 2

дп реализация сортировки Структуры данных *1600

Задана матрица, состоящая из нулей и единиц, размером n × m. Разрешается переставить ее строки местами. Какую наибольшую (по площади) подматрицу, состоящую только из единиц, можно получить в заданной матрице описанными операциями?

Пусть строки матрицы a пронумерованы от 1 до n сверху вниз, а столбцы — от 1 до m слева направо. Ячейку матрицы на пересечении i-ой строки и j-го столбца будем обозначать (i, j). Формально, подматрицей матрицы a будем называть четверку d, u, l, r (1 ≤ d ≤ u ≤ n; 1 ≤ l ≤ r ≤ m). Будем считать, что подматрица содержит в себе ячейки (i, j) (d ≤ i ≤ ul ≤ j ≤ r). Площадью подматрицы будем называть количество ячеек, которые она в себе содержит.

Входные данные

В первой строке заданы два целых числа n и m (1 ≤ n, m ≤ 5000). В следующих n строках записано по m символов — матрица a. Матрица a содержит только символы: «0» и «1». Обратите внимание, что элементы матрицы заданы в строках без пробелов.

Выходные данные

Выведите единственное целое число — площадь максимальной полученной подматрицы. Если подматрицу из единиц невозможно получить, выведите 0.

E. Красно-черное дерево

дп математика реализация *3000

Задано взвешенное дерево, состоящее из n вершин. Каждая вершина дерева покрашена либо в черный цвет, либо в красный. Красно-черное дерево называется красивым, если для любой его вершины найдется черная вершина, расстояние до которой не более x.

Расстоянием между двумя вершинами называется кратчайший путь между ними.

Вам задано красно-черное дерево. Требуется сделать его красивым за минимальное количество операций обмена цветом. За одну операцию обмена цветом разрешается выбрать две вершины разного цвета и каждую из них перекрасить в другой цвет. Другими словами, если выбрана красная вершина p и черная вершина q, за одну операцию разрешается перекрасить p в черный цвет, а q в красный.

Выведите минимальное количество требуемых операций.

Входные данные

В первой строке записано два целых числа n и x (2 ≤ n ≤ 500; 1 ≤ x ≤ 109). Следующая строка содержит n целых чисел, каждое из которых либо нуль, либо единица. Если i-ое число равно 1, то вершина i дерева — черная, иначе вершина i — красная. В следующих n - 1 строках записаны ребра дерева. В j-ой строке записаны целые числа uj vj wj (1 ≤ uj, vj ≤ nuj ≠ vj; 1 ≤ wj ≤ 109), которые обозначают, что в дереве есть ребро веса wj между вершинами vj и uj.

Считайте вершины дерева пронумерованными от 1 до n.

Выходные данные

Выведите единственное целое число — минимальное количество требуемых операций обмена.

Если получить красивое дерево невозможно ни за какое количество операций, выведите -1.

A. Рычаг

математика реализация *900

Задано описание рычага в виде строки s. Обозначим длину строки записью |s|, тогда рычаг имеет вид перекладины с грузами длины |s| - 1 с ровно одной точкой опоры. Будем считать, что перекладина представляет собой отрезок на оси Ox между точками 0 и |s| - 1.

Ниже приведена расшифровка описания рычага.

  • Если i-ый символ строки равен «^» — это значит, что в координате i под перекладиной находится точка опоры.
  • Если i-ый символ строки равен «=» — это значит, что в координате i на перекладине ничего не лежит.
  • Если i-ый символ строки равен цифре c (1-9) — это значит, что в координате i на перекладине лежит груз массы c.

Ваша задача — по описанию рычага вывести, будет он находиться в состоянии равновесия или нет. Считайте, что перекладина ничего не весит. Считайте, что изначально перекладина находится в равновесии, далее на нее одновременно кладут все грузы. После этого перекладина, либо отклоняется влево, либо отклоняется вправо, либо будет находиться в состоянии баланса.

Входные данные

В первой строке задано описание рычага — непустая строка s (3 ≤ |s| ≤ 106), состоящая из цифр (1-9) и символов «^» и «=». Гарантируется, что строка содержит ровно один символ «^». Гарантируется, что точка опоры рычага не находится ни в одном из концов перекладины рычага.

Для решения задачи может понадобиться 64-битый целочисленный тип данных. Пожалуйста, не забудьте использовать его в программе.

Выходные данные

Выведите «left» — если заданный рычаг отклонится влево, «right» — если он отклонится вправо и «balance» — если он будет находиться в состоянии равновесия.

Примечание

Для решения задачи полезно ознакомиться с устройством рычага по ссылке: http://ru.wikipedia.org/wiki/Рычаг.

Картинки к примерам из условия:

B. Задолженности

реализация *1300

Представьте себе, что в вашей дружеской компании три человека: A, B и С. При этом A должен B 20 рублей, а B должен C 20 рублей. Общая сумма задолженностей равна 40 рублей. Можно заметить, что задолженности в этом случае устроены не самым оптимальным образом. Перераспределим задолженности следующим образом: пусть A должен C 20 рублей, а B ничего никому не должен. Смысл задолженностей не изменился, а сумма всех задолженностей стала равна 20 рублей.

Эта задача обобщает описанный пример. Представьте, что в вашей дружеской компании n человек, и известны задолженности между людьми. Оптимизируйте заданные задолженности, не меняя их смысла. Другими словами в итоге для каждого человека разность того, сколько он должен отдать, и сколько он должен получить, должна сохраниться. Выведите минимальную сумму всех задолженностей в оптимальном распределении задолженностей. Посмотрите пояснение тестовых примеров для лучшего понимания задачи.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n ≤ 100; 0 ≤ m ≤ 104). В следующих m строках заданы задолженности. В i-ой строке записаны три целых числа ai, bi, ci (1 ≤ ai, bi ≤ nai ≠ bi; 1 ≤ ci ≤ 100), которые означают, что человек ai должен человеку bi ci рублей.

Считайте, что люди пронумерованы от 1 до n целыми числами.

Гарантируется, что одна и та же пара людей встречается во входных данных не более одного раза. Во входных данных не встречается одновременно пара людей (x, y) и пара людей (y, x).

Выходные данные

Выведите единственное целое число — минимальную сумму задолженностей в оптимальном распределении.

Примечание

В первом примере можно считать, что человек с номером 1 должен человеку с номером 2 8 рублей, человеку с номером 3 1 рубль и человеку с номером 4 1 рубль. Больше никто никому не должен. В итоге суммарная задолженность равна 10.

Во втором примере нет никаких задолженностей.

В третьем примере можно аннулировать все задолженности.

B. Полуфиналы

реализация сортировки *1300

В турнире по бегу только что прошли два полуфинала. В каждом полуфинале участвовало n человек. В финал проходят n человек, определяемых следующим образом: из каждого полуфинала выбираются k человек (0 ≤ 2k ≤ n), показавших наилучший результат в своем полуфинале, а все остальные места в финале достаются тем, кто не попал в первые k в своем полуфинале, но попал в число n - 2k лучших среди остальных.

Организаторы турнира пока не определили число k, поэтому участники хотят знать, у кого еще остались шансы попасть в финал, а кому уже можно отправляться домой.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105) — количество участников в каждом полуфинале.

В следующих n строках записано по два целых числа ai и bi (1 ≤ ai, bi ≤ 109) — результаты i-ого участника (количество миллисекунд, за которое он пробежал дистанцию полуфинала) первого и второго полуфиналов соответственно. Все результаты различны. Последовательности a1, a2, ..., an и b1, b2, ..., bn упорядочены по возрастанию — в том порядке, в каком участники финишировали в соответствующем полуфинале.

Выходные данные

Выведите две строки, состоящие n символов, каждый из которых — «0» или «1». Первая строка должна соответствовать участникам первого полуфинала, а вторая — участникам второго полуфинала. i-ый символ в j-ой строке должен быть равен «1», если i-ый участник j-ого полуфинала имеет шансы пройти в финал, и «0» — иначе.

Примечание

Рассмотрим первый пример. В каждом полуфинале участвовало 4 человека. Результаты первого полуфинала — 9840, 9860, 9930, 10040. Результаты второго полуфинала — 9920, 9980, 10020, 10090.

  • В случае k = 0 финалисты определяются исключительно по времени, поэтому дальше пройдут спортсмены с результатами 9840, 9860, 9920 и 9930.
  • В случае k = 1 из обоих полуфиналов гарантированно проходят победители (с результатами 9840 и 9920), а оставшиеся места определяются по времени (эти места достанутся спортсменам, пробежавшим за 9860 и 9930 миллисекунд).
  • В случае k = 2 из обоих полуфиналов проходят по два первых места, это спортсмены с результатами 9840, 9860, 9920 и 9980 миллисекунд.

A. Новогодние свечки

реализация *1000

Программист Василий любит романтику — поэтому на этот Новый Год он решил освещать свою комнату свечами.

У Василия есть a свечей. Когда Василий зажигает новую свечу, сначала она горит ровно один час, а затем тухнет. Василий — сообразительный малый, поэтому из b потухших свечей он умеет получать одну новую свечу. В последствии эту новую свечу (так же как и другие новые свечи) можно зажечь.

Теперь Василию интересно, на сколько часов освещения хватит его свечек, если он будет действовать оптимальным образом. Помогите ему найти это число.

Входные данные

В единственной строке заданы два целых числа a и b (1 ≤ a ≤ 1000; 2 ≤ b ≤ 1000).

Выходные данные

Выведите единственное целое число — количество часов, которое Василий сможет освещать комнату.

Примечание

Рассмотрим первый тестовый пример. Первые четыре часа Василий будет зажигать свечи, которые изначально были новые, дальше из четырех потухших свечей он сделает две новые, которые в последствии зажжет. Когда эти две свечи прогорят (станут потухшими), можно будет из них сделать еще одну свечу. Итого, Василий сможет освещать комнату 7 часов.

B. Новогодний подарок

Конструктив реализация *1200

Совсем скоро начнется новый год. По этой причине большинство людей сегодня заняты подготовкой новогодних подарков. Программист Василий — не исключение.

Василий знает, что лучший подарок — это (нет, не контест) деньги. Он уже выложил в ряд слева направо n пустых кошельков и решил, сколько монеток в какой кошелек положить. В i-ый слева кошелек Василий решил положить ai монет.

Василий — человек очень занятой, поэтому монеты по кошелькам будет раскладывать его робот. Изначально робот стоит около самого левого кошелька в ряду. Робот умеет выполнять команды трех видов: перейти к кошельку, который находится слева от текущего (если такой имеется), перейти к кошельку, который находится справа от текущего (если такой имеется), положить монетку в текущий кошелек. В силу некоторых технических неполадок робот не может выполнить две команды вида «положить монетку» подряд.

Василий не может долго ждать, поэтому он хочет написать программу для робота, состоящую из не более 106 операций (не обязательно минимальную по длине), с помощью которой робот разложит монетки по кошелькам. Помогите ему.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 300) — количество кошельков. В следующей строке записаны n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 300).

Гарантируется, что хотя бы одно ai положительное.

Выходные данные

Выведите последовательность, состоящую из k (1 ≤ k ≤ 106) символов, каждый из которых равен: «L», «R» или «P». Каждый символ последовательности — это команда роботу. Символ «L» — команда перейти влево, символ «R» — команда перейти вправо, символ «P» — команда положить монетку. Не разрешается выходить за пределы последовательности кошельков. Другими словами, нельзя выполнять команду «L», стоя около кошелька 1, и нельзя выполнять команду «R», стоя около кошелька n.

В результате проделанных операций в i-ом слева кошельке должно лежать ровно ai монет. Если существует несколько ответов, разрешается вывести любой.

A. Армия

реализация *800

Система Вооруженных Сил Берляндии состоит из n званий, которые пронумерованы натуральными числами от 1 до n, где 1 — самое младшее звание, а n — самое старшее.

Чтобы дослужиться от звания номер i до звания номер i + 1, требуется ровно di лет. Получить некоторое звание i, не получив до этого все предыдущие i - 1 званий, невозможно.

Буквально только что Вася получил новое звание a, но он мечтает служить в звании b. Найдите, какое количество лет Васе еще нужно служить в армии Берляндии, чтобы осуществить свою мечту.

Входные данные

В первой строке входных данных находится целое число n (2 ≤ n ≤ 100). Во второй строке находятся n - 1 целых чисел di (1 ≤ di ≤ 100). В третьей строке входного файла находятся два целых числа a и b (1 ≤ a < b ≤ n). Числа в строках разделены пробелами.

Выходные данные

Выведите единственное число — количество лет, которое потребуется Васе, чтобы дослужиться от звания a до звания b.

B. Ладья, Конь... и снова Конь

математика Перебор реализация *1200

На стандартной шахматной доске 8 × 8 находятся две фигуры — ладья и конь. Известно, в каких позициях они расположены. Гарантируется, что ни одна из них не бьет другую.

Ваша задача — найти количество способов поставить на эту доску еще одного коня так, чтобы ни одна из трех фигур на доске не била никакую другую. Новую фигуру разрешается ставить только на свободную клетку.

Входные данные

Первая строка входных данных содержит описание положения ладьи на доске, которое представляет собой строку длины 2, где первый символ — это строчная буква латинского алфавита от a до h, а второй символ — цифра от 1 до 8. Вторая строка содержит описание положения коня в аналогичном формате. Гарантируется, что позиции не совпадают.

Выходные данные

Выведите одно число — искомое количество способов.

D. Архитектор Вася

реализация *1900

Однажды Вася играл в кубики. Все кубики в наборе имели правильную кубическую форму. Он был талантливым архитектором, но все равно башенка, которую он строил, постоянно разваливалась.

Рассмотрим процесс построения. Вася берет очередной кубик и кладет его сверху на уже построенную башенку так, что грани этого кубика параллельны граням ранее поставленных. Введем декартову систему координат на горизонтальной плоскости, на которую Вася ставит первый кубик. Тогда проекция i-ого кубика на эту плоскость представляет собой квадрат со сторонами, параллельными осям координат с противоположными углами в точках (xi, 1, yi, 1) и (xi, 2, yi, 2). Кубики отлиты из однородной пластмассы, масса кубика a × a × a составляет a3 грамм.

Гарантируется, что любой кубик, кроме первого, Вася кладет на предыдущий, то есть площадь пересечения верхней грани предыдущего и нижней грани очередного всегда положительна.

Мы (в том числе и Вася) живем в нормальном мире, где действуют законы физической статики. И поэтому, возможно, если положить очередной кубик, то башенка упадет под воздействием силы тяжести. Вася последовательно кладет кубики до тех пор, пока хотя бы один кубик не выйдет из устойчивого состояния и не упадет вниз. Если это происходит, то Вася расстраивается и заканчивает строительство. Выведите количество кубиков в максимальной устойчивой башенке, то есть максимальное число m такое, что все башенки из кубиков 1, 2, ..., k для всех целых k от 1 до m являются устойчивыми.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 100) — количество кубиков. В следующих n строках записаны по четыре числа xi, 1, yi, 1, xi, 2, yi, 2 (xi, 1 ≠ xi, 2, |xi, 1 - xi, 2| = |yi, 1 - yi, 2|) — координаты противоположных углов основания i-ого кубика. Координаты — это целые числа, по абсолютной величине не превосходящие 50.

Кубики заданы в том порядке, в котором Вася их ставит. Гарантируется, что площадь пересечения верхней грани кубика номер i - 1 и нижней грани кубика i строго больше нуля для всех i ≥ 2.

Выходные данные

Выведите количество кубиков в максимальной устойчивой башенке.

B. Сережа и дерево

графы реализация *2400

Сережа очень любит деревья. Сегодня он придумал совершенно новый вид корневых бинарных деревьев.

Новое дерево состоит из n уровней, а каждая вершина проиндексирована двумя целыми числами: номером уровня и номером вершины на текущем уровне. Корень дерева находится на уровне 1 и имеет индекс (1, 1). Далее следует псевдокод построения дерева.


//глобальные данные - целочисленные массивы cnt[], left[][], right[][]

cnt[1] = 1;
заполнить массивы left[][], right[][] значениями -1;
for(level = 1; level < n; level = level + 1){
cnt[level + 1] = 0;
for(position = 1; position <= cnt[level]; position = position + 1){
if(значение position является степенью двойки){ // то есть 1, 2, 4, 8...
left[level][position] = cnt[level + 1] + 1;
right[level][position] = cnt[level + 1] + 2;
cnt[level + 1] = cnt[level + 1] + 2;
}else{
right[level][position] = cnt[level + 1] + 1;
cnt[level + 1] = cnt[level + 1] + 1;
}
}
}

После выполнения псевдокода в ячейке cnt[level] хранится количество вершин на уровне level. В ячейке left[level][position] хранится номер вершины на уровне level + 1, которая является левым сыном вершины с индексом (level, position), или хранится -1, если левого сына у вершина нет. Аналогично, ячейка right[level][position] отвечает за правого сына. В примечаниях можно посмотреть, как выглядит дерево, для n = 4.

Сережа любит все усложнять, поэтому сначала Сережа построил дерево, а потом для каждой вершины дерева Сережа завел пустое множество A(level, position). Далее Сережа выполняет m операций. Каждая операция имеет один из двух следующих видов:

  • Формат операции «1 t l r x». Для всех вершин level, position (level = tl ≤ position ≤ r) добавить значение x в множество A(level, position).
  • Формат операции «2 t v». Для вершины level, position (level = t, position = v) найти объединение всех множеств вершин, находящихся в поддереве вершины (level, position). Вывести размер объединения этих множеств.

Помогите Сереже выполнить операции. В этой задаче считается, что множество содержит в себе различные элементы как std::set в C++.

Входные данные

Первая строка содержит целые числа n и m (1 ≤ n, m ≤ 7000).

Следующие m строк содержат описания операций. Операция первого типа задается пятью целыми числами: 1 t l r x (1 ≤ t ≤ n; 1 ≤ l ≤ r ≤ cnt[t]; 1 ≤ x ≤ 106). Операция второго типа задается тремя целыми числами: 2 t v (1 ≤ t ≤ n; 1 ≤ v ≤ cnt[t]).

Выходные данные

Для каждой операции второго типа выведите ответ в отдельной строке.

Примечание

Определения связанные с корневыми деревьями можно найти по ссылке http://ru.wikipedia.org/wiki/Дерево_(теория_графов).

Ниже нарисовано построенное дерево для n = 4.

A. Сережа и Дима

жадные алгоритмы реализация *800

Сережа и Дима играют в игру. Правила игры очень просты. Перед игроками лежат в ряд n карточек. На каждой карточке написано число, причем все числа на карточках различны. Игроки ходят по очереди, первый ходит Сережа. На свой ход можно забрать себе одну карточку: либо самую левую карточку из ряда, либо самую правую. Игра заканчивается, когда в ряду не осталось карточек. Выигрывает тот, у кого в конце игры сумма чисел на взятых карточках больше.

Сережа и Дима действуют жадно. На своем ходе, каждый из них из двух карточек выбирает ту, на которой написано большее число.

Инна — подруга Сережи и Димы. Она знает какую стратегию используют ребята, поэтому хочет по изначальному состоянию игры определить, какой в конце игры будет счет. Помогите ей.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000) — количество карточек на столе. Во второй строке через пробел перечислены числа, записанные на карточках, в порядке слева направо. Числа на карточках — различные целые числа от 1 до 1000.

Выходные данные

Выведите в единственной строке два целых числа. Первое число — это количество очков у Сережи в конце игры, второе — количество очков у Димы в конце игры.

Примечание

В первом тесте Сережа возьмет карточки с числами 10 и 2, таким образом сумма Сережи 12. Дима возьмет все остальные карточки с суммой 5.

B. Сережа и лесенка

жадные алгоритмы реализация сортировки *1100

Сережа очень любит последовательности целых чисел. В особенности он любит последовательности лесенки.

Последовательность a1, a2, ..., a|a| (|a| — длина последовательности) называется лесенкой, если существует такой индекс i (1 ≤ i ≤ |a|), что выполяется соотношение:

a1 < a2 < ... < ai - 1 < ai > ai + 1 > ... > a|a| - 1 > a|a|.

Например, последовательности [1, 2, 3, 2] и [4, 2] являются лесенками, а последовательность [3, 1, 2] — нет.

У Сережи есть m карточек с числами. Он хочет выложить некоторые карточки на стол в ряд, чтобы получилась последовательность лесенка. Какое максимальное количество карточек, ему удастся выложить на стол?

Входные данные

В первой строке записано целое m (1 ≤ m ≤ 105) — количество карточек у Сережи. Во второй строке записаны m целых чисел bi (1 ≤ bi ≤ 5000) — числа на карточках, которые есть у Сережи.

Выходные данные

В первой строке выведите количество карточек, которое удастся выложить на стол. Во второй строке выведите саму лесенку, которая получится.

A. Ксюша и чашечные весы

жадные алгоритмы реализация *1100

У Ксюши есть обыкновенные чашечные весы и несколько гирек одинаковой массы. Ксюша уже положила некоторые гирьки на весы, остальные гирьки пока лежат нетронутыми. Сейчас Ксюше интересно, можно ли положить все оставшиеся гирьки на весы так, чтобы весы были в состоянии равновесия.

Весы находятся в состоянии равновесия, если суммарная масса гирек на левой чаше равна суммарной массе гирек на правой чаше.

Входные данные

В первой строке задана непустая последовательность символов, описывающая весы. В этой последовательности заглавная латинская буква обозначает гирьку, а символ «|» обозначает разделитель (этот символ встречается в последовательности ровно один раз). Все гирьки, записанные в последовательности до символа разделителя, находятся изначально на левой чаше весов. Все гирьки, записанные в последовательности после символа разделителя, находятся изначально на правой чаше весов.

Во второй строке записана непустая последовательность заглавных латинских букв. Каждая заглавная буква обозначает гирьку, которая еще не используется.

Гарантируется, что все латинские буквы во входных данных различны. Гарантируется, что входные данные не содержат никаких лишних символов.

Выходные данные

Если нельзя выложить все гирьки на весы, чтобы весы были в равновесии — выведите строку «Impossible». Иначе выведите описание полученных весов в таком же формате, как и во входных данных.

Если существует несколько ответов, разрешается вывести любой.

C. Арифметическая прогрессия

реализация сортировки *1700

Все знают, что такое арифметическая прогрессия. На всякий случай напомним, что арифметической прогрессией называется такая последовательность чисел a1, a2, ..., an длины n, что выполняется условие:

a2 - a1 = a3 - a2 = a4 - a3 = ... = ai + 1 - ai = ... = an - an - 1.

Например, последовательности [1, 5], [10], [5, 4, 3] являются арифметическими прогрессиями, а последовательности [1, 3, 2], [1, 2, 4] — нет.

У Александра есть n карточек, на которых написаны целые числа. Артур хочет подарить Александру еще ровно одну карточку с числом, так, чтобы из полученных n + 1 карточек Александр мог выложить арифметическую прогрессию (Александр обязан использовать все свои карточки).

Артур уже купил карточку, но еще не написал число на ней. Помогите ему, выведите все целые числа, которые можно написать на карточке, чтобы описанное условие выполнялось.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество карточек. В следующей строке записана последовательность целых чисел — номера, записанные на карточках Александра. Номера — целые положительные числа, каждое из которых не больше 108.

Выходные данные

Если Артур может записать на карточку бесконечно много различных целых чисел, выведите в единственной строке -1.

Иначе выведите в первой строке количество целых чисел, которые подходят. Во второй строке выведите сами числа в порядке возрастания. Обратите внимание, что числа в ответе могут быть больше 108 или даже быть отрицательными (смотрите тестовые примеры).

D. Ксюша и пешки

графы Деревья поиск в глубину и подобное реализация *2200

У Ксюши есть шахматная доска размером n × m. На каждой клетке этой шахматной доски нарисован один из символов: «<», «>», «^», «v», «#». Клетки, на которых нарисован символ «#», Ксюша называет заблокированными. Известно, что все клетки шахматной доски, которые касаются ее границы, являются заблокированными.

Ксюша играет с двумя пешками на этой шахматной доске. Изначально она ставит пешки на шахматную доску. Причем в одной клетке шахматной доски в один момент времени могут стоять две пешки тогда и только тогда, когда эта клетка заблокированная. В других случаях две пешки не могут находиться в одной клетке. Игра начинается, когда Ксюша поставила пешки на доску. За один ход Ксюша перемещает каждую из пешек на соседнюю по стороне клетку в направлении стрелки, нарисованной на клетке, на которой стоит соответствующая пешка (если пешка стоит на «#», она не двигается). Считайте, что Ксюша двигает пешки одновременно (смотрите второй тестовый пример).

Конечно, Ксюша играет на очки. Как же посчитать очки за игру? Очень просто! Давайте посчитаем сколько перемещений совершила первая пешка и сколько вторая, просуммируем эти два числа — это и будет являться результирующим количеством очков игры.

Ксюше очень интересно, какое максимальное количество очков она может заработать (для этого одна должна оптимально разместить пешки в самом начале игры). Помогите ей, найдите это число.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 2000) — размеры доски. В каждой из следующих n строк записано по m символов — описание доски. Каждый символ — это один из символов: «<», «>», «^», «v», «#».

Гарантируется, что граничные клетки доски — это заблокированные клетки (с символом «#»).

Выходные данные

Если Ксюша может заработать бесконечно большое количество очков, выведите -1. Иначе выведите максимальное количество очков, которое она может заработать.

B. Вулканы

Бинарный поиск реализация сортировки *2500

Яхуб потерялся в огромной пустыне. Пустыня представляет собой квадратную матрицу размера n × n, каждая ячейка матрицы — это часть пустыни. Будем считать, что ячейка (i, j) — это ячейка на пересечении строки i и столбца j матрицы (1 ≤ i, j ≤ n). Из ячейки пустыни (i, j) Яхуб может пойти либо вниз, либо направо, то есть, в ячейку (i + 1, j), либо (i, j + 1).

Известно, что в m ячейках пустыни находятся вулканы. Конечно, Яхуб не может заходить на такие ячейки.

Изначально Яхуб стоит в ячейке (1, 1). Ему надо дойти до ячейки (n, n). Зная, что для единичного перехода из одной ячейки в другую Яхубу требуется ровно 1 секунда, найдите минимальное время, за которое он может прибыть в ячейку (n, n).

Входные данные

В первой строке содержатся два целых числа, n (1 ≤ n ≤ 109) и m (1 ≤ m ≤ 105). В каждой из следующих m строк содержится пара целых чисел, x и y (1 ≤ x, y ≤ n), обозначающих координаты вулканов.

Считайте, что строки матрицы пронумерованы от 1 до n сверху вниз, а столбы от 1 до n слева направо. Гарантируется, что в ячейке (1, 1) нет вулкана. Никакие два вулкана не находятся в одной позиции.

Выходные данные

Выведите единственное целое число, минимальное время, за которое Яхуб сможет прибыть в ячейку (n, n). Если решения не существует (Яхуб не может прийти в конечную ячейку), выведите -1.

Примечание

Рассмотрим первый тестовый пример. Один из возможных путей: (1, 1)  →  (1, 2)  →  (2, 2)  →  (2, 3)  →  (3, 3)  →  (3, 4)  →  (4, 4).

A. Кодер

реализация *800

Яхуб очень любит шахматы. Он даже изобрел новую шахматную фигуру под названием Кодер. Кодер может двигаться (и атаковать) на один шаг по горизонтали или вертикали. Точнее, если Кодер стоит в клетке (x, y), он может пойти на клетки (или атаковать их) (x + 1, y), (x–1, y), (x, y + 1) и (x, y–1).

Яхуб хочет знать, сколько Кодеров можно разместить на шахматной доске n × n, так, чтобы ни один Кодер не атаковал ни одного другого Кодера.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000).

Выходные данные

В первой строке выведите целое число, максимальное количество Кодеров, которых можно поставить на шахматную доску.

В каждой из следующих n строк выведите n символов — описание конфигурации Кодеров. В пустой ячейке выведите «.», а в ячейке с Кодером выведите «C».

Если есть несколько корректных ответов, выведите любой.

B. Мультизадачность

жадные алгоритмы реализация сортировки *1500

Яхуб хочет потренироваться делать несколько дел одновременно. Для этого он хочет одновременно отсортировать n массивов по m целых чисел.

Яхуб может выбрать пару различных индексов, i и j (1 ≤ i, j ≤ m, i ≠ j). Затем в каждом из n массивов значения в позициях с номерами i и j меняются местами, только если значение в позиции i строго больше значения в позиции j.

Яхуб хочет найти такой массив пар различных индексов, что если выполнить описанную операцию с каждой парой из массива, просматривая пары в порядке их следования в массиве, то все n массивов в итоге будут отсортированы по невозрастанию, или по неубыванию (требуемый порядок дан во входных данных). Размер массива пар не может быть больше (не больше пар). Помогите Яхубу, найдите любой подходящий массив пар.

Входные данные

В первой строке содержатся три целых числа n (1 ≤ n ≤ 1000), m (1 ≤ m ≤ 100) и k. Число k равно 0, если массивы надо отсортировать по возрастанию, и 1, если их надо отсортировать по убыванию. Каждая строка i из следующих n строк содержит m целых чисел, разделенных пробелом, обозначающих i-ый массив. Для каждого элемента x массива i выполняется условие: 1 ≤ x ≤ 106.

Выходные данные

В первой строке выведите целое число p — размер массива (p не больше ). В каждой из следующих p строк запишите два различных целых числа, i и j (1 ≤ i, j ≤ m, i ≠ j), обозначающих выбранные индексы.

Если правильных ответов несколько, можно вывести любой из них.

Примечание

Рассмотрим первый тестовый пример. После первой операции массивы принимают вид [1, 3, 2, 5, 4] и [1, 2, 3, 4, 5]. После второй операции массивы принимают вид [1, 2, 3, 5, 4] и [1, 2, 3, 4, 5]. После третьей операции они принимают вид [1, 2, 3, 4, 5] и [1, 2, 3, 4, 5].

A. Медведь и малина

жадные алгоритмы Перебор реализация *1000

Медведь решил запастись малиной на зиму. Хитрым образом он узнал, сколько килограммов малины будет стоить бочонок меда в каждый из следующих n дней. По данным медведя, в i-ый (1 ≤ i ≤ n) день один бочонок меда будет стоить xi килограмм малины.

К сожалению, у медведя нет ни бочонка меда, ни малины. В это же время, у медведя есть друг, который готов за c килограмм малины одолжить ему бочонок меда ровно на один день. Поэтому медведь придумал хитрый план. Он хочет выбрать некоторый день d (1 ≤ d < n), занять у друга в этот день бочонок меда и сразу же (в день d) продать его по курсу дня d. На следующий день (d + 1), медведь хочет купить новый бочонок меда по курсу текущего дня (ведь у него осталась малина от продажи прошлого бочонка) и сразу же (в день d + 1) отдать другу одолженный бочонок меда, а также c килограмм малины за аренду бочонка.

Медведь хочет привести в действие свой план не более одного раза, после чего уйти в спячку. Какое максимальное количество малины (в килограммах) он может заработать? Учтите, что если на каком-то этапе своего плана у медведя не хватает малины, то такой план медведь осуществлять не будет.

Входные данные

В первой строке записаны два целых числа n и c (2 ≤ n ≤ 100, 0 ≤ c ≤ 100), разделенных пробелом — количество дней и количество килограмм малины, которое медведь должен отдать за взятие бочонка в долг.

Во второй строке записаны n целых чисел x1, x2, ..., xn (0 ≤ xi ≤ 100), разделенных пробелом — стоимость бочонка меда в день i.

Выходные данные

Выведите одно целое число — ответ на задачу.

Примечание

В первом примере медведю выгодно взять в долг бочонок меда в 3 день и продать его за 7. На 4 день купить бочонок меда за 3 и отдать его другу. Полученная выгода равна (7 - 3 - 1) = 3.

В втором примере медведю выгодно взять в долг бочонок меда в 1 день и продать его за 100. На 2 день купить бочонок меда за 1. Полученная выгода равна (100 - 1 - 2) = 97.

B. Медведь и строки

жадные алгоритмы математика Перебор реализация Строки *1200

У медведя есть строка s = s1s2... s|s| (записью |s| обозначается длина строки), состоящая из строчных букв латинского алфавита. Медведь хочет посчитать количество таких пар индексов i, j (1 ≤ i ≤ j ≤ |s|), что строка x(i, j) = sisi + 1... sj содержит в себе хотя бы одну строку «bear» в качестве подстроки.

Строка x(i, j) содержит в себе строку «bear», если существует такой индекс k (i ≤ k ≤ j - 3), что sk = b, sk + 1 = e, sk + 2 = a, sk + 3 = r.

Помогите медведю справиться с поставленной задачей.

Входные данные

В первой строке записана непустая строка s (1 ≤ |s| ≤ 5000). Гарантируется, что строка состоит только из строчных букв латинского алфавита.

Выходные данные

Выведите одно целое число — ответ на задачу.

Примечание

В первом примере подходят следующие пары (i, j): (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9).

Во втором примере подходят следующие пары (i, j): (1,  4), (1,  5), (1,  6), (1,  7), (1,  8), (1,  9), (1,  10), (1,  11), (2,  10), (2,  11), (3,  10), (3,  11), (4,  10), (4,  11), (5,  10), (5,  11), (6,  10), (6,  11), (7,  10), (7,  11).

C. Медведь и простые числа

Бинарный поиск дп математика Перебор реализация Структуры данных теория чисел *1700

Недавно медведь начал изучать структуры данных и столкнулся со следующей задачей.

Задана последовательность целых чисел x1, x2, ..., xn длины n и m запросов, каждый из которых характеризуется двумя целыми числами li, ri. Обозначим за f(p) — количество таких индексов k, что xk делится на p. Ответом на запрос li, ri является сумма: , где S(li, ri) — множество простых чисел из отрезка [li, ri] (обе границы включаются в отрезок).

Помогите медведю справиться с этой задачей.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 106). Во второй строке записаны n целых чисел x1, x2, ..., xn (2 ≤ xi ≤ 107). Числа не обязательно различные.

В третьей строке записано целое число m (1 ≤ m ≤ 50000). В каждой из m следующих строк записана пара целых чисел через пробел li и ri (2 ≤ li ≤ ri ≤ 2·109) — числа, характеризующие текущий запрос.

Выходные данные

Выведите m целых чисел — ответы на запросы в порядке появления запросов во входных данных.

Примечание

Рассмотрим первый тестовый пример. Всего в первом примере 3 запроса.

  1. Поступает первый запрос l = 2, r = 11. Нужно посчитать f(2) + f(3) + f(5) + f(7) + f(11) = 2 + 1 + 4 + 2 + 0 = 9.
  2. Поступает второй запрос l = 3, r = 12. Нужно посчитать f(3) + f(5) + f(7) + f(11) = 1 + 4 + 2 + 0 = 7.
  3. Поступает третий запрос l = 4, r = 4. Так как на этом промежутке нет простых чисел, то сумма равна 0.

A. Аукцион второй цены

реализация *800

В этой задаче мы рассмотрим один из вариантов проведения аукциона, который носит название аукцион второй цены. Как и в любом аукционе, n участников стремятся приобрести выставляемый на аукцион товар, предлагая за него свои цены. Будем считать, что участники пронумерованы целыми числами от 1 до n. Аукцион является закрытым, то есть каждый участник тайно сообщает организатору аукциона цену, которую он готов заплатить за товар. После этого победителем аукциона становится участник, предложивший наибольшую цену. Однако уплачивает он не ту цену, которую предложил, а наибольшую цену среди предложенных другими участниками (отсюда и название — аукцион второй цены).

Напишите программу, которая по списку цен, предложенных участниками аукциона, определяет победителя аукциона и сумму, которую он заплатит за товар. Считайте, что все предложенные цены различны.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 1000) — количество участников аукциона. Вторая строка содержит n целых чисел p1, p2, ... pn, разделенных одиночными пробелами (1 ≤ pi ≤ 10000). Число pi означает цену, предложенную участником с номером i. Гарантируется, что все предложенные цены различны.

Выходные данные

В единственной строке выходного файла выведите два целых числа, разделенных пробелом: номер участника, победившего в аукционе, и сумму, которую он должен уплатить.

B. Халява лети!

Бинарный поиск Перебор реализация *1400

Все любят халяву. Студенты особенно.

Как известно, если в ночь перед экзаменом высунуться в раскрытое окно, открыть зачетку и громко трижды прокричать «Халява лети!», то прилетевшая халява поможет сдать предстоящий экзамен.

В ночь перед экзаменом по матанализу из окон студенческого общежития номер π n студентов прокричали заветные слова. Для каждого студента известен момент времени ti, в который он совершил таинство. Известно, что ti равно количеству секунд, прошедших с начала ночи.

Известно, что халява дама капризная и своенравная. В эту ночь халява была неподалеку от общежития в течение T секунд. Поэтому, если для двух студентов разность моментов времени совершения таинств больше T, то хотя бы к одному из них она точно не прилетит.

Так как все студенты оптимисты, им очень хочется знать, какое наибольшее количество человек может войти в группу счастливчиков.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100), где n — количество студентов, прокричавших «Халява лети!». Во второй строке содержится n целых положительных чисел ti (1 ≤ ti ≤ 1000). Последняя строка содержит целое число T (1 ≤ T ≤ 1000) — интервал времени, в течение которого халява была около общежития.

Выходные данные

Выведите единственное целое число — наибольшее количество человек, которые смогут войти в группу счастливчиков.

D. Игра с точками

графы дп кратчайшие пути реализация *2100

Представьте, что Вы играете в следующую игру. Имеется n точек, являющихся вершинами правильного n-угольника. Точки пронумерованы целыми числами от 1 до n. Каждая пара точек соединена отрезком некоторого цвета. Различных цветов не более 26, они обозначаются строчными латинскими буквами. В трех различных точках стоит по фишке. Все фишки одинаковые. За один ход Вы можете взять любую из фишек и передвинуть ее в другую точку. При этом цвет отрезка, по которому Вы можете передвинуть фишку, должен совпадать с цветом отрезка, соединяющего точки, в которых находятся две другие фишки. Нельзя перемещать фишку в точку, в которой уже находится другая фишка. Ваша задача состоит в том, чтобы за наименьшее количество ходов добиться того, чтобы фишки находились в точках с номерами 1, 2 и 3. Напишите программу, которая оптимальным образом играет в эту игру.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 70) — количество точек. Во второй строке записаны три различных целых числа от 1 до n — номера точек, в которых изначально находятся фишки. Каждая из следующих строк содержит по n символов — это матрица, задающая цвета отрезков. Цвета задаются строчными буквами латинского алфавита. Символ с номером j в i-й строке матрицы обозначает цвет отрезка между точками i и j. Матрица симметрична, то есть j-й символ i-й строки совпадает с i-м символом j-й строки. На главной диагонали матрицы стоят символы '*', потому что не существует отрезка, соединяющего точку саму с собой.

Выходные данные

Если не существует ни одной последовательности ходов, после которых фишки оказываются в точках с номерами 1, 2 и 3, выведите в единственной строке число -1. Если же решение существует, то в первой строке выведите наименьшее возможное количество ходов, а далее сами ходы. Для описания очередного хода в отдельной строке выведите два целых числа через пробел — номер точки, откуда следует взять фишку, и номер точки, куда ее следует передвинуть. Если оптимальных последовательностей ходов несколько, выведите любую из них.

Примечание

В первом примере мы можем передвинуть фишку из точки 4 в точку 1, потому что они соединены отрезком цвета 'a', как и точки 2 и 3, в которых находятся две другие фишки. После этого хода фишки находятся в точках 1, 2 и 3.

A. Георгий и сон

реализация *900

Георгий проснулся и увидел текущее время s на электронных часах. Кроме того, Георгий знает, что он спал в течение времени t.

Помогите Георгию! Напишите программу, которая по временам s и t определит время p, когда Георгий лег спать. Обратите внимание, что по отношению к текущему времени Георгий мог лечь спать вчера (смотрите второй тестовый пример).

Входные данные

В первой строке задано текущее время s в виде строки в формате «hh:mm». Во второй строке задано время t в формате «hh:mm» — продолжительность сна Георгия. Гарантируется, что входные данные содержат корректное время в 24-часовом формате, то есть 00 ≤ hh ≤ 23, 00 ≤ mm ≤ 59.

Выходные данные

В единственной строке выведите время p — время, когда Георгий лег спать, в формате аналогичном формату времени во входных данных.

Примечание

В первом примере Георгий лег спать в «00:06». Обратите внимание, что время нужно вывести именно в формате «00:06». Поэтому ответы «0:06», «00:6» и другие будут засчитаны как неверные.

Во втором примере Георгий лег спать вчера.

В третьем примере Георгий не спал совсем.

C. Георгий и число

жадные алгоритмы реализация *1700

Георгий — кот, поэтому он очень любит играть. Больше всего ему нравится играть с имеющимся у него массивом положительных целых чисел b. В процессе игры, Георгий изменяет массив специальными операциями. Обозначим текущий массив Георгия как b1, b2, ..., b|b| (запись |b| обозначает текущую длину массива). Тогда одна операция — это последовательность действий:

  • Выбрать два различных индекса i и j (1 ≤ i, j ≤ |b|; i ≠ j) таких, что bi ≥ bj.
  • Получить число v = concat(bi, bj), где concat(x, y) — число, полученное добавлением числа y в конец десятичной записи числа x. Например, concat(500, 10) = 50010, concat(2, 2) = 22.
  • Добавить в конец массива число v. Длина массива увеличится на один.
  • Удалить из массива элементы с индексами i и j. Длина массива уменьшается на два, а элементы перенумеровываются от 1 до текущей длины массива.

Георгий долго играл со своим массивом b и в итоге получил из него массив, состоящий из ровно одного числа p. Теперь Георгий хочет узнать: какое максимальное количество чисел мог содержать массив b первоначально? Помогите ему, найдите это число. Учтите, что первоначально массив мог содержать только положительные целые числа.

Входные данные

В первой строке входных данных задано ровно одно целое число p (1 ≤ p < 10100000). Гарантируется, что число p не содержит лидирующих нулей.

Выходные данные

Выведите целое число — какое максимальное количество элементов мог содержать массив b первоначально.

Примечание

Рассмотрим тестовые примеры:

  1. Изначально массив b мог быть равен {5, 9, 5, 5}. Последовательность операций, которую совершил Георгий, могла быть: {5, 9, 5, 5} → {5, 5, 95} → {95, 55} → {9555}.
  2. Изначально массив b мог быть равен {1000000000, 5}. Обратите внимание, в массиве b не может быть нулей.
  3. Изначально массив b мог быть равен {800, 10, 1}.
  4. Изначально массив b мог быть равен {45}. Он не мог быть равен {4, 5}, поскольку из этого массива за одну операцию можно получить только массив {54}.

Обратите внимание, что числа в результирующем массиве могут быть очень большими.

B. Лиса и минимальный путь

битмаски графы Конструктив математика реализация *1900

Лисица Сиель хочет сделать задачку программистам на контест. Задача звучит так: «Дан простой неориентированный граф, состоящий из n вершин. Каждое его ребро имеет длину 1. Надо посчитать количество кратчайших путей между вершиной 1 и вершиной 2».

Как и все авторы, она хочет, чтобы некоторые из выходных данных были особенными: например, ее день рождения или количество ее друзей. Можете ли вы помочь ей составить такой тест для задачи, чтобы ответ на него был ровно k?

Входные данные

В первой строке записано единственное целое число k (1 ≤ k ≤ 109).

Выходные данные

Выведите граф G с n вершинами (2 ≤ n ≤ 1000). Между вершинами графа 1 и 2 должно быть ровно k наикратчайших путей.

В первой строке должно быть записано целое число n. Затем надо вывести матрицу смежности графа G, состоящую из n строк и n столбцов. Каждый элемент матрицы должен равняться 'N' или 'Y'. Если Gij равняется 'Y', то граф G имеет ребро, соединяющее вершину i и вершину j. Считайте, что вершины графа пронумерованы от 1 до n.

Граф должен быть неориентированным и простым: должны выполняться условия Gii = 'N' и Gij = Gji. Также, должен быть хотя бы один путь между вершинами 1 и 2. Гарантируется, что ответ существует. Если есть несколько правильных ответов, можно вывести любой из них.

Примечание

В первом примере есть 2 кратчайших пути: 1-3-2 и 1-4-2.

Во втором примере есть 9 кратчайших путей: 1-3-6-2, 1-3-7-2, 1-3-8-2, 1-4-6-2, 1-4-7-2, 1-4-8-2, 1-5-6-2, 1-5-7-2, 1-5-8-2.

B. Лиса и крест

жадные алгоритмы реализация *1100

У лисы Сиель есть доска, расчерченная на n рядов и n колонок. Таким образом, доска состоит из n × n ячеек. Каждая ячейка содержит либо символ '.', либо символ '#'.

Крест на доске — это связное множество из ровно пяти клеток доски, которое выглядит как крест. Рисунок ниже показывает, как выглядит крест.

Сиель хочет нарисовать несколько (возможно, ноль) крестов на доске. Каждый крест должен состоять ровно из пяти клеток с символами '#', и каждая клетка с символом '#' должна принадлежать некоторому кресту. Ни одна клетка не может принадлежать двум крестам.

Пожалуйста, подскажите Сиель, может ли она нарисовать на доске кресты описанным способом.

Входные данные

В первой строке записано целое число n (3 ≤ n ≤ 100) — размер доски.

В каждой из следующих n строк содержится описание одного ряда доски. В i-ой строке записано описание i-ого ряда доски, состоящее из n символов. Каждый из них — это либо символ '.', либо символ '#'.

Выходные данные

Выведите единственную строку, содержащую слово "YES", если Сиель может нарисовать кресты так, как описано выше. В противном случае, выведите единственную строку, содержащую слово "NO".

Примечание

В первом примере можно нарисовать два креста. Рисунок ниже показывает, как они выглядят.

Во втором примере доска содержит 16 клеток с '#', но каждому кресту требуется 5 клеток. Так как 16 не кратно 5, лиса не сможет покрыть крестами все помеченные символом '#' клетки.

F. Лягушки-пацифисты

реализация *1300

С Дюймовочкой приключилась беда. Она оказалась на маленьком островке посреди болота и очень хочет выбраться на берег.

Выбраться из болота можно только по кочкам, которые расположены вдоль прямой линии, соединяющей островок с берегом. Будем считать, что кочки пронумерованы числами от 1 до n и номер кочки соответствует расстоянию в метрах от островка до нее. Расстояние от n-й кочки до берега тоже 1 метр.

Дюймовочка слишком маленькая, чтобы прыгать на такие расстояния. К счастью, ей предложила помощь семья лягушек, обитающих в болоте. Каждая из них согласна подвезти Дюймовочку, но Дюймовочка должна выбрать только одну лягушку. Любая лягушка имеет определенную длину прыжка. Если Дюймовочка согласится на помощь лягушки с длиной прыжка d, то лягушка прыгнет с островка на кочку с номером d, далее — на кочку с номером 2d, затем 3d, и так до тех пор, пока не выберется на берег (т.е. окажется дальше n-й кочки).

Однако есть еще одна проблема: в болоте также обитают комары. Сейчас у них тихий час, и они спят, разместившись на некоторых кочках. Если лягушка прыгнет на кочку с комаром, то она раздавит его. Встретившиеся Дюймовочке лягушки по своим убеждениям пацифисты, поэтому их сильно огорчит гибель любого комара. Помогите Дюймовочке выбрать такую лягушку, которая доставит ее на берег и при этом задавит как можно меньше комаров.

Входные данные

В первой строке заданы три целых числа n, m и k (1 ≤ n ≤ 109, 1 ≤ m, k ≤ 100) — количество кочек, лягушек и комаров соответственно. Во второй строке содержатся m целых чисел di (1 ≤ di ≤ 109) — длины прыжков лягушек. В третьей строке записаны k целых чисел — номера кочек, на которых спит каждый комар. На одной кочке может спать не более одного комара. Числа в строках разделены одиночными пробелами.

Выходные данные

В первой строке выведите количество лягушек, которые задавят наименьшее число комаров, во второй — их номера в порядке возрастания, разделенные пробелами. Лягушки номеруются числами от 1 до m в порядке задания длин их прыжков во входных данных.

G. Обратная функция

реализация *2400

Петя написал программу на C++, вычисляющую значение одной интересной функции f(n). Петя запустил программу при некотором значении n и отправился на кухню пить чай. О том, сколько времени работала программа, история умалчивает. Когда Петя вернулся, она уже закончила выполнение и выдала результат. Однако пока Петя пил чай, коварный вирус успел уничтожить входной файл, поэтому Петя не может восстановить, для какого значения n была запущена программа. Помогите Пете: реализуйте обратную функцию!

Основную часть программы представляет собой функция на C++ со следующим упрощенным синтаксисом:

  • function ::= int f(int n) {operatorSequence}
  • operatorSequence ::= operator | operator operatorSequence
  • operator ::= return arithmExpr; | if (logicalExpr) return arithmExpr;
  • logicalExpr ::= arithmExpr > arithmExpr | arithmExpr < arithmExpr | arithmExpr == arithmExpr
  • arithmExpr ::= sum
  • sum ::= product | sum + product | sum - product
  • product ::= multiplier | product * multiplier | product / multiplier
  • multiplier ::= n | number | f(arithmExpr)
  • number ::= 0|1|2|... |32767

Пробелы и переводы строк в operatorSequence — необязательны.

Таким образом, имеется функция, в теле которой встречается два вида операторов. Это оператор "return arithmExpr;", возвращающий в качестве значения функции значение арифметического выражения, и условный оператор "if (logicalExpr) return arithmExpr;", который возвращает значение арифметического выражения в том и только в том случае, когда выполняется логическое выражение. Гарантируется, что никакие другие конструкции языка C++: циклы, операторы присваивания, вложенные условные операторы и т.д. и другие переменные, кроме параметра n, в функции не используются. Все константы являются целыми числами из промежутка [0..32767].

Операторы выполняются последовательно. После того, как произойдет возврат функцией некоторого значения, остальные операторы в последовательности не выполняются. Арифметические выражения вычисляются с учетом стандартного приоритета операций. Это означает, что сначала вычисляются все произведения, входящие в сумму. При вычислении произведения операции умножения и деления выполняются слева направо. Затем происходит суммирование слагаемых, при этом сложение и вычитание тоже выполняются слева направо. Операции ">" (больше), "<" (меньше) и "==" (равно) тоже имеют стандартный смысл.

Теперь внимание! Программа компилируется с помощью разработанного берляндской компанией BerSoft 15-битного компилятора Berland C++, поэтому арифметические действия выполняются нестандартным образом. Сложение, вычитание и умножение выполняются по модулю 32768 (если при вычитании получается отрицательное число, то к нему прибавляется 32768 до тех пор, пока оно не окажется в промежутке [0..32767]). Деление "/" — это обычное целочисленное деление с отбрасыванием остатка.

Примеры арифметических действий:

Гарантируется, что при любом значении n от 0 до 32767 заданная функция выполняется корректно. Это означает, что:

1. Не происходит деления на 0.

2. При выполнении функции для значения n = N рекурсивные вызовы функции f могут роисходить только для значений параметра 0, 1, ..., N - 1. Следовательно, программа никогда не уходит в бесконечную рекурсию.

3. В итоге выполнения последовательности операторов обязательно происходит возврат значения функции.

Заметим, что в силу всех введенных ограничений значение, возвращаемое функцией f, не зависит ни от глобальных переменных, ни от порядка вычисления арифметических выражений в составе логического, ни от чего либо другого, кроме значения параметра n. Поэтому функцию f можно рассматривать как функцию в математическом смысле, т.е. как однозначное соответствие каждому значению n из промежутка [0..32767] значения f(n) из того же промежутка.

Вам дано значение f(n), нужно найти n. Если подходящих значений n несколько, требуется определить максимальное (из промежутка [0..32767]).

Входные данные

В первой строке содержится целое число f(n) из промежутка [0..32767]. В следующих строках содержится описание функции f. В описании могут встречаться дополнительные пробелы и переводы строки (см. примеры), которые, разумеется, не могут разрывать ключевые слова int, if, return и числа. Размер входных данных не превосходит 100 байт.

Выходные данные

Выведите единственное число — ответ на задачу. Если решения не существует, выведите "-1" (без кавычек).

H. Таблица умножения

реализация *1300

Петя изучает позиционные системы счисления. Он уже научился складывать и вычитать числа в системах счисления с различными основаниями и теперь перешел к более сложному действию — умножению. Для того, чтобы умножать большие числа, нужно сначала выучить таблицу умножения. К сожалению, во втором классе (а некоторые даже в первом) учат только таблицу умножения десятичных чисел. Помогите Пете построить таблицу умножения для чисел в системе счисления с основанием k.

Входные данные

В первой строке содержится единственное целое число k (2 ≤ k ≤ 10) — основание системы счисления.

Выходные данные

Выведите таблицу умножения для системы счисления с основанием k. Таблица должна содержать k - 1 строку и k - 1 столбец. Элемент на пересечении i-й строки и j-го столбца равен произведению чисел i и j в k-ичной системе счисления. Между числами в каждой строке может содержаться произвольное количество пробелов (в примерах лишние пробелы выведены для наглядности).

J. Проверка правописания

реализация Строки хэши *1500

Петя заметил, что когда он набирает текст на клавиатуре, у него часто нажимаются лишние клавиши и в словах возникают лишние буквы. Конечно же, система проверки правописания подчеркивает ему эти слова, ему приходится кликать на слово и выбирать правильный вариант. Пете надоело исправлять свои ошибки вручную, поэтому он решил реализовать функцию, которая сама будет вносить исправления. Петя начал с разбора наиболее часто встречающегося у него случая, когда из слова достаточно удалить одну букву, чтобы оно совпало с некоторым словом из словаря. Итак, Петя столкнулся с такой подзадачей: дано введенное слово и слово из словаря, нужно удалить из первого слова одну букву, чтобы получилось второе. И тогда перед Петей встал весьма нетривиальный вопрос: какую букву удалять?

Входные данные

Входные данные содержат две строки, состоящие из строчных латинских букв. Длина строк от 1 до 106 символов включительно, первая строка содержит ровно на 1 символ больше, чем вторая.

Выходные данные

В первой строке выведите количество позиций символов в первой строке, при удалении каждого из которых получается вторая строка. Во второй строке через пробел выведите сами позиции в порядке возрастания. Позиции нумеруются с 1. Если из первой строки невозможно получить вторую путем удаления одного символа, выведите одно число 0.

A. Инна и будильники

реализация

Инна очень любит спать, поэтому, чтобы проснуться, ей нужно целых n будильников. Представим, что комната Инны — это квадрат 100 × 100 с левым нижним углом в точке (0, 0), а правым верхним в точке (100, 100). Тогда будильники — это точки с целочисленными координатами в этом квадрате.

Наступило утро. Все n будильников в комнате Инны уже звонят, поэтому Инна очень хочет выключить их. Для этого Инна придумала занимательную игру:

  • Сначала Инна выбирает тип отрезков, которые она будет использовать в течение всей игры. Отрезки могут быть либо вертикальные, либо горизонтальные.
  • Затем Инна делает несколько ходов. За один ход Инна может нарисовать на плоскости отрезок любой длины, выбранного в начале игры типа (либо вертикальный, либо горизонтальный), тогда все будильники, находящиеся на этом отрезке выключатся. Игра заканчивается, когда выключены все будильники.

Инна очень хочет спать, поэтому ей надо расправиться с будильниками как можно скорее. Помогите ей, найдите минимальное количество ходов в игре, которое требуется для выключения всех будильников!

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 105) — количество будильников. Следующие n строк описывают будильники: i-ая строка содержит два целых числа xi, yi — координаты i-го будильника (0 ≤ xi, yi ≤ 100).

Заметьте, что в одной точке комнаты может лежать сколько угодно будильников, а также что будильники могут лежать на сторонах квадрата, обозначающего комнату.

Выходные данные

В единственной строке выведите целое число — минимальное количество отрезков, которые нужно будет нарисовать Инне, если она будет действовать оптимально.

Примечание

В первом примере Инна сначала выбирает тип «вертикальные отрезки», а затем рисует отрезки с концами: (0, 0), (0, 2); и, к примеру, (1, 0), (1, 1). Если она будет рисовать горизонтальные отрезки, понадобится как минимум 3 отрезка.

В третьем примере важно то, что Инна не имеет права менять тип отрезков во время игры. Поэтому ей потребуется либо 3 вертикальных, либо 3 горизонтальных отрезка, либо 3 вертикальных, чтобы закончить игру.

B. Инна, Дима и песня

реализация

Инна — замечательный пианист, а Дима — скромный гитарист. Недавно Дима написал песню, и ребята хотят сыграть ее вместе. Конечно, Сережа очень хочет послушать песню.

Песня — это последовательность нот. Каждую ноту Дима и Инна хотят сыграть одновременно. При этом i-ую ноту можно сыграть с громкостью v (1 ≤ v ≤ ai; v — целое) как на гитаре, так и на фортепиано. Для того, чтобы звук был гармоничным, суммарная громкость, с которой сыграли i-ую ноту на гитаре и на фортепиано, должна быть равна bi. Если Дима и Инна не могут сыграть ноту по описанным правилам, они ее пропускают, и радость Сережи уменьшается на 1. Если же Инна и Дима играют i-ую ноту с громкостями xi и yi (xi + yi = bi) соответственно, радость Сережи увеличивается на xi·yi.

Сережа только вернулся из университета, и сейчас его радость равна 0. Помогите Диме и Инне сыграть песню так, чтобы итоговая радость Сережи после прослушивания всей песни была как можно больше!

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 105) — количество нот в песне. Вторая строка содержит n целых чисел ai (1 ≤ ai ≤ 106). Третья строка содержит n целых чисел bi (1 ≤ bi ≤ 106).

Выходные данные

В единственной строке выведите целое число — максимально возможную радость Сережи после прослушивания песни.

Примечание

В первом примере Дима и Инна играют первые две ноты с громкостью 1 (1 + 1 = 2, условие выполняется), последнюю ноту нужно сыграть с громкостями 1 и 2. Суммарная радость Сережи равна: 1·1 + 1·1 + 1·2 = 4.

Во втором примере нет такой пары (x, y), что 1 ≤ x, y ≤ 2, x + y = 5, поэтому ребята пропускают ноту. Суммарная радость Сережи равна -1.

A. Генная инженерия

реализация

За решение этой задачи вы получите 3 балла.

Манао пытается создать генетический код для новой разновидности водорослей, чтобы эффективно производить горючее. Более конкретно, Манао работает с одной цепочкой ДНК, описывающей некоторый протеин. Цепочка ДНК записывается в виде строки, состоящей из символов 'A', 'T', 'G' и 'C'.

Манао определил, что, если цепочка ДНК содержит максимальную последовательность четной длины из идущих подряд идентичных нуклеотидов, то протеин является нефункциональным. Под максимальной понимается, что до и после этой последовательности нет нуклеотидов того же типа. Например, рассмотрим протеин, записываемый цепочкой ДНК «GTTAAAG». В нем можно выделить четыре максимальные последовательности идующих подряд идентичных нуклеотидов: «G», «TT», «AAA» и «G». Этот протеин нефункционален, так как последовательность «TT» имеет четную длину.

Манао собирается получить из имеющегося у него протеина функциональный протеин. Манао может вставлять в цепочку ДНК протеина дополнительные нуклеотиды — символы из множества {'A', 'T', 'G', 'C'}. Какое минимальное количество вставок потребуется Манао, чтобы протеин, описываемый заданной цепочкой ДНК, стал функциональным?

Входные данные

В единственной строке записана цепочка ДНК — последовательность из символов 'A', 'C', 'G', 'T', длина которой от 1 до 100, включительно.

В этой задаче нет подзадач. За ее решение вы получите 3 балла.

Выходные данные

Выведите единственное целое число — минимальное количество символов из множества {'A', 'T', 'G', 'C'}, которое нужно вставить в данную цепочку ДНК, чтобы каждая максимальная последовательность идентичных нуклеотидов в ней была нечетной длины.

Примечание

В первом примере достаточно вставить один нуклеотид любого типа между двумя 'T', чтобы вернуть функциональность протеина.

A. Счетные палочки

Перебор реализация

Когда новые ученики приходят в СУНЦ, их многому приходится учить заново. Иногда учителя (небезосновательно) говорят, что мы даже считать не умеем. Вот и решили наши учителя заново учить нас арифметике. А какой лучший способ научить детей складывать и вычитать? — Правильно, счетные палочки! И вот наше новое задание:

Выражением из счетных палочек называется выражение вида:

[ A палочек][знак +][B палочек][знак =][C палочек] (1 ≤ A, B, C).

Знак + состоит из двух пересекающихся палочек: одной вертикальной и одной горизонтальной. Знак = состоит из двух горизонтальных палочек. Выражение называется арифметически верным, если A + B = C.

Дано выражение вида A + B = C, выложенное счетными палочками. Нужно передвинуть не более одной палочки (можно ничего не передвигать) так, чтобы выражение стало арифметически верным. Обратите внимание, нельзя удалять палочки из выражения, а также нельзя перемещать палочки, которые относятся к знакам + и =.

С арифметикой у нас действительно не очень. Поможете нам?

Входные данные

В единственной строке находится исходное выражение. Гарантируется, что выражение имеет вид A + B = C, где 1 ≤ A, B, C ≤ 100.

Выходные данные

Если не существует способа так переложить палочку, что выражение станет верным, в единственной строке выведите «Impossible» (без кавычек). Если способ существует, выведите полученное выражение, следуйте формату выходных данных из тестовых примеров. Не выводите лишних пробельных символов.

Если существует несколько правильных ответов, выведите любой. Для лучшего понимания условия рекомендуется изучить тестовые примеры.

Примечание

В первом тестовом примере достаточно переложить палочку из последней группы палочек в первую.

Во втором тестовом примере нельзя переложить вертикальную палочку плюса во вторую группу палочек, получая таким образом вместо знака плюс знак минус.

Ответа на третий тестовый пример нету, потому что убирать палочки просто так нельзя.

В четвертом примере ничего не требуется перекладывать: исходное выражение и так арифметически корректное.

D. Физкультура и булочки

математика Перебор реализация

Учитель физкультуры СУНЦа тоже немного математик. Больше всего в математике он любит арифметические прогрессии. Именно поэтому учитель хочет, чтобы ученики, выстроенные по неубыванию роста, образовывали арифметическую прогрессию.

Для достижения своей цели учитель физкультуры заказал очень много волшебных булочек из столовой. Волшебные булочки бывают двух типов: когда ученик съедает одну волшебную булочку первого типа, его рост увеличивается на единицу; когда ученик съедает одну волшебную булочку второго типа, его рост уменьшается на единицу. Учитель физкультуры, как и положено, заботится о здоровье своих учеников, поэтому не хочет, чтобы они ели очень много булочек. Точнее, он хочет, чтобы максимальное количество булочек, съеденных некоторым учеником, было минимально.

Помогите учителю, найдите, какое максимальное количество булочек, придется съесть некоторому ученику для достижения цели учителя. Кроме того, найдите один из возможных вариантов достижения цели, а именно: рост самого низкого ученика в итоге и шаг результирующей прогрессии.

Входные данные

В первой строке содержится целое число n (2 ≤ n ≤ 103) — количество учеников. Во второй строке через пробел записаны n целых чисел — рост всех учеников. Рост одного ученика — это целое число, по модулю не превосходящее 104.

Выходные данные

В первой строке выведите максимальное количество булочек, съеденных некоторым учеником для достижения цели учителя. Во второй строке через пробел выведите два целых числа — рост самого низкого ученика в итоге и шаг прогрессии. Обратите внимание, что шаг прогрессии — неотрицательное число.

Если существует несколько верных ответов, разрешается вывести любой.

Примечание

В первом тестовом примере учителю нужно действовать следующим способом:

  • не кормить 1-го ученика, его рост останется равным -3;
  • накормить 2-го ученика двумя булочками первого типа, его рост станет равным -2;
  • накормить 3-го ученика двумя булочками первого типа, его рост станет равным 0;
  • накормить 4-го ученика двумя булочками первого типа, его рост станет равным -1;
  • накормить 5-го ученика двумя булочками второго типа, его рост станет равным 1.

Итого, когда ученики встанут в шеренгу по неубыванию роста получится прогрессия: -3, -2, -1, 0, 1. Минимальный рост ученика в прогрессии равен -3, шаг прогрессии равен 1. Ученик, который съел больше всего булочек, съел две булочки. То есть максимальное количество булочек, съеденных одним учеником равно 2.

A. О собственных точках отрезка

реализация

Товарищ Алексей поступил в университет города City N — столицы Берляндии. Алексей рассчитывал, что отец обеспечит ему квартиру в столице, однако, тот сказал, что пора сыну учиться самостоятельности. Так что живет теперь наш Алексей в университетской общаге.

В общаге есть ровно одна прямая сушилка длиной 100 сантиметров, на которой введена система координат: левый конец сушилки имеет координату 0, правый — координату 100. Всего в университете учатся n студентов. Деканат университета на время учебы дает в пользование студенту с номером i отрезок сушилки (li, ri). К сожалению, действия деканата совершенно не согласованы, поэтому выданные отрезки могут пересекаться. Из-за чего на одном участке сушилки могут сушиться несколько вещей разных людей.

Алексей не любит, когда до его вещей кто-то дотрагивается. Поэтому он заблаговременно хочет исключить любое соприкосновение его вещей с чужими. Помогите ему посчитать: на участки какой суммарной длины он может повесить свои вещи так, чтобы вещи никакого из (n - 1) оставшихся студентов не могли сушиться с вещами Алексея на этих участках? Учтите, что Алексей, как самый уважаемый студент, имеет номер 1.

Входные данные

В первой строке задано целое положительное число n (1 ≤ n ≤ 100). В (i + 1)-й строке заданы целые числа li и ri (0 ≤ li < ri ≤ 100) — границы соответствующего отрезка для студента с номером i.

Выходные данные

Выведите в одной строке единственное целое число k, равное сумме длин участков, на которых будет сушить вещи Алексей и не будет сушить никто из остальных студентов.

Примечание

Обратите внимание, что в данной задаче не имеет значения (так как ответом является длина) соприкасаются или нет вещи, лежащие на границах двух касающихся в точке отрезков (например, отрезков (0, 1) и (1, 2)).

В первом тестовом примере Алексей может сушить свои вещи на отрезке (0, 1). Тогда, его вещи не будут соприкасаться ни с вещами на отрезке (1, 6), ни с вещами на отрезке (2, 8). Длина отрезка (0, 1) равна 1.

Во втором тестовом примере Алексей может сушить свои вещи на двух отрезках (0, 1) и (5, 7). Суммарная длина этих отрезков равна 3.

B. О коррупции и числах

Конструктив математика реализация

Веселого берляндского абитуриента Алексея достала серая действительность, и он рьяно желает поступить в университет. Вузов нынче развелось очень много, поэтому глаза у Алексея разбегаются — ведь он еще не определился, какую профессию он хочет получить: в школе у него были плохие оценки по всем предметам, и только благодаря богатеньким родителям он смог получить аттестат.

Положение осложняется тем, что в каждом вузе определен размер добровольного пожертвования, которое новоявленный студент выплачивает при поступлении — ni берублей. При этом нельзя платить больше, чем ni, ведь тогда разница между выплаченной суммой и ni может быть расценена как взятка!

Каждый ректор носит фирменную одежду своего вуза. Поэтому в ее карманы не помещаются монеты номиналом больше, чем ri. Также ректор не носит в кармане монеты номиналом меньше li — ведь если все будут платить ему настолько мелкими монетами, то их скопится очень много, и карман порвется. Поэтому пожертвование можно выплачивать только монетами в x берублей, где li ≤ x ≤ ri (в Берляндии в обращении находятся монеты любого целого положительного номинала). При этом можно использовать монеты разных номиналов, а монеты одного и того же номинала можно использовать сколько угодно раз.

Алексей, впервые столкнувшись с такими порядками, был озадачен, ведь оказалось, что не во все вузы можно поступить! Алексей очень боится идти в армию (хоть он и давно хотел получить мундир зеленого цвета, но папа говорит, что в армии сына будут бить деды, а военные билеты в Берляндии не продаются), поэтому он хочет наверняка знать, в какие вузы он может поступить и поскорее выбрать свою альма матер.

Благодаря родителям, Алексей не ограничен в средствах и можно считать, что он имеет неограниченное количество монет каждого вида.

Другими словами, задано t запросов, каждый из которых содержит числа ni, li, ri. Для каждого запроса нужно ответить, можно ли набрать сумму ровно ni берублей, используя только монеты с целым номиналом от li до ri берублей. Можно использовать монеты разных номиналов. Монеты каждого номинала можно использовать сколько угодно раз.

Входные данные

В первой строке задано количество университетов t, (1 ≤ t ≤ 1000). В каждой из t следующих строк через пробел заданы три целых числа: ni, li, ri (1 ≤ ni, li, ri ≤ 109li ≤ ri).

Выходные данные

Для каждого запроса выведите на отдельной строке: «Yes», если Алексей может в него поступить или «No» в противном случае.

Примечание

Взнос в первый вуз можно оплатить двумя монетами: по одной номиналом 2 и 3 берубля. Взнос во второй университет оплатить не получится.

A. Карточки

Конструктив реализация

Пользователь ainta любит играть с карточками. У него есть a карточек с буквой «o» и b карточек с буквой «x». Играя, ainta выкладывает все карточки в ряд и затем считает, сколько очков он получит по следующей формуле:

  1. Изначально счет равняется 0.
  2. Для каждого блока последовательных букв «o» длины x счет увеличивается на x2.
  3. Для каждого блока последовательных букв «x» длины y счет уменьшается на y2.
 

Например, если a = 6, b = 3, а ainta расположил карточки в порядке, описанном строкой «ooxoooxxo», то счет равняется 22 - 12 + 32 - 22 + 12 = 9. Это потому что в ряду из карточек всего 5 блоков: «oo», «x», «ooo», «xx», «o».

Пользователь ainta любит большие числа, поэтому он хочет максимизировать счет, расположив карточки некоторым образом. Помогите ainta добиться максимально возможного счета. Обратите внимание, что он обязан выложить в ряд все свои карточки.

Входные данные

В первой строке через пробел записаны два целых числа a и b (0 ≤ a, b ≤ 105a + b ≥ 1) — количество карточек с «o» и количество карточек с «x».

Выходные данные

В первой строке выведите единственное целое число v — наибольший счет, которого может добиться ainta.

Во второй строке выведите a + b символов, описывающих оптимальный ряд карточек. Если k-ая карта в ряду содержит символ «o», то k-ый символ должен равняться «o». Если k-тая карта в ряду содержит «x», то k-ый символ должен равняться «x». Количество символов «o» должно равняться a, а количество символов «x» должно равняться b. Если есть несколько способов максимизировать v, выведите любой из них.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных целых чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.

A. Страницы

реализация

Пользователь ainta занимается созданием веб-сайта. Сегодня он разрабатывает навигацию по страницам сайта. Сайт ainta состоит из n страниц, пронумерованных целыми числами от 1 до n. Предположим, что сейчас посетитель сайта находится на p-ой странице, тогда навигация будет выглядеть следующим образом:

<< p - k p - k + 1 ... p - 1 (p) p + 1 ... p + k - 1 p + k >>

Когда посетитель кликает кнопку "<<", он переходит на страницу 1; когда посетитель кликает кнопку ">>", он переходит на страницу n. Если посетитель кликает некоторое число, он переходит на соответствующую страницу.

Чтобы навигация по сайту выглядела более презентабельно, требуется, чтобы выполнялись условия:

  • Если страница номер 1 отображается в навигации, то кнопку "<<" отображать не надо.
  • Если страница номер n отображается в навигации, то кнопку ">>" отображать не надо.
  • Если номер страницы меньше 1 или больше n, ее в навигации отображать не надо.
 

Вам заданы числа n, k, p. Помогите ainta, напишите программу, которая выведет строку навигации по заданным параметрам. Обратите внимание на тестовые примеры для лучшего понимания условия.

Входные данные

В первой и единственной строке содержатся три целых числа n, p, k (3 ≤ n ≤ 100; 1 ≤ p ≤ n; 1 ≤ k ≤ n)

Выходные данные

Выведите надлежащую строку навигации. Следуйте формату вывода из тестовых примеров.

C. Система регистрации

реализация Структуры данных хэши *1300

В скором времени в Берляндии откроется новая почтовая служба "Берляндеск". Администрация сайта хочет запустить свой проект как можно быстрее, поэтому они попросили Вас о помощи. Вам предлагается реализовать прототип системы регистрации сайта.

Система должна работать по следующему принципу. Каждый раз, когда новый пользователь хочет зарегистрироваться, он посылает системе запрос name со своим именем. Если данное имя не содержится в базе данных системы, то оно заносится туда и пользователю возвращается ответ OK, подтверждающий успешную регистрацию. Если же на сайте уже присутствует пользователь с именем name, то система формирует новое имя и выдает его пользователю в качестве подсказки, при этом подсказка также добавляется в базу данных. Новое имя формируется по следующему правилу. К name последовательно приписываются числа, начиная с единицы (name1, name2, ...), и среди них находят такое наименьшее i, что namei не содержится в базе данных сайта.

Входные данные

В первой строке входных данных задано число n (1 ≤ n ≤ 105). Следующие n строк содержат запросы к системе. Каждый запрос представляет собой непустую строку длиной не более 32 символов, состоящую только из строчных букв латинского алфавита.

Выходные данные

В выходных данных должно содержаться n строк — ответы системы на запросы: ОК в случае успешной регистрации, или подсказку с новым именем, если запрашиваемое уже занято.

A. Определите цвет

геометрия Конструктив математика реализация *1300

Недавно в результате боевых действий была повреждена главная достопримечательность Берляндии — волшебные часы. Пушечные ядра пробили несколько дырок в часах, поэтому жители обеспокоены ремонтом. Волшебные часы можно представить в виде бесконечной плоскости с декартовой системой координат, где начало координат соответствует центру часов. Часы были покрашены в два цвета, как показано на рисунке:

На рисунке показана лишь центральная часть часов. Эта раскраска продолжается до бесконечности естественным образом.

Ядра можно считать точками на плоскости. Требуется определить цвет области, которая была повреждена заданным ядром.

Нужно считать, что все точки, которые находятся на границе одной из областей, покрашены в черный цвет.

Входные данные

В первой и единственной строке записано два целых числа x и y — координаты дырки, пробитой ядром в часах. Каждое из чисел x и y не превосходит 1000 по модулю.

Выходные данные

Вывести искомый цвет.

Нужно считать, что все точки, расстояние от которых до начала координат целочисленное, покрашены в черный цвет.

C. Берляндская площадь

математика реализация *2300

В прошлом году в Берляндии была построена самая большая площадь в мире. Известно, что площадь можно представить как бесконечную плоскость с введенной декартовой системой координат. На этой площади было нарисовано два множества концентрических окружностей. Назовем (K, z)-множеством набор концентрических окружностей с радиусами 1, 2, ..., K и с центром в точке (z, 0). Так, на площади были нарисованы (N, x)-множество и (M, y)-множество. Требуется определить, на сколько частей эти множества поделили площадь.

Входные данные

В первой строке записаны целые числа N, x, M, y. (1 ≤ N, M ≤ 100000,  - 100000 ≤ x, y ≤ 100000, x ≠ y).

Выходные данные

Вывести искомое количество частей.

Примечание

Картинка к третьему примеру:

A. Инна и право выбора

реализация *1000

Выбор есть всегда! Поэтому сейчас, вместо обычных «крестики-нолики», Инна выбрала весьма необычную модификацию этой игры. Ниже описаны ее правила:

В игру играет один человек. Перед началом игры он выкладывает на стол в ряд 12 карточек. На каждой карточке нарисован символ: «X» или «O». Далее игрок выбирает два целых положительных числа a и b (a·b = 12), после чего он составляет таблицу размера a × b из выложенных на стол карточек следующим способом: первые b карточек образуют первую строчку таблицы, вторые b карточек — вторую строчку таблицы, и так далее, последние b карточек образуют последнюю (ее номер будет a) строчку таблицы. Игрок выигрывает, если в каком-то столбце таблицы на всех карточках нарисованы символы «X». Иначе игрок проигрывает.

Инна уже выложила 12 карточек на стол в ряд, но, к сожалению, она не знает какие числа a и b выбрать. Помогите ей выиграть игру: выведите все возможные варианты пар чисел a, b, которые она может выбрать, чтобы выиграть.

Входные данные

Первая строка входных данных содержит целое число t (1 ≤ t ≤ 100). Это число обозначает количество наборов тестовых данных во входных данных. Далее идет описание каждого из t тестов в отдельной строке.

Описание каждого теста — это строка, состоящая из 12 символов, каждый из которых либо «X», либо «O». Символ строки с номером i обозначает символ, записанный на i-й от начала карточке.

Выходные данные

Для каждого теста в отдельной строке выведите ответ на него. Первое число в строке должно обозначать количество различных способов выбрать пару a, b. Далее в строке должны идти сами пары в формате axb. Выводите пары в порядке возрастания первого параметра (a). Пары в строке разделяйте пробельными символами.

B. Инна и новая матрица конфет

Перебор расписания реализация *1200

Инна очень любит сладкое и игру «Матрица конфет». Сегодня она придумала новую игру — «Матрица конфет 2: перезагрузка».

Поле для новой игры представляет собой прямоугольную таблицу размера n × m. В каждой строке этой таблицы одна клетка занята фигуркой гномика, одна клетка занята конфеткой, остальные клетки строки свободны. Игра длится несколько ходов. На каждом ходе игрок должен выбрать все строки матрицы, в которых гномики не стоят в конфетах, и крикнуть: «Побежали!». После чего все гномики в выбранных строках начинают синхронно передвигаться вправо. За одну секунду каждый гномик шагает в соседнюю клетку, которая находится правее его текущей клетки. Передвижения продолжаются до тех пор пока не случится одно из событий:

  • какой-то гномик в одной из выбранных строк находится в самой правой клетке своей строки;
  • какой-то гномик в выбранных строках находится в клетке с конфетой.

Цель игры — сделать так, чтобы все гномики находились в клетках с конфетами.

Инна — большой молодец, ведь она придумала такую интересную игру. А как же вы? Ваша задача — сыграть в эту игру оптимальным образом. А именно, по заданному игровому полю сказать, какое минимальное количество ходов потребуется игроку, чтобы добиться цели игры.

Входные данные

Первая строка входных данных содержит два целых числа n и m (1 ≤ n ≤ 1000; 2 ≤ m ≤ 1000).

Следующие n строк содержат по m символов — поле для игры в «Матрица конфет 2: перезагрузка». Символ «*» обозначает свободную клеточку поля, символ «G» — фигурку гномика, а символ «S» — конфету. Других символов матрица не содержит. Гарантируется, что каждая строка содержит ровно один символ «G» и один символ «S».

Выходные данные

В единственной строке выведите целое число — минимальное количество ходов, необходимое для достижения цели игры, либо -1, если достичь ее на данном игровом поле невозможно.

C. Инна и гигантская матрица конфет

математика реализация *1500

Инна и Дима решили удивить Сережу и принесли воистину гигантскую матрицу конфет, большую даже для Сережи! Для удобства пронумеруем строки гигантской матрицы от 1 до n сверху вниз, а столбцы — от 1 до m слева направо. Ячейку на пересечении i-й строки и j-го столбца будем обозначать (i, j). Как и полагается, в некоторых ячейках гигантской матрицы конфет лежат конфеты. Всего в матрице p конфет: k-я конфета лежит в ячейке (xk, yk).

Время подходило к обеду, и Инна уже собиралась скушать p своих любимых сладостей из матрицы, как вдруг Сережа (по лишь ему одному известной причине) x раз повернул матрицу по часовой стрелке на 90 градусов, затем y раз выполнил горизонтальный поворот матрицы, а затем z раз повернул матрицу против часовой стрелки на 90 градусов. На рисунке ниже показано, как именно происходят повороты матрицы.

Инна очень сильно расстроилась, но тут Дима понял две вещи: конфеты не пострадали, и он помнит, в каких ячейках лежали любимые сладости Инны до странных действий Сережи. Помогите ребятам отыскать новые координаты в матрице конфет после преобразований, сделанных Сережей!

Входные данные

Первая строка входных данных содержит шесть целых чисел n, m, x, y, z, p (1 ≤ n, m ≤ 109; 0 ≤ x, y, z ≤ 109; 1 ≤ p ≤ 105).

Каждая из следующих p строк содержит по два целых числа xk, yk (1 ≤ xk ≤ n; 1 ≤ yk ≤ m) — изначальные координаты k-й конфеты. Две конфеты могут лежать в одной и той же ячейке.

Выходные данные

Для каждой из p сладостей в отдельной строке через пробел выведите ее новые координаты.

Примечание

Горизонтальный поворот — это отражение матрицы вдоль вертикальной оси. Чтобы лучше понять, что такое горизонтальный поворот, посмотрите на пример для матрицы:


QWER REWQ
ASDF -> FDSA
ZXCV VCXZ

A. Ваня и карточки

математика реализация *800

Ваня любит играть. У него даже есть специальный набор карточек для игр. На каждой карточке записано единственное целое число. Число на карточке может быть положительным, отрицательным и даже может быть равно нулю. Единственное ограничение: число на каждой карточке по модулю не превышает x.

Наташе не очень нравится, когда Ваня долго играет, поэтому она спрятала все его карточки. Ваня расстроился и начал искать их, но нашел только n карточек. Ваня любит баланс — ему хочется, чтобы сумма на всех найденных карточках была равна нулю. С другой стороны, он очень устал искать карточки. Помогите мальчику, скажите: какое минимальное количество карточек ему еще придется найти, чтобы сумма на всех найденных карточках была равна нулю?

Можете считать, что изначально у Вани было бесконечное количество карточек с каждым числом от  - x до x.

Входные данные

В первой строке записано два целых числа: n (1 ≤ n ≤ 1000) — количество уже найденных карточек, и x (1 ≤ x ≤ 1000) — максимальный модуль числа на карточке. Во второй строке через пробел перечислены n целых чисел — карточки с числами, которые удалось найти Ване. Гарантируется, что числа не превышают по модулю x.

Выходные данные

Выведите единственное целое число — ответ на задачу.

Примечание

В первом примере Ване предстоит найти одну карточку с числом -2.

Во втором примере Ваня должен найти две карточки с числом 2. Найти одну карточку у него никак не получится, так как числа на потерянных карточках не превосходят по модулю 3.

B. Сережа и контесты

жадные алгоритмы математика реализация *1200

Сережа — программист, поэтому он очень любит участвовать в раундах Codesorfes. Но поскольку в Ужляндии интернет не очень хороший, иногда Сережа пропускает раунды.

На Codesorfes бывают раунды двух типов: Div1 (для более опытных участников) и Div2 (для новичков). Иногда два раунда Div1 и Div2 проводятся синхронно (при этом Div1 раунды не проводятся без Div2), в остальных случаях раунды не пересекаются по времени. Каждый раунд имеет свой уникальный идентификатор — целое положительное число. Раунды нумеруются идентификаторами последовательно (без пропусков) по времени проведения. Идентификаторы раундов, которые проводятся синхронно, отличаются на единицу, при этом идентификатор Div1 раунда всегда больше.

Сережа — новичок, он может участвовать только в раундах типа Div2. На данный момент он участвует в Div2 раунде, идентификатор которого равен x. Сережа точно помнит, что он участвовал в ровно k раундах до этого раунда. Также он помнит все идентификаторы раундов, в которых он участвовал, и раундов, которые шли синхронно с последними. Про пропущенные раунды Сережа не помнит ровным счетом ничего.

Сережа очень хочет знать, какое минимальное и какое максимальное количество Div2 раундов он мог пропустить? Помогите ему найти эти два числа.

Входные данные

В первой строке записано два целых числа: x (1 ≤ x ≤ 4000) — раунд, в котором сейчас участвует Сережа, и k (0 ≤ k < 4000) — количество раундов, в которых он участвовал ранее.

Ниже в k строках даны описания раундов, в которых Сережа участвовал ранее. Если Сережа участвовал в синхронном раунде, то соответствующая строка имеет вид: «1 num2 num1» (где num2 — идентификатор этого Div2 раунда, num1 — идентификатор синхронного Div1 раунда). Гарантируется, что num1 - num2 = 1. Если Сережа участвовал в обычном Div2 раунде, то соответствующая строка имеет вид: «2 num» (где num — идентификатор этого Div2 раунда). Гарантируется, что номера всех заданных раундов меньше x.

Выходные данные

Выведите в единственной строке два целых числа — минимальное и максимальное количество раундов, которые Сережа мог пропустить.

Примечание

Во втором примере Сережа ничего не знает про раунды с идентификаторами: 1, 6, 7. Минимальное количество раундов, которое мог пропустить Сережа, равно 2. В этом случае, раунд с идентификатором 1 будет обычным Div2 раундом, а раунд с идентификатором 6 будет синхронным с Div1 раундом.

Максимальное количество раундов равно 3. В этом случае все свободные идентификаторы принадлежат обычным Div2 раундам.

C. Команда

жадные алгоритмы Конструктив реализация *1400

Вот и подошел черед олимпиад. Ваня и Егор решили создать свою команду для участия в олимпиаде по программированию. Поскольку они с первого класса вместе, есть надежда, что это хоть как-то поможет ребятам в командной работе.

На каждую командную олимпиаду Ваня берет свои игровые карточки с числами. Он берет карточки исключительно с числами 1 и 0. Ребята — очень суеверны. Они считают, что олимпиада будет для них успешной, если перед ее началом можно разложить все карточки в ряд таким образом, чтобы:

  • не существовало пары соседних в ряду карточек с нулями;
  • не существовало тройки карточек, лежащих подряд, на которых записаны единицы.

Сегодня Ваня принес n карточек с нулями и m карточек с единицами. Карточек оказалось так много, что ребята не знают: можно ли разложить все эти карточки описанным способом или нет. Помогите им найти требуемое расположение карточек, или сообщите ребятам, что это невозможно.

Входные данные

В первой строке записано два целых числа: n (1 ≤ n ≤ 106) — количество карточек с числом 0; m (1 ≤ m ≤ 106) — количество карточек с числом 1.

Выходные данные

В единственной строке выведите требуемую последовательность из единичек и нулей без пробелов. Если же такую последовательность получить невозможно, выведите -1.

B. Деревья в ряду

Перебор реализация *1400

В саду королевы Англии растут n деревьев, выстроенных в ряд. Причем i(1 ≤ i ≤ n) слева дерево имеет высоту ai метров. Сегодня королева решила обновить виды своего сада. Она хочет, чтобы для высот деревьев выполнялось условие: для всех i (1 ≤ i < n), ai + 1 - ai = k, где k — выдуманное королевой число.

К сожалению, у королевского садовника не тысяча рук, и он не может выполнить желание королевы моментально! За одну минуту садовник может либо уменьшить высоту некоторого дерева до любой целой положительной высоты, либо увеличить высоту некоторого дерева до любой целой положительной высоты. Как нужно действовать королевскому садовнику, чтобы выполнить прихоть его величества за минимальное количество минут?

Входные данные

В первой строке заданы два целых числа через пробел: n, k (1 ≤ n, k ≤ 1000). Во второй строке задано n целых чисел через пробел a1, a2, ..., an (1 ≤ ai ≤ 1000) — высоты деревьев в ряду.

Выходные данные

В первой строке выведите единственное число p — минимальное количество минут, которое потребуется садовнику. В следующих p строках выведите описание его действий.

Если садовнику требуется увеличить высоту j-го (1 ≤ j ≤ n) слева дерева на x (x ≥ 1) метров, то в соответствующей строке выведите «+ j x». Если садовнику требуется уменьшить высоту j-го (1 ≤ j ≤ n) слева дерева на x (x ≥ 1) метров, то в соответствующей строке выведите «- j x».

Если существует несколько способов сделать ряд из деревьев красивым за минимальное количество действий, разрешается вывести любой.

E. Два корневых дерева

Деревья реализация Структуры данных *2900

У вас есть два корневых неориентированных дерева, каждое из которых содержит по n вершин. Пронумеруем вершины каждого дерева целыми числами от 1 до n. Корень каждого дерева находится в вершине 1. Ребра первого дерева окрашены в синий цвет, ребра второго — в красный цвет. Для удобства будем говорить, что первое дерево — синее, а второе — красное.

Ребро {x, y} называется плохим для ребра {p, q} если выполнены два условия:

  1. Цвет ребра {x, y} отличен от цвета ребра {p, q}.
  2. Рассмотрим дерево того же цвета, что и ребро {p, q}. Ровно одна из вершин x, y лежит как в поддереве вершины p, так и в поддереве вершины q.

В этой задаче вам нужно промоделировать процесс, который описан далее. Процесс состоит из нескольких этапов:

  1. На каждом этапе удаляются ребра ровно одного цвета.
  2. На первом этапе удаляется ровно одно синее ребро.
  3. Пусть на этапе с номером i были удалены ребра {u1, v1}, {u2, v2}, ..., {uk, vk}. Тогда на этапе с номером i + 1 будут удалены все еще не удаленные плохие ребра для ребра {u1, v1}, затем все еще не удаленные плохие ребра для ребра {u2, v2}, и так далее до ребра {uk, vk}.

Для каждого этапа удаления ребер определите, какие ребра будут удалены на данном этапе. Обратите внимание, что в определении плохого ребра всегда рассматривается изначальное дерево — дерево, в котором еще не удалено ни одно ребро.

Входные данные

В первой строке задано целое число n (2 ≤ n ≤ 2·105) — количество вершин в каждом дереве.

В следующей строке задано n - 1 целое положительное число a2, a3, a4, ..., an (1 ≤ ai ≤ nai ≠ i) — описание ребер первого дерева. Число ai означает, что в первом дереве имеется ребро, соединяющее вершину ai и вершину i.

В следующей строке задано n - 1 целое положительное число b2, b3, b4, ..., bn (1 ≤ bi ≤ nbi ≠ i) — описание ребер второго дерева. Число bi означает, что во втором дереве имеется ребро, соединяющее вершину bi и вершину i.

В следующей строке задано целое число idx (1 ≤ idx < n) — индекс синего ребра, которое было удалено на первом этапе. Считайте, что ребра каждого дерева пронумерованы числами от 1 до n - 1 в том порядке, в котором они заданы во входных данных.

Выходные данные

Для каждого этапа удаления ребер выведите его описание. Каждое описание должно состоять ровно из двух строк. Если на данном этапе будет происходить удаление синих ребер, тогда в первой строке описания этапа должно содержаться слово Blue, иначе слово Red. Во второй строке выведите индексы ребер, которые будут удалены на данном этапе, в порядке возрастания.

Примечание

Для удобства представим, что все ребра корневого дерева получили некоторое направление, причем так, что все вершины достижимы из вершины с номером 1. Тогда поддеревом вершины v будем называть множество вершин, достижимых из вершины с номером v в полученном ориентированном графе (сама вершина v тоже входит в это множество).

A. Валера и X

реализация *1000

Валера — маленький мальчик. Вчера ему задали в школе огромное домашнее задание по математике, поэтому Валера не успел как следует выучить английский алфавит к уроку английского языка. К сожалению, учитель английского языка решил устроить контрольную по алфавиту сегодня. На контрольной Валере достался квадратный лист клетчатой бумаги. Длина стороны была равна n клеточек (n — нечетное число), а в каждой клеточке была записана некоторая маленькая буква английского алфавита.

Валере требуется определить: образуют ли все буквы, записанные на листочке, букву «X» (ИКС)? Учитель Валеры считает, что буквы на листочке образуют ИКС, если:

  • на обеих диагоналях квадратного листочка все буквы одинаковые;
  • во всех других клетках листочка (они находятся не на диагоналях) записана одна и та же буква; причем эта буква не должна совпадать с буквами на диагоналях.

Помогите Валере, напишите программу, которая выполнит описанное задание за него.

Входные данные

В первой строке записано целое число n (3 ≤ n < 300; n — нечетное). В каждой из n следующих строк записано по n маленьких букв английского алфавита — описание листочка Валеры.

Выходные данные

Выведите строку «YES», если буквы на листочке образуют букву «X». Иначе, выведите строку «NO». Строки выводите без кавычек.

B. Марафон

математика реализация *1500

Валера участвует в берляндском марафоне. Забег проходит на стадионе, который можно изобразить на плоскости как квадрат, левый нижний угол которого расположен в точке с координатами (0, 0), а длина стороны равна a метров. Стороны квадрата параллельны осям координат.

Так как дистанция марафона очень большая, Валере требуется дополнительное питание по ходу дистанции. Тренер подает Валере бутылку с питанием через каждые пройденные d метров. Известно, что Валера стартует в точке с координатами (0, 0) и бежит против часовой стрелки, то есть, когда Валера пробежит a метров, он окажется в точке с координатами (a, 0). Также известно, что дистанция забега равна nd + 0.5 метров.

Помогите тренеру Валеры определить, где он должен находиться, чтобы помочь своему подопечному. А именно, в точках с какими координатами окажется Валера, пробежав d, 2·d, ..., n·d метров.

Входные данные

В первой строке через пробел записаны два вещественных числа a и d (1 ≤ a, d ≤ 105), заданных с точностью до 4 десятичных знаков после точки. Число a обозначает длину стороны квадрата, описывающего стадион. Число d обозначает, что через каждые d метров Валера получает дополнительное питание.

Во второй строке записано целое число n (1 ≤ n ≤ 105), обозначающее, что Валере потребуется дополнительное питание n раз.

Выходные данные

Выведите n строк, в каждой из которых по два вещественных числа xi и yi, разделенных пробелом. Числа xi и yi в i-ой строке обозначают, что Валера окажется в точке с координатами (xi, yi) после того как пробежит i·d метров. Ваше решение будет считаться правильным, если абсолютная или относительная погрешность не будет превышать 10 - 4.

В этой задаче достаточно много выходных данных, пожалуйста, не используйте поток cout для вывода в этой задаче.

D. Сапер 1D

дп реализация *1900

Игра «Сапер 1D» проходит на клетчатой полоске высотой в 1 клетку и шириной в n клеток. В некоторых из этих клеток находятся бомбы. Если в клетке бомбы нет, то в ней записано число от 0 до 2 — суммарное количество бомб в соседних клетках.

Например, корректное поле для игры может выглядеть так: 001*2***101*. Клетки, которые помечены символом «*», содержат бомбы. Обратите внимание, что на корректном поле числа обозначают количество бомб в соседних клетках. Например, поле 2* — некорректное, потому что у клетки с числом 2 должно быть две соседние клетки с бомбой.

Валера хочет создать корректное поле для игры в «Сапер 1D». Он уже нарисовал клетчатую полоску шириной в n клеток, разместил на поле несколько бомб и записал числа в некоторые клетки. Теперь его интересует, сколько существует способов так заполнить оставшиеся клетки бомбами или числами, чтобы получилось корректное поле.

Входные данные

В первой строке записана последовательность символов без пробелов s1s2... sn (1 ≤ n ≤ 106), содержащая только символы «*», «?» и цифры «0», «1» или «2». Если символ si равен «*», то i-я клетка поля содержит бомбу. Если символ si равен «?», значит Валера еще не решил, что будет находиться в i-й клетке. Символ si, являющийся цифрой, обозначает цифру, записанную в i-й клетке.

Выходные данные

Выведите одно число — количество способов, которыми Валера может заполнить свободные клетки, получив при этом корректное поле.

Так как ответ может быть очень большим, выведите его по модулю 1000000007 (109 + 7).

Примечание

В первом тестовом примере можно получить следующие корректные поля: 001**1, 001***, 001*2*, 001*10.

E. Лабиринт 1D

Бинарный поиск жадные алгоритмы реализация *2200

У Валеры есть бесконечная в обе стороны полоска, состоящая из клеток. Клетки пронумерованы целыми числами. В клетке с номером 0 стоит робот.

У робота есть инструкция — последовательность ходов, которые он должен совершить. За один ход робот перемещается на одну клетку влево или вправо, согласно инструкции. До начала движения робота Валера размещает препятствия в каких-то клетках полоски, исключая клетку с номером 0. Если в какой-то из ходов робот по инструкции должен пойти в клетку с препятствием, то он пропускает этот ход.

Кроме того Валера указывает номер финишной клетки, в которой робот должен оказаться после выполнения всей инструкции. Финишная клетка должна быть отлична от стартовой. Считается, что робот успешно выполнил инструкцию, если в процессе ее выполнения он посетил финишную клетку ровно один раз — своим последним ходом. Причем, последний ход не должен быть пропущен.

Предположим, что минимальное количество препятствий, которое необходимо поставить Валере, чтобы робот смог выполнить всю последовательность ходов и оказаться в какой-то финишной клетке равно k. Вам требуется посчитать, сколькими способами Валера может выбрать k препятствий и финишную клетку так, чтобы робот смог успешно выполнить инструкцию.

Входные данные

В первой строке записана последовательность символов без пробелов s1s2... sn (1 ≤ n ≤ 106), состоящая только из букв «L» и «R». Если символ si равен «L», то робот на i-м ходу должен попробовать переместиться на одну клетку влево. Если символ si равен «R», то робот на i-м ходу должен попробовать переместиться на одну клетку вправо.

Выходные данные

Выведите целое число — требуемое количество способов. Гарантируется, что это число помещается в 64-битном знаковом целочисленном типе данных.

Примечание

В первом примере Валера не должен ставить никаких препятствий, а в качестве финишной клетки выбрать клетку с номером 2.

Во втором примере Валере необходимо поставить препятствие в клетку с номером 1, а финишной клеткой назначить клетку с номером  - 1. В этом случае он пропустит первые два хода, а на третьем сразу перейдет из своей стартовой клетки в финишную. Если же Валера не поставит никаких препятствий, или поставит препятствие в другую клетку, то он посетит финишную клетку более одного раза.

A. Переключение гравитации

жадные алгоритмы реализация сортировки *900

Маленький Крис скучает на занятиях по физике (слишком просто), поэтому он смастерил необычную коробку для игрушек, чтобы занять себя. Необычность коробки заключается в том, что она может изменять гравитацию!

В коробке находятся n столбиков игрушечных кубиков, расположенных в ряд: i-й столбик состоит из ai кубиков. Изначально гравитация в коробке тянет все кубики вниз. Когда Крис переключает гравитацию, она начинает тянуть все кубики к правой стенке коробки. Рисунок показывает начальное и конечное расположение кубиков в коробке: кубики, изменившие свои позиции, выделены оранжевым цветом.

Вам дано изначальное расположение игрушечных кубиков в коробке. Найдите количество кубиков в каждом из n столбиков после переключения гравитации!

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 100), количество столбиков в коробке. В следующей строке записано n целых чисел через пробел: i-е число ai (1 ≤ ai ≤ 100) обозначает количество кубиков в i-м столбике.

Выходные данные

Выведите n целых чисел через пробел: i-е число должно обозначать количество кубиков в i-м столбике после переключения гравитации.

Примечание

Первый тестовый пример изображен на рисунке. Верхний кубик первого столбика падает на верх последнего столбика; верхний кубик второго столбика падает на верх третьего столбика; средний кубик первого столбика падает на верх второго столбика.

Во втором тестовом примере переключение гравитации не меняет высоты столбиков.

C. Необычное произведение

математика реализация *1600

Маленький Крис — большой любитель линейной алгебры. На этот раз в его домашней работе идет речь о необычном квадрате квадратной матрицы.

Скалярное произведение двух целочисленных векторов x и y размера n — это сумма произведений соответствующих координат этих векторов. Необычный квадрат квадратной матрицы A размера n × n определяется как сумма n скалярных произведений: i-е из них — это скалярное произведение вектора i-й строки на вектор i-го столбца матрицы A.

К счастью для Криса, все арифметические операции нужно производить в поле GF(2)! Это значит, что все операции (сложение, умножение) вычисляются по модулю 2. В таком случае можно считать, что матрица A двоичная: каждый элемент A равен либо 0, либо 1. Например, рассмотрим следующую матрицу A:

Необычный квадрат A в данном случае равен (1·1 + 1·0 + 1·1) + (0·1 + 1·1 + 1·0) + (1·1 + 0·1 + 0·0) = 0 + 1 + 1 = 0.

Однако, это еще далеко не вся домашняя работа. Крису требуется обработать q запросов; каждый запрос может быть одним из следующих:

  1. дан номер строки i, выполните флип всех элементов в i-й строке A;
  2. дан номер столбца i, выполните флип всех элементов в i-м столбце A;
  3. вычислите необычный квадрат A.

Применить операцию флип к элементу w — значит, изменить его на 1 - w (1 меняется на 0, а 0 меняется на 1).

По заданной матрице A и всем запросам, выведите ответы для каждого запроса третьего типа! Можете ли вы решить домашнюю работу Криса?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000), количество строк и столбов в матрице A. Следующие n строк описывают матрицу: i-я строка содержит n целых чисел через пробел, j-е число в этой строке aij (0 ≤ aij ≤ 1) — это элемент, стоящий на пересечении i-й строки и j-го столбца матрицы A.

В следующей строке записано целое число q (1 ≤ q ≤ 106), количество запросов. Каждая из следующих q строк описывает запрос. Описание запроса может иметь один из нижеперечисленных форматов:

  • 1 i — выполните флип всех элементов в i-й строке A;
  • 2 i — выполните флип всех элементов в i-м столбце A;
  • 3 — выведите необычный квадрат A.

Обратите внимание: входные и выходные данные имеют очень большой размер, не стоит использовать медленные методы ввода и вывода данных вашего языка программирования. Например, в языке C++ не стоит использовать потоки ввода и вывода (cin, cout).

Выходные данные

Пусть количество запросов третьего типа во входных данных равняется m. Выведите единственную строку s длины m, где i-й символ строки s является значением необычного квадрата по модулю 2 матрицы A для i-го запроса третьего типа.

D. Игрушечная сумма

жадные алгоритмы математика реализация *1700

Маленькому Крису очень нравятся игрушечные блоки. Однако его учитель хочет, чтобы Крис решал больше задач. Сегодня учитель решил пошутить над Крисом.

У Криса в наборе есть ровно s блоков, каждый блок имеет уникальный номер от 1 до s. Учитель Криса выбирает подмножество блоков X и берет его себе. Он отдаст блоки Крису, только если Крис сможет выбрать такое непустое подмножество Y из оставшихся блоков, что будет выполнено равенство:

"Вы что, издеваетесь?", — спросил Крис.

Например, рассмотрим случай, где s = 8, а учитель Криса забрал блоки с номерами 1, 4 и 5. Крис может выбрать блоки с номерами 3 и 6 (см. рисунок). Тогда описанные суммы будут равны, как и требуется: (1 - 1) + (4 - 1) + (5 - 1) = (8 - 3) + (8 - 6) = 7.

Однако, у Криса есть ровно s = 106 блоков. Вам дано множество X из блоков, которые выбрал его учитель. Помогите Крису найти необходимое множество Y!

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 5·105), количество блоков в множестве X. В следующей строке записано n различных целых чисел через пробел x1, x2, ..., xn (1 ≤ xi ≤ 106), номера блоков в X.

Обратите внимание: входные и выходные данные имеют очень большой размер, не стоит использовать медленные методы ввода и вывода данных вашего языка программирования. Например, в языке C++ не стоит использовать потоки ввода и вывода (cin, cout).

Выходные данные

В первой строке выведите единственное число m (1 ≤ m ≤ 106 - n), количество блоков в множестве Y. В следующей строке выведите m различных целых чисел через пробел y1, y2, ..., ym (1 ≤ yi ≤ 106), таких, что необходимое равенство выполняется. Множества X и Y не должны пересекаться, то есть xi ≠ yj для всех i, j (1 ≤ i ≤ n; 1 ≤ j ≤ m). Гарантируется, что хотя бы одно решение всегда существует. Если существует несколько решений, выведите любое из них.

E. Тройки Хемминга

математика реализация *2800

Маленькому Крису снится кошмар. Даже во снах все его мысли — только о математике.

Крису снятся m двоичных строк длины n, пронумерованных от 1 до m. Самое страшное то, что биты каждой из этих строк упорядочены либо по возрастанию, либо по убыванию. Например, Крис может видеть во сне следующие 4 строки длины 5:

Расстояние Хемминга H(a, b) между двумя строками a и b длины n — это количество позиций, на которых соответствующие символы в этих строках отличаются.

Крис считает, что любые три строки с различными номерами образуют тройку. Он убедил себя в том, что проснется, только если посчитает количество таких троек строк a, b, c, что сумма H(a, b) + H(b, c) + H(c, a) максимальна среди всех троек строк из приснившихся ему строк.

Помогите Крису проснуться от кошмара! Посчитайте для него это количество.

Входные данные

В первой строке содержатся два целых числа через пробел, n и m (1 ≤ n ≤ 109; 3 ≤ m ≤ 105), длина каждой двоичной строки и количество строк. В следующих m строках задано описание строк. В i-й строке содержатся два целых числа через пробел, si и fi (0 ≤ si ≤ 1; 1 ≤ fi ≤ n), — описание строки с номером i; пара чисел si, fi означает, что первые fi битов i-й строки равны si, а остальные n - fi битов равны 1 - si. Обратите внимание, что Крис может видеть также и одинаковые строки в своем сне.

Выходные данные

Выведите единственное целое число — количество таких троек строк среди данных, что сумма расстояний Хемминга между строками тройки максимальна среди всех троек строк из приснившихся ему строк.

A. Треугольник

геометрия математика Перебор реализация *1600

Есть прямоугольный треугольник с катетами длины a и b. Требуется расположить его на плоскости так, что ни одна из его сторон не параллельна осям координат, а вершины находятся в точках с целочисленными координатами, либо определить, что это невозможно.

Входные данные

В первой и единственной строке находятся два целых числа a, b (1 ≤ a, b ≤ 1000), разделенные одним пробелом.

Выходные данные

В первой строке выведите «YES» или «NO» (без кавычек) в зависимости от того, существует ли искомое расположение. Если оно существует, то в трех следующих строках выведите три пары целых чисел — координаты вершин треугольника, по одной паре в строке. Координаты должны быть целыми числами, не превышающими 109 по модулю.

B. Длинный путь

дп реализация *1600

Однажды мальчик Вася оказался в лабиринте, состоящем из (n + 1) комнат, пронумерованных от 1 до (n + 1). Первоначально Вася находится в первой комнате, а чтобы выйти из лабиринта, нужно попасть в (n + 1)-ю.

Лабиринт устроен следующим образом. В каждой комнате лабиринта есть два односторонних портала. Рассмотрим комнату с номером i (1 ≤ i ≤ n), с помощью первого портала можно перейти из нее в комнату с номером (i + 1), с помощью второго можно перейти из нее в комнату с номером pi, где 1 ≤ pi ≤ i.

Чтобы не заблудиться Вася решил действовать следующим образом.

  • Каждый раз когда Вася приходит в какую-то комнату он рисует на ее потолке крестик. Изначально, Вася рисует крестик на потолке комнаты 1.
  • Пусть Вася находится в комнате i и уже нарисовал крестик на ее потолке. Тогда, если сейчас на потолке нарисовано нечетное количество крестиков, Вася будет пользоваться вторым порталом (он ведет в комнату pi), иначе Вася будет пользоваться первым порталом.

Помогите Васе определить, сколько раз ему придется воспользоваться порталами, чтобы попасть в комнату (n + 1) в конечном итоге.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 103) — число комнат. Во второй строке записаны n целых чисел pi (1 ≤ pi ≤ i) — номера комнат, в которые можно попасть из i-й комнаты, если пользоваться вторым порталом.

Выходные данные

Выведите одно число — количество перемещений, за которое мальчик выберется из лабиринта. Поскольку это число может быть достаточно большим, выведите его по модулю 1000000007 (109 + 7).

C. Занимательный массив

Комбинаторика математика Перебор реализация *2500

Задан массив, состоящий из n целых чисел: a[1], a[2], ..., a[n]. Более того, заданы m запросов, каждый из которых характеризуется тремя числами li, ri, ki. Запрос li, ri, ki обозначает, что нужно добавить к каждому элементу a[j], где li ≤ j ≤ ri, число Ckij - li + ki.

Запись Cxy обозначает биномиальный коэффициент, или количество сочетаний из y элементов по x элементов.

Вам нужно выполнить последовательно все запросы и вывести, чему будут равны элементы массива в итоге, после всех запросов.

Входные данные

В первой строке заданы целые числа n, m (1 ≤ n, m ≤ 105).

Во второй строке задано n целых чисел a[1], a[2], ..., a[n] (0 ≤ ai ≤ 109) — изначальное состояние массива.

В следующих m строках заданы запросы в формате li, ri, ki — прибавить всем элементам отрезка li... ri число Ckij - li + ki (1 ≤ li ≤ ri ≤ n; 0 ≤ k ≤ 100).

Выходные данные

Выведите n целых чисел: i-е число — это значение элемента a[i] после всех запросов. Так как значения могут быть достаточно большими выводите их по модулю 1000000007 (109 + 7).

A. Очередь на кассе

реализация *900

Мальчик Вася пошел в супермаркет за продуктами. Он долго ходил по супермаркету и набрал полную корзину продуктов. Теперь ему осталось выбрать в какую кассу встать, чтобы оплатить продукты.

На выходе из магазина находятся n касс. В данный момент в очереди на i-ю кассу уже стоят ki человек. Причем у j-го человека, стоящего в очереди на i-ю кассу, в корзине лежит mi, j единиц товара. Вася знает, что:

  • кассир «пробивает» одну единицу товара за 5 секунд;
  • после того как кассир «пробил» каждую единицу товара некоторого покупателя, он 15 секунд рассчитывается с этим покупателем.

Конечно, Вася хочет выбрать очередь так, чтобы уйти из магазина как можно раньше. Помогите ему, напишите программу, которая выведет минимальное число секунд, через которое Вася может попасть к одному из кассиров.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — число касс в магазине. Во второй строке записаны n целых чисел через пробел: k1, k2, ..., kn (1 ≤ ki ≤ 100), где ki обозначает количество человек в очереди на i-ю кассу.

В i-й из n следующих строк записано ki целых чисел через пробел: mi, 1, mi, 2, ..., mi, ki (1 ≤ mi, j ≤ 100) — число продуктов у j-го человека в очереди на i-ю кассу.

Выходные данные

Выведите целое число — минимальное число секунд, через которое Вася попадет к кассиру.

Примечание

Во втором тестовом примере, если Вася пойдет в первую очередь, то он попадет к кассиру через 100·5 + 15 = 515 секунд. Если же он выберет вторую очередь — 1·5 + 2·5 + 2·5 + 3·5 + 4·15 = 100 секунд. Если третью — 1·5 + 9·5 + 1·5 + 3·15 = 100 секунд. Если четвертую — 7·5 + 8·5 + 2·15 = 105 секунд. Таким образом Вася быстрее всего попадет к кассиру, если выберет вторую или третью очередь.

B. Гирлянда

реализация *1200

Как-то раз мальчик Вася прочитал в журнале «Мурзилка» как смастерить красивую гирлянду из цветной бумаги. Вася немедленно пошел в магазин и купил n листов цветной бумаги каждый площадью 1 квадратный метр.

Поделка должна состоять ровно из m кусков цветной бумаги произвольной площади, причем каждый кусок должен быть определенного цвета. Для того чтобы сделать поделку Вася может произвольным образом разрезать имеющиеся у него листы цветной бумаги на куски. Вася не обязан использовать все листы для изготовления поделки.

Вася хочет, чтобы его поделка была как можно более заметной, поэтому он хочет максимизировать суммарную площадь m кусков бумаги в поделке. Посчитайте, какую максимальную суммарную площадь кусков бумаги в поделке Вася может получить.

Входные данные

В первой строке записана непустая последовательность из n (1 ≤ n ≤ 1000) маленьких латинских букв («a»...«z»). Каждая буква обозначает, что у Васи есть лист бумаги соответствующего цвета.

Во второй строке записана непустая последовательность из m (1 ≤ m ≤ 1000) маленьких латинских букв, соответствующих цветам кусков бумаги в поделке, которую хочет смастерить Вася.

Выходные данные

Выведите целое число — максимально возможную суммарную площадь кусков бумаги в поделке, которую может получить Вася, или -1, если невозможно смастерить поделку из имеющихся листов. Гарантируется, что ответ всегда является целым числом.

Примечание

В первом тестовом примере Вася может собрать поделку площади 6: он может использовать оба листа цвета b, три (но не четыре) листа цвета a, и разрезать единственный кусок цвета c на три, например, равных куска. Из полученных кусков бумаги Вася может сложить гирлянду площади 6.

Во втором тестовом примере Вася не сможет собрать гирлянду вообще — у него нет листа цвета z.

H. A + B наносит ответный удар

*особая задача Конструктив Перебор реализация снм *1500

Задача A + B часто используется как пример простейшей задачи для демонстрации платформы спортивного программирования. Тем не менее, некоторые ученые отмечают, что иногда эту задачу не так-то просто сдать. Хотите попробовать?

Входные данные

Входные данные содержат два целых числа a и b (0 ≤ a, b ≤ 103), разделенных пробелом.

Выходные данные

Выведите сумму заданных чисел.

A. Перевод

реализация Строки *800

Перевод с берляндского языка на бирляндский — задача не из легких. Эти языки очень похожи: слово на бирляндском языке отличается от такого же по смыслу слова на берляндском только тем, что оно пишется (и произносится) наоборот. Например, слову code в берляндском языке соответствует слово edoc в бирляндском. Несмотря на это, при «переводе» легко ошибиться. Вася перевел слово s с берляндского на бирляндский как t. Помогите ему: определите, правильно ли он выполнил перевод?

Входные данные

В первой строке записано слово s, во второй строке записано слово t. Слова состоят из маленьких латинских букв. Входные данные не содержат лишних пробелов. Слова непустые, и их длины не превосходят 100 символов.

Выходные данные

Если слово t является словом s, записанным наоборот, выведите YES, иначе выведите NO.

C. Email-адрес

Разбор выражений реализация *1300

Иногда email-адреса приходится диктовать по телефону. Точку обычно называют словом dot, а собаку at. В результате получается что-то вроде vasyaatgmaildotcom. Ваша задача — преобразовать это в корректный email-адрес ([email protected]).

Известно, что корректный email-адрес содержит только символы . @ и маленькие латинские буквы, не начинается и не заканчивается точкой. Также, корректный email-адрес не начинается и не заканчивается собакой. Более того, email-адрес содержит ровно один символ @ но при этом может содержать любое (возможно, нулевое) количество точек.

Требуется произвести серию замен, чтобы длина результата оказалась как можно меньше, и он являлся корректным email-адресом. При равенстве длин нужно вывести лексикографически минимальный результат.

Всего возможно два варианта замены: dot можно заменить на точку, at можно заменить на собаку.

Входные данные

В первой строке содержится описание email-адреса. Гарантируется, что это — корректный email-адрес, в котором все точки заменены на dot и собака заменена на at. Строка не пуста, и ее длина не превосходит 100 символов.

Выходные данные

Выведите кратчайший email-адрес, из которого могла быть получена указанная строка путем указанных выше замен. Если решений несколько, выведите лексикографически минимальное (лексикографическое сравнение строк реализует оператор < в современных языках программирования).

Символы идут в таблице ASCII в следующем порядке: . @ ab...z

A. Проверка пароля

*особая задача реализация *800

Наверное, вы не раз регистрировались на каком-нибудь интернет-ресурсе и при этом вводили придуманный вами пароль. Обычно форма регистрации автоматически проверяет насколько введенный пароль крипто-устойчив. Если пользователь ввел недостаточно сложный пароль, выводится соответствующее сообщение. Сегодня ваша задача реализовать такую автоматическую проверку.

В офисе компании Q считают, что пароль достаточно сложный, если выполняются все следующие условия:

  • длина пароля не менее 5 символов;
  • пароль содержит хотя бы одну большую букву английского алфавита;
  • пароль содержит хотя бы одну маленькую букву английского алфавита;
  • пароль содержит хотя бы одну цифру.

Вам задан пароль, реализуйте автоматическую проверку сложности пароля для компании Q.

Входные данные

В первой строке задана непустая последовательность символов (не более 100 символов). Каждый символ — это либо большая буква английского алфавита, либо маленькая буква английского алфавита, либо цифра, либо один из символов «!», «?», «.», «,», «_».

Выходные данные

Если пароль достаточно сложный, выведите в единственной строке сообщение «Correct» (без кавычек), иначе выведите сообщение «Too weak» (без кавычек).

B. Многоядерный процессор

реализация *1600

В исследовательском центре компании Q разработали новый многоядерный процессор. Процессор состоит из n ядер, в распоряжении которых имеется k ячеек общей кеш-памяти. Рассмотрим работу этого процессора.

Каждый такт каждому ядру процессора подается одна инструкция: либо ничего не делать, либо номер ячейки, в которую нужно записать информацию. Получив команду, ядро мгновенно выполняет ее. Иногда происходит ситуация, когда в течение одного и того же такта несколько ядер пытаются записать информацию в одну ячейку. К сожалению, разработчики не предусмотрели возможность разрешения конфликтов между ядрами, поэтому в таком случае происходит дедлок: все эти ядра и соответствующая ячейка памяти блокируются навсегда. Каждое из заблокированных ядер игнорирует все дальнейшие команды, и ни одно ядро в дальнейшем не сможет записать информацию в заблокированную ячейку. Если какое-то из ядер попытается записать информацию в заблокированную ячейку, оно немедленно блокируется.

Команда разработчиков процессора хочет досконально изучить ситуацию дедлок. Поэтому им требуется программа, которая по заданному набору инструкций для каждого ядра в течении m тактов будет моделировать работу процессора. Вам повезло, и эту интересную работу доверили вам. По заданным инструкциям в течении m тактов определите для каждого ядра номер такта, во время которого оно станет заблокированным. Считается, что изначально все ядра и все ячейки памяти не заблокированы.

Входные данные

В первой строке записаны три целых числа n, m, k (1 ≤ n, m, k ≤ 100). Далее идут n строк, описывающих инструкции. В i-й строке содержится m целых чисел: xi1, xi2, ..., xim (0 ≤ xij ≤ k), где xij обозначает инструкцию, которую должно выполнить i-е ядро на j-м такте. Если xij равно 0, то соответствующая инструкция «ничего не делать». Если же xij число от 1 до k, то соответствующая инструкция «записать информацию в ячейку кеш-памяти с номером xij».

Считается, что ядра пронумерованы от 1 до n, такты работы пронумерованы от 1 до m, а ячейки памяти пронумерованы от 1 до k.

Выходные данные

Выведите n строк. В i-й строке выведите целое число ti, равное 0, если i-е ядро не будет заблокировано, либо равное номеру такта, в течение которого ядро будет заблокировано.

C. Кикер

*особая задача реализация *1700

Кикер (настольный футбол) — настольная игра, основанная на футболе, в которой игроки управляют фигурками футболистов, установленными на стержнях (штангах), с помощью рукояток, стремясь забить мяч в ворота противника. При игре двое надвое один из игроков управляет вратарем и защитниками (играет в защите), другой — полузащитниками и нападающими (играет в нападении).

Две команды компании Q решили сразиться друг с другом. Пронумеруем игроков обеих команд целыми числами от 1 до 4. Первый и второй играют в первой команде, третий и четвертый играют во второй команде. Для каждого из четырех игроков известен его навык игры в защите и в нападении. Навык защиты i-го игрока составляет ai, навык нападения — bi.

Перед игрой команды определяют, как они будут играть. Сначала игроки первой команды решают, кто будет играть в нападении, а кто в защите. После этого игроки второй команды делают то же самое, исходя из выбора своих соперников.

Будем называть защитой команды навык защиты игрока этой команды, который играет в защите. Аналогично, будем называть нападением команды навык нападения игрока этой команды, который играет в нападении. Будем считать, что одна команда гарантированно обыграет другую, если ее защита строго больше нападения соперника и ее нападение строго больше защиты соперника.

Команды компании Q хорошо знают силы друг друга и поэтому выбирают составы оптимально. Определите команду, которая гарантированно может победить, действуя оптимально, либо сообщите, что такой команды нет.

Входные данные

Во входных данных в четырех строках задано описание игроков. В i-й строке через пробел записаны два целых числа ai и bi (1 ≤ ai, bi ≤ 100) — навык защиты и нападения i-го игрока соответственно.

Выходные данные

Если гарантированно может победить первая команда, то выведите фразу «Team 1» (без кавычек), если гарантированно может победить вторая команда — выведите фразу «Team 2» (без кавычек). Если ни одна команда не может гарантированно одержать победу, выведите фразу «Draw» (без кавычек).

Примечание

Рассмотрим первый тестовый пример. Если первый игрок будет играть в нападении, а второй в защите, тогда, вне зависимости от расположения игроков второй команды, первая команда может гарантированно одержать победу.

Во втором тестовом примере имеет значение порядок выбора игроков. Так как сначала игроки первой команды определяют, как им играть, игроки второй команды могут, зная их расположение, встать так, чтобы гарантированно победить.

A. Плакат

жадные алгоритмы реализация *900

Недавно компания R1 выкупила для своего главного офиса многоэтажное здание в центре Москвы. Пришло время обустраивать новый офис, и первым делом было решено написать лозунг компании над главным входом в здание.

Лозунг компании состоит из n символов, поэтому для его написания над входом повесили большой плакат шириной n метров и высотой 1 метр, разделенный на n одинаковых квадратов. Первый символ лозунга должен находиться в первом (самом левом) квадрате плаката, второй — во втором, и так далее.

Конечно, программисты R1 сами хотят написать лозунг на плакате. Для этого у них есть большая (и очень тяжелая) лестница, которую грузчики поставили ровно напротив k-го квадрата плаката. Чтобы нарисовать i-й символ лозунга на плакате, нужно забраться на лестницу, стоящую напротив i-го квадрата плаката. Это действие (вместе с подъемом и спуском с лестницы) занимает у рисующего один час. Рисовать символы в соседних квадратах, когда лестница стоит напротив i-го квадрата, запрещается, ведь из-за неудобного положения лестницы символы могут получиться неаккуратными. Кроме того, программисты могут перемещать лестницу. За один час они могут подвинуть лестницу либо на один метр вправо, либо на один метр влево.

Рисовать символы и перемещать лестницу очень утомительно, поэтому программисты хотят закончить работу, потратив как можно меньше времени. Разработайте для них оптимальный план написания плаката!

Входные данные

В первой строке записаны два целых числа n и k (1 ≤ k ≤ n ≤ 100) — количество символов в лозунге и изначальное положение лестницы соответственно. В следующей строке записан сам лозунг — n символов, записанных без пробелов. Каждый символ лозунга — это либо большая буква английского алфавита, либо цифра, либо один из символов: «.», «!», «,», «?».

Выходные данные

В t строках выведите действия, которые нужно совершить программистам. В i-й строке выведите:

  • «LEFT» (без кавычек), если i-е действие «передвинуть лестницу влево»;
  • «RIGHT» (без кавычек), если i-е действие «передвинуть лестницу вправо»;
  • «PRINT x» (без кавычек), если i-е действие «подняться по лестнице, нарисовать символ x, спуститься с лестницы».

Время, потраченное на покраску, (переменная t) должно быть как можно меньше. Если существует несколько оптимальных планов покраски, разрешается вывести любой.

Примечание

Обратите внимание, что лестницу нельзя перемещать менее, чем на один метр. Нельзя чтобы лестница стояла не напротив какого-то квадрата плаката. Например, нельзя передвинуть лестницу на полметра, чтобы она стояла посередине двух квадратов, затем подняться и нарисовать сначала один символ, а затем другой.

C. Строка-шаблон

реализация Строки *1200

Разработчики часто сталкиваются с понятием шаблона регулярных выражений. Под шаблоном обычно понимают строку-образец, состоящую из символов и метасимволов и задающую правило поиска. Такие шаблоны чаще всего используют для того, чтобы проверить, соответствует ли некоторая строка определенным правилам.

В этой задаче шаблоном будет называться строка, состоящая из маленьких латинских букв и знаков вопроса («?»). Знак вопроса в шаблоне — метасимвол, который обозначает произвольную маленькую букву латинского алфавита. Будем считать, что строка удовлетворяет шаблону, если из шаблона можно получить эту строку, заменив знаки вопроса на соответствующие символы. Например, строка aba удовлетворяет шаблонам: ???, ??a, a?a, aba.

Программисты компании R1 любят озадачить друг друга (и сами себя) головоломками. Одна из них выглядит следующим образом: заданы n строк-шаблонов одинаковой длины, нужно найти шаблон, содержащий как можно меньше знаков вопроса, который пересекается с каждым из заданных. Два шаблона пересекаются, если существует строка, которая удовлетворяет и первому и второму шаблону. Сможете ли вы решить эту задачку?

Входные данные

В первой строке задано единственное целое число n (1 ≤ n ≤ 105) — количество шаблонов. Далее в n строках заданы шаблоны.

Гарантируется, что шаблоны могут состоять только из маленьких букв латинского алфавита и символов «?». Все шаблоны непустые и имеют одинаковую длину. Суммарная длина всех шаблонов не превышает 105 символов.

Выходные данные

В единственной строке выведите ответ на задачу — шаблон с минимальным количеством знаков «?», который пересекается с каждым из заданных. Если существует несколько правильных ответов, разрешается вывести любой из них.

Примечание

Рассмотрим первый тестовый пример. Шаблон xab пересекается с каждым из заданных. Шаблон ??? также пересекается с каждым из заданных, но он содержит больше знаков вопроса, поэтому не является оптимальным ответом. Очевидно, xab является оптимальным ответом, так как он совсем не содержит знаков вопроса. Есть и другие оптимальные ответы на этот тест, например: aab, bab, cab, dab и так далее.

E. Е-mail адреса

реализация *1900

Один из важнейших продуктов компании R1 — популярный почтовый сервис @r1.com. Ежедневно почтовые ящики R1 принимают и отправляют миллионы писем.

Сегодня в интернет-новостях прогремела ужасная новость. База данных R1 «упала», почти никакие данные не удалось сохранить, кроме одной большой строки, в которой по предположению разработчиков находятся письма некоторых пользователей почты R1. Восстановление писем — весьма трудоемкий плохо-автоматизируемый процесс. Поэтому перед запуском этого процесса было решено оценить, насколько оправдано восстановление. А именно, нужно посчитать сколько различных подстрок сохраненной строки образуют корректные e-mail адреса.

Будем считать корректными только e-mail адреса, которые удовлетворяют следующим правилам:

  • адрес должен начинаться с непустой последовательности букв, цифр, символов «_», которая должна начинаться с буквы;
  • затем должен идти символ «@»;
  • затем должна идти непустая последовательность букв или цифр;
  • затем должен идти символ «.»;
  • заканчиваться адрес должен непустой последовательностью букв.

Вам опять повезло, и задание доверили вам! Обратите внимание, что подстрока — это несколько подряд идущих в строке символов. Две подстроки: состоящая из символов строки с номерами l1, l1 + 1, l1 + 2, ..., r1 и состоящая из символов строки с номерами l2, l2 + 1, l2 + 2, ..., r2, считаются различными, если l1 ≠ l2 или r1 ≠ r2.

Входные данные

В первой и единственной строке записана последовательность символов s1s2... sn (1 ≤ n ≤ 106) — сохраненная строка. Гарантируется, что заданная строка содержит только маленькие английские буквы, цифры и символы «.», «_», «@».

Выходные данные

Выведите в единственной строке количество подстрок, которые являются корректными e-mail адресами.

Примечание

В первом тестовом примере все подстроки, являющиеся корректными e-mail адресами, начинаются в одной из букв слова agapov, а заканчиваются в одной из букв слова com.

Во втором тестовом примере обратите внимание, что e-mail [email protected] считается в ответе два раза. Заметьте, что в этом примере вхождения e-mail перекрываются внутри строки.

A. Восстановление данных

реализация *1200

Не так давно компания R2 купила компанию R1, а значит, и все ее разработки в сфере многоядерных процессоров. Сейчас в лаборатории R2 тестируют один из процессоров R1.

Тестирование проходит в n этапов, на каждом этапе процессору подаются некоторые инструкции, а затем меряется его температура. Главный инженер R2 для отчета по работе процессора записал себе в блокнот минимальную и максимальную из измеренных температур. Его помощник должен был записать все температуры к себе в блокнот, но (неизвестно по каким причинам) он записал только m.

На следующий день помощник предоставил главному инженеру отчет со всеми m температурами. Однако главный инженер сомневается, что помощник все записал правильно (в своих записях главный инженер, конечно, не сомневается). Поэтому он обратился за помощью к вам. По заданным числам n, m, min, max и списку m температур определите: можно ли так дополнить набор из m температур до n температур, чтобы минимальная температура была равна min, а максимальная — max?

Входные данные

В первой строке записаны четыре целых числа n, m, min, max (1 ≤ m < n ≤ 100; 1 ≤ min < max ≤ 100). Во второй строке записаны m целых чисел через пробел ti (1 ≤ ti ≤ 100) — выписанные помощником температуры.

Обратите внимание, что как выписанные, так и добавленные температуры могут быть одинаковыми.

Выходные данные

Если данные непротиворечивые, выведите «Correct» (без кавычек). Иначе, выведите «Incorrect» (без кавычек).

Примечание

В первом тестовом примере одна из возможных изначальных конфигураций температур: [1, 2].

Во втором тестовом примере одна из возможных изначальных конфигураций температур: [2, 1, 3].

В третьем тестовом примере никак нельзя добавить одну температуру, чтобы получить минимум, равный 1, и максимум, равный 3.

B. Spyke чат

реализация *1300

В компании R2 работает n сотрудников. В процессе работы постоянно нужно поддерживать связь, делиться достигнутыми успехами и обсуждать возникающие проблемы. Для этого R2 использует знаменитую программу Spyke для обмена мгновенными сообщениями.

Для обсуждения различных проектов у R2 есть m специальных Spyke чатов. В каждом чате ежедневно обменивается сообщениями некоторая группа сотрудников, при этом один сотрудник может одновременно состоять в нескольких чатах. Если какой-то сотрудник состоит в k-м чате, то он может писать сообщения в этот чат и получать уведомления о сообщениях из этого чата. Если сотрудник написал сообщение в чат, уведомление о нем приходит всем другим участникам чата.

В компании R2 проходит аудит. Сейчас специалисты занимаются изучением эффективности коммуникации сотрудников. Для этих целей у них есть лог сообщений и описание структуры чатов. Вам, как одному из специалистов по аудиту, поручено написать программу, которая по этим данным будет определять суммарное количество уведомлений о сообщениях, полученных каждым сотрудником.

Входные данные

В первой строке через пробел заданы три целых числа n, m и k (2 ≤ n ≤ 2·104; 1 ≤ m ≤ 10; 1 ≤ k ≤ 2·105) — количество сотрудников, количество чатов и количество событий в логе соответственно.

Далее в n строках задана матрица a размера n × m, состоящая из нулей и единиц. Элемент этой матрицы, записанный в j-м столбце i-й строки, (будем обозначать его aij) равен 1, если i-й сотрудник является участником j-го чата, в противном случае элемент равен 0. Считайте, что сотрудники пронумерованы от 1 до n, а чаты от 1 до m.

Далее в k строках задано описание событий лога. В i-й строке через пробел записаны два целых числа xi и yi (1 ≤ xi ≤ n; 1 ≤ yi ≤ m), которые обозначают, что сотрудник с номером xi отправил одно сообщение в чат под номером yi. Гарантируется, что сотрудник xi является участником чата yi. Гарантируется, что в каждом чате состоят хотя бы два сотрудника.

Выходные данные

В единственной строке через пробел выведите n целых чисел, где i-е число обозначает количество уведомлений о сообщениях, принятых i-м сотрудником.

A. Машмох и лампочки

реализация *900

Машмох работает на заводе. Одна из его обязанностей — в конце рабочего дня выключить везде свет. Все лампочки на заводе проиндексированы от 1 до n. В комнате Машмоха есть n кнопок, проиндексированных от 1 до n. Если Машмох нажмет кнопку с индексом i, то каждая включенная лампочка с индексом не менее i отключится.

Машмох не особо башковит. Вместо того, чтобы просто нажать первую кнопку, он каждый вечер нажимает несколько случайных кнопок. Сегодня он нажал m различных кнопок b1, b2, ..., bm (кнопки нажимались последовательно в данном порядке), когда отключал свет. Теперь Машмох хочет знать для каждой лампочки индекс кнопки, которая отключила эту лампочку. Обратите внимание, что кнопка bi имеет индекс bi, а не i.

Пожалуйста, помогите Машмоху, выведите требуемые индексы.

Входные данные

В первой стоке записано два целых числа через пробел, n и m (1 ≤ n, m ≤ 100), количество лампочек на фабрике и количество нажатых кнопок, соответственно. В следующей строке записано m различных целых чисел через пробел b1, b2, ..., bm (1 ≤ bi ≤ n).

Гарантируется, что после нажатия всех кнопок все лампочки отключатся.

Выходные данные

Выведите n целых чисел через пробел, i-е число — это порядковый номер кнопки, выключающей i-ю лампочку.

Примечание

В первом примере, после нажатия кнопки 4, отключаются лампочки 4 и 5, а лампочки 1, 2, и 3 все еще горят. Затем нажимается кнопка 3 и выключается лампочка 3. Затем нажимается кнопка 1 и отключаются лампочки 1 и 2, поэтому нажатие кнопки 2 в конце ничего не меняет. Таким образом, кнопка 4 отключила лапочки 4 и 5, кнопка 3 отключила лампочку 3, а кнопка 1 отключила лампочки 1 и 2.

B. Машмох и жетоны

Бинарный поиск жадные алгоритмы математика реализация *1500

Бимох — начальник Машмоха. В каждый из следующих n дней он решил платить своим подчиненным по-новому. В начале каждого дня он дает каждому работнику некоторое количество жетонов. Затем, в конце дня, работник может обменять некоторые из своих жетонов на деньги. Работник может сохранить оставшиеся после обмена жетоны, но он не сможет обменять их на деньги в какой-либо другой день. Если работник возвращает w жетонов, то он получает долларов.

Машмоху нравятся жетоны. Но деньги ему нравятся больше. Поэтому он хочет оставлять себе как можно больше жетонов так, чтобы количество получаемых им денег было максимально возможным каждый день.

У Машмоха есть n чисел x1, x2, ..., xn. Число xi обозначает количество жетонов, выдаваемых каждому работнику в i-й день. Помогите ему посчитать, сколько жетонов он может оставить себе в каждый из n дней.

Входные данные

Первая строка содержит три целых числа через пробел n, a, b (1 ≤ n ≤ 105; 1 ≤ a, b ≤ 109). Вторая строка содержит n целых чисел через пробел x1, x2, ..., xn (1 ≤ xi ≤ 109).

Выходные данные

Выведите n целых чисел через пробел. При этом, i-е число должно обозначать, сколько жетонов Машмох может оставить себе в i-й день.

A. Угадай число!

жадные алгоритмы реализация *1400

Телешоу «Угадай число!» набирает популярность. Вся Берляндия от мала до велика смотрит это шоу.

Правила просты. Ведущий загадывает целое число y, а участники его отгадывают, задавая вопросы ведущему. Допустимы четыре вида вопросов:

  • Верно ли, что загаданное число строго больше числа x?
  • Верно ли, что загаданное число строго меньше числа x?
  • Верно ли, что загаданное число больше или равно числа x?
  • Верно ли, что загаданное число меньше или равно числа x?

На каждый из вопросов ведущий правдиво отвечает «да» или «нет».

По заданной последовательности вопросов и ответов на них найдите любое из целочисленных значений y, которое удовлетворяет всем ответам. Если такого значения не существует, то выведите слово «Impossible».

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 10000) — количество вопросов (и ответов). Далее n строк содержат по одному вопросу и ответу на него. Формат каждой из строк таков: «знак x ответ», где знак это:

  • '>' (для вопросов первого типа),
  • '<' (для вопросов второго типа),
  • '>=' (для вопросов третьего типа),
  • '<=' (для вопросов четвертого типа).

Все значения x целочислены и удовлетворяют неравенству  - 109 ≤ x ≤ 109. Ответ обозначается буквой латинского алфавита 'Y' (ответ «да») или 'N' (ответ «нет»).

Последовательные элементы в строках разделяются ровно одним пробелом.

Выходные данные

Выведите любое из таких целых y, что ответы на все вопросы верны. Выводимое число y должно удовлетворять неравенству  - 2·109 ≤ y ≤ 2·109. Если ответ определен неоднозначно, выведите любой из них. Если такого значения не существует, то выведите слово «Impossible» (без кавычек).

B. Гильдия художников

дп Перебор реализация *1300

Знаменитое объединение художников «Калевич жив!» поставило на поток производство шедевров. Объединение состоит из n художников, которые решили следующим образом организовать свою работу.

Каждый из художников будет использовать только один закрепленный за ним цвет. Цвета для всех художников различны, будем считать что первый художник использует первый цвет, второй художник — второй цвет, и так далее. Каждый шедевр будет содержать все эти цвета. Чтобы наложить j-й цвет на i-й шедевр, j-му художнику потребуется tij единиц времени.

Во всем нужен порядок, поэтому работа художников упорядочена по следующим правилам:

  • каждый шедевр сначала обрабатывается первым художником, потом вторым и т.д., то есть после окончания обработки j-м художником шедевр должен быть обработан (j + 1)-м (если j < n);
  • каждый из художников работает над шедеврами по порядку: сначала работает над первым шедевром, потом над вторым и так далее;
  • каждый художник может одновременно работать не более чем над одним шедевром, но времени на отдых им не требуется;
  • как только j-й художник заканчивает работу над шедевром, тот мгновенно передается следующему художнику.

Считая, что художники приступят к работе в момент времени 0, найдите для каждого шедевра момент времени, когда он будет готов к продаже.

Входные данные

В первой строке входных данных записаны целые числа m, n (1 ≤ m ≤ 50000, 1 ≤ n ≤ 5), где m — количество шедевров, а n — количество художников. Далее следуют описания шедевров по одному в строке. Каждая из строк содержит по n целых чисел ti1, ti2, ..., tin (1 ≤ tij ≤ 1000), где tij — время работы j-го художника над i-м шедевром.

Выходные данные

Выведите последовательность из m целых чисел r1, r2, ..., rm, где ri — момент окончания работы n-го художника над i-м шедевром.

D. Численность населения

жадные алгоритмы математика реализация *2400

Поликарп разрабатывает интересную теорию о взаимосвязи арифметических прогрессий со всем-всем-всем в мире. Текущая идея икс состоит в том, что численность населения столицы Берляндии изменяется со временем как арифметическая прогрессия. Ну или несколько арифметических прогрессий.

Поликарп считает, что если выписать численность населения столицы для нескольких подряд идущих лет в последовательность a1, a2, ..., an, то удобно рассматривать этот массив как несколько арифметических прогрессий, записанных друг за другом. Например, последовательность (8, 6, 4, 2, 1, 4, 7, 10, 2) можно рассматривать как последовательность трёх арифметических прогрессий (8, 6, 4, 2), (1, 4, 7, 10) и (2), которые записаны подряд друг за другом.

К сожалению, Поликарп может и не располагать всеми данными за n последовательных лет (ведь не каждый год делается перепись населения). По этой причине некоторые значения ai могут быть неизвестны. Такие значения он обозначает числом -1.

По заданной последовательности a = (a1, a2, ..., an), которая состоит из положительных целых чисел и значений -1, найдите минимальное количество арифметических прогрессий, чтобы получить a. Для получения a прогрессии надо записать последовательно одну за другой. Значениям -1 может соответствовать произвольное положительное целое число, а значения ai > 0 должны быть точно равны соответствующим элементам искомой последовательной записи прогрессий.

Напомним, что конечная последовательность c называется арифметической прогрессией, если разность ci + 1 - ci любых двух последовательных элементов в ней является константой. По определению, любая последовательность длины 1 — это арифметическая прогрессия.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 2·105) — количество элементов в последовательности. Во второй строке записаны целочисленные значения a1, a2, ..., an через пробел (1 ≤ ai ≤ 109 или ai =  - 1).

Выходные данные

Выведите наименьшее количество арифметических прогрессий, которые надо записать одну за другой, чтобы получить последовательность a. На месте значений -1 в a могут быть любые положительные целые числа.

A. Отбор

дп математика реализация *1500

Финалистами соревнований «Russian Code Cup» в 2214 году будут участники, ставшие победителями в одном из отборочных раундов.

Отборочные раунды делятся на основные и дополнительные. Каждый из основных отборочных раундов должен состоять из c задач, а победителями раунда считаются n человек, занявшие первые места в этом раунде. Каждый из дополнительных отборочных раундов состоит из d задач. Победителем дополнительного раунда становится один человек. Кроме этого, на финал без конкурса приглашаются k победителей финалов прошлых лет.

В результате всех отборочных раундов в финал должно пройти не менее n·m человек. Каким образом нужно организовать отборочные раунды, чтобы в результате всех отборочных раундов в финал прошли не менее n·m человек, а при этом суммарное количество использованных в раундах задач было как можно меньше?

Входные данные

Первая строка содержит два целых числа c и d (1 ≤ c, d ≤ 100) — количество задач в основном и дополнительном раундах соответственно. Вторая строка содержит два целых числа n и m (1 ≤ n, m ≤ 100). Наконец, третья строка содержит целое число k (1 ≤ k ≤ 100) — число заранее отобранных победителей.

Выходные данные

В первой строке выведите единственное целое число — минимальное количество задач, которое нужно подготовить членам жюри.

B. Сбой

реализация *1400

При проведении соревнований по программированию «Russian Code Cup», в проверяющей системе сохраняются все посланные решения для каждого участника. Известно, что многие участники используют в своих программах случайные числа и часто отправляют на проверку несколько решений с одинаковым исходным кодом.

В проверяющей системе каждый участник идентифицируется некоторым уникальным целым числом k, а каждое отправленное решение A характеризуется двумя целыми числами: x — числом различных решений, отправленных до первого решения, идентичного решению A, и k — идентификатором участника, который является автором решения. Логично, что все одинаковые решения имеют одинаковый x.

Известно, что данные в проверяющей системе хранятся в хронологическом порядке. То есть, если в проверяющей системе есть решение под номером x (x > 0) участника с номером k, то где-то раньше в проверяющей системе хранится решение с номером x - 1 того же участника.

Во время проведения соревнований, в проверяющей системе произошел сбой, после чего данные о подходах всех участников были восстановлены. Теперь жюри хотят проверить, что восстановленные данные идут в хронологическом порядке. Помогите жюри сделать это.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 105) — количество записей. В n последующих строках содержится по два целых числа: x и k через пробел (0 ≤ x ≤ 105; 1 ≤ k ≤ 105) — количество предыдущих уникальных посылок и номер участника, автора этого решения.

Выходные данные

Выведите «YES» (без кавычек), если данные идут в хронологическом порядке, и «NO» (без кавычек) в обратном случае.

C. Футбол

графы Конструктив реализация *1400

В качестве внеконкурсного мероприятия на «Russian Code Cup» было решено поиграть в футбол. Все участники разделились на n команд и провели несколько матчей, при этом две команды не могли сыграть друг против друга более одного раза.

Судьей назначили самого опытного участника — Павла. Но так как он был самым мудрым из всех, ему сразу наскучили игры, и он уснул. Проснувшись, он обнаружил, что турнир закончился, и команды хотят узнать результаты всех матчей.

Чтобы никто не обнаружил, что Павел заснул и не следил за результатами, он решил восстановить исходы всех матчей. Для этого он опросил все команды и узнал, что победила дружба, а именно каждая команда выиграла у других ровно k раз. Помогите Павлу придумать хронологию турнира, удовлетворяющую всем условиям или сообщите, что ее не существует.

Входные данные

В первой строке задано два целых числа — n и k (1 ≤ n, k ≤ 1000).

Выходные данные

В первой строке выведите целое число m — количество сыгранных матчей. В следующих m строках должна содержаться информация обо всех матчах, по матчу в строке. В i-й строке выведите два целых числа ai bi (1 ≤ ai, bi ≤ nai ≠ bi). Числа ai, bi обозначают, что в i-м матче команда с номером ai победила команду с номером bi. Считайте, что команды пронумерованы от 1 до n.

Если не существует турнира, удовлетворяющего условию задачи, выведите -1.

A. Провинился — на кухню!

жадные алгоритмы реализация *1400

Сегодня у Володи неудачный день. Он получил кол по алгебре, и за это сослан на кухню варить суп. Заодно и в алгебре подтянется.

Борщ делается по рецепту и в его состав входит n ингредиентов, которые, как Володя прочитал, должны входить в борщ в пропорции литров (то есть в борщ войдет a1 ·x, ..., an ·x литров соответствующих ингредиентов для некоторого неотрицательного x). На кухне Володя обнаружил, что у него имеется b1, ..., bn литров этих ингредиентов соответственно. Чтобы искупить свои непростительные алгебраические ошибки, ему необходимо сварить как можно больше борща в кастрюле объема V литров (то есть в кастрюлю влезет от 0 до V литров). Какой объем борща приготовит Володя?

Входные данные

В первой строке входного файла через пробел записаны натуральные числа n и V (1 ≤ n ≤ 20, 1 ≤ V ≤ 10000). В следующей строке через пробел записаны n натуральных чисел ai (1 ≤ ai ≤ 100). Наконец, в последней строке через пробел записаны n натуральных чисел bi (0 ≤ bi ≤ 100).

Выходные данные

Выведите единственное вещественное число — объем борща, приготовленный Володей. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 4.

A. Провинился — на кухню!

жадные алгоритмы реализация *1400

Сегодня у Володи неудачный день. Он получил кол по алгебре, и за это сослан на кухню варить суп. Заодно и в алгебре подтянется.

Борщ делается по рецепту и в его состав входит n ингредиентов, которые, как Володя прочитал, должны входить в борщ в пропорции литров (то есть в борщ войдет a1 ·x, ..., an ·x литров соответствующих ингредиентов для некоторого неотрицательного x). На кухне Володя обнаружил, что у него имеется b1, ..., bn литров этих ингредиентов соответственно. Чтобы искупить свои непростительные алгебраические ошибки, ему необходимо сварить как можно больше борща в кастрюле объема V литров (то есть в кастрюлю влезет от 0 до V литров). Какой объем борща приготовит Володя?

Входные данные

В первой строке входного файла через пробел записаны натуральные числа n и V (1 ≤ n ≤ 20, 1 ≤ V ≤ 10000). В следующей строке через пробел записаны n натуральных чисел ai (1 ≤ ai ≤ 100). Наконец, в последней строке через пробел записаны n натуральных чисел bi (0 ≤ bi ≤ 100).

Выходные данные

Выведите единственное вещественное число — объем борща, приготовленный Володей. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 4.

A. Провинился — на кухню!

жадные алгоритмы реализация *1400

Сегодня у Володи неудачный день. Он получил кол по алгебре, и за это сослан на кухню варить суп. Заодно и в алгебре подтянется.

Борщ делается по рецепту и в его состав входит n ингредиентов, которые, как Володя прочитал, должны входить в борщ в пропорции литров (то есть в борщ войдет a1 ·x, ..., an ·x литров соответствующих ингредиентов для некоторого неотрицательного x). На кухне Володя обнаружил, что у него имеется b1, ..., bn литров этих ингредиентов соответственно. Чтобы искупить свои непростительные алгебраические ошибки, ему необходимо сварить как можно больше борща в кастрюле объема V литров (то есть в кастрюлю влезет от 0 до V литров). Какой объем борща приготовит Володя?

Входные данные

В первой строке входного файла через пробел записаны натуральные числа n и V (1 ≤ n ≤ 20, 1 ≤ V ≤ 10000). В следующей строке через пробел записаны n натуральных чисел ai (1 ≤ ai ≤ 100). Наконец, в последней строке через пробел записаны n натуральных чисел bi (0 ≤ bi ≤ 100).

Выходные данные

Выведите единственное вещественное число — объем борща, приготовленный Володей. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 4.

A. Провинился — на кухню!

жадные алгоритмы реализация *1400

Сегодня у Володи неудачный день. Он получил кол по алгебре, и за это сослан на кухню варить суп. Заодно и в алгебре подтянется.

Борщ делается по рецепту и в его состав входит n ингредиентов, которые, как Володя прочитал, должны входить в борщ в пропорции литров (то есть в борщ войдет a1 ·x, ..., an ·x литров соответствующих ингредиентов для некоторого неотрицательного x). На кухне Володя обнаружил, что у него имеется b1, ..., bn литров этих ингредиентов соответственно. Чтобы искупить свои непростительные алгебраические ошибки, ему необходимо сварить как можно больше борща в кастрюле объема V литров (то есть в кастрюлю влезет от 0 до V литров). Какой объем борща приготовит Володя?

Входные данные

В первой строке входного файла через пробел записаны натуральные числа n и V (1 ≤ n ≤ 20, 1 ≤ V ≤ 10000). В следующей строке через пробел записаны n натуральных чисел ai (1 ≤ ai ≤ 100). Наконец, в последней строке через пробел записаны n натуральных чисел bi (0 ≤ bi ≤ 100).

Выходные данные

Выведите единственное вещественное число — объем борща, приготовленный Володей. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 4.

A. Провинился — на кухню!

жадные алгоритмы реализация *1400

Сегодня у Володи неудачный день. Он получил кол по алгебре, и за это сослан на кухню варить суп. Заодно и в алгебре подтянется.

Борщ делается по рецепту и в его состав входит n ингредиентов, которые, как Володя прочитал, должны входить в борщ в пропорции литров (то есть в борщ войдет a1 ·x, ..., an ·x литров соответствующих ингредиентов для некоторого неотрицательного x). На кухне Володя обнаружил, что у него имеется b1, ..., bn литров этих ингредиентов соответственно. Чтобы искупить свои непростительные алгебраические ошибки, ему необходимо сварить как можно больше борща в кастрюле объема V литров (то есть в кастрюлю влезет от 0 до V литров). Какой объем борща приготовит Володя?

Входные данные

В первой строке входного файла через пробел записаны натуральные числа n и V (1 ≤ n ≤ 20, 1 ≤ V ≤ 10000). В следующей строке через пробел записаны n натуральных чисел ai (1 ≤ ai ≤ 100). Наконец, в последней строке через пробел записаны n натуральных чисел bi (0 ≤ bi ≤ 100).

Выходные данные

Выведите единственное вещественное число — объем борща, приготовленный Володей. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 4.

A. Провинился — на кухню!

жадные алгоритмы реализация *1400

Сегодня у Володи неудачный день. Он получил кол по алгебре, и за это сослан на кухню варить суп. Заодно и в алгебре подтянется.

Борщ делается по рецепту и в его состав входит n ингредиентов, которые, как Володя прочитал, должны входить в борщ в пропорции литров (то есть в борщ войдет a1 ·x, ..., an ·x литров соответствующих ингредиентов для некоторого неотрицательного x). На кухне Володя обнаружил, что у него имеется b1, ..., bn литров этих ингредиентов соответственно. Чтобы искупить свои непростительные алгебраические ошибки, ему необходимо сварить как можно больше борща в кастрюле объема V литров (то есть в кастрюлю влезет от 0 до V литров). Какой объем борща приготовит Володя?

Входные данные

В первой строке входного файла через пробел записаны натуральные числа n и V (1 ≤ n ≤ 20, 1 ≤ V ≤ 10000). В следующей строке через пробел записаны n натуральных чисел ai (1 ≤ ai ≤ 100). Наконец, в последней строке через пробел записаны n натуральных чисел bi (0 ≤ bi ≤ 100).

Выходные данные

Выведите единственное вещественное число — объем борща, приготовленный Володей. Ваш ответ должен иметь относительную или абсолютную погрешность меньше чем 10 - 4.

B. Незаконченная партия

реализация *1700

Как-то раз Володя был в музее и увидел обыкновенную шахматную доску в качестве экспоната. На доске стояло всего четыре фигуры: две белых ладьи, белый король и черный король. «Ага! Черные точно не победили», — смекнул Володя. Ваша задача — выяснить, победили ли белые.

Гарантируется, что фигуры на доске занимают корректную шахматную позицию (то есть каждая фигура занимает ровно одну клетку, на каждой клетке находится не более одной фигуры и короли не бьют друг друга). Таким образом, все что от вас требуется — выяснить, поставлен ли черным мат. Напомним: это означает, что черный король находится под ударом одной из фигур противника и не может сходить в клетку, не находящуюся под ударом. Ладья ходит по вертикали или горизонтали на любое количество свободных клеток (то есть ходить и бить через фигуры она не может), король — в соседние по углу и стороне клетки. Разумеется, фигуры не могут выходить за пределы доски. Черный король может есть ладьи противника на своем ходе (см. пример 3).

Входные данные

Во входном файле содержатся через пробел расположения 4-х фигур на доске 8 × 8: двух ладей, белого короля, черного короля. Клетка доски задается двумя символами — ('a' - 'h') и ('1' - '8') — координатами по горизонтали и вертикали соответственно. Гарантируется, что никакие две фигуры не занимают одну и ту же клетку, а короли не бьют друг друга.

Выходные данные

Выведите "CHECKMATE", если белые поставили черным мат, или "OTHER" иначе.

C. Баг в коде

графы реализация Структуры данных *1900

Недавно в коде FOS обнаружили серьезный баг. Глава компании F хочет найти виновника бага и наказать его. Для этих целей было организовано собрание, центральным вопросом которого был: кто сделал баг? На собрании каждый из n программистов сказал: «Я точно знаю, что баг сделал либо x, либо y

Глава компании решил выбрать двух подозреваемых и вызвать их в свой кабинет. Конечно, он должен учитывать мнения программистов. Поэтому глава хочет сделать выбор так, чтобы с ним были согласны как минимум p программистов из n. Программист согласен с выбором двух подозреваемых, если хотя бы одного из двух людей, на которых он указывал на собрании, выбрали в качестве подозреваемого. Сколькими способами глава F может выбрать двух подозреваемых?

Обратите внимание, что даже если какого-то программиста выбрали в качестве подозреваемого, он может быть согласен с выбором главы (если он указывал на собрании на другого выбранного подозреваемого).

Входные данные

В первой строке записаны целые числа n и p (3 ≤ n ≤ 3·105; 0 ≤ p ≤ n) — количество программистов компании F и минимальное требуемое число согласных.

В каждой из n следующих строк записаны два целых числа xi, yi (1 ≤ xi, yi ≤ n) — номера программистов из высказывания i-го программиста. Гарантируется, что xi ≠ i,  yi ≠ i,  xi ≠ yi.

Выходные данные

Выведите единственное целое число — количество возможных выборов. Обратите внимание, что порядок подозреваемых не имеет значения, то есть выборы (1, 2) и (2, 1) считаются одинаковыми.

A. Паша и хомяки

Конструктив реализация *800

У Паши есть два хомяка: Артур и Александр. Паша выложил перед ними n яблок. Паша знает, какие из этих яблок нравятся Артуру. Аналогично, Паша знает, какие из этих яблок нравятся Александру. Чтобы не произошло конфликта (ведь некоторые из этих яблок могут нравиться обоим хомякам), Паша решил поделить все яблоки между хомяками самостоятельно. Какие-то яблоки он отдаст Артуру, а какие-то Александру. Неважно сколько яблок получит каждый из хомяков, однако каждый должен получить только те яблоки, которые ему нравятся. Возможно кому-то не достанется ни одного яблока.

Помогите Паше поделить все яблоки между хомяками. Обратите внимание, что Паша хочет поделить именно все яблоки, а не их часть.

Входные данные

В первой строке записаны целые числа n, a, b (1 ≤ n ≤ 100; 1 ≤ a, b ≤ n) — количество яблок у Паши, количество яблок, которые нравятся Артуру, и количество яблок, которые нравятся Александру, соответственно.

В следующей строке записаны a различных целых чисел — номера яблок, которые нравятся Артуру. В следующей строке записаны b различных целых чисел — номера яблок, которые нравятся Александру.

Считается, что яблоки нумеруются от 1 до n. Входные данные таковы, что ответ существует.

Выходные данные

Выведите n символов, каждый из которых либо 1, либо 2. Если i-й символ равен 1, значит i-е яблоко нужно отдать Артуру, иначе его нужно отдать Александру. Если существует несколько правильных ответов, разрешается вывести любой.

A. Паша и приседания

реализация *900

У Паши много хомяков, и он устраивает им зарядку. Сегодня на зарядку пришли n хомяков (n — четное). Хомяки выстроились в ряд, при этом каждый хомяк либо сел, либо встал.

Паше для очередного упражнения нужно, чтобы ровно хомяков стояли, а остальные сидели. За одну минуту Паша может заставить некоторого хомяка либо сесть, либо встать. Сколько минут ему понадобится, чтобы добиться требуемого, если он будет действовать оптимально?

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 200; n — четное). В следующей строке записано n символов без пробелов. Эти символы описывают положение хомяков: i-й символ равен «X», если i-й в ряду хомяк стоит, и равен «x», если он сидит.

Выходные данные

В первой строке выведите единственное целое число — минимальное требуемое количество минут. Во второй строке выведите строку описывающее положение хомяков, после того как Паша выполнит требуемые действия. Если существует несколько оптимальных положений, выведите любое.

B. Город-миллионер

Бинарный поиск жадные алгоритмы реализация сортировки *1200

Администрация Томской области твердо уверена, что пора и Томску стать городом-миллионером. Вместо улучшения демографической ситуации, они решили достигнуть своей цели путем расширения границы города.

Город Томск можно представить в виде точки на плоскости с координатами (0; 0). Вокруг города расположены n других населенных пунктов, i-й из которых имеет координаты (xi, yi) и население в ki человек. Можно расширить городские границы до круга радиуса r. В таком случае все населенные пункты, находящиеся внутри этого круга и на его границе, войдут в состав города.

Ваша цель — написать программу, которая определит минимальный радиус r, до которого необходимо расширить границы Томска, чтобы он стал городом-миллионером.

Входные данные

В первой строке входных данных заданы два целых числа n и s (1 ≤ n ≤ 103; 1 ≤ s < 106) — количество населенных пунктов вокруг города Томска и население города Томска. Далее следует n строк. В i-й из них задается три целых числа — значения координат xi и yi i-го населенного пункта и количество ki жителей в нем (1 ≤ ki < 106). Каждая из координат является целым числом и не превосходит по модулю 104.

Гарантируется, что никакие два населенных пункта не находятся в одной точке, и никакой населенный пункт не лежит в точке (0; 0).

Выходные данные

В выходные данные выведите «-1» (без кавычек), если Томску не удастся стать городом с миллионным населением. Иначе в первой строке выведите единственное вещественное число — минимальный радиус круга, до которого городу необходимо расшириться, чтобы стать городом-миллионером.

Ответ считается правильным, если его абсолютная или относительная погрешность не превышает 10 - 6.

A. Сережа и кружки

реализация *800

Сережа рассказал своим друзьям интересную игру. Смысл игры заключается в следующем. Изначально на столе стоит пустая чаша и n кружек с водой. Далее все игроки ходят по очереди, на своем ходу игрок выбирает непустую кружку с водой и выливает воду из нее в чашу. Если чаша переполнилась, считается, что этот игрок проиграл.

Как только друзья Сережи узнали новую игру, им сразу захотелось поиграть. А Сереже сразу захотелось узнать, могут ли его друзья так сыграть в эту игру, чтобы никто не проиграл. Заданы объемы всех кружек и чаши, также известно, что у Сережи (n - 1) друзей. Определите, могут ли друзья Сережи так сыграть в игру, чтобы никто не проиграл.

Входные данные

Первая строка содержит целые числа n и s (2 ≤ n ≤ 100; 1 ≤ s ≤ 1000) — количество кружек и объем чаши. Следующая строка содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 10). Число ai обозначает объем i-й кружки.

Выходные данные

В единственную строку выведите «YES» (без кавычек), если друзья могут сыграть описанным способом, и «NO» (без кавычек) иначе.

B. Сережа и развороты

реализация *1300

Пусть задана матрица b размера x × y, определим операцию разворота матрицы b. Разворотом матрицы b называется матрица c размера 2x × y, обладающая свойствами:

  • верхняя половина матрицы c (строки с номерами от 1 до x) в точности равна b;
  • нижняя половина матрицы c (строки с номерами от x + 1 до 2x) симметрична верхней относительно линии раздела двух половин (линия, проходящая посередине между строками x и x + 1).

У Сережи есть матрица a размера n × m. Он хочет найти такую матрицу b, что из нее можно получить матрицу a, выполнив несколько (возможно, ноль) разворотов. Какое минимальное количество строк может содержать такая матрица?

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 100). Следующие n строк содержат по m целых чисел — элементы матрицы a. В i-й строке записаны целые числа ai1, ai2, ..., aim (0 ≤ aij ≤ 1)i-я строка матрицы a.

Выходные данные

В единственную строку выведите ответ на задачу — минимальное количество строк матрицы b.

Примечание

Во первом тестовом примере ответом является матрица b размера 2 × 3:


001
110

Если применить к этой матрице операцию разворота, получится заданная во входных данных матрица a:


001
110
110
001

A. Полицейские-рекруты

реализация *800

Недавно в вашем городе открылось отделение полиции. Сейчас идет набор кадров для работы в новом отделении. А тем временем, преступления все совершаются в городе.

Достоверно известно, что один полицейский может расследовать только одно преступление за всю свою жизнь. Если преступление произошло в тот момент, когда в отделении полиции не было ни одного незанятого преступлениями полицейского, то оно так и останется навсегда нераскрытым.

Вам заданы события в хронологическом порядке. Каждое событие — это: либо совершение преступления, либо прием на работу нового полицейского. Какое минимальное количество преступлений в любом случае останутся нераскрытыми?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество событий. В следующей строке записано n целых чисел, описывающих события, через пробел.

Если число равняется -1, значит, произошло одно преступление. В противном случае, число будет положительным (не больше 10) и будет равняться количеству полицейских, нанятых в этот момент. События заданы в хронологическом порядке.

Выходные данные

Выведите единственное целое число — количество нерасследованных преступлений.

Примечание

Рассмотрим второй тестовый пример:

  1. Сначала на работу нанимают одного человека.
  2. Далее происходит преступление, дело отдают только что нанятому.
  3. Затем на работу нанимают еще одного человека.
  4. Происходит преступление, дело отдают последнему нанятому.
  5. Происходит преступление, и сейчас нет незанятых полицейских, поэтому преступление останется нераскрытым.
  6. Нанимают еще одного полицейского.
  7. Нанимают еще одного полицейского.
  8. Нанимают еще одного полицейского.

В итоге одно преступление в любом случае останется нераскрытым. Остальные два могут раскрыть.

B. Перевод заключенных

реализация Структуры данных *1100

В данный момент в тюрьме вашего города содержится n заключенных. Так как в тюрьме осталось мало свободных мест, мэр города решил перевести c заключенных в тюрьму другого города.

Для этого мэр выстроил всех n заключенных в шеренгу. У каждого заключенного на груди написано целое число, обозначающее жестокость совершенного им преступления. Чем больше число, тем серьезнее совершенное преступление.

Мэр попросил вас выбрать c преступников, которых надо перевести в другую тюрьму. Он поставил два условия:

  • Выбранные c преступников должны образовывать некоторый отрезок шеренги. Другими словами, выбранные преступники должны идти последовательно, без пропусков в шеренге.
  • Серьезность преступления каждого из выбранных преступников не должна быть больше t. В противном случае, преступник считается особо опасным, и мэр боится, что он сбежит во время перевода.

Сколькими способами можно выбрать c преступников, удовлетворив оба условия мэра?

Входные данные

В первой строке содержится три целых числа через пробел n (1 ≤ n ≤ 2·105), t (0 ≤ t ≤ 109) и c (1 ≤ c ≤ n). В следующей строке записано n целых чисел через пробел, i-е число обозначает жестокость преступления i-го в шеренге преступника (неотрицательное число, не превосходящее 109).

Выходные данные

Выведите единственное целое число — количество способов выбора c заключенных.

E. Полицейский патруль

жадные алгоритмы математика реализация Тернарный поиск *2000

Представьте, что ваш город — бесконечная двухмерная плоскость, с введенной на ней Декартовой системой координат. Единственная дорога, подверженная преступлениям, это ось Ox. На данный момент вдоль этой дороги стоят n преступников. Ни один полицейский участок еще не построен на дороге, поэтому мэр как можно скорее хочет построить участок и избавиться от преступников.

Управлять новым участком доверили вам, поэтому вам и выбирать, где он будет находиться. Вы должны так выбрать целочисленную точку для полицейского участка, чтобы операция по поимке всех преступников на оси Ox заняла как можно меньше времени. Поимка преступников оси Ox будет осуществляться только из нового участка.

В новом участке будет только одна патрульная машина. На этой машине можно подъезжать к преступникам, арестовывать их, затем сажать их в машину, везти в участок и сажать в тюрьму. В патрульную машину одновременно помещается не больше m преступников. Обратите внимание, что преступники не знают о вашей операции. Поэтому они будут стоять на месте, а не будут убегать.

Ваша задача — найти такое место для полицейского участка, что минимальное расстояние, которое придется в сумме проехать, чтобы посадить в тюрьму всех преступников, будет как можно меньше. Обратите внимание, что вы можете построить полицейский участок в точке, где находится один или несколько преступников, в таком случае все эти преступники сразу же будут аррестованы.

Входные данные

В первой строке записано два целых числа — n (1 ≤ n ≤ 106) и m (1 ≤ m ≤ 106), разделенные пробелом. В следующей строке записано n целых чисел через пробел. При этом i-е число обозначает позицию i-го преступника на оси Ox. Абсолютное значение этого числа не превосходит 109 для каждого преступника. Если преступник находится в позиции x, это обозначает, что он стоит в точке плоскости (x, 0).

Позиции преступников даны в неубывающем порядке. Обратите внимание, что в некоторой точке плоскости может стоять больше одного преступника.

Обратите внимание: входные/выходные данные имеют очень большой размер, поэтому не стоит использовать медленные способы ввода/вывода данных вашего языка программирования. Например, в языке C++ не стоит использовать потоки ввода/вывода (cin, cout).

Выходные данные

Выведите единственное целое число, обозначающее минимальное расстояние, которое требуется проехать, чтобы посадить в тюрьму всех преступников, при оптимальном выборе точки для полицейского участка.

B. Письмо

реализация Строки *1100

Вася решил написать анонимное письмо, вырезая буквы из газетного заголовка. Ему известен заголовок s1 и текст, который он хочет послать, s2. Каждую отдельную букву из заголовка Вася может использовать не более одного раза. Васе не нужно вырезать из заголовка пробелы — он просто делает на их месте пропуски. Помогите ему — выясните, удастся ли ему составить требуемый текст.

Входные данные

В первой строке содержится газетный заголовок s1. Во второй строке содержится текст письма s2. s1 и s2 — непустые строки, состоящие из пробелов, больших и маленьких латинских букв, длины которых не превосходят 200 символов. Большие и маленькие буквы следует различать. Вася не вырезает из заголовка пробелы.

Выходные данные

Если у Васи получится написать данное анонимное письмо, выведите YES, иначе выведите NO.

D. Путешествие

Конструктив Перебор реализация *2000

Территория Берляндии представляет собой прямоугольное поле n × m клеток. Король Берляндии живет в столице, расположенной в верхней левой клетке (1, 1). Нижняя правая клетка имеет координаты (n, m). Однажды король решил объехать всю страну и вернуться назад в столицу, побывав в каждой клетке (кроме столицы) ровно один раз. В столице король должен побывать ровно два раза — в самом начале и в самом конце путешествия. Король может переходить только в соседние по стороне клетки. Однако королевский советник сказал, что, возможно, у короля не получится это сделать. Но есть выход — построить систему односторонних телепортов между некоторыми клетками так, чтобы король сумел осуществить задуманное. В одну клетку можно установить не более одного телепорта, каждый телепорт можно использовать сколько угодно раз, но при каждом использовании он ведет в одну и ту же, заранее заданную для каждого телепорта в отдельности клетку. Когда король приходит в клетку, где есть телепорт, он сам выбирает, будет ли он пользоваться телепортом. Какое наименьшее количество телепортов необходимо построить, чтобы король смог успешно совершить запланированное путешествие? Также требуется составить для короля маршрут путешествия.

Входные данные

В первой строке через пробел записано два целых числа n и m (1 ≤ n, m ≤ 100, 2 ≤  n · m) — размеры поля. Верхняя левая клетка имеет координаты (1, 1), а нижняя правая — (n, m).

Выходные данные

В первой строке выведите целое число k — минимальное количество телепортов. Далее выведите k строк по 4 целых числа x1 y1 x2 y2 (1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m) — координаты клетки, в которую ставится телепорт (x1, y1), и координаты клетки, куда ведет телепорт (x2, y2).

Далее выведите nm + 1 строк по два числа — координаты клеток, в порядке их обхода королем. Маршрут должен начинаться и заканчиваться в (1, 1). Король может переходить в соседние по стороне клетки, а так же в клетки, куда ведет телепорт. При этом он должен побывать в столице ровно 2 раза, а во всех остальных клетках — ровно по одному разу.

E. Гонка

Перебор реализация *2300

Сегодня в Берляндии проходят автогонки. Трасса представляет собой прямую дорогу длиной s километров. В гонке участвует n машин, все они стартуют одновременно в самом начале трассы. Для каждой машины известно ее поведение во время гонки — система отрезков, на каждом из которых скорость машины постоянна. j-ый отрезок у i-ой машины — пара (vi, j, ti, j), где vi, j — скорость машины на всем отрезке в километрах в час, ti, j — сколько часов машина ехала с такой скоростью. Отрезки заданы в последовательном порядке.

Ваша задача — выяснить, сколько обгонов произошло за время гонки. Обгоном считается ситуация, когда одна машина догоняет и опережает другую. Известно, что все обгоны происходят мгновенно, то есть не существует отрезка времени положительной длины, в течение которого какие-то две машины едут «вместе». В один момент времени в одной и той же точке на трассе может произойти несколько обгонов. В этом случае их все следует учитывать отдельно. Встречи машин на старте и на финише не считаются обгонами.

Входные данные

В первой строке записано два целых числа n и s (2 ≤ n ≤ 100, 1 ≤ s ≤ 106) — количество машин и длина дороги в километрах. Далее следует n строк — описание системы отрезков для каждой машины. Каждое описание начинается с целого числа k (1 ≤ k ≤ 100) — количество отрезков в системе. Далее через пробел записано k пар чисел, каждая пара — скорость и длительность отрезка. Эти числа — целые положительные, не превосходящие 1000. Гарантируется, что сумма длин всех отрезков (в километрах) для каждой машины равна s, и все обгоны происходят мгновенно.

Выходные данные

Выведите одно число — количество обгонов, произошедших во время гонки.

A. Черный квадрат

реализация *800

Совсем недавно очень умный студент Юра решил, что сидеть на парах скучно, и скачал на свой супер крутой сенсорный телефон игру «Черный квадрат».

В игре экран телефона разделен на четыре вертикальные полоски. Каждую секунду на какой-то из полосок появляется черный квадратик, за эту секунду Юра по правилам игры должен нажать на соответствующую полоску, чтобы квадратик пропал. Поскольку Юра не только умный студент, а еще и ленивый, он посчитал, что тратит ровно ai калорий чтобы нажать на i-ю полоску.

Вам дана строка s, описывающая процесс игры, а также числа a1, a2, a3, a4. Посчитайте, сколько калорий потратит Юра, чтобы уничтожить все квадратики?

Входные данные

В первой строке через пробел записано четыре целых числа a1, a2, a3, a4 (0 ≤ a1, a2, a3, a4 ≤ 104).

Во второй строке записана строка s (1 ≤ |s| ≤ 105), где і-й символ строки равен «1», если на i-й секунде игры квадратик появится на первой полоске, «2» — если на второй, «3» — если на третьей, «4» — на четвертой.

Выходные данные

Выведите единственное целое число — суммарное количество калорий, которые потратит Юра.

B. Очередь в душ

Перебор реализация *1200

Много студентов живут в общежитии. Общежитие — это большой мир веселых развлечений и возможностей, но у него есть свои минусы.

В общежитии всего один душ, а желающих принять душ утром, конечно, больше. Поэтому каждое утро перед душем общежития образуется очередь из пяти человек. Как только душ открывается, первый человек из очереди заходит в душ. Спустя некоторое время, когда первый зашедший выходит из душа, следующий заходит в душ. Этот процесс продолжается, пока все в очереди не примут душ.

Душ — дело не быстрое, поэтому во время ожидания студенты общаются. В каждый момент времени студенты общаются парами: (2i - 1)-й человек в очереди (на текущий момент) общается с (2i)-м.

Рассмотрим этот процесс подробнее. Обозначим людей цифрами от 1 до 5. Пусть изначально очередь имеет вид 23154 (человек 2 стоит в начале очереди). Тогда перед открытием душа 2 общается с 3, 1 общается с 5, 4 ни с кем не общается. Затем 2 заходит в душ. Пока 2 принимает душ, 3 и 1 общаются, а также 5 и 4 общаются. Затем 3 заходит в душ. Пока 3 принимает душ, 1 и 5 общаются, 4 ни с кем не общается. Затем 1 заходит в душ, а пока он принимает душ, 5 и 4 общаются. Затем 5 заходит в душ, а затем 4 заходит в душ.

Известно, что если студенты i и j общаются, то радость студента i увеличивается на gij, а радость студента j увеличивается на gji. Вам надо найти такой изначальный порядок студентов в очереди, чтобы суммарная радость всех студентов в итоге была максимальной. Стоит заметить, что некоторые студенты могут общаться несколько раз. В приведенном выше примере студенты 1 и 5 общаются пока ждут открытия душа, а также пока 3 принимает душ.

Входные данные

Входные данные состоят из пяти строк, в каждой строке записано пять целых чисел разделенных пробелом: j-е число в i-й строке обозначает gij (0 ≤ gij ≤ 105). Гарантируется, что gii = 0 для всех i.

Считайте, что студенты пронумерованы от 1 до 5.

Выходные данные

Выведите единственное целое число — максимально возможную суммарную радость студентов.

Примечание

В первом примере оптимальное расположение очереди 23154. В таком случае суммарная радость равна:

(g23 + g32 + g15 + g51) + (g13 + g31 + g54 + g45) + (g15 + g51) + (g54 + g45) = 32
.

C. k-дерево

Деревья дп реализация *1600

Совсем недавно креативный студент Леша прослушал лекцию по деревьям. После лекции Леша был вдохновлен и придумал собственное дерево, которое он назвал k-дерево.

k-дерево — это бесконечное корневое дерево, в котором:

  • каждая вершина имеет ровно k сыновей;
  • каждое ребро имеет некоторый вес;
  • если рассмотреть ребра из некоторой вершины в ее сыновей (ровно k ребер), то их веса будут равны 1, 2, 3, ..., k.

На рисунке ниже представлен фрагмент 3-дерева.

Как только Дима, хороший друг Леши, узнал про это дерево, его сразу заинтересовал вопрос: «Сколько существует путей с суммарным весом ребер равным n, которые начинаются в корне k-дерева, а также содержат хотя бы одно ребро веса не меньше d?».

Помогите Диме узнать ответ на его вопрос. Так как количество путей может быть достаточно большим, найдите остаток от деления ответа на 1000000007 (109 + 7).

Входные данные

В единственной строке, через пробел, записано три целых числа: n, k и d (1 ≤ n, k ≤ 100; 1 ≤ d ≤ k).

Выходные данные

Выведите единственное целое число — ответ на задачу по модулю 1000000007 (109 + 7).

A. Выбор команд

жадные алгоритмы реализация сортировки *800

В центре олимпиадной подготовки программистов СГУ (ЦОПП СГУ) занимаются n ребят. Про каждого из них известно, сколько раз он/она уже участвовал/участвовала в чемпионате мира по программированию (ACM ICPC). По правилам ACM ICPC каждый человек может участвовать в чемпионате мира не более 5 раз.

Руководитель ЦОПП СГУ в данный момент формирует команды для участия в чемпионате мира. Каждая команда должна состоять ровно из 3 человек, причем один человек не может быть членом двух или более команд. Какое максимальное количество команд может составить руководитель, если он хочет чтобы каждая команда могла участвовать в чемпионате мира в этом же составе как минимум k раз?

Входные данные

В первой строке записаны два целых числа n и k (1 ≤ n ≤ 2000; 1 ≤ k ≤ 5). В следующей строке записано n целых чисел: y1, y2, ..., yn (0 ≤ yi ≤ 5), где yi обозначает сколько раз i-й человек участвовал в чемпионате мира ACM ICPC.

Выходные данные

Выведите единственное целое число — ответ на задачу.

Примечание

В первом тестовом примере можно составить только одну команду: первый, четвертый и пятый человек.

Во втором тестовом примере нельзя составить ни одну команду.

В последнем примере можно составить две команды. Причем любое разбиение на две команды подходит.

B. Футбольная форма

жадные алгоритмы Перебор реализация *1200

Рассмотрим футбольный турнир, в котором участвует n команд. У каждой команды есть две формы: домашняя и гостевая. Домашняя форма i-й команды имеет цвет xi, а гостевая форма — цвет yi (xi ≠ yi).

В турнире каждая команда играет с каждой ровно один матч дома и ровно один матч на выезде (всего n(n - 1) матчей). Команда, играющая дома, традиционно играет матч в домашней форме. Команда, играющая в гостях, по возможности играет в гостевой форме. Однако, если цвет гостевой формы команды, играющей в гостях, совпадает с цветом домашней формы, команды играющей дома, то команды будет сложно отличить на поле друг от друга. В этом случае команда, играющая в гостях, в качестве исключения играет матч в домашней форме.

Посчитайте, сколько матчей в турнире каждая команда сыграет в домашней форме, а сколько в гостевой?

Входные данные

В первой строке задано единственное целое число n (2 ≤ n ≤ 105) — количество команд. Далее в n строках задано описание команд. В i-й строке через пробел заданы два целых числа xi, yi (1 ≤ xi, yi ≤ 105xi ≠ yi) — номера цветов домашней и гостевой форм i-й команды соответственно.

Выходные данные

Для каждой команды в отдельной строке выведите через пробел два целых числа — количество матчей, которое эта команда сыграет в домашней и в гостевой формах соответственно. Ответы для команд выводите в порядке следования команд во входных данных.

A. Подарок Китахара Харуки

Перебор реализация *1100

Китахара Харуки купил n яблок для Тоума Казусы и Огисо Сетсуны. Он хочет разделить все купленные яблоки между друзьями.

Каждое яблоко весит 100 или 200 грамм. Конечно, Китахара Харуки не хочет обидеть ни одного из своих друзей. Следовательно, суммарный вес яблок, выданных Тоума Казусе, должен равняться суммарному весу яблок, выданных Огисо Сетсуне.

Но, к сожалению, Китахара Харуки не захватил с собой нож, поэтому он не может разрезать какое-то из яблок на части. Помогите герою определить, существует ли способ поровну разделить все яблоки между его друзьями?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — количество яблок. Во второй строке записано n целых чисел w1, w2, ..., wn (wi = 100 или wi = 200), где wi равняется весу i-го яблока.

Выходные данные

Выведите в единственной строке «YES» (без кавычек), если разделить яблоки поровну между друзьями Харуки возможно. В противном случае выведите «NO» (без кавычек).

Примечание

В первом тестовом примере Китахара Харуки может дать первое и последнее яблоко Огисо Сетсуне, а среднее — Тоума Казусе.

B. Камни Курияма Мираи

дп реализация сортировки *1200

Курияма Мираи убила много чудовищ и получила в награду много (а именно n) камней. Все камни Курияма Мираи пронумерованы от 1 до n. Цена i-го камня равняется vi. Курияма Мираи хочет узнать некоторую информацию о своих камнях, с этой целью она задает вам вопросы. Каждый вопрос имеет один из следующих видов:

  1. Она называет вам два числа, l и r (1 ≤ l ≤ r ≤ n), а вы должны сказать ей, чему равна сумма .
  2. Пусть ui равняется цене i-го по дешевизне камня (цена, которая будет на i-ом месте, если расположить все цены камней в порядке неубывания). На этот раз она называет вам два числа, l и r (1 ≤ l ≤ r ≤ n), а вы должны сказать ей, чему равна сумма .

Вам нужно ответить правильно на ее вопросы, или Курияма Мираи скажет «fuyukai desu» (яп. неприятно) и расстроится.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105). Во второй строке записано n целых чисел: v1, v2, ..., vn (1 ≤ vi ≤ 109) – цены камней.

В третьей строке записано целое число m (1 ≤ m ≤ 105) — количество вопросов Курияма Мираи. Затем следует m строк, в каждой строке записано три целых числа: type, l и r (1 ≤ l ≤ r ≤ n; 1 ≤ type ≤ 2), описывающих текущий вопрос. Если type равняется 1, то вам нужно вывести ответ на вопрос первого типа, в противном случае надо вывести ответ на вопрос второго типа.

Выходные данные

Выведите m строк. В каждой строке должно быть записано целое число — ответ на вопрос Курияма Мираи. Выводите ответы на вопросы в порядке их следования во входных данных.

Примечание

Пожалуйста, обратите внимание, что для хранения ответов на вопросы может быть не достаточно 32-битных целых чисел.

C. Блокнот памяти Рюко

математика реализация сортировки *1800

Рюко фантастически рассеянная девушка, она порой забывает даже то, что вот-вот произошло. Чтобы ничего не упустить, девушка везде берет с собой блокнот под названием Блокнот памяти Рюко. Все, что она видит и слышит, она записывает в этот блокнот.

Хотя Рюко все забывает, она родилась с великолепными мыслительными способностями. С другой стороны, качество рассуждений во многом зависит от имеющейся информации, иными словами, от памяти. И вот девушка листает вой блокнот каждый раз, когда над чем-то рассуждает — а это серьезная работа.

В блокноте Рюко n страниц, пронумерованных от 1 до n. Чтобы облегчить себе жизнь (и эту задачу), мы считаем, что для перехода со страницы x на страницу y надо перелистнуть |x - y| страниц. Чтобы сделать некоторое рассуждение, Рюко нужно иметь ввиду m фактов, i-й факт написан на странице ai. Факты следует читать из блокнота по порядку, в таком случае Рюко надо пролистать станиц, чтобы прочитать все факты.

Рюко хочет уменьшить количество пролистываемых страниц. Для достижения этой цели девушка может скопировать всю информацию со страницы x на страницу y (1 ≤ x, y ≤ n) блокнота. А затем заменить все элементы в последовательности a, равные x, на y. Обратите внимание, что x может равняться y, в таком случае никаких перемен не происходит.

Пожалуйста, скажите Рюко, какое минимальное количество страниц ей придется перелистнуть, чтобы прочитать все факты, если она может применить описанную операцию не более одного раза перед чтением. Обратите внимание, что ответ на задачу может превысить 32-битное целое число.

Входные данные

В первой строке записано два целых числа, n и m (1 ≤ n, m ≤ 105).

В следующей строке записано m целых чисел, разделенных пробелами: a1, a2, ..., am (1 ≤ ai ≤ n).

Выходные данные

Выведите единственное целое число — минимальное количество переворачиваемых страниц.

Примечание

В первом примере оптимальное решение — записать все со страницы 4 на страницу 3, тогда последовательность a станет равна {1, 2, 3, 3, 3, 2}, таким образом, количество переворачиваемых Рюко страниц равно |1 - 2| + |2 - 3| + |3 - 3| + |3 - 3| + |3 - 2| = 3.

Во втором примере оптимальное решение достигается копированием информации со станицы 9 на страницу 4.

D. Электронная таблица Нанами

реализация снм *2000

Нанами — эксперт в видеоиграх. Сегодня хороший друг Нанами, Хаджиме, пригласил ее посмотреть бейсбольный матч. Скрепя сердце девушка пошла с ним на стадион. Матч был не интересен Нанами, и она смотрела по сторонам в поисках чего-нибудь интересного. Внезапно она заметила цифровую таблицу в одном из концов стадиона.

Цифровая таблица имеет размер n пикселей в высоту и m пикселей в ширину, каждый пиксель таблицы либо светится, либо — нет. Пиксели описываются их координатами. Будем обозначать j-й пиксель в i-й строке таблицы записью (i, j). Во время матча электронная таблица отображает сообщения путем подсвечивания некоторой комбинации пикселей. Нанами заметила, что состояние пикселей на доске время от времени меняется. В определенное время определенные пиксели на доске могут переключаться со светящегося на не светящийся и наоборот.

Нанами интересно, какова площадь наибольшего светящегося подпрямоугольника таблицы, такого, что на его стороне есть определенный пиксель. Пиксель (i, j) принадлежит стороне подпрямоугольника, левый верхний и правый нижний углы которого находятся в (x1, y1) и (x2, y2), тогда и только тогда, когда выполняется следующее логическое условие:

((i = x1 или i = x2) и (y1 ≤ j ≤ y2)) или ((j = y1 или j = y2) и (x1 ≤ i ≤ x2)).

Нанами записала, как менялась доска во время матча, также у нее есть несколько вопросов описанного выше типа, можете ли вы ответить на все ее вопросы?

Входные данные

В первой строке записано три целых числа через пробел — n, m и q (1 ≤ n, m, q ≤ 1000) — высота и ширина электронной таблицы и количество операций.

Затем следует n строк, в каждой строке записано по m целых чисел через пробел: j-е целое число в i-й строке равняется ai, j — начальному состоянию пикселя (i, j).

  • Если ai, j = 0, то пиксель (i, j) изначально не светится.
  • Если ai, j = 1, то пиксель (i, j) изначально светится.

Затем следуют q строк, в каждой строке записано по три целых числа через пробел op, x, и y (1 ≤ op ≤ 2; 1 ≤ x ≤ n; 1 ≤ y ≤ m), описывающих события в порядке их возникновения.

  • Если op = 1, то пиксель в (x, y) меняет состояние (если он светился, то теперь он перестает светиться, и наоборот).
  • Если op = 2, то Нанами спрашивает у вас площадь наибольшего светящегося подпрямоугольника с пикселем (x, y) на стороне.
Выходные данные

Для каждого вопроса выведите единственную строку, содержащую целое число — ответ на вопрос Нанами.

Примечание

Рассмотрим первый пример.

В первом вопросе подпрямоугольник должен содержать пиксель (2, 2) на стороне, но этот пиксель не светится, поэтому подходящих светящихся прямоугольников нет, и ответ равняется 0.

В втором вопросе подпрямоугольник должен содержать пиксель (1, 2) на стороне. Самый большой такой подпрямоугольник — это подпрямоугольник с левым верхним углом в (1, 2) и правым нижним углом в (1, 3).

В последнем вопросе подпрямоугольник должен содержать пиксель (2, 2) на стороне, который засветился после третьего события. Самый большой светящийся подпрямоугольник — это подпрямоугольник с верхним левым углом в (1, 2) и правым нижним углом в (3, 3).

A. Очередь на остановке

реализация *1000

В разгар дачного сезона на автобусной остановке собирается большая очередь. Редкий случай, когда человек едет на дачу один, обычно собирается целая компания, именно поэтому люди в очереди стоят группами.

В очереди на автобус стоят n групп людей. В i-й от начала очереди группе ai человек. Каждые 30 минут на остановку подъезжает пустой автобус, в который помещается не более m человек. Конечно, первыми в автобус проходят люди из первой группы, затем люди из второй группы и так далее. Обратите внимание, что люди в очереди ни при каких обстоятельствах не пропускают друг друга вперед. Более того, если какая-то группа не помещается целиком в текущий автобус, то она ждет следующего автобуса, как и все люди стоящие за этой группой в очереди.

Ваша задача — определить, сколько потребуется автобусов, чтобы перевезти все n групп в дачный поселок.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 100). В следующей строке записаны n целых чисел: a1, a2, ..., an (1 ≤ ai ≤ m).

Выходные данные

Выведите единственное целое число — сколько потребуется автобусов, чтобы перевезти все n групп в дачный поселок.

C. Кардиограмма

реализация *1600

В этой задаче требуется нарисовать кардиограмму c помощью ASCII-графики.

Кардиограмма представляет из себя ломаную проходящую через точки:

То есть кардиограмма полностью определяется последовательностью целых положительных чисел a1, a2, ..., an.

Ваша задача по заданной последовательности ai нарисовать кардиограмму.

Входные данные

В первой строке задано целое число n (2 ≤ n ≤ 1000). В следующей строке записана последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1000). Гарантируется, что сумма всех ai не превышает 1000.

Выходные данные

Выведите max |yi - yj| строк (где yk обозначает y координату k-й точки ломаной), в каждой строке выведите символов. Каждый символ должен быть равен либо « / » (слеш), « \ » (обратный слеш), « » (пробел). Выведенное изображение должно быть изображением заданной ломаной. Пожалуйста, внимательно изучите тестовые примеры для более точного понимания, как нужно выводить кардиограмму.

Обратите внимание, в этой задаче проверяющая программа сравнивает ваш ответ с учетом пробельных символов. Не выводите никаких лишних символов. Напоминаем, что неправильный ответ на первый претест не засчитывается за штрафную попытку.

Примечание

По техническим причинам ответы на семплы в этой задаче нельзя скопировать. Ниже приведены две ссылки на текстовые файлы с ответами на первый и второй семплы.

http://cfassets.m27.workers.dev/rounds/435/1.txt

http://cfassets.m27.workers.dev/rounds/435/2.txt

B. Om Nom and Spiders

математика реализация *1400

Ом Ном очень любит конфеты и очень не любит пауков, поскольку последние частенько воруют конфеты. Как-то раз Ом Ном собрался на прогулку по парку. К сожалению, в парке водятся пауки, видеть которых Ом Ном совсем не хочет.

Парк можно представить как клетчатое поле n × m. В парке есть k пауков, каждый паук в момент времени 0 находится в некоторой клетке поля. Пауки все время двигаются, причем каждый паук всегда двигается в каком-то одном из четырех направлений (влево, вправо, вниз, вверх). За единицу времени паук из своей клетки переползает в соседнюю по стороне клетку в соответствующем направлении. Если в этом направлении клетки нет, то он покидает территорию парка. Пауки не мешают друг другу во время передвижения, в частности, в одно и то же время в одной клетке могут находиться несколько пауков.

Ом Ном еще не определился, откуда он начнет свою прогулку, но он точно хочет:

  • начать прогулку в момент времени 0 в одной из клеток верхней строки клетчатого поля (клетки этой строки гарантированно не содержат пауков);
  • во время всей прогулки двигаться вниз по полю по направлению к нижней строке (прогулка закончится, когда Ом Ном выйдет за пределы парка).

Ом Ном, как известно, передвигается прыжками. Один прыжок длится одну единицу времени и перемещает монстрика со своей клетки в соседнюю по стороне клетку поля следующей вниз строки, либо за пределы парка.

Каждый раз когда Ом Ном приземляется в какой-то клетке, он видит всех пауков, которые пришли в эту клетку в этот момент времени. Ом Ном хочет выбрать оптимальную клетку для начала прогулки. Поэтому ему интересно для каждой возможной стартовой клетки узнать, сколько пауков он увидит в процессе прогулки, если начнет из этой клетки. Помогите ему, посчитайте это количество для каждой возможной стартовой клетки.

Входные данные

В первой строке записано три целых числа n, m, k (2 ≤ n, m ≤ 2000; 0 ≤ k ≤ m(n - 1)).

Каждая из n следующих строк содержит m символов — описание парка. Символы, находящиеся в i-й строке, описывают i-ю строку клетчатого поля парка. Если символ в строке равен «.» — это значит, что соответствующая клетка поля пустая; иначе символ в строке будет равен одному из четырех символов: «L» (обозначает, что в этой клетке в момент времени 0 находится паук, который двигается влево), «R» (паука, который двигается вправо), «U» (паука, который двигается вверх), «D» (паука, который двигается вниз).

Гарантируется, что первая строка не сдержит пауков. Гарантируется, что никаких лишних символов описание поля не содержит. Гарантируется, что на поле в момент времени 0 находится ровно k пауков.

Выходные данные

Выведите m целых чисел: j-е число должно обозначать количество пауков, которое увидит Ом Ном, если начнет свою прогулку из j-й клетки первой строки. Клетки в строке клетчатого поля нумеруются слева направо.

Примечание

Рассмотрим первый тестовый пример. Ниже показано, как будет меняться расположение пауков на поле в течение времени:


... ... ..U ...
R.L -> .*U -> L.R -> ...
R.U .R. ..R ...

Символом «*» обозначена клетка, в которой находятся два паука одновременно.

  • Если Ом Ном начнет свой путь в первой клетке первой строки, тогда не вовсе не увидит пауков.
  • Если он начнет свой путь во второй клетке, тогда он увидит двух пауков в момент времени 1.
  • Если он начнет свой путь в третьей клетке, тогда он увидит двух пауков: одного в момент времени 1, а второго в момент времени 2.

A. Ребенок и домашняя работа

реализация *1300

Однажды маленький ребенок получил домашнее задание — тест с вариантами ответа. К каждому вопросу в тесте предлагается четыре варианта ответа: A, B, C и D. К каждому варианту ответа прилагается небольшое описание, используя их, ребенок должен найти единственно верный вариант.

К счастью, ребенок умеет решать этот сложный тест. Он следует алгоритму:

  • Если описание одного из вариантов по крайней мере в два раза короче всех остальных описаний, либо по крайней в два раза длиннее всех остальных описаний, то ребенок считает такой вариант ответа замечательным.
  • Если есть ровно один замечательный вариант ответа, то ребенок выбирает именно его. В противном случае ребенок выбирает вариант C (надеясь на удачу).

Вам даны вопросы с вариантами ответа. Сможете ли вы предугадать выбор ребенка?

Входные данные

Первая строка начинается с «A.» (без кавычек), затем в этой же строке следует описание варианта A. В следующих трех строках записаны другие варианты в аналогичном формате. Варианты заданы по порядку: B, C, D. Обратите внимание, что описание варианта ответа следует за префиксом «X.», этот префикс не стоит учитывать в длине описания варианта.

Каждое описание непустое и состоит из не более 100 символов. Каждый символ — либо строчная, либо прописная буква латинского алфавита, либо «_».

Выходные данные

Выведите единственную строчку с выбранным вариантом: «A», «B», «C» или «D» (без кавычек).

Примечание

В первом примере длина первого варианта равняется 39, второго — 35, третьего — 37, а четвертого — 15. Вариант D (длина 15) по крайней мере вдвое короче остальных вариантов, так что он и является замечательным. Других замечательных вариантов нет, поэтому ребенок выбирает D.

Во втором примере никакой вариант не является замечательным, поэтому ребенок выберет вариант C наудачу.

В последнем примере вариант B (длина 2) по крайней мере вдвое длиннее остальных вариантов, так что он и является замечательным. Других замечательных вариантов нет, поэтому ребенок выбирает B.

B. Ребенок и множество

битмаски жадные алгоритмы реализация сортировки *1500

В день детей ребенок пришел домой к Пиксу и все перевернул вверх дном. Пикс на него разозлился. В бардаке потерялось много всего, включая любимое множество Пикса.

К счастью, Пикс помнит кое-что о своем множестве S:

  • его элементами были различные целые числа от 1 до limit;
  • значение равнялось sum; функция lowbit(x) равна 2k, где k обозначает позицию первой единицы в двоичном представлении числа x. Например, lowbit(100102) = 102, lowbit(100012) = 12, lowbit(100002) = 100002 (числа записаны в двоичном представлении).

Помогите Пиксу. Найдите любое множество S, удовлетворяющее всем вышеперечисленным условиям?

Входные данные

В первой строке записано два целых числа: sum, limit (1 ≤ sum, limit ≤ 105).

Выходные данные

В первой строке выведите целое число n (1 ≤ n ≤ 105), обозначающее размер S. Затем выведите элементы множества S в любом порядке. Если есть несколько правильных ответов, выведите любой.

Если подходящего множества не существует, выведите -1.

Примечание

В примере 1: lowbit(4) = 4, lowbit(5) = 1, 4 + 1 = 5.

В примере 2: lowbit(1) = 1, lowbit(2) = 2, lowbit(3) = 1, 1 + 2 + 1 = 4.

A. Деву-певец и Чуру-комик

жадные алгоритмы реализация *900

Деву — известный исполнитель классической музыки. Его приглашают на многие большие фестивали и мероприятия. Недавно его пригласили на «всемирный фестиваль классического пения». Кроме Деву пригласили и комика Чуру.

Деву предоставил организаторам список песен и список времен, необходимых для их исполнения. Всего он будет петь n песен, i-я песня займет ровно ti минут. Комик Чуру будет рассказывать шутки. Все его шутки длятся ровно по пять минут.

Большинство людей придут на фестиваль послушать Деву. К сожалению, Деву требуется 10-минутный перерыв для отдыха после каждой песни. К счастью, Чуру может рассказывать шутки, не отдыхая.

Вы, как один из организаторов, должны составить оптимальное расписание для меропрития. По некоторым причинам надо соблюдать следующие условия:

  • продолжительность мероприятия не должна превышать d минут;
  • Деву должен спеть полностью все свои песни, при этом количество рассказанных Чуру шуток должно быть как можно больше.

Если невозможно найти способ спланировать мероприятие, чтобы Деву спел все свои песни, выведите -1. В противном случае, выведите максимальное количество шуток, которые Чуру сможет рассказать на мероприятии.

Входные данные

В первой строке записано два целых числа через пробел — n, d (1 ≤ n ≤ 100; 1 ≤ d ≤ 10000). Во второй строке записано n целых чисел через пробел: t1, t2, ..., tn (1 ≤ ti ≤ 100).

Выходные данные

Если невозможно найти способ спланировать мероприятие, чтобы Деву спел все свои песни, выведите -1. В противном случае выведите максимальное количество шуток, которые Чуру сможет рассказать на мероприятии.

Примечание

Рассмотрим первый пример. Длительность мероприятия составляет 30 минут. Можно составить план мероприятия, в котором у Чуру будет 5 шуток, следующим образом:

  • Сначала Чуру рассказывает шутку 5 минут.
  • Затем Деву поет первую песню 2 минуты.
  • Затем Чуру рассказывает 2 шутки за 10 минут.
  • Затем Деву поет следующую песню за 2 минуты.
  • Затем Чуру рассказывает 2 шутки за 10 минут.
  • И наконец Деву поет свою последнюю песню за 1 минуту.

В целом ребята тратят 5 + 2 + 10 + 2 + 10 + 1 = 30 минут. Получить больше шуток никак не получится.

Рассмотрим второй пример. Здесь мы никак не можем организовать все песни Деву. Следовательно, ответ равен -1.

B. Деву-дурачок

реализация сортировки *1200

Деву — дурачок и учится очень медленно. Вам надо научить его n дисциплинам, i-я дисциплина состоит из ci частей, при этом для изучения дисциплины, нужно последовательно изучить все ее части.

Изначально «способность усвоения знаний» Деву равна x часов. Иными словами, он может усвоить любую часть некоторой дисциплины за x часов.

Впрочем, Деву не полный дурак — есть на что надеяться. Если вы обучите его какой-то дисциплине, то для изучения каждой части следующей дисциплины потребуется ровно на один час меньше, чем раньше (для лучшего понимания смотрите примеры). Обратите внимание, что его способность усвоения не может быть менее 1 часа.

Вы можете обучать его дисциплинам в любом порядке. Подсчитайте наименьшее количество времени (в часах), необходимое Деву для усвоения всех n дисциплин — и тогда можно будет порешать более интересные задачи, а не нянчиться с дурачком.

Пожалуйста, будьте внимательны — ответ может превысить 32-битный целочисленный тип данных.

Входные данные

В первой строке записано два целых числа через пробел — n, x (1 ≤ n, x ≤ 105). В следующей строке записано n целых чисел через пробел: c1, c2, ..., cn (1 ≤ ci ≤ 105).

Выходные данные

Выведите единственное целое число — ответ на задачу.

Примечание

Посмотрите на первый пример. Рассмотрим порядок обучения дисциплинам: 1, 2. Когда вы будете обучать Деву первой дисциплине, у него уйдет 3 часа на одну часть, таким образом, на первую дисциплину уйдет всего 12 часов. После освоения первой дисциплины скорость усвоения Деву станет 2 часа. Теперь на усвоение второй дисциплины уйдет 2 × 1 = 2 часа. Следовательно, всего потребуется 12 + 2 = 14 часов.

Рассмотрим порядок дисциплин: 2, 1. Когда вы будете учить Деву второй дисциплине, у него будет уходить по 3 часа на одну часть, следовательно, на вторую дисциплину уйдет 3 × 1 = 3 часа. После усвоения второй дисциплины его скорость усвоения составит 2 часа. Теперь на усвоение первой дисциплины надо 2 × 4 = 8 часов. Следовательно, всего потребуется 11 часов.

Итак, минимальное количество часов, требуемое для обучения Деву, равно 11.

Посмотрите на третий тестовый пример. В этом тестовом примере порядок обучения дисциплинам не имеет значения. Когда вы будете обучать Деву первой дисциплине, у него уйдет 3 часа на одну часть. Когда вы будете обучать Деву второй дисциплине, у него уйдет 2 часа на одну часть. Когда вы будете обучать Деву третьей дисциплине, у него уйдет 1 час на одну часть. Всего будет нужно 6 часов, чтобы обучить Деву всем дисциплинам.

C. Деву и разбиение массива

Конструктив Перебор реализация теория чисел *1700

Деву еще маленький, поэтому он очень любит играть. Весьма удивительно, но играть он предпочитает только с массивами. Однажды во время игры ему в голову пришел интересный вопрос, который Деву сам для себя разрешить не мог. Сможете ли вы найти ответ на этот вопрос?

Дан массив, состоящий из различных целых чисел. Возможно ли так разбить весь массив на k непересекающихся непустых частей, чтобы ровно p частей имели четную сумму элементов (каждая из этих p частей должна иметь четную сумму), а оставшиеся k - p частей имели нечетную сумму элементов? (обратите внимание, что элементы какой-то части не обязаны идти в массиве подряд).

Если существует способ разбить массив описанным образом, требуется вывести также и само разбиение.

Входные данные

В первой строке записано три целых числа через пробел n, k, p (1 ≤ k ≤ n ≤ 105; 0 ≤ p ≤ k). В следующей строке записано n различных целых чисел через пробел, представляющих содержимое массива a: a1, a2, ..., an (1 ≤ ai ≤ 109).

Выходные данные

В первой строке выведите «YES» (без кавычек), если можно разбить массив требуемым способом. В противном случае выведите «NO» (без кавычек).

Если требуемое разбиение существует, выведите k строк вслед за первой. В i-й из них должно быть записано содержимое i-й части. Выводите содержимое части в строке следующим образом: сперва выведите количество элементов в этой части, затем выведите все элементы части в произвольном порядке. Сумма элементов у ровно p из всех выведенных частей должна быть четной. В каждой из оставшихся k - p частей сумма должна быть нечетная.

Так как может быть несколько способов разбиения, разрешается вывести любое корректное разбиение.

A. Золотая осень

реализация *900

Какое прекрасное время года — золотая осень! Девочка Алена ходит по лесу и собирает букет из опавших листьев. Алена очень избирательна — она не берет листочек, если он совпадает одновременно и по виду, и по цвету с одним из уже имеющихся у нее. Выясните, сколько листьев собрала Алена.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100) — количество листьев, попавшихся Алене. Следующие n строк содержат описания листьев. Каждый лист характеризуется видом дерева, с которого он упал, и цветом. Виды деревьев и цвета заданы названиями, состоящими из не более 10 строчных латинских букв. Название не может быть пустой строкой. Вид дерева и цвет задаются в каждой строке через пробел.

Выходные данные

Выведите одно число — количество листьев у Алены.

B. Кола

реализация *1500

По торжественному случаю открытия Зимней Компьютерной Школы организаторы решили закупить n литров колы. Однако в магазине возникло неожиданное затруднение: оказалось, что кола продается в бутылках по 0.5, 1 и 2 литра. При этом имеется ровно a бутылок по 0.5 литра, b литровых бутылок и c — двухлитровых. У организаторов достаточно денег, чтобы купить любое количество колы. Ожесточенные споры вызвало то, сколько каких бутылок покупать, ведь этот вопрос имеет принципиальное значение с точки зрения распределения колы между участниками (и организаторами тоже).

Итак, пока организаторы спорят, перебирая различные варианты закупки колы, Зимняя Компьютерная Школа не начнется. Ваша задача — посчитать количество всех возможных способов закупить ровно n литров колы и убедить организаторов, что это количество слишком велико и что если они будут продолжать свой спор, то Зимнюю Компьютерную Школу придется проводить летом.

Все бутылки колы одного объема считаются неразличимыми. Т.е. два варианта закупки отличаются друг от друга только в случае, когда они отличаются количеством бутылок хотя бы одного вида.

Входные данные

В первой строке заданы четыре целых числа — n, a, b, c (1 ≤ n ≤ 10000, 0 ≤ a, b, c ≤ 5000).

Выходные данные

Выведите единственное число — ответ на задачу. Если купить ровно n литров колы невозможно, выведите 0.

C. Каникулы

реализация *1300

В Берляндии наступают каникулы, которые будут длиться n дней. Ученики школы №N отдыхают, а учительница информатики Марина Сергеевна, которая все лето была занята проверкой БГЭ (Берляндского государственного экзамена), наконец-то взяла отпуск! Для ежедневного полива цветов в классе был составлен график дежурств. Однако составлявшая график Марина Сергеевна так устала от работы и была поглощена мечтами о предстоящем отпуске, что, возможно, допустила некоторые ошибки. А именно, могло случиться так, что согласно графику в некоторые дни каникул цветы не будут политы или будут политы несколько раз. Помогите Марине Сергеевне найти ошибку.

Входные данные

В первой строке заданы два числа n и m (1 ≤ n, m ≤ 100) — количество дней в берляндских каникулах и количество дежурных соответственно. Следующие m строк содержат описание графика дежурств. Каждая строка содержит два целых числа ai и bi (1 ≤ ai ≤ bi ≤ n), означающих, что i-й дежурный должен поливать цветы с ai-го по bi-й день включительно, по одному разу в день. Дежурства описываются по порядку, т.е. bi ≤ ai + 1 для всех i от 1 до n - 1 включительно.

Выходные данные

Выведите «OK» (без кавычек), если график не содержит ошибок. Иначе нужно найти наименьший номер дня, в который цветы не будут политы или будут политы несколько раз, и вывести два целых числа — номер дня и сколько раз будут политы цветы в этот день.

Примечание

Обратите внимание, во втором примере из условия ошибка происходит не только во второй день, но и в шестой, когда цветы никто не поливает. Однако выдать нужно именно второй день, т.е. день с наименьшим номером.

G. Тир

реализация Структуры данных *2500

Тир в Берляндском парке культуры и отдыха по праву считается одним из лучших в мире. Ежедневно лучшие стрелки страны оттачивают там свое мастерство, а многочисленные посетители соревнуются в стрельбе по мишеням в борьбе за достойные призы. А недавно директор парка решил сделать онлайн-версию тира. В процессе разработки выяснилось, что нужна программа, эффективно моделирующая процесс стрельбы. Чтобы сформулировать требования к программе, тир был описан формально. Была введена трехмерная декартова система координат, в которой ось X проходила по полу тира по линии, вдоль которой стоят стрелки, ось Y проходила вертикально по стене тира, а положительное направление оси Z совпадало с направлением стрельбы. Плоскость XOY назовем плоскостью стрельбы и будем считать, что все пули выходят из дул в точках этой плоскости и летят параллельно оси Z. Каждая мишень представляет собой прямоугольник, стороны которого параллельны осям X и Y, имеющий положительную z-координату. Все мишени находятся на разном расстоянии от плоскости стрельбы. Пуля попадает в мишень, если она проходит через внутренность или границу соответствующего ей прямоугольника. Когда пуля поражает мишень, мишень падает вертикально вниз, в подпол тира, и больше по ней стрелять нельзя. Мишени достаточно прочные, поэтому пуля не может пробить мишень насквозь, и в случае попадания пуля не летит дальше. На вход программе-симулятору дается расположение всех мишеней, а также координаты всех выстрелов в порядке их появления. Программа должна определить, какая мишень была сбита каждым выстрелом. Если вы еще не догадались, то написать такую программу поручается вам.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество мишеней. Каждая из последующих n строк содержит описание одной мишени. Мишень описывается пятью целыми числами xl, xr, yl, yr, z, задающими ее расположение в пространстве (0 ≤ xl < xr ≤ 107, 0 ≤ yl < yr ≤ 107, 0 < z ≤ 107). В следующей строке записано целое число m (1 ≤ m ≤ 105), задающее количество выстрелов. Далее в m строках описаны выстрелы. Каждый выстрел задается координатами пули в плоскости стрельбы (x, y) (0 ≤ x, y ≤ 107, координаты пуль целые). Выстрелы задаются в том порядке, в каком они производились. Интервалы между выстрелами достаточно большие, а мишень падает очень быстро, поэтому считайте, что падающая мишень не может преградить путь выстрелам, следующим за тем, который ее сбил.

Выходные данные

Для каждого выстрела в отдельной строке выведите номер мишени, которую поразил этот выстрел, или 0, если пуля не попала ни в какую мишень. Мишени нумеруются с 1 в том порядке, в каком они заданы во входных данных.

A. Пропущенная серия

реализация *800

Поликарп очень любит смотреть сериалы. Вот и сейчас он заканчивает смотреть сезон популярного ситкома «Теория графов». Всего в сезоне n серий, которые пронумерованы числами от 1 до n.

Поликарп смотрит серии не подряд, а как придется — в случайном порядке. Он уже посмотрел все серии, кроме одной. Какую серию Поликарп забыл посмотреть?

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 100000) — количество серий в сезоне. Считайте, что серии пронумерованы целыми числами от 1 до n.

Вторая строка содержит n - 1 число a1, a2, ..., an (1 ≤ ai ≤ n) — номера серий, которые Поликарп уже посмотрел. Все значения ai различны.

Выходные данные

Выведите номер серии, которую Поликарп еще не смотрел.

B. Уравниватель

жадные алгоритмы реализация *1600

У Пети есть k спичек, разложенных по n выложенным в ряд слева направо коробкам. Известно, что k делится на n. Петя хочет, чтобы во всех коробках было одинаковое количество спичек. Для этого он может за один ход переложить одну спичку в соседний коробок. За сколько таких операций он может добиться желаемой конфигурации?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 50000). Во второй строке записаны n неотрицательных чисел, не превосходящих 109, i-е записанное число — это количество спичек в i-й коробке. Гарантируется, что суммарное количество спичек делится на n.

Выходные данные

Выведите искомое минимальное количество действий.

A. Валера и антиквариат

реализация *1000

Валера — коллекционер. Как-то раз он захотел пополнить свою коллекцию еще ровно одним предметом антиквариата.

Валера знает n продавцов антиквариата, i-й них выставил на аукцион ki предметов. В данный момент аукционная цена j-го предмета i-го продавца равна sij. Валера имеет хорошие отношения с каждым из n продавцов. Он точно уверен, что, если он перебьет текущую цену одного из предметов на аукционе (другими словами, предложит продавцу сумму, строго большую текущей цены предмета на аукционе), то продавец предмета сразу же оформит с ним сделку.

К сожалению, у Валеры есть всего лишь v единиц денег. Помогите ему определить, с какими из n продавцов он сможет заключить сделку?

Входные данные

В первой строке записано два целых числа через пробел n, v (1 ≤ n ≤ 50; 104 ≤ v ≤ 106) — количество продавцов и количество денег, имеющихся в распоряжении Валеры.

Далее следуют n строк. В i-й строке сначала записано целое число ki (1 ≤ ki ≤ 50) — количество предметов у i-го продавца. Далее записано ki целых чисел через пробел si1, si2, ..., siki (104 ≤ sij ≤ 106) — текущие цены предметов i-го продавца.

Выходные данные

В первой строке выведите целое число p — количество продавцов, с которыми Валера может заключить сделку.

Во второй строке выведите p целых чисел через пробел q1, q2, ..., qp (1 ≤ qi ≤ n) — номера продавцов, с которыми Валера может заключить сделку. Выводите номера продавцов в порядке возрастания.

Примечание

В первом примере Валера может заключить сделку с каждым из продавцов. Он может перебить цену следующих предметов: стоимостью 40000 у первого продавца, стоимостью 20000 у второго продавца, и стоимостью 10000 у третьего продавца.

Во втором примере Валера не может заключить сделку ни с одним из продавцов, поскольку цены всех предметов на аукционе слишком большие для Валеры.

B. Валера и фрукты

жадные алгоритмы реализация *1400

Валера очень любит свой сад, в котором растут n фруктовых деревьев.

В этом году будет большой урожай! На i-м дереве растут bi фруктов, все они созреют в день с номером ai. К сожалению, фрукты на дереве быстро портятся, поэтому собирать их можно только в день с номером ai и в день с номером ai + 1 (все фрукты, которые не собрали в эти два дня, становятся непригодными).

Валера не очень быстрый, но есть и позитивные моменты. Валера готов работать ежедневно. За один день Валера может собрать не более v фруктов. Фрукты могут быть как с одного дерева, так и с разных. Какое максимальное количество фруктов может собрать Валера за все время, если будет действовать оптимально?

Входные данные

В первой строке записано два целых числа через пробел n и v (1 ≤ n, v ≤ 3000) — количество фруктовых деревьев в саду и количество фруктов, которое Валера может собрать за один день.

В следующих n строках записано описание деревьев в саду. В i-й строке записано два целых целых числа через пробел ai и bi (1 ≤ ai, bi ≤ 3000) — день созревания фруктов на i-м дереве и количество фруктов на i-м дереве.

Выходные данные

Выведите единственное целое число — максимальное количество фруктов, которое может собрать Валера.

Примечание

В первом примере, чтобы получить оптимальный ответ, нужно действовать следующим образом.

  • Собрать в первый день 3 фрукта с 1-го дерева.
  • Собрать во второй день 1 фрукт со 2-го дерева и 2 фрукта с 1-го дерева.
  • В третий день собрать оставшиеся фрукты со 2-го дерева.

Во втором примере можно собрать только 60 фруктов, остальные фрукты просто пропадут.

C. Валера и трубы

Конструктив поиск в глубину и подобное реализация *1500

У Валеры есть прямоугольная таблица, состоящая из n строк и m столбцов. Валера пронумеровал строки таблицы, начиная от единицы, сверху вниз, а столбцы — начиная от единицы, слева направо. Ячейку, расположенную на пересечении строки x и столбца y, будем обозначать парой чисел (x, y).

Валера хочет разместить ровно k труб на своей прямоугольной таблице. Трубой будем называть такую последовательность ячеек таблицы (x1, y1), (x2, y2), ..., (xr, yr), что:

  • r ≥ 2;
  • для любого целого i (1 ≤ i ≤ r - 1) выполняется равенство |xi - xi + 1| + |yi - yi + 1| = 1;
  • каждая ячейка, принадлежащая трубе, встречается в последовательности ячеек ровно один раз.

Валера считает, что трубы размещены красиво, если выполнены условия:

  • никакая пара труб не имеет общих ячеек;
  • каждая ячейка таблицы принадлежит некоторой трубе.

Помогите Валере красиво разместить k труб на его прямоугольной таблице.

Входные данные

В первой строке задано три целых числа через пробел n, m, k (2 ≤ n, m ≤ 300; 2 ≤ 2k ≤ n·m) — количество строк, количество столбцов и количество труб, соответственно.

Выходные данные

Выведите k строк. В i-й строке выведите описание i-й трубы: сначала выведите целое число ri (количество ячеек трубы), затем выведите 2ri целых чисел xi1, yi1, xi2, yi2, ..., xiri, yiri (последовательность ячеек таблицы).

Если существует несколько решений, разрешается вывести любое. Гарантируется, что хотя бы одно решение существует.

Примечание

Иллюстрация к первому примеру:

Иллюстрация ко второму примеру:

D. Валера и обмены

графы Конструктив математика реализация снм строковые суфф. структуры *2100

Перестановкой p длины n называется последовательность различных целых чисел p1, p2, ..., pn (1 ≤ pi ≤ n). Перестановка называется тождественной, если для всех i выполняется равенство pi = i.

Обмен (i, j) — это операция, в результате которой элементы pi и pj меняются местами в перестановке. Пусть f(p) — это минимальное число обменов, которое нужно совершить, чтобы перестановка p стала тождественной.

Валера очень хочет узнать, как за минимальное число обменов из перестановки p получить перестановку q, такую, что f(q) = m. Помогите ему в этом.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 3000) — длина перестановки p. Во второй строке записано n различных целых чисел p1, p2, ..., pn (1 ≤ pi ≤ n) — изначальная перестановка Валеры. В последней строке записано целое число m (0 ≤ m < n).

Выходные данные

В первой строке выведите целое число k — минимальное число обменов.

Во второй строке выведите 2k целых чисел x1, x2, ..., x2k — описание последовательности обменов. Выведенные числа обозначают, что необходимо последовательно произвести обмены (x1, x2), (x3, x4), ..., (x2k - 1, x2k).

Если существует несколько последовательностей обменов минимальной длины, выведите лексикографически минимальную.

Примечание

Последовательность x1, x2, ..., xs лексикографически меньше последовательности y1, y2, ..., ys, если существует такое целое число r (1 ≤ r ≤ s), что x1 = y1, x2 = y2, ..., xr - 1 = yr - 1 и xr < yr.

A. Боря и Ханаби

битмаски Перебор реализация *1700

Вы когда-нибудь играли в Ханаби? Если нет, то вам обязательно стоит попробовать! В этой задаче пойдет речь об упрощенной версии этой игры.

Всего в игре 25 типов карт (5 различных цветов и 5 различных значений). У Бори на руках n карт. Игра несколько усложняется тем, что эти карты видят все, кроме него. Из информации, которая была доступна Боре на протяжении игры, он смог вычислить, какие именно карты у него есть, но он ничего не подозревает о порядке, в котором они лежат. Заметим, что у Бори может быть несколько одинаковых карт (и про каждый из 25 типов карт он знает, сколько именно у него карт этого типа).

Цель других игроков — сделать так, чтобы про каждую свою карту Боря смог сказать, какого она цвета и какое число на ней написано. Для этого другие игроки могут делать подсказки. Подсказки бывают двух типов: по цвету и по значению.

Подсказка по цвету происходит следующим образом. Игрок называет некоторый цвет и показывает на все карты этого цвета.

Аналогично происходит и подсказка по значению. Игрок называет некоторое число и показывает на все карты, на которых написано это число.

Определите, какое наименьшее количество подсказок должны сделать другие игроки, чтобы про каждую карту Боре стало понятно, какого она цвета и какое число на ней написано.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — количество карт у Бори. В следующей строке через пробел следуют описания n карт. Описание каждой карты состоит ровно из двух символов. Первый символ обозначает цвет (всего на этой позиции может стоять пять различных букв — R, G, B, Y, W). Второй символ обозначает значение карты (это цифра от 1 до 5). Боря не знает порядок, в котором карты выложены на стол.

Выходные данные

Выведите единственно число — наименьшее количество подсказок, которые должны сделать другие игроки.

Примечание

В первом примере Боря и так знает про каждую карту, что она зеленая тройка.

Во втором примере можно показать все четверки и все красные карты.

В третьем примере нужно сделать подсказки про любые четыре цвета.

A. Антон и буквы

Конструктив реализация *800

Недавно у Антона появилось множество, состоящие из маленьких латинских букв. Он аккуратно выписал все буквы, которые в него входят в одну строку через запятую. Для красоты он так же добавил в начало этой строки открывающуюся фигурную скобку, а в конец — закрывающуюся.

К сожалению, Антон иногда забывал, что уже записал некоторую букву, и выписывал ее снова. Он просит вас посчитать общее число различных букв в его множестве.

Входные данные

В первой и единственной строке задано описание множества букв. Длина строки не превышает 1000. Гарантируется, что строка начинается с открывающейся фигурной скобки, а заканчивается закрывающейся. Между ними через запятую перечислены маленькие латинские буквы. После каждой запятой следует пробел.

Выходные данные

Выведите единственное число — количество различных букв в множестве Антона.

B. Коля и тандемный повтор

Перебор реализация Строки *1500

На день рождения Коле подарили строку s, состоящую из маленьких латинских букв. Он, недолго думая, дописал к ней еще k символов справа.

После этого пришел Боря и сказал, что в новой строке, в качестве подстроки, есть тандемный повтор длины l. Насколько большим могло быть l?

Определение тамдемного повтора дано в примечании.

Входные данные

В первой строке содержится s (1 ≤ |s| ≤ 200). Строка состоит только из маленьких английских букв. Во второй строке содержится число k (1 ≤ k ≤ 200) — количество дописанных символов.

Выходные данные

Выведите одно число — максимальную длину тандемного повтора, который мог встретится в новой строке.

Примечание

Тандемным повтором длины 2n называется строка s, в которой для любой позиции i (1 ≤ i ≤ n) выполняется si = si + n.

В первом примере Коля мог получить строку aabaab, во втором — aaabbbbbb, в третьем — abracadabrabracadabra.

A. DZY любит шахматную доску

поиск в глубину и подобное реализация *1200

DZY любит шахматную доску и всякие игры с ней.

У него есть шахматная доска, состоящая из n строк и m столбцов. Некоторые ячейки шахматной доски плохие, остальные хорошие. На каждую хорошую ячейку DZY хочет поставить одну фигурку. Каждая фигурка белая или черная. DZY хочет, чтобы после расстановки всех фигурок никакие две фигурки одного цвета не находились в соседних ячейках. Две ячейки доски считаются соседними тогда и только тогда, когда у них есть общая сторона.

Ваша задача — найти любое подходящее расположение фигурок на данной доске.

Входные данные

В первой строке записано два целых числа через пробел, n и m (1 ≤ n, m ≤ 100).

В каждой из следующих n строк записано m символов: j-й символ i-й строки — это либо «.», либо «-». Символ «.» обозначает, что соответствующая ячейка (в i-й строке и j-м столбце) хорошая, в то время как «-» обозначает, что ячейка плохая.

Выходные данные

Выведите n строк, в каждой строке выведите m символов. При этом, j-й символ i-й строки должен равняться либо «W», либо «B», либо «-». Символ «W» означает, что фигурка в ячейке белая, «B» означает, что фигурка черная, «-» означает, что ячейка плохая.

Если существует несколько ответов, выведите любой из них. Гарантируется, что хотя бы один ответ существует.

Примечание

В первом примере DZY ставит в единственную хорошую ячейку черную фигурку. Конечно, фигурка могла бы быть и белой.

Во втором примере все 4 ячейки хорошие. В ответе на этот тестовый пример никакие две фигурки одного цвета не стоят в соседних ячейках.

В третьем примере никакие две хорошие ячейки не являются соседними. Таким образом, можно поставить на доску 3 фигурки любого цвета.

A. DZY любит последовательности

дп реализация *1600

У DZY есть последовательность a, состоящая из n целых чисел.

Назовем последовательность ai, ai + 1, ..., aj (1 ≤ i ≤ j ≤ n) подотрезком последовательности a. Значение (j - i + 1) обозначает длину подотрезка.

DZY хочет найти максимальный по длине подотрезок a, обладающий следующим свойством. Из подотрезка можно получить строго возрастающую последовательность, выполнив изменение не более одного элемента подотрезка (разрешается изменить значение любого элемента подотрезка на любое целое значение).

Ваша задача — вывести длину искомого оптимального подотрезка.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105). В следующей строке записано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109).

Выходные данные

В единственной строке выведите ответ на задачу — максимальную длину подотрезка.

Примечание

Вы можете выбрать подотрезок a2, a3, a4, a5, a6 и заменить его 3-й элемент (то есть, a4) на 4.

A. DZY любит хэши

реализация *800

У DZY есть хэш-таблица с p ячейками, пронумерованными от 0 до p - 1. Он хочет записать в хэш-таблицу n чисел в заданном порядке: i-е число xi DZY хочет записать в ячейку хеш-таблицы с номером h(xi), где h(x) — хэш-функция. В этой задаче мы будем считать, что h(x) = x mod p. Операция a mod b означает взятие остатка от деления a на b.

Однако каждая ячейка хеш-таблицы может содержать не более одного элемента. Если DZY хочет записать число в уже занятую ячейку, то происходит «коллизия». Вам нужно найти номер первого элемента, при вставке которого произойдет коллизия.

Если первая коллизия происходит сразу после вставки i-го элемента, надо вывести i. Если коллизия вовсе не произойдет, выведите -1.

Входные данные

В первой строке записано два целых числа p и n (2 ≤ p, n ≤ 300). Затем следуют n строк. В i-й строке записано целое число xi (0 ≤ xi ≤ 109).

Выходные данные

Выведите единственное целое число — ответ на задачу.

B. DZY любит строки

жадные алгоритмы реализация *1000

DZY коллекционирует строки, состоящие только из строчных английских букв. Для каждой строчной буквы c DZY определил значение wc. Для каждой строки s = s1s2... s|s| (|s| — длина строки) ее значение определяется функцией f(s), где

У DZY есть строка s. Он хочет вставить k строчных букв в эту строку так, чтобы значение получившейся строки было как можно больше. Какое максимальное значение он сможет получить?

Входные данные

В первой строке записана единственная строка s (1 ≤ |s| ≤ 103).

Во второй строке записано единственное целое число k (0 ≤ k ≤ 103).

В третьей строке записано двадцать шесть целых чисел от wa до wz. Каждое из этих чисел неотрицательное и не превосходит 1000.

Выходные данные

Выведите единственное целое число — максимальное значение строки, которое DZY сможет получить.

Примечание

В тестовом примере можно получить строку «abcbbc», тогда значение равно 1·1 + 2·2 + 3·2 + 4·2 + 5·2 + 6·2 = 41.

A. Про награды

реализация *800

Бизон-Чемпион не зря зовется чемпионом.

Недавно Бизон-Чемпион получил в подарок новый, красивый, стеклянный шкаф с n полками и решил расположить в нем все свои награды. Все награды можно разделить на два типа: медали и кубки. Бизон-Чемпион имеет a1 кубков за первые, a2 кубков за вторые и a3 кубков за третьи места. Кроме того, у него есть b1 медалей за первые, b2 медалей за вторые и b3 медалей за третьи места.

Конечно, награды в шкафу должны смотреться красиво, поэтому Бизон-Чемпион решил следовать правилам:

  • на одной полке не могут находиться кубки и медали одновременно;
  • ни на какой полке не должно быть больше пяти кубков;
  • ни на какой полке не должно быть больше десяти медалей.

Помогите Бизону-Чемпиону выяснить, можно ли расположить все награды так, чтобы все описанные условия были выполнены.

Входные данные

В первой строке содержатся целые числа a1, a2 и a3 (0 ≤ a1, a2, a3 ≤ 100). Вторая строка содержит целые числа b1, b2 и b3 (0 ≤ b1, b2, b3 ≤ 100). В третьей строке содержится целое число n (1 ≤ n ≤ 100).

Числа в строках разделяются одиночными пробелами.

Выходные данные

Выведите «YES» (без кавычек), если все награды можно расположить на полках описанным образом. В противном случае, выведите «NO» (без кавычек).

B. Про суффиксные структуры

реализация Строки *1400

Бизон-Чемпион не только бизон, но и любимец команды «Бизоны».

На очередном соревновании «Бизонам» попалась следующая задача: «Даны два различных слова (строки из латинских букв) s и t. Необходимо из слова s получить слово t». Задача показалась ребятам простой, ведь они хорошо знают суффиксные структуры данных. Бизон Старший любит суффиксный автомат. Применяя его один раз к строке, он может удалить из этой строки любой один символ. Бизон Средний хорошо знает суффиксный массив. Применяя его один раз к строке, он может поменять местами два любых символа в этой строке. Суффиксным деревом ребята не владеют, а с его помощью можно сделать гораздо большее.

Бизону-Чемпиону интересно, смогут ли «Бизоны» решить задачу. При этом, возможно, для решения задачи не требуются обе структуры данных. Выясните, смогут ли ребята решить задачу и если да, то как: можно ли решить ее только с помощью суффиксного автомата, только с помощью суффиксного массива или потребуются обе структуры? Обратите внимание, что структуры разрешается использовать неограниченное количество раз и в любом порядке.

Входные данные

В первой строке содержится непустое слово s. Во второй строке содержится непустое слово t. Слова s и t различны. Каждое слово состоит только из строчных букв латинского алфавита. Каждое слово содержит не более 100 букв.

Выходные данные

В единственную строку выведите ответ на задачу. Выведите «need tree» (без кавычек), если из слова s невозможно получить слово t, используя суффиксный массив и суффиксный автомат. Выведите «automaton» (без кавычек), если для решения задачи достаточно только суффиксного автомата. Выведите «array» (без кавычек), если для решения задачи достаточно только суффиксного массива. Выведите «both» (без кавычек), если для решения задачи необходимы обе эти структуры данных.

Гарантируется, что если можно решить задачу только с использованием суффиксного массива, то решить задачу только с использованием суффиксного автомата невозможно. Аналогичное верно и для суффиксного автомата.

Примечание

В третьем примере можно действовать так: сначала превратить «both» в «oth», удалив первый символ с помощью суффиксного автомата, а потом сделать два обмена символов получившейся строки с помощью суффиксного массива и получить «hot».

E. Про делители

Перебор поиск в глубину и подобное реализация теория чисел *2200

Бизон-Чемпион не только дружелюбный, но и любит программировать.

Определим функцию f(a), где a последовательность целых положительных чисел. Функция f(a) возвращает следующую последовательность: сначала идут все делители a1 в порядке возрастания, затем идут все делители a2 в порядке возрастания, и так далее до последнего элемента последовательности a. Например f([2, 9, 1]) = [1, 2, 1, 3, 9, 1].

Определим последовательность Xi, для целых i (i ≥ 0): X0 = [X] ([X] — это последовательность, состоящая из одного числа X), Xi = f(Xi - 1) (i > 0). Например, при X = 6 получится X0 = [6], X1 = [1, 2, 3, 6], X2 = [1, 1, 2, 1, 3, 1, 2, 3, 6].

Для заданных чисел X и k найдите последовательность Xk. Так как ответ может быть слишком большим, найдите только первые 105 элементов этой последовательности.

Входные данные

В единственной строке содержатся два целых числа, разделенных пробелом — X (1 ≤ X ≤ 1012) и k (0 ≤ k ≤ 1018).

Выходные данные

Выведите элементы последовательности Xk в одной строке через пробел. Если количество элементов превосходит 105, то выведите только первые 105 элементов.

A. Codecraft III

реализация *900

Сегодня Вася зашел на всем известный сайт и узнал, что продолжение его любимой игры Codecraft II выходит ровно через k месяцев. Он посмотрел на календарь и выяснил, что сейчас идет месяц под названием s. Васе тут же стало интересно, в каком же месяце выйдет Codecraft III. Помогите ему понять это.

Все двенадцать месяцев на Васином календаре записаны под своими обычными английскими названиями: January, February, March, April, May, June, July, August, September, October, November, December.

Входные данные

В первой строке записано название текущего месяца. Гарантируется, что это — корректное английское название одного из 12 месяцев. Первая буква — большая, а остальные — маленькие. Во второй строке записано целое число k (0 ≤ k ≤ 100) — число месяцев, оставшееся до выхода Codecraft III.

Выходные данные

Выведите с большой буквы название месяца, в который выйдет продолжение Codecraft II. Выведенное название должно содержаться в списке January, February, March, April, May, June, July, August, September, October, November, December.

A. Jzzhu и дети

реализация *1000

У Jzzhu в школе учатся n детей. Jzzhu собирается дать им конфет. Пронумеруем всех детей от 1 до n, i-й ребенок хочет получить как минимум ai конфет.

Jzzhu выстроил всех детей в очередь, i-го ребенка он поставил i-м в очереди. Затем Jzzhu начал раздавать конфеты, следуя алгоритму:

  1. Дать m конфет первому в очереди ребенку.
  2. Если ребенок получил достаточное количество конфет, то он идет домой, иначе он становится в конец очереди.
  3. Повторять первые два шага до тех пор, пока в очереди стоит хотя бы один ребенок.

Jzzhu интересно, какой ребенок уйдет домой последним? Найдите номер этого ребенка.

Входные данные

В первой строке записано два целых числа n, m (1 ≤ n ≤ 100; 1 ≤ m ≤ 100). Во второй строке записано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 100).

Выходные данные

Выведите единственное целое число — номер ребенка, который уйдет домой последним.

Примечание

Рассмотрим первый пример.

Сперва, ребенок 1 получает 2 конфеты и идет домой. Затем ребенок 2 получает 2 конфеты и идет в конец очереди. Теперь очередь имеет вид: [3, 4, 5, 2] (номера детей в порядке очереди). Затем ребенок номер 3 получает 2 конфеты и идет домой, затем ребенок номер 4 получает 2 конфеты и идет в конец очереди. Теперь очередь имеет вид: [5, 2, 4]. Затем ребенок номер 5 получает 2 конфеты и идет домой. Затем ребенок номер 2 получает две конфеты и идет домой. И наконец, ребенок номер 4 получает 2 конфеты и идет домой.

Ребенок номер 4 идет домой последним.

B. Jzzhu и последовательности

математика реализация *1300

Jzzhu изобрел новый вид последовательностей. Эти последовательности можно записать следующим образом:

Вам даны значения x и y, посчитайте, чему равен остаток от деления fn на 1000000007 (109 + 7).

Входные данные

В первой строке записано два целых числа x и y (|x|, |y| ≤ 109). Во второй строке записано единственное целое число n (1 ≤ n ≤ 2·109).

Выходные данные

Выведите единственное целое число — fn по модулю 1000000007 (109 + 7).

Примечание

В первом примере f2 = f1 + f3, 3 = 2 + f3, f3 = 1.

Во втором примере f2 =  - 1;  - 1 по модулю (109 + 7) равняется (109 + 6).

A. Игра с палочками

реализация *900

Завоевав золото и серебро в IOI 2014, Akshat и Malvika захотели немного развлечься. Сейчас они заняты игрой на сетке, составленной из n горизонтальных и m вертикальных палочек.

Точкой пересечения на сетке называется любая точка сетки, образованная пересечением одной из горизонтальных и одной из вертикальных палочек.

На сетке, показанной ниже, n = 3 и m = 3. Сетка образована n + m = 6 палочками (вертикальные палочки выделены зеленым цветом, а горизонтальные — красным цветом). На сетке есть n·m = 9 точек пересечения, которые пронумерованы от 1 до 9.

Правила игры очень простые. Игроки ходят по очереди. Akshat завоевал золото, поэтому он делает первый ход. На своем ходу игрок должен выбрать любую оставшуюся точку пересечения, а затем удалить из сетки все палочки, которые проходят через эту точку. Игрок проигрывает, если не может сделать ход (на сетке не осталось точек пересечения).

Предположим, что оба игрока играют оптимально. Кто победит в игре?

Входные данные

Первая строка содержит два целых числа через пробел, n и m (1 ≤ n, m ≤ 100).

Выходные данные

Выведите "Akshat" или "Malvika" (без кавычек), в зависимости от того, кто победит при оптимальной игре.

Примечание

Пояснение к первому примеру:

Изначально сетка имеет 4 точки пересечения. На рисунке они пронумерованы от 1 до 4.

Если Akshat выберет точку пересечения 1, то он уберет две палочки 1 - 2 и 1 - 3, полученная сетка будет выглядеть вот так:

Так как осталась только одна точка пересечения (это 4), Malvika обязана выбрать ее и убрать две оставшихся палочки. После ее хода сетка будет пуста.

На пустой сетке Akshat не может сделать ход, поэтому он проиграет.

Так как все 4 точки пересечения сетки идентичны, Akshat проиграет, независимо от того, какую он выберет на первом ходу.

B. Сортируем массив

реализация сортировки *1300

Как и все программисты, вы очень любите массивы. На день рождения друзья подарили вам массив a, состоящий из n различных целых чисел.

К сожалению, массив a слишком маленький. А вы хотите большой массив! Друзья договорились дать вам массив побольше, но только если вы сможете верно ответить на следующий вопрос: можно ли отсортировать массив a (по возрастанию), выполнив переворот ровно одного подотрезка a? Определения подотрезка и переворота находятся в примечаниях.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — размер массива a.

Во второй строке записано n различных целых чисел через пробел: a[1], a[2], ..., a[n] (1 ≤ a[i] ≤ 109).

Выходные данные

Выведите ответ на поставленный вопрос: строку «yes» или «no» (без кавычек).

Если ваш ответ — «yes», то затем выведите два целых числа, обозначающие индекс начала и индекс конца (индекс начала не может быть больше индекса конца) переворачиваемого подотрезка. Если есть несколько способов выбрать эти индексы, выведите любой из них.

Примечание

Пример 1. Можно перевернуть весь массив и получить [1, 2, 3].

Пример 3. Никакой подотрезок нельзя перевернуть так, чтобы массив стал отсортированным.

Определения

Подотрезок [l, r] массива a — это последовательность a[l], a[l + 1], ..., a[r].

Рассмотрим массив a размера n. Допустим вы переворачиваете его подотрезок [l, r]. Полученный массив будет выглядеть следующим образом:

a[1], a[2], ..., a[l - 2], a[l - 1], a[r], a[r - 1], ..., a[l + 1], a[l], a[r + 1], a[r + 2], ..., a[n - 1], a[n].

C. Предскажите исход игр

математика Перебор реализация *1700

Футбольный турнир состоит из n игр. В нем участвуют три команды. На данный момент команды уже сыграли k матчей.

Вы ярый футбольный фанат, по случайности пропустивший все k игр. К счастью, вы вспомнили прогноз одного вашего друга на первые k игр. Друг не назвал точное количество побед каждой команды по итогу k матчей. Вместо этого он предполагал, что модуль разности между количеством побед первой и второй команды будет равен d1, а второй и третьей — d2.

Вы не хотите, чтобы какая-то команда стала победителем турнира, иными словами, у каждой команды должно быть одинаковое количество побед по завершении n игр. Поэтому вам хочется узнать, может ли турнир пройти так, что предсказание вашего друга сбудется, и при этом в итоге все команды будут иметь одинаковое количество побед?

Обратите внимание, что в этом турнире матч не может закончиться ничьей.

Входные данные

В первой строке записано целое число t (1 ≤ t ≤ 105) — количество тестовых данных.

В каждой из следующих t строк записаны четыре целых числа через пробел: n, k, d1, d2 (1 ≤ n ≤ 1012; 0 ≤ k ≤ n; 0 ≤ d1, d2 ≤ k).

Выходные данные

Выведите "yes", если у турнира может не быть победителя. В противном случае, выведите "no" (без кавычек).

Примечание

Пример 1. Еще не состоялось ни одного матча (k = 0, d1 = 0, d2 = 0). Один из возможных турниров — это турнир с матчами (1-2, 2-3, 3-1), где каждая команда выигрывает ровно один раз.

Пример 2. Вы пропустили все игры (k = 3). Так как d1 = 0 и d2 = 0, достаточно взять турнир из предыдущего примера.

Пример 3. Вы пропустили 4 матча, и d1 = 1, d2 = 0. Первые 4 матча могли бы быть такими: 1-2 (победа 2-го), 1-3 (победа 3-го), 1-2 (победа 1-го), 1-3 (победа 1-го). На данный момент первая команда имеет 2 победы, вторая команда имеет 1 победу, третья команда имеет 1 победу. Два оставшихся матча могут быть такими: 1-2 (победа 2-го), 1-3 (победа 3-го). В итоге все команды имеют одинаковое количество побед (2 победы).

A. Eevee

Перебор реализация Строки *1000

Вы решаете кроссворд из задачи K с IPSC 2014. Вы уже решили почти весь кроссворд, осталось не разгаданным одно слово: в кого эволюционирует Eevee? Вы не очень хорошо знаете покемонов, но быстрый поиск в интернете помог вам узнать, что Eevee может эволюционировать в восемь разных покемонов: Vaporeon, Jolteon, Flareon, Espeon, Umbreon, Leafeon, Glaceon и Sylveon.

Вы знаете длину слова в кроссворде, кроме того, вам уже известны некоторые буквы. Также известно, что этой длине и известным буквам удовлетворяет только один из покемонов, в которых эволюционирует Eevee. Ваша задача найти этого покемона.

Входные данные

Первая строка содержит целое число n (6 ≤ n ≤ 8) – длину строки.

Следующая строка содержит строку, состоящую из n символов, каждый из которых либо строчная латинская буква (если соответствующая буква известна), либо символ точки (если соответствующая буква не известна).

Выходные данные

Выведите имя покемона, в которого Eevee может эволюционировать, который подходит под длину слова и известные буквы из входных данных. Используйте только строчные латинские буквы для вывода имени (в частности, не начинайте имя с заглавной буквы).

Примечание

Имена покемонов из задачи в формате, удобном для вставки в ваше решение:

["vaporeon", "jolteon", "flareon", "espeon", "umbreon", "leafeon", "glaceon", "sylveon"]

{"vaporeon", "jolteon", "flareon", "espeon", "umbreon", "leafeon", "glaceon", "sylveon"}

D. Стирка, сушка, глажка

жадные алгоритмы реализация *1900

У вас есть k предметов одежды, каждый из которых вы хотите постирать, посушить и погладить. В вашем распоряжении n1 стиральных машинок, n2 машинок для отжима и n3 гладильных машины. Каждая машина может обрабатывать один предмет одежды в один момент времени. Вы не можете отжимать предмет одежды до того, как он был постиран, и не можете его гладить, пока он не был отжат. Более того, после того, как предмет одежды был постиран, его надо сразу поместить в машинку для отжима, а после того, как он был отжат, его надо сразу поместить в машинку для глажки.

Стирка одного предмета одежды занимает t1 минут, отжим — t2 минут, а глажка — t3 минут. Найдите минимальное количество минут, за которое вы можете постирать, отжать и погладить все ваши вещи.

Входные данные

Единственная строка содержит семь целых чисел: k, n1, n2, n3, t1, t2, t3 (1 ≤ k ≤ 104; 1 ≤ n1, n2, n3, t1, t2, t3 ≤ 1000).

Выходные данные

Выведите одно целое число — минимальное количество минут, за которые можно постирать, отжать и погладить все вещи.

Примечание

В первом примере у вас есть одна вещь и по одному экземпляру каждой машинки, работа каждой из них займет пять минут, итого весь процесс займет 15 минут.

Во втором примере вы можете начать стирать две вещи в момент времени 0. Если вы сразу начнете стирать третью вещь, то к моменту, когда вы закончите ее отжимать, не будет доступно ни одной гладильной машинки, поэтому вы должны подождать, и начать стирать третью вещь в момент времени 2. Аналогично, вы не можете начать стирать четвертую вещь до момента времени 5, потому что иначе к моменту, когда она будет постирана, не будет доступной машинки для отжима. В итоге вы начнете стирать каждую из 8-ми вещей в моменты времени 0, 0, 2, 5, 10, 10, 12 и 15 соответственно. Последняя вещь будет поглажена в через 15 + 10 + 5 + 2 = 32 минут после начала.

A. Маленькая пони и пещера кристаллов

реализация *800

Как-то раз Twilight Sparkle получила в подарок кристалл из пещеры кристаллов. Кристалл размера n (n — нечетное; n > 1) — это матрица n × n, на которой изображен ромб.

Вам дано нечетное число n. Требуется вывести кристалл размера n. Клетки, принадлежащие ромбу, в матрице должны быть обозначены буквой «D». Все другие клетки матрицы должны быть обозначены символом «*». Изучите тестовые примеры, чтобы понять, что вам нужно вывести.

Входные данные

Единственная строка содержит целое число n (3 ≤ n ≤ 101; n — нечетное).

Выходные данные

Выведите кристалл размера n.

B. Маленькая пони и сортировка сдвигами

реализация *1200

Как-то раз Twilight Sparkle захотела отсортировать последовательность целых чисел a1, a2, ..., an в неубывающем порядке. Будучи молодым единорогом, Twilight Sparkle умеет выполнять лишь одно действие — единичный сдвиг. Другими словами, она может переместить последний элемент последовательности в начало:

a1, a2, ..., an → an, a1, a2, ..., an - 1.

Какое минимальное количество действий понадобится Twilight Sparkle, чтобы отсортировать последовательность по неубыванию?

Входные данные

Первая строка содержит целое число n (2 ≤ n ≤ 105). Вторая строка содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 105).

Выходные данные

Если последовательность невозможно отсортировать по неубыванию с помощью описанной операции, выведите -1. Иначе, выведите минимальное количество действий, необходимое для сортировки последовательности.

B. Много игр

Деревья дп игры поиск в глубину и подобное реализация Строки *1900

Андрей, Федя и Леша — очень изобретательные ребята. В очередной раз они придумали игру для двоих игроков со строками.

Задан набор, состоящий из n непустых строк. Во время игры два игрока вместе строят слово, изначально это слово пустое. Игроки ходят по очереди. За свой ход игрок должен дописать в конец слова одну букву так, чтобы полученное слово было префиксом хотя бы одной строки из заданного набора. Проигрывает тот, кто не может сделать ход.

Андрей и Леша решили сыграть в эту игру k раз. Причем, игрок, проигравший в i-й игре, делает первый ход в (i + 1)-й игре. Ребята решили, что победителем по сумме всех игр будет считаться тот, кто победил в последней (k-й) игре. Андрей и Леша уже начали играть, а Федя в это время решил посчитать: кто будет победителем, если оба игрока будут играть оптимально. Помогите ему.

Входные данные

Первая строка содержит два целых числа, n и k (1 ≤ n ≤ 105; 1 ≤ k ≤ 109).

Каждая из n следующих строк содержит непустую строку из заданного набора. Суммарная длина всех строк из набора не превышает 105. Все строки из набора состоят только из строчных латинских букв.

Выходные данные

Если победит игрок, который ходит первым, то выведите «First», иначе выведите «Second» (кавычки выводить не нужно).

A. Пашмак и сад

реализация *1200

Пашмак уже целый год влюблен в красивую девушку по имени Пармида... Сегодня Пашмак решил устроить свидание с ней в романтическом саду. К сожалению, парень забыл, где находится этот сад. Пашмак точно помнит, что сад имеет форму квадрата со сторонами, параллельными осям координат. Также он помнит, что в каждой вершине квадрата растет ровно одно дерево. Пашмак знает положение двух из этих деревьев. Помогите ему найти, где расположены другие два дерева.

Входные данные

В первой строке записано четыре целых числа через пробел x1, y1, x2, y2 ( - 100 ≤ x1, y1, x2, y2 ≤ 100). Точка с координатами (x1, y1) обозначает расположение первого дерева, точка с координатами (x2, y2) обозначает расположение второго дерева. Гарантируется, что заданные точки различны.

Выходные данные

Если решения не существует, выведите -1. В противном случае выведите четыре целых числа через пробел x3, y3, x4, y4 — координаты двух других деревьев. Если существует несколько правильных решений, разрешается вывести любое из них.

Обратите внимание, что x3, y3, x4, y4 должны удовлетворять условиям ( - 1000 ≤ x3, y3, x4, y4 ≤ 1000).

B. Пашмак и цветы

Комбинаторика реализация сортировки *1300

Пашмак решил подарить Пармиде пару цветов из своего сада. В саду растет n цветов, красота i-го из них равна bi. Пармида — девушка необычная, она необязательно хочет получить два самых красивых цветка. Она хочет получить такие два цветка, разница красот которых максимально возможная!

Ваша задача — написать программу, которая посчитает два значения:

  1. Максимальную разность красот двух цветов из сада Пашмака.
  2. Сколько существует способов выбрать два цветка из сада, чтобы разность их красот была максимально возможной. Два способа считаются различными тогда и только тогда, когда хотя бы один цветок выбран в одном из них и не выбран во втором.
Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 2·105). В следующей строке записано n целых чисел через пробел b1, b2, ..., bn (1 ≤ bi ≤ 109).

Выходные данные

В единственной строке выведите два целых числа — максимальную разность красот и количество способов ее получить.

Примечание

В третьем примере максимальная разность красот равна 2. Существует 4 способа ее получить:

  • выбрать первый и второй цветки;
  • выбрать первый и пятый цветки;
  • выбрать четвертый и второй цветки;
  • выбрать четвертый и пятый цветки.

A. Игра с мячом

Перебор реализация *800

Воспитательница детского сада Наталья Павловна придумала новую развивающую игру с мячом. Эта игра не только развивает детишек в плане физического развития, но при этом еще обучает их счету.

Игра заключается в следующем. Детишки стоят по кругу. Условимся считать, что они пронумерованы числами от 1 до n по часовой стрелке и ребенок с номером 1 держит мяч. Вначале первый ребенок кидает мяч следующему за ним по кругу, т.е. ребенку с номером 2. Дальше ребенок с номером 2 кидает мяч ребенку, стоящему через одного, т.е. c номером 4, затем четвертый ребенок кидает мяч ребенку, стоящему через 2 от него, т.е. ребенку с номером 7, дальше мяч достается ребенку, стоящему через 3 от очередного, дальше — через 4 и т.д. Заметим, что при броске мяча может произойти переход через начало круга. Например, если n = 5, то после третьего броска мяч достанется снова ребенку с номером 2. Всего делается n - 1 бросок, и игра заканчивается.

Проблема заключается в том, что не всем детям в процессе игры достается мяч. Если ребенку не достается мяч, он очень расстраивается и плачет до тех пор, пока Наталья Павловна не даст ему конфетку. Поэтому Наталья Павловна просит вас помочь ей определить номера детишек, которым будет доставаться мяч после каждого броска.

Входные данные

В первой строке содержится целое число n (2 ≤ n ≤ 100) — количество детишек в кругу.

Выходные данные

В единственной строке выведите n - 1 число — номера детишек, которым будет доставаться мяч после каждого броска. Числа разделяйте пробелами.

B. Футболки от спонсора

реализация *1100

Один известный спонсор одного известного соревнования решил одарить каждого участника соревнования футболкой. Возникла понятная проблема: с одной стороны, непонятно, сколько каких размеров нужно запасти футболок, а с другой стороны, много футболок заказывать не хочется (не на стены же их потом клеить). Поломав голову и сделав предварительные прикидки, представители спонсоров заказали некоторое количество футболок размеров S, M, L, XL и XXL. Футболки получились удачными, поэтому в день соревнования за ними выстроилась очередь из K участников. Каждый участник характеризуется своим желаемым размером футболки (так получилось, что для всех участников это тоже один из размеров S, M, L, XL и XXL). Участники по очереди подходят за футболкой и стараются выбрать себе самую подходящую, выбирая ее следующим образом. Если еще осталась футболка желаемого размера, то он берет ее, не раздумывая. В противном случае для него предпочтительнее взять футболку с размером, как можно более близким к желаемому (расстояние между соседними размерами считается равным единице). В случае, если выбор неоднозначен, участник возьмет футболку большего размера (навырост). К примеру, для человека с размером L список предпочтений выглядит так: L, XL, M, XXL, S. По данным о том, сколько футболок какого размера запасли организаторы, и о размерах участников в очереди, определите, кому досталась футболка какого размера.

Входные данные

В первой строке записано пять неотрицательных целых чисел NS, NM, NL, NXL, NXXL, не превосходящих 1000 — количества футболок соотвествующих размеров. Во второй строке записано целое число K (1 ≤ K ≤ 1000)— количество участников. Следующие K строк содержат желаемые размеры футболок для участников. Размеры даны в том порядке, в каком участники выстроились в очередь. Гарантируется, что NS + NM + NL + NXL + NXXL ≥ K.

Выходные данные

Для каждого участника в отдельной строке выведите размер футболки, которую он получил.

D. Парковка

реализация Структуры данных *1800

В наши дни становится все труднее удачно припарковать свой автомобиль в городе. Представим себе отрезок улицы длиной в L метров, вдоль которого разрешена парковка. Водители должны ставить свои автомобили строго параллельно тротуару с правой стороны улицы (помните, что в стране авторов задач движение правостороннее!). Каждый водитель при парковке хочет оставить себе некоторый запас для маневрирования, поэтому водитель ищет такое место, что расстояние до сзади стоящей машины будет не меньше b метров, а до впереди стоящей — не меньше f метров (если сзади машины нет, то автомобиль можно ставить у самого края отрезка для парковки; то же самое верно для случая, когда спереди не припарковано машин). Введем ось координат вдоль тротуара. Пусть зона для парковки начинается в точке 0 и заканчивается в точке L. Водители едут в направлении увеличения координаты и ищут самое раннее место (с наименьшей возможной координатой), где они могут припарковать машину. В случае, если такого места не находится, водитель едет дальше в поисках счастья. Иногда некоторые машины покидают улицу и освобождают место для парковки. Считая, что на улице никогда не находятся две двигающиеся машины одновременно, напишите программу, которая по информации о водителях, приезжающих на улицу в целях парковки и уезжающих с нее, моделирует процесс и определяет для каждого автомобиля место, занятое им в зоне парковки.

Входные данные

В первой строке записаны три целых числа L, b и f (10 ≤ L ≤ 100000, 1 ≤ b, f ≤ 100). Во второй строке дано целое число n (1 ≤ n ≤ 100) — количество запросов к вашей программе. Каждый запрос описывается в отдельной строке и задается двумя числами. Первое число означает тип запроса. Если тип запроса равен 1, то в этом случае второе число означает длину очередного автомобиля (в метрах), который въезжает на улицу в поисках места для парковки. Если же тип запроса равен 2, то тогда второе число означает номер запроса (начиная с 1) такого, что автомобиль, чей приезд на парковку описывался запросом с этим номером, ее покидает. Гарантируется, что этот автомобиль в момент запроса типа 2 был припаркован. Длины автомобилей — это целые числа от 1 до 1000.

Выходные данные

Для каждого запроса типа 1 в отдельной строке выведите число -1, если соответствующему автомобилю не нашлось места на парковке вдоль улицы. В противном случае выведите целое число, равное расстоянию от задней части автомобиля в его припаркованном положении до начала зоны парковки.

A. Вася и носки

математика Перебор реализация *900

У Васи есть n пар носков. Утром каждого дня, собираясь в школу, Вася должен надеть пару носков. Вечером, прийдя со школы, Вася снимает надетые носки и выбрасывает их. Каждый m-й день (в дни с номерами m, 2m, 3m, ...) мама покупает Васе одну пару носков. Она делает это поздно вечером, поэтому Вася может надеть новые носки не раньше следующего дня. На сколько подряд идущих дней Васе хватит носков?

Входные данные

В единственной строке записано два целых числа n и m (1 ≤ n ≤ 100; 2 ≤ m ≤ 100), разделенные пробелом.

Выходные данные

Выведите единственное целое число — ответ на задачу.

Примечание

В первом примере первые два дня Вася будет носить носки, которые у него были изначально, затем на третий день будет носить носки, которые были куплены во второй день.

Во втором примере первые девять дней он будет носить носки, которые у него были изначально, затем три дня будет носить носки, которые были куплены в третий, шестой и девятый дни. Затем еще день будет носить носки, которые были куплены в двенадцатый день.

B. Димка и уравнение

математика Перебор реализация теория чисел *1500

Маленький Дима много баловался на уроке математики, и злой учитель Леонид Иванович в наказание ему придумал следующую задачу.

Найти все целочисленные решения уравнения x (0 < x < 109):

x = b·s(x)a + c, 

где a, b, c — некоторые заранее определенные константы, а функция s(x) обозначает сумму всех цифр в десятичном представлении числа x.

Учитель дает эту задачу Диме на каждом уроке, меняя только параметры уравнения: a, b, c. Диме надоело получать двойки, и он просит вас помочь ему решить эту нелегкую задачу.

Входные данные

В первой строке записаны три целых числа через пробел: a, b, c (1 ≤ a ≤ 5; 1 ≤ b ≤ 10000;  - 10000 ≤ c ≤ 10000).

Выходные данные

Выведите целое число n — количество найденных решений. Затем выведите n целых чисел в порядке возрастания — найденные решения заданного уравнения. Выводить нужно только целочисленные решения, большие нуля и строго меньшие, чем 109.

C. Яблов и лист бумаги

реализация Структуры данных *2200

У Яблова есть очень большой лист бумаги в форме прямоугольника размера 1 × n. Ваша задача — помочь Яблову свернуть этот лист. Для этого надо выполнить q запросов. Каждый запрос имеет один из следующих двух типов:

  1. Свернуть лист в позиции pi. После этого запроса левая часть листа размера 1 × pi должна оказаться над правой частью листа размера 1 × ([текущая ширина листа бумаги] - pi).
  2. Посчитать суммарную ширину листов бумаги, которые получатся, если сделать два вертикальных разреза описанным далее способом и учитывать только листы между этими разрезами. Один разрез проводится на расстоянии li от левой границы текущего листа бумаги, а другой разрез проводится на расстоянии ri от левой границы текущего листа бумаги.

Чтобы лучше понять описанные операции, посмотрите пояснение первого тестового примера.

Входные данные

В первой строке записано два целых числа: n и q (1  ≤ n ≤ 105; 1 ≤ q ≤ 105) — изначальная ширина листа бумаги и количество запросов.

В каждой из следующих q строк задан один из описанных запросов в следующем формате:

  • «1 pi» (1 ≤ pi < [текущая ширина листа бумаги]) — запрос первого типа.
  • «2 li ri» (0 ≤ li < ri ≤ [текущая ширина листа бумаги]) — запрос второго типа.
Выходные данные

Для каждого запроса второго типа выведите ответ.

Примечание

Ниже приведены иллюстрации, показывающие, какой формы будет лист бумаги после сворачивания в первом тестовом примере:

После первой операции сворачивания текущая ширина листа равна 4, после второй операции текущая ширина листа равна 2.

A. Яблов и простая задача

Перебор реализация *1000

Тостов придумал очень простую задачу. Он задал ее Яблову, но Яблов не может ее решить. Сможете ли вы ему помочь?

Дана шахматная доска размера n × n. В каждой клетке доски записан либо символ 'x', либо символ 'o'. Правда ли, что каждая клетка доски имеет четное число соседних клеток, содержащих символ 'o'? Две клетки доски называются соседними, если у них есть общая сторона.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100). Затем следует n строк, описывающих шахматную доску. В каждой строке записано по n символов ('x' или 'o') без пробелов.

Выходные данные

Выведите «YES» или «NO» (без кавычек) — ответ на вопрос задачи.

A. Caisa и сахар

Перебор реализация *1200

Caisa собирается провести вечеринку и хочет приготовить большой шоколадный торт для нее. Для этого он поехал в самый большой супермаркет города.

В супермаркете всего имеется n различных видов сахара. Caisa собирается купить один из этих видов, для этого у него есть s долларов. Но это еще не все! Оказалось, что в супермаркете очень необычная политика выдачи сдачи: вместо центов продавцы дают конфетки покупателям в качестве сдачи (1 конфетка = 1 цент). Конечно, количество выданных в качестве сдачи конфеток никогда не превышает 99, поскольку продавцы всегда стараются дать как можно больше долларов в сдаче (100 центов можно заменить одним долларом).

Какое максимальное количество конфеток в качестве сдачи Caisa может получить, если купит ровно один вид сахара? Обратите внимание, что Caisa не старается минимизировать стоимость покупки, она хочет получить как можно больше конфет.

Входные данные

В первой строке содержится два целых числа n, s (1 ≤ n, s ≤ 100).

В i-й из n следующих строк содержится два целых числа xi, yi (1 ≤ xi ≤ 100; 0 ≤ yi < 100), где xi обозначает количество долларов, а yi — количество центов, требуемых для покупки сахара i-го вида.

Выходные данные

Выведите единственное целое число — максимальное количество конфеток, которое можно получить, либо -1, если Caisa не сможет купить, ни один вид сахара.

Примечание

В первом тестовом примере, если Caisa купит четвертый вид сахара, то в качестве сдачи она получит 50 конфет.

B. Caisa и колонны

математика Перебор реализация *1100

Caisa уже купил сахар и теперь идет домой. Во время пути домой он решил пройти игру на своем мобильном телефоне.

В игре есть (n + 1) колонн, пронумерованных от 0 до n. Нулевая колонна имеет высоту 0, i(i > 0) колонна имеет высоту hi. Цель игры — добраться до n-й колонны, при этом единственное действие, которое может совершать игрок: перепрыгнуть с текущей колонны (обозначим ее номер переменной k) на следующую колонну (ее номер равен k + 1). После описанного прыжка энергия игрока увеличивается на hk - hk + 1 (если это значение меньше нуля, то игрок теряет соответствующее количество энергии). По правилам игры в любой момент времени энергия игрока должна быть неотрицательной.

Изначально Caisa стоит на нулевой колонне и имеет ноль единиц энергии. Также в игре есть специально оплачиваемая возможность: за один доллар игрок может увеличить высоту любой колонны на единицу. Caisa может использовать эту возможность несколько раз, но, конечно, он не хочет тратить слишком много денег. Какое минимальное количество денег ему придется потратить, чтобы пройти игру?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105). В следующей строке записаны n целых чисел h1, h2, ..., hn (1  ≤  hi  ≤  105), обозначающие высоты колонн.

Выходные данные

Выведите единственное целое число — минимальное количество денег, которое придется заплатить Caisa, чтобы пройти игру.

Примечание

В первом тестовом примере Caisa должен заплатить 4 доллара и увеличить высоту нулевой колонны на 4. В таком случае он сможет пройти игру.

C. Gargari и слоны

жадные алгоритмы реализация хэши *1900

Gargari завидует Caisa, потому что последний прошел игру из прошлой задачи. Теперь Gargari хочет доказать всем, что он самый умный.

У Gargari есть шахматная доска размером n × n. В каждой клетке шахматной доски записано целое число. Gargari хочет разместить на шахматной доске два слона таким образом, что не существует клетки, которая находится под ударом обоих слонов. Рассмотрим клетку доски с числом x, записанным на ней, если она находится под ударом одного из слонов, тогда Gargari получает x долларов за эту клетку. Подскажите Gargari, как разместить двух слонов на доске, чтобы получить как можно больше денег.

Считается, что клетка находится под ударом слона, если она находится на одной диагонали с ним (клетка, в которой стоит слон, также считается находящейся под ударом).

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 2000). В каждой из следующих n строк записано n целых чисел aij (0 ≤ aij ≤ 109) — описание шахматной доски.

Выходные данные

В первой строке выведите максимальное количество долларов, которое Gargari может заработать. Затем выведите четыре целых числа: x1, y1, x2, y2 (1 ≤ x1, y1, x2, y2 ≤ n), где xi обозначает номер строки, в которой находится i-й слон, yi обозначает номер столбца, в котором находится i-й слон. Считайте, что строки шахматной доски пронумерованы от 1 до n сверху вниз, в столбцы пронумерованы от 1 до n слева направо.

Если есть несколько оптимальных решений, разрешается вывести любое.

D. Gargari и перестановки

графы дп поиск в глубину и подобное реализация *1900

Gargari надоело играть со слонами на шахматной доске из предыдущей задачи, теперь он собирается сделать домашнюю работу по математике. В его учебнике по математике записаны k перестановок. Каждая перестановка — это последовательность чисел 1, 2, ..., n, записанных в некотором порядке. Gargari должен найти длину наибольшей общей подпоследовательности этих k перестановок. Сможете ли вы ему помочь?

Определение задачи о наибольшей общей подпоследовательности можно найти по ссылке: https://ru.wikipedia.org/wiki/Наибольшая_общая_подпоследовательность

Входные данные

В первой строке записаны два целых числа n и k (1 ≤ n ≤ 1000; 2 ≤ k ≤ 5). В каждой из следующих k строк записаны целые числа 1, 2, ..., n в некотором порядке — описание текущей перестановки.

Выходные данные

Выведите длину наибольшей общей подпоследовательности.

Примечание

В первом тестовом примере наибольшая общая подпоследовательность: [1, 2, 3].

A. inc ARG

реализация *900

Сергей тестирует процессор нового поколения. Вместо байтов процессор работает с ячейками памяти, состоящими из n битов, пронумерованных от 1 до n. Число хранится в ячейке памяти следующим образом: младший бит числа хранится в первом бите ячейки, следующий бит числа — во второй ячейке, и так далее; старший бит числа хранится в n-й ячейке.

Сейчас Сергей хочет протестировать инструкцию «прибавить 1 к значению ячейки». В результате инструкции число, двоичное представление которого записано в ячейке, должно увеличиться на единицу; при этом, если некоторые старшие разряды числа не помещаются в ячейку, их необходимо отбросить.

Сергей записал определенные значения битов в ячейку и собирается прибавить к ее значению 1. Сколько битов ячейки поменяются в результате этой операции?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — количество битов в ячейке.

Во второй строке записана строка из n символов — изначальное состояние ячейки. Первый символ обозначает состояние первого бита ячейки, второй — второго бита, и так далее; последний символ обозначает состояние n-го бита ячейки.

Выходные данные

Выведите одно число — количество битов, которые изменятся после прибавления единицы к ячейке.

Примечание

В первом примере после прибавления в ячейке будет записано число 0010, во втором — 0000.

B. Входящие (100500)

реализация *1000

У Алексея в почтовом ящике накопилось много писем. Некоторые из них уже прочитаны, а некоторые — еще нет.

Почтовая программа Алексея может либо показывать список всех писем, либо отображать содержимое какого-то одного письма. Как только программа отображает содержимое непрочитанного письма, оно становится прочитанным (если программа отображает содержимое уже прочитанного письма, ничего не происходит). За одно нажатие мышки можно выполнить любую из следующих операций:

  • Перейти из списка писем к содержимому любого письма.
  • Вернуться к списку писем из режима отображения письма.
  • В режиме отображения письма перейти к следующему либо предыдущему письму в списке. Нельзя пытаться перейти к предыдущему письму, если текущее письмо первое в списке, или перейти к следующему письму, если текущее письмо последнее в списке.

Удалять письма из списка или менять их местами программа не может.

Алексей хочет как можно быстрее прочитать все еще непрочитанные письма и пойти смотреть футбол. Сейчас он находится в списке всех писем и видит, какие письма прочитаны, а какие — нет. Какое минимальное количество операций Алексею придется совершить, чтобы все письма в ящике стали прочитанными?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000) — количество писем в ящике.

Во второй строке записаны n целых чисел (нулей и единиц), разделенных пробелами — состояние списка писем. Если i-е число равно 1, это обозначает, что i-е письмо не было прочитано. Иначе, i-е число равно 0, и это обозначает, что i-е письмо прочитано.

Выходные данные

Выведите одно число — минимальное количество операций, нужных для того, чтобы прочитать все непрочитанные письма.

Примечание

В первом примере Алексей может справиться за три операции: открыть второе письмо, переместиться к третьему, переместиться к четвертому.

Во втором примере можно действовать так: открыть первое письмо, перейти ко второму, вернуться в список, открыть пятое.

В третьем примере все письма уже прочитаны.

A. Выгодный проезд

реализация *1200

Совсем недавно Аня начала использовать метро как средство передвижения по городу. Известно, что билет на один проезд в метро стоит a рублей. Также Аня узнала, что можно купить абонемент на m проездов за b рублей (абонемент можно покупать несколько раз). Аня подсчитала, что в ближайшее время ей придется воспользоваться метрополитеном n раз. Помогите Ане, подскажите ей, какую минимальную сумму денег ей придется потратить, чтобы совершить n поездок?

Входные данные

В единственной строке через пробел записано четыре целые числа n, m, a, b (1 ≤ n, m, a, b ≤ 1000) — количество проездов, запланированное Аней, количество проездов, которое покрывает абонемент, цена одного проезда и цена одного абонемента.

Выходные данные

Выведите целое число — минимальную сумму в рублях, которую Ане придется потратить.

Примечание

В первом примере одно из оптимальных решений: каждый раз покупать билет на 1 проезд. Есть и другие оптимальные решения, например, купить 3 абонемента.

A. Юра и заселение

реализация *800

Недавно Юра поступил в БГУКП (Берляндский Государственный Университет Крутых Программистов). У Юры есть друг Леша, который поступил вместе с ним, и теперь они заселяются в общежитие.

Юра и Леша хотят жить в одной комнате. Всего в общежитии есть n комнат. В данный момент в комнате с номером i живут pi человек, когда всего в этой комнате может жить qi человек (pi ≤ qi). Посчитайте, сколько комнат общежития смогут вместить Юру и Лешу вместе?

Входные данные

В первой строке содержится единственное целое число n (1 ≤ n ≤ 100) — количество комнат.

В i-й из n последующих строк содержатся два целых числа pi и qi (0 ≤ pi ≤ qi ≤ 100) — количество людей, которые уже живут в комнате, и максимальное допустимое количество людей, живущих в i-й комнате.

Выходные данные

Выведите одно целое число — количество комнат, в которые Юра с Лешей могут заселиться.

B. Федя и новая игра

битмаски Конструктив Перебор реализация *1100

Как только вы помогли Юре с Лешей заселиться, они пошли помогать своему другу Феде играть в новую компьютерную игру «Call of Soldiers 3».

Всего в игре есть (m + 1) игроков и n видов солдат. Игроки «Call of Soldiers 3» пронумерованы от 1 до (m + 1), а виды солдат пронумерованы от 0 до n - 1. У каждого игрока есть армия, армия i-го игрока характеризуется целым неотрицательным числом xi. Рассмотрим битовое представление числа xi: если j-й бит числа xi равен единице, то в армии i-го игрока есть солдаты j-го вида.

Федя — игрок с номером m + 1. Федя считает, что два игрока могут дружить, если их армии отличаются не более чем на k видов солдат (другими словами, битовые представления соответствующих чисел различаются не более чем в k битах). Помогите Феде посчитать, сколько игроков могут с ним дружить.

Входные данные

В первой строке записаны три целых числа n, m, k (1 ≤ k ≤ n ≤ 20; 1 ≤ m ≤ 1000).

В i-й из (m + 1) последующих строк содержится одно целое число xi (1 ≤ xi ≤ 2n - 1), которое характеризует армию i-го игрока. Напомним, что Федя — это игрок с номером (m + 1).

Выходные данные

Выведите единственное целое число — количество возможных друзей Феди.

C. Юра и работа

дп реализация *1700

Совсем недавно вышел новый ITone 6, и Юра очень захотел себе его купить. К сожалению, денег у него не хватало, поэтому Юра устроился работать программистом. На работе Юра столкнулся со следующей задачей:

Задана последовательность из n чисел p1, p2, ..., pn. Нужно выбрать k пар целых чисел:

[l1, r1], [l2, r2], ..., [lk, rk] (1 ≤ l1 ≤ r1 < l2 ≤ r2 < ... < lk ≤ rk ≤ nri - li + 1 = m), 

так чтобы сумма была как можно больше. Помогите Юре справиться с этим заданием.

Входные данные

В первой строке содержится три целых числа n, m и k (1 ≤ (m × k) ≤ n ≤ 5000). Во второй строке содержится n целых чисел p1, p2, ..., pn (0 ≤ pi ≤ 109).

Выходные данные

В единственной строке выведите целое число — максимальное значение суммы.

A. I Wanna Be the Guy

жадные алгоритмы реализация *800

Есть такая игра под названием «I Wanna Be the Guy», в ней n уровней. Little X и его друг Little Y подсели на эту игру. Каждый из них хочет пройти игру полностью.

Little X может пройти только p уровней этой игры. А Little Y может пройти только q уровней этой игры. Вам даны номера уровней, которые может пройти Little X, и номера уровней, которые может пройти Little Y. Могут ли Little X и Little Y пройти игру полностью, если объединят свои усилия?

Входные данные

В первой строке записано единственное целое число n (1 ≤  n ≤ 100).

В следующей строке сначала записано целое число p (0 ≤ p ≤ n), затем следуют p различных целых чисел a1, a2, ..., ap (1 ≤ ai ≤ n). Эти числа обозначают номера уровней, которые может пройти Little X. В следующей строке содержатся номера уровней, которые может пройти Little Y, в аналогичном формате. Предполагается, что уровни пронумерованы от 1 до n.

Выходные данные

Если друзья могут пройти все уровни вместе, выведите «I become the guy.». Если это невозможно, выведите «Oh, my keyboard!» (без кавычек).

Примечание

В первом примере Little X может пройти уровни [1 2 3], а Little Y может пройти уровни [2 4], так что вместе ребята могут пройти все уровни.

Во втором примере никто не может пройти уровень 4.

B. Онлайн чат

реализация *1300

Little X и Little Z — хорошие друзья. Они постоянно общаются в онлайн-чате. К сожалению, у каждого из них свое расписание.

У Little Z фиксированное расписание. Он онлайн в любой момент времени от a1 до b1, от a2 до b2, ..., от ap до bp (границы включаются в интервалы). У Little X довольно странное расписание, оно зависит того, во сколько он проснется. Если он проснется в момент времени 0, то он будет онлайн в любой момент времени от c1 до d1, от c2 до d2, ..., от cq до dq (границы включаются). Но если он встает в момент t, эти отрезки сдвигаются на t. Другими словами, они будут иметь следующий вид: [ci + t, di + t] (для всех i).

Если в какой-то момент времени и Little X, и Little Z онлайн одновременно, они могут поболтать в чате. Известно, что Little X может встать в любой целочисленный момент времени от l до r (обе границы включительно). Также известно, что Little X хочет встать в такое время, чтобы у него была возможность побеседовать с Little Z (должен быть хотя бы один момент времени, в который они оба онлайн). Сколько целочисленных моментов времени из отрезка [l, r] для этого подходят?

Входные данные

В первой строке записано четыре целых числа через пробел p, q, l, r (1 ≤  p, q ≤ 50; 0 ≤ l ≤ r ≤ 1000).

В каждой из следующих p строк записано два целых числа через пробел ai, bi (0 ≤ ai < bi ≤ 1000). В каждой из следующих q строк записано по два целых числа через пробел cj, dj (0 ≤ cj < dj ≤ 1000).

Гарантируется, что bi < ai + 1 и dj < cj + 1 для всех i и j, для которых неравенства имеют смысл.

Выходные данные

Выведите единственное целое число — количество подходящих целочисленных моментов времени отрезка [l, r].

B. Монеты

реализация *1200

Однажды к Васе попали три берляндские монеты. На них не было никаких чисел, поэтому Вася не смог понять, как они соотносятся по достоинству. Он предположил, что если одна монета весит больше другой, то она ценнее. Вася взвесил все три пары монет на чашечных весах и сказал вам результаты. Выясните, как монеты соотносятся по достоинству, или что у Васи ошибка во взвешиваниях. Среди заданных монет нет одинаковых.

Входные данные

Во входных данных содержатся результаты всех трех взвешиваний, по одному результату в каждой строке. Гарантируется, что каждая пара монет взвешивалась ровно один раз. Вася обозначил монеты буквами «A», «B» и «C». Каждый результат — строка вида (буква)(знак < или >)(буква). Например, если монета «A» оказалась легче монеты «B», результатом взвешивания будет A<B.

Выходные данные

Если в результатах есть противоречие, выведите Impossible. Иначе выведите без пробелов перестановку букв «A», «B» и «C» — монеты в порядке возрастания их весов.

C. Кроссворд

реализация *2000

Вася тренируется составлять кроссворды. Пока он умеет составлять кроссворды только очень простого вида. Все они состоят ровно из шести слов, слова можно читать только сверху вниз по вертикали и слева направо по горизонтали. Слова расположены в виде прямоугольной восьмерки, не обязательно симметричной. Восьмерка упирается одной половиной в левый верхний угол, а другой — в правый нижний угол некоторого прямоугольника. Кроссворд не может вырождаться, т. е. в нем всегда содержится ровно четыре пустые области, две из которых окружены буквами. В качестве примеров посмотрите ответы на тесты из условия.

Помогите Васе — составьте кроссворд описанного вида из заданных шести слов. Разрешается использовать слова в любом порядке.

Входные данные

В шести строках записаны заданные слова. Каждое слово состоит не более чем из 30 и не менее чем из 3 больших латинских букв.

Выходные данные

Если решения не существует, выведите Impossible. Иначе выведите искомый кроссворд. Все пустые клетки обозначайте точками.

Если решений несколько, выведите лексикографически наименьшее. Т. е. то решение, первая строчка которого меньше первой строчки других. При равенстве первых строк, сравнивайте вторые и т. д. Лексикографическое сравнение строк реализует оператор < в современных языках программирования.

A. Последовательность хрустального шара

*особая задача реализация *1400

Последовательность хрустального шара на шестиугольной решетке определяется следующим образом: n-й элемент последовательности равен количеству узлов решетки внутри шестиугольника с длиной стороны (n + 1) узел. Формула для подсчета n-го элемента: Hn = 3·n·(n + 1) + 1. Вам дан номер n; вычислите n-й элемент последовательности.

Входные данные

Единственная строка входных данных содержит целое число n (0 ≤ n ≤ 9).

Выходные данные

Выведите n-й элемент последовательности.

A. МУХ и палочки

реализация *1100

Белым медведям Меньшикову и Усладе из Санкт-Петербургского зоопарка и слонику Хорасу из Киевского зоопарка в рамках проверки их творческих способностей дали для игры шесть палочек. Меньшиков, Услада и Хорас решили собрать из этих палочек либо слона, либо медведя. Животные из палочек собираются так:

  • Четыре палочки изображают лапы животного, эти палочки должны быть равными по длине.
  • Две оставшиеся палочки изображают голову и тело животного. У медведя палочка-голова должна быть короче палочки-тела. У слона же есть длинный хобот, поэтому палочка-голова слона должна быть такой же длины, как палочка-тело. Обратите внимание, что нет никаких ограничений на отношения между палочками лап и палочками головы и тела животных.

От вас требуется узнать, какое животное можно собрать из заданного набора палочек. После игры палочки необходимо вернуть руководителю зоопарка, поэтому ломать их категорически запрещено, это даже медведям понятно.

Входные данные

В единственной строке через пробел даны шесть чисел li (1 ≤ li ≤ 9) — длины шести палочек. Гарантируется, что входные данные таковы, что собрать обоих животных из них никак не получится.

Выходные данные

Если из заданного набора можно собрать медведя, то выведите строку «Bear» (без кавычек). Если можно собрать слона, то выведите строку «Elephant» (без кавычек). Если ни медведя, ни слона собрать невозможно, то выведите строку «Alien» (без кавычек).

Примечание

Если вас подводит фантазия, то ознакомьтесь с инструкцией ниже, показывающей, как в первых двух примерах можно собрать медведя и слона. На ней красным обозначена палочка, имеющая длину 2, зеленым — палочки, имеющие длину 4, а синим — палочки длины 5.

B. МУХ и важные дела

реализация сортировки *1300

Белым медведям Меньшикову и Усладе из Санкт-Петербургского зоопарка и слонику Хорасу из Киевского зоопарка пришла пора наконец заняться делами. Всего на повестке дня имеется n дел, каждый из троицы должен будет заняться каждым из этих дел. Для каждого дела они оценили его сложность и решили заняться делами в порядке от наиболее простых к наиболее сложным делам. К сожалению, некоторые дела могут иметь одинаковую сложность, поэтому последовательность выполнения дел может быть не однозначной.

Меньшиков, Услада и Хорас просят вас разобраться с этой мелочью и предоставить каждому из них личный план, который представлял бы собой последовательность выполнения всех n дел. Еще они хотят, чтобы порядок дел, выполняемых каждым из них, хотя бы в одном пункте отличался от порядка дел, выполняемых двумя остальными (другими словами, все три плана должны быть различными последовательностями). Или огорчите их, сообщив, что составить три различных плана для заданных дел невозможно.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 2000) — количество дел. Во второй строке записаны n целых чисел h1, h2, ..., hn (1 ≤ hi ≤ 2000), где hi обозначает сложность i-го дела. Чем число hi больше, тем сложнее i-е дело.

Выходные данные

В первой строке выведите «YES» (без кавычек), если возможно составить три различных плана выполнения дел, в противном случае в первой строке выведите «NO» (без кавычек). Если три искомых плана существуют, то во второй строке выведите n различных целых чисел, представляющих собой номера дел в порядке их выполнения в соответствии с первым планом. В третьей и четвертой строке выведите два оставшихся плана в таком же формате.

Если существует несколько возможных ответов, то разрешается вывести любой из них.

Примечание

В первом примере сложность дел накладывает одно ограничение — дела 1 и 4 должны быть выполнены до дел 2 и 3. Всего это дает четыре возможных последовательности выполнения дел: [1, 4, 2, 3], [4, 1, 2, 3], [1, 4, 3, 2], [4, 1, 3, 2]. Любые три из них можно вывести в ответ.

Во втором примере есть только две последовательности дел, удовлетворяющих условиям, — [3, 1, 2, 4, 5] и [3, 1, 4, 2, 5]. Следовательно составить три различных последовательности дел невозможно.

E. Уроки дизайна задач: учимся у игр

Конструктив реализация *2800

Один из источников новых задач — игры. Надо выбрать игру и сосредоточиться на какой-то части механики игры. Так получится неплохая задача.

Давайте попробуем. Puzzle and Dragon стала популярной игрой в Японии — мы сосредоточимся только на части механики игры, в которой нужно передвигать сферы на доске.

(Картинка со странички Википедии: http://en.wikipedia.org/wiki/Puzzle_&_Dragons)

Задана доска размера n × m, в каждой ячейке доски находится сфера. Во время игры разрешено совершать следующие ходы. В начале хода вы прикасаетесь к одной из ячеек на доске, затем вы передвигаете палец в одну из соседних ячеек (у ячейки, которая не находится на границе, 8 соседей), затем вы можете еще раз передвинуть палец из текущей ячейки в одну из соседних и так далее. Каждый раз, когда вы двигаете палец от одной ячейки к другой, сферы, находящиеся в этих ячейках, меняются местами. Иными словами, какие бы движения пальцем вы не сделали, сфера в той клетке, к которой вы прикасаетесь, никогда не поменяется.

Задача игрока в игре — достичь такого расположения сфер, при котором сферы пропадут, а герой сможет атаковать врага — но эти детали нам не важны. Мы фокусируемся на другом. Пусть задано начальное расположение сфер, и конечное расположение сфер. Ваша задача — определить, можно ли получить из начального расположения конечное за один ход.

Входные данные

В первой строке записано два целых числа: n и m (1 ≤ n, m ≤ 30) — размеры игровой доски.

В каждой из следующих n строк записано по m целых чисел — описание изначальной доски: j-е число в i-й строке равняется si, j (1 ≤ si, j ≤ 900), где si, j обозначает тип сферы, расположенной в i-м ряду и в j-м столбце игровой доски.

Следующие n строк содержат конечную доску в аналогичном формате. Обратите внимание, что изначальная доска и конечная доска обязательно различаются.

Выходные данные

Если решения не существует, выведите: -1.

Если решение существует, то выведите в первой строке целое число k (1 ≤ k ≤ 106) — количество движений пальца в вашем ходе.

В следующей строке выведите два целых числа x0 и y0 (1 ≤ x0 ≤ n; 1 ≤ y0 ≤ m) — положение ячейки, к которой вы прикоснетесь в начале. В каждой из следующих k строк выведите два целых числа xi и yi (1 ≤ xi ≤ n; 1 ≤ yi ≤ m) — ячейка, в которую вы передвигаете палец в данный момент. Обратите внимание, что эта ячейка должна быть соседней с предыдущей, другими словами max(|xi - xi - 1|, |yi - yi - 1|) = 1.

Если у задачи несколько решений, можно вывести любое. Можно доказать, что при указанных ограничениях, если существует решение, то существует и решение с не более, чем 106 операциями.

A. Клавиатура

реализация *900

Наш добрый друг Крот пытается закодировать большое сообщение. Он печатает на необычной клавиатуре, где клавиши расположены следующим образом:


qwertyuiop
asdfghjkl;
zxcvbnm,./

К сожалению, Крот слепой, так что иногда ему сложно правильно расположить лапки на клавиатуре. Он случайно передвинул обе лапки на одну позицию влево или вправо. Это значит, что теперь он нажимает не на желаемую клавишу, а на соседнюю (левую или правую, как указано во вводе).

У нас есть последовательность символов, которые он напечатал, требуется найти исходное сообщение.

Входные данные

В первой строке задана единственная буква, описывающая направление сдвига («L» или «R» соответственно для сдвига налево и направо).

Во второй строке задана последовательность символов, написанных Кротом. Размер этой последовательности не превышает 100. Последовательность не содержит никаких символов, кроме присутствующих на клавиатуре Крота, в частности, она не содержит пробелов.

Гарантируется, что даже несмотря на то, что Крот передвинул лапки, он, тем не менее, попадает на клавиши и ему ни разу не пришлось нажать за пределы клавиатуры.

Выходные данные

Выведите исходное сообщение единственной строкой.

B. Черви

Бинарный поиск реализация *1200

Пора Кроту пообедать. Его друг Сурок приготовил вкусный обед.

Сурок принес Кроту n упорядоченных кучек червей, таких, что в i-ой кучке содержатся ai червей. Он пронумеровал всех этих червей последовательными целыми числами: черви в первой кучке пронумерованы числами от 1 до a1, черви во второй кучке пронумерованы числами от a1 + 1 до a1 + a2 и так далее. Смотрите пример для лучшего понимания.

Крот не может съесть всех червей (Сурок принёс их слишком много для того, чтобы съесть за один подход). К тому же, насколько мы знаем, Крот слепой — поэтому Сурок помогает ему, называ номера самых сочных червей. Сурок даст Кроту червяка, только если Крот правильно назовет кучку, в которой лежит червяк.

Крот просит вас ему помочь. Для всех сочных червей, которых назвал Сурок, подскажите Кроту правильные ответы.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105), количество кучек.

Во второй строке записано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 103, a1 + a2 + ... + an ≤ 106), где ai — количество червей в i-й кучке.

В третьей строке записано единственное целое число m (1 ≤ m ≤ 105), количество сочных червей, названных Сурком.

В четвертой строке записано m целых чисел q1, q2, ..., qm (1 ≤ qi ≤ a1 + a2 + ... + an) — номера сочных червей.

Выходные данные

Выведите m строк. В i-ой строке должно быть целое число — номер кучки, в которой лежит червяк под номером qi.

Примечание

Для входного файла из примера:

  • Черви под номерами в пределах [1, 2] лежат в первой кучке.
  • Черви под номерами в пределах [3, 9] лежат во второй кучке.
  • Черви под номерами в пределах [10, 12] лежат в третьей кучке.
  • Черви под номерами в пределах [13, 16] лежат в четвертой кучке.
  • Черви под номерами в пределах [17, 25] лежат в пятой кучке.

A. Bayan автобус

реализация *1100

На финальном раунде соревнования по программированию Bayan, который пройдет в Тегеране, участников будет развозить желтый автобус. В автобусе 34 пассажирских места: 4 места в последнем ряду и по 3 места в остальных рядах.

У координатора есть список из k участников, которых надо подобрать в аэропорту. Когда участник садится в автобус, он направляется в последний ряд с пустым местом. Если в этом ряду более одного пустого места, то он сядет на самое левое доступное.

Чтобы отслеживать расположение людей в автобусе, координатору события требуется схема, показывающая, какие места займут k участников. Ваша задача — нарисовать схему, представляющую занятые места.

Входные данные

В единственной строке записано целое число k, (0 ≤ k ≤ 34) — количество участников.

Выходные данные

Выведите фигуру автобуса с k пассажирами, следуя формату тестов из условия. Символ '#' обозначает пустое место, а 'O' обозначает место с пассажиром. 'D' — водитель автобуса. Остальные символы в выводе имеют чисто декоративное назначение. Строго придерживайтесь формата тестов из условия. Выведите ровно шесть строк. Не выводите лишних пробелов или иных символов.

B. Сильно связный город

графы Перебор поиск в глубину и подобное реализация *1400

Рассмотрим город, в котором есть n горизонтальных улиц пересекаются с m вертикальными, формируя сетку размера (n - 1) × (m - 1). Чтобы снизить количество заторов, мэр города решил сделать каждую улицу односторонней. Это значит, что по каждой горизонтальной улице машины будут ехать либо только с запада на восток, либо только с востока на запад. Аналогично, по каждой вертикальной улице машины будут ехать либо только с севера на юг, либо только с юга на север. На любом перекрестке можно свернуть с вертикальной улицы на горизонтальную и наоборот.

Мэр города получил несколько вариантов направления улиц. Ваша задача — проверить можно ли в данном варианте добраться от любого перекрестка до любого другого перекрестка, двигаясь по дорогам в указанном для них направлении.

Входные данные

В первой строке записано два целых числа n, m, (2 ≤ n, m ≤ 20), обозначающие соответственно количество горизонтальных и вертикальных улиц.

Во второй строке записана строка длины n из символов '<' и '>' — направления горизонтальных улиц. Если очередной символ этой строки равняется '<', то соответствующая улица направлена с востока на запад, в противном случае улица направлена с запада на восток. Улицы приводятся в порядке с севера на юг.

В третьей строке записана строка длины m из символов '^' и 'v' — направления вертикальных улиц. Если очередной символ равняется '^', то улица направлена с юга на север, в противном случае улица направлена с севера на юг. Улицы приводятся в порядке с запада на восток.

Выходные данные

Если указанная схема удовлетворяет требованиям, выведите в единственной строке "YES", в противном случае выведите в единственной строке "NO".

Примечание

Рисунок в условии соответствует второму примеру.

A. Dreamoon и ступеньки

математика реализация *1000

Dreamoon хочет подняться по лестнице, состоящей из n ступенек. За один шаг он может преодолеть 1 или 2 ступеньки. При этом, Dreamoon хочет, чтобы количество шагов было кратно целому числу m.

Какое минимальное количество шагов ему придётся сделать, чтобы подняться, выполнив своё условие?

Входные данные

В единственной строке записано два целых числа через пробел — n, m (0 < n ≤ 10000, 1 < m ≤ 10).

Выходные данные

Выведите единственное число — минимальное количество шагов, кратное m. Если способа взобраться по лестнице, выполнив условие задачи, не существует, выведите  - 1.

Примечание

В первом примере Dreamoon может взойти по лестнице за 6 ходов, совершая следующие шаги: {2, 2, 2, 2, 1, 1}.

Во втором примере есть только три подходящих последовательностей шагов {2, 1}, {1, 2}, {1, 1, 1} длины 2, 2, и 3 соответственно. Все эти числа не кратны 5.

A. Начальная ставка

реализация *1100

В игру «Щедрость» играют пять человек. Каждый из них вносит некоторое ненулевое количество монет b в качестве начальной ставки. После того, как все игроки сделали ставку в b монет, некоторое число раз повторяется следующая операция: у одного из игроков берется одна монета и отдается какому-то другому игроку.

Ваша задача — написать программу, которая по количеству монет у каждого из игроков в конце игры определит размер начальной ставки b или определит, что такой итог игры не мог быть получен ни при каком положительном количестве монет b в начальной ставке.

Входные данные

Ввод состоит из единственной строки, содержащей пять целых чисел c1, c2, c3, c4 и c5 — количество монет в конце игры у первого, второго, третьего, четвертого и пятого игрока соответственно (0 ≤ c1, c2, c3, c4, c5 ≤ 100).

Выходные данные

В единственной строке требуется вывести единственное положительное целое число b — количество монет в начальной ставке каждого из игроков. Если не существует такого значения b, то в единственной строке выходных данных требуется вывести «-1» (без кавычек).

Примечание

В первом примере возможна следующая последовательность операций:

  1. Берется одна монета у четвертого игрока и отдается второму;
  2. Берется одна монета у четвертого игрока и отдается пятому;
  3. Берется одна монета у первого игрока и отдается третьему;
  4. Берется одна монета у четвертого игрока и отдается второму.

B. Башни

жадные алгоритмы Конструктив Перебор реализация сортировки *1400

Как известно, все дети в Берляндии любят играть с кубиками. У маленького Пети имеется n башен, состоящих из кубиков одинакового размера. Башня под номером i представляет собой ai кубиков, поставленных друг на друга. Неустойчивостью набора башен Петя называет величину, равную разности высот самой высокой и самой низкой башни. К примеру, если Петя построил из кубиков пять башен с высотами (8, 3, 2, 6, 3), то неустойчивость этого набора равна 6 (самая высокая башня имеет высоту 8, самая низкая — высоту 2).

Мальчик хочет, чтобы неустойчивость его набора башен была как можно меньше. Все, что он может сделать, это несколько раз проделать следующую операцию: взять верхний кубик с какой-то из башен и положить его сверху на какую-то другую башню из своего набора. Обратите внимание, что Петя никогда не будет класть кубик на ту же башню, с которой тот был снят, потому что считает это пустой тратой времени.

Прежде чем отправиться в школу, мальчик успеет произвести не более k таких операций. Петя не хочет опоздать на урок, поэтому вам придется помочь ему выполнить эту задачу.

Входные данные

В первой строке через пробел записаны два целых положительных числа n и k (1 ≤ n ≤ 100, 1 ≤ k ≤ 1000) — количество башен в имеющемся наборе и максимальное число операций, которые Петя может произвести. Во второй строке через пробел записаны n целых положительных чисел ai (1 ≤ ai ≤ 104) — исходные высоты башен.

Выходные данные

В первой строке выведите через пробел два целых неотрицательных числа s и m (m ≤ k). Первое из чисел — это величина минимально возможной неустойчивости, которую можно достичь, применив не более k операций, а второе — количество операций, необходимых для этого.

Затем в m строках выведите описание каждой из операций в виде двух целых положительных чисел i и j, каждое из которых лежит в пределах от 1 до n. Они обозначают, что Петя переложил верхний кубик с i-й башни на j-ю (i ≠ j). Обратите внимание, что в процессе выполнения операций высоты некоторых башен могут стать равны нулю.

Если существует несколько корректных последовательностей операций, при которых достигается минимально возможная неустойчивость, разрешается вывести любую из них.

Примечание

В первом примере осуществляется два перекладывания, со второй башни на третью и со второй на первую. После этого высоты башен становятся одинаковыми и равными 6.

D. Прыжки в длину

Бинарный поиск жадные алгоритмы реализация *1700

Валерий — учитель физической культуры в одной из школ Берляндии. Скоро школьникам сдавать норматив по прыжкам в длину, а Валерий потерял свою любимую линейку!

Однако нет поводов для разочарования, поскольку Валерий нашел другую линейку длины l сантиметров. На линейку уже нанесены n отметок, с помощью которых можно производить измерения. Будем считать, что отметки пронумерованы числами от 1 до n в порядке их следования от начала линейки к ее концу. Первая отметка совпадает с началом линейки и обозначает начало отсчета. Последняя отметка совпадает с концом линейки и находится на расстоянии l от начала отсчета. Такую линейку можно задать возрастающей последовательностью a1, a2, ..., an, где ai означает расстояние i-й отметки от начала отсчета (a1 = 0, an = l).

Валерий считает, что с помощью линейки можно отмерить расстояние d сантиметров, если существует пара целых чисел i и j (1 ≤ i ≤ j ≤ n), такая, что расстояние между i-й и j-й отметкой в точности равно d (иными словами, aj - ai = d).

Согласно нормам, девочки должны уметь прыгать в длину на расстояние не менее чем x сантиметров, а мальчики должны уметь прыгать в длину на расстояние не менее чем y (x < y) сантиметров. Для проверки способностей детей Валерию нужна линейка, с помощью которой можно отмерить каждое из расстояний x и y.

Ваша задача — определить, какое минимальное количество дополнительных отметок необходимо нанести на линейку так, чтобы с их помощью можно было отмерить расстояния x и y. Валерий может наносить отметки на любом целочисленном неотрицательном расстоянии от начала отсчета, не превышающем длину линейки.

Входные данные

В первой строке записано четыре целых положительных числа через пробел n, l, x, y (2 ≤ n ≤ 105, 2 ≤ l ≤ 109, 1 ≤ x < y ≤ l) — количество отметок, длина линейки и нормативы для девочек и мальчиков соответственно.

Во второй строке записана последовательность из n целых чисел a1, a2, ..., an (0 = a1 < a2 < ... < an = l), где ai означает расстояние от i-й отметки до начала отсчета.

Выходные данные

В первой строке выведите единственное целое неотрицательное число v — минимальное количество отметок, которые нужно дополнительно нанести на линейку.

Во второй строке выведите через пробел v целых чисел p1, p2, ..., pv (0 ≤ pi ≤ l). Число pi означает, что i-ю отметку следует нанести на расстоянии pi сантиметров от начала отсчета. Отметки выводите в любом порядке. Если оптимальных решений несколько, выведите любое из них.

Примечание

В первом примере изначально нельзя отмерить расстояние 230 сантиметров. Для этого достаточно добавить отметку 20 сантиметров или отметку 230 сантиметров.

Во втором примере с помощью линейки уже можно отмерить расстояния 185 и 230 сантиметров, поэтому добавлять новые отметки не нужно.

В третьем примере на линейку нанесены только отметки начала и конца. Нам потребуется добавить две отметки, чтобы проверка способностей детей стала возможной.

A. Камень-Ножницы-Бумага

расписания реализация *900

Дядя Федор, кот Матроскин и пес Шарик скромно, но весело, до сих пор живут в Простоквашино. Иногда им приходят посылки от родителей дяди Федора, а иногда и от анонимных благодетелей. В последнем случае им особенно трудно определять, кому из них предназначается посылка. Понятно, что фоторужье — для Шарика, килька — для Матроскина, а вот кому прислали новую игровую приставку??? Все трое героев дружно предъявили права на этот подарок и чуть не поссорились. Дяде Федору пришло в голову, как поступить справедливо: считать, что приставку прислали всем троим, а играть в нее по очереди. Все уже было обрадовались, как возник не менее животрепещущий вопрос: а кто будет играть первым? Теперь ситуацию спас уже Матроскин, предложив самый честный способ определить это: сыграть втроем в камень-ножницы-бумага. Правила этой игры очень просты. Каждый игрок на счет три показывает на пальцах руки (или лапы) комбинацию, соответствующую одному из трех предметов: камню, ножницам или бумаге. Некоторые предметы побеждают другие по известным правилам: камень ломает ножницы, ножницы разрезают бумагу, бумага заворачивает камень. Обычно играют два игрока. Но друзей трое, поэтому они решили определять победителя так: если кто-то показал предмет, который побеждает предметы остальных двух участников, то этот участник победил. Иначе требуется еще один раунд игры. Напишите программу, которая определяет победителя игры по предметам, которые они показали.

Входные данные

В первой строке записано название предмета, который показал дядя Федор, во второй строке – название предмета, который показал Матроскин, а в третьей — Шарик. Камень называется «rock», бумага называется «paper», а ножницы — «scissors».

Выходные данные

Выведите «F» (без кавычек), если победил дядя Федор. Выведите «M», если победил Матроскин, и «S», если Шарик. Если определить победителя невозможно, выведите «?».

B. Участок для дома

Перебор реализация *1200

У дяди Васи есть прекрасный сад, где растут чудесные фруктовые деревья, каждый год дающие небывалый урожай. Но в последнее время воры стали слишком часто лазить в сад по ночам и красть оттуда фрукты. Дядя Вася не может ночевать на участке и караулить урожай, потому что в саду нету домика! Дядя Вася подкопил денег и решился на постройку. Дело осталось за малым: определить, в какой части сада строить домик. Вечером он сел за стол и начертил план сада. На плане сад представляет собой прямоугольное клетчатое поле размера n × m, разбитое на клетки со стороной 1. В некоторых клетках дядя Вася отметил растущие в них деревья (деревья нельзя сажать близко, поэтому в одной клетке получилось не более одного дерева). Дядя Вася хочет выделить под строительство прямоугольный участок размера a × b клеток, причем границы участка для строительства должны идти по линиям сетки, которая разграничивает клетки. Все деревья, которые окажутся на участке для постройки домика, придется вырубить. Дядя Вася очень любит свой сад, поэтому помогите ему выбрать такое положение участка для строительства, чтобы количество вырубленных деревьев было как можно меньшим.

Входные данные

В первой строке записано два целых числа n и m (1 ≤ n, m ≤ 50) — размеры сада. В следующих n строках записано по m чисел 0 или 1, которые описывают сад на плане. Ноль означает, что в этой клетке не растет дерево, а единица — что растет. В последней строке записано два целых числа a и b (1 ≤ a, b ≤ 50). Обратите внимание, что дядя Вася может выбрать для строительства как прямоугольник a × b, так и b × a, т.е. сторона участка для строительства длиной a может располагаться как параллельно стороне участка с длиной n, так и параллельно стороне участка с длиной m.

Выходные данные

Выведите наименьшее количество деревьев, которое нужно вырубить, чтобы выделить участок a × b под строительство домика. Гарантируется, что хотя бы одно положение для участка всегда найдется, т. е. или a ≤ n и b ≤ m, или a ≤ m и b ≤ n.

Примечание

Во втором примере левая верхняя клетка участка это (1,1), а правая нижняя — (3, 2).

A. Опровержение гипотез

математика Перебор реализация теория чисел *1100

Ваш друг недавно узнал про взаимно простые числа. Пара чисел (a, b) называется взаимно простой, если максимальное число, которое делит оба числа a и b, равно единице.

Ваш друг часто придумывает разные утверждения. Недавно он предположил, что если пара чисел (a, b) является взаимно простой и пара чисел (b, c) является взаимно простой, то пара чисел (a, c) является взаимно простой.

Вы хотите опровергнуть утверждение вашего друга. Ваша задача — найти тройку различных чисел (a, b, c), для которой утверждение вашего друга неверно, и числа в тройке удовлетворяют условию l ≤ a < b < c ≤ r.

Формально, вам нужно найти тройку чисел (a, b, c), такую что l ≤ a < b < c ≤ r, пары (a, b) и (b, c) взаимно простые, а пара (a, c) не является взаимно простой.

Входные данные

В единственной строке записано два целых положительных числа через пробел l, r (1 ≤ l ≤ r ≤ 1018; r - l ≤ 50).

Выходные данные

В единственной строке выведите три целых положительных числа через пробел a, b, c — искомую тройку различных чисел (a, b, c). Если существует несколько решений, разрешается вывести любое. Числа в тройке необходимо выводить в порядке возрастания.

Если искомой тройки не существует, выведите единственное число -1.

Примечание

В первом примере пара (2, 4) не является взаимно простой, а пары (2, 3) и (3, 4) — взаимно простые.

В втором примере нельзя составить тройку из трех различных чисел, поэтому ответ -1.

В третьем примере нетрудно заметить, что числа 900000000000000009 и 900000000000000021 делятся на 3.

C. Странная сортировка

математика реализация *2600

Много ли сортировок вы знаете? По возрастанию, по убыванию, по длине, по полярному углу... Познакомимся с еще одной: d-сортировкой. Эта сортировка применяется к строкам длины не менее, чем d, где d — некоторое целое положительное число. Символы в строке упорядочиваются следующим образом: сначала идут все 0-е символы исходной строки, потом 1-е, потом 2-е и так далее, в конце будут стоять все (d - 1)-е символы исходной строки. Под i-ми символами здесь подразумеваются символы, позиции которых при делении на d дают в остатке i. При этом, если два символа стоят на позициях с одинаковым остатком, то их относительный порядок после сортировки не меняется. Индексация в строке выполняется с нуля. Например, для строки «qwerty»:

1-сортировка даст строку «qwerty» (все символы стоят на 0-позициях),

2-сортировка даст строку «qetwry» (символы «q», «e» и «t» стоят на 0-позициях, а символы «w», «r» и «y» на 1-позициях),

3-сортировка даст строку «qrwtey» (символы «q» и «r» стоят на 0-позициях, символы «w» и «t» на 1-позициях, а символы «e» и «y» на 2-позициях),

4-сортировка даст строку «qtwyer»,

5-сортировка даст строку «qywert».

Вам дана строка S длины n и m операций перемешивания этой строки. Каждая операция перемешивания задается двумя целыми числами k и d и изменяет строку S следующим образом. Для каждого i от 0 до n - k в порядке возрастания к подстроке S[i..i + k - 1] применяется операция d-сортировки. Здесь под S[a..b] подразумевается подстрока, состоящая из символов на позициях от a до b включительно.

После каждой операции перемешивания вам необходимо вывести строку S.

Входные данные

В первой строке ввода содержится непустая строка S длины n, состоящая из строчных и заглавных букв латинского алфавита и цифр от 0 до 9.

Во второй строке ввода содержится целое число m – количество операций перемешивания (1 ≤ m·n ≤ 106).

Далее в m строках идут описания операций в виде пары чисел k и d (1 ≤ d ≤ k ≤ n).

Выходные данные

После каждой операции выведите текущее состояние строки S.

Примечание

Рассмотрим пример подробнее. Первая модификация производится с параметрами k = 4, d = 2. Это означает, что нужно по очереди заменить все подстроки длины 4 на их 2-сортировки, двигаясь слева направо. Строка будет меняться следующим образом:

qwerty  →  qewrty  →  qerwty  →  qertwy

Тем самым строка S в итоге станет равна «qertwy».

Вторая модификация производится с параметрами k = 6, d = 3. В результате этой операции вся строка S заменится на ее 3-сортировку:

qertwy  →  qtewry

Третья модификация производится с параметрами k = 5, d = 2.

qtewry  →  qertwy  →  qetyrw

A. Фабрика

математика матрицы реализация *1400

На одной промышленной фабрике проходит реформа рабочего дня. Директор предложил установить норму производства мифических деталей. Если к началу рабочего дня на заводе находилось x деталей, то по плану к концу должно быть произведено еще (остаток от деления x на m) деталей. К сожалению, пока не нашлось ни одного покупателя на мифические детали, поэтому все произведенные детали остаются на заводе.

Совет директоров обеспокоен, не остановится ли производство по такому плану в один прекрасный день (а именно, не настанет ли момент, когда текущее количество деталей на заводе делится на m).

По заданному количеству деталей a в первый день и числу m проверьте, остановится ли производство.

Входные данные

В первой строке содержатся два целых числа a и m (1 ≤ a, m ≤ 105).

Выходные данные

Выведете «Yes» (без кавычек), если производство может остановиться и «No» иначе.

A. Подсчёт функции

математика реализация *800

Для положительного целого числа n определим функцию f:

f(n) =  - 1 + 2 - 3 + .. + ( - 1)nn

Ваша задача — посчитать f(n) для данного целого числа n.

Входные данные

В единственной строке записано положительное целое число n (1 ≤ n ≤ 1015).

Выходные данные

Выведите f(n) в единственной строке.

Примечание

f(4) =  - 1 + 2 - 3 + 4 = 2

f(5) =  - 1 + 2 - 3 + 4 - 5 =  - 3

B. OR в матрице

жадные алгоритмы реализация хэши *1300

Определим логический OR как операцию над двумя логическими значениями (то есть, значениями, которые принадлежат множеству {0, 1}), которая даёт 1, если один или оба операнда равны 1, в противном случае операция даёт 0. Можно определить логическое OR трех или более логических значений аналогичным образом:

, где , равняется 1, если какое-то из ai = 1, в противном случае результат равняется 0.

У Нама есть матрица A, состоящая из m строк и n столбцов. Строки пронумерованы от 1 до m, столбцы пронумерованы от 1 до n. Элемент в строке i (1 ≤ i ≤ m) и столбце j (1 ≤ j ≤ n) обозначается как Aij. Все элементы A равны либо 0, либо 1. По матрице A Нам строит матрицу B того же размера, используя следующюю формулу:

.

(Bij — OR всех элементов в строке i со всеми элементами столбца j матрицы A)

Нам дает вам матрицу B и бросает вызов: сможете ли вы угадать матрицу A? Хотя Нам умен, он вполне мог ошибиться в подсчете матрицы B, так как размеры матрицы A могут быть очень большими.

Входные данные

В первой строке записано два целых числа m и n (1 ≤ m, n ≤ 100) — количество строк и колонок матриц соответственно.

В следующих m строках записано по n целых чисел через пробелы — строки матрицы B (каждый элемент B равен либо 0, либо 1).

Выходные данные

В первой строке выведите «NO», если Нам ошибся при подсчитывании B, в противном случае выведите «YES». Если первая строка равна «YES», то выведите также m строк по n целых чисел — матрицу A, по которой могла быть получена данная матрица B. Если решений несколько, выведите любое.

C. Преобразование в палиндром

жадные алгоритмы Перебор реализация *1700

Нам играет со строкой на своем компьютере. Строка состоит из n строчных английских букв. Строка не представляет собой ничего осмысленного, так что Нам решил её приукрасить, для чего он решил превратить её в палиндром, используя 4 кнопки со стрелками на клавиатуре: влево, вправо, вверх, вниз.

Курсор указывает на некоторый символ строки. Предположим, что курсор сейчас находится в положении i (1 ≤ i ≤ n, строка использует индексируется с 1). Левая и правая стрелки перемещают курсор по строке. Строка циклична, то есть при нажатии на левую стрелку курсор перемещается в положение i - 1, если i > 1, а в противном случае — в конец строки (т.е., положение n). Аналогично себя ведёт правая стрелка (если i = n, то курсор появляется в начале строки).

Когда Нам нажимает на стрелку вверх, то буква, на которую указывает курсор, заменится на следующую букву английского алфавита (алфавит также является цикличным, то есть за буквой «z» следует буква «a»). Аналогично себя ведёт стрелка вниз.

Изначально курсор находится в положении p.

У Нама много домашней работы, поэтому он хочет добиться результата как можно скорее. Помогите ему подсчитать минимальное количество нажатий на стрелочки, необходимое для превращения строки в палиндром?

Входные данные

В первой строке записано два целых числа через пробел, n (1 ≤ n ≤ 105) и p (1 ≤ p ≤ n), соответственно длина строки Нама и начальное положение курсора.

В следующей строке записано n строчных символов, составляющих строку Нама.

Выходные данные

Выведите минимальное количество нажатий, необходимое для преобразования строки в палиндром.

Примечание

Строка является палиндромом, если она одинаково читается слева-направо и справа-налево.

В примере изначальная строка Нама такова: (положение курсора выделено жирным).

В оптимальном решении Нам может совершить 6 следующих шагов:

В результате получится строка , являющаяся палиндромом.

A. Бьём чудовище!

Бинарный поиск Перебор реализация *1800

На Киберленд напало чудовище!

Отважный мастер Янь собирается сражаться с чудовищем. У Яня и чудовища есть по три атрибута: очки здоровья (HP), сила атаки (ATK) и сила защиты (DEF).

За каждую секунду сражения HP чудовища уменьшается на max(0, ATKY - DEFM), а HP Яня уменьшается на max(0, ATKM - DEFY), где индекс Y обозначает мастера Яня, а индекс M обозначает чудовище. Уменьшение происходит одновременно. Как только у чудовища HP ≤ 0, а у мастера Яня в то же время HP > 0, мастер Янь побеждает.

Мастер Янь может купить увеличение атрибутов в киберлендском магазине волшебства: h биткоинов за очко HP, a биткоинов за очко ATK, и d биткоинов за очко DEF.

Теперь Мастер Янь хочет знать, какое наименьшее количество биткоинов ему надо потратить, чтобы победить.

Входные данные

В первой строке через пробел записаны три целых числа HPY, ATKY, DEFY, обозначающих начальные HP, ATK и DEF мастера Яня.

Во второй строке через пробел записаны три целых числа HPM, ATKM, DEFM, обозначающих начальные HP, ATK и DEF чудовища.

В третьей строке через пробел записаны три целых числа h, a, d, обозначающих цену HP, ATK и DEF.

Все числа во вводе целые и лежат в пределах от 1 до 100 включительно.

Выходные данные

В единственной строке вывода выведите единственное целое число, обозначающее минимальное количество биткоинов, которые мастер Янь должен потратить для победы.

Примечание

В первом примере цены на ATK и DEF очень высокие. Мастер Янь может купить 99 HP, тогда он сможет победить чудовище и остаться с 1 HP в запасе.

Во втором примере мастер Янь достаточно силен, чтобы сразу победить чудовище, так что покупать ничего не надо.

A. SwapSort

жадные алгоритмы реализация сортировки *1200

В этой задаче вам требуется отсортировать массив из n чисел, используя не более чем n обменов. Для заданного массива найдите последовательность попарных обменов элементов, после которых массив становится отсортированным по неубыванию. Обмены производятся последовательно, один за одним.

Обратите внимание, что в задаче не требуется минимизировать число обменов — требуется найти любой способ длины не более n.

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 3000) — количество элементов массива. Вторая строка содержит элементы массива a0, a1, ..., an - 1 ( - 109 ≤ ai ≤ 109), где ai — это i-й элемент массива. Элементы пронумерованы от 0 до n - 1 слева направо. Среди элементов массива могут быть равные.

Выходные данные

В первую строку выведите k (0 ≤ k ≤ n) — количество обменов. Следующие k строк должны содержать описания k искомых обменов по одному в строке. Каждый обмен выводится в виде пары целых чисел i, j (0 ≤ i, j ≤ n - 1), которая обозначает обмен элементов ai и aj. Индексы в парах можно выводить в любом порядке. Обмены производятся в порядке их вывода сверху вниз. Допускается вывод i = j и обмен пары элементов несколько раз.

Если ответов несколько, выведите любой из них. Гарантируется, что хотя бы один ответ существует.

C. Даны длина и сумма цифр...

дп жадные алгоритмы реализация *1400

Вам задано положительное целое число m и неотрицательное целое число s. Ваша задача найти наименьшее и наибольшее из чисел, которые имеют длину m и сумму цифр s. Искомые числа должны быть неотрицательными целыми, записанными в десятичной системе счисления без ведущих нулей.

Входные данные

В единственной строке входных данных записана пара целых чисел m, s (1 ≤ m ≤ 100, 0 ≤ s ≤ 900) — длина и сумма цифр искомых чисел.

Выходные данные

В выходные данные выведите пару искомых неотрицательных целых чисел — сначала минимальное из возможных, потом — максимальное. Если ни одного числа, удовлетворяющего условию, не существует, то выведите пару чисел «-1 -1» (без кавычек).

A. Сыщик

реализация *800

Вася играет с друзьями в Сыщика. Правила этой игры таковы: тот, кто играет в первый раз, то есть Вася, — сыщик, он должен расследовать «преступление» и выяснить, что же происходит. Он может задавать абсолютно любые вопросы, на которые можно ответить «Да» или «Нет». Все остальные заранее сговариваются отвечать на все вопросы следующим образом: если последняя буква вопроса — гласная, они отвечают «Да», а если последняя буква — согласная, они отвечают «Нет». Сыщик об этом естественно не знает, и его цель — понять это.

К сожалению, Вася не отличается сообразительностью. После 5 часов непрерывных глупых вопросов всем кроме Васи надоело. Поэтому Васины друзья просят вас написать программу, которая отвечала бы на вопросы за них.

Гласные буквы английского алфавита: A, E, I, O, U, Y

Согласные буквы английского алфавита: B, C, D, F, G, H, J, K, L, M, N, P, Q, R, S, T, V, W, X, Z

Входные данные

В единственной строке записан вопрос — непустая строка из больших и маленьких букв латинского алфавита, пробелов и одного знака вопроса. Длина строки не превосходит 100. Гарантируется, что знак вопроса встречается в строке ровно один раз — в качестве последнего символа, а строка содержит хотя бы одну букву.

Выходные данные

Выведите ответ на вопрос: YES в случае ответа «Да», NO в случае ответа «Нет».

Помните, что при ответе на вопрос учитывается последняя буква, а не последний символ. Т. е. пробелы и знак вопроса за буквы не считаются.

D. Игра

дп Перебор реализация *1800

Вася и Петя придумали новую игру. Вася берет полоску 1 × n клеточек, и раскрашивает ее клетки в белый и черный. После этого Петя может делать ходы — за один ход он может выбрать любые две соседние клетки одного цвета и перекрасить эти две клетки так, как ему захочется, возможно в разные цвета. Петя может перекрашивать клетки только в белый и черный. Цель Пети — перекрасить полоску так, чтобы никакие две соседние клетки не были одного цвета. Помогите Пете — по заданной начальной раскраске найдите наименьшее количество ходов, необходимое Пете чтобы выиграть.

Входные данные

В первой строке записано число n (1 ≤ n ≤ 1000) — длина полоски. Во второй строке без пробелов записано n символов — начальная раскраска строки. 0 соответствует белой клетке, 1 соответствует черной клетке.

Выходные данные

Если Петя не сможет выиграть при такой начальной раскраске, выведите -1. Иначе выведите наименьшее число ходов, необходимое Пете для победы.

Примечание

В первом примере Петя может выбрать клетки 1 и 2. Он перекрашивает клетку 1 в черный и клетку 2 в белый.

Во втором примере Петя может выбрать клетки 2 и 3. Он перекрашивает клетку 2 в белый и клетку 3 в черный.

A. Командная олимпиада

жадные алгоритмы реализация сортировки *800

В школе №0 столицы Берляндии учатся n школьников. Все ребята в этой школе способные: у кого-то склонность к программированию, у кого-то склонность к математике, а у остальных — к физкультуре. Таким образом, для каждого школьника известна величина ti:

  • ti = 1, если i-й школьник имеет склонность к программированию,
  • ti = 2, если i-й школьник имеет склонность к математике,
  • ti = 3, если i-й школьник имеет склонность к физкультуре

Так сложилось, что каждый школьник имеет склонность ровно к одному из этих трех предметов.

На командную олимпиаду по научному многоборью требуются команды по три человека. Учителя школы решили, что команды будут составлены из трех школьников со склонностями к разным предметам. Иными словами, в каждой команде должен быть один математик, один программист и один спортсмен. Разумеется, каждый учащийся может быть членом не более чем одной команды.

Какое наибольшее количество команд школа сможет выставить на олимпиаду? Как для этого следует формировать команды?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 5000) — количество учащихся в школе. Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 3), где ti описывает склонность i-го школьника.

Выходные данные

В первой строке выведите целое число w — искомое наибольшее количество команд.

Далее выведите w строк по три числа в каждой строке. Каждая такая тройка должна обозначать номера школьников, образующих команду. Как команды, так и числа в тройках можно выводить в любом порядке. Школьники пронумерованы целыми числами от 1 до n в порядке их описания во входных данных. Каждый школьник должен участвовать не более чем в одной команде. Если решений несколько, выведите любое.

Если ни одну команду невозможно составить, то выведите единственную строку со значением w равным 0.

B. Очередь

реализация снм *1500

На большой перемене все n студентов Берляндского государственного университета выстроились в очередь в столовой. Однако оказалось, что у столовой тоже есть перерыв на обед, и она временно перестала работать.

Стоять в очереди, пока она не обслуживается, так скучно! Поэтому каждый из студентов записал номер студенческого билета того студента, что стоит в очереди перед ним, и того, что стоит в очереди непосредственно за ним. Если перед или после студента никого нет (то есть он первый или последний в очереди), то в качестве номера он записал число 0 (билеты студентов Берляндского государственного университета нумеруются с 1).

После этого все студенты разошлись по своим делам. Когда же они вернулись, то оказалось, что восстановить очередь не такая простая задача, как кажется на первый взгляд.

Помогите студентам восстановить состояние очереди по номерам студенческих билетов соседей в очереди.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 2·105) — количество студентов в очереди.

Далее следует n строк, где i-я строка содержит пару целых чисел ai, bi (0 ≤ ai, bi ≤ 106), где ai — номер студенческого билета того, кто стоит перед очередным студентом, а bi — номер студенческого билета того, кто стоит после очередного студента. Строки заданы в произвольном порядке. В качестве номера студенческого билета используется значение 0, если такого соседа нет.

У всех студентов номера студенческих билетов различны. Гарантируется, что записи соответствуют очереди, в которой стоят все студенты в каком-то порядке.

Выходные данные

Выведите последовательность n целых чисел x1, x2, ..., xn — последовательность номеров студенческих билетов всех студентов в порядке очереди от первого к последнему.

Примечание

Картинка иллюстрирует очередь для первого примера.

E. Восстановление возрастающей последовательности

Бинарный поиск жадные алгоритмы Перебор реализация *2000

Петя написал на доске строго возрастающую последовательность целых положительных чисел a1, a2, ..., an. После этого Вася заменил некоторые цифры в числах этой последовательности на знаки вопроса. Таким образом, каждый знак вопроса соответствует ровно одной стертой цифре.

Восстановите последовательность по тому, что осталось на доске.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 105) — длина последовательности. Следующие n строк содержат по одному элементу последовательности. Каждый из элементов состоит только из цифр и знаков вопросов. Никакой из элементов не начинается с цифры 0. Каждый из элементов имеет длину от 1 до 8 символов включительно.

Выходные данные

Если ответ существует, то выведите в первую строку «YES» (без кавычек). Следующие n строк должны содержать последовательность целых положительных чисел — возможный вариант последовательности Пети. Найденная последовательность должна быть строго возрастающей, получена из заданной путем замены каждого знака вопроса на одиночную цифру. Все числа в найденной последовательности должны быть записаны без ведущих нулей. Если решений несколько, выведите любое из них.

Если ответа не существует, то выведите единственную строку «NO» (без кавычек).

A. В гору пойдёт!

Конструктив реализация *1000

Команда туристического клуба «В гору пойдёт!» только что вернулась из очередного похода. Прямо сейчас участники экспедиции с жаром спорят о том, какой же горный хребет они покорили.

Достоверно известно, что на маршруте было N стоянок, причём все — на разной целочисленной высоте от 1 до N над уровнем моря. Альпинисты заблаговременно прибыли на место первой стоянки, а потом шли по маршруту в течении N - 1 дня: в первый день они шли от 1-й стоянки до 2-й, во второй — от 2-й до 3-й и так далее, пока в последний день не совершили переход от стоянки под номером N - 1 до стоянки под номером N, завершив этим свой маршрут.

Участники экспедиции пытаются понять, на какой высоте находилась каждая стоянка. В их распоряжении имеется запись в журнале, содержащая информацию о том, сколько дней они шли в гору, а сколько — спускались.

Помогите альпинистам! Подскажите им хоть какой-нибудь вариант маршрута, не противоречащий записи в журнале.

Входные данные

Входные данные содержат две строки. В первой строке записано целое неотрицательное число A — это количество дней, в которые альпинисты поднимались в гору. Вторая строка содержит целое неотрицательное число B — количество дней, в которые альпинисты спускались (A + B + 1 = N, 1 ≤ N ≤ 100 000).

Выходные данные

Выведите N различных целых чисел от 1 до N, разделённых пробелами, — маршрут, по которому могли пройти альпинисты. Маршрут описывается высотами стоянок в том порядке, в котором их могли посетить участники экспедиции.

A. Ваня и кубики

реализация *800

Ване на день рождения подарили n кубиков. Он с друзьями решил построить из них пирамиду. Ваня хочет построить пирамиду следующим образом: на верхушке пирамиды должен находиться 1 кубик, на втором уровне — 1 + 2 = 3 кубика, на третьем — 1 + 2 + 3 = 6 кубиков, и так далее. Таким образом, на i-м уровне пирамиды должно располагаться 1 + 2 + ... + (i - 1) + i кубиков.

Ваня хочет узнать, пирамиду какой максимальной высоты он может создать с использованием имеющихся кубиков.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 104) — количество кубиков, подаренных Ване.

Выходные данные

Выведите единственной строкой максимально возможную высоту пирамиды.

Примечание

Иллюстрация к второму примеру:

B. Ваня и фонари

Бинарный поиск математика реализация сортировки *1200

Ваня идет поздней ночью по прямолинейной улице длины l, которая освещается n фонарями. Введём систему координат, в которой начало улицы соответствует точке 0, а её конец — точке l. Тогда i-й фонарь находится в точке ai. Фонарь освещает все точки улицы, которые находятся от него на расстоянии не больше d, где d — некоторое положительное число, общее для всех фонарей.

Ваня хочет узнать, какой минимальный радиус освещения d должен быть у фонарей, чтобы вся улица была освещена.

Входные данные

В первой строке записаны два целых числа n, l (1 ≤ n ≤ 1000, 1 ≤ l ≤ 109) — количество фонарей и длина улицы соответственно.

В следующей строке записано n целых чисел ai (0 ≤ ai ≤ l). Несколько фонарей могут находиться в одной точке. Фонари могут находиться в концах улицы.

Выходные данные

Выведите минимальный радиус освещения d, который необходим, чтобы осветить всю улицу. Ответ будет считаться правильным, если его абсолютная или относительная погрешность не превышает 10 - 9

Примечание

Рассмотрим второй пример. При d = 2 первый фонарь будет освещать отрезок [0, 4] улицы, а второй — отрезок [3, 5]. Таким образом, вся улица будет освещена.

D. Ваня и компьютерная игра

Бинарный поиск математика реализация сортировки *1800

Ваня с другом Вовой играют в компьютерную игру, для прохождения уровня им нужно победить n монстров. Персонаж Вани наносит удары со скоростью x ударов за секунду, а персонаж Вовы — со скоростью y ударов за секунду. Каждый из персонажей тратит фиксированное время на замах, после которого наносится удар (время на замах составляет 1 / x секунды для первого персонажа и 1 / y секунды для второго). i-й монстр умирает после получения ai ударов.

Ване с Вовой стало интересно, кто нанесет последний удар каждому из монстров. Если Ваня с Вовой одновременно наносят последний удар, то считается, что последний удар нанесли оба из них.

Входные данные

В первой строке записано три целых числа n,x,y (1 ≤ n ≤ 105, 1 ≤ x, y ≤ 106) — количество монстров, скорость атаки Вани и Вовы соответственно.

В следующих n строках записаны целые числа ai (1 ≤ ai ≤ 109) — количество ударов, необходимое, чтобы победить i-го монстра.

Выходные данные

Выведите n строк. В i-й строке требуется вывести слово «Vanya», если последний удар по i-му монстру был нанесён Ваней, «Vova», если Вовой, либо «Both», если удар был нанесен ребятами одновременно.

Примечание

В первом примере первый удар наносит Ваня в момент времени 1 / 3, второй удар наносит Вова в момент времени 1 / 2, третий удар наносит Ваня в момент времени 2 / 3, четвертый и пятый удар Ваня и Вова наносят одновременно в момент времени 1.

Во втором примере Ваня и Вова одновременно наносят первый и второй удар в момент времени 1.

A. Вася и футбол

реализация *1300

Вася начал смотреть футбольные матчи. Он узнал, что при некоторых фолах игроки получают желтые, а при некоторых — красные карточки. Игрок, получающий вторую желтую карточку, автоматически получает красную.

Сейчас он смотрит запись одного футбольного матча и записывает в блокнот все фолы, на которые он бы показал карточку. Помогите Васе определить моменты времени, когда футболисты получали бы красные карточки, если бы Вася был судьёй. Для каждого футболиста Васю интересует только первый момент времени, когда тот получил бы красную карточку от Васи.

Входные данные

В первой строке задается имя команды, которая играет дома. Во второй строке задается имя команды, которая играет в гостях. Обе строки — непустые. Длины обеих строк не превышают 20. Каждая из строк состоит только из заглавных латинских букв. Названия команд — различны.

Далее следует число n (1 ≤ n ≤ 90) — количество фолов.

В каждой из последующих n строк указана информация об очередном фоле в следующем виде:

  • сначала следует число t (1 ≤ t ≤ 90) — минута на которой происходит нарушение;
  • затем следует буква «h» или буква «a» — если буква это «h», то карточку получил игрок из команды, которая играет дома, в противном случае карточка была показана игроку команды, играющей в гостях;
  • затем следует номер игрока m (1 ≤ m ≤ 99);
  • затем следует буква «y» или буква «r» — если буква это «y», то была показана жёлтая карточка, в противном случае была показана красная карточка.

Футболисты разных команд могут иметь один и тот же номер. Футболисты внутри одной команды имеют различные номера. Фолы следуют в хронологическом порядке, никакие два фола не произошли на одной и той же минуте.

Выходные данные

На каждое событие получения футболистом своей первой красной карточки в хронологическом порядке выведите строку, содержащую следующую информацию:

  • имя команды, к которой принадлежит футболист;
  • номер футболиста в своей команде;
  • минута получения карточки.

Если ни один футболист не получил красную карточку, ничего выводить не требуется.

Это возможно, что ваша программа ничего не выведет в ходе своего выполнения (если красных карточек в игре не было).

B. Вася и борьба

реализация *1400

Вася стал интересоваться борьбой. Во время схватки борцы производят приемы, за которые они получают очки от судей. Побеждает тот борец, который набрал больше очков.

При равенстве очков побеждает тот, у кого последовательность очков в порядке получения лексикографически больше.

Если последовательности набранных очков совпадают, то побеждает тот, кто выполнил последний прием. Требуется определить, кто из борцов победил.

Входные данные

В первой строке дается число n — количество приемов, произведённых бойцами (1 ≤ n ≤ 2·105).

В следующих n строках даны целые числа ai (|ai| ≤ 109, ai ≠ 0). Если ai положительное, то это означает, что первый борец произвёл приём, оцененный в ai очков. Если же ai отрицательное, то это означает, что второй борец произвёл приём, оцененный в ( - ai) очков.

Приемы записаны в порядке проведения.

Выходные данные

Если победителем является первый боец, выведите строку «first», иначе — «second».

Примечание

Последовательность x  =  x1x2... x|x| лексикографически больше последовательности y  =  y1y2... y|y|, если либо |x|  >  |y| и x1  =  y1,  x2  =  y2, ... ,  x|y|  =  y|y|, либо существует такое число r (r  <  |x|, r  <  |y|), что x1  =  y1,  x2  =  y2,  ... ,  xr  =  yr и xr  +  1  >  yr  +  1.

В этом определении |a| обозначает длину последовательности a.

C. Вася и баскетбол

Бинарный поиск Перебор реализация сортировки Структуры данных *1600

Вася следит за баскетбольным матчем, записывая, какая команда с какой дистанции сделала очередной бросок. Вася знает, что каждый бросок оценивается либо в 2, либо в 3 очка. Бросок оценивается в 2 очка, если дистанция, с которого он выполнен, не превосходит некоторого значения в d метров, и 3, если эта дистанция больше, чем d метров, где d — некоторое неотрицательное целое число.

Вася хочет, чтобы разность набранных командами очков (очки первой команды минус очки второй команды) была как можно больше. Для этого он может мысленно выбирать значение d. Помогите ему добиться желаемого.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 2·105) — количество бросков первой команды. Далее следуют n целых чисел — дистанции бросков ai (1 ≤ ai ≤ 2·109).

Затем дается число m (1 ≤ m ≤ 2·105) — количество бросков второй команды. Далее m целых чисел — дистанции бросков bi (1 ≤ bi ≤ 2·109).

Выходные данные

Выведите два числа в формате a:b — возможный в условиях задачи счёт, при котором разность a - b максимальна. Если таких счетов несколько, выведите такой, в котором число а — максимально.

A. Цифровой индикатор

реализация *1100

Малек живет в 100-этажном доме, этажи которого пронумерованы от 0 до 99. В доме есть лифт с индиактором, показывающим, на каком этаже находится лифт прямо сейчас. Лифт показывает кажду цифру номера с помощью 7 светодиодных сегментов, которые зажигаются и гасятся по отдельности. Рисунок ниже показывает, как лифт оторажает каждую из цифр от 0 до 9.

Как-то раз Малек захотел спуститься в лифте с 88-го этажа на 0-й, как вдруг он заметил, что индикатор вместо 88-го этажа показывает 89-й. Затем, когда лифт пришел в движение, индикатор сменился на 87. Немного подумав, Малек пришел к выводу: единственно возможное объяснение заключается в том, что один из сегментов индикатора сломался. Позже Малек снова задумался о сломанном сегменте и неожиданно для себя придумал следующую задачу.

Предположим, что цифровой индикатор показывает число n. Малек называет целое число x (0 ≤ x ≤ 99) хорошим, если возможно, что данный индикатор должен был показывать x, но из-за некоторого (возможно, нулевого) числа сломанных сегментов вместо этого показывается число n. Малек хочет знать, сколько существует хороших целых чисел для определенного n. Вам требуется написать программу, которая посчитает их количество. Обратите внимание, что индикатор всегда показывает две цифры.

Входные данные

В единственной строке входных данных записано ровно две цифры, обозначающие число n (0 ≤ n ≤ 99). Обратите внимание, что число n может иметь лидирующий нуль.

Выходные данные

В единственной строке выходных данных выведите количество хороших целых чисел.

Примечание

В первом примере индикатор, возможно, должен был показать число 88 или 89.

Во втором примере хорошие целые числа — 00, 08, 80 и 88.

В третьем примере хорошие целые числа — 03, 08, 09, 33, 38, 39, 73, 78, 79, 83, 88, 89, 93, 98, 99.

A. Минимальная сложность

математика Перебор реализация *900

Миша пытается заниматься скалолазанием, но получается у него из рук вон плохо.

На стене висят n зацепок, i-я из которых расположена на высоте ai от земли. Кроме того, пусть последовательность ai возрастает, т.е. ai < ai + 1 для всех i от 1 до n - 1; назовем такую последовательность трассой. Миша считает, что трасса a1, ..., an обладает сложностью . Иными словами, сложность равна максимальному расстоянию между соседними по высоте зацепками.

Сегодня Миша решил пролезть трассу, в которой зацепки висят на высотах a1, ..., an. Чтобы усложнить себе задачу, Миша решил снять одну из зацепок, т.е. удалить один элемент последовательности (например, если из последовательности (1, 2, 3, 4, 5) удалить третий элемент, останется последовательность (1, 2, 4, 5)). Однако, поскольку лазает Миша плохо, он хочет, чтобы после удаления сложность (т. е. максимальная разность высоты между соседними зацепками) была минимальной среди всех возможных вариантов снять одну зацепку. Первая и последняя зацепка должны остаться на месте.

Помогите Мише определить минимальную сложность трассы после снятия одной зацепки.

Входные данные

Первая строка содержит одно целое число n (3 ≤ n ≤ 100) — количество зацепок.

Следующая строка содержит n целых чисел ai (1 ≤ ai ≤ 1000), разделенных пробелами, где ai — высота, на которой висит зацепка номер i. Последовательность ai возрастает (т.е. каждый элемент, кроме первого, строго больше предыдущего).

Выходные данные

Выведите одно число — минимальную сложность трассы после снятия одной зацепки.

Примечание

В первом тесте можно удалить только вторую зацепку, после нее последовательность примет вид (1, 6), максимальная разность соседних элементов равна 5.

Во втором тесте после удаления любой зацепки сложность равна 2.

В третьем тесте можно получить последовательности (1, 3, 7, 8), (1, 2, 7, 8), (1, 2, 3, 8), для которых сложность составляет 4, 5 и 5 соответственно. Таким образом, ответ достигается при удалении второго элемента и равен 4.

B. Секретный код

Конструктив Перебор реализация *1500

Вам в руки попала шкатулка с кодовым замком. На замке есть дисплей, который показывает n цифр. Рядом с дисплеем расположены две кнопки, каждая из которых изменяет цифры на дисплее. Вы быстро догадались, что первая кнопка прибавляет 1 ко всем цифрам (при этом все цифры 9 превращаются в цифры 0), а вторая — сдвигает все цифры на дисплее на одну позицию вправо (при этом последняя цифра становится первой). Например, если дисплей в данный момент показывает число 579, то если нажать первую кнопку, дисплей станет показывать 680, а если после этого нажать вторую кнопку, дисплей станет показывать 068.

Вам известно, что замок откроется, если на дисплее будет отображаться минимальное число из всех, которые можно получить нажатием на кнопки в каком-то порядке (каждая кнопка может быть нажать произвольное число раз). При сравнении чисел ведущие нули игнорируются. Теперь вам требуется определить, что это за число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 1000) — количество цифр на дисплее.

Во второй строке записано n цифр — исходное состояние дисплея.

Выходные данные

Выведите одну строку из n цифр — искомое состояние дисплея, содержащее минимально возможное число.

C. Удаление столбцов

Конструктив Перебор реализация *1500

Вам дана прямоугольная таблица размера n × m, состоящая из маленьких латинских букв. За одну операцию можно целиком удалить из таблицы один столбец; оставшиеся части образуют новую сплошную таблицу. Например, после удаления второго столбца из таблицы


abcd
edfg
hijk

 

получится таблица:


acd
efg
hjk

 

Таблица называется хорошей, если ее строки упорядочены сверху вниз в лексикографическом порядке, т.е. каждая строка лексикографически не превосходит следующую за ней. Определите минимальное количество операций удаления столбца, необходимых для того, что сделать данную таблицу хорошей.

Входные данные

В первой строке записано два целых числа — n и m (1 ≤ n, m ≤ 100).

В следующих n строках записано по m маленьких латинских букв — символы таблицы.

Выходные данные

Выведите одно число — минимальное число столбцов, которые необходимо удалить, чтобы таблица стала хорошей.

Примечание

В первом примере таблица уже является хорошей.

Во втором примере достаточно удалить первый и третий столбец.

В третьем примере необходимо удалить все столбцы (обратите внимание, что таблица, в которой все строки пустые, по определению является хорошей).

Пусть строки s и t имеют равную длину. Тогда строка s лексикографически больше строки t, если они не совпадают, и следующий за максимальным общим префиксом s и t (общий префикс может быть пустым) символ строки s идет в алфавитном порядке позже соответствующего символа строки t.

A. Просмотр фильма

жадные алгоритмы реализация *1000

Вы решили посмотреть лучшие моменты некоторого фильма. Ваш плеер имеет две кнопки:

  1. Посмотреть текущую минуту фильма. В результате нажатия этой кнопки вы успешно просматриваете текущую минуту фильма и плеер автоматически переходит к следующей минуте фильма.
  2. Пропустить ровно x минут фильма (x — некоторое фиксированное положительное целое число). Если плеер сейчас находится на t-й минуте фильма, тогда в результате нажатия этой кнопки (t + x)-я минута станет текущей.

Изначально плеер включен на первой минуте, и вы хотите посмотреть ровно n лучших моментов фильма, причем i-й лучший момент начинается на li минуте и заканчивается на ri минуте (более формально, i-й лучший момент состоит из минут: li, li + 1, ..., ri).

Определите, какое минимальное количество минут фильма вам придется посмотреть, если вы хотите посмотреть все лучшие моменты?

Входные данные

В первой строке записаны два целых числа через пробел n, x (1 ≤ n ≤ 50, 1 ≤ x ≤ 105) — количество лучших моментов фильма и параметр x второй кнопки.

В следующих n строках следуют описания лучших моментов фильма, i-я строка описания содержит два целых числа через пробел li, ri (1 ≤ li ≤ ri ≤ 105). Гарантируется, что для всех целых i от 2 до n выполняется неравенство ri - 1 < li.

Выходные данные

Выведите единственное число — ответ на задачу.

Примечание

В первом примере плеер изначально включен на первой минуте. Поскольку минуты с 1-й по 4-ю не содержат интересных моментов, мы нажимаем на вторую кнопку. После этого, мы не можем нажать на вторую кнопку и пропустить 3 минуты, поскольку часть из них содержат интересные моменты. Поэтому мы смотрим фильм с 4-й по 6-ю минуты, после этого текущее время равно 7. Аналогично мы снова пропускаем 3 минуты и после этого просматриваем фильм с 10-й по 12-ю минуты. Итого всего мы посмотрим 6 минут фильма.

Во втором примере фильм очень интересный, поэтому придется посмотреть все 100000 минут фильма.

B. Лекция

реализация Строки *1000

У вас новый преподаватель по теории графов и он очень быстро читает лекции. Чтобы успевать записывать, вы разработали следующий план.

Вы знаете два языка, причём преподаватель читает лекцию на первом из них. Слова обоих языков состоят из маленьких латинских символов. Каждый язык представляет собой некоторый набор слов. В каждом языке все слова различаются, т. е. записываются различным образом. Более того, между словами этих языков установлено взаимно-однозначное соответствие, то есть для каждого слова каждого языка в другом языке существует ровно одно слово, которое имеет такое же значение.

Каждое слово, сказанное преподавателем, вы можете написать либо на первом языке, либо на втором. Конечно, во время лекции каждое слово вы записываете на том языке, на котором данное слово записывается короче. В случае равенстве длин соответствующих слов вы отдаете предпочтение слову из первого языка.

Вам задан текст лекции, которую прочитает вам преподаватель. Определите, как описанная лекция будет записана вами в конспект.

Входные данные

В первой строке записано два целых числа n и m (1 ≤ n ≤ 3000, 1 ≤ m ≤ 3000)— количество слов в лекции преподавателя и количество слов в каждом из языков. В следующих m строках записано описание слов. i-я строка содержит две строки ai, bi. Это означает, что слово ai принадлежит первому языку, слово bi принадлежит второму языку, и эти два слова обозначают одно и то же. Гарантируется, что никакое слово не встречается в обоих языках и каждое слово встречается ровно один раз в своем языке.

В следующей строке записано n строк через пробел c1, c2, ..., cn — описание лекции. Гарантируется, что каждая из строк ci принадлежит множеству строк {a1, a2, ... am}.

Все строки во входных данных непусты, каждая из них состоит из не более чем 10 маленьких латинских букв.

Выходные данные

Выведите ровно n строк — описание того, как вы запишите лекцию в свою тетрадь. Слова лекции требуется выводить в том же порядке, что и во входных данных.

A. Исходящий трафик чата

реализация *1000

Последнее время Поликарп много трудится над новым проектом "Поличат". Следуя современным тенденциям IT индустрии, Поликарп решил, что в этом проекте непременно должен быть чат. Проведя пару часов за компьютером, Поликарп написал чат-сервер, который может выполнять три типа команд:

  • Добавить человека в чат (команда 'Добавить').
  • Удалить человека из чата (команда 'Удалить').
  • Отправить сообщение от кого-либо всем участникам чата, включая отправителя сообщения (команда 'Отправить').

Сейчас Поликарп хочет узнать, какое количество исходящего трафика пошлет его сервер при обработке набора команд.

Поликарп выяснил, что при обработке команды 'Добавить' или 'Удалить' сервер не посылает трафика вовсе, а при обработке команды 'Отправить' каждому из участников чата посылается l байт, где l — длина рассылаемого сообщения.

Так как у Поликарпа совсем нет свободного времени, он просит вас помочь с решением этой задачи.

Входные данные

Входной файл будет содержать не более 100 команд. Каждая команда будет располагаться на своей строке и иметь длину не более 100 символов. Форматы команд будут следующими:

  • +<имя> для команды 'Добавить'.
  • -<имя> для команды 'Удалить'.
  • <имя_отправителя>:<текст_сообщения> для команды 'Отправить'.

<имя> и <имя_отправителя> — непустая последовательность латинских букв или цифр. <текст_сообщения> может содержать латинские буквы, цифры и пробелы, но не может начинаться или оканчиваться пробелом. <текст_сообщения> может быть пустой строкой.

Гарантируется, что входные данные корректны, то есть человек не будет добавлен в чат, если он там уже присутствует, не будет команды 'Удалить', если человека с таким именем нет в чате и тому подобное.

Имена, различающиеся исключительно регистром букв следует считать различными.

Выходные данные

Выведите единственное число — ответ на задачу.

B. Выравнивание по центру

реализация Строки *1200

Почти каждый текстовый редактор имеет встроенную функцию выравнивание по центру заданного текста. К выпуску четвертого релиза популярного в Берляндии редактора «Textpad» разработчики решили включить данную функциональность и в этот продукт.

Вам положено в кратчайший срок реализовать выравнивание. Удачи!

Входные данные

Входной файл состоит из одной или более строк, каждая из которых содержит буквы латинского алфавита, цифры и/или пробелы. Строки не могут начинаться или заканчиваться пробелами. Гарантируется, что хотя бы одна из заданных строк имеет положительную длину. Длина каждой строки и их количество не превосходит 1000.

Выходные данные

Отформатируйте заданный текст, выравняв его по центру. Окружите весь текст рамкой из символов «*» минимального размера. Если строка не может быть однозначно выравнена (например строка имеет четную длину при нечетной ширине всего блока), то такие строки надо размещать, попеременно округляя позицию к левому и правому краю (начинайте с округления в левую сторону). Внимательно изучите примеры для уточнения правил вывода ответа.

D. Соблюдай правила

математика реализация *2100

Все знают, что столица Берляндии соединена с Беркувером (столицей Олимпиады) прямой дорогой. Для того, чтобы дорога обладала наибольшей пропускной способностью на ней был установлен всего один знак, ограничивающий максимальную скорость. Знаки в Берляндии особенные - они ограничивают скорость движения лишь в той точке, в которой они установлены. Сразу после проезда знака движение разрешено с любой скоростью.

Известно, что автомобиль среднестатистического берляндца разгоняется (или тормозит) с ускорением a км/ч2 и развивает максимальную скорость v км/ч. Дорога имеет длину l км и на расстоянии d км (1 ≤ d < l) от столицы Берляндии расположен знак, ограничивающий максимальную скорость до w км/ч. В начале поездки автомобиль имеет нулевую скорость. Определите минимальное время, за которое среднестатистический берляндец доедет из столицы в Беркувер, если будет двигаться оптимальным образом.

Автомобиль может финишировать в Беркувере с любой скоростью.

Входные данные

В первой строке входного файла содержатся два целых числа a и v (1 ≤ a, v ≤ 10000). Вторая строка содержит три целых числа l, d и w (2 ≤ l ≤ 10000; 1 ≤ d < l; 1 ≤ w ≤ 10000).

Выходные данные

Выведите ответ не менее, чем с пятью знаками после десятичной точки.

A. Транспорт на Новый год

графы поиск в глубину и подобное реализация *1000

Новый год приходит в Линейный мир! В этом мире есть n ячеек, пронумерованных целыми числами от 1 до n, уложенных в виде доски размером 1 × n. В ячейках живут люди. Однако, передвигаться между различными ячейками сложно, ведь выйти из ячейки — дело непростое. В то же время, люди хотят знакомиться с людьми, живущими в других ячейках.

И вот, tncks0121 придумал систему транспорта для передвижения между ячейками, чтобы люди могли отпраздновать Новый год. Сперва он задумал n - 1 положительных целых чисел a1, a2, ..., an - 1. Для каждого целого числа i, где 1 ≤ i ≤ n - 1, выполняется условие 1 ≤ ai ≤ n - i. Затем он создал n - 1 порталов, пронумерованных целыми числами от 1 до n - 1. Из них i-й (1 ≤ i ≤ n - 1) портал соединяет ячейку номер i и ячейку номер (i + ai), т. е. с его помощью можно путешествовать из ячейки i в ячейку (i + ai). К сожалению, портал не работает в обратную сторону, то есть нельзя пройти из ячейки (i + ai) в ячейку i по i-му порталу. Легко заметить, что из-за условия 1 ≤ ai ≤ n - i нельзя покинуть Линейный мир, пользуясь порталами.

Я нахожусь в ячейке 1 и хочу пройти в ячейку t. Однако я не знаю, могу ли я там оказаться. Пожалуйста, определите, могу ли я пройти в ячейку t, пользуясь только построенной системой транспорта.

Входные данные

В первой строке записано два целых числа через пробел, n (3 ≤ n ≤ 3 × 104) и t (2 ≤ t ≤ n) — количество ячеек и номер ячейки, в которую я хочу попасть.

Во второй строке записано n - 1 целых чисел через пробел a1, a2, ..., an - 1 (1 ≤ ai ≤ n - i). Гарантируется, что пользуясь данной транспортной системой, покинуть Линейный мир нельзя.

Выходные данные

Если я могу дойти до ячейки t по данной транспортной системе, выведите "YES". В противном случае, выведите "NO".

Примечание

В первом примере можно дойти до t, посетив следующие ячейки: 1, 2, 4.

Во втором примере можно посетить лишь ячейки 1, 2, 4, 6, 7, 8; значит, мы не можем попасть в требуемую ячейку 5.

C. В Новый год — с книгой!

жадные алгоритмы Конструктив математика реализация *1600

Наступает Новый год и Jaehyun решил прочитать в наступающем 2015 году множество книг (в отличие от этого года, в котором он не преуспел). У него есть n книг, пронумерованных целыми числами от 1 до n. Вес i-й (1 ≤ i ≤ n) книги равняется wi.

Дом Jaehyun'а слишком маленький для книжного шкафа, поэтому он хранит свои n книг в вертикальной стопке. Когда он хочет прочитать некоторую книгу x, он выполняет следующие шаги:

  1. он поднимает все книги над книгой x;
  2. он вынимает книгу x из стопки;
  3. он опускает поднятые книги, не меняя их порядка;
  4. прочитав книгу x, он кладет её на вершину стопки.

Он решил читать книги на протяжении m дней. На j-й (1 ≤ j ≤ m) день он прочитает книгу, которой присвоен номер bj (1 ≤ bj ≤ n). Чтобы прочитать книгу, он использует последовательность действий, описанную выше. Возможно, что он несколько раз будет читать одну и ту же книгу.

Составив такой план, юноша понял, что суммарный вес книг, которые ему надо поднять за m дней, может быть слишком велик. Поэтому он решил поменять порядок книг в стопке до Нового года и минимизировать суммарный вес. Книги можно уложить в стопку в любом возможном порядке. Обратите внимание, что вес книги, которую он хочет почитать на очередном шаге, не учитывается среди поднятых на этом шаге. Можете ли вы помочь ему достичь желаемого?

Входные данные

В первой строке записано два целых числа через пробел, n (2 ≤ n ≤ 500) и m (1 ≤ m ≤ 1000) — количество книг и количество дней, в которые Jaehyun почитал бы книги.

Во второй строке записано n целых чисел через пробел w1, w2, ..., wn (1 ≤ wi ≤ 100) — вес каждой книги.

В третьей строке записано m целых чисел через пробел b1, b2, ..., bm (1 ≤ bj ≤ n) — порядок книг, которые парень хотел бы прочитать. Обратите внимание, что он может читать одну и ту же книгу более одного раза.

Выходные данные

Выведите минимальный суммарный вес книг, которые надо поднять парню, достижимый перестановкой уложенных книг.

Примечание

Приведем картинку, описывающую пример. Каждая вертикальная колонка обозначает уложенные книги.

A. Контест

реализация *900

Миша и Вася участвовали в контесте на Codeforces. К сожалению, каждый из них решил всего по одной задаче, но зато сдал её с первой попытки. Миша решил задачу, которая стоит a баллов, а Вася — b баллов. Притом Миша сдал задачу через c минут после начала контеста, а Вася — через d. Как вы знаете, на Codeforces стоимость задачи уменьшается по ходу раунда. А именно, сдав через t минут после начала задачу, стоимость которой равняется p баллам, участник получает баллов.

Миша и Вася спорят, пытаясь определить, кто из них набрал больше баллов. Помогите рассудить ребят.

Входные данные

В первой строке находятся четыре целых числа a, b, c, d (250 ≤ a, b ≤ 3500, 0 ≤ c, d ≤ 180).

Гарантируется, что числа a и b делятся на 250 без остатка (как и на любом настоящем раунде Codeforces).

Выходные данные

Выведите единственной строкой:

«Misha» без кавычек, если Миша набрал больше баллов, чем Вася.

«Vasya» без кавычек, если Вася набрал больше баллов, чем Миша.

«Tie» без кавычек, если ребята набрали одинаковое число баллов.

Примечание

В первом тестовом примере Миша набрал 460 баллов, а Вася — 880.

Во втором тестовом примере Миша набрал 996 баллов, а Вася — 996.

В третьем тестовом примере Миша набрал 450 баллов, а Вася — 300.

E. Миша и палиндромность

Бинарный поиск Комбинаторика реализация *2500

У Миши есть массив из n целых чисел, проиндексированный целыми числами от 1 до n. Назовем палиндромностью массива a количество таких пар индексов (l, r)(1 ≤ l ≤ r ≤ n), что элементы с l-го по r-й включительно можно переставить так, что весь массив окажется палиндромом. Иными словами, для пары (l, r) должно выполняться, что после некоторой перестановки чисел на позициях от l до r включительно (разрешается не переставлять числа вовсе) для любого 1 ≤ i ≤ n будет выполняться что a[i] = a[n - i + 1].

Ваша задача — найти палиндромность Мишиного массива.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 105).

Во второй строке находятся n положительных целых чисел a[i] (1 ≤ a[i] ≤ n), разделённых пробелами — элементы Мишиного массива.

Выходные данные

В единственной строке выведите ответ на задачу.

Примечание

В первом примере подходит любая пара возможная пара (l, r).

В третьем примере подходят пары (1, 3), (1, 4), (1, 5), (2, 5).

A. Подарок мистера Китаюта

Перебор реализация Строки *1100

Мистер Китаюта любезно предоставил Вам строку s из строчных букв латинского алфавита. Он просит вас вставить ровно одну строчную букву латинского алфавита в s так, чтобы получился палиндром. Палиндром — это строка, которая читается одинаково в обоих направлениях. Например, «noon», «testset» и «a» — палиндромы, а «test» и «kitayuta» — нет.

Вы можете выбрать любую строчную букву латинского алфавита и вставить её в любую позицию s, в частности, можно вставить в начало или в конец s. Букву надо вставить, даже если данная строка уже является палиндромом.

Если возможно вставить одну строчную букву латинского алфввита в s так, чтобы получившаяся строка была палиндромом, выведите состояние строки после вставки. В противном случае выведите «NA». Если возможно получить более одного палиндрома, можно вывести любой из них.

Входные данные

Ввод состоит из строки s (1 ≤ |s| ≤ 10). Каждый символ s — строчная буква латинского алфавита.

Выходные данные

Если можно превратить строку s в палиндром, вставив одну строчную букву латинского алфавита, выведите итоговую строку в единственной строке. В противном случае выведите «NA» (без кавычек, регистр имеет значение). Если существует более одного решения, будет засчитано любое.

Примечание

В первом можно добавить «r> к концу строки «revive», чтобы получить палиндром «reviver».

Во втором примере решений несколько. Например, «eve» также будет засчитан.

В третьем примере невозможно превратить «kitayuta» в палиндром путем прибавления одной буквы.

A. Amr и музыка

жадные алгоритмы реализация сортировки *1000

Amr — молодой программист и большой меломан. Он всегда хотел научиться исполнять музыку, но программирование отнимает слишком много его времени. И вот, у юноши созрел план.

У Amr есть n инструментов, чтобы научиться играть на i-м инструменте, надо потратить на обучение не менее ai дней. Так как Amr занятой человек, он решил посвятить k дней тому, чтобы научиться игре на как можно большем количестве инструментов.

Amr попросил вас помочь ему распределить свои незанятые дни по инструментам, так, чтобы он научился играть на как можно большем количестве инструментов.

Входные данные

В первой строке записано два числа n, k (1 ≤ n ≤ 100, 0 ≤ k ≤ 10 000), количество инструментов и количество дней, соответственно.

Во второй строке записано n целых чисел ai (1 ≤ ai ≤ 100) — количество дней, необходимых для изучения i-го инструмента.

Выходные данные

В первой строке выведите единственное целое число m, обозначающее наибольшее количество инструментов, игре на которых Amr сможет научиться.

Во второй строке выведите m целых чисел через пробел: индексы инструментов, на которых юноше следует учиться играть. Индексы можно выводить в любом порядке.

Если существует несколько оптимальных решений, выведите любое из них. Использовать все дни на учебу необязательно.

Примечание

В первом тесте Amr может научиться играть на всех 4 инструментах.

Во втором тесте другие возможные варианты: {2, 3, 5} или {3, 4, 5}.

В третьем тесте у Amr недостаточно времени для того, чтобы научиться играть на единственном данном инструменте.

C. Угадай, где выход!

Деревья математика реализация *1700

Amr купил новую компьютерную игру "Угадай, где выход!". Цель игры— найти выход из лабиринта, похожего на полное двоичное дерево высоты h. Изначально игрок стоит в корне дерева, выход из дерева расположен в некотором листе дерева.

Пронумеруем все листы слева направо числами от 1 до 2h. Выход расположен в некоторой вершине n, где 1 ≤ n ≤ 2h.

Amr пользуется следующим простым алгоритмом выбора пути. Рассмотрим бесконечную строку "LRLRLRLRL..." (состоящую из чередующихся символов 'L' и 'R'). Amr последовательно выполняет символы строки по следующим правилам:

  • Символ 'L' означает "перейти к левому сыну текущей вершины";
  • Символ 'R' означает "перейти к правому сыну текущей вершины";
  • Если вершину, в которую ведёт текущая команда, Amr уже это этого посещал, то он пропускает текущую команду, в противном случае он переходит в эту вершину;
  • Если Amr пропустил две последовательные команды, то он возвращается к предку текущей вершины перед тем, как выполнять следующую команду;
  • Если он оказался в листе, который не является выходом, он сразу возвращается к предку текущей вершины;
  • Если он достиг выхода, игра заканчивается.

Теперь Amr интересно: если он будет следовать этому алгоритму, сколько вершин он посетит до того, как достичь выхода?

Входные данные

Ввод состоит из двух целых чисел, h, n (1 ≤ h ≤ 50, 1 ≤ n ≤ 2h).

Выходные данные

Выведите единственное целое число, обозначающее количество вершин (не включая лист, в котором расположен выход), которые Amr посетит перед тем, как добраться до выхода, следуя этому алгоритму.

Примечание

Полное двоичное дерево высоты h— это двоичное дерево, состоящее из h + 1 уровня. Уровень 0 состоит из единственной вершины, которая называется корень, уровень h состоит из 2h вершин, которые называются листьями. Каждая вершина, не являющаяся листом, имеет ровно двух потомков, левого и правого.

Следующая картина иллюстрирует третий тест из условия. Вершины помечены в порядке их посещения.

D. Пара по математике

дп реализация *2200

Amr не любит математику, так как она кажется ему очень скучной, так что он обычно дремлет на парах по математике. Однажды преподаватель заподозрил: а не спит ли Amr? — и задал юноше вопрос, чтобы проверить это.

Сперва он дал Amr два положительных числа, n и k. Затем он спросил Amr, сколько существует таких целых чисел x > 0, что:

  • Десятичная запись x (без ведущих нулей) состоит ровно из n цифр;
  • Существует некоторое целое число y > 0, такое, что:
    • ;
    • десятичная запись y является суффиксом десятичной записи x.

Так как ответ на этот вопрос может быть большим, преподаватель попросил Amr вычислить лишь остаток после деления результата на номер m.

Сможете помочь Amr достойно выйти из щекотливого положения?

Входные данные

Ввод состоит из трех целых чисел n, k, m (1 ≤ n ≤ 1000, 1 ≤ k ≤ 100, 1 ≤ m ≤ 109).

Выходные данные

Выведите необходимое число по модулю m.

Примечание

Суффикс строки S — это непустая строка, которую можно получить путем удаления некоторого количества (возможно, нулевого) первых символов строки S.

A. Максимум в таблице

Перебор реализация *800

Таблица a размера n × n задаётся следующим образом:

  • В первой строке и в первом столбце таблицы стоят единицы, то есть ai, 1 = a1, i = 1 для всех i = 1, 2, ..., n.
  • Каждое из оставшихся чисел в таблице определяется как сумма числа над ним и числа слева от него. Иными словами, остальные элементы таблицы задаются формулой ai, j = ai - 1, j + ai, j - 1.

Эти условия однозначно задают все элементы таблицы.

Вам даётся число n. Требуется определить значение максимального числа в таблице n × n, построенной по вышеприведенным правилам.

Входные данные

В единственной строке входных данных задано натуральное число n (1 ≤ n ≤ 10) — количество строк и столбцов таблицы.

Выходные данные

В единственной строке выведите натуральное число m — максимальное число построенной таблицы.

Примечание

Во втором тесте строки таблицы выглядят так:

{1, 1, 1, 1, 1}, 
{1, 2, 3, 4, 5}, 
{1, 3, 6, 10, 15}, 
{1, 4, 10, 20, 35}, 
{1, 5, 15, 35, 70}.

B. Раскраска шаров

жадные алгоритмы Конструктив реализация *1300

На столе лежит n кучек камней, в i-й кучке находится ai камней. Требуется раскрасить каждый камень в один из k цветов так, чтобы для каждого цвета c и для любых двух кучек i и j количества камней цвета c в кучках i и j отличались не более чем на один.

Иными словами, пусть bi, c — количество камней в i-й кучке, покрашенных в цвет c. Тогда для любых 1 ≤ c ≤ k, 1 ≤ i, j ≤ n должно выполняться |bi, c - bj, c| ≤ 1. Необязательно использовать все k цветов: если цвет c не встречается в кучке i, то bi, c полагается равным нулю.

Входные данные

В первой строке входных данных заданы натуральные числа n и k (1 ≤ n, k ≤ 100), разделенные пробелом — количество кучек и количество цветов соответственно.

Во второй строке заданы n натуральных чисел a1, a2, ..., an (1 ≤ ai ≤ 100), задающие количества камней в кучках.

Выходные данные

Если раскраски камней, удовлетворяющей условию задачи, не существует, в единственной строке выведите «NO» (без кавычек).

Иначе в первой строке «YES» (без кавыечек). Далее должны следовать n строк, в i-й из них должны находиться ai чисел, разделенных пробелами. j-е (1 ≤ j ≤ ai) из этих чисел должно равняться цвету j-го камня в i-й кучке. Если возможных ответов несколько, разрешается вывести любой.

C. Суммы цифр

дп жадные алгоритмы реализация *2000

У Васи была строго возрастащая последовательность целых положительных чисел a1, ..., an. Вася построил по ней новую последовательность b1, ..., bn, где bi — сумма цифр ai в десятичной записи. После этого последовательность ai потерялась, осталась только последовательность bi.

Васе интересно, какими могли быть числа ai. Из всех вариантов последовательности a ему интересен такой, в котором последнее число an является минимально возможным. Помогите Васе восстановить исходную последовательность.

Гарантируется, что подобная последовательность всегда существует.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 300).

В следующих n строках записаны числа b1, ..., bn  — требуемые суммы цифр. Все bi удовлетворяют ограничениям 1 ≤ bi ≤ 300.

Выходные данные

Выведите n чисел по одному на строке — корректный вариант для чисел ai, в порядке возрастания индексов. Последовательность должна быть строго возрастающей. Сумма цифр i-го числа должна быть равна bi. Если вариантов с минимальным значением последнего числа несколько, выведите любой. Числа следует выводить без ведущих нулей.

A. Задача Читериуса

реализация *1300

Читериус — знаменитый на всю Берляндию астролог, маг, волшебник, а также обманщик и пройдоха. Одно из последних его изобретений — амулеты Читериуса! Они приносят удачу и здоровье, однако стоят немалых денег. Читериус изготавливает их сам. Секрет изготовления храниться в глубокой тайне. Но мы то знаем, что долгими ночами Читериус склеивает супер-клеем доминошки по две, чтобы получать квадратики 2 × 2 — волшебные амулеты Читериуса!

Так выглядит один из амулетов Читериуса

После тяжелой трудовой ночи Читериус изготовил n амулетов. Каждый из них представляет собой квадрат 2 × 2, каждая четвертинка содержит от 1 до 6 точек. Теперь он хочет разложить их в стопки, каждая стопка должна содержать одинаковые амулеты. Два амулета называются одинаковыми, если их можно повернуть так, что после наложения их друг на друга количества точек в соответствующих четвертинках окажется равным. Переворачивать амулеты нельзя.

Напишите программу, которая по заданным амулетам найдет количество стопок на столе Читериуса.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000), n — количество амулетов. Далее содержатся описания амулетов. Каждое описание занимает две строки и содержит по две цифры (от 1 до 6) в каждой из строк. Между каждой парой амулетов находится строка «**».

Выходные данные

Выведите искомое количество стопок.

D. Геометрическая задача

реализация *2200

Поликарп очень любит геометрические прогрессии — он их коллекционер. Но так как такие прогрессии попадаются крайне редко, то ему очень нравятся и такие последовательности чисел, в которых можно удалить один элемент, что в результате получается геометрическая прогрессия.

В этой задаче геометрическими прогрессиями будем называть такие конечные последовательности чисел a1, a2, ..., ak, что ai = c·bi - 1 для некоторых вещественных чисел c и b. Например, последовательности [2, -4, 8], [0, 0, 0, 0], [199] — геометрические прогрессии, а [0, 1, 2, 3] — нет.

Недавно Поликарпу попалась последовательность и он никак не может ее классифицировать. Помогите ему в этом. Определите, является ли она геометрической прогрессией. Если нет, то проверьте, можно ли удалить из нее один элемент так, чтобы в результате она стала геометрической прогрессией.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество чисел в заданной последовательности. Вторая строка содержит заданную последовательность. Числа разделяются пробелами. Все элементы заданной последовательности — целые, не превосходящие по абсолютной величине 104.

Выходные данные

Выведите 0, если заданная последовательность является геометрической прогрессией. В противном случае проверьте, верно ли, что можно удалить один элемент так, чтобы она стала геометрической прогрессией. Если это так, то выведите 1. В случае, если это сделать невозможно, выведите 2.

A. Лиса и змейка

реализация *800

Лиса Ciel учится программировать. Одним из её первых заданий было нарисовать лису! Однако для неё это показалось слишком сложным, так что вместо лисы она решила нарисовать змейку.

Змейка — это узор в прямоугольной таблице из n строк по m столбцов. Обозначим c-ю ячейку r-й строки как (r, c). Хвост змеи располагается в ячейке (1, 1), а её туловище простирается до (1, m), затем спускается на 2 ряда вниз до (3, m), затем простирается влево до (3, 1), и так далее. Таким образом, голова змеи расположена в одном из углов n-й строки.

Ваша задача — изобразить такую змею для лисы Ciel: пустые ячейки должны быть обозначены точками ('.'), а ячейки, накрытые телом змеи, должны быть заполнены решетками ('#').

Для полного понимания требуемого узора обратите внимание на примеры выходных данных.

Входные данные

В единственной строке записано два целых числа: n и m (3 ≤ n, m ≤ 50).

nнечетное число.

Выходные данные

Выведите n строк. В каждой строке должна быть записана последовательность из m символов. Не выводите пробелы.

A. Чубакка и число

жадные алгоритмы реализация *1200

Люк Скайуокер дал Чубакке целое число x. Чубакка не особо разбирается в числах, но обожает инвертировать в них цифры. Инвертировать цифру t — значит заменить её на цифру 9 - t.

Помогите Чубакке из исходного положительного числа x получить минимальное положительное число, инвертировав некоторое (возможно, нулевое) количество цифр. Запись итогового числа не должна начинаться с нуля.

Входные данные

В первой строке содержится единственное целое число x (1 ≤ x ≤ 1018) — число, которое Люк Скайуокер дал Чубакке.

Выходные данные

Выведите ответ на задачу — минимально возможное положительное число, которое может получить Чубакка после инвертирования некоторых цифр. Число не должно содержать ведущих нулей.

B. Хан Соло и лазерная пушка

геометрия математика Перебор реализация Структуры данных *1400

На поле боя размещены n имперских штурмовиков. Поле боя представляет собой плоскость с прямоугольной системой координат. Каждый штурмовик задан своими координатами (x, y) на этой плоскости.

У Хана Соло есть новейшая двусторонняя лазерная пушка для сражения с этими штурмовиками. Она расположена в точке с координатами (x0, y0). За один выстрел она способна поразить всех штурмовиков, находящихся на некоторой прямой, проходящей через точку (x0, y0).

Требуется определить, за какое минимальное количество выстрелов Хан Соло сможет уничтожить всех штрумовиков.

Так как пушка — новейшее изобретение, она стреляет очень быстро и штурмовики даже после очень большого количества выстрелов не успевают понять, что происходит, и сменить свое местоположение.

Входные данные

В первой строке записано три целых числа n, x0 и y0 (1 ≤ n ≤ 1000,  - 104 ≤ x0, y0 ≤ 104) — количество штурмовиков на поле боя и координаты вашей пушки.

В следующих n строках записано по два целых числа xi, yi ( - 104 ≤ xi, yi ≤ 104) — координаты штурмовиков на поле боя. Известно, что ни один из штурмовик не стоит в той же точке, где находится пушка. Несколько штурмовиков могут находится в одной и той же точке.

Выходные данные

Выведите одно целое число — минимальное количество выстрелов, за которое Хан Соло сможет уничтожить всех штурмовиков.

Примечание

Пояснения к первому и второму тесту из условия соответственно:

B. Таня и поздравление

жадные алгоритмы реализация Строки *1400

Маленькая Таня решила поздравить папу с Днем рождения и подарить ему открытку. Она уже составила текст для поздравления — строку s длины n, состоящую из прописных и строчных букв латинского алфавита. Таня пока не умеет писать, поэтому она нашла газету и решила вырезать оттуда буквы и наклеить их в открытку, чтобы получилась строка s. В газете записана строка t, состоящая из прописных и строчных букв латинского алфавита. Известно, что длина строки t не меньше длины строки s.

Возможно, что в газете не хватает каких-то букв для составления поздравления, а какие-то буквы могут оказаться лишними. Поэтому Таня хочет вырезать из газеты некоторые n букв и составить из них поздравление длины ровно n, чтобы оно было максимально похоже на s. Если буква в заданной позиции совпадает и по значению, и по регистру (в строке s и в той строке, что наклеит Таня), то она радостно кричит «УРА!», а если буква в заданной позиции совпадает только по значению, но не по регистру, то она произносит «ОПА».

Таня хочет наклеить такую надпись, чтобы максимальное количество раз прокричать «УРА!», а если это можно сделать несколькими способами, то во вторую очередь она хочет максимизировать количество раз, которое она скажет «ОПА». Вам предстоит помочь Тане в составлении поздравления.

Входные данные

В первой строке задана строка s (1 ≤ |s| ≤ 2·105), состоящая из прописных и строчных букв латинского алфавита — текст для поздравления, который составила Таня.

Во второй строке задана строка t (|s| ≤ |t| ≤ 2·105), состоящая из прописных и строчных букв латинского алфавита — текст, записанный в газете.

Запись |a| обозначает длину строки a.

Выходные данные

Выведите два целых числа, разделенных пробелом, где:

  • первое число — сколько раз Таня прокричит «УРА!» при составлении поздравления,
  • второе число — сколько раз Таня произнесет «ОПА» при составлении поздравления.

C. Аня и смартфон

Конструктив реализация Структуры данных *1600

Аня купила новый смартфон с операционной системой Berdroid. В меню смартфона ровно n приложений, у каждого своя иконка. Иконки расположены на различных экранах, на одном экране помещается k иконок. Иконки с первой по k-ю расположены на первом экране, с (k + 1)-й по 2k-ю на втором и так далее (последний экран может быть заполнен не полностью).

Изначально меню смартфона установлено на экран номер 1. Чтобы запустить приложение, чья иконка расположена на экране t, Ане надо сделать следующие движения пальцем: сначала домотать до нужного экрана номер t, сделав t - 1 движение (если иконка на экране t), а затем сделать еще одно движение — нажать ровно 1 раз на иконку нужного приложения для его запуска.

После запуска приложения меню откатывается на первый экран, то есть, чтобы запустить следующее приложение необходимо вновь листать меню с экрана номер 1.

Все приложения пронумерованы от 1 до n. Известен исходный порядок, в котором иконки приложений расположены в меню, но он изменяется по ходу использования операционной системы. Berdroid интеллектуально меняет порядок иконок, передвигая более часто используемые ближе к началу. Формально, сразу после запуска приложения его иконка меняется местами с впереди стоящей (т. е. имеющей на единицу меньший номер в порядке следования иконок), причем впереди стоящая иконка приложения может быть и на соседнем экране. Единственное исключение — если иконка запускаемого приложения уже стоит на первом месте, в этом случае расположение иконок не меняется.

Аня запланировала в каком порядке она будет запускать приложения. Сколько движений пальцем надо произвести Ане, чтобы запустить приложения в запланированном порядке?

Обратите внимание, что одно приложение может быть запущено многократно.

Входные данные

В первой строке входных данных следуют три целых числа n, m, k (1 ≤ n, m, k ≤ 105) — количество приложений, имеющихся на смартфоне Ани, количество приложений, которые будут запущены, и количество иконок, которые помещаются на одном экране соответственно.

Следующая строка содержит n целых чисел, перестановку a1, a2, ..., an — изначальный порядок иконок слева направо в меню (от первой до последней), ai — это номер приложения, иконка которого i-я в меню. Каждое целое число от 1 до n встречается ровно один раз среди ai.

Третья строка содержит m целых чисел b1, b2, ..., bm(1 ≤ bi ≤ n) — номера запускаемых приложений в запланированном порядке. Одно приложение может быть запущено несколько раз.

Выходные данные

Выведите одно целое число — сколько движений пальцем надо сделать Ане, чтобы запустить приложения в запланированном ею порядке.

Примечание

В первом тесте исходная конфигурация выглядит как (123)(456)(78), то есть на первом экране расположены иконки приложений 1, 2, 3, на втором экране — 4, 5, 6, а на третьем экране — 7, 8.

После запуска приложения номер 7 получим новое расположение иконок — (123)(457)(68). При этом для его запуска необходимо сделать 3 движения пальцем.

После запуска приложения номер 8 получим конфигурацию — (123)(457)(86). При этом для его запуска необходимо сделать 3 движения пальцем.

После запуска приложения номер 1 расположение иконок на экранах не меняется. При этом для его запуска необходимо сделать 1 движение пальцем.

Итого, Аня сделает 7 движений пальцем.

E. Артур и вопросы

жадные алгоритмы математика реализация Тернарный поиск *2200

После скобочных последовательностей Артур увлекся теорией чисел. И у него появилась новая любимая последовательность длины n (a1, a2, ..., an), состоящая из целых чисел, и целое число k, не превышающее n.

Эта последовательность обладала следующим свойством. Если выписать суммы всех ее подотрезков, состоящих из k подряд идущих элементов (a1  +  a2 ...  +  ak,  a2  +  a3  +  ...  +  ak + 1,  ...,  an - k + 1  +  an - k + 2  +  ...  +  an), то элементы выписанной последовательности будут строго возрастать.

Например, для следующего примера: n = 5,  k = 3,  a = (1,  2,  4,  5,  6) последовательность сумм будет иметь вид: (1  +  2  +  4,  2  +  4  +  5,  4  +  5  +  6) = (7,  11,  15), а значит последовательность a удовлетворяет описанному свойству.

Очевидно, в последовательности сумм будет n - k + 1 элемент.

Кто-то (не будем говорить кто) заменил в последовательности Артура некоторые числа на знаки вопроса (если число заменяется, то ровно на один знак вопроса). Нужно восстановить последовательность, чтобы она удовлетворяла нужному свойству, и при этом минимизировать сумму |ai|, где |ai| — абсолютная величина ai.

Входные данные

В первой строке следуют два целых числа n и k (1 ≤ k ≤ n ≤ 105), обозначающих соответственно количество чисел в последовательности Артура и длины подотрезков.

В следующей строке следуют через пробел n элементов ai (1 ≤ i ≤ n).

Если ai  =  ?, значит i-й элемент последовательности Артура был заменен на знак вопроса.

В противном случае, ai ( - 109 ≤ ai ≤ 109) — i-й элемент последовательности Артура.

Выходные данные

Если Артур что-то напутал, и последовательности, соответствующей данной информации нет, выведите единственную строку «Incorrect sequence» (без кавычек).

В противном случае, выведите в первую строку выходных данных n целых чисел — любимую последовательность Артура. Если таких последовательностей несколько, выведите последовательность с минимальной суммой |ai|, где |ai| — абсолютная величина ai. Если и таких последовательностей несколько, разрешается вывести любую из них. Элементы последовательности следует выводить без лидирующих нулей.

F. Паша и труба

Бинарный поиск дп Комбинаторика Перебор реализация *2300

На очередном заседании правящей партии «A» министр Павел предложил усовершенствовать систему водопровода и проложить в городе новую трубу.

Город на карте представляет собой прямоугольное клетчатое поле размера n × m. Каждая клетка поля либо свободна (тогда труба может проходить по ней), либо занята (по такой клетке труба проходить не может). На карте свободные клетки обозначены символом '.', а занятые — '#'.

Труба должна удовлетворят следующим свойствам:

  • труба имеет вид ломанной ширины 1,
  • труба проходит по свободным клеткам,
  • труба начинается с края поля, но не с угловой клетки,
  • труба заканчивается на краю поля, но не в угловой клетке,
  • труба имеет не более 2-х поворотов (на 90 градусов),
  • на краях поля должно существовать ровно две клетки, по которым проходит труба,
  • если труба представляет собой один отрезок, то концевые точки трубы должны лежать на разных краях поля,
  • для каждой неконцевой клетки трубы существует ровно две соседние по стороне клетки, которые тоже принадлежат трубе,
  • для каждой из концевых клеток трубы существует ровно одна соседняя по стороне клетка, которая тоже принадлежит трубе.

Примеры разрешенных маршрутов для прокладывания труб:


....# ....# .*..#
***** ****. .***.
..#.. ..#*. ..#*.
#...# #..*# #..*#
..... ...*. ...*.

Примеры запрещенных маршрутов для прокладывания труб:


.**.# *...# .*.*#
..... ****. .*.*.
..#.. ..#*. .*#*.
#...# #..*# #*.*#
..... ...*. .***.

В примерах трубы обозначены символами ' * '.

Вам поручили написать программу, которая вычисляет количество различных способов проложить ровно одну трубу на территории города.

Два способа прокладывания труб считаются различными, если они отличаются хотя бы в одной клетке.

Входные данные

В первой строке входных данных следуют два целых числа n, m (2 ≤ n, m ≤ 2000) — размеры карты Берляндии.

В следующих n строках задано по m символов — карта города.

Если клетка карты обозначена символом '.', значит она свободна, и по ней может проходить труба.

Если клетка карты обозначена символом '#', значит она занята, и труба по ней проходить не может.

Выходные данные

Выведите в первую строку выходных данных одно целое число — количество различных способов проложить ровно одну трубу.

Примечание

В первом примере существует 3 способа проложить трубу (клетки трубы обозначены символами ' * '):


.*. .*. ...
.*# **# **#
.*. ... .*.

A. A и B и шахматы

реализация *900

A и B готовятся к олимпиадам про программированию.

Чтобы развить свое логическое мышление и лучше решать задачи, A и B решили сыграть в шахматы. Во время игры A задумался, чья же позиция в данный момент сильнее.

Для каждой шахматной фигуры известен ее вес:

  • вес ферзя равен 9,
  • вес ладьи равен 5,
  • вес слона равен 3,
  • вес коня равен 3,
  • вес пешки равен 1,
  • вес короля не учитывается при оценке позиции.

Вес позиции игрока равен сумме весов всех его фигур на доске.

Так как A не любит считать, он попросил вас помочь определить, вес позиции какого из двух игроков больше.

Входные данные

На вход подаются восемь строк, по восемь символов каждая — описание доски.

На доске белые фигуры обозначаются заглавными буквами, черные фигуры — строчными.

Белые фигуры обозначаются следующим образом: ферзь обозначается символом 'Q', ладья — 'R', слон — 'B', конь — 'N', пешка — 'P', король — 'K'.

Черные фигуры обозначаются, соответственно, 'q', 'r', 'b', 'n', 'p', 'k'.

Пустая клетка доски обозначается символом '.' (точка).

Не гарантируется, что заданная шахматная позиция достижима во время реальной игры. В частности, каждой фигуры может быть произвольное (в том числе нулевое) количество, король может находиться под боем, и так далее.

Выходные данные

Выведите "White" (без кавычек), если вес позиции белых больше веса позиции черных, "Black" если вес позиции черных больше веса позиции белых, и "Draw" если веса позиций белых и черных равны.

Примечание

В первом тестовом примере вес позиции белых равен 9, вес позиции черных равен 5.

Во втором тестовом примере веса позиций черных и белых равны 39.

В третьем тестовом примере вес позиции белых равен 9, вес позиции черных равен 16.

B. A и B и ошибки компиляции

реализация сортировки Структуры данных *1100

A и B готовятся к олимпиадам про программированию.

B очень любит отлаживать свой код. Но перед тем, как запустить решение и начать отладку, код нужно сначала скомпилировать.

Изначально компилятор выдавал n ошибок компиляции, каждая из которых обозначается положительным целым числом. После некоторых усилий, B удалось исправить сначала одну, а потом еще одну ошибку.

Однако, несмотря на то, что B уверен, что исправил две ошибки, он не может понять, какие именно ошибки компиляции исчезли — компилятор языка, на котором пишет B, каждый раз выдает ошибки в новом порядке! B уверен, что в отличие от многих других языков программирования, ошибки компиляции для его языка программирования не зависят друг от друга, т. е. от исправления одной ошибки, множество остальных ошибок не изменяется.

А вы можете помочь B узнать, какие именно две ошибки он исправил?

Входные данные

Первая строка входных данных содержит целое число n (3 ≤ n ≤ 105) — изначальное количество ошибок компиляции.

Вторая строка содержит n целых чисел через пробел a1, a2, ..., an (1 ≤ ai ≤ 109) — номера ошибок, выданных компилятором в первый раз.

Третья строка содержит n - 1 целых чисел через пробел b1, b2, ..., bn - 1 — номера ошибок, выданных при второй компиляции. Гарантируется, что последовательность в третьей строке содержит все числа второй строки, за исключением ровно одного.

Четвертая строка содержит n - 2 целых чисел через пробел с1, с2, ..., сn - 2 — номера ошибок, выданных при третьей компиляции. Гарантируется, что последовательность в четвертой строке содержит все числа третьей строки, за исключением ровно одного.

Выходные данные

Выведите два числа на отдельной строке: номера ошибок компиляции, исчезнувших после того как B внёс первое и второе исправление соответственно.

Примечание

В первом тестовом примере в первый раз B исправляет ошибку с номером 8, во второй — с номером 123.

Во втором тестовом примере в первый раз B исправляет ошибку с номером 1, во второй — с номером 3. Обратите внимание, что если имеются несколько ошибок с одинаковым номером, за один раз B может исправить только одну из них.

C. A и B и командная тренировка

жадные алгоритмы математика реализация теория чисел *1300

A и B готовятся к олимпиадам про программированию.

Важная часть подготовки к соревнованиям по программированию — передача знаний опытных участников тем, кто только начинает заниматься олимпиадами. Поэтому на очередной командной тренировке A решил составить команды так, чтобы новички решали задачи вместе с опытными участниками.

A считает, что оптимальный состав команды из трех человек должен состоять из одного опытного участника и двух новичков. Таким образом, каждый опытный участник сможет поделиться опытом с большим количеством людей.

Однако, B считает, что оптимальным будет состав из двух опытных участников и одного новичка. Таким образом, каждый новичок сможет получить больше знаний и опыта.

В результате, A и B решили, что все команды на тренировке должны быть одного из двух вышеописанных типов. Кроме того, они оба считают, что общее количество команд должно быть как можно больше.

На тренировке присутствуют n опытных участников и m новичков. Сможете ли вы посчитать, какое максимальное количество команд может быть сформировано?

Входные данные

Первая строка содержит два целых числа n и m (0 ≤ n, m ≤ 5 * 105) — количество опытных участников и новичков, присутствующих на тренировке.

Выходные данные

Выведите максимальное количество команд одного из двух описанных в условии типов, которое может быть сформировано.

Примечание

Обозначим опытных участников как О, новичков как Н.

В первом тестовом примере команды выглядят так: (О, Н, Н), (О, Н, Н).

Во втором тестовом примере команды выглядят так: (О, Н, Н), (О, Н, Н), (О, О, Н).

A. 123-последовательность

реализация *900

Задана последовательность целых чисел a1, a2, ..., an, в которой каждое число от 1 до 3 включительно. Требуется заменить в ней наименьшее количество чисел так, чтобы все числа в последовательности оказались равны между собой.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 106). Вторая строка содержит последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ 3).

Выходные данные

Выведите наименьшее количество изменений, которое надо сделать, чтобы уравнять все числа в последовательности.

Примечание

В примере все числа, равные 1 и 3 надо заменить на 2.

A. Панграмма

реализация Строки *800

Слово или предложение на некотором языке называется панграммой, если в нем встречаются все символы алфавита этого языка хотя бы один раз. Панграммы часто используют в типографии для демонстрации шрифтов или тестирования средств вывода различных устройств.

Вам дана строка, состоящая из маленьких и больших латинских букв. Проверьте, является ли эта строка панграммой. Считается, что строка содержит букву латинского алфавита, если эта буква встречается в верхнем или нижнем регистре.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100) — количество символов в строке.

Во второй строке записана сама строка. Строка содержит исключительно строчные и заглавные латинские буквы.

Выходные данные

Выведите «YES», если строка является панграммой, и «NO» в противном случае.

B. Две кнопки

графы жадные алгоритмы кратчайшие пути математика поиск в глубину и подобное реализация *1400

Вася нашел странное устройство. На передней панели устройства расположен дисплей, отображающий некоторое целое положительное число, а также красная и синяя кнопки. При нажатии на красную кнопку число на дисплее увеличивается в два раза. При нажатии на синюю кнопку число на дисплее уменьшается на единицу. Если в какой-то момент число перестает быть положительным, устройство ломается. Дисплей может отображать сколь угодно большие числа. Изначально на дисплее отображается число n.

Вася хочет получить на дисплее число m. Какое минимальное количество нажатий ему придется совершить?

Входные данные

Первая и единственная строка ввода содержит два различных целых числа n и m, разделенных пробелом (1 ≤ n, m ≤ 104).

Выходные данные

Выведите одно число — минимальное количество нажатий на кнопки, необходимое, чтобы получить число m из числа n.

Примечание

В первом примере нужно один раз нажать на синюю кнопку, и затем раз один раз на красную кнопку.

Во втором примере удваивать число невыгодно, поэтому надо девять раз нажать на синюю кнопку.

D. Кубики

жадные алгоритмы игры реализация *2100

Как-то раз Вася с Петей собрали конструкцию из m кубиков, на каждом из которых написано число от 0 до m - 1 (каждое число встречалось ровно один раз). Введём систему координат так, что осью OX является земля, а ось OY направлена вверх. Каждый кубик задаётся координатами своего нижнего левого угла, при этом эти координаты целые для каждого кубика.

Конструкция получилась устойчивой. Это значит, что для любого кубика, который не стоит на земле, есть хотя бы один кубик под ним, с которым он касается по стороне или по углу. Более формально, это значит, что для кубика с координатами (x, y) либо выполняется y = 0, либо существует кубик, имеющий координаты (x - 1, y - 1), (x, y - 1) или (x + 1, y - 1).

Теперь мальчики хотят разобрать конструкцию и выложить все кубики в ряд. Очередной кубик удаляется из конструкции и кладется в ряд справа от уже положенных кубиков, при этом ребята вынимают кубики таким образом, что конструкция остаётся устойчивой. Чтобы разнообразить процесс, ребята решили поиграть в следующую игру. Ребята вынимают кубики из конструкции по очереди. Легко видеть, что после разбора конструкции цифры, написанные на кубиках, образуют число, записанное в m-ичной системе счисления (возможно, содержащее ведущий нуль). Вася хочет, чтобы полученное в результате число было наибольшим, а Петя, наоборот, старается его сделать как можно меньше. Вася ходит первым.

Ваша задача — определить, какое число получится после разбора конструкции, если ребята будут действовать оптимально. Определите остаток от деления ответа на 109 + 9.

Входные данные

В первой строке дано число m (2 ≤ m ≤ 105).

В последующих m строках даны координаты кубиков xi, yi ( - 109 ≤ xi ≤ 109, 0 ≤ yi ≤ 109) в порядке следования чисел, написанных на них. Гарантируется, что исходная конструкция устойчива.

Никакие два кубика не совпадают.

Выходные данные

В единственной строке выведите ответ на задачу.

B. Фото на память

*особая задача дп реализация Структуры данных *1100

На вечеринке встретились n друзей, они давно не собирались все вместе и поэтому решили сделать общее групповое фото.

Упрощённо процесс фотографирования можно описать следующим образом. На фотографии каждый из друзей занимает прямоугольник из пикселей: i-й из них занимает прямоугольник ширины wi пикселей и высоты hi пикселей. На групповом фото все фотографируемые стоят в ряд, таким образом минимальный размер в пикселях фотографии, включающей всех друзей, составляет W × H, где W — суммарная ширина всех фотографируемых, а H — максимальная из высот всех фотографируемых.

Как это обычно и бывает, друзья сфотографировались n раз — на j-й (1 ≤ j ≤ n) фотографии присутствовали все, кроме j-го из них, ведь он был фотографом.

Выведите минимальный размер в пикселях каждого из сделанных фото.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 200 000) — количество друзей.

Далее следует n строк: i-я из них содержит информацию об i-м из друзей. В строке содержится пара целых чисел wi, hi (1 ≤ wi ≤ 10, 1 ≤ hi ≤ 1000) — ширина и высота в пикселях соответствующего ему прямоугольника.

Выходные данные

Выведите n разделённых пробелами чисел b1, b2, ..., bn, где bi — общее количество пикселей на минимальной фотографии, вмещающей всех друзей, кроме i-го из них.

A. Поворот, отражение и масштабирование

*особая задача реализация *1200

Поликарп пишет прототип графического редактора. Он уже определил для себя, что основные преобразования изображений в его редакторе будут: поворот изображения на 90 градусов по часовой стрелке, отражение изображения по горизонтали (симметрия относительно вертикальной прямой, то есть правая часть изображения переходит в левую и наоборот) и его масштабирование. Он уверен, что существует большое количество преобразований, которые можно выразить через эти три.

Недавно он завершил реализацию всех трех преобразований для монохромных изображений. Для тестирования этой функциональности он просит вас написать программу, которая последовательно выполнит с монохромным изображением три действия: сначала повернет его на 90 градусов по часовой стрелке, затем отразит его по горизонтали и, наконец, отмасштабирует вдвое (увеличит все линейные размеры в два раза).

Реализуйте эту функциональность, чтобы помочь Поликарпу протестировать его редактор.

Входные данные

В первой строке записаны два целых числа w и h (1 ≤ w, h ≤ 100) — ширина и высота изображения в пикселях. Сама картинка задана в h строках по w символов в каждой из них — каждый символ кодирует цвет соответствующего пикселя изображения. В качестве символов строк используются только символы «.» и «*», так как изображение монохромное.

Выходные данные

Выведите 2w строк по 2h символов в каждой — результат последовательного применения трех описанных выше преобразований.

B. Усреднение обращений

*особая задача реализация *1500

В этой задаче вам потребуется иметь дело с реальным алгоритмом, который используется при работе социальной сети ВКонтакте.

Как и в любой другой компании, создающей высоконагруженные сервисы, разработчикам ВКонтакте приходится регулярно иметь дело со статистикой обращений. Важным показателем, отражающим нагруженность ресурса, является среднее число запросов за некоторый промежуток времени в T секунд (например, T = 60 сек = 1 мин или T = 86400 сек = 1 сутки). Например, если это число резко падает, то это признак того, что ресурс испытывает проблемы с доступностью, а если возрастает, то это повод исследовать причины роста количества запросов, и, возможно, увеличить количество ресурсов, поддерживающих работу сервиса.

Однако даже такая естественная задача как подсчёт среднего количества запросов за промежуток времени может оказаться непростой при работе с объёмами данных, характерными для огромной социальной сети. Поэтому в процессе разработки приходится использовать оригинальные технические приёмы, позволяющие решать те или иные задачи приближённо, но при этом более эффективно.

Рассмотрим следующую формальную модель. Имеется сервис, который работает на протяжении n секунд. Нам известно количество запросов к этому ресурсу at в каждый момент времени t (1 ≤ t ≤ n). Сформулируем следующий алгоритм подсчёта среднего с экспоненциальным затуханием. Пусть c — некоторое вещественное число, строго больше единицы.


// правильной установкой этой константы можно регулировать
// промежуток времени, за который будет считаться статистика
double c = некоторая константа;

// в результате работы алгоритма эта переменная будет
// содержать среднее количество запросов за последние
// T секунд к текущему моменту времени
double mean = 0.0;

for t = 1..n: // каждую секунду делаем следующее:
// at это количество запросов, поступивших за последнюю секунду;
mean = (mean + at / T) / c;

Таким образом, переменная mean каждую секунду пересчитывается с использованием количества запросов, поступивших за эту секунду. Проведя некоторые математические выкладки можно доказать, что при правильном подборе константы c значение mean будет не сильно отличаться от реального среднего значения ax при t - T + 1 ≤ x ≤ t.

Преимущество подобного подхода заключается в том, что она использует лишь количество обращений в текущий момент времени, не требуя хранить историю запросов за большой промежуток времени. Также, она учитывает недавние значения с большим весом, чем давние, что позволяет быстрее реагировать на резкое изменение значений.

Однако перед использованием нового теоретического подхода в промышленном программировании, обязательным шагом является практическая проверка его достоверности на имеющихся тестовых наборах данных. Ваша задача — сравнить результаты, полученные в результате работы приближённого алгоритма, с настоящими значениями.

Вам даны n значений at, целое число T и вещественное число c. Также вам даны m моментов pj (1 ≤ j ≤ m), в которые нас интересует среднее значение количества запросов за последние T секунд. Реализуйте два алгоритма. Первый должен считать требуемое значение по определению, т. е. по формуле . Второй алгоритм должен считать среднее значение так, как описано выше. Выведите оба значения и посчитайте относительную ошибку второго алгоритма по формуле , где approx — приближённое значение, полученное вторым алгоритмом, а real — точное значение, полученное первым алгоритмом.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 2·105), целое число T (1 ≤ T ≤ n) и вещественное число c (1 < c ≤ 100) — соответственно время работы ресурса, длина отрезка времени, в течение которого нас интересует среднее количество обращений и коэффициент c работы приближённого алгоритма. Число c задано ровно с шестью знаками после десятичной точки.

В следующей строке следуют n целых чисел at (1 ≤ at ≤ 106) — количество обращений к сервису в каждый из моментов времени.

В следующей строке записано целое число m (1 ≤ m ≤ n) — количество моментов времени, в которые нас интересует среднее количество запросов за последние T секунд.

В следующей строке следуют m целых чисел pj (T ≤ pj ≤ n), обозначающие очередной момент времени, когда нас интересует статистика. Времена pj строго возрастают.

Выходные данные

Выведите m строк. j-я строка должна содержать три числа real, approx и error, где:

  • — реальное среднее количество запросов за последние T секунд;
  • approx считается по приведённому алгоритму, и равняется mean в момент времени t = pj (т. е. после выполнения pj-й итерации цикла);
  • — относительная ошибка приближённого алгоритма.

Выведенные вами числа будут сравниваться с правильными с относительной или абсолютной погрешностью 10 - 4. Рекомендуется выводить числа с не менее, чем пятью знаками после запятой.

D. Статистика обработки роликов

*особая задача реализация Структуры данных *1600

Социальная сеть для собак ВБудке имеет k специальных серверов для пережатия загружаемых роликов про кошечек. Каждый ролик после загрузки должен быть обработан на одном (любом) из серверов, и только после этого сохранен в соцсети.

Известно, что каждый сервер пережимает минутный фрагмент за одну секунду. Таким образом, на любом из серверов видеофайл длительность m минут пережимается за m секунд.

Известно время загрузки в соцсеть каждого из n роликов (в секундах с момента общего старта серверов). Все ролики поступают в разные моменты времени и обрабатываются в порядке поступления. Если ролик поступил в момент времени s, то его можно начать обрабатывать сразу же в этот момент. Некоторые из роликов могут ожидать обработки из-за занятости всех серверов. В таком случае как только какой-либо сервер освободится, он сразу же начнет обрабатывать очередной ролик. Ожидающие обработки ролики складываются в очередь. Если к моменту начала обработки свободны несколько серверов, то его начинает обрабатывать любой из них.

Для каждого из роликов определите момент окончания его обработки.

Входные данные

В первой строке входных данных записаны целые числа n и k (1 ≤ n, k ≤ 5·105) — количество роликов и серверов соответственно.

Далее в n строках следуют описания роликов парами целых чисел si, mi (1 ≤ si, mi ≤ 109), где si — время в секундах, когда пришел i-й ролик, а mi — его длительность в минутах. Гарантируется, что все si различны и ролики заданы в хронологическом порядке загрузки, то есть в порядке увеличения si.

Выходные данные

Выведите n чисел e1, e2, ..., en, где ei — время в секундах от начала работы серверов, когда i-й ролик будет обработан.

A. Возможно, вы знаете этих людей?

реализация *1600

Основой любой социальной сети является отношение дружбы между двумя пользователями в том или ином смысле. В одной известной социальной сети дружба симметрична, то есть если a является другом b, то b также является другом a.

В этой же сети есть функция, которая демонстрирует множество людей, имеющих высокую вероятность быть знакомыми для пользователя. Эта функция работает следующим образом. Зафиксируем пользователя x. Пусть некоторый другой человек y, не являющийся другом x на текущий момент, является другом не менее, чем для k% друзей x. Тогда он является предполагаемым другом для x.

У каждого человека в социальной сети есть свой уникальный идентификатор — это целое число от 1 до 109. Вам дан список пар пользователей, являющихся друзьями. Определите для каждого упомянутого пользователя множество его предполагаемых друзей.

Входные данные

В первой строке следуют два целых числа m и k (1 ≤ m ≤ 100, 0 ≤ k ≤ 100) — количество пар друзей и необходимый процент общих друзей для того, чтобы считаться предполагаемым другом.

В последующих m строках записано по два числа ai, bi (1 ≤ ai, bi ≤ 109, ai ≠ bi), обозначающих идентификаторы пользователей, являющихся друзьями.

Гарантируется, что каждая пара людей фигурирует в списке не более одного раза.

Выходные данные

Для всех упомянутых людей в порядке возрастания id выведите информацию о предполагаемых друзьях. Информация должна иметь вид "id:  k id1 id2 ... idk", где id — это id самого человека, k — количество его предполагаемых друзей, а id1, id2, ..., idk — идентификаторы его предполагаемых друзей в возрастающем порядке.

A. Король воров

Перебор реализация *1300

В данной задаче речь пойдёт про упрощённую модель игры King of Thieves.

В новой игре от компании ZeptoLab «King of Thieves» вам предстоит, управляя своим персонажем, добраться до сундука с золотом, избегая ловушек и препятствий, расставленных на пути.

Интересной особенностью игры является возможность проектирования собственных уровней, которые будут доступны для прохождения другим игрокам. Рассмотрим следующую модель простого уровня.

Подземелье состоит из n участков, расположенных на одном вертикальном уровне, каждый из которых представляет из себя либо площадку, на которой может находиться персонаж, либо яму, падение в которую приводит к проигрышу. Все участки имеют одинаковую длину, площадки на схеме уровня изображаются как '*', а ямы — как '.'.

На возможность скоростного прохождения уровня влияет возможность делать подряд множество прыжков одинаковой длины. Более формально, находясь на площадке номер i1, персонаж может сделать последовательность прыжков по площадкам i1 < i2 < ... < ik, если i2 - i1 = i3 - i2 = ... = ik - ik - 1. Разумеется, все участки i1, i2, ... ik должны быть именно площадками, а не ямами.

Уровень считается хорошим, если в нём можно произвести последовательность из четырёх прыжков одинаковой длины, или, иными словами, должна существовать последовательность i1, i2, ..., i5, состоящая из пяти площадок, расположенных через равные промежутки. По данной схеме уровня проверьте, является ли он хорошим.

Входные данные

В первой строке расположено целое число n (1 ≤ n ≤ 100) — количество участков на уровне.

В единственной строке расположена схема уровня, представляющая собой строку из n символов '*' и '.'.

Выходные данные

Если уровень является хорошим, то выведите ещё слово "yes" (без кавычек), иначе, выведите слово "no" (без кавычек).

Примечание

В первом тесте из условия можно совершить последовательность из прыжков по площадкам 2, 5, 8, 11, 14.

B. Ам Ням и тёмный парк

жадные алгоритмы поиск в глубину и подобное реализация *1400

Ам Ням — главный герой игры Cut the Rope. Он — смышлёный маленький монстрик, который любит ходить в гости к друзьям, живущим по другую сторону парка. Однако старые тёмные парки могут напугать даже такое жизнерадостное существо как Ам Ням, поэтому он хочет обратиться к вам за помощью.

Парк представляет собой 2n + 1 - 1 площадок, соединённых между собой дорожками так, что схема парка представляет собой полное бинарное дерево глубины n. Более формально, вход в парк ведёт в площадку 1. Выходы из парка расположены на площадках 2n, 2n + 1, ..., 2n + 1 - 1, и эти выходы ведут прямо к домам друзей Ам Няма. От каждой площадки i (2 ≤ i < 2n + 1) отходит двусторонняя дорожка в площадку . Таким образом, от входа в парк можно добраться до любого из выходов, пройдя ровно по n дорожкам.

Чтобы осветить дорожки парка вечером, смотритель парка установил фонари вдоль каждой дорожки. Вдоль дорожки, ведущей из i и в поставлено ai фонарей.

Ам Ням любит считать фонари по пути к своему другу. Ам Ням побаивается пауков, которые живут в парке, поэтому он не любит ходить по мало освещённым маршрутам. Он хочет, чтобы на пути к любому из его друзей суммарно находилось одинаковое количество фонарей, тогда он будет чувствовать себя в безопасности.

Он обратился к вам за помощью в установке дополнительных фонарей. Определите, какое минимальное количество фонарей нужно дополнительно поставить на дорожки парка так, чтобы на пути от входа в парк до любого выхода из парка было одинаковое количество фонарей. На каждую дорожку можно добавить произовольное количество фонарей.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 10) — количество дорожек на пути от входа до любого выхода.

В следующей строке следуют 2n + 1 - 2 числа a2, a3, ... a2n + 1 - 1 — исходное количество фонарей на каждой из дорожек в парке. Число ai обозначает количество фонарей на дорожке между площадками i и . Все числа ai — целые положительные, не превосходящие 100.

Выходные данные

Выведите минимальное количество фонарей, которое нужно добавить на дорожки парка, чтобы Ам Ням чувствовал себя в безопасности.

Примечание

Изображение к тесту из условия. Зелёными отмечены дополнительные фонари.

E. Передача уровней

дп реализация *2400

Оптимизация количества переданных по сети данных — важная и интересная часть разработки любого сетевого приложения.

В одной секретной игре, разрабатывающейся в недрах компании ZeptoLab, игровой мир представляет собой n уровней, расположенных по кругу. С i-го уровня можно попасть на уровни i - 1 и i + 1, при этом с уровня 1 можно попасть на уровень n и наоборот. Карта i-го уровня занимает объём в ai байт.

В целях сокращения переданного трафика, игра получает уровни следущим образом. На сервере все уровни разбиты на m групп, и каждый раз, когда игрок впервые оказывается на одном из уровней очередной группы, сервер отправляет приложению все уровни этой группы единым пакетом. Таким образом, пока игрок путешествует внутри уровней одной группы, приложению не требуется никакой новой информации. В силу ограничений технического характера, пакет может содержать произвольное количество уровней, но суммарный размер описаний их карт не должен превосходить b байт, где b — некоторая положительная целая константа.

Игроки, как правило, проходят уровни один за другим, поэтому было принято решение разбить n уровней на m групп таким образом, чтобы каждая группа являлась сплошным отрезком, содержащим несколько соседних уровней (в том числе, группа может содержать два соседних уровня n и 1). В частности, если описания всех уровней суммарно весят не более b байт, то их всех можно объединить в одну грппу, чтобы отправить единым пакетом.

Определите, какое минимальное количество групп требуется образовать, чтобы организовать уровни игры, соблюдая указанные условия?

Так как разработка игры — длительный процесс, а технологии не стоят на месте, то пока невозможно точно предсказать, какое значение примет константа b, ограничивающая размер пакета. Поэтому разработчики просят вас определить ответ для нескольких значений b.

Входные данные

В первой строке находятся два числа n, q (2 ≤ n ≤ 106, 1 ≤ q ≤ 50) — количество уровней в игровом мире и количество различных значений b, которые вам необходимо обработать.

Во второй строке находятся n целых чисел ai (1 ≤ ai ≤ 109) — размеры уровней в байтах.

В последующих q строках находятся целые числа bj (), обозначающие значения константы b, для которых вам требуется определить ответ.

Выходные данные

Для каждого значения kj из входных данных выведите в отдельной строке целое число mj (1 ≤ mj ≤ n), обозначающее минимальное количество групп, на которые нужно разбить уровни игры для передачи по сети, соблюдая указанные условия.

Примечание

В тесте из условия можно поступить следующим образом.

  • при b = 7 можно разбить на два отрезка: 2|421|32 (обратите внимание, один из отрезков содержит пятый, шестой и первый уровни);
  • при b = 4 можно разбить на четыре отрезка: 2|4|21|3|2;
  • при b = 6 можно разбить на три отрезка: 24|21|32|.

A. Игра с бумагой

математика реализация *1100

Как-то раз, сидя на не самом интересном уроке по математике, Вася собирал оригами из прямоугольного листа бумаги a мм  ×  b мм (a > b). Как правило, первым шагом при сборке оригами является получение квадратной заготовки из прямоугольного листа бумаги путём сгибания вдоль биссектрисы прямого угла и отрезания лишней части.

Собрав бумажный кораблик из квадратной заготовки, Вася обратил внимание на оставшуюся полоску бумаги (a - b) мм  ×  b мм. Ему пришла в голову мысль использовать аналогичным образом эту полоску для создания оригами, а затем оставшуюся (если такая образуется) и так далее. В тот момент, когда в качестве остатка у него окажется квадратный фрагмент бумаги, он соберёт из него последний кораблик и остановится.

Можете ли вы определить, сколько всего корабликов соберёт Вася за урок?

Входные данные

В первой строке входных данных записаны два целых числа a, b (1 ≤ b < a ≤ 1012) — размеры исходного листа бумаги.

Выходные данные

Выведите единственное целое число — количество корабликов, которые соберёт Вася.

Примечание

Иллюстрации к первому и второму тесту из условия.

C. Разрезание стекла

Бинарный поиск реализация Структуры данных *1500

Леонид хочет стать резчиком по стеклу. У него уже есть прямоугольный лист стекла w мм  ×  h мм, алмазный стеклорез и полные штаны энтузиазма. Не хватает только понимания, что и как резать.

Чтобы не терять времени даром, он решил поупражняться в технике разрезов. Для этого он проводит вертикальные и горизонтальные разрезы через весь лист. В результате этого процесса образуются меньшие прямоугольные куски стекла. Леонид не перемещает образовавшиеся куски стекла, в частности, очередной разрез делит на меньшие части каждый кусок стекла, через который он проходит.

После каждого разреза Леонид пытается определить, какую площадь имеет самый большой из имеющихся на данный момент фрагментов стекла. Так как частей становится всё больше и больше, этот вопрос занимает у него всё больше и больше времени, и отвлекает от увлекательного процесса.

Леонид предлагает устроить разделение труда — он будет резать стекло, а вы — считать площадь максимального фрагмента после каждого разреза. Идёт?

Входные данные

В первой строке заданы три целых числа w, h, n (2 ≤ w, h ≤ 200 000, 1 ≤ n ≤ 200 000).

В последующих n строках следуют описания разрезов. Каждое описание имеет вид H y или V x. В первом случае проводится горизонтальный разрез на расстоянии y миллиметров (1 ≤ y ≤ h - 1) от нижнего края исходного листа, во втором случае проводится вертикальный разрез на расстоянии x (1 ≤ x ≤ w - 1) миллиметров от левого края исходного листа. Гарантируется, что Леонид не будет производить два одинаковых разреза.

Выходные данные

После каждого разреза выводите в отдельной строке площадь максимального из имеющихся фрагментов стекла в квадратных миллиметрах.

Примечание

Пояснение к первому тесту из условия:

Пояснение ко второму тесту из условия:

D. Задача о клике

дп жадные алгоритмы реализация сортировки Структуры данных *1800

Задача о клике — одна из самых известных NP-полных задач. После некоторых оговорок она формулируется следующим образом. Рассмотрим неориентированный граф G. Требуется найти такое подмножество вершин C максимального размера, что любые две из них соединены ребром в графе G. Звучит просто, не правда ли? К текущему моменту не известен алгоритм, который находит решение этой задачи за полиномиальное время от размера графа. Однако, как и в случае многих других NP-полных задач, задача о клике оказывается проще, если рассмотреть граф специфического вида.

Рассмотрим n различных точек на прямой. Пусть i-я точка имеет координату xi и вес wi. Образуем граф G, вершинами которого являются эти точки, а рёбрами соединены в точности те пары точек (i, j), для которых расстояние между этими точками не меньше суммы их весов, формально говоря: |xi - xj| ≥ wi + wj.

Найдите размер максимальной клики в таком графе.

Входные данные

В первой строке задано число n (1 ≤ n ≤ 200 000) — количество точек.

В каждой из последующих n строк следуют по два числа xi, wi (0 ≤ xi ≤ 109, 1 ≤ wi ≤ 109) — координата и вес очередной точки. Все координаты xi различны.

Выходные данные

Выведите одно число — количество вершин в максимальной клике образованного графа.

Примечание

Если вы вдруг умеете решать эту задачу, не используя специфические свойства графа, представленного в условии задачи, то вам полагается приз в миллион доллларов!

Изображение к тесту из условия:

A. Автодополнение

реализация *1100

Автодополнение — функция в программах, предусматривающих ввод текста (редакторы, оболочки командной строки, браузеры и т. д.), по дополнению текста по введенной его части. Вася занимается разработкой нового браузера BERowser. Сейчас он как раз работает над функцией автодополнения в адресной строке. Известен список из n последних посещенных пользователем страниц, а так же введенная часть s. Ваша задача — дополнить s до адреса одной из страниц из списка. Вы должны найти лексикографически наименьший адрес, имеющий префикс s.

Входные данные

В первой строке содержится строка s — введенная часть. Во второй строке записано целое число n (1 ≤ n ≤ 100) — количество посещенных страниц. Далее следует n строк — посещенные страницы, по одной в строке. Все строки имеют длину от 1 до 100 символов включительно и состоят только из маленьких латинских букв.

Выходные данные

Если s не является началом какого-либо из n адресов посещенных страниц, выведите s. Иначе выведите лексикографически наименьший адрес одной из посещенных страниц, который начинается на s.

Лексикографический порядок — это порядок слов в словаре. Лексикографическое сравнение строк реализует оператор '<' в современных языках программирования.

Примечание

B. Фотография в блог

Бинарный поиск реализация *1700

Один из популярных блогов обрабатывает закачанные фотографии пользователей таким образом. Он вырезает из них прямоугольную область так, чтобы отношение высоты к ширине (т. е. частное высота / ширина) находилось в границах от 0.8 до 1.25 включительно. Кроме того, хотя бы одна из сторон вырезанной части должны иметь размер, равный некоторой степени числа 2 (2x для некоторого целого числа x). Если эти правила определяют размер вырезаемой части неоднозначно, то выбирается такой способ, что вырезаемая часть имеет наибольшую площадь. Разумеется, обе стороны вырезаемой части должны быть целочисленными. В случае нескольких ответов — нужно выбрать ответ с максимальной высотой.

Входные данные

В первой строке записана пара целых чисел h и w (1 ≤ h, w ≤ 109) — высота и ширина закачанного фото в пикселях.

Выходные данные

Выведите два целых числа — высоту и ширину вырезаемой части.

A. Экзамен

Конструктив математика реализация *1100

Экзамен для n студентов будет проходить в длинной и узкой аудитории, таким образом, студенты будут сидеть в ряд в некотором порядке. Преподаватель подозревает, что студенты с соседними номерами (i и i + 1) в течение обучения всегда сидели рядом и подружились, и если их посадить рядом на экзамене, то они наверняка будут помогать друг другу.

Требуется выбрать максимальное количество студентов и составить такой вариант порядка размещения студентов в аудитории, что никакие два студента с соседними номерами не сидят рядом.

Входные данные

В единственной строке задано целое число n (1 ≤ n ≤ 5000) — количество студентов на экзамене.

Выходные данные

В первую строку выведите целое число k — максимальное количество студентов, которых можно рассадить так, что никакие два студента с соседними номерами не сидят рядом.

Во вторую строку выведите k целых различных чисел a1, a2, ..., ak (1 ≤ ai ≤ n), где ai — номер студента на i-й позиции. Студенты на соседних позициях не должны иметь соседние номера. Формально, |ai - ai + 1| ≠ 1 для всех i от 1 до k - 1.

Если возможных ответов несколько, выведите любой.

A. Экзамен

Конструктив математика реализация *1100

Экзамен для n студентов будет проходить в длинной и узкой аудитории, таким образом, студенты будут сидеть в ряд в некотором порядке. Преподаватель подозревает, что студенты с соседними номерами (i и i + 1) в течение обучения всегда сидели рядом и подружились, и если их посадить рядом на экзамене, то они наверняка будут помогать друг другу.

Требуется выбрать максимальное количество студентов и составить такой вариант порядка размещения студентов в аудитории, что никакие два студента с соседними номерами не сидят рядом.

Входные данные

В единственной строке задано целое число n (1 ≤ n ≤ 5000) — количество студентов на экзамене.

Выходные данные

В первую строку выведите целое число k — максимальное количество студентов, которых можно рассадить так, что никакие два студента с соседними номерами не сидят рядом.

Во вторую строку выведите k целых различных чисел a1, a2, ..., ak (1 ≤ ai ≤ n), где ai — номер студента на i-й позиции. Студенты на соседних позициях не должны иметь соседние номера. Формально, |ai - ai + 1| ≠ 1 для всех i от 1 до k - 1.

Если возможных ответов несколько, выведите любой.

A. Экзамен

Конструктив математика реализация *1100

Экзамен для n студентов будет проходить в длинной и узкой аудитории, таким образом, студенты будут сидеть в ряд в некотором порядке. Преподаватель подозревает, что студенты с соседними номерами (i и i + 1) в течение обучения всегда сидели рядом и подружились, и если их посадить рядом на экзамене, то они наверняка будут помогать друг другу.

Требуется выбрать максимальное количество студентов и составить такой вариант порядка размещения студентов в аудитории, что никакие два студента с соседними номерами не сидят рядом.

Входные данные

В единственной строке задано целое число n (1 ≤ n ≤ 5000) — количество студентов на экзамене.

Выходные данные

В первую строку выведите целое число k — максимальное количество студентов, которых можно рассадить так, что никакие два студента с соседними номерами не сидят рядом.

Во вторую строку выведите k целых различных чисел a1, a2, ..., ak (1 ≤ ai ≤ n), где ai — номер студента на i-й позиции. Студенты на соседних позициях не должны иметь соседние номера. Формально, |ai - ai + 1| ≠ 1 для всех i от 1 до k - 1.

Если возможных ответов несколько, выведите любой.

A. Экзамен

Конструктив математика реализация *1100

Экзамен для n студентов будет проходить в длинной и узкой аудитории, таким образом, студенты будут сидеть в ряд в некотором порядке. Преподаватель подозревает, что студенты с соседними номерами (i и i + 1) в течение обучения всегда сидели рядом и подружились, и если их посадить рядом на экзамене, то они наверняка будут помогать друг другу.

Требуется выбрать максимальное количество студентов и составить такой вариант порядка размещения студентов в аудитории, что никакие два студента с соседними номерами не сидят рядом.

Входные данные

В единственной строке задано целое число n (1 ≤ n ≤ 5000) — количество студентов на экзамене.

Выходные данные

В первую строку выведите целое число k — максимальное количество студентов, которых можно рассадить так, что никакие два студента с соседними номерами не сидят рядом.

Во вторую строку выведите k целых различных чисел a1, a2, ..., ak (1 ≤ ai ≤ n), где ai — номер студента на i-й позиции. Студенты на соседних позициях не должны иметь соседние номера. Формально, |ai - ai + 1| ≠ 1 для всех i от 1 до k - 1.

Если возможных ответов несколько, выведите любой.

A. Экзамен

Конструктив математика реализация *1100

Экзамен для n студентов будет проходить в длинной и узкой аудитории, таким образом, студенты будут сидеть в ряд в некотором порядке. Преподаватель подозревает, что студенты с соседними номерами (i и i + 1) в течение обучения всегда сидели рядом и подружились, и если их посадить рядом на экзамене, то они наверняка будут помогать друг другу.

Требуется выбрать максимальное количество студентов и составить такой вариант порядка размещения студентов в аудитории, что никакие два студента с соседними номерами не сидят рядом.

Входные данные

В единственной строке задано целое число n (1 ≤ n ≤ 5000) — количество студентов на экзамене.

Выходные данные

В первую строку выведите целое число k — максимальное количество студентов, которых можно рассадить так, что никакие два студента с соседними номерами не сидят рядом.

Во вторую строку выведите k целых различных чисел a1, a2, ..., ak (1 ≤ ai ≤ n), где ai — номер студента на i-й позиции. Студенты на соседних позициях не должны иметь соседние номера. Формально, |ai - ai + 1| ≠ 1 для всех i от 1 до k - 1.

Если возможных ответов несколько, выведите любой.

A. Экзамен

Конструктив математика реализация *1100

Экзамен для n студентов будет проходить в длинной и узкой аудитории, таким образом, студенты будут сидеть в ряд в некотором порядке. Преподаватель подозревает, что студенты с соседними номерами (i и i + 1) в течение обучения всегда сидели рядом и подружились, и если их посадить рядом на экзамене, то они наверняка будут помогать друг другу.

Требуется выбрать максимальное количество студентов и составить такой вариант порядка размещения студентов в аудитории, что никакие два студента с соседними номерами не сидят рядом.

Входные данные

В единственной строке задано целое число n (1 ≤ n ≤ 5000) — количество студентов на экзамене.

Выходные данные

В первую строку выведите целое число k — максимальное количество студентов, которых можно рассадить так, что никакие два студента с соседними номерами не сидят рядом.

Во вторую строку выведите k целых различных чисел a1, a2, ..., ak (1 ≤ ai ≤ n), где ai — номер студента на i-й позиции. Студенты на соседних позициях не должны иметь соседние номера. Формально, |ai - ai + 1| ≠ 1 для всех i от 1 до k - 1.

Если возможных ответов несколько, выведите любой.

A. Экзамен

Конструктив математика реализация *1100

Экзамен для n студентов будет проходить в длинной и узкой аудитории, таким образом, студенты будут сидеть в ряд в некотором порядке. Преподаватель подозревает, что студенты с соседними номерами (i и i + 1) в течение обучения всегда сидели рядом и подружились, и если их посадить рядом на экзамене, то они наверняка будут помогать друг другу.

Требуется выбрать максимальное количество студентов и составить такой вариант порядка размещения студентов в аудитории, что никакие два студента с соседними номерами не сидят рядом.

Входные данные

В единственной строке задано целое число n (1 ≤ n ≤ 5000) — количество студентов на экзамене.

Выходные данные

В первую строку выведите целое число k — максимальное количество студентов, которых можно рассадить так, что никакие два студента с соседними номерами не сидят рядом.

Во вторую строку выведите k целых различных чисел a1, a2, ..., ak (1 ≤ ai ≤ n), где ai — номер студента на i-й позиции. Студенты на соседних позициях не должны иметь соседние номера. Формально, |ai - ai + 1| ≠ 1 для всех i от 1 до k - 1.

Если возможных ответов несколько, выведите любой.

E. Берляндская система локального позиционирования

жадные алгоритмы Конструктив реализация хэши *2400

В Берляндии вдоль главной улицы столицы курсирует автобус. Улица начинается от главной площади и представляет собой очень длинный отрезок. На протяжении всей улицы стоит n остановок, i-я из них расположена на расстоянии ai от центральной площади, все расстояния различны, остановки пронумерованы по возрастанию удаленности от площади, то есть ai < ai + 1 для всех i от 1 до n - 1. Автобус начинает свой путь от первой остановки, проезжает остановки 2, 3 и так далее. Он доезжает до остановки с номером n, разворачивается и едет в обратную сторону до остановки 1, проезжая все промежуточные остановки в обратном порядке. После этого он опять начинает движение в сторону остановки n. В течение дня автобус безостановочно курсирует по такому маршруту.

Автобус оснащен берляндской системой локального позиционирования. Когда автобус проезжает через остановку, система фиксирует ее номер.

Одна из ключевых возможностей системы — она может отвечать на запросы о пройденном расстоянии автобуса для участков его пути между некоторой парой остановок. Специальный модуль системы получает на вход информацию о наборе остановок на участке пути, причем номер остановки в наборе встречается столько раз, сколько раз мимо нее проехал автобус. Этот модуль возвращает длину пройденного участка пути (или -1, если длину однозначно определить невозможно). Работа модуля усложняется тем, что номера остановок передаются в запросе не в порядке их посещения, а в неубывающем порядке.

Например, если количество остановок равно 6, а участок пути автобуса начинается на остановке номер 5, заканчивается на остановке номер 3 и проходит остановки следующим образом: , то запрос об этом участке пути будет иметь вид: 3, 4, 5, 5, 6. Если же автобус на участке пути от остановки 5 до остановки 3 успевает проехать мимо 1-й остановки (то есть рассматривается участок, который заканчивается вторым посещением остановки 3 на пути из 5), то запрос будет иметь вид: 1, 2, 2, 3, 3, 4, 5, 5, 6.

Вам предстоит повторить подвиг берляндских программистов и реализовать данную функцию.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 2·105) — количество остановок.

Вторая строка содержит n целых чисел (1 ≤ ai ≤ 109) — расстояние i-й остановки от центральной площади. Числа во второй строке идут в порядке возрастания.

В третьей строке записано целое число m (1 ≤ m ≤ 4·105) — количество остановок, которые проехал автобус на некотором участке пути.

Четвертая строка содержит m целых чисел (1 ≤ bi ≤ n) — номера остановок, которые проехал автобус на участке пути, в отсортированном порядке. Номер остановки встречается такое количество раз, сколько раз ее проехал автобус.

Гарантируется, что запрос соответствует некоторому участку пути.

Выходные данные

В единственную строку необходимо вывести расстояние, которое проехал автобус. Если это невозможно однозначно определить, необходимо вывести  - 1.

Примечание

Первый тест из условия демонстрирует первый, разобранный в условии задачи пример.

Второй тест из условия демонстрирует второй, разобранный в условии задачи пример.

В третьем примере возможны два разных маршрута, которые имеют разные длины, следовательно, искомая длина участка не определена однозначно.

В четвертом примере, несмотря на то, что запросу соответствуют два разных маршрута, они имеют одинаковые длины, следовательно, искомая длина участка определена однозначно.

A. Тавас и Нафас

Перебор реализация *1000

Тавас узнал количество баллов за тест, и теперь он хочет поделиться ими со своей девушкой Нафас.

Его телефон работает под управлением операционной системы Tavdroid, на клавиатуре которой нет цифр! Тавас хочет отправить Нафас смс-сообщение со своими результатами, так что деваться некуда — придется писать число баллов словами.

Тавас наелся сухого кофе, так что сейчас он не очень соображает.

Ваша задача — помочь ему и сказать, что печатать.

Входные данные

В первой и единственной строке ввода записано целое число s (0 ≤ s ≤ 99), результат Таваса.

Выходные данные

Выведите единственную строку, состоящую только из строчных букв английского алфавита и дефисов ('-'). Не используйте пробелы.

Примечание

Всю необходимую информацию про английские числительные можно найти по ссылке: http://en.wikipedia.org/wiki/English_numerals.

B. Тавас и СаДДас

битмаски Комбинаторика Перебор реализация *1100

Тавас снова начал есть сухой кофе ложками! Кейон пожаловался на ужасный запах, но юноша не остановился. Тогда Кейон попросил своего умного друга СаДДаса наказать Таваса! СаДДас забрал наушники Таваса и сказал ему: "Верну их, если ты решишь следующую задачу."

Задача звучит следующим образом:

Вам дано счастливое число n. Счастливые числа — это положительные целые числа, содержащие в своей десятичной записи только счастливые цифры 4 и 7. Например, числа 47, 744, 4 счастливые, а 5, 17, 467 — нет.

Если мы отсортируем все счастливые числа в возрастающем порядке, на какой позиции (при нумерации с единицы) будет стоять число n?

Тавас не такой умный, как СаДДас, так что он попросил Вас сделать ему одолжение и решить эту задачу, чтобы он мог получить назад свои наушники.

Входные данные

В первой и единственной строке следует счастливое число n (1 ≤ n ≤ 109).

Выходные данные

Выведите позицию, на которой n находится среди всех счастливых чисел.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

A. Подарки

реализация *1300

Ёжик любит дарить своему другу подарки, но не меньше любит получать их.

Получив сегодня очередной подарок, Ёжик вдруг понял, что ему уже некуда положить его — место в шкафу на специальной полке кончилось. Придётся освобождать ещё одну полку, но вот какую именно, насколько большую?

Чтобы понять это, Ёжик просит Вас написать ему программу, которая посчитает примерное число подарков, которые подарят ему за следующие N дней. При этом он руководствуется принципом

  • в любой праздничный день Ёжик обязательно получит подарок,
  • подарки он получает не реже чем каждые K дней (т.е. если он получил подарок в i-ый день, то следующий подарок он получит не позже чем в i + K-ый день).

По заданным N и K, а также списку праздничных дней среди следующих N дней посчитайте наименьшее число подарков, которое могло быть подарено Ёжику. Сегодняшний день имеет номер ноль, и считайте, что подарок в этот день уже получен (т.е. учитывать его в ответе не надо).

Входные данные

В первой строке записаны целые числа N и K (1 ≤ N ≤ 365, 1 ≤ K ≤ N).

Во второй строке записано число C — число праздничных дней (0 ≤ C ≤ N). Далее в той же строке идут C чисел в диапазоне от 1 до N — номера праздничных дней. Числа заданы в порядке возрастания, повторяющихся среди них нет.

Выходные данные

Выведите единственное число — минимальное число подарков, которые получит Ёжик в течение следующих N дней.

B. Вырезание пазла

реализация хэши *1800

Недавно Ёжик вспомнил одно из своих любимых занятий детства — собирание пазлов, и увлёкся им с новой силой. Целыми днями сидел он со своим другом и копался в тысячах маленьких кусочков картинки, отыскивая один за другим нужные элементы.

Вскоре Ёжику пришла в голову замечательная идея: вместо того чтобы покупать готовые пазлы, можно самому брать большой лист с какой-нибудь картиной и разрезать его на множество маленьких прямоугольных кусочков, затем перемешивать их и решать получившуюся головоломку, пытаясь собрать картину обратно. Так получается даже более сложная задача, чем классический пазл: ведь теперь все фрагменты имеют одинаковую прямоугольную форму, и собирать картину можно, только полагаясь на рисунок.

Все кусочки головоломки получаются одинакового размера X × Y, потому что картина разрезается сначала горизонтальными разрезами с шагом X, а затем — вертикальными разрезами с шагом Y. Если мы обозначим первоначальные размеры картины через A × B, то A должно делиться на X, B должно делиться на Y (X и Y — целые числа).

Однако не любое такое разрезание картины даст хороший пазл. Ёжик считает пазл хорошим, если никакие два кусочка в нём не совпадают (при сравнении кусочки разрешается поворачивать, но не переворачивать).

Ваша задача — для данной картины посчитать количество хороших пазлов, которые можно получить из неё, а также вывести пазл с самым маленьким размером кусочка.

Входные данные

В первой строке записаны два числа A и B — размеры картины. Это целые положительные числа, не превосходящие 20.

Далее идут A строк по B символов, описывающих саму картину. Строки состоят только из заглавных букв английского алфавита.

Выходные данные

В первой строке выведите количество возможных хороших пазлов (иными словами, это количество таких пар (X, Y), что пазл с соответствующими размерами элементов будет хорошим). Это число должно быть всегда положительным, потому что вся картина тоже считается хорошим пазлом.

Во второй строке выведите два числа — размеры X и Y самого маленького возможного элемента среди всех хороших пазлов. Сравнение производится в первую очередь по площади XY одного элемента, во вторую очередь — по длине X.

Примечание

В первом примере получаются следующие хорошие пазлы: (2, 1), (2, 2), (2, 4).

A. Кодовый замок

реализация *800

Скрудж МакДак держит свои самые сокровенные сбережения в сейфе, защищенном кодовым замком. Каждый раз, когда он кладет туда новые честно заработанные драгоценности, он вынужден открывать замок.

Кодовый замок представляет собой n вращающихся дисков с написанными на них цифрами от 0 до 9. Скрудж МакДак должен повернуть некоторые из дисков так, чтобы последовательность цифр на дисках образовала секретную комбинацию. За одно действие он может прокрутить один из дисков на одну цифру вперед или назад. В частности, за одно действие можно перейти от цифры 0 к цифре 9 и наоборот. Какое минимальное количество действий ему для этого потребуется?

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 1000) — количество дисков на кодовом замке.

Во второй строке записана строка из n цифр — исходное положение дисков.

В третьей строке записана строка из n цифр — комбинация Скруджа МакДака, открывающая замок.

Выходные данные

Выведите единственное целое число — минимальное количество действий, за которое Скрудж МакДак откроет замок.

Примечание

В примере требуется 13 действий:

  • 1 диск:
  • 2 диск:
  • 3 диск:
  • 4 диск:
  • 5 диск:

B. Школьные оценки

жадные алгоритмы реализация *1700

Вовочка учится программированию в элитной школе. Вовочка и его одноклассники по плану должны написать n контрольных работ, за каждую из которых можно получить оценку от 1 до p. Вовочка очень умный и способен любую контрольную написать на любой балл, однако он не хочет сильно выделяться из толпы. Если сумма его баллов за все контрольные превысит значение x, то одноклассники заметят, что он умный, и начнут надоедать просьбами дать списать домашнюю работу. А если медиана его оценок будет меньше y баллов (определение медианы дано в примечании), то мама решит, что он получает слишком много плохих оценок, и запретит ему играть в компьютерные игры.

Вовочка уже написал k контрольных и получил за них оценки a1, ..., ak. Он не хочет допустить ни первой, ни второй из вышеописанных ситуаций, и теперь ему надо определить, какие же оценки он должен получить за оставшиеся контрольные. Помогите ему в этом.

Входные данные

В первой строке записано 5 целых чисел через пробел: n, k, p, x и y (1 ≤ n ≤ 999, n — нечетное, 0 ≤ k < n, 1 ≤ p ≤ 1000, n ≤ x ≤ n·p, 1 ≤ y ≤ p). Здесь n — количество контрольных, которое должен написать Вовочка по плану, k — количество контрольных, которые он уже написал, p — максимальная возможная оценка за контрольную, x — максимальная сумма баллов, при которой одноклассники ещё не пристают к Вовочке с просьбами, y — минимальный медианный балл, при котором мама ещё разрешает ему играть в компьютер.

Во второй строке следуют k целых чисел, разделённых пробелами: a1, ..., ak (1 ≤ ai ≤ p) — оценки, которые Вовочка получил за уже написанные контрольные.

Выходные данные

Если Вовочке не удастся добиться желаемого результата, выведите «-1».

Иначе выведите n - k целых чисел через пробел — оценки, которые должен получить Вовочка на оставшихся контрольных. Если существует несколько возможных решений, выведите любое из них.

Примечание

Медиана последовательности a1, ..., an при нечетном n (в этой задаче n всегда нечетное) — это элемент, стоящий на (n + 1) / 2-й позиции в порядке следования всех ai по неубыванию.

В первом примере сумма баллов равна 3 + 5 + 4 + 4 + 1 = 17, что не превышает 18, а значит, Вовочке не будут надоедать его одноклассники. А медианный балл последовательности {1, 3, 4, 4, 5} равен 4, что не меньше 4, и поэтому мама разрешит Вовочке играть в компьютер.

Обратите внимание, что не требуется максимизировать сумму баллов или медианный балл. Любой из ответов «4 2», «2 4», «5 1», «1 5», «4 1», «1 4» на первый тест является правильным.

Во втором примере Вовочка получил три пятерки, поэтому, даже если он получит еще две единицы, сумма баллов станет равна 17, а это больше требуемого значения 16. Поэтому ответ на этот тест — «-1».

E. Бесконечные инверсии

Бинарный поиск Деревья реализация сортировки Структуры данных *2100

Есть бесконечная последовательность, состоящая из всех положительных целых чисел в порядке возрастания: p = {1, 2, 3, ...}. К ней последовательно применили n операций swap. Операция swap(a, b) меняет местами элементы последовательности на позициях a и b. Требуется найти количество инверсий в получившейся последовательности, т.е. количество таких пар индексов (i, j), что i < j и pi > pj.

Входные данные

В первой строке записано единственное целое число n (1 ≤ n ≤ 105) — количество операций swap, примененных к последовательности.

В каждой из следующих n строк записано по два числа ai и bi (1 ≤ ai, bi ≤ 109, ai ≠ bi) — аргументы операций swap.

Выходные данные

Выведите единственное целое число — количество инверсий в получившейся последовательности.

Примечание

В первом примере последовательность меняется следующим образом: . В ней 4 инверсии, их образуют пары индексов (1, 4), (2, 3), (2, 4) и (3, 4).

A. Набор строк

реализация Строки *1100

У вас есть строка q. Набор из k строк s1, s2, ..., sk называется красивым, если конкатенация этих строк даёт строку q (формально, s1 + s2 + ... + sk = q) и первые символы этих строк различны.

Найдите любой красивый набор строк, либо сообщите, что красивого набора не существует.

Входные данные

В первой строке записано целое положительное число k (1 ≤ k ≤ 26) — количество строк, которое должно быть в красивом наборе.

Второй строкой идёт строка q, состоящая из маленьких букв латинского алфавита. Длина строки лежит в промежутке от 1 до 100 включительно.

Выходные данные

Если искомого набора не существует, тогда в единственной строке выведите «NO» (без кавычек). Иначе в первой строке выведите «YES» (без кавычек) и в следующих k строках выведите искомый красивый набор строк s1, s2, ..., sk.

Если возможных ответов несколько, выведите любой из них.

Примечание

Во втором примере возможно два ответа: {"aaaca", "s"} и {"aaa", "cas"}.

B. Море и острова

Конструктив реализация *1400

Карта некоторого объекта представляет из себя клетчатое поле, состоящее из n строк и n столбцов. Каждая клетка изначально занята морем, но вы можете засыпать песком некоторые из клеток клетчатого поля таким образом, чтобы на карте образовалось ровно k островов. Объединим набор клеток с песком в остров, если из каждой из них можно добраться до каждой из них, перемещаясь только по клеткам с песком, и переходя из клетки с песком в соседнюю с ней по стороне клетку с песком. Клетки называются соседними по стороне, если у них есть общая горизонтальная или вертикальная сторона. Легко видеть, что разные острова не могут пересекаться по клеткам (иначе бы они в объединении давали больший остров).

Найдите способ засыпать некоторые клетки песком таким образом, чтобы на карте n × n образовалось ровно k островов, либо сообщите, что такого способа не существует.

Входные данные

В единственной строке записано два целых положительных числа n, k (1 ≤ n ≤ 100; 0 ≤ k ≤ n2) — размер карты и количество островов, которые должны образоваться.

Выходные данные

Если искомого ответа не существует, выведите «NO» (без кавычек) в единственной строке. Иначе, выведите «YES» в первой строке. В следующих n строках выведите описание карты. Каждая из строк описания должна состоять только из символов 'S' и 'L', где 'S' обозначает клетку, занятую морем, а 'L' обозначает клетку, засыпанную песком. Кроме того, длина каждой строки описания должна быть равна n.

Если существует несколько ответов, разрешается вывести любой.

Максимизировать размер островов не требуется.

A. Игрушечные машинки

реализация *900

Маленькая девочка Сьюзи, благодаря своему старшему брату, любит играть с машинками. Сегодня она решила провести между ними турнир. Процесс турнира описан в следующем абзаце.

Есть n игрушечных машинок. Каждую пару сталкивают между собой. Исход столкновения может быть одним из следующих: ни одна из машинок не перевернулась, одна из них перевернулась, либо обе машинки перевернулись. Машинка считается хорошей, если она не перевернулась ни в одном столкновении. Исходы столкновений заданы матрицей А размера n × n: на пересечении і-й строки и j-го столбца стоит число, описывающие исход столкновения і-й и j-й машинки:

  •  - 1: если эта пара машин не сталкивалась.  - 1 встречается только на главной диагонали матрицы.
  • 0: если при столкновении никакая из машин не перевернулась.
  • 1: если при столкновении перевернулась только i-я машина.
  • 2: если при столкновении перевернулась только j-я машина.
  • 3: если при столкновении перевернулись обе машины.

Сьюзи хочет найти все хорошие машинки. Она быстро определила, какие машины хорошие. А вы справитесь с этим?

Входные данные

В первой строке находится число n (1 ≤ n ≤ 100) — количество машинок.

В следующих n строках следуют по n чисел через пробел, задающие матрицу А.

Гарантируется, что на главной диагонали стоят  - 1, и больше  - 1 в матрице нигде не встречается.

Гарантируется, что входные данные корректны, то есть если Aij = 1, то Aji = 2, если Aij = 3, то Aji = 3, и если Aij = 0, то Aji = 0.

Выходные данные

Выведите количество хороших машин, а в следующей строке их номера через пробел в порядке возрастания.

D. Очередь

жадные алгоритмы реализация сортировки *1300

Маленькая девочка Сьюзи ходила с мамой в магазин, и ей стало интересно, как можно улучшить обслуживание очередей.

В очереди стоит n людей. Для каждого человека известно время ti, необходимое на его обслуживание. Человек будет недоволен, если время его ожидания будет больше, чем время его обслуживания. Временем ожидания человека считается суммарное время обслуживания всех людей, стоящих перед ним в очереди. Сьюзи подумала, что если поменять местами некоторых людей в очереди, то получится уменьшить количество недовольных.

Помогите Сьюзи найти какого максимального количества довольных можно добиться, переставляя людей в очереди местами.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 105).

В следующей строке находятся n целых чисел ti (1 ≤ ti ≤ 109), разделенных пробелами.

Выходные данные

Введите единственное число — максимальное количество довольных людей в очереди.

Примечание

Значение 4 достигается, например, при такой расстановке: 1, 2, 3, 5, 15. Таким образом можно сделать всех, кроме человека с временем 5, довольными.

A. Солдат и бананы

математика Перебор реализация *800

Солдат хочет купить w бананов в магазине. Ему надо заплатить k долларов за первый банан, 2k долларов — за второй и так далее (иными словами, за i-й банан надо заплатить i·k долларов).

У него есть n долларов. Сколько долларов ему придется одолжить у однополчанина, чтобы купить w бананов?

Входные данные

В первой строке записано три положительных целых числа k, n, w (1  ≤  k, w  ≤  1000, 0 ≤ n ≤ 109), стоимость первого банана, изначальное количество долларов у солдата и количество бананов, которые он хочет купить.

Выходные данные

Выведите единственное целое число — количество долларов, которое солдату надо одолжить у однополчанина. Если деньги одалживать не надо, выведите 0.

B. Солдат и значки

жадные алгоритмы Перебор реализация сортировки *1200

У полковника есть n значков. Он хочет дать по значку каждому из n его солдатов. У каждого значка есть коэффициент крутизны, который показывает уровень, достигнутый владельцем значка. Коэффициент крутизны можно увеличить на 1 за одну монету.

Для каждой пары солдат один из них должен получить значок, коэффициент которого строго выше второго. Для солдат не важно, какие у них значения коэффициента, требуется лишь, чтобы их коэффициенты отличались друг от друга.

Полковник знает, какому солдату должен достаться какой значок исходно, но есть вот какая проблема. У некоторых значков может быть одинаковый коэффициент крутизны. Помогите ему и подсчитайте, сколько денег надо суммарно заплатить, чтобы у всех значков были различные коэффициенты крутизны.

Входные данные

Первая строка состоит из единственного целого числа n (1 ≤ n ≤ 3000) — количества солдат.

В следующей строке записано n целых чисел ai (1 ≤ ai ≤ n), обозначающих коэффициент крутизны каждого значка.

Выходные данные

Выведите единственное целое число — минимальное количество монет, которые придется выплатить полковнику.

Примечание

В первом тесте из примера мы можем увеличить коэффициент первого значка на 1.

Во втором тесте из примера мы можем увеличить коэффициенты второго и третьего значка на 1.

A. Майк, лягушка и цветок

жадные алгоритмы математика Перебор реализация *2200

У Майка есть лягушка и цветок. Его лягушку зовут Xaniar, а его цветок зовут Abol. Изначально (в момент времени 0), высота Xaniar равна h1 и высота Abol равна h2. Каждую секунду Mike поливает Abol и Xaniar.

Если сейчас высота Xaniar равна h1, а высота Abol равна h2, то через секунду высота Xaniar будет равна , а высота Abol будет равна , где x1, y1, x2 и y2 — некоторые целые числа, а обозначает остаток от целочисленного деления a на b.

Майк — фанат спортивного программирования. Он хочет знать через какое время высота Xaniar станет равна a1 и высота Abol станет равна a2 в первый раз.

Майк попросил Вас помочь ему. Вычислите минимальное время или же скажите, что требуемое событие никогда не произойдет.

Входные данные

В первой строке ввода записано целое число m (2 ≤ m ≤ 106).

Во второй строке ввода записаны целые числа, h1 и a1 (0 ≤ h1, a1 < m).

В третьей строке ввода записаны целые числа, x1 и y1 (0 ≤ x1, y1 < m).

В четвертой строка ввода записаны целые числа, h2 и a2 (0 ≤ h2, a2 < m).

В пяятой строке ввода записаны целые числа, x2 и y2 (0 ≤ x2, y2 < m).

Гарантируется, что h1 ≠ a1 и h2 ≠ a2.

Выходные данные

Выведите минимальное количество секунд, необходмое до того момента, как Xaniar достигнет высоты a1, а Abol достигнет высоты a2, а если же это никогда не произойдёт, выведите -1.

Примечание

В первом тесте из условия высоты меняются следующим образом:

Xaniar:

Abol:

A. Майк и факс

Перебор реализация Строки *1100

Пока Майк гулял по метро, всё посыпалось из его рюкзака прямо на землю. В его рюкзаке было несколько факс-сообщений. Майк конкатенировал эти строки в некоторым порядке и теперь у него есть строка s.

Он не уверен, его ли это рюкзак или чужой. Он помнит, что в его рюкзаке было ровно k сообщений, каждое сообщение представляло собой строку-палиндром, и у всех этих строк была однаковая длина.

Он просит вас помочь ему и сказать, свой ли рюкзак он подобрал. Проверьте, является ли данная строка s конкатенацией из k палиндромов одинаковой длины.

Входные данные

В первой строке ввода записана строка s, содержащая строчные буквы латиницы (1 ≤ |s| ≤ 1000).

Во второй строке записано целое число k (1 ≤ k ≤ 1000).

Выходные данные

Выведите "YES" (без кавычек), если юноша нес свой собственный рюкзак, в противном случае выведите "NO" (без кавычек).

Примечание

Палиндром — это строка, которая одинаково читается в обе стороны.

Во втором примере сообщения в рюкзаке могут быть "saddas" и "tavvat".

B. Майк и весёлая игра

дп жадные алгоритмы Перебор реализация *1400

Майк с некоторыми мишками играют в веселую игру. Майк — судья. Все медведи, кроме Майка, стоят на клетчатом поле размера n × m, в каждой клетке стоит ровно по медведю. Обозначим медведя на пересечении столбца номер j и строки номер i как (i, j). Майк держит руки на ушах (так как он судья), а каждый медведь стоящий на поле, закрывает лапами рот или глаза.

Медведи разыгрывают q раундов. В каждом раунде Майк выбирает медведя (i, j) и говорит ему поменять своё состояние, то есть, если медведь закрывает лапами рот, то он должен переместить лапы на глаза, а в противном случае — закрыть лапами рот. После этого Майк хочет знать счёт медведей.

Счет медведей — это максимальное по всем строкам количество стоящих подряд медведей с лапами на глазах в этой строке.

Медведи ленивые, поэтому Майк попросил Вас помочь ему. Для каждого раунда, назовите ему счет медведей после того, как поменет своё состояние выбранный в этом раунде медведь.

Входные данные

В первой строке находится три целых числа, n, m и q (1 ≤ n, m ≤ 500 и 1 ≤ q ≤ 5000).

В следующих n строках задано описание поля. Каждая строка состоит из m целых чисел, разделенных пробелами. Каждое из этих чисел равно либо 0 (закрывается рот), либо 1 (закрываются глаза).

В следующих q строках записана информация о раундах. В каждой из них записано два целых числа, i и j (1 ≤ i ≤ n and 1 ≤ j ≤ m), номер строки и столбца медведя, меняющего состояние.

Выходные данные

После каждого раунда выведите текущий счет медведей.

A. Определение лиц

реализация Строки *900

Разработчикам Looksery необходимо написать эффективный алгоритм определения лиц на изображении. К сожалению, они сейчас заняты тем, что готовят для вас соревнование, поэтому вам придется сделать это за них.

В рамках данной задачи изображением называется прямоугольная таблица, состоящая из строчных букв латинского алфавита. Лицом на изображении называется квадрат 2 на 2 элемента, такой, что из четырёх букв этого квадрата можно составить слово «face».

Вам необходимо написать программу, которая определяет количество лиц на изображении. Квадраты, соответствующие лицам, могут пересекаться.

Входные данные

В первой строке через пробел заданы два числа n и m (1 ≤ n, m ≤ 50) — соответственно высота и ширина изображения.

Следующие n строк задают изображение. Каждая строка содержит m строчных букв латинского алфавита.

Выходные данные

В единственной строке выведите количество лиц на изображении.

Примечание

В первом примере на изображении находится одно лицо, расположенное в квадрате с верхним левым углом во второй строке и втором столбце:

Во втором примере на изображении также находится ровно одно лицо, его верхний левый угол находится во второй строке и первом столбце.

В третьем примере изображены два лица:

В четвертом примере на изображении лиц нет.

D. Признаки Хаара

жадные алгоритмы реализация *1900

Первый алгоритм для определения лиц на изображении, который работает в реальном времени, был разработан Paul Viola и Michael Jones в 2001 году. Частью алгоритма является процедура, вычисляющая признаки Хаара. В рамках данной задачи мы рассмотрим упрощённую модель данного понятия.

Рассмотрим прямоугольное изображение, представляющее собой таблицу размера n × m. Элементы таблицы являются целыми числами, задающими яркость каждого пикселя в изображении.

Признак также представляет из себя прямоугольную таблицу размера n × m. Каждая ячейка признака покрашена в черный или белый цвет.

Чтобы вычислить значение данного признака на данном изображении, необходимо произвести следующие шаги. Сначала таблица признака совмещается с таблицей изображения (без переворотов или отражений), таким образом, каждый пиксель оказывается целиком покрыт либо черным, либо белым цветом. Значением признака на изображении называется величина W - B, где W — суммарная яркость пикселей изображения, покрытых белыми ячейками признака, а B — суммарная яркость пикселей, покрытых черными ячейками признака.

Ниже изображены примеры наиболее популярных признаков Хаара.

Ваша задача будет заключаться в определении числа операций, которые необходимы для подсчёта признака с помощью так называемых префиксных прямоугольников.

Префиксным прямоугольником называется любой прямоугольник на изображении, левый верхний угол которого совпадает с левым верхним углом изображения.

У вас есть переменная value, значение которой исходно равняется нулю. За одну операцию вы можете посчитать сумму значений пикселей на любом префиксном прямоугольнике, умножить её на любое целое число и прибавить к переменной value.

Вам задан признак. Необходимо посчитать минимальное число операций, которое требуется для вычисления значения этого признака на произвольном изображении. Для лучшего понимания условия, прочтите объяснение первого примера.

Входные данные

В первой строке через пробел заданы два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов в признаке.

Следующие n строк содержат описание признака. Каждая строка состоит из m символов, j-й символ i-й строки равен «W», если этот элемент признака имеет белый цвет и «B», если черный.

Выходные данные

Выведите одно число — минимальное количество операций, которое необходимо произвести, чтобы вычислить значение признака.

Примечание

Первый пример соответствует признаку B, изображенному на картинке. Значение этого признака на изображении размера 6 × 8 равняется разности суммарной яркости пикселей в нижней и верхней половине изображения. Для вычисления его значения необходимо выполнить следующие две операции:

  1. Прибавить сумму пикселей на префиксном прямоугольнике с нижним правым углом в 6 строке и 8 столбце с коэффициентом 1 к переменной value (красной рамкой обозначен прямоугольник);
  2. Прибавить сумму пикселей на префиксном прямоугольнике с нижним правым углом в 3 строке и 8 столбце с коэффициентом  - 2 и переменной value.

Таким образом, все пиксели в нижних трёх строках изображения войдут с коэффициентом 1, а все пиксели в верхних трёх строках изображения войдут с коэффициентом 1 - 2 =  - 1, что и требуется.

A. Путешествие блохи

математика реализация *1200

На одной из n расположенных по кругу кочек сидит блоха. Каждую минуту блоха делает прыжок. В k-ую от начала минуту она прыгает через k - 1 кочку (по часовой стрелке) от той, на которой стоит (в частности: в первую минуту она прыгает на соседнюю по часовой стрелке кочку). Вам требуется написать программу, которая определит, посетит ли блоха все кочки (считайте, что прыгает она сколь угодно долго).

Входные данные

В единственной строке находится натуральное число 1 ≤ n ≤ 1000 — количество кочек.

Выходные данные

Выведите "YES", если блоха посетит все кочки, "NO" — иначе.

A. Две подстроки

дп жадные алгоритмы Перебор реализация Строки *1500

Дана строка s. Требуется определить, существуют ли в данной строке s две непересекающиеся подстроки "AB" и "BA" (подстроки могут идти в любом порядке).

Входные данные

На вход подаётся строка s длиной от 1 до 105 символов, состоящая из заглавных букв латинского алфавита.

Выходные данные

Выведите "YES" (без кавычек), если строка s содержит две непересекающиеся подстроки "AB" и "BA", и "NO" иначе.

Примечание

В первом примере входных данных, несмотря на то, что есть подстроки "AB" и "BA", их вхождения пересекаются, поэтому ответ — "NO".

Во втором примере входных данных есть следующие вхождения подстрок: BACFAB.

В третьем примере нет ни подстроки "AB", ни подстроки "BA".

D. Регулярный мост

графы Конструктив реализация *1900

Неориентированный граф называется k-регулярным, если степени всех его вершин равны k. Ребро связного графа называется мостом, если после его удаления граф распадается на две компоненты связности.

Постройте неориентированный связный k-регулярный граф, содержащий по крайней мере один мост, либо определите, что такого графа не существует.

Входные данные

В единственной строке входных данных содержится целое число k (1 ≤ k ≤ 100) — требуемая степень вершин регулярного графа.

Выходные данные

Выведите "NO" (без кавычек), если искомого графа не существует.

Иначе выведите "YES" в первой строке и описание любого подходящего графа в последующих строках.

Описание построенного графа должно начинаться с чисел n и m — количества вершин и ребер соответственно.

Последующие m строк должны содержать по два целых числа a и b (1 ≤ a, b ≤ n, a ≠ b), означающих, что существует ребро, соединяющее данные вершины. Граф не должен содержать кратных ребер, а также ребер, ведущих из вершины в саму себя. Граф должен быть связным, степени всех вершин графа должны равняться k. Хотя бы одно ребро графа должно быть мостом. Ребра графа можно выводить в любом порядке. Концы каждого ребра можно выводить в любом порядке.

Построенный граф должен содержать не более 106 вершин и не более 106 ребер (гарантируется что, если хотя бы один граф, удовлетворяющий требованиям, существует, то существует и граф с не более, чем 106 вершин и не более, чем 106 рёбер).

Примечание

В примере из условия подходит граф из двух вершин, соединенных единственным ребром.

E. Скобки в импликациях

жадные алгоритмы Конструктив математика реализация *2200

Напомним, что импликация — это функция от двух логических аргументов, значение которой ложно тогда и только тогда, когда значение первого аргумента истинно, а второго аргумента ложно.

Для записи импликации используется символ '', а аргументы и результат импликации обозначаются '0' (ложное значение, false) и '1' (истинное значение, true). По определению импликации:

Когда логическое выражение содержит несколько импликаций, то при отсутствии скобок оно будет вычисляться слева направо. Например,

.

При наличии скобок сперва вычисляется выражение в скобках. Например,

.

Для заданного логического выражения определите, можно ли расставить в нем скобки так, чтобы значение логического выражения было ложно. Если это возможно, требуется найти такую расстановку скобок.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 100000) — количество аргументов в логическом выражении.

Вторая строка содержит n чисел a1, a2, ..., an (), обозначающих значения аргументов в выражении в порядке следования.

Выходные данные

Выведите "NO" (без кавычек), если расставить в выражении скобки так, чтобы его значение равнялось 0, невозможно.

Иначе выведите "YES" в первой строке и логическое выражение с нужной расстановкой скобок во второй строке.

Выражение должно содержать только символы '0', '1', '-' (символ с ASCII кодом 45), '>' (символ с ASCII кодом 62), '(' и ')'. Символы '-' и '>' могут встречаться в выражении только в паре ("->") и обозначают импликацию. Суммарное количество логических аргументов (т. е. цифр '0' и '1') в выражении должно равняться n. Порядок следования цифр в выражении слева направо должен совпадать с a1, a2, ..., an.

Выражение должно быть правильным. Более формально, правильное выражение определяется следующим образом:

  • Выражения "0", "1" (без кавычек) — правильные.
  • Если v1, v2 — правильные выражения, то v1->v2 — правильное выражение.
  • Если v — правильное выражение, то (v) — правильное выражение.

Общее количество символов в полученном выражении не должно превысить 106.

Если возможных ответов несколько, разрешается вывести любой.

A. GukiZ и контест

Перебор реализация сортировки *800

Профессору GukiZ нравятся контесты по программированию. Особенно ему нравится оценивать своих учеников по подготовленным им контестам. Сейчас он подготовил очередной контест.

Всего на занятия ходят n учеников, и до начала контеста у каждого из них есть рейтинг — некоторое положительное целое число. Ученики пронумерованы от 1 до n. Обозначим рейтинг i-го ученика за ai. GukiZ ожидает, что его ученики займут места согласно своим рейтингам.

Он считает, что каждый ученик займет место, равное . В частности, если у ученика A рейтинг строго ниже, чем у ученика B, ученик A займёт строго худшее место, чем ученик B, а если у двух учеников равные рейтинги, они разделят одно и то же место.

GukiZ хотел бы, чтобы вы определили, какие места займут ученики, если всё пойдёт именно так, как он ожидает. Помогите ему в этом.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 2000), количество учеников у GukiZ.

Во второй строке записано n чисел a1, a2, ... an (1 ≤ ai ≤ 2000), где ai — это рейтинг i-ого ученика (1 ≤ i ≤ n).

Выходные данные

В единственной строке выведите для каждого из n учеников место, которое он должен занять на контесте, в том же порядке, в котором они появляются во вводе.

Примечание

В первом примере ученики под номерами 2 и 3 расположены на первом месте (как ученики с самым высоким рейтингом), а ученик под номером 1 занимает третье место, так как есть ровно два ученика с рейтингом выше.

Во втором примере первый ученик является единственным, кто участвует в контесте.

В третьем примере ученики 2 и 5 делят первое место с наибольшим рейтингом, далее следует ученик 4 на третьем месте, а ученики номер 1 и 3 делят четвертое место.

B. ZgukistringZ

Конструктив Перебор реализация Строки *1800

Профессор GukiZ не всегда принимает строки такими, какие они есть. Получая строку, он иногда переставляет местами некоторые буквы в строке, таким образом, чтобы получалась новая строка.

У GukiZ есть строки a, b, и c. Он хочет получить строку k, поменяв местами некоторые буквы в a, так, чтобы в k содержалось как можно больше непересекающихся подстрок, равных либо b, либо c. Подстрока строки x — это строка, сформированная непрерывным подотрезком символов из x. Две подстроки строки x пересекаются, если есть такая позиция i в строке x, которая принадлежит обеим этим подстрокам.

GukiZ был разочарован, когда ни один из его учеников не смог решить эту задачу. Сможете помочь им и найти одну из возможных строк k?

Входные данные

В первой строке записана строка a, во второй строке записана строка b, а в третьей строке записана строка c (1 ≤ |a|, |b|, |c| ≤ 105, где |s| обозначает длину строки s).

Все три строки содержат только строчные буквы английского алфавита.

Строки b и c не обязательно различны.

Выходные данные

Найдите одну из возможных строк k, отвечающую описанию, данному в условии задачи. Если есть несколько возможных ответов, выведите любой.

Примечание

В третьем примере у данного оптимального решения есть три непересекающиеся подстроки, равные либо b, либо c в позициях 1 – 2 (ab), 3 – 4 (ab), 5 – 7 (aca). В этом примере существует много других оптимальных решений, одно из них: acaababbcc.

D. GukiZ и двоичные операции

Комбинаторика математика матрицы реализация теория чисел *2100

Все мы знаем, что GukiZ часто играет с массивами.

Сейчас она размышляет над следующим вопросом: сколько существует массивов a длины n, состоящих из неотрицательных целых чисел строго меньше 2l, удовлетворяющих условию ? Здесь операция означает побитовое И (в языке Pascal она обозначается как and, на языке C/C++/Java/Python она обозначается как &), операция означает побитовое ИЛИ (на языке Pascal она обозначается как , наC/C++/Java/Python она обозначается |).

Так как ответ может быть достаточно большим, посчитайте его по модулю m. В этот раз GukiZ не придумал решения и ему нужно, чтобы вы помогли ему!

Входные данные

В первой и единственной строке входа записано четыре целых числа n, k, l, m (2 ≤ n ≤ 1018, 0 ≤ k ≤ 1018, 0 ≤ l ≤ 64, 1 ≤ m ≤ 109 + 7).

Выходные данные

В единственной строке выведите количество массивов, удовлетворяющих данному выше условию, по модулю m.

Примечание

В первом примере подходящие массивы таковы: {1, 1}, {3, 1}, {1, 3}.

Во втором примере единственный подходящий массив: {1, 1}.

В третьем примере подходящие массивы: {0, 3, 3}, {1, 3, 2}, {1, 3, 3}, {2, 3, 1}, {2, 3, 3}, {3, 3, 0}, {3, 3, 1}, {3, 3, 2}, {3, 3, 3}.

E. GukiZ и GukiZiana

Бинарный поиск реализация Структуры данных *2500

Профессор GukiZ опять играет с массивами. Он случайно открыл новую функцию, которую назвалGukiZiana. Для данного массива a, проиндексированного целыми числами от 1 до n, и числа y, GukiZiana(a, y) определяется как максимальное возможное значение j - i, где числа j и i таковы, что aj = ai = y. Если же y не встречается в a как элемент, то GukiZiana(a, y) полагается равной  - 1. GukiZ также подготовил для вас задачу. На этот раз у вас есть два типа запросов:

  1. Запрос первого типа имеет вид 1 l r x, данный запрос означает, что все ai, такие, что l ≤ i ≤ r, должны быть увеличены на неотрицательное целое значение x.
  2. Запрос второго типа имеет вид 2 y, данный запрос означает, что надо определить значение GukiZiana(a, y).

Для каждого запроса типа 2 выведите ответ, и порадуйте этим GukiZ!

Входные данные

В первой строке записано два целых числа n, q (1 ≤ n ≤ 5·105, 1 ≤ q ≤ 5·104), размер массива a, и количество запросов.

Во второй строке записано n целых чисел a1, a2, ... an (1 ≤ ai ≤ 109), формирующих массив a.

Каждая из последующих q строк содержит либо четыре, либо два числа, как описано в условии задачи:

Если строка начинается с 1, то данный запрос выглядит следующим образом: 1 l r x (1 ≤ l ≤ r ≤ n, 0 ≤ x ≤ 109) и представляет собой запрос первого типа.

Если строка начинается с 2, то данный запрос выглядит следующим образом: 2 y (1 ≤ y ≤ 109), и представляет собой запрос второго типа.

Выходные данные

Для каждого запроса типа 2, выведите GukiZiana(a, y) для значения y из данного запроса.

A. Ваня и таблица

математика реализация *1000

У Вани есть таблица, состоящая из 100 строк по 100 клеток. Строки пронумерованы числами от 1 до 100 снизу вверх, столбцы пронумерованы числами от 1 до 100 слева направо.

В этой таблице Ваня выбрал n прямоугольников со сторонами, проходящими по границам клеток (некоторые прямоугольники, возможно, встречаются несколько раз). После этого для каждой клетки таблицы он подсчитал, скольким прямоугольникам она принадлежит, и записал в нее это число. Теперь он хочет найти сумму значений во всех клетках таблицы, и, поскольку таблица слишком большая, он просит у вас помощи найти результат.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100) — количество прямоугольников.

Каждая из последующих n строк содержит по четыре целых числа x1, y1, x2, y2 (1 ≤ x1 ≤ x2 ≤ 100, 1 ≤ y1 ≤ y2 ≤ 100), где x1 и y1 — номера столбца и строки левой нижней клетки, а x2 и y2 — номера столбца и строки правой верхней клетки очередного прямоугольника.

Выходные данные

В единственной строке выведите сумму всех значений в клетках таблицы.

Примечание

Пояснение к первому тесту из условия:

Значения таблицы в первых трёх строках и столбцах будут такими:

121

121

110

Соответственно, сумма значений будет равна 10.

Пояснение ко второму тесту из условия:

Значения таблицы в первых трёх строках и столбцах будут такими:

222

222

222

Соответственно сумма значений будет равна 18.

B. Ваня и книги

математика реализация *1200

Ване поручено важное задание — он должен пронумеровать книжки в библиотеке, поставив на каждую бирку книжку с её номером. Каждая из n книг должна получить номер от 1 до n, причем, разумеется, разные книги должны получить разные номера.

Ваня хочет узнать, какое количество цифр ему придётся написать, подписывая все бирки.

Входные данные

В первой строке содержатся целое число n (1 ≤ n ≤ 109) — количество книг в библиотеке.

Выходные данные

Выведите количество цифр, нужных для того, чтобы пронумеровать все книги.

Примечание

Пояснение к первому тесту. Книги получат номера 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, что в сумме даёт 17 цифр.

Пояснение ко второму тесту. Книги получат номера 1, 2, 3, 4, что в сумме даёт 4 цифры.

E. Ваня и скобки

дп жадные алгоритмы Перебор Разбор выражений реализация Строки *2100

Ваня делает домашнее задание по математике. У него есть выражение типа , где x1, x2, ..., xn — цифры от 1 до 9, а знаком обозначается либо плюс '+' либо знак умножения '*'. Ване нужно поставить в этом выражении одну пару скобок так, чтобы максимизировать значение полученного выражения.

Входные данные

В первой строке содержится выражение s (1 ≤ |s| ≤ 5001, |s| нечётно), в котором на нечетных позициях находятся только цифры от 1 до 9, а на чётных только знаки  +  и  * .

Количество знаков  *  не превосходит 15.

Выходные данные

В первой строке выведите максимальное возможное значение выражения.

Примечание

Пояснение к первому тесту из условия. 3 + 5 * (7 + 8) * 4 = 303.

Пояснение к второму тесту из условия. (2 + 3) * 5 = 25.

Пояснение к третьему тесту из условия. (3 * 4) * 5 = 60 (также подходит множество других вариантов, например, (3) * 4 * 5 = 60).

B. Кёя и перестановка

Бинарный поиск жадные алгоритмы Комбинаторика Конструктив математика реализация *1900

Определим перестановку длины n как последовательность p = [p1, p2, ..., pn], состоящую из n различных целых чисел от 1 до n. Мы говорим, что эта перестановка переводит число 1 в число p1, число 2 в число p2, и так далее.

Кёя Оотори только что узнал про циклическое разложение перестановки. Цикл — это последовательность чисел, таких, что каждый элемент этой последовательности переводится перестановкой p в следующий элемент этой последовательности (а последний элемент цикла переводится в первый элемент цикла). Циклическое разложение — это представление p в виде набора циклов, образующих p. Например, перестановка p = [4, 1, 6, 2, 5, 3] имеет циклическое разложение, которое выглядит как (142)(36)(5): действительно, 1 переводится в 4, 4 переводится в 2, 2 переводится в 1, 3 и 6 меняются местами, и 5 остаётся на месте.

Перестановка может иметь несколько циклических разложений, поэтому Кёя определяет стандартное циклическое разложение перестановки следующим образом. Сперва переставим элементы внутри каждого цикла таким образом, чтобы наибольший элемент был на первом месте. Затем переставим все циклы так, чтобы они были отсортированы по их первому элементу. Для данного выше примера стандартное циклическое разложение чисел [4, 1, 6, 2, 5, 3] равно (421)(5)(63).

Кёя заметил, что если убрать скобки внутри стандартного циклического разложения, то мы получаем ещё одну перестановку! Например, [4, 1, 6, 2, 5, 3] превращается в [4, 2, 1, 5, 6, 3].

Кёя заметил, что некоторые перестановки не меняются после применения операции, описанной выше. Он выписал все перестановки длины n, которые не меняются в результате применения описанной операции, в лексикографическом порядке. К сожалению, его друг Тамаки Суо этот список потерял. Кёя хочет воспроизвести список и ему нужна ваша помощь. Вам даны целые числа n и k, выведите перестановку, которая была k-й в списке Кёи.

Входные данные

В первой строке записано два целых числа n, k (1 ≤ n ≤ 50, 1 ≤ k ≤ min{1018, l}, где l — это длина списка Кёи).

Выходные данные

Выведите через пробел n целых чисел, обозначающих перестановку, являющуюся ответом на вопрос.

Примечание

В первом тесте из условия стандартное циклическое разложение выглядит как (1)(32)(4), что дает нам изначальную перестановку после удаления скобок. Первая перестановка в списке равна [1, 2, 3, 4], а вторая перестановка равна [1, 2, 4, 3].

A. Дело о матрешках

реализация *1500

Андроид Андреид — известный на всю галактику детектив. Сейчас он расследует дело о вандализме на выставке современного искусства.

Главный экспонат выставки — конструкция из n матрешек — кукол, которые можно вкладывать друг в друга. Матрешки пронумерованы от 1 до n. Матрешку с меньшим номером можно вложить в матрешку с большим номером, при этом две матрешки не могут вкладываться непосредственно в одну и ту же матрешку, но возможны цепочки вложения, например, 1 → 2 → 4 → 5.

За одну секунду можно произвести любую из двух следующих операций.

  • Если есть матрёшка a, никуда не вложенная, и матрёшка b, причём b не содержит никаких матрёшек и не вложена ни в какую другую матрёшку, можно поместить a в b;
  • Если матрёшка a непосредственно содержится в матрёшке b, причём b не вложена ни в какую другую матрёшку, можно достать a из b.

Согласно современным эстетическим нормам матрешки на выставке были собраны в определенной конфигурации, то есть в виде нескольких отдельных цепочек вложенных матрёшек, однако преступник, следуя загадочному плану, разобрал все матрёшки и собрал их в одну большую цепочку (1 → 2 → ... → n). Для продолжения расследования Андреиду необходимо узнать, за какое минимальное время это возможно сделать.

Входные данные

В первой строке даны целые числа n (1 ≤ n ≤ 105) и k (1 ≤ k ≤ 105) — количество матрешек и цепочек матрёшек в изначальной конфигурации.

В следующих k строках даны описания цепочек: в i-й строке сначала идет число mi (1 ≤ mi ≤ n), а затем mi чисел ai1, ai2, ..., aimi — номера матрешек в цепочке (матрёшка ai1 вложена в матрёшку ai2, которая вложена в матрёшку ai3, и так вплоть до матрёшки aimi, которая не вложена ни в какую другую матрёшку).

Гарантируется, что m1 + m2 + ... + mk = n, номера всех матрешек во всех цепочках различны, в каждой цепочке номера матрешек идут по возрастанию.

Выходные данные

В единственной строке выведите минимальное количество секунд, за которое можно из изначальной конфигурации собрать одну большую цепочку.

Примечание

В первом тесте из условия есть две цепочки: 1 → 2 и 3. За одну секунду можно вложить первую цепочку во вторую и получить 1 → 2 → 3.

Во втором тесте из условия требуется разобрать все три цепочки на отдельные матрёшки за 2 + 1 + 1 = 4 секунды, и собрать из них одну большую цепочку за 6 секунд.

D. Дело повышенной секретности

Бинарный поиск математика реализация *2500

Андроид Андреид — известный на всю галактику детектив. Сейчас он занят особо секретным делом, детали которого не подлежат разглашению.

Однако ему требуется помощь при проведении одного следственного эксперимента. На плоскости ставятся n колышков, пронумерованных от 1 до n, координаты i-го из них — (xi, 0). Затем за один из колышков снизу привязывают груз на натянутой веревке длины l (таким образом, его координаты будут равны (xi,  - l), где i — номер использованного колышка), после чего этот груз толкают вправо, так, что он начинает вращаться против часовой стрелки. При этом, если груз в процессе вращения цепляется за какой-то из колышков, то он начинает вращаться уже вокруг этого колышка. Можно предположить, что каждый колышек в отдельности достаточно тонкий, и не влияет на длину верёвки груза, который вокруг него вращается.

Более формально, если в некоторый момент времени отрезок верёвки содержит один или несколько колышков кроме того, вокруг которого сейчас вращается груз, то далее груз будет вращаться вокруг наиболее удалённого из них на более коротком отрезке верёвки. В частности, если отрезок верёвки задевает своим концом некоторый колышек, то считается, что груз начинает вращаться вокруг этого колышка на отрезке верёвки длины 0.

Рано или поздно груз начнёт вращаться вокруг некоторого колышка, не задевая остальные колышки. Андреид заинтересован в определении номера этого колышка.

Андреид подготовил m вариантов начальных условий для запуска груза, помогите ему определить для каждого из них, вокруг какого колышка будет в конце концов вращаться груз.

Входные данные

В первой строке даны целые числа n и m (1 ≤ n, m ≤ 2·105) — количество колышков и вариантов запуска.

В следующей строке даны n целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109) — координаты колышков. Гарантируется, что координаты всех колышков — различные целые числа.

В следующих m строках даны описания вариантов запусков груза, каждое состоит из двух целых чисел ai (1 ≤ ai ≤ n) и li (1 ≤ li ≤ 109) — номера стартового колышка и длины веревки.

Выходные данные

Выведите m строк, в i-й из них должен быть номер колышка, вокруг которого в конце концов будет вращаться груз после i-го запуска.

Примечание

Иллюстрация к первому тесту из условия:

Иллюстрация ко второму тесту из условия:

Обратите внимание, что в последнем запуске груз в итоге начинает вращаться вокруг первого колышка на отрезке верёвки длины 0.

B. Дело о поддельных шестеренках

Перебор реализация *1100

Андроид Андреид — известный на всю галактику детектив. Сейчас он расследует дело о мошенниках, подделывающих знаменитые шестеренки Стоппа, такую же популярную сейчас головоломку, какой был когда-то кубик Рубика.

Самыми важными ее компонентами являются кнопка и ряд из n одинаковых шестеренок. Каждая шестерёнка имеет n зубцов, на которых написаны в порядке против часовой стрелки все числа от 0 до n - 1. При нажатии кнопки первая шестеренка поворачивается по часовой стрелке, за ней поворачивается вторая шестерёнка против часовой стрелки, за ней третья по часовой стрелке и так далее.

Также у каждой шестеренки есть ровно один активный зубец. При повороте шестерёнки новым активным зубцом становится следующий за текущим активным в соответствии с направлением поворота. Например, если n = 5, а активным зубчиком является тот, на котором написано число 0, то при повороте по часовой стрелке активным станет зубчик с числом 1, а при повороте против часовой — зубчик с числом 4.

Андреид помнит, что настоящая головоломка обладает следующим свойством: можно так нажать на кнопку несколько раз, что в итоге числа на активных зубчиках шестеренок с первой по последнюю образуют последовательность 0, 1, 2, ..., n - 1. Напишите программу, определяющую, является ли данный экземпляр головоломки настоящим или поддельным.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 1000) — количество шестерёнок.

Во второй строке заданы n чисел a1, a2, ..., an (0 ≤ ai ≤ n - 1) — последовательность активных зубчиков: на активном зубчике i-й шестеренки написано число ai.

Выходные данные

В единственной строке выведите "Yes" (без кавычек), если данный экземпляр шестеренок Стоппа настоящий, и "No" (без кавычек) в ином случае.

Примечание

В первом тесте из условия при первом нажатии кнопки последовательность активных зубчиков станет 2 2 1, а при втором — 0 1 2.

A. Илья и дипломы

жадные алгоритмы математика реализация *1100

Совсем скоро в Берляндии будет проведена школьная олимпиада по информатике, в которой будут участвовать n школьников.

На собрании жюри олимпиады было принято решение о том, что каждый из n участников, в зависимости от результатов, должен будет получить диплом первой, второй или третьей степени. Таким образом, каждый школьник получит ровно один диплом.

Также было решено, что дипломов первой степени должно быть выдано не менее min1 штук и не более max1 штук, дипломов второй степени должно быть выдано не менее min2 штук и не более max2 штук, а дипломов третьей степени — не менее min3 штук и не более max3 штук.

После некоторых обсуждений было решено выбрать из всех вариантов раздачи дипломов, удовлетворяющих описанным ограничениям, такой, который максимизирует количество участников, которые получат дипломы первой степени. Из всех таких вариантов будет выбран такой вариант, который максимизирует количество участников, которые получат дипломы второй степени. Если и таких вариантов несколько, будет выбран тот вариант, который максимизирует количество дипломов третьей степени.

Выбор наилучшего варианта раздачи дипломов был поручен Илье, одному из лучших программистов Берляндии. Однако у него нашлись более важные дела, поэтому именно вам предстоит выбрать наилучший вариант раздачи дипломов, исходя из описанных ограничений.

Гарантируется, что описанные ограничения таковы, что существует способ выбрать такой вариант раздачи дипломов, что все n школьников, участвующих в олимпиаде, получат диплом какой-то степени.

Входные данные

В первой строке строке входных данных следует одно целое число n (3 ≤ n ≤ 3·106) — количество школьников, которые будут участвовать в олимпиаде.

Во следующей строке входных данных следует два целых числа min1 и max1 (1 ≤ min1 ≤ max1 ≤ 106) — минимальное и максимальное ограничения на количество дипломов первой степени, которые могут быть вручены.

В третьей строке входных данных следует два целых числа min2 и max2 (1 ≤ min2 ≤ max2 ≤ 106) — минимальное и максимальное ограничения на количество дипломов второй степени, которые могут быть вручены.

В следующей строке входных данных следует два целых числа min3 и max3 (1 ≤ min3 ≤ max3 ≤ 106) — минимальное и максимальное ограничения на количество дипломов третьей степени, которые могут быть вручены.

Гарантируется, что min1 + min2 + min3 ≤ n ≤ max1 + max2 + max3.

Выходные данные

Выведите в первую строку выходных данных три числа — сколько дипломов первой, второй и третьй степени будет вручено школьникам при наилучшем варианте раздачи дипломов.

Наилучший вариант раздачи дипломов тот, который максимизирует количество школьников, которые получат дипломы первой степени. Из всех подходящих вариантов наилучший тот, который максимизирует количество участников, которые получат дипломы второй степени. Если и таких вариантов несколько, то наилучший тот, который максимизирует количество дипломов третьей степени.

B. Паша и чай

Конструктив математика реализация сортировки *1500

Паша решил позвать своих друзей на чаепитие. Как раз для этого случая у него был большой чайник объемом w миллилитров и 2n чашек для чая, каждая из которых достанется одному из друзей Паши. В i-ю чашку может быть налито не более ai миллилитров воды.

Оказалось, что среди друзей Паши ровно n мальчиков и ровно n девочек, и все они придут на чаепитие. Чтобы никто не обижался, Паша решил наливать воду для чая следующим образом:

  • Паша может вскипятить чайник ровно один раз, залив в него не более w миллилитров воды;
  • каждой девочке Паша нальет одинаковый объем воды;
  • каждому мальчику Паша нальет одинаковый объем воды,
  • если каждой девочке будет налито по x миллилитров воды, то каждому мальчику будет налито по 2x миллилитров воды.

Иными словами, каждому мальчику должно быть налито в 2 раза больше воды, чем каждой девочке.

Паша очень добрый и любезный, поэтому хочет суммарно налить своим друзьям как можно больше воды, чтобы заварить в ней чай. Вам предстоит помочь ему в этом и определить оптимальное распределение чашек между друзьями Паши.

Входные данные

В первой строке входных данных следует два целых числа n и w (1 ≤ n ≤ 105, 1 ≤ w ≤ 109) — количество друзей-мальчиков (равное количеству друзей-девочек) Паши и объем Пашиного чайника в миллилитрах.

Во второй строке входных данных задана последовательность целых чисел ai (1 ≤ ai ≤ 109, 1 ≤ i ≤ 2n) — объемы имеющихся у Паши чашек для чая в миллилитрах.

Выходные данные

Выведите одно вещественное число — максимальный суммарный объем воды в миллилитрах, который Паша может налить своим друзьям, не нарушая заданных условий. Ваш ответ будет признан правильным, если его абсолютная или относительная погрешность не превосходит 10 - 6.

Примечание

Также у Паши есть конфеты, которые он раздаст девочкам, но это уже совсем другая задача...

A. Лалаландия и яблони

Перебор реализация сортировки *1100

Amr живет в Лалаландии. Лалаландия — очень красивая страна, расположенная на координатной прямой. Лалаландия славится своими яблонями — в стране они растут везде.

Всего в Лалаландии ровно n яблонь. Яблоня номер i расположена в точке xi, на ней растет ai яблок. Amr хочет собрать яблоки с этих яблонь. Amr сейчас стоит в точке x = 0. Сначала он выбирает, вправо ли он пойдёт или влево. Он будет следовать в этом направлении, пока не дойдет до первой яблони. Он соберет с этой яблони все яблоки, а затем пойдет в противоположном направлении и будет идти, пока не дойдет до первой непосещённой яблони, снова развернётся, и так далее. Иными словами, посещая каждую новую яблоню, Amr разворачивается и идёт в противоположном направлении. Amr перестанет собирать яблоки, когда в направлении его движения не останется ни одной непосещённой яблони.

Какое максимальное количество яблок он сможет собрать?

Входные данные

В первой строке записано единственное число n (1 ≤ n ≤ 100), количество яблонь в Лалаландии.

В следующих n строках записано по два целых числа xi, ai ( - 105 ≤ xi ≤ 105, xi ≠ 0, 1 ≤ ai ≤ 105), обозначающих позицию i-го дерева и количество яблок на нем.

Гарантируется, что в каждой точке находится не более одной яблони. Гарантируется, что никакое дерево не растет в точке 0.

Выходные данные

Выведите максимальное количество яблок, которое может собрать Amr.

Примечание

В первом тесте не имеет значения, пойдет ли Amr сначала влево или вправо. В обоих случаях он соберет все яблоки.

Во втором тесте оптимальное решение таково: пойти влево до x =  - 1, собрать там яблоки, развернуться, затем дойти до x = 1, собрать там яблоки, развернуться, и дойти до последнего дерева x =  - 2.

В третьем тесте оптимальное решение таково: пойти вправо до x = 1, собрать там яблоки, развернуться, после чего Amr больше не может собирать яблоки, так как слева от него нет яблонь.

B. Amr и большой массив

реализация *1300

У Amr есть большой массив размера n. Amr не любит больше массивы, так что он намеревается уменьшить его.

Из всего массива Amr интересует только его красота. Красота массива определяется как максимальное количество вхождений некоторого числа в этот массив. Он хочет выбрать наименьший подотрезок этого массива, такой, что его красота совпадает с красотой исходного массива.

Помогите Amr, выбрав подотрезок наименьшей возможной длины.

Входные данные

В первой строке записано одно число n (1 ≤ n ≤ 105), размер массива.

Во второй строке записано n целых чисел ai (1 ≤ ai ≤ 106), элементы массива.

Выходные данные

Выведите два целых числа l, r (1 ≤ l ≤ r ≤ n), позиция начала и конца выбранного подотрезка.

Если возможных ответов несколько, выведите любой.

Примечание

Подотрезок B массива A от l до r представляет собой массив размера r - l + 1, где Bi = Al + i - 1 для всех 1 ≤ i ≤ r - l + 1

D. Угадай, где выход! II

реализация сортировки Структуры данных *2300

Amr купил новую видеоигру "Угадай, где выход! II". Задача этой игры — найти выход в лабиринте, имеющим вид полного двоичного дерева высоты h. Изначально игрок стоит в корне дерева, а выход из дерева располагается в некотором листе дерева.

Пронумеруем все вершины дерева, таким образом, что

  • Корень дерева имеет номер 1
  • У каждой внутренней вершины i (i ≤ 2h - 1 - 1) есть левый потомок с номером 2i и правый потомок с номером 2i + 1

Уровень вершины определяется как 1 для корня, либо как 1 + уровень вершины-родителя в противном случае. Вершины уровня h называются листьями. Выход из лабиринта расположен в некотором листе n, причём игрок не знает, где выход, так что цель игры — угадать, где выход!

В новой версии игры игроку дозволяется задавать вопросы формата "Принадлежит ли номер ancestor(exit, i) отрезку [L, R]?". Здесь за ancestor(v, i) обозначается предок вершины v, расположенный на уровне i, а exit обозначает вершину с выходом. Игра может отвечать только "Yes" (Да) или "No" (Нет). Игра устроена так, что она не всегда отвечает верно, и иногда она сообщает ложную информацию, чтобы сбить игрока с толку!

Amr задал много вопросов и запутался во всех этих ответах, так что он попросил вас помочь ему. Вам даны вопросы и ответы на них, можете ли вы определить, сообщала ли игра противоречивую информацию или нет? Если информация непротиворечива, и вершина выхода определяется однозначно, то выведите её номер. Если информация непротиворечива, но вершина выхода однозначно не определяется, то выведите, что было задано недостаточное количество вопросов. В противном случае, сообщите, что информация противоречива.

Входные данные

В первой строке записано два целых числа h, q (1 ≤ h ≤ 50, 0 ≤ q ≤ 105), высота дерева и количество вопросов соответственно.

В каждой из следующих q строк будет записано по четыре целых числа i, L, R, ans (1 ≤ i ≤ h, 2i - 1 ≤ L ≤ R ≤ 2i - 1, ), обозначающих запрос, описанный в условии, и его ответ (ans = 1, если ответ — "Yes" и ans = 0, если ответ — "No").

Выходные данные

Если информация, полученная от игры, противоречива, выведите: "Game cheated!" (игра сжульничала) без кавычек.

Если информация непротиворечива, и можно однозначно найти выход из лабиринта, выведите его номер.

В противном случае, выведите: "Data not sufficient!" (недостаточно данных) без кавычек.

Примечание

Вершина u называется предком вершины v тогда и только тогда, когда

  • u — та же самая вершина, что и v,
  • u — непосредственный родитель вершины v,
  • либо u — предок непосредственного родителя вершины v.

В первом тесте дано 4 вершины-листа 4, 5, 6, 7. Первый вопрос говорит, что данная вершина не находится в диапазоне [4, 6], так что выход — это вершина номер 7.

Во втором тесте дано 8 вершин-листьев. После первого вопроса становится известно, что выход находится в диапазоне [10, 14]. После второго и третьего вопроса становится понятно, что только узел номер 14 подходит. Смотрите на изображение ниже для разъяснений.

A. Бар

реализация *1000

По Берляндским законам в барах разрешается продавать алкогольные напитки только людям не младше 18 лет. Работа Васи — следить за соблюдением этого закона. Сегодня вечером он зашел в один бар, и увидел, что там сидят n человек. Так получилось, что для каждого из них Вася сразу точно определил либо возраст, либо напиток, который пьет этот человек. Любого человека Вася может проверить дополнительно — т. е. узнать одновременно и точный возраст, и напиток. Какое наименьшее количество человек Вася должен проверить дополнительно, чтобы убедиться, что нет посетителей младше 18 лет, пьющих алкогольные напитки?

Список всех алкогольных напитков Берляндии: ABSINTH, BEER, BRANDY, CHAMPAGNE, GIN, RUM, SAKE, TEQUILA, VODKA, WHISKEY, WINE

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100)— количество посетителей бара. Далее следует n строк, в каждой описывается один посетитель. Записан либо его возраст (целое число от 0 до 1000), либо напиток (строка больших латинских букв длиной от 1 до 100). Гарантируется, что входные данные не содержат пробелов и других лишних разделителей.

Алкогольными следует считать только напитки из списка, приведенного выше.

Выходные данные

Выведите одно число — сколько человек должен проверить Вася чтобы гарантировать соблюдение закона.

Примечание

В тесте из примера нужно проверить второго и пятого посетителя.

B. Испорченная перестановка

реализация *1300

Вася коллекционирует монеты. У него есть ровно по одной монете для каждого года от 1 до n. Естественно, в своей коллекции Вася хранит все монеты в порядке их выпуска. Однажды младший брат Васи взял все монеты с годом выпуска от l до r включительно и поставил их в обратном порядке. То есть он взял некоторый отрезок [l, r] и перевернул его слева направо. При этом концы отрезка не совпадали. Например, если n = 8, изначально у Васи монеты хранились в порядке 1 2 3 4 5 6 7 8. Если младший брат Васи выбрал отрезок [2, 6], то после переворота получится порядок монет 1 6 5 4 3 2 7 8. Вася подозревает, что после его брата перестановку мог испортить кто-то еще. Помогите ему выяснить это. Проверьте, что заданная перестановка может быть получена из перестановки 1 2 ... n с помощью ровно одного переворота отрезка. Если это возможно, найдите сам отрезок.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 1000) — количество монет в коллекции Васи. Во второй строке через пробел записано n целых чисел — испорченная последовательность монет. Гарантируется, что заданная последовательность является перестановкой, то есть она содержит только целые числа от 1 до n, причем каждое число содержится ровно 1 раз.

Выходные данные

Если невозможно получить заданную перестановку из исходной ровно за 1 действие, выведите 0 0. Иначе выведите два числа l r (1 ≤ l < r ≤ n) — концы отрезка, который нужно перевернуть, чтобы из перестановки 1 2 ... n получить данную.

C. Почта в корпорации

Разбор выражений реализация Структуры данных *1700

Структура корпорации Бернефть имеет иерархический вид, то есть может быть представлена в виде дерева. Рассмотрим представление этой структуры в следующем виде:

  • employee ::= name. | name:employee1,employee2, ... ,employeek.
  • name ::= имя сотрудника

То есть описание каждого сотрудника состоит из его имени, двоеточия, описаний всех его подчиненных, разделённых запятыми, и точки в конце. Если у сотрудника нет подчиненных, двоеточие в его описании отсутствует.

Например, строка MIKE:MAX.,ARTEM:MIKE..,DMITRY:DMITRY.,DMITRY... является корректной записью структуры корпорации, в которой директор MIKE имеет подчиненных MAX, ARTEM и DMITRY. ARTEM имеет подчиненного, которого зовут MIKE, точно так же как и его начальника, а двоих подчиненных DMITRY зовут DMITRY, как и его самого.

В корпорации Бернефть каждый сотрудник может переписываться только со своими подчиненными, причем не обязательно прямыми. Назовем неудобной ситуацию, когда человек с именем s пишет письмо другому человеку, которого так же зовут s. В приведенном выше примере есть 3 таких пары: одна с участием MIKE, и две для DMITRY (по одной на каждого его подчиненного).

Ваша задача — по заданной структуре корпорации найти количество неудобных пар в ней.

Входные данные

В первой и единственной строке записана структура корпорации — строка длиной от 1 до 1000 символов. Гарантируется, что описание корректно. Каждое имя — это строка из больших латинских букв длиной от 1 до 10 символов.

Выходные данные

Выведите одно число — количество неудобных ситуаций в корпорации.

A. Денежная система Геральдиона

реализация сортировки *1000

На волшебном острове Геральдионе, на котором живёт Геральд, есть своя денежная система. В обращении находятся купюры нескольких номиналов. Но, к сожалению, их система несовершенна, и иногда Геральдионцы сталкиваются с ситуацией, что определённую сумму денег нельзя выдать без сдачи никаким набором купюр (естественно, можно использовать сколько угодно купюр каждого достоинства). Такая сумма называется неудачной. Геральд заинтересовался: а какова минимальная неудачная сумма?

Входные данные

В первой строке дано число n (1 ≤ n ≤ 1000) — количество номиналов купюр, которые имеют хождение на Геральдионе.

Во второй строке через пробел перечислены n различных чисел a1, a2, ..., an (1 ≤ ai ≤ 106) — сами номиналы купюр.

Выходные данные

Выведите единственное число — минимальную неудачную сумму. Если же неудачных сумм не бывает, выведите  - 1.

B. Геральд увлекается исскусством

Конструктив реализация *1200

Геральд приобрёл на аукционе «Сотбис» две редчайших картины и теперь хочет повесить их на стену. Для этого он купил специальный стенд, чтобы закрепить его на стене, а на нём разместить картины. Рабочая поверхность стенда, на которой будут располагаться картины, имеет форму прямоугольника a1 × b1, а сами картины имеют форму прямоугольников a2 × b2 и a3 × b3. Считается, что конструкция крепления дополнительного места не занимает.

Поскольку картины написаны в стиле абстракционизма, то совершенно неважно, как именно они будут повёрнуты, но, всё-таки, одна сторона как стенда, так и каждой из картин, должна быть параллельна полу. Картины могут касаться друг друга и краёв рабочей поверхности стенда, но не могут пересекаться и вылезать за края рабочей поверхности стенда. Геральд спрашивает — можно ли разместить картины на стенде или он купил недостаточно большой стенд?

Входные данные

В первой строке даны через пробел два числа a1 и b1 — стороны рабочей поверхности стенда. В следующих двух строках даны числа a2, b2, a3 и b3 — стороны картин. Все числа ai, bi во входных данных целые и находятся в пределах от 1 до 1000.

Выходные данные

Если картины можно разместить на стенде, выведите «YES» (без кавычек), а если нельзя, выведите «NO» (без кавычек).

Примечание

Вот так можно разместить картины в первом тесте:

А вот так — в третьем.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

A. Почта в Лайнландии

жадные алгоритмы реализация *900

Все города Лайнландии расположены на координатной прямой Ox. Таким образом, каждый город характеризуется своим положением xi — координатой на оси Ox. Никакие два города не расположены в одной точке.

Жители Лайнландии очень любят слать друг другу письма. Житель страны может отослать письмо другому жителю только в том случае, если адресат живёт в другом городе (так как если они живут в одном городе, то им проще ходить в гости).

Удивительно, но факт: стоимость отправки письма в точности равна расстоянию между городом отправителя и городом получателя.

Для каждого города найдите два значения mini и maxi, где mini — минимальная стоимость отправки письма из i-го города в какой-либо другой город, а maxi — максимальная стоимость отправки письма из i-го города в какой-либо другой город.

Входные данные

В первой строке входных данных содержится целое число n (2 ≤ n ≤ 105) — количество городов в Лайнландии. Во второй строке содержится последовательность из n различных целых чисел x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), где xix-координата i-го города. Все xi различны и идут в порядке возрастания.

Выходные данные

Выведите n строк, i-я строка должна содержать два целых числа mini, maxi, разделённых пробелом, где mini — минимальная стоимость отправки письма из i-го города, а maxi — максимальная стоимость отправки письма из i-го города.

B. Берляндская национальная библиотека

реализация *1300

Совсем недавно в столице Берляндии была открыта Берляндская национальная библиотека. Кроме того, что в библиотеке можно взять любой том из собрания сочинений берляндских вождей, в библиотеке функционирует читальный зал.

Именно сегодня состоялся пилотный запуск автоматизированной системы учёта посетителей читального зала! Сканер системы установлен на входе в читальный зал. Он регистрирует события вида «читатель вошёл в зал», «читатель вышел из зала». Каждому читателю при регистриции в библиотеке присваивается регистрационный номер — уникальное целое число от 1 до 106. Таким образом, система записывает в журнал события двух видов:

  • «+ ri» — читатель с регистрационным номером ri зашёл в зал;
  • «- ri» — читатель с регистрационным номером ri вышел из зала.

Пилотный запуск системы прошёл успешно, она функционировала на протяжении некоторого отрезка времени, причём, как в момент её запуска, так и в момент выключения, в читальном зале могли находиться посетители.

На разработку и установку системы были потрачены значительные средства бюджета Берляндии. Поэтому некоторые из граждан столицы требуют объяснить необходимость наличия этой системы и пользу, которую принесёт её внедрение. Теперь разработчикам системы необходимо срочно придумать причины для её существования.

Помогите разработчикам системы найти наименьшую возможную вместительность читального зала (в посетителях) на основании журнала работы системы для некоторого отрезка времени.

Входные данные

В первой строке содержится целое положительное число n (1 ≤ n ≤ 100) — количество записей в журнале работы системы. Далее перечислены n событий из журнала системы в порядке их совершения. Каждое событие записано на отдельной строке и имеет вид «+ ri» или «- ri», где ri — целое число от 1 до 106, которое однозначно характеризует посетителя (то есть разные посетители обязательно имеют разные регистрационные номера).

Гарантируется, что журнал не противоречив, то есть для каждого посетителя типы любых его двух подряд идущих событий различны. Как до запуска системы, так и после её остановки, в зале могли находиться посетители.

Выходные данные

Выведите единственное целое число — минимальную возможную вместимость читального зала.

Примечание

В первом примере журнал системы гарантирует, что в некоторый момент в читальном зале находились посетители с регистрационными номерами 1, 1200 и 12001. Большее количество человек не находились одновременно в зале на основании журнала. Следовательно, ответ на тест равен 3.

A. Простые или палиндромы?

математика Перебор реализация теория чисел *1600

Рихаил Мубинчик считает, что нынешнее определение простых чисел несостоятельно — они слишком сложны и непредсказуемы. Вот другое дело — палиндромные числа. И глазу приятны, и обладают рядом замечательных свойств. Помогите Рихаилу убедить научное сообщество в этом!

Напомним, что число называется простым, если оно целое, не меньше двух, и не делится ни на какое целое положительное число кроме себя и единицы.

Рихаил называет число палиндромным, если оно целое, положительное и его запись в десятичной системе счисления без ведущих нулей является палиндромом, то есть одинаково читается слева направо и справа налево.

Одна из проблем с простыми числами заключается в том, что их слишком много. Введём следующие обозначения: π(n) — количество простых чисел, не превышающих n, rub(n) — количество палиндромных чисел, не превышающих n. Рихаил хочет доказать, что простых чисел намного больше, чем палиндромных.

Он попросил вас решить следующую задачу: по заданному значению коэффициента A найти наибольшее такое n, что π(n) ≤ A·rub(n).

Входные данные

Ввод состоит из двух целых положительных чисел p, q — числитель и знаменатель дроби, являющейся значением коэффициента A ().

Выходные данные

Если наибольшее такое число существует, то вывести его. Иначе вывести "Palindromic tree is better than splay tree" (без кавычек).

A. Музыка

математика реализация *1500

Мальчик Лёша любит слушать музыку со своего смартфона. Но памяти у смартфона не очень много, поэтому Лёша слушает любимые композиции в известной социальной сети НаСвязи.

К сожалению, интернет в Екатеринозаводске не очень быстрый, и песня загружается очень медленно. Но Лёша весьма нетерпелив. Песня длится ровно T секунд. Лёша прогружает первые S секунд композиции и включает песню. Когда воспроизведение доходит до момента, который ещё не прогрузился, Лёша моментально включает песню заново (при этом загруженная часть песни остаётся в памяти телефона, и процесс скачивания продолжается с того же места), и так происходит до тех пор, когда песня скачается полностью и Лёша дослушает до конца. За q секунд реального времени интернет позволяет скачать q - 1 секунду трека.

Подскажите Лёше, сколько раз он запустит песню, включая самый первый запуск.

Входные данные

В единственной строчке записаны три целых числа T, S, q (2 ≤ q ≤ 104, 1 ≤ S < T ≤ 105).

Выходные данные

Выведите одно целое число — количество запусков композиции.

Примечание

В первом тесте песня проигрывается в два раза быстрее, чем скачивается, а значит через четыре секунды Лёша впервые дослушает до момента, который ещё не прогрузился, и запустит песню заново. Ещё через две секунды песня скачается полностью, а значит Лёша запустит песню два раза.

Во втором тесте песня уже почти скачана, и Лёша запустит её всего один раз.

В третем тесте из условия загрузка заканчивается и Лёша завершает прослушивание песни в один и тот же момент. Обратите внимание, что в таком случае Лёша не перезапускает песню заново.

A. Квадратная Земля?

жадные алгоритмы поиск в глубину и подобное реализация *1300

Кролиха Мэг решила заняться прекрасным, а именно вычислить кратчайшее расстояние между двумя точками на поверхности нашей планеты. Но Мэг... что сказать... ей все нужно попроще... Итак, она уже рассматривает нашу планету как двухмерную окружность. Хотя нет, даже хуже — как квадрат, со стороной n. Таким образом, задача свелась к нахождению кратчайшего пути между двумя точками на квадрате (путь должен проходить по сторонам квадрата). Для простоты будем считать, что вершины квадрата находятся в точках с координатами: (0, 0), (n, 0), (0, n) и (n, n).

Входные данные

Единственная строка содержит 5 целых чисел, разделенных пробелами: n, x1, y1, x2, y2 (1 ≤ n ≤ 1000, 0 ≤ x1, y1, x2, y2 ≤ n) соответственно сторона квадрата, координаты первой точки и координаты второй точки. Гарантируется, что точки лежат на сторонах квадрата.

Выходные данные

В единственной строке нужно вывести кратчайшее расстояние между точками.

B. Марсианская архитектура

реализация *1600

Кролик Крис нашел следы древней цивилизации Марса. В небольшой телескоп отважному астроному удалось увидеть архитектурный шедевр — «Дорогу к Солнцу». Это сооружение состоит из одинаковых по размеру кубических камней. Фундамент разбивает всю «дорогу» на ячейки, в которые плотно ложатся кубокамни. Таким образом, каждой ячейке фундамента можно приписать координату. Для того чтобы стать вождём, марсианин должен быть проложить путь к Солнцу, то есть построить из этих кубокамней на заданном фундаменте лестницу. Лестницу можно описать количеством камней в начальной координате, и координатами начала и конца лестницы. Каждая следующая ячейка в направлении возрастания координаты должна была содержать на 1 кубокамень больше, чем предыдущая. Причем если в ячейке уже были до этого камни — в текущем строительстве они не считаются, лестницу просто строили поверх их. Другими словами, пусть строится лестница с координатой начала l, координатой конца r и количеством камней в начальной координате x. Это означает, что в ячейке l добавится x камней, в l + 1 добавится x + 1 камней, ..., в ячейке r добавится x + r - l камней.

Крису удалось отыскать древний манускрипт, содержащий описания всех лестниц. Теперь он хочет сравнить эти данные, чтобы быть уверенным в том, что нашел именно «Дорогу к Солнцу». Для этого он выбрал некоторые ячейки дороги и посчитал суммарное количество кубокамней, которые накопились за всю марсианскую историю, а потом попросил вас с помощью манускрипта подсчитать чему в идеале должна равняться эта сумма.

Входные данные

Первая строка содержит три целых числа, разделенных пробелами: n, m, k (1 ≤ n, m ≤ 105, 1 ≤ k ≤ min(100, n)) — количество ячеек, количество «Дорог к Солнцу» и количество ячеек в запросе соответственно. Каждая из последующих m строк содержит по три целых числа, разделенных пробелами: ai, bi, ci (1 ≤ ai ≤ bi ≤ n, 1 ≤ ci ≤ 1000) — описание лестницы, соответственно начало, конец и высота начальной ячейки. Далее следует строка, содержащая k различных целых чисел bi, разделённых пробелами. Все эти числа в пределах от 1 до n — ячейки, количество камней в которых интересует Криса.

Выходные данные

Требуется вывести в единственной строке одно число — сумму камней во всех интересующих Криса ячейках.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cin (также вы можете использовать спецификатор %I64d).

A. Выборы

реализация *1100

В стране Бялечинск начались выборы президента, в которых участвуют n кандидатов. Страна состоит из m городов. Известно, сколько человек в каждом городе проголосовало за каждого кандидата.

Система выборов в стране имеет необычный вид. На первом этапе выборов подводятся итоги голосованя по городам: считается, что в городе победил тот кандидат, за которого было отдано наибольшее количество голосов в этом городе, а в случае, если несколько кандидатов набрали максимальное количество голосов — кандидат с наименьшим номером из них.

На втором этапе выборов по тому же принципу определяется победитель: победителем выборов считается кандидат, за которого проголосовало максимальное количество городов, а среди набравших максимальное количество голосов — кандидат с наименьшим номером.

Определите, кто победит на выборах?

Входные данные

Первая строка входных данных содержит два целых числа n, m (1 ≤ n, m ≤ 100) — количество кандидатов и городов соответственно.

В последующих m строках записано по n целых неотрицательных чисел, j-е число в i-й строке aij (1 ≤ j ≤ n, 1 ≤ i ≤ m, 0 ≤ aij ≤ 109) обозначает количество голосов за кандидата номер j в городе номер i.

Гарантируется что суммарное количество жителей во всех городах не превосходит 109.

Выходные данные

Выведите единственное число — номер кандидата, победившего в выборах. Кандидаты нумеруются с единицы.

Примечание

Пояснение к первому тесту из условия. В первом туре город 1 проголосовал за кандидата 3, город 2 проголосовал за кандидата 2, город 3 проголосовал за кандидата 2. Победил кандидат 2, набрав 2 голоса.

Пояснение ко второму тесту из условия. В первом туре в городе 1 за кандидатов 1 и 2 проголосовало одинаковое максимальное количество голосов, но кандидат 1 имеет меньший номер поэтому город отдал предпочтение кандидату 1. Город 2 проголосовал за кандидата 3. Город 3 проголосовал за 1, в связи с тем что все имеют одинаковое количество голосов и 1 имеет наименьший номер. Город 4 проголосовал за кандидата 3. За кандидатов 1 и 3 проголосовало равное количество городов. Победил кандидат 1, имеющий наименьший номер.

B. Простая игра

жадные алгоритмы игры Конструктив математика реализация *1300

Как-то Миша и Андрей играли в очень простую игру. Сначала каждый игрок выбирает целое число в пределах от 1 до n. Пусть Миша выбрал число m, а Андрей — число a.

Затем с помощью генератора случайных чисел выбирается случайное целое число c в пределах от 1 до n (любое целое число от 1 до n может быть выбрано с одной и той же вероятностью), после чего побеждает тот игрок, чьё число оказалось ближе к c. Ребята договорились, что в случае, когда m и a находятся на одинаковом расстоянии от c, выигрывает Миша.

Андрей хочет победить любой ценой и просит вас помочь ему. Вам известно число, выбранное Мишей, и число n. Нужно определить, какое число a, должен выбрать Андрей, чтобы вероятность его победы была максимальной.

Более формально, нужно найти такое целое число a (1 ≤ a ≤ n), чтобы вероятность того, что , была максимальна, где c — выбранное равновероятно случайное целое число от 1 до n (включительно).

Входные данные

В первой строке находятся два целых числа n и m (1 ≤ m ≤ n ≤ 109) — диапазон чисел в игре и выбранное Мишей число соответственно.

Выходные данные

Выведите одно целое число — такое значение a, чтобы вероятность победы Андрея была максимальной. Если таких значений несколько, выведите минимальное из них.

Примечание

В первом тесте: Андрей победит если c равно 2 или 3. Вероятность победы Андрея равна 2 / 3. Если Андрей выберет число a, равное 3, то вероятность победы будет 1 / 3. При a, равном 1, вероятность победы — 0.

Во втором тесте: Андрей победит если c равно 1 или 2. Вероятность победы Андрея — 1 / 2. При остальных вариантах выбора a вероятность победы меньше.

C. Замены

Конструктив реализация Структуры данных *1600

У Данила была строка s, состоящая из строчных английских букв и точек (знаков '.'). Определим операцию замены как следующую последовательность действий: найдём подстроку ".." (две подряд идущих точки) в строке s, из всех вхождений этой подстроки выберем самое первое, и заменим эту подстроку на строку ".". Иными словами, во время операции замены первые две подряд идущих точки заменяются на одну. Если в строке s нет двух подряд идущих точек, то ничего не происходит.

Обозначим за f(s) минимальное количество операций замены, которые необходимо произвести, чтобы в строке не осталось двух подряд идущих точек.

Вам требуется обработать m запросов, в результате i-го из них символу на позиции xi (1 ≤ xi ≤ n) строки s присваивается значение ci. После выполнения каждой операции вы должны определить и вывести значение f(s).

Помогите Данилу ответить на все запросы.

Входные данные

В первой строке находятся два целых числа n и m (1 ≤ n, m ≤ 300 000) — длина строки и количество запросов.

Во второй строке следует строка s, состоящая из n строчных английских букв и точек.

В последующих m строках следуют описания запросов. В i-й строке находятся целое число xi и ci (1 ≤ xi ≤ n, ci — строчная латинская буква или точка), описывающие запрос присваивания символа ci на позицию xi.

Выходные данные

Выведите m чисел по одному в строке, i-е из этих чисел должно равняться значению f(s) после применения i-го присваивания.

Примечание

Пояснение к первому тесту из условия (заменяемые точки окружены квадратными скобками).

Начальная строка — ".b..bz....".

  • после первого запроса f(hb..bz....) = 4    ("hb[..]bz...."  →  "hb.bz[..].."  →  "hb.bz[..]."  →  "hb.bz[..]"  →  "hb.bz.")
  • после второго запроса f(hbс.bz....) = 3    ("hbс.bz[..].."  →  "hbс.bz[..]."  →  "hbс.bz[..]"  →  "hbс.bz.")
  • после третьего запроса f(hbс.bz..f.) = 1    ("hbс.bz[..]f."  →  "hbс.bz.f.")

Пояснение ко второму тесту из условия.

Начальная строка — ".cc.".

  • после первого запроса: f(..c.) = 1    ("[..]c."  →  ".c.")
  • после второго запроса: f(....) = 3    ("[..].."  →  "[..]."  →  "[..]"  →  ".")
  • после третьего запроса: f(.a..) = 1    (".a[..]"  →  ".a.")
  • после четвёртого запроса: f(aa..) = 1    ("aa[..]"  →  "aa.")

A. Удлинение палочек

Комбинаторика математика реализация *2100

Даны три палочки с целыми положительными длинами в a, b, и c сантиметров. Можно увеличить некоторые из них на целое положительное число сантиметров (разные палочки можно увеличивать на разную длину), но в сумме не больше, чем на l сантиметров. В частности, разрешается не увеличивать длину ни одной палочки.

Определите количество способов увеличить длины некоторых палочек так, чтобы из них можно было сложить невырожденный (то есть, имеющий ненулевую площадь) треугольник. Два способа считаются различными, если в них длина какой-то из палочек увеличивается на разное число сантиметров.

Входные данные

В единственной строке задано 4 целых числа a, b, c, l (1 ≤ a, b, c ≤ 3·105, 0 ≤ l ≤ 3·105).

Выходные данные

Выведите единственное целое число — количество способов увеличить размеры палочек в сумме не больше, чем на l сантиметров, так, чтобы из них можно было составить невырожденный треугольник.

Примечание

В первом тесте из условия можно не увеличивать ни одну из палочек, либо увеличить любые две палочки на 1 сантиметр.

Во втором тесте из условия можно увеличить либо первую, либо вторую палочку на один сантиметр. Обратите внимание, что треугольник, составленный из исходных палочек, является вырожденным, и поэтому не подходит.

B. Биржевые заявки

жадные алгоритмы реализация сортировки Структуры данных *1300

В данной задаче вам потребуется обработать набор заявок на торгах и сформировать по ним биржевой стакан.

Заявка — это желание какого-то участника торгов купить или продать акции. Для каждой заявки i известна ее цена pi, направление заявки di — покупка или продажа, а также количество акций qi, которые участник готов купить или продать по цене pi за акцию. Значение qi называется объемом заявки.

Все заявки с одинаковой ценой p и направлением d объединяются в так называемую аггрегированную заявку, цена которой также равна p, направление — d, а объём складывается из исходных заявок.

Биржевой стакан — это таблица из аггрегированных заявок, в которой сначала идут предложения продажи, отсортированные по убыванию цены, а затем предложения покупки, тоже отсортированные по убыванию цены.

Стакан с глубиной s содержит s лучших аггрегированных заявок по каждому направлению. Заявка на покупку тем лучше, чем у неё цена больше, заявка на продажу тем лучше, чем у неё цена меньше. Если аггрегированных заявок в данном направлении меньше s, то они все попадают в итоговый стакан.

Дано n биржевых заявок на покупку и продажу акций, требуется распечатать биржевой стакан глубины s для этих заявок.

Входные данные

В первой строке записаны два целых числа n и s (1 ≤ n ≤ 1000, 1 ≤ s ≤ 50) — количество заявок и глубина стакана соответственно.

В каждой из следующих n строк следуют символ di (либо 'B', либо 'S'), целое число pi (0 ≤ pi ≤ 105), а также целое число qi (1 ≤ qi ≤ 104) — направление, цена и объем заявки соответственно. Символ 'B' означает покупку, 'S' — продажу. Цена любой заявки на продажу больше цены любой заявки на покупку.

Выходные данные

Выведите не больше чем 2s строк, в которых содержатся аггрегированные заявки биржевого стакана глубины s. Заявки требуется выводить в том же формате что и во входных данных.

Примечание

Будем обозначать (x, y) заявку по цене x с объемом y. В тестовом примере имеются три аггрегированные заявки на покупку: (10, 3), (20, 4), (25, 10) и две на продажу: (50, 8), (40, 1)

Нужно вывести не более двух лучших заявок по каждому направлению, поэтому заявку (10 3), имеющую худшую цену среди заявок на покупку, выводить не нужно.

A. Мишка и покер

математика реализация теория чисел *1300

Лимак — старый бурый медведь. Он любит играть в покер со своими друзьями, для чего они часто ходят в ближайшее казино.

За столом сидят n игроков (включая Лимака), которые уже сделали какие-то ставки. i-й игрок поставил ai долларов.

Каждый игрок может удвоить или утроить свою ставку произвольное количество раз (может быть, и удвоить, и утроить). В казино есть специальное условие о джекпоте в случае, если ставки всех игроков становятся равны. Могут ли Лимак и его друзья выиграть джекпот?

Входные данные

В первой строке входного файла записано целое число n (2 ≤ n ≤ 105), количество игроков.

Во второй строке записано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109) — ставки игроков.

Выходные данные

Выведите "Yes" (без кавычек), если игроки смогут сделать все ставки равными, или "No" в противном случае.

Примечание

В первом тесте первый и третий игроки должны дважды удвоить свои ставки, второй игрок должен удвоить свою ставку один раз, а четвертый игрок должен удвоить и утроить свою ставку.

Можно показать, что во втором тесте невозможно сделать все ставки равными.

A. Мишка и выборы

жадные алгоритмы реализация *1200

Лимак — это мишка гризли, жаждущий власти и признания. Он хочет победить в предстоящих выборах и править всей Берляндией.

Дано n кандидатов, включая Лимака. Мы знаем, сколько граждан собираются проголосовать за каждого кандидата, за i-го кандидата будет отдано ai голосов. Лимак — кандидат номер 1. Чтобы победить на выборах, он должен набрать строго больше голосов, чем любой другой кандидат.

Победа важнее всего, так что Лимак решил сжульничать. Он подкупит некоторых граждан и украдет голоса у своих оппонентов. Чтобы подкупить гражданина, Лимак должен дать ему одну конфетку: граждане — мишки, а мишкам нравятся конфетки. У Лимака немного конфеток и ему интересно, сколько граждан ему надо подкупить?

Входные данные

В первой строке записано единственное целое число n (2 ≤ n ≤ 100) — количество кандидатов.

Во второй строке записано n целых чисел через пробел, a1, a2, ..., an (1 ≤ ai ≤ 1000) — количество голосов за каждого кандидата. Лимак — кандидат номер 1.

Обратите внимание, что после подкупа количество голосов за некоторого кандидата может равняться нулю или может превышать 1000.

Выходные данные

Выведите минимальное количество граждан, которых Лимак должен подкупить, чтобы набрать строго больше голосов, чем любой другой кандидат.

Примечание

В первом тесте у Лимака 5 голосов. Один из способов достичь победы — подкупить 4 граждан, желающих проголосовать за третьего кандидата. Количество голосов будет 9, 1, 7, 2, 8 (У Лимака будет 9 голосов). Другой способ — отнять 3 голоса у третьего кандидата и 1 голос у второго кандидата, чтобы получилась следующая ситуация: 9, 0, 8, 2, 8.

Во втором примере Лимак украдет 2 голоса у каждого кандидата. Получится: 7, 6, 6, 6.

В третьем примере Лимак одержит победу, не подкупив ни одного гражданина.

D. Таблицград

Конструктив реализация *1700

В Таблицграде произошло крупное ограбление банка. Для поимки вора президент позвал никого иного, как Альберта — начальника полиции Таблицграда. Альберт не знает, где находится вор, но он знает, как вор движется.

Таблицград можно представить как сетку размера 1000 × 2, где каждая ячейка представляет один район. У каждого района есть свое уникальное название “(X, Y)”, где X и Y— это координаты на сетке. Вор движется следующим образом:

Каждый час вор покидает район (X, Y), в котором он на данный момент прячется, и переходит в один из районов: (X - 1, Y), (X + 1, Y), (X - 1, Y - 1), (X - 1, Y + 1), (X + 1, Y - 1), (X + 1, Y + 1) при условии, что этот район существует в Таблицграде.

Ниже приведен пример возможных движений вора, если он расположен в районе (7,1):

У Альберта достаточно людей, так что каждый час он может выбрать любые два района в Таблицграде и полностью обычскать их, удостоверяясь, что если вор расположен в одном из них, то он будет пойман. Альберт пообещал Президенту, что вор будет пойман не более чем за 2015 часов и ему нужна Ваша помощь, чтобы добиться такого результата.

Входные данные

У этой задачи нет ввода.

Выходные данные

В первой строке выведите целое число N — продолжительность полицейского расследования в часах. Каждая из следующих N строк должна содержать ровно по 4 целых числа, Xi1, Yi1, Xi2, Yi2 разделенных пробелами, обозначающих 2 района (Xi1, Yi1), (Xi2, Yi2), которые должны быть обыскана в i-й час. Пары районов должны следовать в хронологическом порядке (i-я строка содержит районы, которые будут обысканы в i-й час). Должно быть верно, что вор будет гарантированно пойман не более чем за 2015 часов, независимо от начального положения и перемещений вора.

  • N ≤ 2015
  • 1 ≤ X ≤ 1000
  • 1 ≤ Y ≤ 2
Примечание

Рассмотрим следующий вариант вывода:

2

5 1 50 2

8 1 80 2

Этот вывод не гарантирует поимки вора и не является верным, он дан вам лишь для пояснения формата вывода. Существует комбинация изначального положения и стратегии движений, такая, что полиция не поймает вора.

Рассмотрим следующую изначальную позицию и движение вора:

В первом часу вор расположен в районе (1,1). Полицейские обыскивают районы (5,1) и (50,2) и не находят его.

В начале второго часа вор переходит в район (2,2). Полицейские обыскивают районы (8,1) и (80,2) и не находят его.

Так как на этом полицейское расследование заканчивается, значит, вор не пойман!

A. Таблица умножения

реализация теория чисел *1000

Рассмотрим таблицу из n строк и n столбцов. Известно, что в клетке, образованной пересечением i-й строки и j-го столбца, записано число i × j. Строки и столбцы нумеруются с единицы.

Дано целое положительное число x. Требуется посчитать количество клеток таблицы, в которых находится число x.

Входные данные

В единственной строке находятся числа n и x (1 ≤ n ≤ 105, 1 ≤ x ≤ 109) — размер таблицы и число, которое мы ищем в таблице.

Выходные данные

Выведите единственное число: количество раз, которое число x встречается в таблице.

Примечание

Ниже приведена таблица для второго теста из условия. Жирным выделены вхождения числа 12.

B. Ищем напарника

Перебор реализация сортировки *1300

Есть соревнование по программированию под названием SnakeUp, в котором хотят принять участие 2n человек. Принять участие в контесте можно только в составе команды из ровно двух людей. Известна сила каждой возможной команды из двух людей. Все значения сил различны.

Каждый соревнующийся надеется, что он может найти напарника, с которым он образует как можно более сильную команду. Таким образом, соревнующийся стремится создать команду с наибольшей возможной силой, путем выбора сокомандника из тех, кто согласен быть с ним в команде. Более формально, два человека, A и B смогут создать команду, если каждый из них является наилучшим возможным напарником (среди соревнующихся, не нашедших к текущему моменту пару) друг для друга.

Определить, кто с кем будет участвовать в команде?

Входные данные

Ввод состоит из 2n строк.

В первой строке записано целое число n (1 ≤ n ≤ 400) — количество команд, которые надо образовать.

В i-й строке (i > 1) записано i - 1 чисел ai1, ai2, ... , ai(i - 1). Здесь aij (1 ≤ aij ≤ 106, все aij различны) обозначает силу команды, состоящей из человека i и человека j (люди пронумерованы, начиная с 1)

Выходные данные

Выведите строку, содержащую 2n чисел. Из них i-е число должно обозначать номер напарника i-го человека.

Примечание

В первом примере люди номер 1 и 2 образуют команду, также образуют команду люди номер 3 и 4, так что напарники соревнующихся номер 1, 2, 3, 4 будут 2, 1, 4, 3, соответственно.

A. Кефа и первые шаги

дп Перебор реализация *900

Кефа решил подзаработать денег, занимаясь различной деятельностью в интернете на протяжении ровно n дней. Он знает, что в i-й день (1 ≤ i ≤ n) он заработает ai монет. Кефа любит прогресс, поэтому он хочет узнать длину максимального неубывающего подотрезка в последовательности ai. Напомним, что подотрезок последовательности — это её непрерывный фрагмент. Подотрезок чисел называется неубывающим, если числа в нём следуют в порядке неубывания.

Помогите Кефе справиться с этой задачей!

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 105).

Во второй строке заданы n целых чисел a1,  a2,  ...,  an (1 ≤ ai ≤ 109).

Выходные данные

Выведите единственное целое число — длину максимального неубывающего подотрезка последовательности a.

Примечание

В первом тесте максимальный неубывающий подотрезок это числа с третьего по пятое.

Во втором тесте максимальный неубывающий подотрезок это числа с первого по третье.

A. Хипстер Вася

математика реализация *800

Как-то раз хипстер Вася решил посчитать, сколько у него носков. Оказалось, что у Васи есть a красных носков и b синих носков.

Согласно последним веяниям моды, хипстеры должны носить носки разных цветов: на левой ноге красный, а на правой — синий.

Каждый день с утра Вася надевает новые носки, а перед сном выкидывает их, ведь стирать ему их очень не хочется.

Васе стало интересно, какое максимальное количество дней, в которые он сможет быть одетым по моде и носить разноцветные носки, и сколько затем дней он сможет ходить в одноцветных носках, пока носки либо не закончатся, либо из оставшихся носков нельзя будет составить ни одной пары.

Поможете ему?

Входные данные

В единственной строке входных данных следуют два целых положительных числа a и b (1 ≤ a, b ≤ 100) — количество носков красного и синего цветов, которые есть у Васи.

Выходные данные

Выведите через пробел два целых числа — максимальное количество дней, в которые Вася сможет носить разноцветные носки, и количество дней, которое он сможет носить одноцветные носки до тех пор, пока они либо не кончатся, либо из оставшихся носков нельзя будет составить ни одной пары.

Напомним, что в конце дня Вася выкидывает носки, которые он носил в этот день.

Примечание

В первом примере Вася сначала может надеть одну пару разноцветных носков, после этого у него останется два красных носка, которые он наденет во второй день.

B. Элитные дома

математика реализация *1100

В столице Берляндии есть n многоэтажных домов. Архитектор, который застраивал столицу, был человеком очень творческим, поэтому все дома были построены в один ряд.

Пронумеруем все дома слева направо, начиная с единицы. Дом считается элитным, если количество этажей в нем строго больше, чем во всех домах с большими номерами. Иными словами, дом элитный, если количество этажей в нем строго больше, чем во всех домах, которые расположены правее, чем он. В данной задаче полагается, что высоты всех этажей во всех домах одинаковы.

Нового архитектора заинтересовали n вопросов, i-й из которых звучит так: «сколько этажей нужно достроить к i-му дому, чтобы он стал элитным?» (где i принимает все значения от 1 до n). Вам предстоит помочь ему справиться с этой задачей.

Заметим, что все вопросы независимы друг от друга — ответ на вопрос для дома i не влияет на другие ответы (то есть, этажи к домам на самом деле не достраиваются).

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 105) — количество домов в столице Берляндии.

Во второй строке через пробел записаны n целых положительных чисел hi (1 ≤ hi ≤ 109), где hi равно количеству этажей в i-м доме.

Выходные данные

Выведите n целых чисел a1, a2, ..., an, где число ai равно количеству этажей, которые необходимо достроить к дому номер i, чтобы он стал элитным. Если дом уже элитный и к нему достраивать ничего не нужно, тогда ai должно быть равно нулю.

Все дома нумеруются слева направо, начиная с единицы.

C. Развитие навыков

математика реализация сортировки *1400

Петя очень любит компьютерные игры. Наконец вышла игра, которую он так долго ждал!

У главного героя этой игры есть n различных навыков, каждый из которых характеризуется целым числом ai от 0 до 100. Чем больше число ai, тем лучше главный герой владеет i-м навыком. Суммарный рейтинг главного героя определяется как сумма значений по всем i от 1 до n. Выражение x обозначает результат округления числа x вниз к ближайшему целому числу.

Пете в начале игры в качестве бонуса дали k единиц улучшений, которые он может использовать для увеличения навыков своего персонажа и его суммарного рейтинга. Используя одну единицу улучшения, Петя может увеличить любой навык главного героя ровно на один. К примеру, если a4 = 46, то после применения единицы улучшения к этому навыку, он станет равен 47. Больше 100 навык героя стать не может. Таким образом, возможно, что некоторое количество единиц улучшения останется невостребованным.

Перед вами стоит задача определить, как следует использовать единицы улучшений, чтобы максимизировать суммарный рейтинг главного героя. Использовать все единицы улучшений не обязательно.

Входные данные

В первой строке входных данных следуют два целых положительных числа n и k (1 ≤ n ≤ 105, 0 ≤ k ≤ 107) — количество навыков главного героя и количество единиц улучшений, имеющихся у Пети.

Во второй строке входных данных следует последовательность из n целых чисел ai (0 ≤ ai ≤ 100), где ai характеризует уровень развитости i-го навыка главного героя.

Выходные данные

В единственной строке выходных данных должно содержаться целое неотрицательное число — максимальный суммарный рейтинг главного героя, который может получить Петя, используя k или менее единиц улучшения.

Примечание

В первом тестовом примере оптимальная стратегия следующая. Петя должен улучшить первый навык до 10, потратив 3 единицы улучшения, и второй навык до 10, потратив одну единицу улучшения. Таким образом, Петя потратит все свои единицы улучшения и суммарный рейтинг главного героя станет равен .

Во втором тестовом примере оптимально для Пети улучшить первый навык до 20 (при этом потратить 3 единицы улучшения) и улучшить третий навык до 20 (при этом потратить 1 единицу улучшения). Таким образом, у Пети останется 4 единицы улучшения и он сможет увеличить второй навык лишь до 19 (что не изменит суммарный рейтинг, поэтому делать это Пете необязательно). Поэтому максимально возможный суммарный рейтинг в этом примере .

В третьем тестовом примере оптимальная стратегия Пети — увеличить первый навык до 100, потратив 1 единицу улучшения. После этого оба навыка главного героя станут равны 100, поэтому Петя не сможет потратить оставшуюся единицу улучшения. Таким образом, ответ равен .

D. Три логотипа

битмаски геометрия Конструктив математика Перебор реализация *1700

Три компании решили заказать рекламный щит с изображениями своих логотипов. Рекламный щит представляет собой большую квадратную доску. Логотип каждой из компаний представляет собой прямоугольник ненулевой площади.

Рекламодатели разместят рекламу только в том случае, если возможно расположить все три логотипа на щите без наложений так, что на нём не останется свободного места. При размещении логотипы можно поворачивать так, чтобы стороны были параллельны сторонам рекламного щита.

Перед вами стоит задача определить, возможно ли разместить логотипы трех компаний на щите квадратной формы, не нарушив никакое из описанных правил.

Входные данные

В единственной строке входных данных находятся шесть целых положительных чисел x1, y1, x2, y2, x3, y3 (1 ≤ x1, y1, x2, y2, x3, y3 ≤ 100), где xi и yi обозначают длину и ширину логотипа i-й компании соответственно.

Выходные данные

Если разместить все три логотипа на квадратном щите невозможно, выведите одно число "-1" (без кавычек).

Если же это возможно, выведите в первую строку длину стороны квадрата n, в котором можно разместить все три логотипа. В следующих n строках должно содержаться по n заглавных латинских букв "A", "B" или "C". Наборы одинаковых букв должны образовывать сплошные прямоугольники, причем:

  • размеры прямоугольника, составленного из букв "A", должны быть равны размерам логотипа первой компании,
  • размеры прямоугольника, составленного из букв "B", должны быть равны размерам логотипа второй компании,
  • размеры прямоугольника, составленного из букв "C", должны быть равны размерам логотипа третьей компании.

Напомним, что логотипы компаний в процессе нанесения их на рекламный щит можно поворачивать. Пустых мест на щите остаться не должно. Если квадратный рекламный щит можно заполнить логотипами несколькими способами, разрешается вывести любой из них.

Изучите тестовые примеры для лучшего понимания условия.

A. Асфальтирование дорог

реализация *1000

Город X состоит из n вертикальных и n горизонтальных бесконечных дорог, образующих n × n перекрестков. Дороги (как вертикальные, так и горизонтальные) при этом нумеруются с 1 до n, а перекрестки обозначаются номерами дорог, которые его образуют.

Песчаные дороги были давно признаны устаревшими, поэтому было принято решение об их асфальтировании. Для этого была нанята бригада рабочих и составлено расписание перекрестков, согласно которому должны асфальтироваться дороги.

Дорожные работы планируется провести за n2 дней. В i-й день бригада приезжает на i-й в расписании перекресток, и, в случае, если ни одна из двух дорог, образующих перекресток, не была заасфальтирована, асфальтируют обе этих дороги. В противном случае бригада покидает перекресток, оставив дороги в прежнем состоянии до следующего дня.

По заданному расписанию работ на перекрестках сообщите номера дней, в которые будет заасфальтирована хотя бы одна дорога.

Входные данные

В первой строке дано число n (1 ≤ n ≤ 50) — количество вертикальных и горизонтальных дорог в городе.

В следующих n2 строках содержится порядок перекрестков в расписании. В i-й из них содержатся два числа hi, vi (1 ≤ hi, vi ≤ n), разделенных пробелом, и означающих, что i-й в расписании перекресток находится на пересечении hi-о горизонтальной и vi-й вертикальной дорог.

Гарантируется, что все перекрестки в расписании различны.

Выходные данные

В единственной строке выведите номера дней, в которые будут производиться работы, в порядке возрастания.

Примечание

В примере бригада действует следующим образом:

  1. В первый день бригада приезжает на перекресток, образованный пересечением 1-й горизонтальной и 1-й вертикальной дороги. Поскольку никакая из них не была заасфальтирована, рабочие асфальтируют 1-ю вертикальную и 1-ю горизонтальную дорогу;
  2. Во второй день бригада рабочих приезжает на пересечение 1-й горизонтальной и 2-й вертикальной дороги. 2-я вертикальная дорога не была заасфальтирована, но, поскольку 1-я горизонтальная дорога была заасфальтирована в первый день, рабочие уезжают, ничего не заасфальтировав;
  3. В третий день бригада рабочих приезжает на пересечение 2-й горизонтальной и 1-й вертикальной дороги. 2-я горизонтальная дорога не была заасфальтирована, но, поскольку 1-я вертикальная дорога была заасфальтирована в первый день, рабочие уезжают, ничего не заасфальтировав;
  4. В четвертый день бригада приезжает на перекресток, образованный пересечением 2-й горизонтальной и 2-й вертикальной дороги. Поскольку никакая из них не была заасфальтирована, рабочие асфальтируют 2-ю вертикальную и 2-ю горизонтальную дорогу.

B. Задача робота

жадные алгоритмы реализация *1200

Робот Док находится в зале, в котором в ряд стоят n компьютеров, пронумерованных слева направо от 1 до n. В каждом компьютере содержится ровно одна часть информации, каждую из которых Док хочет в итоге получить. Компьютеры оснащены системой защиты, поэтому, чтобы взломать i-й из них, роботу нужно собрать не менее ai любых частей информации из других компьютеров. Осуществить взлом Док может, только находясь непосредственно рядом с компьютером.

Робот собран по современным технологиям и может двигаться вдоль ряда компьютеров в любом из двух возможных направлений, однако смена направления движения требует большое количество ресурсов Дока. Сообщите минимальное количество смен направлений движения, которое придется сделать роботу для сбора всех n частей информации, если изначально он находится рядом с компьютером с номером 1.

Гарантируется, что существует хотя бы одна последовательность действий робота, приводящая к сбору всей информации. Изначально Док не владеет ни одной из частей информации.

Входные данные

В первой строке содержится число n (1 ≤ n ≤ 1000). Во второй строке содержатся n целых неотрицательных чисел a1, a2, ..., an (0 ≤ ai < n), разделенных пробелом. Гарантируется, что робот может собрать все части информации.

Выходные данные

Выведите единственное число — минимальное количество смен направлений движения, которое придется сделать роботу для сбора всех n частей информации.

Примечание

В первом примере собрать все части информации оптимальным образом можно, собрав сначала часть информации в первом компьютере, затем в третьем, затем сменить направление движения и двигаться ко второму компьютеру, и, имея 2 части информации, собрать последнюю часть.

Во втором примере для сбора всех частей оптимальным образом Док может сначала поехать к четвертому компьютеру и получить часть информации, затем, имея одну часть, к пятому компьютеру и получить еще одну часть информации, затем таким же образом ко второму, потом к третьему, и, наконец, к первому. Смены направления произойдут перед движением от пятого ко второму компьютеру, затем от второго к третьему, далее от третьего к первому.

В третьем примере оптимальный порядок сбора частей из компьютеров может выглядеть так: 1->3->4->6->2->5->7.

A. Стоматолог Геннадий

Перебор реализация *1800

Геннадий — один из лучших детских стоматологов Берляндии. Сегодня к нему на прием записались n детишек, которые выстроились в очередь перед его кабинетом.

Все дети любят громко плакать на приеме у зубного врача. Перенумеруем детишек целыми числами от 1 до n в порядке очереди. Каждый ребенок характеризуется величиной решимости pi. Дети по очереди один за другим заходят в кабинет; каждый раз к врачу заходит первый ребенок из очереди.

Пока Геннадий лечит зубы i-му ребенку, ребенок плачет с громкостью vi. При этом решимость первого ребенка в очереди уменьшается на величину vi, второго — на величину vi - 1, и так далее. Дети, находящиеся в очереди после vi-го ребенка, практически не слышат плача, поэтому их решимость остается неизменной.

Если в какой-то момент времени решимость j-го ребенка станет меньше нуля, то он начинает плакать с громкостью dj и, покидая очередь, бежит к выходу, не заходя в кабинет врача. При этом решимости всех детей, находящихся после j-го в очереди, уменьшатся на величину dj.

Все эти события происходят мгновенно, одно за другим в каком-то порядке. Одни крики могут стать причиной других, провоцируя «цепную реакцию». Как только в коридоре становится тихо, в кабинет заходит ребенок, оказавшийся в очереди первым.

Помогите стоматологу Геннадию определить номера детишек, которым он вылечит зубки. Ответ выведите в хронологическом порядке.

Входные данные

В первой строке входных данных находится целое положительное число n (1 ≤ n ≤ 4000) — количество детишек в очереди.

В следующих n строках находятся по три целых числа vi, di, pi (1 ≤ vi, di, pi ≤ 106) — громкость плача в кабинете, громкость плача в коридоре и решимость i-го ребенка.

Выходные данные

В первой строке выведите число k — количество детишек, которым Геннадий вылечит зубки.

Во второй строке выведите k целых чисел — номера детишек, которые дождутся своей очереди, в порядке возрастания.

Примечание

В первом примере сначала Геннадий вылечит зубки первому ребенку, который будет плакать с громкостью 4. Решимости остальных детишек станут равны  - 2, 1, 3, 1 соответственно. Таким образом, второй ребенок тоже заплачет с громкостью 1 и побежит к выходу. Решимости оставшихся детишек станут равны 0, 2, 0. Затем в кабинет войдет третий ребенок и будет плакать с громкостью 5. Оставшиеся дети не выдержат этого и с громким плачем побегут к выходу.

Во втором примере сначала в кабинет войдет первый ребенок, который будет плакать с громкостью 4. Решимости остальных детишек станут равны 5,  - 1, 6, 8. Таким образом, третий ребенок заплачет с громкостью 1 и побежит к выходу. Решимости оставшихся детишек станут равны 5, 5, 7. После этого в кабинет войдет второй ребенок и будет плакать с громкостью 5. Решимости оставшихся детишек станут равны 0, 3. Далее, в кабинет войдет четвертый ребенок и будет плакать с громкостью 2. Вследствие этого решимость пятого ребенка станет равна 1, и он последним войдет в кабинет.

F. Знаки числа Пи

дп реализация Строки *3200

Василий совсем недавно узнал об удивительных свойствах числа π. В одной из статей, которые он прочитал, была высказана гипотеза, что, какую бы последовательность цифр мы не взяли, рано или поздно эта последовательность встретится среди знаков числа π. Таким образом, если взять, например, роман «Война и мир», и закодировать его произвольным образом с помощью цифр, то мы обязательно найдем роман среди знаков числа π.

Василий был просто восхищен этим, поскольку это означает, что все книги, песни и программы уже написаны и зашифрованы в знаках числа π. Василия, конечно, немного насторожило то, что это только гипотеза, поэтому он решил проверить ее самостоятельно.

Для этого Василий скачал из интернета архив с последовательностью знаков числа π с некоторой позиции, и стал проверять разные строки из цифр на наличие в скачанном архиве. Короткие строки цифр Василий находил быстро, но когда он брал длинные строчки, оказывалось, что их в архиве нет. Василий решил взять за определение, что строка длины d встречается наполовину, если в ней есть подстрока длины хотя бы , которая есть в архиве.

Для полноты картины Василий взял 2 больших числа x, y (x ≤ y), имеющих одинаковое количество цифр в десятичной записи, и теперь хочет найти количество чисел, находящихся в отрезке от x до y, которые встречаются в архиве наполовину. Помогите Василию вычислить остаток от деления этого значения на 109 + 7.

Входные данные

В первой строке находится последовательность цифр s (1 ≤ |s| ≤ 1000), в которой Василий собирается искать числа. Согласно гипотезе, такая последовательность цифр на самом деле встречается в десятичной записи числа π, однако мы не можем этого гарантировать.

Во второй и третьей строках находятся два положительных целых числа x, y одинаковой длины d (x ≤ y, 2 ≤ d ≤ 50). Числа x, y не содержат лидирующих нулей.

Выходные данные

Выведите количество чисел в отрезке от x до y, встречающихся наполовину в s, по модулю 109 + 7.

A. Расписание Алёны

реализация *900

Алёна успешно сдала вступительные экзамены в университет и теперь с нетерпением ожидает начала учебы.

Одно занятие в университете традиционно называется парой, потому что длится два академических часа (академический час равен 45 минутам).

Университет работает таким образом, что каждый день в нём проводится ровно n пар. В зависимости от расписания у конкретной группы, в данный день в какие-то пары в самом деле могут проводиться занятия, а какие-то могут быть свободными (такие пары называются «окнами»).

На официальном сайте университета уже появилось расписание на завтра для группы Алёны. Таким образом, про каждую из n пар она знает, будет в это время занятие или нет.

Дом Алёны находится далеко от университета, поэтому не всегда в случае свободных пар она успевает сходить домой. Алёна успевает сходить домой, только если «окно» состоит из хотя бы двух свободных пар подряд, иначе она ожидает следующего занятия в университете.

Конечно, Алёна не хочет быть сонной во время занятий, поэтому она будет спать как можно дольше и придет только к первому занятию, которое у нее будет. Аналогично, если занятий больше нет, то Алёна сразу идет домой.

Алена очень ценит время, проведённое дома, поэтому она всегда идет домой, когда это возможно, и возвращается в университет только к началу следующего занятия. Помогите Алёне определить, сколько пар она будет находиться в университете. Заметим, что во время некоторых пар Алена может находиться в университете в ожидании предстоящего занятия.

Входные данные

В первой строке входных данных находится целое положительное число n (1 ≤ n ≤ 100) — количество пар в университете.

Во второй строке находятся n чисел ai (0 ≤ ai ≤ 1). Число ai равно 0, если у Алёны нет i-го занятия, и равно 1 в противном случае. Числа a1, a2, ..., an разделены пробелами.

Выходные данные

Выведите одно число — количество пар, во время которых Алёна будет находиться в университете.

Примечание

В первом примере Алёна будет находиться в университете со второй по пятую пару включительно, причем во время третьей пары она будет находиться в университете в ожидании следующего занятия.

В последнем примере у Алены нет ни одного занятия, поэтому она проведёт всё время дома.

B. Лаврентий и магазин

реализация *1300

Мальчик Лаврентий долго играл в свою любимую игру Nota и теперь сильно проголодался. Лаврентий хочет сделать себе бутерброды с колбасой и сыром, но для этого ему сначала нужно купить колбасу и сыр.

Город, в котором живет Лаврентий, небольшой. Дома в нем расположены в два ряда по n домов. В самом последнем доме второго ряда живет Лаврентий. Единственный магазин в городе для удобства расположен в первом доме первого ряда.

Между первым и вторым рядами проходит главный проспект города. Соседние дома одного ряда разделяют улицы.

На каждом переходе улицы или проспекта находится светофор. Чтобы перейти улицу, необходимо нажать кнопку на светофоре, подождать некоторое время, пока загорится зеленый свет, и перейти улицу. Время ожидания у разных светофоров может различаться.

У светофора на переходе от j-го дома i-ряда к (j + 1)-му дому того же ряда время ожидания равно aij (1 ≤ i ≤ 2, 1 ≤ j ≤ n - 1). У светофора на переходе от j-го дома одного ряда к j-му дому другого ряда время ожидания равно bj (1 ≤ j ≤ n). Других переходов в городе нет.

Лаврентий хочет дойти до магазина, купить продукты и вернуться назад. Главный проспект города — улица достаточно широкая, поэтому ее Лаврентий хочет перейти ровно один раз на пути в магазин и ровно один раз на пути обратно домой. Идти по одному и тому же пути Лаврентию будет скучно, поэтому он хочет, чтобы путь домой отличался от пути в магазин хотя бы в одном переходе.

Рисунок к первому примеру.

Помогите Лаврентию определить наименьшее суммарное время, которое ему придется ждать на переходах.

Входные данные

В первой строке входных данных находится целое число n (2 ≤ n ≤ 50) — количество домов в каждом ряду.

В каждой из следующих двух строк через пробел находится n - 1 целое число — значения aij (1 ≤ aij ≤ 100).

В последней строке через пробел находятся n целых чисел bj (1 ≤ bj ≤ 100).

Выходные данные

Выведите единственное целое число — наименьшее суммарное время, которое Лаврентию придется ждать на переходах, при условии, что он лишь единожды может переходить проспект как по дороге к магазину, так и по дороге назад.

Примечание

Первый пример разобран на рисунке выше.

Во втором примере путь Лаврентия может выглядеть так:

  • Лаврентий перейдет проспект, время ожидания 3;
  • Лаврентий воспользуется вторым переходом в первом ряду, время ожидания 2;
  • Лаврентий воспользуется первым переходом в первом ряду, время ожидания 1;
  • Лаврентий воспользуется первым переходом в первом ряду, время ожидания 1;
  • Лаврентий перейдет проспект, время ожидания 1;
  • Лаврентий воспользуется вторым переходом во втором ряду, время ожидания 3.
В итоге получим, что ответ равен 11.

В последнем примере Лаврентий посетит все переходы, поэтому ответ равен 4.

A. Слово

реализация Строки *800

Васю очень огорчает, что многие люди в интернете смешивают маленькие и большие буквы в одном слове. Поэтому он решил разработать расширение для своего любимого браузера, которое меняет регистр букв в каждом слове так, чтобы оно либо состояло только из маленьких букв, либо, наоборот, только из больших. При этом в слове должно измениться как можно меньше букв. Например, слово HoUse должно замениться на house, а слово ViP — на VIP. В случае, если в слове содержится одинаковое количество маленьких и больших букв, нужно заменить все буквы на маленькие. Например, maTRIx нужно заменить на matrix. Ваша задача — обработать указанным способом одно заданное слово.

Входные данные

В первой строке записано слово s — оно состоит из больших и маленьких латинских букв и имеет длину от 1 до 100.

Выходные данные

Выведите исправленное слово s. Если в заданном слове s строго больше заглавных букв, приведите его к верхнему регистру, иначе — к нижнему.

B. Гадание

реализация теория чисел *1200

Марина любит Сашу. Но ей не дает покоя вопрос: а любит ли ее Саша? Конечно же, лучший способ узнать это — гадание. Есть много способов гадания, но Марина выбрала самый простой. Она берет в руку одну или несколько ромашек, и отрывает лепестки один за другим. После каждого лепестка она произносит чередуя «Любит» или «Не любит», причем начинает Марина всегда с «Любит». В поле растет n ромашек с количествами лепестков a1, a2, ... an. Марина хочет собрать букет, в котором будет как можно больше лепестков в сумме, а результат гадания, естественно, будет «Любит». Помогите ей это сделать — найдите, какое наибольшее количество лепестков может быть в таком букете.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100) — сколько цветов растет в поле. Во второй строке записано n целых чисел ai (1 ≤ ai ≤ 100) — количество лепестков на i-ой ромашке.

Выходные данные

Выведите одно число — максимальное количество лепестков в букете, итог гадания на котором «Любит». Если такого букета не существует, выведите 0. Букет может состоять из одного цветка.

D. Распределение по командам

жадные алгоритмы Конструктив реализация *2000

Недавно в Центре Олимпиадной Подготовки Программистов Берляндского Государственного Университета завершились личные тренировки. По результатам этих тренировок определяются составы команд на предстоящий сезон командных соревнований. Каждая команда состоит из трех человек. Все обучающиеся в Центре имеют номера от 1 до 3n, а все команды — от 1 до n. Распределение по командам происходит следующим образом: пока остались нераспределенные люди, из них выбирается один с самым лучшим итоговым результатом (капитан новой команды), этот человек выбирает себе двоих сокомандников из оставшихся людей в соответствие со своим списком приоритетов. Список приоритетов каждого человека представляет собой перестановку из всех остальных 3n - 1 студентов, занимающихся в центре, исключая его самого.

Вам даны результаты личных тренировок — перестановка чисел от 1 до 3n, где i-ое число — номер студента, занявшего i-ое место. Никакие два студента не делят одно и то же место. Так же Вам заданы составы получившихся команд в том порядке, в каком эти команды были созданы. Ваша задача — определить список приоритетов для студента с номером k. Если возможных списков приоритетов несколько, найдите лексикографически наименьший.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 105) — количество получившихся команд. Во второй строке через пробел записано 3n целых чисел от 1 до 3n — результаты личных тренировок. Гарантируется, что каждый студент встречается в результатах ровно один раз.

Далее следует n строк по три целых числа от 1 до 3n — каждая строка описывает состав очередной команды. Члены одной команды могут быть перечислены в любом порядке, но сами команды перечислены в порядке их создания. Гарантируется, что распределение корректно, то есть каждый студент является членом ровно одной команды, и такие команды действительно могли быть получены по данным результатам описанным выше способом.

В последней строке записано число k (1 ≤ k ≤ 3n) — номер студента, для которого требуется найти список приоритетов.

Выходные данные

Выведите 3n - 1 чисел — лексикографически наименьший список приоритетов для студента с номером k.

Лексикографическое сравнение реализует оператор < в современных языках программирования. Список a лексикографически меньше списка b, если существует такое i (1 ≤ i ≤ 3n), что ai < bi, а для любого j (1 ≤ j < i) aj = bj. Учтите, что список 1 9 10 лексикографически меньше чем список 1 10 9. То есть сравнение списков отличается от сравнения строк.

A. Медианное сглаживание

реализация *1700

Школьник Вася очень любит читать книжки по программированию и математике. Недавно он прочёл в энциклопедии статью, в которой рассказывалось о методе медианного сглаживания и его многочисленных применениях в науке и технике. Идея метода Васе очень понравилась, и он решил опробовать его на практике.

При использовании простейшего варианта медианного сглаживания по последовательности чисел a1, a2, ..., an строится новая последовательность чисел b1, b2, ..., bn по следующему алгоритму:

  • b1 = a1, bn = an, то есть первое и последнее число новой последовательности совпадают с соответствующими числами исходной последовательности.
  • При i = 2, ..., n - 1 значение bi полагается равным медиане трёх значений ai - 1, ai и ai + 1.

Напомним, что медианой набора из трех чисел называется число, которое окажется на втором месте, если три числа выписать в порядке неубывания. Например, медианой набора 5, 1, 2 является число 2, а медианой набора 1, 0, 1 — число 1.

Чтобы не усложнять себе задачу, Вася решил применять метод только к последовательностям, состоящим из нулей и единиц.

Проделав нехитрую процедуру один раз, Вася посмотрел на получившуюся последовательность и подумал: что будет, если снова применить к ней алгоритм, а потом применить его к следующему результату и так далее? Рассмотрев пару примеров, Вася обнаружил, что через несколько применений медианного сглаживания последовательность может перестать изменяться. Будем говорить, что последовательность стабильна, если она не изменяется при применении к ней медианного сглаживания.

Васе стало интересно, всегда ли последовательность рано или поздно становится стабильной. Он просит вас написать программу, которая по заданной последовательности нулей и единиц определит, становится ли она когда-нибудь стабильной, и если да, то сколько раз для этого нужно применить к ней метод медианного сглаживания.

Входные данные

В первой строке входных данных находится одно целое число n (3 ≤ n ≤ 500 000) — число элементов в рассматриваемой последовательности.

В следующей строке находится исходная последовательность чисел a1, a2, ..., an, состоящая только из нулей и единиц.

Выходные данные

В случае, если последовательность никогда не станет стабильной, выведите одно число  - 1.

В противном случае в первой строке выведите одно число — минимальное число раз, которое нужно применить алгоритм медианного сглаживания, прежде чем последовательность станет стабильной. Во второй строке выведите n чисел через пробел — саму итоговую последовательность.

Примечание

Во втором примере стабилизация наступает через два шага: , а последовательность 00000, как нетрудно заметить, является стабильной.

A. Поединок волшебников

математика реализация *900

Гарри Поттер и Тот-Кого-Нельзя-Называть снова сошлись в смертельном поединке. На этот раз они стоят в противоположных концах коридора длины l метров и одновременно пускают в противника свои смертельные заклинания. Известно, что магический импульс заклинания Гарри распространялся со скоростью p метров в секунду, а магический импульс заклинания Сами-Знаете-Кого — со скоростью q метров в секунду.

Импульсы движутся по коридору навстречу друг другу, и в момент столкновения разворачиваются и летят обратно к тем, кто их выпустил, не меняя своих изначальных скоростей. Затем, каждый из волшебников отражает вернувшийся импульс и тот снова летит в сторону врага, опять же не меняя своей скорости.

Так как Гарри отлично освоил основы магии, то он знает, что после второго столкновения импульсы исчезнут, а в месте их встречи произойдёт сильный взрыв. Но вот с математикой у юного волшебника проблемы, поэтому он просит вас вычислить расстояние от его позиции до места второй встречи импульсов заклинаний, при условии, что противники стоят на месте в течение всего боя.

Входные данные

В первой строке ввода записано единственное целое число l (1 ≤ l ≤ 1 000) — длина коридора, в котором происходит поединок.

Во второй строке находится целое число p, в третьей целое число q (1 ≤ p, q ≤ 500) — скорости магических импульсов Гарри Поттера и Того-Кого-Нельзя-Называть соответственно.

Выходные данные

Выведите единственное число — расстояние от конца коридора, в котором стоит Гарри, до места второй встречи импульсов заклинаний. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 4.

А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если .

Примечание

В первом тесте из условия скорости импульсов равны, поэтому обе их встречи произойдут ровно посередине между Гарри и Тем-Кого-Нельзя-Называть.

B. Ребрендинг

реализация Строки *1200

Название одной маленькой, но очень гордой корпорации состоит из n строчных английских букв. Корпорация решила провести ребрендинг — активную маркетинговую стратегию, включающую комплекс мероприятий по изменению бренда (как компании, так и производимого ею товара), либо его составляющих: названия, логотипа, слогана. Начать решили именно с названия.

Для этого корпорация последовательно наняла m дизайнеров. Как только компания нанимает i-го дизайнера, тот сразу вносит свою лепту в создание нового имени корпорации следующим образом: он меняет в текущей версии названия все буквы xi на yi, а все буквы yi на xi, после чего получается новая версия. Возможно, каких-то из этих букв в строке нет, а также возможно, что xi совпадает с yi. Вариант имени, получившийся после работы последнего дизайнера, становится новым названием корпорации.

Менеджер Аркадий лишь недавно устроился на работу в эту фирму, но уже проникся корпоративным духом и очень переживает за успех ребрендинга. Естественно, ему не терпится узнать, какое имя в итоге получит корпорация.

Удовлетворите любопытство Аркадия — назовите ему окончательный вариант названия.

Входные данные

В первой строке входных данных находятся два числа n и m (1 ≤ n, m ≤ 200 000) — длина изначального названия и количество нанятых дизайнеров соответственно.

Вторая строка состоит из n строчных английских букв и представляет собой изначальное имя корпорации.

В следующих m строках содержатся описания действий дизайнеров: в i-й из последующих строк записаны две строчные английские буквы xi и yi.

Выходные данные

Выведите окончательный вариант названия корпорации.

Примечание

Во втором примере название корпорации последовательно претерпевает следующие изменения:

A. Пешкошахматы

реализация *1200

Галуа — один из сильнейших шахматистов Байтфорсес. Он даже изобрёл новый вариант шахмат, который назвал «Пешкошахматы».

Эта новая игра играется на доске из 8 строк и 8 столбцов. В начале каждой игры на доску ставится несколько черных и белых пешек. Количество черных пешек, поставленных на доску, не обязательно равняется количеству поставленных белых пешек.

Пронумеруем строки и столбцы целыми числами от 1 до 8. Строки пронумерованы сверху вниз, в то время как столбцы пронумерованы слева направо. Теперь обозначим как (r, c) клетку, расположенную в строке r и столбце c.

В игру всегда играют два игрока, A и B. Игрок A ходит белыми пешками, а игрок B ходит чёрными. Цель игрока A — поместить любую из своих пешек в ряд 1, в то время как игрок B стремится поместить любую из своих пешек в ряд 8. Как только один из игроков выполняет свою задачу, игра немедленно заканчивается, и достигший цели игрок объявляется победителем.

Игроки ходят по очереди, начинает игрок А. Во время хода игрок A должен выбрать ровно одну белую пешку и переместить её на одну клетку вверх, а игрок B во время своего хода должен выбрать ровно одну чёрную пешку и переместить её на одну клетку вниз. Любой ход возможен только если клетка, в которую идёт пешка, пустая. Гарантируется, что для любого сценария развития игры каждому игроку будет доступен как минимум один ход.

Движение вверх означает, что пешка, расположенная в клетке (r, c), перейдет в клетку (r - 1, c), а движение вниз означает, что пешка, расположенная в клетке (r, c), перейдёт в клетку (r + 1, c). Ещё раз напомним, что соответствующая клетка должна быть пустой, то есть не должна содержать пешку.

По данному изначальному расположению пешек на доске, определите, кто выиграет в игре, если оба игрока действуют оптимально. Обратите внимание, что благодаря ограничению, что для любого сценария развития игры у обоих игроков всегда будут доступные ходы, игра обязательно завершится победой одного из них.

Входные данные

Входные данные содержат восемь строк по восемь символов в каждой, описывающих состояние доски перед началом игры. Строки соответствуют рядам и следуют в порядке от ряда 1 до ряда 8. Символ 'B' используется для обозначения чёрной пешки, а символ 'W' обозначает белую пешку. Пустая клетка обозначается символом '.'.

Гарантируется, что ни одна белая пешка не расположена в первом ряду, и ни одна чёрная пешка не расположена в последнем ряду.

Выходные данные

Выведите 'A', если игрок A выиграет игру на данной доске и 'B', если победит игрок B. Еще раз напомним, что на данной доске всегда будет победитель.

Примечание

В первом тесте игрок A может достичь своей цели за 3 шага, всегда двигая пешку, изначально расположенную в клетке (4, 5). Игроку B нужно не менее 5 шагов для того, чтобы любая из его пешек дошла до ряда 8. Следовательно, игрок A будет победителем.

A. 2Char

Перебор реализация *1200

Андрей часто читает статьи в своём любимом журнале 2Char. Главная особенность этих статей заключается в том, что в каждой из них используется не более двух различных букв. Андрей решил отправить в журнал свою статью, но поскольку писать их он не умеет, то просто решил взять случайную статью из журнала 26Char. Однако, перед тем как отправлять её в журнал 2Char, необходимо адаптировать текст под формат журнала. Для этого необходимо выбросить некоторые слова, таким образом, чтобы весь оставшийся текст можно было записать используя не более чем две различные буквы.

Поскольку гонорар выплачивается пропорционально количеству непробельных символов в статье, Андрей хочет оставить множество слов с максимальной суммарной длиной.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100) — количество слов в выбранной Андреем статье. Следующие n строк содержат по одному слову каждая. Все слова состоят только из маленьких английский букв, а их суммарная длина не превосходит 1000. Слова могу повторяться, в этом случае разрешается использовать слово в статье не больше раз, чем оно встречается во входных данных.

Выходные данные

Выведите единственное целое число — максимальную возможную суммарную длину слов в статье Андрея.

Примечание

В первом примере оптимальным способом выбрать слова является набор {'abb', 'aaa', 'bbb'}.

Во втором примере слово 'cdecdecdecdecdecde' содержит три различных буквы, поэтому Андрей не может добавить его в свою статью. Оптимальный ответ: {'a', 'a', 'aaaa'}.

C. Эдо и магниты

жадные алгоритмы Перебор реализация *2300

У Эдо скопилась большая коллекция магнитиков на холодильник — целых n штук!

Он решил купить холодильник и повесить магнитики на его дверь. В магазине на заказ могут изготовить холодильник с любым размером двери, удовлетворяющим следующим ограничениям: дверь холодильника должна быть прямоугольником, а длина и ширина двери — целыми положительными числами.

Эдо придумал, как он хочет расположить магнитики на холодильнике. Он ввел систему координат на плоскости, представил каждый магнит в виде прямоугольника со сторонами, параллельными осям координат, и нарисовал их желаемое расположение.

Теперь он хочет убрать не более k магнитиков (возможно, не убирать ни одного) таким образом, чтобы все магнитики оказались прикреплены к двери холодильника, при этом площадь этой двери должна быть минимально возможной. Магнитик считается прикреплённым к двери холодильника, если его центр лежит на двери или на её границе. Относительное расположение неубранных магнитиков на двери холодильника должно совпадать с заданным на плане.

Поясним последние два предложения. Пусть мы хотим повесить на холодильник два магнита. Пусть магнит задан на плане координатами левого нижнего (x1, y1) и правого верхнего (x2, y2) углов, тогда его центр имеет координаты (, ) (возможно, не целые). Под сохранением относительного положения имеется в виду, что доступна только операция параллельного переноса всех магнитов, то есть вектор, соединяющий центры двух магнитов на изначальном плане, должен быть равен вектору, соединяющему центры этих двух магнитов при их расположении на холодильнике.

Стороны двери холодильника так же должны быть параллельны осям координат.

Входные данные

В первой строке содержатся два n и k (1 ≤ n ≤ 100 000, 0 ≤ k ≤ min(10, n - 1)) — количество магнитиков, имеющихся у Эдо, и максимальное количество магнитиков, которые можно не вешать на холодильник, соответственно.

Следующие n строк описывают план расположения магнитиков, нарисованный Эдо. В каждой строке содержится четыре целых числа x1, y1, x2, y2 (1 ≤ x1 < x2 ≤ 109, 1 ≤ y1 < y2 ≤ 109) — координаты левого нижнего и правого верхнего углов текущего магнитика соответственно. Магнитики могут как накладываться друг на друга частично, так и совпадать полностью.

Выходные данные

Выведите единственное целое число — минимальную площадь двери холодильника, на которую можно повесить хотя бы n - k магнитиков, сохраняя относительный порядок.

Примечание

В первом тестовом примере оптимально удалить либо первый, либо третий магнитик. Если удалить первый магнитик, центры двух других будут лежать в точках (2.5, 2.5) и (3.5, 3.5). Таким образом, достаточно купить холодильник с шириной двери 1 и высотой двери 1, и, соответственно, площадью двери также равной 1.

Во втором тестовом примере неважно, какой из магнитиков удалить, потому что ответ все равно не изменится — нужен холодильник с шириной двери 8 и длиной двери 8.

В третьем тестовом примере ничего удалить нельзя, так как k = 0.

A. Виталий и ночь

Конструктив реализация *800

Как-то раз Виталий возвращался домой поздно ночью и заинтересовался вопросом: а сколько ещё людей не спит в это время? Для этого Виталий решил посмотреть, какие окна горят в доме, мимо которого он в этот момент проходил.

Виталий видит перед собой n-этажный дом и m окон на каждом этаже. Согласно планировке, на каждом этаже располагается m квартир, пронумерованных от 1 до m, и каждой из них принадлежит два последовательных окна на данном этаже. Если пронумеровать окна от 1 до m слева направо, то j-й квартире i-го этажа принадлежат окна j - 1 и j в соответствующем ряду окон. Виталий считает, что люди в квартире не спят, если хотя бы в одном из окон этой квартиры горит свет.

Используя информацию о свете в окнах данного дома, вы должны посчитать количество квартир, в которых, по мнению Виталия, жители не спят.

Входные данные

В первой строке входных данных следует два целых числа n и m (1 ≤ n, m ≤ 100) — количество этажей в доме и количество квартир на каждом этаже соответственно.

Следующие n строк описывают этажы сверху вниз и содержат по m символов каждая. Если в i-м окне данного этажа горит свет, то в i-й позиции находится символ '1', иначе там находится символ '0'.

Выходные данные

Выведите единственно целое число — количество квартир, в которых горит свет хотя бы в одном окне, то есть, по мнению Виталия, там кто-то не спит.

Примечание

В первом тестовом примере дом двухэтажный, по две квартиры на каждом этаже, то есть всего в нем 4 квартиры. Свет не горит только на втором этаже в левой квартире, так как в обеих комнатах этой квартиры свет выключен.

Во втором тестовом примере дом одноэтажный, и на первом этаже есть три квартиры. Свет горит в самой левой квартире (в обоих окнах) и в средней квартире (в одном окне). В правой же квартире свет не горит.

A. Вилбур и бассейн

геометрия реализация *1100

Чтобы потренироваться красиво прыгать в воду, Вилбур решил построить бассейн прямоугольной формы у себя на заднем дворе. Он ввёл координатные оси и так выбрал прямоугольник, чтобы его стороны были параллельны этим осям. Конечно, площадь этого прямоугольника была положительна. Все четыре вершины запланированного бассейна были записаны у Вилбура на бумажке, пока не пришёл его вредный друг и не стёр некоторые вершины.

Теперь Вилбуру интересно, можно ли по сохранившимся точкам однозначно восстановить площадь исходного прямоугольника.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 4) — количество вершин, которые вредный друг Вилбура не стал стирать.

В каждой из следующих n строк записаны два целых числа xi и yi ( - 1000 ≤ xi, yi ≤ 1000), задающие координаты i-й из оставшихся вершин. Вершины даны в произвольном порядке.

Гарантируется, что точки яляются вершинами какого-то прямоугольника положительной площади, со сторонами параллельными осям координат.

Выходные данные

Выведите площадь изначального прямоугольника, если её можно однозначно определить по имеющимся данным. В противном случае выведите  - 1.

Примечание

В первом примере сохранились два противоположных угла изначального прямоугольника, и этого достаточно, чтобы определить, что в данном случае прямоугольник являлся единичным квадратом.

Во втором примере осталась только одна вершина, и этого, очевидно, недостаточно, чтобы восстановить площадь изначального прямоугольника.

B. Вилбур и массив

жадные алгоритмы реализация *1100

Свинка Вилбур снова развлекается с массивами. У него есть массив a1, a2, ..., an, изначально заполненный нулями. За один ход он может выбрать любой индекс i и либо добавить 1 ко всем элементам ai, ai + 1, ... , an, либо вычесть 1 из всех элементов ai, ai + 1, ..., an. Его задача — получить в итоге массив b1, b2, ..., bn.

Вилбур хочет достичь этой цели за минимальное количество ходов, и поэтому он просит вас вычислить это значение.

Входные данные

Первая строка входных данных содержит единственное целое число n (1 ≤ n ≤ 200 000) — длину массива ai. Изначально ai = 0 для всех позиций i, так что этот массив не даётся на входе.

Во второй строке входных данных записано n целых чисел b1, b2, ..., bn ( - 109 ≤ bi ≤ 109).

Выходные данные

Выведите минимальное количество ходов, которые необходимо сделать Вилбуру, чтобы получить ai = bi для всех i.

Примечание

В первом примере Вилбур может последовательно выбрать индексы 1, 2, 3, 4, и 5 и прибавить 1 к соответствующим суффиксам.

Во втором примере Вилбур выбирает индексы 1 и 2 и прибавляет 1 к соответствующим суффиксам, а затем выбирает индекс 4 и вычитает 1.

B. Запросы на строке

реализация Строки *1300

Вам даны строка s и m запросов. Каждый запрос задаётся парой индексов li, ri и целым числом ki, и означает, что подстроку s[li... ri] нужно ki раз циклически сдвинуть вправо. Запросы нужно обрабатывать последовательно, друг за другом.

Циклический сдвиг вправо обозначает перемещение последнего символа на место первого и сдвиг всех остальных символов направо на одну позицию.

Например, если исходная строка s равна abacaba, то в случае запроса l1 = 3, r1 = 6, k1 = 1 получится строка abbacaa, если же после этого обработать запрос l2 = 1, r2 = 4, k2 = 2, то в результате получится строка baabcaa.

Входные данные

В первой строке находится строка s (1 ≤ |s| ≤ 10 000) — исходная строка, состоящая из строчных букв английского алфавита. Запись |s| обозначает длину строки s.

Во второй строке находится число m (1 ≤ m ≤ 300) — количество запросов циклического сдвига.

В i-й из следующих m строк находится тройка чисел li, ri и ki (1 ≤ li ≤ ri ≤ |s|, 1 ≤ ki ≤ 1 000 000) — параметры i-го запроса.

Выходные данные

Выведите строку, которая получится после обработки всех m запросов.

Примечание

Пример разобран в условии задачи.

A. Патрик и поход в магазин

реализация *800

Сегодня Патрик ждёт в гости своего друга Спанч Боба. Чтобы подготовиться к встрече, Патрику необходимо посетить два магазина, расположенных рядом с его домом. От дома до первого магазина ведёт дорожка длины d1 метров, а до второго магазина ведёт дорожка длины d2 метров. Также существует дорожка, непосредственно соединяющая два магазина друг с другом, длиной d3 метров. Помогите Патрику вычислить минимальное расстояние, которое ему потребуется пройти, чтобы посетить оба магазина и вернуться домой.

Патрик всегда стартует дома. Он должен посетить оба магазина, перемещаясь только по имеющимся трём дорожкам, и вернуться назад домой. При этом его совершенно не смутит, если ему придётся посетить один и тот же магазин или пройти по одной и той же дорожке более одного раза. Единственная его задача — минимизировать суммарное пройденное расстояние.

Входные данные

В первой строке входных данных находятся три целых числа d1, d2, d3 (1 ≤ d1, d2, d3 ≤ 108) — длины дорожек.

  • d1 — длина дорожки, соединяющей дом Патрика и первый магазин;
  • d2 — длина дорожки, соединяющей дом Патрика и второй магазин;
  • d3 — длина дорожки, соединяющей два магазина.
Выходные данные

Выведите минимальное количество метров, которое придётся пройти Патрику, чтобы посетить оба магазина и вернуться домой.

Примечание

Первый пример изображён на рисунке в условии задачи. Одним из оптимальных маршрутов является: дом первый магазин второй магазин дом.

Во втором примере одним из оптимальных маршрутов является: дом первый магазин дом второй магазин дом.

B. Спанч Боб и шутка

реализация *1500

Пока Патрик бегал по магазинам, Спанч Боб решил немного подшутить над своим другом. Порывшись в его вещах, проказник обнаружил последовательность a1, a2, ..., am длины m, составленную из целых чисел от 1 до n, не обязательно различных. Далее Спанч Боб придумал последовательность f1, f2, ..., fn длины n и получил для каждого числа ai число bi = fai. Исходную последовательность Спанч Боб, разумеется, стёр.

Сложно передать словами, как же расстроился Патрик когда вернулся из магазина! Скажем лишь, что Спанч Боб быстро пожалел о содеянном и пытается восстановить исходную последовательность. Помогите ему это сделать или определите, что это невозможно.

Входные данные

В первой строке входных данных находятся два целых числа n и m (1 ≤ n, m ≤ 100 000) — длины последовательностей fi и bi соответственно.

Во второй строке содержатся n целых чисел, определяющих последовательность f1, f2, ..., fn (1 ≤ fi ≤ n).

В последней строке записаны m целых чисел, определяющих последовательность b1, b2, ..., bm (1 ≤ bi ≤ n).

Выходные данные

Если существует ровно одна последовательность ai, такая что bi = fai для всех i от 1 до m, то выведите "Possible". Далее выведите m целых чисел a1, a2, ..., am.

Если существует несколько подходящих последовательностей ai, то выведите "Ambiguity".

Если Спанч Боб ошибся в своих вычислениях, и ни одной подходящей последовательности ai не существует, то выведите "Impossible".

Примечание

В первом примере 3 заменяется на 1 и наоборот, а 2 никогда не изменяется. Ответ существует, и он единствененный.

Во втором примере все числа заменяются на единицу, поэтому однозначно восстановить исходную последовательность невозможно.

В третьем примере fi ≠ 3 для всех i, поэтому никакая последовательность ai не перейдёт в такую bi и можно точно сказать, что Спанч Боб где-то ошибся.

B. Кабинет президента

реализация *1100

У президента Берляндии очень большой кабинет, в котором кроме него работают и его подчиненные. У каждого подчиненного, как и у президента, есть свой стол уникального цвета. Каждый стол представляет собой прямоугольник, стороны которого параллельны стенам кабинета. В один прекрасный день президент решил учредить собрание, в которое будут входить все его заместители. К сожалению, президент не помнит их количества, однако помнит, что стол каждого заместителя находится рядом с его столом, то есть имеет общую сторону ненулевой длины.

План комнаты президента представляет собой матрицу из n строк и m столбцов. Каждая клетка плана либо пуста, либо содержит часть стола. Цвет стола задается прописной буквой латинского алфавита, которая обозначает цвет. Пустая клетка обозначается символом «точка» («.»).

Входные данные

В первой строке содержатся два разделенных пробелом целых числа n, m (1 ≤ n, m ≤ 100) — длина и ширина комнаты президента, и символ c — цвет стола президента. В следующих n строках находятся по m символов — описание комнаты. Гарантируется, что цвет каждого стола уникален, и каждый стол представляет собой сплошной подпрямоугольник заданной матрицы. Все цвета обозначаются прописными буквами латинского алфавита.

Выходные данные

Выведите единственное число — количество заместителей президента.

A. Где мои хлопья?

реализация *1300

Однажды утром Cereal Guy обнаружил, что все его хлопья пропали. Вместо них он нашел записку. Оказывается, его хитроумный сосед спрятал хлопья в одном из n ящиков. Ящики стоят в один ряд, они пронумерованы от 1 до n слева направо. Сосед оставил подсказки вида: «Спрятано левее i-го ящика» ("To the left of i"), «Спрятано правее i-го ящика» ("To the right of i"). Такие подсказки означают, что в i-ом ящике так же нет хлопьев. Cereal Guy хочет узнать минимальное количество ящиков, которые ему нужно обязательно проверить, чтобы найти хлопья с учетом всех подсказок, либо выяснить, что подсказки противоречат и сосед его обманул, то есть ни в одном из ящиков нет хлопьев.

Входные данные

В первой строчке находятся два целых числа n и m (1 ≤ n ≤ 1000, 0 ≤ m ≤ 1000) — количество ящиков и количество подсказок соответственно. В следующих m строках находятся подсказки вида "To the left of i" и "To the right of i", где i — целое число (1 ≤ i ≤ n). Подсказки могут совпадать.

Выходные данные

В ответе должно содержаться ровно одно число — количество ящиков, которые обязательно нужно проверить, или "-1", если подсказки противоречивы.

A. Выделение чисел

реализация Строки *1600

Задана строка s. Будем называть словом любую наибольшую по включению последовательность подряд идущих символов, не включающую в себя символы ',' (запятая) и ';' (точка с запятой). Например, в строке «aba,123;1a;0» четыре слова: «aba», «123», «1a», «0». Слово может оказаться пустым: например, строка s;;» содержит три пустых слова, которые разделены символом ';'.

Вам требуется найти в заданной строке все слова, являющиеся ЦЕЛЫМИ неотрицательными числами без лидирующих нулей, и по ним построить новую строку a. Строка a должна содержать слова, являющиеся числами, разделенные символом ',' (порядок чисел должен остаться таким же каким был в строке s). По оставшимся словам нужно построить строку b аналогичным образом (порядок слов должен остаться таким же как в строке s).

В этой задаче "101", "0" — это ЦЕЛЫЕ числа, а "01" и "1.0" — нет.

Например, для строки aba,123;1a;0 нужно построить строку a123,0» и строку равную baba,1a».

Входные данные

В единственной строке входных данных находится строка s (1 ≤ |s| ≤ 105). Строка состоит только из символов '.' (ASCII 46), ',' (ASCII 44), ';' (ASCII 59), цифр, строчных и прописных букв латинского алфавита.

Выходные данные

В первой строке выведите строку a, окруженную кавычками (ASCII 34), а во второй — строку b, окруженную кавычками.

Если среди слов в строке s нет чисел, в первой строке выведите знак минус (ASCII 45). Если все слова в строке s являются числами, во второй строке выведите знак минус.

Примечание

Во втором примере строка s содержит 5 слов: «1», «», «01», «a0», «».

A. Два основания

Перебор реализация *1100

Впервые увидев мем ALL YOUR BASE ARE BELONG TO US (грамматически ошибочный вариант фразы "все ваши базы (основания) принадлежат нам" - прим. переводчика), числа X и Y осознали, что они записаны в системах счисления с разными основаниями, что осложнило их отношения.

Вам дана запись числа X по основанию bx и запись числа Y по основанию by. Сравните эти два числа.

Входные данные

В первой строке входных данных записаны два целых числа n и bx (1 ≤ n ≤ 10, 2 ≤ bx ≤ 40), где n — количество цифр в записи числа X по основанию bx.

Во второй строке записано n целых чисел x1, x2, ..., xn (0 ≤ xi < bx) — цифры числа X. Цифры даны в порядке от самого старшего разряда до самого младшего.

Следующие две строки описывают Y аналогичным способом. В третьей строке записано два целых числа m и by (1 ≤ m ≤ 10, 2 ≤ by ≤ 40, bx ≠ by), где m — количество цифр в записи Y по основанию by. Четвёртая строка содержит m целых чисел y1, y2, ..., ym (0 ≤ yi < by) — цифры числа Y.

Ведущих нулей не бывает. Гарантируется, что X и Y — положительные. Все цифры обоих чисел даны в десятичной системе счисления.

Выходные данные

В качестве ответа выведите единственный символ (без кавычек):

  • '<', если X < Y
  • '>', если X > Y
  • '=', если X = Y
Примечание

В первом примере X = 1011112 = 4710 = Y.

Во втором примере X = 1023 = 215 и Y = 245 = 1123, поэтому X < Y.

В третьем примере и Y = 48031509. Несложно заметить, что X начинается с большей цифры, при этом основание bx больше основания by, поэтому X, очевидно, будет больше Y.

B. Аппроксимизация постоянного диапазона

дп реализация *1400

На практических занятиях в университете Кселлосу однажды довелось измерять интенсивность эффекта, медленно приближающегося к состоянию равновесия. Хороший способ измерить интенсивность в такой системе — это выбрать достаточно большое количество последовательных частных значений, кажущихся почти одинаковыми, и взять их среднее значение. Конечно, при обычных размерах данных в этом нет ничего сложного, но почему бы не сделать из этого задачу для соревнований по программированию?

Вам дана последовательность из n значений a1, a2, ..., an. Между последовательными значениями не бывает больших скачков — для любого 1 ≤ i < n гарантируется, что |ai + 1 - ai| ≤ 1.

Диапазон значений [l, r] называется почти постоянным, если разница между наибольшим и наименьшим значением в этом диапазоне не превышает 1. Формально, пусть M максимальное, а m — минимальное значение ai при l ≤ i ≤ r, тогда диапазон [l, r] почти постоянен, если M - m ≤ 1.

Найдите максимальную длину почти постоянного диапазона.

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 100 000) — длина последовательности ai.

Во второй строке записано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 100 000).

Выходные данные

Выведите единственное число — максимальную длину почти постоянного диапазона данной последовательности.

Примечание

В первом примере максимальным по длине почти постоянным диапазоном является [2, 5]; его длина равна 4.

Во втором примере имеется три почти постоянных диапазонов длины 4: [1, 4], [6, 9] и [7, 10]. Почти постоянный диапазон максимальной длины 5 только один: [6, 10].

A. Коровофорсес

реализация *1000

Кевин Сан только что закончил писать Codeforces Round #334! Раунд длился 120 минут и состоял из пяти задач с максимальными баллами равными 500, 1000, 1500, 2000 и 2500 соответственно. Несмотря на тяжелые задания, Кевин пахал как бык, дабы вырваться из стада и стать ведущим комууупьютерным специалистом во всей Буринии. Кевин знает, на какой минуте он сдал каждую из задач, сколько неверных попыток он сделал по каждой из них и сколько всего он сделал успешных и неуспешных взломов. Так как система подсчёта итоговых баллов на Codeforces довольно сложная, Кевин хочет, чтобы вы написали программу, вычисляющую его итоговой результат.

Итоговое количество баллов на Codeforces рассчитывается следующим образом: если максимальное количество баллов за задачу равно x, а Кевин успешно сдал задачу через m минут после начала, но перед этим сделал w неверных попыток, то его баллы за эту задачу равны . Итоговый результат равен сумме баллов, полученных по каждой задаче. Дополнительно Кевин получает 100 баллов за каждый удачный взлом и теряет 50 баллов за каждый неудачный взлом.

Все арифметические операции выполняются абсолютно точно, без округлений. Гарантируется, что итоговое количество баллов, набранных Кевином, будет целым.

Входные данные

В первой строке входных данных записано пять целых чисе m1, m2, m3, m4, m5, где mi (0 ≤ mi ≤ 119) — количество минут, прошедших перед тем как Кевин сдал задачу i.

Во второй строке записано пять целых чисел w1, w2, w3, w4, w5, где wi (0 ≤ wi ≤ 10) — количество неверных попыток Кевина по задаче i.

В последней строке записано два целых числа hs и hu (0 ≤ hs, hu ≤ 20), обозначающих количество успешных и неуспешных взломов, сделанных Кевином.

Выходные данные

Выведите единственное целое число — итоговый результат Кевина.

Примечание

Во втором примере Кевину потребовалось 119 минут на все задачи. Следовательно, за каждую задачу он получает баллов. Итоговый результат будет: . Добавим 10·100 = 1000 баллов за взломы, и итоговый результат будет равен 3930 + 1000 = 4930.

A. Магические сферы

реализация *1200

Карл — начинающий волшебник. У него есть a голубых, b фиолетовых и c оранжевых магических сфер. За одно действие он может превратить две сферы одного и того же цвета в одну сферу любого другого цвета. Чтобы создать невиданное ранее заклинание, Карлу необходимо как минимум x голубых, y фиолетовых и z оранжевых сфер. Сможет ли он их получить (возможно, за несколько действий)?

Входные данные

В первой строке записаны три целых числа a, b и c (0 ≤ a, b, c ≤ 1 000 000) — количества голубых, фиолетовых и оранжевых сфер, находящихся в распоряжении Карла.

Во второй строке записаны три целых числа x, y и z (0 ≤ x, y, z ≤ 1 000 000) — количества голубых, фиолетовых и оранжевых сфер, которые ему надо получить.

Выходные данные

Если Карл сможет получить необходимые количества сфер, выведите «Yes». Иначе выведите «No».

Примечание

В первом примере у Карла есть 4 голубые и 4 фиолетовые сферы. Первым действием он может превратить две голубые сферы в одну фиолетовую, после чего у него станет 2 голубых и 5 фиолетовых сфер. Затем волшебник превращает 4 фиолетовых сферы в 2 оранжевых, и у него останется 2 голубых, 1 фиолетовая и 2 оранжевых сферы, что и было нужно.

B. Испытания роботов

реализация *1600

В организации Cybernetics Failures (CF) создали прототип робота-сапёра. Для обнаружения возможных проблем в его функционировании было принято решение провести серию испытаний. В начале каждого испытания прототип робота будет помещён в клетку (x0, y0) прямоугольного клетчатого поля размера x × y, после чего в одну из клеток поля будет установлена мина. Предполагается провести ровно x·y испытаний, каждый раз устанавливая мину в ранее не использованную клетку. Стартовая же клетка робота никогда не меняется.

После размещения объектов на поле робот должен будет выполнить последовательность команд, заданную строкой s, состоящей только из символов 'L', 'R', 'U', 'D'. Эти команды предписывают роботу переместиться влево, вправо, вверх или вниз на одну клетку или остаться на месте, если перемещение в данном направлении невозможно. Как только робот выполнит всю последовательность команд, он взорвется из-за бага в коде. Если же в какой-то момент времени робот находится в одной клетке с миной, он также взорвётся, но уже не из-за бага в коде.

Движение влево уменьшает координату y, а движение вправо её увеличивает. Аналогично, движение вверх уменьшает координату x, а движение вниз её увеличивает.

Испытания могут затянуться очень надолго, поэтому вам предстоит предсказать их результаты. Для каждого k от 0 до length(s) вам требуется найти, в скольких испытаниях робот выполнит ровно k команд, прежде чем взорвётся.

Входные данные

В первой строке записаны четыре целых числа x, y, x0, y0 (1 ≤ x, y ≤ 500, 1 ≤ x0 ≤ x, 1 ≤ y0 ≤ y) — размеры поля и стартовые координаты робота. Координатная ось X направлена вниз, а ось Y — вправо.

Во второй строке записана последовательность команд s, которую надо исполнять роботу. Она имеет длину от 1 до 100 000 символов и состоит только из символов 'L', 'R', 'U', 'D'.

Выходные данные

Выведите последовательность, состоящую из (length(s) + 1) чисел. На k-й позиции, если считать с нуля, выведите количество испытаний, в которых робот выполнит ровно k команд, прежде чем взорвётся.

Примечание

В первом примере, если исключить возможное воздействие мин, маршрут робота будет выглядеть так: .

A. Сайтама громит гостиницу

математика реализация *1000

Опять Сайтама ненарочно уничтожил гостиницу. Чтобы расплатиться с гостиничной компанией, Генос вызвался управлять лифтом в одной из уцелевших гостиниц этой компании. Лифт обладает рядом особенностей: он всегда начинает движение с верхнего этажа, может двигаться только вниз и имеет бесконечную вместимость. Этажи пронумерованы от 0 до s, при этом лифт всегда находится на этаже номер s в момент времени 0.

Лифту требуется ровно 1 секунда, чтобы переместиться ровно на 1 этаж вниз. Временем, которое тратится на посадку и высадку пассажиров, можно пренебречь. У Геноса есть список, детально описывающий, когда и на какой этаж прибывает очередной пассажир. Пожалуйста, определите минимальное количество секунд, за которое можно доставить всех пассажиров на этаже номер 0.

Входные данные

В первой строке входных данных записано два целых числа n и s (1 ≤ n ≤ 100, 1 ≤ s ≤ 1000) — количество пассажиров и номер верхнего этажа соответственно.

В каждой из следующих n строк записано по два целых числа fi и ti (1 ≤ fi ≤ s и 1 ≤ ti ≤ 1000) — номер этажа и время прибытия в секундах для i-го пассажира.

Выходные данные

Выведите единственное целое число — минимальное количество времени в секундах, необходимое для того, чтобы высадить всех пассажиров на этаже с номером 0.

Примечание

В первом примере необходимо потратить не меньше 11 секунд, чтобы доставить всех пассажиров на этаж номер 0. Одним из способов это сделать является:

1. Доехать до этажа номер 5: занимает 2 секунды.

2. Взять пассажира номер 3.

3. Доехать до этажа номер 3: занимает 2 секунды.

4. Подождать, пока подойдет пассажир номер 2: занимает 4 секунды.

5. Взять пассажира номер 2.

6. Доехать до этажа номер 2: занимает 1 секунду.

7. Взять пассажира номер 1.

8. Доехать до этажа номер 0: занимает 2 секунды.

9. Высадить всех пассажиров.

Итого получается 2 + 2 + 4 + 1 + 2 = 11 секунд.

A. Флеш-карты

жадные алгоритмы реализация сортировки *800

У Эдварда есть n флеш-карт объемом a1, a2, ..., an мегабайт и большой файл размера m мегабайт.

Найдите минимальное количество флеш-карт, на которые можно записать файл Эдварда, если он может разделить свой файл на части произвольного размера.

Входные данные

В первой строке входных данных содержится целое положительных число n (1 ≤ n ≤ 100) — количество флеш-карт.

Во второй строке входных данных содержится целое положительное число m (1 ≤ m ≤ 105) — размер файла Эдварда в мегабайтах.

В следующих n строках входных данных содержится последовательность целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 1000) — размеры флеш-карт в мегабайтах.

Гарантируется, что ответ существует, то есть сумма всех ai не меньше чем m.

Выходные данные

В единственной строке выходных данных должно содержаться целое положительное число — минимальное количество флеш-карт, на которые можно записать файл Эдварда, если он может разделить свой файл на части произвольного размера.

Примечание

В первом тестовом примере Эдварду нужно 2 флеш-карты — первая и третья.

Во втором тестовом примере Эдварду нужны все 3 флеш-карты.

В третьем тестовом примере Эдварду нужна тольно одна флеш-карта и он может выбрать любую из имеющихся — либо первую, либо вторую.

B. Книга - лучший подарок

Конструктив реализация *1100

Совсем скоро Вика будет отмечать свой день рождения, и Саша решил сделать ей подарок.

Он пришел в книжный магазин, в котором в продаже есть n книг. Каждая из книг относится ровно к одному из m жанров.

Саша решил купить ровно две книги различных жанров. Перед вами стоит задача определить количество способов, которые есть у Саши, чтобы купить подарок Вике. Два способа считаются различными, если они отличаются хотя бы одной книгой.

Для удобства все жанры пронумерованы от 1 до m.

Входные данные

В первой строке содержатся два целых числа n и m (2 ≤ n ≤ 2·105,  2 ≤ m ≤ 10) — количество книг в магазине и количество жанров, в которых написаны эти книги.

Во второй строке содержится последовательность целых положительных чисел a1, a2, ..., an, где ai (1 ≤ ai ≤ m) обозначает жанр i-й книги.

Гарантируется, что в магазине есть хотя бы одна книга каждого жанра.

Выходные данные

В первой строке выходных данных должно содержаться единственное целое число — количество способов, которые есть у Саши, чтобы купить подарок Вике.

Гарантируется, что ответ на каждый тест не превышает 2·109.

Примечание

Ответ на первый тестовый пример равен 5, так как Саша может выбрать:

  1. первую и вторую книги,
  2. первую и третью книги,
  3. первую и четвертую книги,
  4. вторую и третью книги,
  5. третью и четвертую книги.

C. Балансировка нагрузки

математика реализация *1500

Для обработки запросов к некоторому сетевому сервису используются n серверов. Известен текущий план распределения запросов между серверами: i-ый сервер должен обработать mi запросов.

Было решено выполнить балансировку нагрузки, переназначая задания между серверами. Более формально, пусть ma — количество запросов, которые обрабатывает наиболее загруженный сервер, а mb — количество запросов, которые обрабатывает наименее загруженный сервер. Нагрузка будет считаться сбалансированной, если разность ma - mb будет минимально возможной.

За одну секунду можно переназначить один запрос. То есть, за одну секунду можно выбрать любую пару серверов, снять ровно один запрос с одного сервера и назначить этот же запрос другому серверу.

Перед вами стоит задача найти минимальное количество секунд, по истечении которых нагрузка серверов будет сбалансирована.

Входные данные

В первой строке содержится целое положительное число n (1 ≤ n ≤ 105) — количество серверов.

Во второй строке содержится последовательность неотрицательных целых чисел m1, m2, ..., mn (0 ≤ mi ≤ 2·104), где mi — количество запросов, изначально предназначенных для обработки i-м сервером.

Выходные данные

Выведите одно целое неотрицательное число — минимальное количество секунд, по истечении которых нагрузка серверов будет сбалансирована.

Примечание

В первом тестовом примере достаточно потратить 2 секунды. В каждую секунду необходимо переназначить запрос со 2-го сервера на 1-й. После двух секунд первому серверу будет назначено 3 запроса, а второму серверу — 4.

Во втором тестовом примере нагрузка серверов уже сбалансирована.

Один из оптимальных ответов для третьего тестового примера:

  1. переназначить запрос с 4-го сервера на 1-й сервер (последовательность m станет равной 2 2 3 3 5);
  2. переназначить запрос с 5-го сервера на 1-й сервер (последовательность m станет равной 3 2 3 3 4);
  3. переназначить запрос с 5-го сервера на 2-й сервер (последовательность m станет равной 3 3 3 3 3).

Это один из возможных способов выполнить балансировку нагрузки серверов за 3 секунды.

A. Быстрый математик

реализация *800

Шапур был очень способным студентом. Ему хорошо давались все науки: комбинаторика, алгебра, теория чисел, геометрия и все остальные. При этом он был не только умным, но и чрезвычайно быстрым! Он мог складывать 1018 чисел всего за одну секунду.

Однажды в 230 году н. э. Шапур забеспокоился, не может ли кто-нибудь считать быстрее него. Он решил провести соревнование, в котором мог участвовать любой.

На соревновании он раздал участникам много разных пар чисел. Каждое число состояло из цифр 0 и 1. Участник в соответствие с данной ему парой чисел должен получить третье. Правило простое: i-я цифра ответа равна 1 тогда и только тогда, когда i-е цифры двух данных чисел отличаются. Иначе i-я цифра ответа — 0.

Шапур подготовил много чисел и сначала решил проверить собственную скорость. Он понял, что может выполнять эти операции для чисел длины в мгновенье ока (длина числа — это количество цифр в нем)! Шапур всегда вычисляет абсолютно верно, и от участников своего соревнования ждет того же. Он честный человек, поэтому никогда не даст никому слишком большие числа, и он всегда дает одному человеку числа одинаковой длины.

Сейчас вы примете участие в соревновании Шапура. Посмотрим, кто быстрее!

Входные данные

Входные данные состоят из двух строк. В каждой содержится одно число. Гарантируется, что числа состоят только из цифр 0 и 1 и имеют одинаковую длину. Числа могут начинаться с 0. Длина чисел не превосходит 100.

Выходные данные

Выведите соответствующий ответ. Обязательно выводите лидирующие 0 (нули).

B. Вика и квадраты

Конструктив реализация *1300

У Вики есть n банок с красками различных цветов. Все банки пронумерованы от 1 до n, при этом в i-й банке содержится ai литров краски цвета i.

Также у Вики есть бесконечно длинный прямоугольный лист бумаги шириной 1, состоящий из квадратов размера 1 × 1, пронумерованных 1, 2, 3 и так далее до бесконечности. Вика решила, что будет закрашивать квадраты один за другим слева направо, начиная с квадрата номер 1 и некоторого цвета, при этом если предыдущий квадрат был закрашен в цвет x, то следующий квадрат она будет красить в цвет x + 1. Если же x = n, то Вика красит следующий квадрат цветом номер 1. Если цвет, которым Вика собирается красить очередной квадрат, уже кончился, то Вика останавливается и больше ничего не красит.

Один квадрат всегда полностью красится в один цвет, и на это уходит ровно 1 литр краски. Перед вами стоит задача посчитать максимально возможное количество закрашенных квадратов, если Вика правильно выберет цвет для покраски квадрата с номером 1.

Входные данные

В первой строке входных данных записано целое положительное число n (1 ≤ n ≤ 200 000) — количество баночек с красками различных цветов, которые есть у Вики.

Во второй строке входных данных следует последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109), где ai равно количеству литров краски с цветом i, которые есть у Вики.

Выходные данные

Выходные данные должны содержать единственное целое число — максимальное количесто квадратов размера 1 × 1, которые могут быть покрашены Викой, если она действует по описанным выше правилам.

Примечание

В первом примере выгоднее всего начинать красить с цвета номер 4. Тогда квадраты, начиная с левого, будут раскрашены в цвета: 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5.

Во втором примере можно начинать красить с любого цвета.

В третьем примере выгоднее всего начинать красить с цвета номер 5.

A. Новый год и дни

реализация *900

Сегодня среда, третий день недели, но гораздо интереснее то, что завтра последний день 2015-го года.

Лимак — белый медвежонок, которому очень понравился этот год, и он с нетерпением ждёт грядущего 2016 года. Лимак хочет показать всем, какой он ответственный медвежонок, поэтому он собирается копить конфеты на протяжении всего 2016-го года! С этой целью он рассматривает два различных плана: откладывать одну конфету в какой-то фиксированный день недели, либо в какой-то фиксированный день месяца.

Лимак выбрал конкретный план и просит вас посчитать, сколько конфет он накопит в 2016 году, если будет строго придерживаться выбранного плана. Пожалуйста, посчитайте это значение и скажите ему.

Входные данные

Единственная строка входных данных следует одному из двух форматов:

  • "x of week", где x (1 ≤ x ≤ 7) обозначает день недели.
  • "x of month", где x (1 ≤ x ≤ 31) обозначает день месяца.
Выходные данные

Выведите единственное целое число — количество конфет, которые Лимак накопит в 2016 году.

Примечание

Белые медведи живут по Григорианскому календарю. Это наиболее распространённый календарь, и, скорее всего, вы тоже его используете. Если вам требуются уточнения, то можете прочитать соответствующую статью на Википедии – https://ru.wikipedia.org/wiki/Григорианский_календарь.

В первом примере Лимак будет откладывать по конфете каждый четверг (4-й день недели). В 2016 году 52 четверга, следовательно медвежонок накопит 52 конфеты.

Во втором примере Лимак будет откладывать по одной конфете в 30-й день каждого месяца. 30-й день есть ровно в 11 месяцах 2016 года — всех, кроме февраля. Таким образом, Лимак накопит 11 конфет.

B. Новый год и старые свойства

битмаски Перебор реализация *1300

2015 год почти подошёл к концу.

Лимак — белый медвежонок, который недавно узнал о двоичной системе счисления. Он сразу заметил, что запись номера прошедшего года в двоичной системе счисления содержит ровно один ноль — 201510 = 111110111112. Обратите внимание, количество нулей в записи числа в десятичной системе счисления значения не имеет.

Лимак выбрал некоторый интервал лет и теперь собирается посчитать количество лет из этого интервала, таких что их запись в двоичной системе счисления так же содержит ровно один ноль. А сможете ли вы сделать это быстрее?

Считайте, что положительные целые числа всегда записываются без ведущих нулей.

Входные данные

В единственной строке входных данных записаны два целых числа a и b (1 ≤ a ≤ b ≤ 1018) — первый и последний год в интервале Лимака, соответственно.

Выходные данные

Выведите одно целое число — количество лет в данном интервале, запись которых в двоичной системе счисления содержит ровно один ноль.

Примечание

В первом примере интервал Лимака содержит числа 510 = 1012, 610 = 1102, 710 = 1112, 810 = 10002, 910 = 10012 и 1010 = 10102. Два из них (1012 и 1102) обладают описанным выше свойством.

C. Новый год и домино

дп реализация *1500

Лимак — белый медвежонок, который очень любит играть. Недавно он получил прямоугольную таблицу, состоящую из h рядов и w столбцов. Каждая клетка этой таблицы либо пустая (обозначается '.'), либо занятая (обозначается '#'). Ряды нумеруются от 1 до h сверху вниз. Столбцы нумеруются от 1 до w слева направо.

Также у Лимака есть одна доминошка, которую он хочет поместить куда-нибудь в табличку. Доминошка займёт две соседние по стороне клетки, расположенные в одной строке или в одном столбце. Обе эти клетки должны быть пустыми и находиться внутри таблицы.

Лимаку нужно больше играть и веселиться, поэтому он рассмотрит некоторые запросы. В каждом запросе он выбирает некоторый прямоугольник и задаётся вопросом: а сколькими способами можно полностью поместить имеющуюся доминошку в выбранный прямоугольник?

Входные данные

В первой строке записаны два целых числа h и w (1 ≤ h, w ≤ 500) — количество строк и количество столбцов в таблице, соответственно.

В следующих h строках записана таблица. В каждой строке находится строка длины w, каждый символ которой равен либо '.', либо '#', что означает пустую и занятую клетку, соответственно.

В следующей строке записано единственное число q (1 ≤ q ≤ 100 000) — количество запросов.

В каждой из следующих q строк находятся по четыре целых числа r1i, c1i, r2i, c2i (1 ≤ r1i ≤ r2i ≤ h, 1 ≤ c1i ≤ c2i ≤ w) — i-й запрос. Числа r1i и c1i определяет верхний левый угол, а числа r2i и c2i — нижний правый угол соответствующего прямоугольника.

Выходные данные

Выведите q чисел, i-е из которых соответствует количеству способов полностью расположить доминошку внутри i-го прямоугольника.

Примечание

Красная рамочка на рисунке ниже соответствует первому запросу в первом примере. Существует 4 способа расположить доминошку.

F. Новый год и уборка

Бинарный поиск реализация *2500

Лимак — белый медвежонок, которому родители сказали убраться в доме накануне Нового Года. Их дом можно представить как прямоугольную таблицу, состоящую из h рядов и w столбцов. Все клетки пустые, и по ним можно передвигаться.

Медвежонок маленький, и поэтому сам он не может убраться в доме. Вместо этого он собирается использовать робота-уборщика.

Робот-уборщик обладает встроенным шаблонов из n движений, определяемым строкой длины n. Одно движение (один символ) передвигает робота в одну из смежных клеток. Каждый символ является одним из следующих четырёх: 'U' (движение вверх), 'D' (движение вниз), 'L' (движение влево), 'R' (движение вправо). На каждое движение требуется ровно одна минута.

Лимак помещает робота-уборщика в некоторую клетку таблицы и влючает. После этого робот повторяет свой шаблон движений, пока не упрётся в стену (одну из четырех границ дома). Когда робот упрётся в стену, он выключается, после чего его можно снова поставить в какую-нибудь клетку и включить.

Лимак не уверен, будет ли достаточно поместить робота-уборщика в одной клетке, поэтому собирается запускать робота h·w раз, по одному разу из каждой клетки. Вполне может оказаться, что какие-то клетки были почищены более одного раза, но кому какое дело?

Лимак хочет знать, сколько времени уйдёт на уборку по такому алгоритму. Посчитайте необходимое количество минут по модулю 109 + 7. Также возможно, что робот-уборщик никогда не остановится, тогда выведите "-1" (без кавычек).

Считайте, что Лимак мгновенно ставит робота в нужную клетку и включает. Ход робота, на котором он упирается в стену, также занимает одну минуту и учитывается в ответе. Для уточнения посмотрите в комментарии к примерам.

Входные данные

В первой строке входных данных записано три целых числа n, h и w (1 ≤ n, w, h ≤ 500 000) — длина встроенного шаблона, количество строк и столбцов в таблице, соответственно.

Во второй строке записана строка длины n — шаблон движения из n ходов. Каждый символ — одна из следующих заглавных букв: 'U', 'D', 'L', 'R'.

Выходные данные

Выведите единственную строку с ответом.

Если робот никогда не закончит уборку, то выведите "-1" (без кавычек). В противном случае выведите продолжительность уборки по модулю 109 + 7.

Примечание

В первом примере дом представляется табличкой из 10 строк и 2 столбцов. Если запустить робота в какой-либо клетке второго столбца, то он совершит ровно один ход (потратит на это одну минуту), в котором он ударится о стену, поскольку попробует пойти направо, но третьего столбца нет. Соответственно, начиная в первом столбце, робот сделает два хода. Итоговая продолжительность уборки составляет 10·1 + 10·2 = 30.

Во втором примере робот будет пытаться выполнять последовательность "RULRULRULR...". Например, если запустить его в самой левой клетке второго ряда, то он совершит ровно пять ходов, перед тем как остановится, потому что ударится в стену.

A. Разбиение текста

Перебор реализация Строки *1300

Вам задана строка s длины n и пара чисел p, q. Вам требуется разбить строку s на строки длины p и q. Например, строку "Hello" при p = 2, q = 3 можно разбить на две строки "Hel" и "lo" или на две строки "He" и "llo".

Заметим, что допускается разбиение строки только на строки длины p или только на строки длины q (смотрите второй тестовый пример).

Входные данные

В первой строке находятся три целых положительных числа n, p, q (1 ≤ p, q ≤ n ≤ 100).

Во второй строке находится строка s, состоящая из строчных и прописных букв латинского алфавита, и цифр.

Выходные данные

Если разбить строку s на строки длины p и q невозможно выведите число "-1".

В противном случае в первой строке выведите целое число k — количество строк в разбиении s.

В следующих k строках выведите строки в разбиении. Каждая строка должна быть длины p или q. Строки нужно вывести в порядке появления в исходной строке s — слева направо.

Если существует несколько решений, разрешается вывести любое из них.

B. HDD - устаревшая технология

математика реализация *1200

При хранении данных на жестких дисках типа HDD данные группируются по секторам. Все файлы разбиваются на фрагменты, которые в свою очередь записываются в некоторых секторах жесткого диска. При этом сектора, в которых находится один файл не обязательно следуют друг за другом и могут располагаться в произвольном порядке.

Одной из проблем HDD-носителей является то, что магнитная головка должна перемещаться от одного сектора к другому, чтобы считать один файл.

Вам требуется определить время за которое будет считан файл, разбитый на n фрагментов. В i-м секторе записан фрагмент файла номер fi (1 ≤ fi ≤ n). При этом в различных секторах находятся в различные фрагменты. Будем считать, что изначально магнитная головка находится в секторе, в котором записан первый фрагмент. Считывание происходит следующим образом: сначала считывается первый фрагмент, затем магнитная головка перемещается к сектору, содержащему второй фрагмент, считывается второй фрагмент и так далее пока не будет считан n-й фрагмент. Фрагменты считываются один за другим по порядку от 1-го до n-го.

На перемещение магнитной головки от a-го сектора до b-го уходит |a - b| единиц времени. Временем считывания информации можно пренебречь.

Входные данные

В первой строке находится целое положительное число n (1 ≤ n ≤ 2·105) — количество фрагментов файла.

Во второй строке находятся n различных целых чисел fi (1 ≤ fi ≤ n) — номер фрагмента, записанного в i-м секторе.

Выходные данные

Выведите одно целое число — количество единиц времени, необходимое для считывания файла.

Примечание

Во втором примере магнитная головка двигается следующим образом:

  • 1->2: передвижение из сектора 1 в сектор 5 — требует 4 единицы времени
  • 2->3: передвижение из сектора 5 в сектор 2 — требует 3 единицы времени
  • 3->4: передвижение из сектора 2 в сектор 4 — требует 2 единицы времени
  • 4->5: передвижение из сектора 4 в сектор 3 — требует 1 единицы времени

Таким образом, ответ равен 4 + 3 + 2 + 1 = 10.

A. Link/Cut Tree

Перебор реализация *1500

Программист Ростислав серьёзно увлёкся структурой данных Link/Cut Tree, которая основана на Splay-деревьях. В частности, сейчас он изучает процедуру expose.

К сожалению, понять определение этой процедуры Ростислав не в состоянии, и поэтому он решил обратиться за помощью к программисту Серёже. Тот согласился помочь, только если Ростислав решит простую задачу (а если не решит, то зачем ему Splay-деревья?)

По заданным l, r и k необходимо вывести все степени числа k в промежутке от l до r, включая границы. Однако Ростиславу не хочется решать эту задачу самостоятельно, ведь он увлекся сетевой игрой в Agar с Глебом. Помогите ему!

Входные данные

В первой строке входных данных через пробел записаны три целых числа l, r и k (1 ≤ l ≤ r ≤ 1018, 2 ≤ k ≤ 109).

Выходные данные

Выведите все степени числа k, лежащие в промежутке от l до r, в порядке возрастания. Если таких чисел не существует, выведите "-1" (без кавычек).

Примечание

Пояснение к первому примеру: 1 = 20, 2 = 21, 4 = 22, 8 = 23. 16 = 24, что больше чем 10, следовательно не подходит.

B. Программа Гены

математика реализация *1400

Идёт 4527 год, а всеми любимая игра про танки ещё существует. Как существует и программа великого Гены, написанная в 2016 году. Цель этой программы — по известным количествам танков, которые идут в бой от каждой страны, найти их произведение. Ведь если оно слишком большое, то сервера не успеют распределить танки по командам, и случится коллапс!

В мире ровно n различных стран, и от i-й страны в игру было добавлено ai танков. Так как создатели игры перфекционисты, число танков от каждой страны является красивым. Красивое число в понимании разработчиков — это такое число, что его десятичная запись состоит только из '1' и '0' и при этом содержит не более одной единицы. Однако из-за жалоб игроков некоторое количество танков одной страны было удалено из игры, в результате чего число танков от этой страны могло перестать быть красивым.

Ваша цель — написать программу, решающую данную задачу, чтобы на всякий случай проверить корректность программы Гены.

Входные данные

В первой строке входных данных написано количество стран n (1 ≤ n ≤ 100 000). Вторая строка содержит n неотрицательных целых чисел ai без ведущих нулей — количество танков от i-й страны.

Гарантируется, что вторая строка содержит хотя бы n - 1 красивое число, и суммарная длина записей всех чисел в ней не превосходит 100 000.

Выходные данные

Выведите одно число без ведущих нулей — произведение чисел танков, выставленных от каждой из стран.

Примечание

В примере 1 числа 10 и 1 - красивые, число 5 - нет.

В примере 2 число 11 некрасивое (содержит две '1'), остальные - красивые.

В примере 3 число 3 некрасивое, остальные - красивые.

A. Лампочки

реализация *800

Вася хочет зажечь новогоднюю гирлянду, состоящую из m лампочек. Изначально все лампочки выключены. Вася может нажать на какие-то из n кнопок, каждая из которых зажигает некоторый набор соединённых с ней лампочек. Может ли Вася включить все лампочки?

Если при нажатии на кнопку какая-то из соединённых с ней лампочек уже была включена, то с ней ничего не происходит, она так и остаётся включённой.

Входные данные

В первой строке входных данных записаны числа n и m (1 ≤ n, m ≤ 100) — количество кнопок и количество лампочек соответственно. Каждая из последующих n строк содержит сначала xi (0 ≤ xi ≤ m) — количество лампочек, соединённых с i-й кнопкой, а затем xi чисел yij (1 ≤ yij ≤ m) — номера этих лампочек.

Выходные данные

Выведите "YES", если Вася может зажечь всю гирлянду, и "NO" в противном случае.

Примечание

В первом примере, нажав по одному разу каждую кнопку, Вася зажжет все лампочки. Во втором примере невозможно зажечь 3-ю лампочку.

E. Шестиугольники

Бинарный поиск математика реализация *2100

Айрат ищет идеальный код. Свои поиски он решил начать с бесконечного поля, замощённого шестиугольниками. Для удобства на поле задана система координат, посмотрите на рисунок, чтобы определить как вычисляются координаты шестиугольников.

Айрат обыскивает поле, стартовав с точки (0, 0) и идя по спирали (см. рисунок). Но иногда он забывает, в какой точке поля сейчас находится. Помогите Айрату найтись — определите координаты шестиугольника, на котором стоит Айрат после n ходов.

Входные данные

Во входных данных записано единственное целое число n (0 ≤ n ≤ 1018) — число ходов, сделанных Айратом.

Выходные данные

Выведите два целых числа x и y — координаты Айрата через n ходов.

A. Сравнение длинных чисел

реализация Строки *900

Вам заданы два очень больших целых числа a, b (возможно с лидирующими нулями). Нужно определить какое из заданных чисел больше, либо определить, что они равны.

Поскольку размер входных данных очень большой крайне не рекомендуется использовать посимвольное чтение. Используйте чтение строк или слов целиком.

Рекомендуется для ввода и вывода данных использовать функции scanf, printf в языке C++, поскольку они работают значительно быстрее потоков cin, cout. Аналогично, рекомендуется использовать классы BufferedReader, PrintWriter вместо Scanner, System.out в языке Java. В языке Python2 не рекомендуется использовать функцию input(), вместо неё нужно использовать функцию raw_input().

Входные данные

Первая строка входных данных содержит неотрицательное целое число a.

Вторая строка входных данных содержит неотрицательное целое число b.

Числа a, b могут содержать лидирующие нули. Каждое из них содержит не более 106 цифр.

Выходные данные

Если a < b выведите символ "<", если a > b выведите символ ">". Если же числа равны выведите "=".

E. Сумма остатков

математика реализация теория чисел *2200

Посчитайте значение суммы n mod 1 + n mod 2 + n mod 3 + ... + n mod m. Поскольку ответ может быть достаточно большим, вам нужно посчитать его по модулю 109 + 7 (остаток при делении на число 109 + 7).

Оператор модуля a mod b обозначает взятие остатка при делении числа a на число b. Например, 10 mod 3 = 1.

Входные данные

В единственной строке находятся два целых числа n, m (1 ≤ n, m ≤ 1013) — параметры суммы.

Выходные данные

Выведите целое число s — остаток значения искомой суммы при делении на число 109 + 7.

C. Поливка цветов

реализация *1600

На клумбе много цветов, и для их поливки используют два фонтанчика. Регулируя напор, можно установить любые значения радиусов r1(r1 ≥ 0) и r2(r2 ≥ 0), на которые разлетается вода от первого и второго фонтанчиков соответственно. Необходимо установить такие значения r1 и r2, чтобы все цветы были политы, то есть для каждого цветка расстояние до первого фонтанчика не должно превышать r1, или расстояние до второго фонтанчика не должно превышать r2. Некоторые цветы могут оказаться в зоне досягаемости для обоих фонтанчиков, в этом нет ничего страшного.

Требуется уменьшить суммарный расход воды, то есть выбрать такие значения r1 и r2, чтобы, с одной стороны, все цветы были политы, а с другой — чтобы величина r12 + r22 была минимальной. Найдите это минимальное значение.

Входные данные

В первой строке входных данных находятся пять целых чисел n, x1, y1, x2, y2 (1 ≤ n ≤ 2000,  - 107 ≤ x1, y1, x2, y2 ≤ 107) — количество цветов на клумбе и координаты первого и второго фонтанчиков соответственно.

Далее идут n строк. В i-й из них записаны два целых числа xi и yi ( - 107 ≤ xi, yi ≤ 107) — координаты i-го цветка.

Гарантируется, что все n + 2 точки во входных данных различны.

Выходные данные

Выведите минимально возможное значение r12 + r22. Обратите внимание, что в данной задаче оптимальный ответ всегда выражается целым числом.

Примечание

Первый пример (r12 = 5, r22 = 1): Второй пример (r12 = 1, r22 = 32):

D. Ломаная

Конструктив реализация *1700

На координатной плоскости отмечены три различные точки. Через них требуется провести простую ломаную, без самопересечений и самокосаний, состоящую только из звеньев, параллельных осям координат. От вас требуется найти, из какого минимального количества звеньев эта ломаная может состоять.

Входные данные

В каждой из трёх строк входных данных записано по два целых числа. В i-й строке находятся числа xi, yi ( - 109 ≤ xi, yi ≤ 109) — координаты i-й точки. Гарантируется, что все точки различны.

Выходные данные

Выведите одно число — минимальное возможное количество звеньев подходящей ломаной.

Примечание

Вариант ломаной в первом примере: Вариант ломаной во втором примере: Вариант ломаной в третьем примере:

A. Объединение слизней

реализация *800

На день рождения ваш друг подарил вам n слизней, каждый из которых изначально имеет толщину 1.

Вы решили развлечься. Сначала вы ставите одного слизня на подоконник, а затем последовательно добавляете остальных. При добавлении очередного слизня вы ставите его правее всех уже имеющихся слизней. Пока на подоконнике находится больше одного слизня и крайние два справа имеют одну и ту же толщину v, вы можете объединить их вместе, чтобы создать слизня толщины v + 1.

Определите толщину всех слизней, которые будут стоять на подоконнике в конце этого процесса.

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 100 000).

Выходные данные

Выведите единственную строку с k целыми числами, где k является итоговым количеством слизней после завершения процедуры, описанной в условии задачи. i-е из этих чисел должно быть толщиной i-го слева слизня.

Примечание

В первом примере у нас есть единственный слизень толщиной 1. Конечное состояние доски — 1.

Во втором примере мы выполняем следующие шаги:

  1. Размещаем на подоконнике одного слизня.
  2. Добавляем ещё одного слизня. Теперь подоконник выглядит как 1 1.
  3. Поскольку два последних слизня имеют одинаковую толщину, то мы заменяем этих слизней на одного слизня толщины 2.

Таким образом, конечное состояние подоконника равно 2.

В третьем примере после добавления первых двух слизней подоконник выглядит как 2. После добавления ещё одного слизня — 2 1.

В последнем примере шаги выглядят следующим образом:

  1. 1
  2. 2
  3. 2 1
  4. 3
  5. 3 1
  6. 3 2
  7. 3 2 1
  8. 4

C. Созвездие

геометрия реализация *1600

Кот Ноку заполучил карту ночного неба. На этой карте он нашёл созвездие, которое состоит из n звёзд, пронумерованных от 1 до n. Известно, что i-я звезда расположена в точке с координатами (xi, yi). Координаты всех звёзд различны.

Вечером Ноку собирается пойти смотреть на ночное небо. Он хотел бы найти три различные звезды, которые образуют треугольник положительной площади. Кроме того, все остальные звезды должны лежать строго вне этого треугольника. У кота возникли проблемы с поиском таких трёх звёзд, и он не отказался бы от вашей помощи. Ваша задача — найти индексы трёх звезд, которые образуют треугольник, удовлетворяющий всем условиям.

Гарантируется, что все звёзды не лежат на одной прямой. Можно доказать, что если предыдущее условие выполняется, то существует хотя бы одно решение задачи.

Входные данные

В первой строке входных данных записано единственное целое число n (3 ≤ n ≤ 100 000) — количество звёзд.

Каждая из следующих n строк содержит два целых числа xi и yi ( - 109 ≤ xi, yi ≤ 109).

Гарантируется, что никакие две звезды не лежат в одной точке и что не существует прямой, на которой лежат все звёзды.

Выходные данные

Выведите три целых числа — индексы трёх точек, которые образуют треугольник, удовлетворяющий всем требованиям Ноку.

Если правильных ответов несколько, то разрешается вывести любой.

Примечание

В первом примере можно вывести три индекса в любом порядке.

Второму примеру соответствует следующая картинка:

Обратите внимание, что треугольник из точек 1, 4 и 3 не удовлетворяет условию задачи, так как точка 5 не лежит строго вне треугольника (находится на границе).

B. Тындекс.Бром

Бинарный поиск реализация *1800

И снова Тындекс догоняет и перегоняет своих конкурентов! В ответ на выход Жужль Хром явился новый браузер — Тындекс.Бром!

С каждым днём растёт популярность нового браузера. И дело даже не в том, что в него встроен Тындекс.Бар, который, после покупки Тындекс.Бутылки и подключения её к USB-порту, автоматически наполняет тару прекрасным коньяком 1664 года; а благодаря продуманному взаимодействию с пользователем.

Возьмём, например, систему автоматического исправления адреса. Вы ввели codehorses вместо codeforces? Унылый Жужль Хром уныло скажет, мол, нет такого адреса. В то же время Тындекс.Бром автоматически подберёт ближайший адрес и отправит вас именно туда. Гениально!

Как же работает эта замечательная система? Очень просто! Для каждого потенциального адреса вычисляется функция ошибки F по следующим правилам:

  • для каждой буквы ci из потенциального адреса c находится ближайшая позиция j этой же буквы во введенном пользователем адресе s. К F прибавляется модуль разности этих позиций |i - j|. То есть для каждого i (1 ≤ i ≤ |c|) позиция j выбирается таким образом, что ci = sj, а |i - j| минимально.
  • если такой буквы ci во введенном пользователем адресе нет, то к F прибавляется длина потенциального адреса |c|

После вычисления значений функции ошибки для всех потенциальных адресов выбирается наиболее подходящий.

Для того чтобы лучше разобраться в особенностях описанного выше способа, рекомендуется реализовать алгоритм вычисления функции F для заданного пользователем адреса и некоторого набора потенциальных адресов. Дерзайте!

Входные данные

В первой строке дано два целых числа n и k (1 ≤ n ≤ 105, 1 ≤ k ≤ 105) — количество потенциальных адресов и длина введённого пользователем адреса. В следующей строке записано k строчных латинских букв — введённый пользователем адрес s. В каждой последующей i-ой (1 ≤ i ≤ n) строке дана непустая последовательность из строчных латинских букв — собственно потенциальный адрес. Гарантируется, что суммарная длина всех строк не превышает 2·105.

Выходные данные

В каждой из n строк выходного файла выведите одно число: значение функции ошибки при выборе текущего потенциального адреса.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

C. Инквизиция

геометрия реализация сортировки *2300

В средние века хорошей традицией было сжигать ведьм на костре вместе с их подопечными — чёрными кошками. К концу 15-го века популяция чёрных кошек оказалась исчерпана. В связи со сложившейся тяжёлой ситуацией была созвана ЧИК — Чрезвычайная Инквизиционная Комиссия.

В постановлении №666 указано, что белая кошка является чёрной тогда и только тогда, когда периметр её чёрных пятен превышает допустимую норму. Чему же равна допустимая норма? Каждый инквизитор выберет её сам в зависимости от ситуации. Ваша же задача — найти периметр чёрных пятен на шкуре кошки.

В том же постановлении указано, что шкура кошки представляет собой белый квадрат длины 105. В процессе измерения пятен принято левый нижний угол шкуры помещать в начало координат (0;0), а правый верхний — в точку с координатами (105;105). Пятна кошек являются невырожденными треугольниками. Пятна кошек могут пересекаться и накладываться друг на друга, но гарантируется, что каждая пара сторон треугольных пятен имеет не более одной общей точки.

Периметром в данной задаче будем считать суммарную длину границ, на которых происходит смена цвета шкуры кошки.

Входные данные

В первой строке входного файла записано единственное целое число n (0 ≤ n ≤ 100) — количество пятен на шкуре кошки. В i-ой из последующих n строк дано 6 целых чисел: x1i, y1i, x2i, y2i, x3i, y3i — координаты i-го треугольного пятна (0 < xji, yji < 105).

Выходные данные

Выведите одно число — ответ на задачу, периметр объединения треугольников. Ваш ответ должен отличаться от правильного не более чем на 10 - 6.

A. Робот профессора GukiZ

математика реализация *800

Профессор GukiZ собрал нового робота. Робот находится в точке с координатами (x1, y1) и должен попасть в точку (x2, y2). За один шаг робот может изменить (уменьшить или увеличить) любую из своих координат (возможно обе) на единицу. Таким образом, у робота имеется 8 возможных ходов. Определите наименьшее количество шагов за которое робот сможет попасть в точку назначения.

Входные данные

В первой строке находится пара целых чисел x1, y1 ( - 109 ≤ x1, y1 ≤ 109) — исходное положение робота.

Во второй строке находится пара целых чисел x2, y2 ( - 109 ≤ x2, y2 ≤ 109) — конечное положение робота.

Выходные данные

Выведите целое число d — наименьшее количество ходов, необходимое роботу, чтобы попасть в точку назначения.

Примечание

В первом примере робот должен четыре раза увеличить обе свои координаты на единицу, оказавшись в точке (4, 4). Затем он должен увеличить только координату y на единицу. Таким образом, он попадёт в точку (4, 5).

Во втором примере робот должен три раза одновременно увеличивать координату x и уменьшать координату y.

B. Калькулятор дедушки Довлета

реализация *1000

Однажды в сундуке своего дедушки Довлета Макс нашёл электронный калькулятор. Цифры на нём отображались с помощью семисегментных индикаторов (https://ru.wikipedia.org/wiki/Семисегментный_индикатор).

Макс стал по очереди набирать на калькуляторе все числа от a до b. После набора каждого числа Макс нажимал кнопку сброса. Определите общее количество сегментов, отображённых на калькуляторе.

Например, если a = 1 и b = 3, то на калькуляторе сначала отобразится 2 сегмента, затем — 5 и снова отобразится 5 сегментов. Таким образом, общее количество отображённых сегментов будет равно 12.

Входные данные

В единственной строке находится пара целых чисел a, b (1 ≤ a ≤ b ≤ 106) — первое и последнее число набранное Максом.

Выходные данные

Выведите одно целое числа a — общее количество отображённых сегментов.

A. Мокрая Акула и чётность

реализация *900

Сегодня Мокрой Акуле дали n целых чисел. Он хочет выбрать некоторые из них, чтобы получить максимально возможную чётную (то есть, делящуюся на 2) сумму. Пожалуйста, вычислите, на что может рассчитывать Мокрая Акула.

Обратите внимание, что если Мокрая Акула не выберет ни одного числа, то сумма будет равна чётному числу 0.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — количество чисел. В следующей строке записаны n целых чисел, имеющихся у Мокрой Акулы. Все эти числа не меньше 1 и не больше 109.

Выходные данные

Выведите максимально возможную чётную сумму, которую можно получить, используя каждое из данных чисел не более одного раза.

Примечание

В первом примере можно выбрать все три числа, получив таким образом сумму 6.

Во втором примере Мокрая Акула может выбрать любые четыре из пяти имеющихся чисел 999 999 999.

B. Мокрая Акула и слоны

Комбинаторика реализация *1300

Сегодня у Мокрой Акулы есть n слонов на шахматной доске 1000 на 1000. Строки и столбцы пронумерованы от 1 до 1000, при этом строки пронумерованы сверху вниз, а столбцы пронумерованы слева направо.

Мокрая Акула считает, что два слона атакуют друг друга, если они стоят на одной диагонали. Обратите внимание, в отличие от настоящих шахмат, наличие третьего слона между ними не является помехой. Теперь Мокрая Акула хочет посчитать количество пар слонов, которые атакуют друг друга.

Входные данные

В первой строке входных данных содержится число n (1 ≤ n ≤ 200 000) — количество слонов на шахматной доске.

Каждая из следующих n строк содержит два целых числа xi и yi (1 ≤ xi, yi ≤ 1000) — номер строки и номер столбца, в которых расположен i-й слон. Гарантируется, что позиции всех слонов различны.

Выходные данные

Выведите количество пар слонов, которые атакуют друг друга.

Примечание

В первом примере атакуют друг друга следующие пары слонов: (1, 3), (1, 5), (2, 3), (2, 4), (3, 4) и (3, 5). Пары (1, 2), (1, 4), (2, 5) и (4, 5) друг друга не атакуют, так как соответствующие слоны не находятся на одной диагонали.

A. Бесконечная последовательность

математика реализация *1000

Рассмотрим бесконечную последовательность целых чисел: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5.... Эта последовательность образована следующим образом: сначала выписано число 1, затем числа от 1 до 2, затем числа от 1 до 3, затем числа от 1 до 4 и так далее. Обратите внимание, что это последовательность целых чисел, а не цифр. Например, число 10 впервые встречается в этой последовательности на 55 позиции (элементы нумеруются с единицы).

Найдите число, находящееся на n-й позиции, если нумерация начинается с единицы.

Входные данные

В единственной строке находится целое число n (1 ≤ n ≤ 1014) — позиция числа, которое нужно найти.

Обратите внимание, что заданное число не помещается в 32-битном типе данных. Для сохранения числа вы можете использовать, например, тип long long в языке C++ или тип long в языке Java.

Выходные данные

Выведите n-й элемент последовательности (элементы нумеруются с единицы).

B. Время

реализация *900

Вам задано текущее время в 24-часовом формате hh:mm. Требуется определить и вывести время в том же формате спустя a минут.

Обратите внимание, что вам нужно найти лишь время спустя a минут. Смотрите примеры для уточнения условия задачи.

Подробнее о 24-часовом формате вы можете прочитать здесь https://ru.wikipedia.org/wiki/Время_суток.

Входные данные

В первой строке находится текущее время в формате hh:mm (0 ≤ hh < 24, 0 ≤ mm < 60). Часы и минуты заданы двумя цифрами (числа меньшие 10 дополнены лидирующими нулями).

Во второй строке находится целое число a (0 ≤ a ≤ 104) — прошедшее количество минут.

Выходные данные

В единственной строке выведите время спустя a минут в формате описанном во входных данных. Обратите внимание, что нужно вывести ровно две цифры для часов и минут (при необходимости нужно дополнить их лидирующими нулями).

Смотрите примеры для уточнения формата входных/выходных данных.

C. Не равный на отрезке

реализация Структуры данных *1700

Вам задан массив из n целых чисел a, а также m запросов. Каждый запрос задан тройкой целых чисел li, ri, xi.

Для каждого запроса вам нужно найти любую позицию pi (li ≤ pi ≤ ri) такую, что api ≠ xi.

Входные данные

В первой строке находится пара целых чисел n, m (1 ≤ n, m ≤ 2·105) — количество чисел в массиве и количество запросов.

Во второй строке находятся n целых чисел ai (1 ≤ ai ≤ 106) — элементы массива a.

В следующих m строках заданы запросы тремя целыми числами li, ri, xi (1 ≤ li ≤ ri ≤ n, 1 ≤ xi ≤ 106) — параметры i-го запроса.

Выходные данные

Выведите m строк. На i-й строке выведите целое число pi — позицию любого числа в отрезке [li, ri] не равного xi, либо число  - 1, если такого числа нет.

A. Гость из прошлого

математика реализация *1700

Коля Герасимов очень любит кефир, и в своём 1984 году он освоил все тонкости покупки этого чудесного напитка. Но однажды, как вам, наверное, известно, он попал в далёкий 2084 год, где покупка кефира представляет собой более сложный процесс.

Будущее будущим, а кушать хочется всегда, поэтому Коля отправился в местную молочную лавку. В 2084 году кефир продают в литровых пластиковых бутылках по a копеек за штуку и в литровых бутылках из стекла по b копеек за штуку. При этом пустую стеклянную бутылку можно сдать и получить назад c (c < b) копеек, а пластиковую бутылку сдать нельзя.

У Коли в кармане есть n копеек, и он очень голоден, поэтому хочет выпить как можно больше литров кефира. Так как в его время не было пластиковых бутылок, он совсем не знает, как действовать. Поэтому он обратился за помощью к вам, как к единственному знакомому в будущем.

Входные данные

В первой строке входных данных задаётся число n (1 ≤ n ≤ 1018) — количество копеек у Коли в кармане.

В строках со второй по четвертую по одному записаны числа a, b и c (1 ≤ a ≤ 1018, 1 ≤ c < b ≤ 1018) — стоимость пластиковой бутылки с кефиром, стоимость стеклянной бутылки с кефиром и сколько копеек можно получить, сдав пустую стеклянную бутылку, соответственно.

Выходные данные

Выведите одно целое число — максимальное количество литров кефира, которое сможет выпить Коля.

Примечание

В первом примере Коля может купить один литр в стеклянной бутылке, затем сдать эту бутылку и снова купить стеклянную бутылку. Таким образом, он сможет выпить два литра кефира.

Во втором примере Коля может купить две пластиковые бутылки и получить два литра кефира или купить сначала один литр в стекле, потом сдать бутылку и купить одну бутылку в пластике. В обоих случаях он купит два литра кефира.

C. K-специальные таблички

Конструктив реализация *1300

Чего не сделаешь ради того, чтобы выделиться из серой массы. Кто-то танцует, кто-то учит наизусть правила русского языка, кто-то пытается стать выдающимся спортивным программистом, ну а кто-то коллекционирует забавные математические объекты.

Алиса как раз из таких коллекционеров. Сейчас она очень хочет заполучить k-специальную табличку. Напомним, что табличка n × n называется k-специальной, если выполнены следующие три условия:

  • каждое число от 1 до n2 встречается в ней ровно 1 раз;
  • в каждой строке числа идут в возрастающем порядке;
  • сумма чисел, расположенных в k-м столбце, максимальна.

Помогите Алисе! Отыщите хотя бы одну k-специальную табличку размера n × n. Строки и столбцы нумеруются от 1 до n, при этом строки нумеруются сверху вниз, а столбцы слева направо.

Входные данные

В первой строке входных данных записаны два числа n и k (1 ≤ n ≤ 500, 1 ≤ k ≤ n) — размер искомой таблички и номер столбца, сумма в котором должна быть максимальна.

Выходные данные

В первой строке выведите сумму чисел в k-м столбце искомой таблички.

В следующих n строках выведите саму табличку: сначала n элементов первой строки, затем n элементов второй и так далее.

Если искомых табличек несколько, то выведите любую из них.

D. Контрольная по арифметике

Конструктив математика реализация *2400

Отличник Витя учится в третьем классе. На последнем уроке математики в четверти учительница Оксана Филипповна дала итоговую контрольную работу по арифметике. На контрольной сообразительный Витя быстрее всех справился со стандартными заданиями. Поскольку до конца урока оставалось ещё много времени, учительница предложила ему решить более сложное упражнение.

Рассмотрим операцию переворота целого положительного числа: при её применении десятичные цифры числа записываются в обратном порядке, затем если у результата есть ведущие нули, они отбрасываются. Например, при перевороте из числа 123 получается число 321, из числа 130 — число 31, а из числа 31 — число 13.

Оксана Филипповна загадала целое положительное число a без ведущих нулей и применила к нему операцию переворота, получилось число ar. После этого она сложила a и ar, дала Вите их сумму n и попросила его найти исходное число a.

Поскольку в предложенном учительницей примере числа a и ar были небольшими, Витя быстро угадал правильный ответ и задумался над построением общего алгоритма для решения задачи. Его интересует, как по заданному числу n найти какое-либо a или определить, что такого a не существует. Помогите Вите разработать такой алгоритм.

Входные данные

В первой строке входных данных находится одно целое число n (1 ≤ n ≤ 10100 000).

Выходные данные

В случае если не существует ни одного целого положительного числа a без ведущих нулей такого, что a + ar = n, выведите единственное число 0.

В противном случае выведите подходящее a без пробелов и ведущих нулей. Если удовлетворяющих условию вариантов несколько, выведите любой.

Для лучшего понимания формата вывода рекомендуется изучить примеры.

Примечание

В первом примере 4 = 2 + 2, a = 2 — единственный вариант.

Во втором примере 11 = 10 + 1, a = 10 — единственный вариант. Обратите внимание, что вариант a = 01 не подходит, поскольку a не может иметь ведущие нули.

Легко проверить, что в третьем примере ни одного подходящего a не существует.

В четвёртом примере 33 = 30 + 3 = 12 + 21, и существует три варианта для a: a = 30, a = 12, a = 21. Любой из них является правильным ответом.

A. Последовательность команд

Перебор реализация *1000

Робот Кельвин находится на бесконечном клетчатом поле. Его исходный код является последовательностью из n команд, каждая из которых это «U», «R», «D», или «L» — указание роботу сдвинуться на одну клетку вверх, вправо, вниз или влево соответственно. Кельвину интересно, сколько различных подстрок (непрерывных подпоследовательностей) строки с командами обладают тем свойством, что, выполнив все команды данной подстроки, Кельвин вернётся в ту же клетку, с которой начинал. Две подстроки считаются различными, если у них отличаются индексы первой или последней позиции.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 200) — длина исходной последовательности команд.

В следующей строке записаны n символов, каждый из которых является «U», «R», «D» или «L» — сама исходная последовательность команд.

Выходные данные

Выведите единственное целое число — количество подстрок, выполнение которых оставит Кельвина на месте.

Примечание

В первом примере подходит вся строка и подстрока «RL».

Обратите внимание: в третьем примере подстрока «LR» встречается три раза, поэтому и в ответе должна быть учтена тоже три раза.

A. Теннисный турнир

математика реализация *1000

Проходит теннисный турнир, в котором соревнуются n участников. Участники играют по олимпийской системе, где победители проходят дальше, а проигравшие навсегда вылетают из турнира.

Турнирная сетка составляется следующим образом (далее m количество участников текущего раунда):

  • находится k, равное максимальной степени числа 2, что k ≤ m,
  • k участников соревнуются в текущем раунде и половина из них проходит в следующий раунд, оставшиеся m - k участников проходят в следующий раунд без борьбы,
  • когда остаётся только один участник, турнир завершается.

В каждом матче требуется b бутылок воды для каждого участника и одна бутылка для судьи. Кроме этого, каждому игроку выдаётся p полотенец на весь турнир.

Определите количество бутылок и полотенец, необходимое для проведения турнира.

Обратите внимание, что это теннисный турнир, поэтому в каждом матче соревнуются два участника (один из них выигрывает, а другой проигрывает).

Входные данные

В единственной строке находится три целых числа n, b, p (1 ≤ n, b, p ≤ 500) — количество участников турнира и параметры, описанные в условии задачи.

Выходные данные

Выведите два целых числа x и y — количество бутылок и полотенец, необходимое для проведения турнира.

Примечание

В первом примере будет три раунда:

  1. в первом раунде будет два матча и для каждого необходимо по 5 бутылок воды (по две бутылки игрокам и одну судье),
  2. во втором раунде будет только один матч, поэтому нам нужно ещё 5 бутылок воды,
  3. в третьем раунде также будет один матч, поэтому нам нужно ещё 5 бутылок воды.

Таким образом, всего нам нужно 20 бутылок воды.

Во втором примере ни один участник не пройдёт ни в какой раунд напрямую.

E. Zbazi в Zeydabad

реализация Структуры данных *2300

Турист решил посетить страну Zeydabad для участия в Zbazi (популярная игра в Zeydabad).

Страна Zeydabad представляет собой прямоугольное клетчатое поле, состоящее из n строк и m столбцов. Каждая клетка в стране обозначена либо символом 'z', либо символом '.'.

Турист знает, что государство называется Zeydabad потому, что в нём есть много ''Z-паттернов". ''Z-паттерн" это квадрат с побочной диагональю полностью заполненной символами 'z', а также с верхней и нижней строками полностью заполненными символами 'z'. Остальные клетки квадрата могут быть произвольными.

Заметим, что ''Z-паттерн" может состоять только из одной клетки (смотрите примеры).

Теперь он хочет посчитать количество ''Z-паттернов" в стране (это необходимый навык для игры в Zbazi).

Помогите туристу с подсчётом количества ''Z-паттернов".

Рекомендуется для ввода и вывода данных использовать функции gets, scanf, printf в языке C++, поскольку они работают значительно быстрее чем getline, cin, cout. Аналогично, рекомендуется использовать классы BufferedReader, PrintWriter вместо Scanner, System.out в языке Java.

Входные данные

Первая строка содержит пару целых чисел n, m (1 ≤ n, m ≤ 3000) — количество строк и столбцов, соответственно.

Каждая из следующих n строк содержит m символов 'z' или '.' — описание страны Zeydabad.

Выходные данные

Выведите целое число a — количество ''Z-паттернов" в Zeydabad.

A. Дальние родственники и торт

Комбинаторика Конструктив Перебор реализация *800

Семья Доров готовится праздновать день рождения Фомы Дора, для этого члены семьи приготовили ему весьма своеобразный торт.

Торт представляет собой квадрат n × n, состоящий из одинаковых квадратиков со стороной 1. Каждый квадрат либо пустой, либо содержит шоколадку. Члены семьи испекли торт и разложили на нём шоколадки. Они думают, что радость Фомы будет равна количеству пар клеток с шоколадками, расположенных в одной строке или в одном столбце. Теперь они пытаются вычислить, чему же будет равно это значение для данного торта.

Обратите внимание, что каждая пара может быть посчитана не более чем один раз, поскольку две различные клетки не могут быть одновременно расположены в одной строке и в одном столбце.

Входные данные

В первой строке входных данных записано единственное целое число n (1 ≤ n ≤ 100) — длина стороны торта.

Следующие n строк содержат по n символов, описывающих сам торт. Пустые клетки обозначаются символом «.», а клетки, содержащие шоколадку, задаются символом «C».

Выходные данные

Выведите, чему будет равна радость Фомы Дора, когда он увидит торт, то есть количество клеток с шоколадками, расположенных в одной строке или в одном столбце.

Примечание

Пронумеруем строки сверху вниз, а столбцы слева направо. Тогда в одной строке расположены:

  1. (1, 2) и (1, 3)
  2. (3, 1) и (3, 3)
В одном столбце расположены следующие клетки с шоколадками:
  1. (2, 1) и (3, 1)
  2. (1, 3) и (3, 3)

A. Кораблекрушение

реализация сортировки Строки *900

Корабль наткнулся на риф и сейчас терпит крушение. Теперь весь экипаж должен быть срочно эвакуирован. Все n членов экипажа уже выстроились в один ряд (для удобства пронумеруем их всех слева направо натуральными числами от 1 до n) и ждут дальнейших указаний. Однако эвакуировать экипаж полагается не абы как, а в строгом порядке. А именно:

Сначала корабль покидают те члены экипажа, которые являются крысами. Затем корабль покидают женщины и дети (и те, и другие имеют одинаковый приоритет). После этого с корабля эвакуируются все мужчины. Последним тонущий корабль покидает капитан.

Если для каких-либо двух членов экипажа нельзя точно установить, кто должен покинуть корабль раньше по правилам из предыдущего абзаца, то раньше корабль покидает тот, который стоит левее в ряду (или, другими словами, тот, у которого номер в ряду меньше).

Для каждого члена экипажа известно, кем он является, а так же его имя. Все члены экипажа имеют различные имена. Определите порядок эвакуации экипажа.

Входные данные

В первой строке находится целое число n — количество людей в экипаже (1 ≤ n ≤ 100). Далее идут n строчек. В i-ой из этих строк находятся два слова — имя i-го члена экипажа в ряду и его статус на корабле. Слова разделяются ровно одним пробелом, других пробелов в строке нет. Имена состоят из латинских букв, первая буква заглавная, остальные — прописные. Длина любого имени от 1 до 10 символов. Статус может иметь следующие значения: rat — крыса, woman — женщина, child — ребенок, man — мужчина, captain — капитан. В экипаже ровно один капитан.

Выходные данные

Выведите n строк. i-ая из них должна содержать имя члена экипажа, который должен покинуть корабль i-ым по счету.

B. Тренировки у поселенцев

реализация *1200

В стратегической компьютерной игре «Settlers II» для расширения и охраны своей территории необходимо строить защитные сооружения. Рассмотрим одно из таких сооружений. В текущий момент данное защитное сооружение вмещает в себя ровно n солдат. В рамках данной задачи можно считать, что количество солдат в этом защитном сооружении не будет ни увеличиваться, ни уменьшаться.

Каждый солдат имеет звание — некоторое натуральное число от 1 до k. 1 — рядовой, k — генерал. Чем выше звание у солдата, тем лучше он сражается. Поэтому для игрока выгодно иметь солдат как можно более высокого звания.

Для повышения званий солдат нужно тренировать. Просто так солдаты тренироваться не будут, и для каждой тренировки нужна одна золотая монета. На каждой тренировке присутствуют все n солдат.

В конце каждой из тренировок звания солдат повышаются следующим образом. Сначала все солдаты разбиваются на группы с одинаковым званием так, чтобы получилось наименьшее возможное количество групп. Затем в каждой из таких групп, где находятся солдаты звания ниже k, ровно один из солдат повышает свое звание на единицу.

Вам известны звания всех n солдат на текущий момент. Определите количество золотых монет, нужных для повышения званий всех солдат до звания k.

Входные данные

В первой строке содержится два целых числа n и k (1 ≤ n, k ≤ 100) — количество солдат и количество различных званий соответственно. Во второй строке в неубывающем порядке находятся n чисел. i-е из них — ai — означает звание i-го солдата в защитном сооружении (1 ≤ i ≤ n, 1 ≤ ai ≤ k).

Выходные данные

Выведите одно целое число — количество золотых монет, требуемых для повышения званий всех солдат до максимума.

Примечание

В первом примере повышение званий солдат будет происходить следующим образом:

1 2 2 3  →  2 2 3 4  →  2 3 4 4  →  3 4 4 4  →  4 4 4 4

Итого 4 тренировки, на которые требуется 4 золотые монеты.

C. Быки и коровы

Перебор реализация *1700

В игру «Быки и коровы» играют двое: ведущий и отгадывающий.

Ведущий загадывает четырехзначное число в десятичной системе счисления, в котором все цифры различны, и может быть ведущий нуль. Оно не может иметь больше одного лидирующего нуля, так как все цифры должны быть различны. Отгадывающий должен отгадать загаданное число. Он делает серию попыток, пробуя числа, на что получает ответы ведущего в формате «x быков y коров», где x — количество цифр пробного числа, стоящих на тех же местах, что и в загаданном числе, а y — количество цифр пробного числа, которые присутствуют в в загаданном числе, но стоят на других местах. Разумеется, пробные числа, так же как и загаданное число, являются четырехзначными числами, в которых все цифры различны, и может быть ведущий нуль.

Например, предположим, что ведущий загадал число 0123. Тогда на пробное число 1263 отгадывающий получит ответ «1 бык 2 коровы» (3 стоит в обоих числах на одном и том же месте, а 1 и 2 есть и там, и там, но они стоят на разных позициях), а на число 8103 — «2 быка 1 корова» (аналогично — 1 и 3 стоят на тех же местах, а 0 стоит в другом месте).

Когда отгадывающий получает ответ «4 быка 0 коров», игра заканчивается.

Сейчас отгадывающий уже сделал некоторое количество попыток и хочет узнать, а не может ли его следующий ход оказаться последним.

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 10) — количество уже сделанных попыток. Далее идут n строк вида «ai bi ci», где aii-е пробное число, bi — количество быков, ci — количество коров (1 ≤ i ≤ n, 0 ≤ bi, ci, bi + ci ≤ 4). Пробные числа корректны — то есть каждое из них содержит ровно 4 цифры, в каждом из них все цифры различны, и может быть лидирующий нуль. Все пробные числа различны. Так как отгадывающий еще не отгадал числа, ответа «4 быка 0 коров» не встречается.

Выходные данные

Если входных данных достаточно для определения загаданного числа — в единственной строке выведите это число с четырьмя цифрами. Если в числе меньше четырех цифр, добавьте лидирующий ноль. Если данных недостаточно — выведите «Need more data» без кавычек. Если же вдруг окажется, что ведущий где-то ошибся при ответе — выведите «Incorrect data» без кавычек.

E. Игра с конфетами

битмаски дп игры поиск в глубину и подобное реализация *2000

Карлсон опять прилетел в гости к Малышу. Дома у Малыша они нашли коробку конфет и большой торт со взбитыми сливками. Карлсон сразу же предложил Малышу честно поделить найденное. А именно — сыграть с ним в игру с конфетами, которую он придумал только что. Победитель в качестве приза получит торт.

Коробка конфет имеет форму шестиугольника, внутри нее имеется 19 ячеек для конфет, в некоторых из них находятся конфеты. Игроки ходят по очереди. За ход разрешается съесть одну или несколько конфет, лежащих в соседних ячейках на одной линии, параллельной одной из сторон коробки. На картинке ниже показаны примеры допустимых и недопустимого ходов. Проигрывает игрок, который не может сделать ход.

Карлсон ходит первым — ведь это он в гостях у Малыша, а не наоборот. Игроки играют оптимальным образом. Определите, кому достанется торт.

Входные данные

Входные данные содержат 5 строк, которые содержат 19 слов, состоящих из одного символа. Слово «O» означает, что в данной ячейке находится конфета, «.» — что данная ячейка пуста. Гарантируется, что в коробке имеется хотя бы одна конфета. Смотрите примеры для более точного понимания.

Выходные данные

Если торт достанется Карлсону — выведите «Karlsson» (без кавычек), иначе выведите «Lillebror» (опять же без кавычек).

L. Взлом кода

математика реализация *1400

Защита популярной программы, разработанной одной из компаний ИТ-града, устроена следующим образом. При установке на компьютер пользователя она выводит случайное пятизначное число, которое нужно отослать СМС-сообщением на определённый номер телефона. В ответном СМС приходит код активации программы.

Юный хакер Вася дизассемблировал данную программу и нашёл алгоритм, который преобразует выведенное число в код активации. Примечание: разумеется, Вася — законопослушный хакер, и он сделал это из самых благородных целей — чтобы продемонстрировать разработчику несовершенство их способа защиты.

Найденный алгоритм выглядит следующим образом. Сначала цифры числа перемешиваются в следующем порядке <первая цифра><третья цифра><пятая цифра><четвёртая цифра><вторая цифра>. Например, из числа 12345 в результате перемешивания должно получиться число 13542. На втором этапе число возводится в пятую степень. Для числа 12345 после перемешивания и возведения в степень должен получиться результат 455 422 043 125 550 171 232. Ответом будут 5 последних цифр этого результата. Для числа 12345 ответом должно быть 71232.

Васе осталось лишь написать программу-генератор ключей активации, реализующую данный алгоритм. А Вы сможете это сделать?

Входные данные

Единственная строка входных данных содержит положительное целое пятизначное число, для которого нужно найти код активации.

Выходные данные

Выведите ровно 5 цифр без пробелов — найденный код активации программы.

A. Собеседование

Перебор реализация *900

Блейк управляет крупной компанией «Blake Technologies». Он очень любит свою компанию и считает, что она должна быть самой лучшей, по этой причине каждый кандидат, который хочет в ней работать, должен пройти собеседование. Оно состоит всего из одной интересной задачи, которую нужно решить.

Определим функцию f(x, l, r) как побитовое «ИЛИ» (будем обозначать как OR) чисел xl, xl + 1, ..., xr, где xi — элемент массива x с индексом i. Вам даны два массива a и b длины n. Нужно определить максимальное значение f(a, l, r) + f(b, l, r) по всем 1 ≤ l ≤ r ≤ n.

Входные данные

В первой строке входных данных записано одно целое число n (1 ≤ n ≤ 1000) — длина массивов a и b.

Во второй строке записаны n целых чисел ai (0 ≤ ai ≤ 109).

В третьей строке записаны n целых чисел bi (0 ≤ bi ≤ 109).

Выходные данные

Выведите единственное целое число — максимальное значение f(a, l, r) + f(b, l, r) по всем 1 ≤ l ≤ r ≤ n.

Примечание

Напомним, что значением побитового «ИЛИ» двух неотрицательных целых чисел a и b называется такое число c = a OR b, у которого в каждом разряде в двоичной записи стоит единица, если и только если хотя бы у одного из двух чисел a или b стоит единица в соответствующем разряде в двоичной записи.

В первом примере максимальный ответ получается при l = 2 и r = 4, так как f(a, 2, 4) + f(b, 2, 4) = (2 OR 4 OR 3) + (3 OR 3 OR 12) = 7 + 15 = 22. Максимальный ответ можно получить и другими способами, например при l = 1 и r = 4, l = 1 и r = 5, l = 2 и r = 4, l = 2 и r = 5, l = 3 и r = 4 или при l = 3 и r = 5.

Во втором примере максимальный ответ получается при l = 1 и r = 9.

B. Проверка печати

Конструктив реализация *1200

Крис работает в крупной компании «Blake Technologies». Ему как лучшему инженеру было поручено разработать уникальный принтер, который будет рисовать горизонтальные и вертикальные полоски. Первый прототип принтера уже готов, и Крис собирается протестировать его, а вас просит написать программу, проверяющую, что результат печати совпадает с ожидаемым.

Принтер умеет печатать только на прямоугольных клетчатых листах размера n × m. Представим лист как таблицу, состоящую из n строк и m столбцов. Строки нумеруются сверху вниз целыми числами от 1 до n, а столбцы — слева направо целыми числами от 1 до m. Изначально все клетки таблицы покрашены в цвет 0.

Ваша программа должна уметь выполнять два типа операций:

  1. Покрасить все клетки строки ri в цвет ai;
  2. Покрасить все клетки столбца ci в цвет ai.

Если при выполнении операции i какая-то клетка уже была покрашена, то она всё равно меняет свой цвет на цвет ai.

Ваша программа должна вывести итоговую таблицу, которая получится после последовательного выполнения всех k операций.

Входные данные

В первой строке входных данных записаны три целых числа n, m и k (1  ≤  n,  m  ≤ 5000, n·m ≤ 100 000, 1 ≤ k ≤ 100 000) — размеры листа и количество операций соответственно.

В следующих k строках идут запросы двух видов:

  • ri ai (1 ≤ ri ≤ n, 1 ≤ ai ≤ 109), означает, что строка ri красится в цвет ai;
  • ci ai (1 ≤ ci ≤ m, 1 ≤ ai ≤ 109), означает, что столбец ci красится в цвет ai.
Выходные данные

Выведите n строк по m чисел в каждой строке — итоговые цвета клеток таблицы.

Примечание

Приведенная ниже иллюстрация показывает все три операции для первого примера. Серым цветом выделены клетки, которые были перекрашены после соответствующей операции.

D. Мессенджер

реализация Строки строковые суфф. структуры Структуры данных хэши *2100

Каждый сотрудник компании «Blake Technologies» пользуется специализированным приложением для мгновенного обмена сообщениями, которое носит название «Blake Messenger». Все сотрудники любят это приложение и пользуются им постоянно. Однако не всё так гладко, как хотелось бы. Многим не хватает очень важной функции — поиска по сообщениям. Поэтому было принято решение реализовать эту функцию в следующей версии мессенджера. К сожалению, из-за особенностей хранения сообщений разработчикам столкнулись с некоторыми проблемами...

Все сообщения в приложении представляют собой строки, состоящие только из строчных букв английского алфавита. В целях снижения нагрузки эти строки передаются и хранятся в сжатом виде. Алгоритм сжатия работает следующим образом: строка s разбивается на n последовательных блоков одинаковых букв. Такую часть можно описать парой (li, сi), где li — длина i-й части, а ci — символ, который используется в i-й части. Таким образом, строку s можно записать в сжатом виде парами .

Требуется написать программу, которая по заданным сжатым строкам t и s находит все вхождения строки s в строку t. Разработчики понимают, что таких вхождений может быть очень много, поэтому требуется вывести только количество различных позиций вхождений строки s в строку t. Напомним, что позиция p является позицией вхождения строки s в строку t тогда и только тогда, когда tptp + 1...tp + |s| - 1 = s, где ti — i-й символ строки t.

Обратите внимание на то, что, к примеру, строка "aaaa" может быть сжата несколькими способами: , , ...

Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 200 000) — количество блоков, из которых состоят строки t и s соответственно.

Во второй строке записаны описания n блоков строки t в формате "li-ci" (1 ≤ li ≤ 1 000 000) — длина i-го блока строки t и соответствующая строчная буква английского алфавита.

Во второй строке записаны описания m блоков строки s в формате "li-ci" (1 ≤ li ≤ 1 000 000) — длина i-го блока строки s и соответствующая строчная буква английского алфавита.

Выходные данные

Выведите единственное целое число — количество вхождений строки s в строку t.

Примечание

В первом примере t = "aaabbccccaaacc", a s = "aabbc". Строка s входит в строку t только в одной позиции p = 2.

Во втором тесте t = "aaabbbbbbaaaaaaacccceeeeeeeeaa", а s = "aaa". Строка s входит в строку t в следующих позициях: p = 1, p = 10, p = 11, p = 12, p = 13, p = 14.

C. Синдром шпиона 2

дп реализация сортировки Строки строковые суфф. структуры Структуры данных хэши *1900

Яш хочет взломать используемый Сидхантом шифр. После долгих недель наблюдений он понял, что Сидхант шифрует предложения следующим образом:

  1. Перевести все буквы в нижний регистр.
  2. Каждое слово в предложение заменить на развёрнутое.
  3. Удалить все пробелы.

Например, если взять предложение

Kira is childish and he hates losing

и применить к нему данный шифр, то получится строка

ariksihsidlihcdnaehsetahgnisol

Сейчас у Яша есть зашифрованная строка и список слов. Помогите ему найти какое-нибудь исходное предложение, составленное только из слов, встречающихся в списке. Обратите внимание, что любое слово может быть использовано в предложении сколько угодно раз.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 10 000) — длина зашифрованной строки. Вторая строка содержит саму зашифрованную строку и состоит из n строчных букв английского алфавита.

В третьей строке записано число m (1 ≤ m ≤ 100 000) — количество слов в списке. В каждой из последующих m строк записано непустое слово wi (|wi| ≤ 1 000), состоящее из строчных и заглавных букв английского алфавита. Гарантируется, что суммарная длина всех слов не превосходит 1 000 000.

Выходные данные

Выведите одну строчку, содержащую исходное предложение. Гарантируется, что хотя бы одно решение существует. Если решений несколько, то разрешается вывести любое.

D. Фибоначчиеватость

дп математика Перебор реализация хэши *2000

Яш недавно узнал о числах Фибоначчи. Он так обрадовался этому знанию, что решил называть произвольную последовательность фибоначчиеватой, если

  1. последовательность состоит хотя бы из двух элементов;
  2. f0 и f1 произвольные;
  3. fn + 2 = fn + 1 + fn при всех n ≥ 0.

Вам дана последовательность целых чисел a1, a2, ..., an. Вам требуется переставить элементы последовательности таким образом, чтобы как можно более длинный её префикс был фибоначчиеватой последовательностью.

Входные данные

В первой строке входных данных записано единственное число n (2 ≤ n ≤ 1000) — длина последовательности ai.

Во второй строке записаны n целых чисел a1, a2, ..., an (|ai| ≤ 109).

Выходные данные

Выведите количество элементов в самом длинном возможном фибоначчиеватом префиксе после перестановки элементов.

Примечание

В первом примере, если переставить элементы исходной последовательности следующим образом  - 1, 2, 1, то вся последовательность ai будет фибоначчиеватой.

Во втором примере оптимальным способом переставить элементы является , , , , 28.

H. Фибоначчиеватость II

реализация Структуры данных *3100

Яшу надоело искать самую длинную фибоначчиеватую последовательность, и он придумал себе новое развлечение — вычисление фибоначчиеватых потенциалов.

Фибоначчиеватый потенциал массива ai вычисляется следующим образом:

  1. Удалить все элементы j, такие что существует i < j, для которого ai = aj.
  2. Упорядочить оставшиеся элементы в порядке возрастания, то есть a1 < a2 < ... < an.
  3. Вычислить потенциал как P(a) = a1·F1 + a2·F2 + ... + an·Fn, где Fi означает i-е число Фибоначчи (смотрите примечания для уточнения).

Вам дан массив ai длины n и q отрезков с lj по rj. Для каждого такого отрезка j требуется вычислить фибоначчиеватый потенциал массива bi, составленного из элементов ai с lj по rj включительно. Вычислите эти значения по модулю m.

Входные данные

В первой строке входных данных записаны целые числа n и m (1 ≤ n, m ≤ 30 000) — длина массива и модуль, по которому требуется производить вычисления, соответственно.

В следующей строке записаны n целых чисел ai (0 ≤ ai ≤ 109) — элементы массива.

Далее следует число отрезков q (1 ≤ q ≤ 30 000).

Последние q строк содержат пары индексов lj и rj (1 ≤ lj ≤ rj ≤ n) — отрезки, на которых следует вычислить фибоначчиеватый потенциал.

Выходные данные

Выведите q целых чисел, i-е из которых должно быть равно фибоначчиеватому потенциалу итого отрезка массива.

Примечание

В данной задаче числа Фибоначчи определяются следующим образом:

  1. F1 = F2 = 1.
  2. Fn = Fn - 1 + Fn - 2 для всех n > 2.

A. Островной пазл

Конструктив реализация *1300

В далёком островном государстве насчитывается n островов, пронумерованных целыми числами от 1 до n. Острова соединены двунаправленными мостами, так чтобы образовывать один цикл: остров номер 1 соединён с островом номер 2, остров номер 2 соединён с островом номер 3 и так далее, а остров номер n соединён с островом номер 1.

В центре каждого острова расположен пьедестал. На всех пьедесталах всех островов, кроме одного, находится очень хрупкая статуя, причём все статуи различны. У оставшегося острова пьедестал пуст.

Жители островов договорились переупорядочить статуи определённым образом. Единственная доступная им операция — это выбрать какой-то остров, непосредственно соединённый мостом с островом с пустым пьедесталом, и аккуратно перенести статую с одного пьедестала на свободный пьедестал.

Определите, смогут ли они добиться желаемого расположения статуй, используя только описанную выше операцию.

Входные данные

В первой строке входных данных записано число n (2 ≤ n ≤ 200 000) — количество островов.

Во второй строке записаны n целых чисел ai (0 ≤ ai ≤ n - 1) — номер статуи, расположенной на i-м острове. Если ai = 0, то пьедестал острова пуст. Гарантируется, что все ai различны.

В третьей строке записаны n целых чисел bi (0 ≤ bi ≤ n - 1) — номер статуи, которую жители хотят поместить на i-й остров. Как и до этого, bi = 0 означает, что жители острова не хотят иметь у себя на пьедестале никакой статуи. Гарантируется, что все bi различны.

Выходные данные

Выведите «YES» (без кавычек), если желаемое расположение статуй может быть достигнуто. В противном случае выведите «NO» (без кавычек).

Примечание

В первом примере островитяне могут сначала подвинуть статую 1 с острова 1 на остров 2, затем подвинуть статую 2 с острова 3 на остров 1 и, наконец, подвинуть статую 1 с острова 2 на остров 3.

Во втором примере островитяне могут просто подвинуть статую 1 с острова 1 на остров 2.

В третьем примере никакая последовательность перемещений не позволит островитянам добиться желаемого расположения статуй.

A. Оркестр

Перебор реализация *1100

Пауль наслаждается концертом симфонического оркестра. Секция струнных инструментов представляет собой клетчатый прямоугольник r × c. В каждой клетке находится скрипач, за исключением n клеток с альтистами. Паулю очень нравятся альты, поэтому он хочет сделать фотографию, на которой будет как минимум k альтистов. Пауль может сфотографировать некоторый прямоугольник со сторонами, параллельными осям координат. Посчитайте, сколько различных подходящих фотографий он может сделать.

Две фотографии считаются различными, если отличаются координаты соответствующих прямоугольников.

Входные данные

В первой строке входных данных записаны четыре целых числа r, c, n, k (1 ≤ r, c, n ≤ 10, 1 ≤ k ≤ n) — количество строк и столбцов в прямоугольнике, описывающем секцию струнных инструментов, общее количество альтистов и минимальное количество альтистов, которое должно присутствовать на фотографии Пауля, соответственно.

В следующих n строках записаны по два целых числа xi и yi (1 ≤ xi ≤ r, 1 ≤ yi ≤ c) — номер строки и номер столбца, определяющие позицию i-го альтиста, соответственно. Гарантируется, что позиции всех альтистов различны.

Выходные данные

Выведите единственно целое число — количество различных фотографий, на которых будут хотя бы k альтистов.

Примечание

Будем использовать «*» для обозначения скрипачей и «#» для альтистов.

В первом примере оркестр выглядит следующим образом:


*#
**
Пауль может сделать фотографию, содержащую только альтиста, прямоугольник 1 × 2, содержащий весь столбец с альтистом, 2 × 1 строчку с альтистом или сфотографировать разом всю секцию струнных инструментов. Таким образом, возможны 4 фотографии.

Во втором примере оркестр выглядит следующим образом:


#*
*#
#*
Паулю подойдёт только фотография всего оркестра.

В третьем примере оркестр выглядит так же, как и во втором.

A. Голосование за фотографии

*особая задача Конструктив реализация *1000

После празднования «экватора» студенты одного из факультетов Берляндского государственного университета решили провести голосование за лучшую фотографию. Они разместили фотографии в социальной сети и определились с правилами определения победителя: выиграет та фотография, которая наберёт наибольшее количество лайков. Если же наибольшее количество лайков получат несколько фотографий, то победа достанется той, которая наберёт это количество первой.

Помогите ребятам определить фотографию-победительницу по записям о лайках.

Входные данные

В первой строке входных данных содержится единственное целое число n (1 ≤ n ≤ 1000) — суммарное количество лайков к опубликованным фотографиям.

Вторая строка содержит n положительных целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1 000 000), где ai — это идентификатор фотографии, которой был поставлен i-й лайк.

Выходные данные

Выведите идентификатор победившей в голосовании фотографии.

Примечание

В первом тестовом примере фотография с идентификатором 1 набрала два лайка (первый и пятый), фотография с идентификатором 2 набрала два лайка (третий и четвертый), а фотография с идентификатором 3 набрала один лайк (второй).

Таким образом, в голосовании победила фотография с идентификатором 2, так как она набрала:

  • больше лайков, чем фотография с идентификатором 3;
  • столько же лайков, сколько и фотография с идентификатором 1, но второй лайк был поставлен фотографии с идентификатором 2 раньше.

C. Промокоды с ошибками

*особая задача Конструктив Перебор реализация *1400

Во время проведения новогодней акции в группе «Бары Судиславля» были разыграны n промокодов. Каждый промокод состоит из ровно шести цифр и даёт право на один бесплатный коктейль в баре «Приют комара». Разумеется, все промокоды различны.

Поскольку «Приют комара» открывается только в 9, а вечеринки в Судиславле, как правило, начинаются уже в 6, то у многих могут возникнуть проблемы с тем, чтобы вбить промокод без ошибок. Необходимо вычислить такое максимальное k, что промокод может быть однозначно идентифицирован, если был введён не более чем с k ошибками. При этом k = 0 означает, что промокоды необходимо вводить абсолютно точно.

Ошибкой в этой задаче следует считать ввод неправильной цифры. Например, значение «123465» содержит две ошибки относительно промокода «123456». Независимо от количества ошибок, введённое значение состоит ровно из шести цифр.

Входные данные

В первой строке выходных данных записано число n (1 ≤ n ≤ 1000) — количество промокодов.

В каждой из следующих n строк записан один промокод, состоящий из ровно шести цифр. Гарантируется, что все промокоды различны. Допустимо, что промокоды начинаются с цифры «0».

Выходные данные

Выведите максимальное k (разумеется, не превосходящее длины промокода), такое что любой промокод может быть однозначно идентифицирован, если введён с не более чем k ошибками.

Примечание

В первом примере k < 3, так как если посетитель бара вобьёт значение «090909», то будет невозможно определить, какой именно промокод ему соответствует.

A. Медвежонок и отображаемые друзья

реализация *1200

Полярный медвежонок Лимак любит переписываться с другими медведями в социальных сетях. Всего у него n друзей и уровень дружбы с i-м другом описывается целым числом ti. Чем больше это значение, тем сильнее дружат два медвежонка. Известно, что все ti различны.

Приближается весна и медведи начинают просыпаться. Лимак проснулся самым первым и сразу зашёл в любимую социальную сеть. Все его друзья ещё спят и пока что находятся оффлайн. В ближайшие часы некоторые из них проснуться и тоже сразу зайдут в социальную сеть.

В системе в специальном окне отображаются те из друзей, кто сейчас находится в сети, но не более чем k медведей. Если онлайн находится больше чем k, то из них показываются k самых близких друзей (то есть с наибольшими значениями ti).

Необходимо обрабатывать запросы двух типов:

  • «1 id» — друг с номером id заходит в социальную сеть. Гарантируется, что до этого он не был онлайн.
  • «2 id» — проверить, отображается ли друг с номером id в специальном окне. Вывести «YES» или «NO».

Как вы помните, Лимак ещё очень маленький, поэтому ему требуется ваша помощь в обработке запросов.

Входные данные

В первой строке входных данных записаны три числа n, k и q (1 ≤ n, q ≤ 150 000, 1 ≤ k ≤ min(6, n)) — количество друзей, размер специального окна для отображения друзей онлайн и количество запросов соответственно.

Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 109), i-е из которых показывает уровень дружбы Лимака с другом номер i.

В i-й из последующих q строк записаны два целых числа typei и idi (1 ≤ typei ≤ 2, 1 ≤ idi ≤ n) — параметры i-го запроса. Если typei = 1, то данный запрос означает, что друг idi зашёл в социальную сеть. Если же typei = 2, то требуется проверить, отображается ли друг idi в специальном окошке.

Гарантируется, что все запросы первого типа содержат различные idi и что во входных данных присутствует хотя бы один запрос второго типа.

Выходные данные

Для каждого запроса второго типа выведите «YES» (без кавычек), если соответствующий друг присутствует в этот момент в специальном окне, и «NO» (без кавычек), если не присутствует.

Примечание

В первом примере у Лимака 4 друга, которые все изначально спят. В начале никто из друзей не показывается в специальном окне.

Поступают следующие 8 запросов:

  1. «1 3» — друг номер 3 заходит в сеть.
  2. «2 4» — требуется проверить, отображается ли друг 4. Он ещё не заходил онлайн, поэтому ответ «NO».
  3. «2 3» — требуется проверить, отображается ли друг 3. Он единственный из друзей сейчас онлайн, поэтому точно отображается в специальном окне. Печатаем ответ «YES».
  4. «1 1» — друг номер 1 заходит в социальную сеть. Сейчас в специальном окне показываются и друг 1 и друг 3.
  5. «1 2» — друг 2 заходит онлайн. Сейчас в сети уже целых три друга, но k = 2, поэтому только двое будут отображаться в специальном окне. Поскольку t1 < t2 и t1 < t3, то отображаться будут друзья 2 и 3.
  6. «2 1» — выводим «NO».
  7. «2 2» — выводим «YES».
  8. «2 3» — выводим «YES».

C. Медвежонок и многочлены

математика реализация хэши *2200

У полярного медвежонка Лимака мало игрушек, поэтому он постоянно играет с многочленами (полиномами).

Он считает многочлен правильным, если тот имеет степень n и все его коэффициенты являются целыми числами не превосходящими k по абсолютному значению. Формально, пусть a0, a1, ..., an это коэффициенты многочлена . Тогда многочлен P(x) является правильным если выполнены следующие условия:

  • ai является целым числом для всех i от 0 до n;
  • |ai| ≤ k для всех i от 0 до n;
  • an ≠ 0.

Лимаку недавно подарили правильный многочлен P с коэффициентами a0, a1, a2, ..., an. Он обратил внимание, что P(2) ≠ 0 и теперь хочет это исправить. Лимак хочет изменить ровно один коэффициент многочлена P, так чтобы получить правильный многочлен Q степени n, такой что Q(2) = 0. Вычислите, сколькими способами он может это сделать. Два способа следует считать различными, если коэффициенты полученных многочленов различаются.

Входные данные

В первой строке входных данных записаны целые числа n и k (1 ≤ n ≤ 200 000, 1 ≤ k ≤ 109) — степень многочлена и ограничение на абсолютное значение его коэффициентов.

Во втором строке записано n + 1 целое число a0, a1, ..., an (|ai| ≤ k, an ≠ 0) — коэффициенты правильного многочлена . Гарантируется, что P(2) ≠ 0.

Выходные данные

Выведите количество способов изменить ровно один коэффициент многочлена P, так чтобы получить правильный многочлен Q, для которого Q(2) = 0.

Примечание

В первом примере дан многочлен P(x) = 10 - 9x - 3x2 + 5x3.

Существуют три способа изменить коэффициенты подходящим образом:

  1. Установить a0 =  - 10, так чтобы Q(x) =  - 10 - 9x - 3x2 + 5x3. Действительно, Q(2) =  - 10 - 18 - 12 + 40 = 0.
  2. Поменять a2 =  - 8. Тогда Q(x) = 10 - 9x - 8x2 + 5x3 и Q(2) = 10 - 18 - 32 + 40 = 0.
  3. Последний способ — сделать a1 =  - 19. Тогда Q(x) = 10 - 19x - 3x2 + 5x3 и Q(2) = 10 - 38 - 12 + 40 = 0.

Во втором примере дан тот же самый многочлен, но значение k равно 12 вместо 109. Первые два способа по прежнему работает, а в третьем получается |a1| > k и соответствующий Q не является правильным. Таким образом, ответ для этого примера равен 2.

A. Факториал

*особая задача реализация *1300

Выведите факториал заданного числа n. Напомним, что факториал числа n равен произведению 1·2·...·n.

Входные данные

В единственной строке входных данных содержится целое число n (1 ≤ n ≤ 10).

Выходные данные

Выведите факториал числа n.

C. Таблица

*особая задача жадные алгоритмы математика реализация *1600

В прямоугольную таблицу из n строк и m столбцов записали все числа от 1 до nm в порядке слева направо, сверху вниз. Таким образом, первая строка содержит числа от 1 до m, вторая — от m + 1 до 2m и так далее.

Затем эти числа выписали в порядке сверху вниз, слева направо. То есть выписали первый столбец (сверху вниз), затем второй и так далее.

Выведите k-ое число, которое было выведено.

Входные данные

В единственной строке входных данных содержится три целых числа n, m и k (1 ≤ n, m ≤ 20000, 1 ≤ k ≤ nm).

Выходные данные

Выведите искомое число.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

A. Меленький Артёмка и Кузнечик

реализация *1000

Маленький Артёмка нашёл кузнечика. Он принес его домой и собрал для него прыжковый тренажёр.

Тренажёр является клетчатой полоской 1 × n, в каждой клетке которой записаны направление и длина прыжка, который должен сделать кузнечик, если он попадёт в эту клетку. Кузнечик начинает в первой клетке и продолжает прыгать до тех пор, пока не выпрыгнет за пределы поля. Теперь Артём хочет узнать, произойдет ли это когда-нибудь.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100 000) — длина полоски.

В следующей строке записана строка длины n, которая состоит из символов «<» и «>», i-й из которых определяет направление прыжка из i-й клетки. В следующей строке находятся n целых чисел di (1 ≤ di ≤ 109) — длины соответствующих прыжков для каждой клетки.

Выходные данные

Выведите «INFINITE» (без кавычек), если кузнечик никогда не выпрыгнет за пределы полоски, иначе выведите «FINITE» (без кавычек).

Примечание

В первом примере кузнечик начинает в первой клетке и прыгает на одну клетку вправо. Затем, когда он находится во второй клетке, он прыгает на две клетки влево и оказывается вне полоски.

Во втором примере путь кузнечика выглядит так 1 - 3 - 2 - 3 - 2 - 3 и так далее. Кузнечик никогда не выпрыгнет за пределы доски.

B. Меленький Артёмка и Матрица

реализация *1400

Маленький Артёмка очень любит радиоэлектронику — он может паять схемы часами напролёт. Артёмка всегда следит за новинками в ближайшем радиолюбительском магазине. Недавно в магазин поступила новая деталь, и, разумеется, Артёмка сразу же её купил.

Купленный элемент может хранить информацию о матрице из целых чисел размером n × m. Помимо этого, у данного элемента ровно n + m входов, по одному на каждую строку и каждый столбец матрицы. Когда сигнал подаётся на вход, соответствующей строке, она сдвигается циклически влево, то есть первый элемент строки становится последним, второй — первым и так далее. Когда сигнал поступает на столбец, он циклически сдвигается вверх, то есть первый элемент столбца станет последним, второй — первым и так далее. Строки нумеруются целыми числами от 1 до n сверху вниз, а столбцы — целыми числами от 1 до m слева направо.

Артёмка не хочет использовать данный элемент, предварительно не изучив его. Он проделал q операций, каждая из которых состояла либо в подаче сигнала на один из n + m входов, либо в проверке значения в какой-нибудь клетке матрицы.

Артем уже проделал эксперимент и записал результат, но вот беда — он потерял исходный элемент. Помогите ему найти любой подходящий элемент, который мог бы дать ему те же результаты. Гарантируется, что результаты эксперимента непротиворечивы, то есть хотя бы один такой элемент существует.

Входные данные

В первой строке входных данных записаны три целых числа n, m и q (1 ≤ n, m ≤ 100, 1 ≤ q ≤ 10 000) — размеры матрицы и число запросов в эксперименте.

В следующих q строках записаны запросы Артемки, по одному запросу в строке. Каждый запрос начинается с целого числа ti (1 ≤ ti ≤ 3), определяющего его тип. Для запросов первого или второго типа далее следует целое число ri (1 ≤ ri ≤ n) или ci (1 ≤ ci ≤ m), а для запросов третьего типа — три целых числа ri, ci и xi (1 ≤ ri ≤ n, 1 ≤ ci ≤ m,  - 109 ≤ xi ≤ 109).

Запрос первого типа (ti = 1) означает, что подаётся сигнал на вход, соответствующий строке ri, то есть произойдёт её циклический сдвиг. Запрос второго типа (ti = 2) означает, что произойдёт циклический сдвиг столбца ci, а запрос третьего типа (ti = 3) означает, что в данный момент времени в клетке, расположенной в строке ri и столбце ci, записано число xi.

Выходные данные

Выведите какую-нибудь матрицу размера n × m, которая могла изначально быть у Артёмки. Все числа матрицы должны быть целыми и по модулю не превосходить 109.

Если подходящих матриц несколько, разрешается вывести любую из них.

C. Маленький Артёмка и Танцы

Конструктив Перебор реализация *1800

Маленький Артёмка очень любит танцевать. Особенно ему нравится танцевать руэду — кубинский танец, в котором все пары стоят по кругу.

Более детально: во время исполнения руэды n пар из мальчиков и девочек стоят по кругу. Изначально мальчик под номером 1 танцует с девочкой под номером 1, мальчик под номером 2 танцует с девочкой под номером 2 и так далее. Девочки пронумерованы в порядке по часовой стрелке. Во время танца громко объявляются различные команды, и все пары должны одновременно их исполнить, при этом мальчики могут в результате выполнения команд перемещаться вдоль круга, а девушки всегда стоят на своих изначальных местах. В данной задаче мы рассматриваем команды двух видов:

  1. Объявляется число x и направление, после чего все мальчики смещаются на x девушек в соответствующем направлении.
  2. Партнёры, которые танцуют с девушками с чётными индексами, меняются местами с партнёрами, которые танцуют с девушками с нечётными индексами, то есть тот, кто танцевал с девушкой 1, переходит к девушке номер 2, тот, кто танцевал с девушкой номер 2, переходит к девушке номер 1, тот, кто танцевал с девушкой номер 3, переходит к девушке номер 4 и так далее. Гарантируется, что n всегда чётно.

Ваша задача — определить конечное положение мальчиков после выполнения всех команд.

Входные данные

В первой строке входных данных записаны числа n и q (2 ≤ n ≤ 1 000 000, 1 ≤ q ≤ 2 000 000) — количество пар и количество выполненных команд соответственно. Гарантируется, что n чётно.

В следующих строках даны танцевальные команды в порядке их выполнения. Каждая команда начинается с целого числа, означающего ее тип, — 1 или 2. Команда первого типа является числом x ( - n ≤ x ≤ n), где 0 ≤ x ≤ n означает, что все мальчики переходят на x девушек в направлении по часовой стрелке, а x < 0 означает переход на  - x в направлении против часовой стрелки. Для команды второго типа нет дополнительных входных данных.

Выходные данные

Выведите n чисел, i-е из которых означает номер мальчика, с которым танцует девушка номер i после выполнения всех команд.

D. Маленький Артёмка и случайные величины

дп математика реализация Теория вероятностей *2400

Маленький Артёмка решил изучить теорию вероятностей. Он нашёл отличный задачник и прорешал его почти полностью. Однако есть задача, с которой он никак не может справиться, поэтому просит вас помочь ему.

Имеются два игральных кубика, на которых при броске выпадают целочисленные значения от 1 до n. Для каждого кубика каждое значение выпадает с некоторой фиксированной вероятностью (разумеется, сумма этих вероятностей равна 1), при этом для разных кубиков эти вероятности могут отличаться.

Оба кубика бросаются одновременно, после чего вычисляются значения max(a, b) и min(a, b), где a равно значению, выпавшему на первом кубике, а b равно значению, выпавшему на втором кубике. Вам неизвестны вероятности выпадения конкретных значений на кубиках, но вы знаете для каждого x, с какой вероятностью max(a, b) будет равно x и с какой вероятностью min(a, b) будет равно x. Восстановите любое корректное распределение вероятностей для величин a и b. Гарантируется, что хотя бы одно подходящее распределение существует.

Входные данные

Первая строка входных данных содержит единственное целое число n (1 ≤ n ≤ 100 000) — количество возможных значений на обоих кубиках.

Во второй строке записан массив из n вещественных чисел с не более чем восемью цифрами после десятичной точки  — распределение вероятности для величины max(a, b), то есть i-е из этих числе равно вероятности того, что max(ab) = i. Гарантируется, что сумма чисел в массиве равна 1. В третей строке записано распределение вероятности для min(a, b) в аналогичном формате.

Выходные данные

Выведите два описания распределений вероятности для величины a (первый кубик) на первой строке и для величины b (второй кубик) на второй строке.

Ваш ответ будет считаться правильным, если вероятность каждого значения max(a, b) и min(a, b), вычисленная по предоставленным вами распределениям, будет отличаться от указанных во входных данных не более чем на 10 - 6 по абсолютному значению. Вероятности должны быть неотрицательными вещественными числами, сумма вероятностей внутри одного распределения должна отличаться от 1 не более чем на 10 - 6.

A. Медвежонок и цвета

реализация *1500

У медвежонка Лимака есть n цветных шаров, выложенных в ряд. Шары пронумерованы от 1 до n слева направо. Всего существует n различных цветов, также пронумерованных от 1 до n. Цвет i-го слева шара равен ti.

Для каждого отрезка (множества расположенных подряд) шаров определим доминирующий цвет. Таким цветом назовём тот, который встречается на данном отрезке больше всего раз. В случае, если таких цветов несколько, доминирующим называется тот из них, номер (индекс) которого минимален.

Всего существует непустых отрезков. Для каждого цвета вычислите количество отрезков, на которых он является доминирующим.

Входные данные

В первой строке входных данных записано единственное число n (1 ≤ n ≤ 5000) — количество шаров и цветов.

Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ n), i-е из которых означает цвет i-го шара слева.

Выходные данные

Выведите n целых чисел, i-е из которых должно равняться количеству отрезков, на которых цвет i является доминирующим.

Примечание

В первом примере цвет 2 является доминирующим на трёх отрезках:

  • Отрезок [2, 2] содержит один шар. Этот шар имеет цвет 2, так что, конечно, 2 является доминирующим цветом для этого отрезка.
  • Отрезок [4, 4] также содержит один шар, и цвет этого шара — 2.
  • Отрезок [2, 4] содержит два шара цвета 2 и один шар цвета 1.

На остальных 7 отрезках доминирующим является цвет 1.

A. Медвежонок и цвета

реализация *1500

У медвежонка Лимака есть n цветных шаров, выложенных в ряд. Шары пронумерованы от 1 до n слева направо. Всего существует n различных цветов, также пронумерованных от 1 до n. Цвет i-го слева шара равен ti.

Для каждого отрезка (множества расположенных подряд) шаров определим доминирующий цвет. Таким цветом назовём тот, который встречается на данном отрезке больше всего раз. В случае, если таких цветов несколько, доминирующим называется тот из них, номер (индекс) которого минимален.

Всего существует непустых отрезков. Для каждого цвета вычислите количество отрезков, на которых он является доминирующим.

Входные данные

В первой строке входных данных записано единственное число n (1 ≤ n ≤ 5000) — количество шаров и цветов.

Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ n), i-е из которых означает цвет i-го шара слева.

Выходные данные

Выведите n целых чисел, i-е из которых должно равняться количеству отрезков, на которых цвет i является доминирующим.

Примечание

В первом примере цвет 2 является доминирующим на трёх отрезках:

  • Отрезок [2, 2] содержит один шар. Этот шар имеет цвет 2, так что, конечно, 2 является доминирующим цветом для этого отрезка.
  • Отрезок [4, 4] также содержит один шар, и цвет этого шара — 2.
  • Отрезок [2, 4] содержит два шара цвета 2 и один шар цвета 1.

На остальных 7 отрезках доминирующим является цвет 1.

C. Псевдонимы серверов

*особая задача Бинарный поиск реализация сортировки Строки Структуры данных *2100

Существуют веб-сайты, доступные сразу по нескольким адресам. Например, долгое время на страницы Codeforces можно было заходить как используя хостнейм cf.m27.workers.dev, так и codeforces.ru.

Вам задан список адресов страниц. Для упрощения будем считать, что все адреса имеют вид: http://<hostname>[/<path>], где:

  • <hostname> — имя сервера (состоит из слов, возможно, разделённых точками),
  • /<path> — необязательная часть, где <path> состоит из слов, разделённых слешами.

Будем считать, что два <hostname> соответствуют одному и тому же веб-сайту, если для каждого запроса к первому <hostname> найдется такой же запрос ко второму и наоборот — для каждого запроса ко второму <hostname> найдется такой же запрос к первому. Изучите примеры из условия для лучшего понимания этого определения.

Выделите все группы имён серверов, которые соответствуют одному сайту. Игнорируйте группы, которые состоят ровно из одного имени сервера.

Обратите внимание, что формально два запроса http://<hostname> и http://<hostname>/ различаются.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100 000) — количество адресов страниц. В следующих строках записаны адреса страниц по одному в строке. Каждый адрес имеет вид http://<hostname>[/<path>], где:

  • <hostname> состоит из строчных букв латинского алфавита и точек, никакие две точки не идут подряд, точки не начинают и не заканчивают <hostname>. Длина <hostname> положительна и не превосходит 20 символов;
  • <path> состоит из строчных букв латинского алфавита, точек и слешей, никакие два слеша не идут подряд, <path> не начинается со слеша, длина <path> не превосходит 20 символов.

Адреса страниц не обязательно различны.

Выходные данные

В первую строку выведите k — количество групп имен серверов, которые соответствуют одному сайту. Следует учитывать только такие группы, размер которых строго больше единицы.

Далее в k строках выведите группы по одной в строке. Для каждой группы выведите все имена серверов в ней через пробел. Как группы, так и имена серверов в группе можно выводить в любом порядке.

A. Проверка дружбы

Конструктив Перебор реализация *1200

Корове Бесси и её лучшей подруге Элси подарили на день числа Пи пазлы. Каждый пазл состоит из таблички 2 × 2 и трёх костяшек с пометками «A», «B» и «C». Эти костяшки расположены в табличке таким образом, что одна клетка свободна. За один ход разрешается выбрать любую костяшку, расположенную в смежной со свободной клетке, и переложить её в свободную клетку, как показано на картинке:

Чтобы выяснить, являются ли они Лучшими Друзьями на Всю Жизнь (ЛДВЖ), Бесси и Элси хотя понять, существует ли такая последовательность ходов (ходить можно в обоих пазлах), которая переводит их пазлы в одинаковую конфигурацию. Конфигурации двух пазлов считаются одинаковыми, если одинаковые костяшки расположены на одинаковых позициях. Поворачивать и переворачивать пазл не разрешается.

Входные данные

В первых двух строках входных данных записана табличка 2 × 2 с изначальной конфигурацией пазла Бесси. Следующие две строки задают табличку 2 × 2 с конфигурацией пазла Элси. Костяшки обозначены буквами «A», «B» и «C», а пустая клетка обозначена как «X». Гарантируется, что оба пазла содержат ровно одну костяшку с каждой буквой и ровно одну пустую клетку.

Выходные данные

Выведите «YES» (без кавычек) если можно совершить такую последовательность ходов, что конфигурации пазлов совпадут (а значит, Бесси и Элси настоящие ЛДВЖ). В противном случае выведите «NO» (без кавычек).

Примечание

Решение для первого тестового примера представлено на рисунке. Бесси достаточно переместить вниз костяшку с пометкой «A».

Во втором примере два пазла нельзя привести в одну конфигурацию. Возможно Бесси и Элси не такие уж и друзья...

A. Наибольший подъем

Конструктив реализация *900

Профиль горного хребта схематично задан в виде прямоугольной таблицы из символов «.» (пустое пространство) и «*» (часть горы). Каждый столбец таблицы содержит хотя бы одну «звёздочку». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

...........
.........*.
.*.......*.
**.......*.
**..*...**.
***********
Пример изображения горного хребта.

Маршрут туриста проходит через весь горный хребет слева направо. Каждый день турист перемещается вправо — в соседний столбец в схематичном изображении. Конечно, каждый раз он поднимается (или опускается) в самую верхнюю точку горы, которая находится в соответствующем столбце.

Считая, что изначально турист находится в самой верхней точке в первом столбце, а закончит свой маршрут в самой верхней точке в последнем столбце, найдите две величины:

  • наибольший подъём за день (равен 0, если в профиле горного хребта нет ни одного подъёма),
  • наибольший спуск за день (равен 0, если в профиле горного хребта нет ни одного спуска).
Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов в схематичном изображении соответственно.

Далее следуют n строк по m символов в каждой — схематичное изображение горного хребта. Каждый символ схематичного изображения — это либо «.», либо «*». Каждый столбец матрицы содержит хотя бы один символ «*». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

Выходные данные

Выведите через пробел два целых числа:

  • величину наибольшего подъёма за день (или 0, если в профиле горного хребта нет ни одного подъёма),
  • величину наибольшего спуска за день (или 0, если в профиле горного хребта нет ни одного спуска).
Примечание

В первом тестовом примере высоты гор равны: 3, 4, 1, 1, 2, 1, 1, 1, 2, 5, 1. Наибольший подъем равен 3 и находится между горой номер 9 (её высота равна 2) и горой номер 10 (её высота равна 5). Наибольший спуск равен 4 и находится между горой номер 10 (её высота равна 5) и горой номер 11 (её высота равна 1).

Во втором тестовом примере высоты гор равны: 1, 2, 3, 4, 5. Наибольший подъём равен 1 и находится, например, между горой номер 2 (ее высота равна 2) и горой номер 3 (её высота равна 3). Так как в данном горном хребте нет спусков, то величина наибольшего спуска равна 0.

В третьем тестовом примере высоты гор равны: 1, 7, 5, 3, 4, 2, 3. Наибольший подъём равен 6 и находится между горой номер 1 (её высота равна 1) и горой номер 2 (её высота равна 7). Наибольший спуск равен 2 и находится между горой номер 2 (её высота равна 7) и горой номер 3 (её высота равна 5). Такой же спуск находится между горой номер 5 (её высота равна 4) и горой номер 6 (её высота равна 2).

A. Наибольший подъем

Конструктив реализация *900

Профиль горного хребта схематично задан в виде прямоугольной таблицы из символов «.» (пустое пространство) и «*» (часть горы). Каждый столбец таблицы содержит хотя бы одну «звёздочку». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

...........
.........*.
.*.......*.
**.......*.
**..*...**.
***********
Пример изображения горного хребта.

Маршрут туриста проходит через весь горный хребет слева направо. Каждый день турист перемещается вправо — в соседний столбец в схематичном изображении. Конечно, каждый раз он поднимается (или опускается) в самую верхнюю точку горы, которая находится в соответствующем столбце.

Считая, что изначально турист находится в самой верхней точке в первом столбце, а закончит свой маршрут в самой верхней точке в последнем столбце, найдите две величины:

  • наибольший подъём за день (равен 0, если в профиле горного хребта нет ни одного подъёма),
  • наибольший спуск за день (равен 0, если в профиле горного хребта нет ни одного спуска).
Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов в схематичном изображении соответственно.

Далее следуют n строк по m символов в каждой — схематичное изображение горного хребта. Каждый символ схематичного изображения — это либо «.», либо «*». Каждый столбец матрицы содержит хотя бы один символ «*». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

Выходные данные

Выведите через пробел два целых числа:

  • величину наибольшего подъёма за день (или 0, если в профиле горного хребта нет ни одного подъёма),
  • величину наибольшего спуска за день (или 0, если в профиле горного хребта нет ни одного спуска).
Примечание

В первом тестовом примере высоты гор равны: 3, 4, 1, 1, 2, 1, 1, 1, 2, 5, 1. Наибольший подъем равен 3 и находится между горой номер 9 (её высота равна 2) и горой номер 10 (её высота равна 5). Наибольший спуск равен 4 и находится между горой номер 10 (её высота равна 5) и горой номер 11 (её высота равна 1).

Во втором тестовом примере высоты гор равны: 1, 2, 3, 4, 5. Наибольший подъём равен 1 и находится, например, между горой номер 2 (ее высота равна 2) и горой номер 3 (её высота равна 3). Так как в данном горном хребте нет спусков, то величина наибольшего спуска равна 0.

В третьем тестовом примере высоты гор равны: 1, 7, 5, 3, 4, 2, 3. Наибольший подъём равен 6 и находится между горой номер 1 (её высота равна 1) и горой номер 2 (её высота равна 7). Наибольший спуск равен 2 и находится между горой номер 2 (её высота равна 7) и горой номер 3 (её высота равна 5). Такой же спуск находится между горой номер 5 (её высота равна 4) и горой номер 6 (её высота равна 2).

A. Наибольший подъем

Конструктив реализация *900

Профиль горного хребта схематично задан в виде прямоугольной таблицы из символов «.» (пустое пространство) и «*» (часть горы). Каждый столбец таблицы содержит хотя бы одну «звёздочку». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

...........
.........*.
.*.......*.
**.......*.
**..*...**.
***********
Пример изображения горного хребта.

Маршрут туриста проходит через весь горный хребет слева направо. Каждый день турист перемещается вправо — в соседний столбец в схематичном изображении. Конечно, каждый раз он поднимается (или опускается) в самую верхнюю точку горы, которая находится в соответствующем столбце.

Считая, что изначально турист находится в самой верхней точке в первом столбце, а закончит свой маршрут в самой верхней точке в последнем столбце, найдите две величины:

  • наибольший подъём за день (равен 0, если в профиле горного хребта нет ни одного подъёма),
  • наибольший спуск за день (равен 0, если в профиле горного хребта нет ни одного спуска).
Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов в схематичном изображении соответственно.

Далее следуют n строк по m символов в каждой — схематичное изображение горного хребта. Каждый символ схематичного изображения — это либо «.», либо «*». Каждый столбец матрицы содержит хотя бы один символ «*». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

Выходные данные

Выведите через пробел два целых числа:

  • величину наибольшего подъёма за день (или 0, если в профиле горного хребта нет ни одного подъёма),
  • величину наибольшего спуска за день (или 0, если в профиле горного хребта нет ни одного спуска).
Примечание

В первом тестовом примере высоты гор равны: 3, 4, 1, 1, 2, 1, 1, 1, 2, 5, 1. Наибольший подъем равен 3 и находится между горой номер 9 (её высота равна 2) и горой номер 10 (её высота равна 5). Наибольший спуск равен 4 и находится между горой номер 10 (её высота равна 5) и горой номер 11 (её высота равна 1).

Во втором тестовом примере высоты гор равны: 1, 2, 3, 4, 5. Наибольший подъём равен 1 и находится, например, между горой номер 2 (ее высота равна 2) и горой номер 3 (её высота равна 3). Так как в данном горном хребте нет спусков, то величина наибольшего спуска равна 0.

В третьем тестовом примере высоты гор равны: 1, 7, 5, 3, 4, 2, 3. Наибольший подъём равен 6 и находится между горой номер 1 (её высота равна 1) и горой номер 2 (её высота равна 7). Наибольший спуск равен 2 и находится между горой номер 2 (её высота равна 7) и горой номер 3 (её высота равна 5). Такой же спуск находится между горой номер 5 (её высота равна 4) и горой номер 6 (её высота равна 2).

A. Наибольший подъем

Конструктив реализация *900

Профиль горного хребта схематично задан в виде прямоугольной таблицы из символов «.» (пустое пространство) и «*» (часть горы). Каждый столбец таблицы содержит хотя бы одну «звёздочку». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

...........
.........*.
.*.......*.
**.......*.
**..*...**.
***********
Пример изображения горного хребта.

Маршрут туриста проходит через весь горный хребет слева направо. Каждый день турист перемещается вправо — в соседний столбец в схематичном изображении. Конечно, каждый раз он поднимается (или опускается) в самую верхнюю точку горы, которая находится в соответствующем столбце.

Считая, что изначально турист находится в самой верхней точке в первом столбце, а закончит свой маршрут в самой верхней точке в последнем столбце, найдите две величины:

  • наибольший подъём за день (равен 0, если в профиле горного хребта нет ни одного подъёма),
  • наибольший спуск за день (равен 0, если в профиле горного хребта нет ни одного спуска).
Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов в схематичном изображении соответственно.

Далее следуют n строк по m символов в каждой — схематичное изображение горного хребта. Каждый символ схематичного изображения — это либо «.», либо «*». Каждый столбец матрицы содержит хотя бы один символ «*». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

Выходные данные

Выведите через пробел два целых числа:

  • величину наибольшего подъёма за день (или 0, если в профиле горного хребта нет ни одного подъёма),
  • величину наибольшего спуска за день (или 0, если в профиле горного хребта нет ни одного спуска).
Примечание

В первом тестовом примере высоты гор равны: 3, 4, 1, 1, 2, 1, 1, 1, 2, 5, 1. Наибольший подъем равен 3 и находится между горой номер 9 (её высота равна 2) и горой номер 10 (её высота равна 5). Наибольший спуск равен 4 и находится между горой номер 10 (её высота равна 5) и горой номер 11 (её высота равна 1).

Во втором тестовом примере высоты гор равны: 1, 2, 3, 4, 5. Наибольший подъём равен 1 и находится, например, между горой номер 2 (ее высота равна 2) и горой номер 3 (её высота равна 3). Так как в данном горном хребте нет спусков, то величина наибольшего спуска равна 0.

В третьем тестовом примере высоты гор равны: 1, 7, 5, 3, 4, 2, 3. Наибольший подъём равен 6 и находится между горой номер 1 (её высота равна 1) и горой номер 2 (её высота равна 7). Наибольший спуск равен 2 и находится между горой номер 2 (её высота равна 7) и горой номер 3 (её высота равна 5). Такой же спуск находится между горой номер 5 (её высота равна 4) и горой номер 6 (её высота равна 2).

A. Наибольший подъем

Конструктив реализация *900

Профиль горного хребта схематично задан в виде прямоугольной таблицы из символов «.» (пустое пространство) и «*» (часть горы). Каждый столбец таблицы содержит хотя бы одну «звёздочку». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

...........
.........*.
.*.......*.
**.......*.
**..*...**.
***********
Пример изображения горного хребта.

Маршрут туриста проходит через весь горный хребет слева направо. Каждый день турист перемещается вправо — в соседний столбец в схематичном изображении. Конечно, каждый раз он поднимается (или опускается) в самую верхнюю точку горы, которая находится в соответствующем столбце.

Считая, что изначально турист находится в самой верхней точке в первом столбце, а закончит свой маршрут в самой верхней точке в последнем столбце, найдите две величины:

  • наибольший подъём за день (равен 0, если в профиле горного хребта нет ни одного подъёма),
  • наибольший спуск за день (равен 0, если в профиле горного хребта нет ни одного спуска).
Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов в схематичном изображении соответственно.

Далее следуют n строк по m символов в каждой — схематичное изображение горного хребта. Каждый символ схематичного изображения — это либо «.», либо «*». Каждый столбец матрицы содержит хотя бы один символ «*». Гарантируется, что любой из символов «*» либо находится в нижней строке матрицы, либо непосредственно под ним находится другой символ «*».

Выходные данные

Выведите через пробел два целых числа:

  • величину наибольшего подъёма за день (или 0, если в профиле горного хребта нет ни одного подъёма),
  • величину наибольшего спуска за день (или 0, если в профиле горного хребта нет ни одного спуска).
Примечание

В первом тестовом примере высоты гор равны: 3, 4, 1, 1, 2, 1, 1, 1, 2, 5, 1. Наибольший подъем равен 3 и находится между горой номер 9 (её высота равна 2) и горой номер 10 (её высота равна 5). Наибольший спуск равен 4 и находится между горой номер 10 (её высота равна 5) и горой номер 11 (её высота равна 1).

Во втором тестовом примере высоты гор равны: 1, 2, 3, 4, 5. Наибольший подъём равен 1 и находится, например, между горой номер 2 (ее высота равна 2) и горой номер 3 (её высота равна 3). Так как в данном горном хребте нет спусков, то величина наибольшего спуска равна 0.

В третьем тестовом примере высоты гор равны: 1, 7, 5, 3, 4, 2, 3. Наибольший подъём равен 6 и находится между горой номер 1 (её высота равна 1) и горой номер 2 (её высота равна 7). Наибольший спуск равен 2 и находится между горой номер 2 (её высота равна 7) и горой номер 3 (её высота равна 5). Такой же спуск находится между горой номер 5 (её высота равна 4) и горой номер 6 (её высота равна 2).

A. Любимые числа Поликарпа

Конструктив реализация *1000

Поликарп мечтает стать программистом и фанатеет от степеней двойки. Среди двух чисел ему больше нравится то, которое делится на большую степень числа 2.

По заданной последовательности целых положительных чисел a1, a2, ..., an требуется найти r — максимальную степень числа 2, на которую делится хотя бы одно из чисел последовательности. Кроме того, требуется вывести количество чисел ai, которые делятся на r.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — длина последовательности a.

Во второй строке записана последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109).

Выходные данные

Выведите два числа:

  • r — максимальную степень двойки, на которую делится хотя бы одно из чисел заданной последовательности,
  • количество элементов последовательности, которые делятся на r.
Примечание

В первом тестовом примере максимальная степень двойки, на которую делится хотя бы одно число, равна 16 = 24, на неё делятся числа 80, 16 и 48.

Во втором тестовом примере все четыре числа нечётные, поэтому делятся только на 1 = 20. Это и будет максимальной степенью двойки для данного примера.

D. Дефрагментация памяти

жадные алгоритмы Конструктив реализация *1600

Память компьютера состоит из n ячеек, которые выстроены в ряд. Пронумеруем ячейки от 1 до n слева направо. Про каждую ячейку известно, свободна она или принадлежит какому-либо процессу (в таком случае известен процесс, которому она принадлежит).

Для каждого процесса известно, что принадлежащие ему ячейки занимают в памяти непрерывный участок. С помощью операций вида «переписать данные из занятой ячейки в свободную, а занятую теперь считать свободной» требуется расположить все принадлежащие процессам ячейки в начале памяти компьютера. Другими словами, любая свободная ячейка должна располагаться правее (иметь больший номер) любой занятой.

Вам необходимо найти минимальное количество операций переписывания данных из одной ячейки в другую, с помощью которых можно достичь описанных условий. Допустимо, что относительный порядок ячеек в памяти для каждого из процессов изменится после дефрагментации, но относительный порядок самих процессов должен остаться без изменений. Это значит, что если все ячейки, принадлежащие процессу i, находились в памяти раньше всех ячеек процесса j, то и после перемещений это условие должно выполняться.

Считайте, что номера всех процессов уникальны, хотя бы одна ячейка памяти занята каким-либо процессом.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 200 000) — количество ячеек в памяти компьютера.

Во второй строке входных данных следуют n целых чисел a1, a2, ..., an (1 ≤ ai ≤ n), где ai равно либо 0 (это означает, что i-я ячейка памяти свободна), либо номеру процесса, которому принадлежит i-я ячейка памяти. Гарантируется, что хотя бы одно значение ai не равно 0.

Процессы пронумерованы целыми числами от 1 до n в произвольном порядке. При этом процессы не обязательно пронумерованы последовательными числами.

Выходные данные

Выведите одно целое число — минимальное количество операций, которое нужно сделать для дефрагментации памяти.

Примечание

В первом тестовом примере достаточно двух операций:

  1. Переписать данные из третьей ячейки в первую. После этого память компьютера примет вид: 2 2 0 1.
  2. Переписать данные из четвертой ячейки в третью. После этого память компьютера примет вид: 2 2 1 0.

A. Гарри Поттер и три заклинания

математика реализация *1800

Давным-давно (наверное, еще в первой книге) великий алхимик, создатель философского камня Николас Фламель научил Гарри Поттера трем полезным заклинаниям. Первое из них позволяет превратить a граммов песка в b граммов свинца, второе — c граммов свинца в d граммов золота и третье — e граммов золота в f граммов песка. Когда Гарри рассказал об этих заклинаниях своим друзьям, Рон Уизли был в восторге: ведь если получится превращать песок в свинец, свинец в золото, часть золота — снова в песок и так далее, то можно будет, начиная с небольшого количества песка, получить огромное количество золота! Даже бесконечное количество золота! Гермиона Грейнджер, напротив, отнеслась к этой идее скептически. Она утверждает, что согласно закону сохранения материи невозможно получить бесконечное количество материи даже при помощи магии. Наоборот, количество материи при превращениях может даже уменьшаться, переходя в магическую энергию. Несмотря на то, что аргументы Гермионы выглядят убедительно, Рон не собирается ей верить. По его мнению, Гермиона придумала свой закон сохранения материи только для того, чтобы Гарри с Роном перестали заниматься ерундой, а лучше шли учить уроки. Поэтому Рон уже набрал некоторое количество песка для экспериментов и, кажется, ссоры между друзьями не избежать...

Помогите Гарри определить, кто из его друзей прав, и все-таки предотвратить ссору. Для этого вам придется выяснить, можно ли из некоторого конечного количества песка получить количество золота, большее любого наперед заданного числа.

Входные данные

В первой строке заданы 6 целых чисел a, b, c, d, e, f (0 ≤ a, b, c, d, e, f ≤ 1000).

Выходные данные

Выведите «Ron», если имея некоторое конечное количество песка (и не имея вообще золота и свинца), возможно получить сколь угодно большое количество золота, т.е. прав Рон. В противном случае выведите «Hermione».

Примечание

Разберем первый пример. Начнем с 500 граммов песка. Применяя 5 раз первое заклинание, превратим их в 1000 граммов свинца. Затем 4 раза применим второе заклинание и получим 600 граммов золота. Из них выделим 400 и превратим их снова в песок. Получим 500 граммов песка и 200 граммов золота. Применяя все те же операции к 500 граммам песка повторно, можно будет каждый раз получать дополнительные 200 граммов золота. Таким образом можно получить 200, 400, 600 и т.д. граммов золота, т.е. начиная с конечного количества песка (500 граммов) можно получить количество золото, большее любого наперед заданного числа.

В четвертом примере, применяя заклинания, невозможно получить ни песок, ни свинец, ни золото.

В пятом примере сколь угодно большое количество золота можно получить, применяя только второе заклинание, которое позволяет получать 1 грамм золота из ничего. Отметим, что при наличии такого второго заклинания первое и третье вообще не влияют на ответ.

Более интересный седьмой пример. В нем тоже можно начать с нулевого количества песка. С помощью третьего заклинания можно получать песок из ничего. Получим так 10000 граммов песка. Из них, применяя 100 раз первое заклинание, получим 100 граммов свинца, а из них — 1 грамм золота. Нам удалось получить 1 грамм золота, начиная с нулевого количества песка! Ясно, что таким образом можно получить сколь угодно большое количество золота.

B. Гарри Поттер и история магии

жадные алгоритмы Перебор реализация *1700

История магии, пожалуй, самый скучный предмет в Школе Чародейства и Волшебства Хогвартс. Гарри Поттер обычно спит на уроках истории, а лекции за него пишет Самопишущее Перо. Профессор Бинс, учитель истории магии, читает лекции настолько скучным и монотонным голосом, что он оказывает усыпляющее действие даже на Самопишущее Перо. Из-за этого Перо часто допускает ошибки, особенно в датах.

И вот в конце семестра профессор Бинс решил собрать у учеников пергаменты с лекциями на проверку. Рон Уизли в панике: если у Гарри есть хотя бы какие-то конспекты, пусть и с ошибками, то у него нет никаких, потому что на лекциях Рон тоже спал, а его перо давно сгрызла крыса Короста. Гермиона Грейнджер отказалась дать Рону свои конспекты, потому что, по ее мнению, все должны учиться самостоятельно. Поэтому Рону ничего не остается делать, кроме как переписывать конспекты Гарри.

Из-за ошибок Пера у Гарри вышла полнейшая путаница с датами: годы восстаний гоблинов и других важных для магического мира событий идут не по порядку, иногда даже встречаются даты из будущего. Теперь при переписывании Рон хочет изменить некоторые цифры так, чтобы даты шли в хронологическом (т.е. неубывающем) порядке и чтобы в конспектах не было дат позже 2011 года или раньше 1000 года. Чтобы полученная в результате последовательность была как можно ближе к той, которую диктовал профессор Бинс, Рон будет изменять не более одной цифры в каждой дате на другую цифру. Помогите ему сделать это.

Входные данные

В первой строке входного файла содержится одно целое число n (1 ≤ n ≤ 1000) — количество дат в конспектах Гарри. Следующие n строк содержат сами даты y1, y2, ..., yn, по одной в строке. Каждая дата является четырехзначным целым числом (1000 ≤ yi ≤ 9999).

Выходные данные

Выведите n чисел z1, z2, ..., zn (1000 ≤ zi ≤ 2011) — даты, получившиеся у Рона. Числа выводите по одному в строке. Числа zi должны образовывать неубывающую последовательность. Каждое число zi должно отличаться от соответствующей даты yi не более чем одной цифрой. Замена первой цифры числа на 0 не допускается. Если возможных решений несколько, выведите любое. Если решений нет, выведите «No solution» (без кавычек).

E. Гарри Поттер и движущиеся лестницы

поиск в глубину и подобное реализация *2900

Спасаясь от школьного завхоза Филча, Гарри Поттер потерял мантию-невидимку. Отыскать невидимый предмет — задача не из легких. К счастью, у Гарри есть друзья, готовые помочь. Гермиона Грейнджер, которая проштудировала «Мантии-невидимки и все о них», а также шесть томов «Энциклопедии по быстрому поиску кратчайших путей в графах, потоков в сетях, наибольших возрастающих подпоследовательностей и других магических объектов», уже разработала алгоритм поиска мантии-невидимки в сложных динамических системах (каковой и является Хогвартс).

Хогвартс состоит из n этажей, пронумерованных целыми числами от 1 до n. Некоторые пары этажей соединены лестницами. Лестницы могут менять свое положение, перемещая ровно один из концов. Формально: если лестница соединяет этажи a и b, то за одно перемещение она может изменить свое положение так, чтобы соединять этажи a и c или b и c, где c — любой этаж, отличный от a и b. Ни при каких обстоятельствах лестница не может соединять этаж сам с собой. В то же время между парой этажей может быть несколько лестниц.

Изначально Гарри находится на этаже с номером 1. Он не помнит, на каком этаже потерял мантию, и хочет провести поиски на каждом из этажей. Поэтому его цель — посетить каждый из n этажей не менее чем по одному разу. Гарри может посещать этажи в любом порядке и закончить поиски на любом этаже.

В последние годы лестницы перемещаются достаточно редко. Однако Рон и Гермиона готовы наложить заклятие на любую из них, чтобы помочь Гарри в поисках мантии. Чтобы вызывать поменьше подозрений, друзья планируют перемещать лестницы по одной, причем каждую лестницу не более одного раза. В промежутках между перемещением лестниц Гарри сможет передвигаться по этажам, достижимым в данный момент по лестницам, и искать свою мантию-невидимку. Предполагается, что все это время самопроизвольно перемещаться лестницы не будут.

Помогите друзьям разработать план поисков. В случае если вариантов решения несколько, допустим любой корректный вариант (не обязательно оптимальный).

Входные данные

В первой строке заданы целые числа n и m (1 ≤ n ≤ 100000, 0 ≤ m ≤ 200000) — количество этажей и количество лестниц в Хогвартсе соответственно. Следующие m строк содержат пары этажей, соединяемых лестницами в начальный момент времени.

Выходные данные

В первой строке выведите «YES» (без кавычек), если Гарри сможет обыскать все этажи, и «NO» в противном случае. В случае положительного ответа во второй строке выведите количество лестниц, которые Рон и Гермиона должны будут переместить. Дальнейший вывод должен иметь вид:

перемещения Гарри

перемещение лестницы

перемещения Гарри

перемещение лестницы

...

перемещение лестницы

перемещения Гарри

Каждый блок «перемещения Гарри» должен представлять собой список этажей в порядке их посещения. Суммарное число элементов в списках перемещений Гарри не должно превосходить 106. При выводе каждого списка сначала выводится количество элементов в нем, затем в той же строке — сами элементы через пробел. Первым числом в первом списке должен быть номер 1 (этаж, с которого Гарри начинает поиски). Любой список, кроме первого, может содержать нулевое количество элементов. Обратите внимание, что Гарри может посещать некоторые этажи повторно, но обязательно должен посетить все n этажей хотя бы по одному разу. Два последовательно посещаемых этажа должны быть непосредственно соединены лестницей (в момент перехода между ними). Никакие два этажа, посещенные последовательно, не должны совпадать.

При описании «перемещения лестницы» указывается номер лестницы (лестницы нумеруются целыми числами от 1 до m в порядке их задания во входных данных) и ее новое положение (два номера соединяемых этажей в произвольном порядке).

Одну лестницу можно переместить не более одного раза. Если решений несколько, выведите любое.

A. Джойстики

дп жадные алгоритмы математика реализация *1100

Друзья собрались поиграть в приставку. У них есть два джойстика и только одна зарядка. Изначально первый джойстик заряжен на a1 процентов, а второй на a2 процентов. Подключать джойстик к зарядке можно только вначале каждой минуты. За минуту игры джойстик без зарядки разряжается на 2 процента, а с зарядкой заряжается на 1 процент.

Игра продолжается пока заряд обоих джойстиков строго положителен. Таким образом, если в начале очередной минуты у какого-либо джойстика остаётся 1 процент заряда, то его необходимо подключить к зарядке или игра будет остановлена. Если у какого-то джойстика остаётся 0 процентов зарядки, то игра останавливается.

Определите максимальное время в минутах, которое может продлиться игра. Делать паузы в игре нельзя, то есть каждую минуту оба джойстика обязательно должны быть в игре. В силу особенности конструкции, каждый из джойстиков может быть заряжен более чем на 100 процентов.

Входные данные

В первой строке входных данных содержатся два целых положительных числа a1, a2 (1 ≤ a1, a2 ≤ 100) — начальный процент заряда первого и второго джойстика соответственно.

Выходные данные

Выведите единственное целое число — максимальное количество минут, которое может продолжаться игра. Игра продолжается пока какой-либо из джойстиков не разрядится.

Примечание

В первом примере игра может продолжаться 6 минут, например, при такой последовательности действий:

  • в первую минуту подключаем к зарядке первый джойстик и начинаем игру, к концу первой минуты первый джойстик будет заряжен на 4%, а второй — на 3%;
  • не меняя зарядку играем еще минуту, к концу второй минуты первый джойстик будет заряжен на 5%, а второй — на 1%;
  • перед третьей минутой переключаем зарядку на второй джойстик, после нее первый будет заряжен на 3%, второй — на 2%;
  • не меняя зарядку играем еще минуту, к концу второй минуты первый джойстик будет заряжен на 1%, а второй — на 3%;
  • перед пятой минутой переключаем зарядку на первый джойстик, после нее первый будет заряжен на 2%, второй — на 1%;
  • перед шестой минутой переключаем зарядку на второй джойстик, после нее первый будет заряжен на 0%, второй — на 2%.

Так как первый джойстик полностью разрядился, продолжать игру далее нельзя.

A. Габриел и гусеница

математика реализация *1400

Ученик 9-ого класса Габриел, прогуливаясь после уроков по лесу, заметил на одном из деревьев гусеницу, которая находилась на высоте h1 см от земли. На высоте h2 см (h2 > h1), на том же дереве, висело яблоко, к которому ползла гусеница.

Габриел, будучи любопытным мальчиком, решил узнать, когда гусеница наконец доберётся до плода. Он заметил, что в дневное время гусеница за час поднимается на a см, а ночью за час сползает на b см.

Через сколько дней нужно вернуться Габриелу в лес, чтобы увидеть как гусеница забирается на яблоко, если день у гусеницы начинается в 10 утра, а заканчивается в 22 вечера. Уроки у Габриела заканчиваются в 14 часов дня. Можно считать, что Габриел заметил гусеницу непосредственно в 14 часов дня.

Обратите внимание, что лес в котором прогуливался Габриел не простой, а волшебный. Поэтому гусеница может сползти по стволу под землю, а затем подняться к яблоку.

Входные данные

В первой строке находится пара целых чисел h1, h2 (1 ≤ h1 < h2 ≤ 105) — высота положения гусеницы и яблока в сантиметрах.

Во второй строке находится пара целых чисел a, b (1 ≤ a, b ≤ 105) — расстояние, на которое гусеница взбирается днём и сползает ночью, в сантиметрах за час.

Выходные данные

Выведите единственное целое число k — количество дней, через которое Габриелу нужно будет вернуться в лес, чтобы увидеть гусеницу, забирающуюся на яблоко.

Если гусеница никогда не сможет забраться на яблоко, то выведите  - 1.

Примечание

В первом примере в 22 часа того же дня гусеница оказывается на высоте 26. К 10 утра следующего дня она сползает до высоты 14. И наконец в 18 часов того же дня она добирается до яблока.

Обратите внимание, в последнем примере гусеница в первую ночь сползает под землю, но на следующий день съедает яблоко.

A. Медвежонок и три мячика

Перебор реализация сортировки *900

У полярного медвежонка Лимака есть n мячиков. Размер i-го мячика равен ti.

Лимак хочет подарить по одному мячику каждому из трёх своих друзей. Дарить подарки нелегко — Лимак должен следовать двум правилам:

  • Никакие два друга не должны получить мячики одинакового размера.
  • Никакие два друга не должны получить мячики, размеры которых отличаются больше чем на 2.

Например, Лимак может выбрать мячики размеров 4, 5 и 3 или мячики размера 90, 91 и 92. При этом он не может выбрать мячики размера 5, 5 и 6 (два друга получат одинаковые мячики) и не может выбрать 30, 31 и 33 (30 и 33 отличаются больше чем на 2).

Помогите Лимаку определить, сможет ли он выбрать подарки своим друзьям и не нарушить ни одного из правил.

Входные данные

В первой строке входных данных записано число n (3 ≤ n ≤ 50) — количество мячиков у Лимака.

Во второй строке записано n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 1000), где ti означает размер i-го мячика.

Выходные данные

Если Лимак может выбрать три мячика разного размера, так что никакие два не будут отличаться больше чем на 2, то выведите "YES" (без кавычек). В противном случае выведите "NO".

Примечание

В первом примере у Лимака есть 4 мячика, и он может выбрать из них три, не нарушая ни одного правила. Для этого необходимо взять мячики с размерами 18, 16 и 17.

Во втором примере не существует способа раздать друзьям подарки, не нарушая при этом правил.

В третьем примере выбрать подарки можно двумя способами:

  1. Выбрать мячики размера 3, 4 и 5.
  2. Выбрать мячики размера 972, 970 и 971.

C. Медвежонок, взлёты и падения

Перебор реализация *1900

В жизни всё время чередуются взлёты и падения, прямо как в забавных последовательностях. Последовательность t1, t2, ..., tn называется забавной, если выполнены следующие два условия:

  • ti < ti + 1 для всех нечётных i < n;
  • ti > ti + 1 для всех чётных i < n.

Например, последовательности (2, 8), (1, 5, 1) и (2, 5, 1, 100, 99, 120) являются забавными, а (1, 1), (1, 2, 3) и (2, 5, 3, 2) нет.

У полярного медвежонка Лимака есть последовательность целых положительных чисел t1, t2, ..., tn. Это последовательность не является забавной, и Лимак хочет это исправить. Он ровно один раз выберет какие-то два элемента и поменяет их местами. Посчитайте число таких пар индексов i < j, что если поменять местами соответствующие элементы ti и tj, то последовательность станет забавной.

Входные данные

В первой строке входных данных записано число n (2 ≤ n ≤ 150 000) — длина последовательности t.

Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 150 000) — исходная последовательность. Гарантируется, что она не является забавной.

Выходные данные

Выведите количество способов поменять два элемента ровно один раз, чтобы сделать имеющуюся последовательность забавной.

Примечание

В первом примере получить забавную последовательность можно двумя способами:

  1. Поменять местами t2 = 8 и t4 = 7.
  2. Поменять местами t1 = 2 и t5 = 7.

Во втором примере есть только один способ получить забавную последовательность: поменять местами t1 = 200 и t4 = 50.

B. Scrambled

*особая задача реализация *1700

И вы, и ваш сесод по канотме нтанвидеие мтыь подсуу, но кмоу-то посритхидя это детлаь каыждй днеь. Однджаы вы рлшиеи смоатеразититивсь эту здаачу. Ваш сеосд пдагелаерт сеуущюлдю сместиу. Вы сеаасголтоывве два мвсасиа цыелх чиесл M и R, нтерууеме пещяотсидре дни (валкчюя тщуикей) псноыьтвмлледаоеи цлмыеи члиамси (ноемр тгекеущо дня раевн нлую), и вы мотее пусдоу в днеь D тгдоа и токьло тдгоа, кгдоа сщувуетсет ткаой иденкс I ткоай, что D mod M[I] = R[I], в протоинвм сучале ваш сесод меот псдуоу. Вам нистваря кецоипцня, но хтария улкбыа веагшо сдеоса зялеасатвт вас что-то зипзтоадроь, пэмотоу вы ршаеете пврртеоиь сетрвспдавлоиь слеиногашя. Днаы мвсаисы M и R. Вииытлсче длою денй, в котроые вы мтеое пусоду. Сачтийте, что у вас вепедри бноечкенсо мнгоо денй.

Входные данные

Первая строка входных данных содержит целое число N (1 ≤ N ≤ 16).

Вторая и третья строки содержат N целых чисел от 0 до 16 каждая и представляют массивы M и R, соответственно. Для всех i M[i] > 0, R[i] < M[i].

Выходные данные

Выведите одно вещественное число. Ответ считается правильным, если абсолютная или относительная погрешность не превосходит 10 - 4.

A. Медвежонок и развёрнутый Радевуш

реализация *800

Лимак и Радевуш собираются принять участие в приближающемся соревновании по спортивному программированию. Их умения и навыки совершенно идентичны, но они будут решать задачи в разном порядке.

Всего в соревновании будет представлено n задач. Задача номер i изначально стоит pi очков и на её решение обоим друзьям потребуется ровно ti минут. Задачи упорядочены по сложности, то есть pi < pi + 1 и ti < ti + 1.

Также известен параметр c, означающий скорость убывания стоимости задач. Сдав задачу номер i на минуте x (то есть через x минут после начала контеста) участник получит max(0,  pi - c·x) очков.

Лимак будет решать задачи в порядке 1, 2, ..., n (то есть упорядоченными по возрастанию pi). Радевуш же будет решать задачи в порядке n, n - 1, ..., 1 (упорядоченными по убыванию pi). Вам требуется предсказать итоговый результат — выведите имя победителя (того кто наберёт больше очков) или «Tie» в случае ничьей.

Продолжительность соревнования будет не меньше суммы всех ti, поэтому и Лимак и Радевуш успеют сдать все n задач.

Входные данные

В первой строке записаны два целых числа n и c (1 ≤ n ≤ 50, 1 ≤ c ≤ 1000) — количество задач и параметр, определяющий скорость падения стоимости задач соответственно.

Во второй строке записаны n целых чисел p1, p2, ..., pn (1 ≤ pi ≤ 1000, pi < pi + 1) — изначальные стоимости задач.

В третьей строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 1000, ti < ti + 1), i-е из которых означает количество минут, необходимых для решения i-й задачи.

Выходные данные

Выведите «Limak» (без кавычек), если Лимак наберёт больше очков чем Радевуш. Если же Радевуш наберёт строго больше очков чем Лимак, то выведите «Radewoosh» (без кавычек). В случае ничьей выведите «Tie».

Примечание

В первом примере на соревновании предложены 3 задачи. Посмотрим, как будет решать задачи Лимак:

  1. Лимак потратит 10 минут на задачу 1 и получит 50 - c·10 = 50 - 2·10 = 30 очков.
  2. Затем он потратит 15 минут на задачу номер 2 и сдаст её на 10 + 15 = 25 минуте после начала соревнования. Таким образом, за вторую задачу он получит 85 - 2·25 = 35 очков.
  3. Наконец, на задачу 3 у Лимака уйдёт ещё 25 минут, он сдаст её на 10 + 15 + 25 = 50 минуте после начала соревнования и получит 250 - 2·50 = 150 очков.

Итоговый счёт Лимака равен 30 + 35 + 150 = 215 очкам.

Радевуш решает задачи в обратном порядке:

  1. Радевуш решает задачу 3 за 25 минут и получает 250 - 2·25 = 200 очков.
  2. Теперь он тратит 15 минут на задачу 2 и посылает её на 25 + 15 = 40 минуте после начала соревнования. За эту задачу он получает 85 - 2·40 = 5 очков.
  3. Ещё через 10 минут он сдаёт задачу 1. Это происходит на 25 + 15 + 10 = 50 минуте после начала и Радевуш получает max(0, 50 - 2·50) = max(0,  - 50) = 0 очков.

Итого Радевуш получает 200 + 5 + 0 = 205 очков. Лимак набирает больше и побеждает.

Во втором примере Лимак получит 0 очков за каждую задачу, а Радевуш сначала решит самую сложную и получит за неё 250 - 6·25 = 100 очков. За остальные задачи он тоже получит 0 очков, но всё равно победит.

В третьем примере Лимак заработает по 2 очка за задачи 1 и 2. Радевуш получит 4 очка за задачу 8. За остальные задачи они ничего не получат, поэтому будет ничья (2 + 2 = 4).

A. Круглый дом

математика реализация *1000

Вася живёт в круглом доме, подъезды которого последовательно пронумерованы целыми числами от 1 до n. Причём подъезды номер n и номер 1 являются соседними.

Сегодня Васе стало скучно, и он решил погулять во дворе. Вася живёт в подъезде номер a, и он решил, что его прогулка будет заключаться в движении вокруг дома в порядке возрастания номеров подъездов на b подъездов (в таком порядке после подъезда номер n следует подъезд номер 1). Отрицательное значение b соответствует движению в порядке убывания номеров подъездов на |b| подъездов (в таком порядке после подъезда номер 1 следует подъезд номер n). Если же b = 0, то Вася предпочитает гулять рядом со своим подъездом.

Иллюстрация для n = 6, a = 2, b =  - 5.

Помогите Васе определить номер подъезда, возле которого он окажется в конце своей прогулки.

Входные данные

В единственной строке входного файла через пробел заданы три целых числа n, a и b (1 ≤ n ≤ 100, 1 ≤ a ≤ n,  - 100 ≤ b ≤ 100) — количество подъездов в доме Васи, номер его подъезда и длина его прогулки соответственно.

Выходные данные

Выведите единственное целое число k (1 ≤ k ≤ n) — номер подъезда, возле которого Вася окажется в конце своей прогулки.

Примечание

Первый пример проиллюстрирован рисунком из условия.

C. Таня и игрушки

жадные алгоритмы реализация *1200

В Берляндии недавно появилась в продаже новая коллекция игрушек. В этой коллекции 109 типов игрушек, пронумерованных целыми числами от 1 до 109. Игрушка из новой коллекции i-го типа стоит i бурлей.

Таня уже успела собрать n игрушек различных типов a1, a2, ..., an из новой коллекции. Сегодня у Тани день рождения, и её мама решила потратить не более m бурлей на подарок дочери. Таня в качестве подарка выберет несколько игрушек различных типов из новой коллекции. Конечно, она не хочет получить в качестве подарка игрушку того типа, которая у неё уже есть.

Таня хочет, чтобы в результате в её коллекции было как можно больше различных типов игрушек. Новая коллекция слишком разнообразна, а Таня еще слишком мала, поэтому она просит вас помочь ей в этом.

Входные данные

В первой строке содержатся два целых числа n (1 ≤ n ≤ 100 000) и m (1 ≤ m ≤ 109) — количество типов игрушек, которые уже есть у Тани, и количество бурлей, которые мама готова потратить на покупку новых игрушек.

В следующей строке содержатся n различных целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109) — типы игрушек, которые у Тани уже есть.

Выходные данные

В первой строке выведите единственное целое число k — количество игрушек различных типов, которые следует выбрать Тане, чтобы количество различных типов игрушек в её коллекции стало максимально возможным. Разумеется, суммарная стоимость выбранных игрушек не должна превышать m.

Во второй строке выведите k разделённых пробелами различных целых чисел t1, t2, ..., tk (1 ≤ ti ≤ 109) — типы игрушек, которые следует выбрать Тане.

Если ответов несколько, разрешается вывести любой из них. Значения ti можно выводить в любом порядке.

Примечание

В первом примере мама должна купить две игрушки: одну игрушку 2-го типа и одну игрушку 5-го типа. При любой другой покупке на 7 бурлей (учитывая, что игрушки типов 1, 3 и 4 уже куплены), купить две и более игрушек не получится.

D. Велосипедная гонка

геометрия математика реализация *1500

Мария участвует в велосипедной гонке.

Гоночная трасса проходит по берегу озера Люцерн, точно повторяя его контур. Как известно, берег озера состоит только из прямых участков, направленных на север, юг, восток или запад.

Введём систему координат, направив ось Ox с запада на восток, а ось Oy — с юга на север. В качестве позиции старта гонки выбирается самая южная (а если таких несколько, то самая западная из них) точка трассы. Участники начинают гонку, двигаясь на север. На всех прямых участках трассы участники едут в одном из четырёх направлений (север, юг, восток или запад) и меняют направление движения только на поворотах между прямыми участками. Участники, конечно, никогда не поворачивают назад, то есть не меняют направление движения с северного на южное или с восточного на западное (или наоборот).

Мария ещё юна, поэтому она чувствует себя уверенно не на всех поворотах. А именно, Мария чувствует себя неуверенно, если при неудачном или несвоевременном повороте она попадёт в воду. Иными словами, Мария считает поворот опасным, если при его игнорировании она сразу попадает в воду.

Помогите Маше подготовиться к соревнованию — определите количество опасных поворотов на трассе.

Входные данные

В первой строке входных данных находится целое число n (4 ≤ n ≤ 1000) — количество прямых участков трассы.

В следующих (n + 1)-й строке находятся пары целых чисел (xi, yi) ( - 10 000 ≤ xi, yi ≤ 10 000). Первая из этих точек является позицией старта. i-й прямой участок трассы начинается в точке (xi, yi) и заканчивается в точке (xi + 1, yi + 1).

Гарантируется, что:

  • первый прямой участок направлен на север;
  • самая южная (а если таких несколько, то самая западная из них) точка трассы — первая точка;
  • последняя точка совпадает с первой (то есть с позицией старта);
  • любая пара прямых участков трассы не имеет общих точек (за исключением соседних, имеющих ровно одну общую точку);
  • никакая пара точек (кроме первой и последней) не совпадает;
  • никакие два соседних прямых участка не направлены в одну и ту же сторону или в противоположные стороны.
Выходные данные

Выведите единственное целое число — количество опасных поворотов на трассе.

Примечание

Первый пример соответствует картинке:

На картинке видно, что оказаться в воде при неудачном стечении обстоятельств можно только на повороте в точке (1, 1). Таким образом, ответ равен 1.

A. Петя и Java

реализация Строки *1300

Маленький Петя недавно начал посещать кружок по программированию. Естественно, перед ним появилась задача выбрать язык, на котором он будет программировать. После долгих размышлений, он понял, что Java — лучший выбор. Главным аргументом в пользу выбора Java было то, что в ней есть очень большой целочисленный тип данных — BigInteger.

Но после посещения занятий кружка, Петя понял, что не все задачи требует использования типа BigInteger. Как оказалось, в некоторых задачах намного удобнее использовать маленькие типы данных. Поэтому возникает вопрос: «Какой целочисленный тип использовать, если нужно хранить натуральное число n

Петя знает лишь 5 целочисленных типов:

1) byte занимает 1 байт, позволяет хранить числа от  - 128 до 127

2) short занимает 2 байта, позволяет хранить числа от  - 32768 до 32767

3) int занимает 4 байта, позволяет хранить числа от  - 2147483648 до 2147483647

4) long занимает 8 байт, позволяет хранить числа от  - 9223372036854775808 до 9223372036854775807

5) BigInteger позволяет хранить любое целое число, но при этом не является примитивным типом, и операции с ним выполняются гораздо медленнее.

Для всех указанных выше типов значения границ включаются в диапазон значений.

Из этого списка Петя хочет выбрать самый маленький тип, в котором можно хранить натуральное число n. Так как BigInteger работает гораздо медленнее, Петя рассматривает его в последнюю очередь. Помогите ему.

Входные данные

В первой строке записано натуральное число n. Оно состоит не более чем из 100 цифр и не содержит лидирующих нулей. n не может являться пустой строкой.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

Выходные данные

Выведите первый тип из списка "byte, short, int, long, BigInteger", в котором можно хранить натуральное число n, в соответствии с данными, приведенными выше.

B. Петя и деревня

Перебор реализация *1100

Маленький Петя часто ездит к бабушке в деревню. У бабушки есть большой огород, который, если смотреть сверху, можно представить в виде прямоугольника размером 1 × n, разбитого на n одинаковых квадратных участков. Особенностью огорода является то, что каждый из квадратных участков имеет свою фиксированную высоту и над каждым из участков при помощи новейшей системы водоснабжения может быть создан искусственный дождь над этим участком.

Создание искусственного дождя — дорогостоящая операция, поэтому мы ограничимся тем, что искусственный дождь будет создан лишь над одним участком. При этом вода с каждого затопленного участка будет попадать на соседние с ним участки, если их высота не превосходит высоту данного участка. То есть, к примеру, если огород представляет собой прямоугольник 1 × 5, где высоты участков равны 4, 2, 3, 3, 2, то создав искусственный дождь над любым из участков с высотой 3 — вода разольется по всем участкам, кроме участка с высотой 4. Картинка, поясняющая этот пример:

Петя увлекается программированием, поэтому он решил найти такой участок, что если мы создадим над этим участком искусственный дождь, то количество участков, на которые попадет вода, будет максимальным. Помогите ему.

Входные данные

В первой строке записано натуральное число n (1 ≤ n ≤ 1000) — количество участков. Во второй строке записано n натуральных чисел — высоты участков. Все числа во входном файле не менее 1 и не более 1000.

Выходные данные

Выведите одно число — максимальное число участков, на которые попадет вода, если мы создадим искусственный дождь ровно над одним участком.

C. Петя и файловая система

реализация Структуры данных *1800

Недавно на занятии по программированию маленький Петя показывал, как он умеет быстро создавать файлы и папки на компьютере. Но скоро это занятие ему надоело, и он решил заняться куда более полезным делом: он решил подсчитать, в какой папке больше всего подпапок (включая вложенные папки, папки во вложенных папках, и так далее) и в какой папке больше всего файлов (включая файлы в подпапках).

Более формально, подпапками данной папки являются все папки, лежащие в ней, а так же подпапки всех этих папок. При этом сама данная папка не считается своей подпапкой. Файл считается лежащим в папке тогда и только тогда, когда он либо непосредственно лежит в данной папке, либо лежит в какой-то из подпапок данной папки.

Для лучшего понимания того, как учитываются вложенные папки и вложенные файлы, смотрите пояснения и ответы к примерам.

Дано несколько файлов, которые успел создать Петя. Путь к каждому файлу имеет вид:

diskName:\folder1\folder2\...\foldern\fileName

  • diskName — это одна большая латинская буква из множества {C,D,E,F,G}
  • folder1, ..., foldern — названия папок, при этом каждое из названий папок — непустая последовательность из строчных латинских букв и цифр от 0 до 9. (n ≥ 1)
  • fileName — имя файла в виде name.extension, где name и extension — непустые последовательности из строчных латинских букв и цифр от 0 до 9.

Также известно, что нет файлов, путь к которым имеет вид diskName:\fileName. То есть, каждый файл лежит в какой-то папке, а непосредственно в корне диска файлов нет. То есть мы считаем, что диск не является папкой.

Помогите Пете — найдите наибольшее число подпапок, которое может быть в какой-либо папке, и наибольшее число файлов, которое может быть в какой-либо папке, считая все ее подпапки.

Входные данные

В каждой строке входных данных записано описание одного пути к файлу. Длина каждой из строк не превосходит 100, при этом всего строк не более 100. Гарантируется, что все пути корректны и соответствуют описанным выше правилам. Также, гарантируется, что во входных данных нет двух полностью одинаковых строк, то есть каждый файл описан ровно один раз.

Во входных данных содержится хотя бы один путь.

Выходные данные

Выведите два числа через пробел. Первое — максимальное количество возможных подпапок у папки (включая вложенные папки и папки во вложенных папках) и второе — максимальное количество файлов в папке (включая вложенные файлы во вложенных папках). Заметим, что диски не считаются папками.

Примечание

В первом примере имеем одну папку на диске С. Подпапок у нее нет, поэтому первое число ответа — это 0. Но в этой папке лежит один файл, поэтому второе число ответа — это 1.

Во втором примере у нас есть несколько разных папок. Рассмотрим папку folder1 на диске С. Непосредственно в этой папке находится одна папка: folder2, а в папке folder2, находится еще две папки — folder3 и folder4. Таким образом, у папки folder1 на диске С есть ровно 3 подпапки. Также в этой папке есть два файла, хоть они и не лежат непосредственно в самой папке, но они находятся в подпапках folder1.

В третьем примере, мы имеем, что названия некоторых папок и некоторых подпапок совпадают. Рассмотрим папку file, которая лежит непосредственно на диске С. В этой папке лежит еще одна папка file, в которой в свою очередь лежит еще одна папка file, в которой лежат еще две папки — file и file2. Таким образом, в папке file, лежащей прямо на диске С содержится 4 подпапки.

A. Взаимнопростый массив

жадные алгоритмы математика реализация теория чисел *1200

Вам задан массив из n элементов. Вам нужно превратить его во взаимнопростый массив за наименьшее количество действий.

За одно действие вы можете вставить любое положительное целое число, не превосходящее величины 109, в любое место массива.

Массив называется взаимнопростым, если любая пара соседних чисел взаимнопроста.

В теории чисел два числа a и b называются взаимнопростыми, если единственным положительным делителем обоих чисел является число 1.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 1000) — количество элементов в массиве.

Во второй строке находятся n целых чисел ai (1 ≤ ai ≤ 109) — элементы массива a.

Выходные данные

В первой строке выведите целое число k — наименьшее количество элементов, которые нужно добавить в массив a, чтобы он стал взаимнопростым.

Во второй строке выведите n + k целых чисел aj — элементы массива a после добавления k элементов. Обратите внимание, что этот массив должен быть взаимнопростым, то есть все пары соседних элементов должны быть взаимнопросты. Также новый массив должен быть получен из исходного массива a добавлением ровно k элементов.

Если существует несколько решений, выведите любое.

B. Рассадка в автобусе

реализация *1000

В автобусе 2n рядов сидений. n рядов находятся с левой стороны и n рядов — с правой. В каждом ряду могут сидеть по два человека. Таким образом, общая вместительность автобуса равна 4n.

Рассмотрим рассадку m (m ≤ 4n) пассажиров в автобусе. Пассажиры заходят в автобус по одному и пронумерованы целыми числами от 1 до m (в порядке того как они заходят в автобус). При этом рассадка выглядит следующим образом:

1-й ряд слева у окна, 1-й ряд справа у окна, 2-й ряд слева у окна, 2-й ряд справа у окна, ... , n-й ряд слева у окна, n-й ряд справа у окна.

После того, как все места у окон закончатся (при m > 2n) пассажиры занимают места не у окон:

1-й ряд слева не у окна, 1-й ряд справа не у окна, 2-й ряд слева не у окна, 2-й ряд справа не у окна, ... , n-й ряд слева не у окна, n-й ряд справа не у окна.

Все пассажиры едут в одно место назначения. Пассажиры в конечной точке выходят из автобуса в следующем порядке:

1-й ряд слева не у окна, 1-й ряд слева у окна, 1-й ряд справа не у окна, 1-й ряд справа у окна, ... , n-й ряд слева не у окна, n-й ряд слева у окна, n-й ряд справа не у окна, n-й ряд справа у окна.

Рассадка при n = 9 и m = 36.

Вам заданы значения n и m. Выведите m чисел от 1 до m — порядок в котором пассажиры будут выходить из автобуса.

Входные данные

В единственной строке находится пара целых чисел n и m (1 ≤ n ≤ 100, 1 ≤ m ≤ 4n) — количество пар рядов и количество пассажиров автобуса.

Выходные данные

Выведите m различных целых чисел от 1 до m — порядок в котором пассажиры будут выходить из автобуса.

D. Международная олимпиада

жадные алгоритмы Конструктив математика реализация *2000

Международная олимпиада по сокращениям проходит каждый год, начиная с 1989-го года. Каждый год, когда проходит олимпиада, ей присваивается сокращённое название. Сокращённое название выглядит как IAO'y, где y — это несколько последних цифр текущего года. Организаторы выбирают сокращения таким образом, чтобы они не повторялись. Из всех ещё не использованных сокращений организаторы выбирают самое короткое и присваивают его текущей олимпиаде.

Таким образом, первые три олимпиады (1989, 1990 и 1991 соответственно) получили сокращения IAO'9, IAO'0 и IAO'1, а олимпиада 2015-го года получила сокращение IAO'15, так как IAO'5 уже было использовано в 1995-ом году.

Вам даны n сокращений, определите, в какие годы проходили соответствующие олимпиады.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 1000) — количество сокращений.

Следующие n строк содержат по одному сокращению. Каждое сокращение содержит не более девяти цифр.

Выходные данные

Для каждого сокращения, встречающегося во входных данных, выведите в том же порядке год, в который проходила соответствующая олимпиада.

A. Автобусы между городами

реализация *1600

Между городами A и B ходят автобусы, первый из которых отправляется в 05:00 утра, а последний, не позднее 23:59. Известно, что из города A в город B автобус выезжает каждые a минут, и весь путь у него занимает ta минут, а из города B в A автобусы ходят через каждые b минут, и уже через tb минут достигают города A.

Водитель Симион, чтобы хоть как-то разнообразить свою работу, считает автобусы, которые едут ему на встречу. Автобусы, встреченные в городах A и B, Симион не считает.

Вам известно, когда Симион выехал из города A в город B. Посчитайте количество автобусов, которые встретит Симион, чтобы убедиться в правильности его расчётов.

Входные данные

В первой строке находится пара целых чисел a, ta (1 ≤ a, ta ≤ 120) — частота выезда автобусов из города A в город B и время в пути. Обе величины заданы в минутах.

Во второй строке находится пара целых чисел b, tb (1 ≤ b, tb ≤ 120) — частота выезда автобусов из города B в город A и время в пути. Обе величины заданы в минутах.

В последней строке находится время отправления Симиона из города A в формате hh:mm. Гарантируется, что в это время по графику есть автобус из города A. Обратите внимание, что часы и минуты заданы ровно двумя цифрами.

Выходные данные

Выведите одно целое число z — количество автобусов, которые встретит Симион на своём пути. Обратите внимание, что встречи в городах A и B считать не нужно.

Примечание

В первом примере Симион в 05:20 выезжает из города A и в 05:50 прибывает в B, встретив по пути первые 5 автобусов из B, выехавших в период [05:00 - 05:40]. С автобусом, выехавшим в 05:50 Симион встречается в городе B, поэтому он не учитывается.

Так же, обратите внимание, что первая встреча происходит между 05:26 и 05:27 (если предположить, что автобусы двигаются с постоянной скоростью).

A. Ребляндская лингвистика

дп реализация Строки *1800

В Берляндском Государственном Институте Мира и Дружбы готовят первоклассных специалистов. И вы, как один из самых талантливых людей в Берляндии, обучаетесь именно в нём. Учёба нелегка, ведь от выпускников требуются фундаментальные знания в очень многих зачастую совершенно не связанных друг с другом областях.

Например, среди прочего, вы должны хорошо знать лингвистику. И последние месяцы на этом предмете вы изучаете структуру иностранного для студентов Ребляндского языка. В этом языке слова строятся по следующей схеме. Сначала выбирается корень слова, состоящий не менее чем из пяти букв. Затем к слову приписывается несколько строк длиной 2 или 3 символа. Единственное ограничение — нельзя приписывать одну и ту же строку подряд два или более раз. Все эти строки считаются суффиксами слова (в смысле морфемы, а не последних нескольких символов, как вы, возможно, привыкли).

Одно из упражнений, которое вы встретили в своём задании, выглядит следующим образом. Вам дано слово s, и вам необходимо найти все различные строки длины 2 или 3, которые могли оказаться его суффиксами, учитывая правила построения слов в Ребляндском языке.

Две строки считаются различными, если у них разная длина или существует позиция, в которой в этих строках записаны различные символы.

В задании также разобран следующий пример: дано слово abacabaca. Его возможно получить следующими способами: , где надчеркиваниями обозначен корень слова, а «уголками» — суффиксы. Таким образом, множество возможных суффиксов для этого слова: {aca, ba, ca}.

Входные данные

В единственной строке находится строка s (5 ≤ |s| ≤ 104), состоящая из строчных букв английского алфавита.

Выходные данные

В первой строке выведите целое число k — количество различных возможных суффиксов. В следующих k строках выведите сами суффиксы.

Строки нужно выводить в лексикографическом (алфавитном) порядке.

Примечание

Первый тест разобран выше в основной части условия задачи.

Во втором примере строка имеет длину 5. Так как корень имеет длину не менее 5, то никакая строка не может быть использована в качестве суффикса.

A. Пристрастный учитель

графы дп жадные алгоритмы реализация *1800

По итогам учебного года учитель решил поощрить своих учеников — раздать им немного ирисок. Он попросил n учеников встать в ряд. Так как учитель очень пристрастен, то он руководствуется следующим правилом при раздаче ирисок.

Он смотрит на первых двух учеников и даёт больше ирисок тому из них, у которого выше оценки. Если у этих двух учеников одинаковые оценки, то они получают одинаковое количество ирисок. Процесс раздачи проходит аналогичным образом для любой пары рядом стоящих учеников, начиная с первого и заканчивая последним.

Известно, что каждый ученик получит как минимум одну ириску. Вам следует найти, сколько ирисок учитель даёт каждому ученику, таким образом, чтобы общее количество розданных ирисок было наименьшим.

Входные данные

В первой строке входного файла записано количество учеников n (2 ≤ n ≤ 1000). Во второй строке содержатся (n - 1) знаков, состоящих из "L", "R" и "=". Для каждой пары рядом стоящих учеников "L" означает, что у ученика слева оценки выше, "R" значает, что выше оценки у ученика справа, а "=" означает, что у обоих оценки одинаковые.

Выходные данные

Содержит n целых чисел, записанных через пробел — сколько ирисок получит каждый ученик в очереди, начиная с первого и заканчивая последним.

B. Игра роботов

реализация *1000

Поздним осенним вечером n роботов собрались в весёлой дружеской компании. У каждого робота есть свой уникальный идентификатор — целое число от 1 до 109.

В какой-то момент роботы решили поиграть в игру «Снежный ком». Правила игры следующие: сначала все роботы становятся в ряд, затем первый робот произносит свой идентификатор. После этого второй робот произносит идентификатор первого робота, а затем произносит свой идентификатор. Затем третий робот произносит идентификатор первого робота, затем второго робота, а затем свой. Этот процесс продолжается слева направо до тех пор, пока n-й робот не произнесёт свой идентификатор.

Перед вами стоит задача — определить идентификатор, который будет назван k-м по счёту.

Входные данные

В первой строке входных данных следуют два целых числа n и k (1 ≤ n ≤ 100 000, 1 ≤ k ≤ min(2·109, n·(n + 1) / 2).

Во второй строке записана последовательность id1, id2, ..., idn (1 ≤ idi ≤ 109) — идентификаторы роботов. Гарантируется, что все идентификаторы различны.

Выходные данные

Выведите идентификатор робота, который будет произнесён k-м по счёту (используется нумерация с единицы).

Примечание

В первом тестовом примере идентификаторы роботов будут произнесены в следующем порядке: 1, 1, 2. Так как k = 2, ответ равен 1.

Во втором тестовом примере идентификаторы роботов будут произнесены в следующем порядке: 10, 10, 4, 10, 4, 18, 10, 4, 18, 3. Так как k = 5, ответ равен 4.

C. Поход в кино

реализация сортировки *1300

В Москве проходит крупная международная конференция, на которую приехали n ученых из разных стран. Каждый из ученых говорит ровно на одном языке. Для удобства пронумеруем все языки мира целыми числами от 1 до 109.

Вечером после конференции все n учёных решили сходить в кино. В кинотеатре, в который они пришли, показывают m фильмов. Каждый из фильмов характеризуется двумя различными числами — номером языка озвучивания bi, а также номером языка субтитров ci. Учёный, пришедший на фильм, будет очень доволен, если знает язык озвучивания фильма, будет почти доволен, если знает язык субтитров, и будет совсем недоволен, если не знает ни того, ни другого (обратите внимание, что языки озвучивания и субтитров у каждого фильма всегда различны).

Учёные решили все вместе пойти на один и тот же фильм. Вам предстоит помочь им выбрать такой фильм, при просмотре которого будет максимально возможное количество очень довольных учёных. Если таких фильмов несколько, нужно выбрать из них такой, при просмотре которого будет максимально возможное количество почти довольных учёных.

Входные данные

В первой строке входных данных следует целое положительное число n (1 ≤ n ≤ 200 000) — количество учёных.

Во второй строке следует n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 109), где ai — это номер языка, на котором говорит i-й ученый.

В третьей строке входных данных следует целое положительное число m (1 ≤ m ≤ 200 000) — количество фильмов в кинотеатре.

В четвёртой строке следует m целых положительных чисел b1, b2, ..., bm (1 ≤ bj ≤ 109), где bj — это номер языка озвучивания j-го фильма.

В пятой строке следует m целых положительных чисел c1, c2, ..., cm (1 ≤ cj ≤ 109), где cj — это номер языка субтитров j-го фильма.

Гарантируется, что языки озвучки и субтитров каждого фильма различны, то есть bj ≠ cj.

Выходные данные

Выведите единственное целое число — номер фильма, на который должны пойти учёные. При просмотре этого фильма должно быть максимально возможное количество очень довольных учёных. Если таких фильмов несколько, нужно выбрать из них такой, при просмотре которого будет максимально возможное количество почти довольных учёных.

Если ответов несколько, разрешается вывести любой из них.

Примечание

В первом тестовом примере учёные должны пойти на фильм номер 2, так как в этом случае 1-й и 3-й учёные будут очень довольны, а 2-й учёный будет почти доволен.

Во втором тестовом примере учёные могут пойти либо на фильм номер 1, либо на фильм номер 3. При просмотре любого из этих фильмов ровно два учёных будут очень довольны, а все остальные будут совсем недовольны.

D1. Волшебный порошок - 1

Бинарный поиск Перебор реализация *1400

Эта задача предлагается в двух вариантах, которые отличаются только ограничениями. Если вы можете решить эту задачу в больших ограничениях, то вы можете сразу написать одно решение на оба варианта. Если же решение в больших ограничениях вызывает затруднение, вы можете решить только упрощённый вариант.

Проснувшись с утра, Аполлинария решила испечь печенек. Для того чтобы испечь одну печеньку, нужно n ингредиентов, причем про каждый ингредиент известно число ai — сколько грамм этого ингредиента необходимо для того, чтобы испечь одну печеньку. Для приготовления одной печеньки необходимо использовать все n ингредиентов в нужных пропорциях.

У Аполлинарии есть bi грамм i-го ингридиента. Кроме того, у неё есть k грамм волшебного порошка. Каждый грамм волшебного порошка можно превратить ровно в 1 грамм любого из n ингредиентов и использовать для приготовления печенек.

Перед вами стоит задача — определить максимальное количество печенек, которое сможет испечь Аполлинария при помощи имеющихся у неё ингредиентов и волшебного порошка.

Входные данные

В первой строке следуют два целых положительных числа n и k (1 ≤ n, k ≤ 1000) — количество ингредиентов и количество грамм волшебного порошка.

Во второй строке следует последовательность a1, a2, ..., an (1 ≤ ai ≤ 1000), где i-е число равно количеству грамм i-го ингредиента, необходимых для приготовления одной печеньки.

В третьей строке следует последовательность b1, b2, ..., bn (1 ≤ bi ≤ 1000), где i-е число равно количеству грамм i-го ингредиента, которые есть у Аполлинарии.

Выходные данные

Выведите целое число — максимальное количество печенек, которые сможет испечь Аполлинария при помощи имеющихся у неё ингредиентов и волшебного порошка.

Примечание

В первом тестовом примере Аполлинарии выгодно превратить 1 имеющийся у неё грамм волшебного порошка в ингредиент номер 2, тогда она сможет испечь 4 печеньки.

Во втором тестовом примере Аполлинарии выгодно превратить 1 грамм волшебного порошка в ингредиент номер 1 и 1 грамм волшебного порошка в ингредиент номер 3. Тогда она сможет испечь 3 печеньки. Оставшийся 1 грамм волшебного порошка можно оставить, так как с помощью него ответ увеличить невозможно.

D2. Волшебный порошок - 2

Бинарный поиск реализация *1500

Эта задача предлагается в двух вариантах, которые отличаются только ограничениями. Если вы можете решить эту задачу в больших ограничениях, то вы можете сразу написать одно решение на оба варианта. Если же решение в больших ограничениях вызывает затруднение, вы можете решить только упрощённый вариант.

Проснувшись с утра, Аполлинария решила испечь печенек. Для того чтобы испечь одну печеньку, нужно \(n\) ингредиентов, причем про каждый ингредиент известно число \(a_i\) — сколько грамм этого ингредиента необходимо для того, чтобы испечь одну печеньку. Для приготовления одной печеньки необходимо использовать все \(n\) ингредиентов в нужных пропорциях.

У Аполлинарии есть \(b_i\) грамм \(i\)-го ингридиента. Кроме того, у неё есть \(k\) грамм волшебного порошка. Каждый грамм волшебного порошка можно превратить ровно в \(1\) грамм любого из \(n\) ингредиентов и использовать для приготовления печенек.

Перед вами стоит задача — определить максимальное количество печенек, которое сможет испечь Аполлинария при помощи имеющихся у неё ингредиентов и волшебного порошка.

Входные данные

В первой строке входных данных следуют два целых положительных числа \(n\) и \(k\) (\(1 \le n \le 100\,000, 1 \le k \le 10^9\)) — количество ингредиентов и количество грамм волшебного порошка.

Во второй строке следует последовательность \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)), где \(i\)-е число равно количеству грамм \(i\)-го ингредиента, необходимых для приготовления одной печеньки.

В третьей строке следует последовательность \(b_1, b_2, \dots, b_n\) (\(1 \le b_i \le 10^9\)), где \(i\)-е число равно количеству грамм \(i\)-го ингредиента, которые есть у Аполлинарии.

Выходные данные

Выведите целое число — максимальное количество печенек, которые сможет испечь Аполлинария при помощи волшебного порошка.

Примечание

Первые два примера обращают внимание на более высокие ограничения в сложной версии задачи.

В третьем примере Аполлинарии выгодно превратить \(1\) имеющийся у неё грамм волшебного порошка в ингредиент номер \(2\), тогда она сможет испечь \(4\) печеньки.

Во четвертом примере Аполлинарии выгодно превратить \(1\) грамм волшебного порошка в ингредиент номер \(1\) и \(1\) грамм волшебного порошка в ингредиент номер \(3\). Тогда она сможет испечь \(3\) печеньки. Оставшийся \(1\) грамм волшебного порошка можно оставить, так как с помощью него ответ увеличить невозможно.

A. Мусор на переработку

геометрия дп жадные алгоритмы реализация *1800

Сегодня в Кекляндии отмечают день переработки мусора. Чтобы отпраздновать это событие, Адил и Бера решили пойти в центральный парк подбирать валяющиеся на земле бутылки и доносить их до урны.

Центральный парк можно представить как координатную плоскость. На земле лежат n бутылок, i-я из которых находится в точке с координатами (xi, yi). И Адил, и Бера в каждый момент времени могут держать в руках не более одной бутылки каждый.

Процесс уборки для каждого из них выглядит следующим образом:

  1. Определиться, продолжать ли собирать мусор или остановиться.
  2. Если решено продолжить, то выбрать какую-нибудь ещё лежащую на земле бутылку и дойти до неё.
  3. Подобрать эту бутылку и дойти с ней до урны.
  4. Вернуться к шагу 1.

Адил и Бера могут передвигаться независимо. Они могут носить бутылки одновременно, каждую бутылку может подобрать любой их них, и один из них спокойно может стоять и смотреть, как другой собирает бутылки.

Они хотят так организовать процесс сборки бутылок, чтобы суммарное пройденное расстояние (то есть расстояние, пройденное Адилом, сложенное с расстоянием, пройденным Берой) было минимальным. Разумеется, при этом все бутылки должны оказаться в урне.

Входные данные

В первой строке входных данных записаны шесть целых чисел ax, ay, bx, by, tx и ty (0 ≤ ax, ay, bx, by, tx, ty ≤ 109) — изначальные координаты Адила, Беры и урны соответственно.

Во второй строке записано единственное целое число n (1 ≤ n ≤ 100 000) — количество бутылок, валяющихся на земле.

Далее следуют n строк, каждая из которых содержит два целых числа xi и yi (0 ≤ xi, yi ≤ 109) — координаты i-й бутылки.

Гарантируется, что изначально Адил, Бера, урна и все бутылки находятся в разных точках парка.

Выходные данные

Выведите одно вещественное число — минимальное суммарное расстояние, которое придётся пройти Адилу и Бере, чтобы положить все бутылки в урну. Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6.

А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если .

Примечание

Рассмотрим первый пример.

Путь Адила: .

Путь Беры: .

Длина пути Адила равняется . Длина пути Беры равняется .

A. Летняя школа

реализация *800

Каждый год сотни людей приезжают в летнюю школу, чтобы изучать новые алгоритмы и решать сложные задачи. В этом году вы приехали в летнюю школу в первый раз, и вам поручили решить следующую задачу.

Все целые числа начиная с 1 были выписаны в одну строку «123456789101112131415...». По данному числу n выведите цифру на n-й позиции (используется нумерация с 1).

Входные данные

В единственной строке входных данных записано целое число n (1 ≤ n ≤ 1000) — позиция цифры, которую вам требуется вывести.

Выходные данные

Выведите n-ю цифру получившейся строки.

Примечание

В первом примере на позиции 3 находится цифра «3», поскольку числа 1 и 2 оба состоят из одной цифры.

Во втором примере на позиции 11 находится цифра «0», принадлежащая числу 10.

B. Разнообразие - это хорошо

Конструктив реализация Строки *1000

Однажды умный старец сказал Кариму, что разнообразие — это хорошо, и с тех пор Карим хочет, чтобы всё в его жизни было разнообразным.

Недавно Кариму подарили строку s, состоящую из строчных букв английского алфавита. Поскольку Карим любит разнообразие, то он хочет, чтобы все подстроки строки s были различными. Подстрокой строки s называется некоторое количество последовательных символов данной строки. Например, подстроками строки «aba» являются «» (пустая подстрока), «a», «b», «a», «ab», «ba» и «aba».

Если хотя бы две подстроки строки s совпадают, то Карим меняет символы в некоторых позициях на другие строчные буквы английского алфавита. Менять символы очень утомительно, поэтому Карим хотел бы сделать как можно меньше изменений.

По данной строке s определите минимальное количество изменений, которое потребуется внести в строку, чтобы все её подстроки стали различными, или определите, что это невозможно.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 100 000) — длина строки s.

Во второй строке записана строка s длины n, состоящая из строчных букв английского алфавита.

Выходные данные

Если невозможно изменить строку s так, чтобы все её подстроки были различны, то выведите -1. В противном случае выведите минимальное количество изменений, которое позволит Кариму достичь цели.

Примечание

В первом примере одним из возможных решений будет заменить первый символ строки на «b».

Во втором примере можно заменить первый символ на «a», а второй на «b», получив таким образом строку «abko».

A. Медвежонок и Матч

реализация *800

Медвежонок Лимак любит смотреть спортивные трансляции по телевизору. Сегодня он собирается посмотреть матч, который продлится ровно 90 минут без перерывов.

Каждая минута матча будет либо интересной, либо скучной. Если 15 минут подряд будут скучными, то Лимак немедленно выключит телевизор.

Вам известно, что во время матча интересными будут n минут t1, t2, ..., tn. Вычислите, сколько минут матча посмотрит Лимак.

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 90) — количество интересных минут в матче.

Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ t1 < t2 < ... tn ≤ 90) в порядке возрастания.

Выходные данные

Выведите, сколько минут матча посмотрит Лимак.

Примечание

В первом примере минуты 21, 22, ..., 35 будут скучными, поэтому Лимак выключит телевизор сразу после 35-й минуты матча. Таким образом, он посмотрит матч 35 минут.

Во втором примере скучными будут первые 15 минут.

В третьем примере никакие последовательные 15 минут не будут скучными, поэтому Лимак посмотрит весь матч.

B. Задачи для раунда

жадные алгоритмы реализация *1300

Для очередного раунда Codeforces были подготовлены n задач. Задачи упорядочены по возрастанию сложности, при этом сложности всех задач различны. Дополнительно про некоторые m пар задач известно, что они похожи. Авторы раунда решили поделить задачи между двумя дивизионами согласно следующим правилам:

  • В каждом дивизионе будет предложена хотя бы одна задача.
  • Каждая задача будет использована ровно в одном дивизионе (да, это необычное требование для Codeforces).
  • Любая задача, используемая в первом дивизионе, сложнее любой задачи, используемой во втором дивизионе.
  • Если какие-то две задачи похожи, то они обязательно используются в разных дивизионах.

Посчитайте количество способов разбить задачи на два дивизиона, так чтобы выполнялись все правила. Два способа считаются различными, если существует задача, которая в разных способах будет использована в разных дивизионах.

Обратите внимание, что отношение похожести двух задач не является транзитивным, то есть если задача i похожа на задачу j, а задача j похожа на задачу k, то это не означает, что i похожа на k.

Входные данные

В первой строке входных данных записаны два числа n и m (2 ≤ n ≤ 100 000, 0 ≤ m ≤ 100 000) — количество подготовленных задач и пар похожих задач соответственно.

В каждой из последующих m строк записана пара похожих задач ui, vi (1 ≤ ui, vi ≤ n, ui ≠ vi). Гарантируется, что никакая пара задач не встречается во входных данных дважды.

Выходные данные

Выведите единственное целое число — количество способов разбить задачи на два дивизиона.

Примечание

В первом примере задачи 1 и 2 обязательно будут использованы во втором дивизионе, а задачи 4 и 5 — в первом. Задача 3 может быть использована как в первом, так и во втором дивизионе.

Во втором примере все пары задач являются похожими, поэтому не существует способа разбить задачи на два дивизиона, не нарушая никаких правил.

Третий пример иллюстрирует, что отношение похожести не является транзитивным. Задача 3 похожа на задачу 1 и на задачу 2, но при этом 1 не похожа на 2, и они могут быть использованы для одного дивизиона.

A. Николай и перестановка

Конструктив реализация *800

У Николая есть массив a, состоящий из n различных целых чисел от 1 до n. Другими словами, массив Николая — это перестановка целых чисел от 1 до n.

Николай решил, что будет лучше, если минимальный элемент его массива (то есть число 1) и максимальный элемент его массива (то есть число n) будут находиться как можно дальше друг от друга. Поэтому он решил ровно один раз поменять местами два каких-нибудь элемента таким образом, чтобы расстояние между минимальным и максимальным элементами стало максимально возможным. Расстоянием между двумя элементами называется модуль разности номеров позиций данных элементов.

Входные данные

В первой строке входных данных следует целое положительное число n (2 ≤ n ≤ 100) — количество элементов в массиве Николая.

Во второй строке входных данных записаны различные целые числа a1, a2, ..., an (1 ≤ ai ≤ n), где ai равно элементу, который находится в i-й позиции в массиве Николая.

Выходные данные

Выведите единственное целое число — максимальное расстояние между минимальным и максимальным элементами в массиве Николая, которое может быть получено с помощью ровно одного обмена местами двух элементов массива.

Примечание

В первом примере оптимального ответа можно добиться поменяв местами 1 и 2.

Во втором примере минимальный и максимальный элементы будут находиться в разных концах массива, если поменять местами 7 и 2.

В третьем примере расстояние между минимальным и максимальным элементов уже максимально возможное, поэтому нужно сделать какой-нибудь ничего не значащий обмен, например 5 и 2.

B. Пирамида из бокалов

математика математика реализация *1500

Студентка Мария успешно завершила обучение в престижном вузе и теперь гуляет на выпускном. Студенты много мечтают о красивой жизни, поэтому одногруппники Маши решили соорудить небольшую пирамидку из одинаковых бокалов для шампанского. Получилась пирамида высоты n, такая что на самом верху стоял 1 бокал, на уровне ниже — 2 бокала, ещё ниже — 3 бокала и так далее. В последнем, самом нижнем уровне было ровно n бокалов.

Машин одногруппник Влад вызвался наполнять пирамиду шампанским. Он тысячу раз видел в кино, как эффектно распространяется по бокалам шампанское, перетекая с более высоких этажей на более низкие. Он взял бутылку и начал лить её содержимое в бокал, расположенный на верхнем уровне.

За одну секунду Влад выливает в верхний бокал количество шампанского, равное по объёму в точности одному бокалу. Если бокал полностью наполнен, а в него льётся шампанское, то все излишки поровну распределяются между двумя бокалами, на которых расположен данный. Если переполненный бокал стоит на нижнем уровне, то шампанское просто выливается на стол. В рамках данной задачи будем считать, что шампанское растекается по пирамиде мгновенно. Влада интересует, сколько бокалов будут наполнены до краёв через t секунд, когда бутылка подойдёт к концу.

На рисунках изображены пирамиды, состоящие из трёх уровней.

Входные данные

В единственной строке входных данных записаны два целых числа n и t (1 ≤ n ≤ 10, 0 ≤ t ≤ 10 000) — высота пирамиды и количество единиц времени, через которое бутылка закончится.

Выходные данные

Выведите единственное число — количество наполненных доверху бокалов в пирамиде через t секунд.

Примечание

В первом примере через 5 секунд будет наполнен верхний бокал, два бокала на втором сверху уровне, и средний бокал в нижнем уровне. Два крайних бокала в нижнем уровне будут заполнены наполовину.

D. Тесей и лабиринт

графы кратчайшие пути реализация *2000

Как известно, Тесей отправился на остров Крит, чтобы победить Минотавра. Приплыв на остров, он обнаружил лабиринт, который представляет собой прямоугольное поле размера n × m, состоящее из блоков размера 1 × 1.

В каждом блоке имеется кнопка, разворачивающая все блоки по часовой стрелке на 90 градусов. Каждый блок поворачивается вокруг своего центра, расположение блоков в таблице при этом не меняется. Помимо кнопки, в каждом блоке есть несколько (возможно, 0) дверей. За одну минуту Тесей может либо перейти в соседний по стороне блок, либо нажать кнопку и привести в действие механизм по повороту всех блоков по часовой стрелке на 90 градусов. Из блока A можно перейти в соседний блок B тогда и только тогда, когда у блока A есть дверь, ведущая в блок B, а у блока B есть дверь, ведущая в блок A. Тесей уже обнаружил вход в лабиринт и оказался в блоке (xT, yT), то есть в блоке, расположенном в ряду xT и столбце yT. Тесей слышал, что Минотавр прячется в блоке (xM, yM), и хочет узнать минимальное количество минут, через которое он сможет добраться до чудовища.

Герою не к лицу решать задачи по программированию, поэтому он просит вас помочь ему.

Входные данные

В первой строке входных данных следуют два числа n и m (1 ≤ n, m ≤ 1000) — количество строк и столбцов в лабиринте соответственно.

В каждой из последующих n строк содержится по m символов, описывающих соответствующий ряд лабиринта. Рассмотрим возможные варианты символов:

  • «+» означает, что этот блок имеет 4 двери (в каждый из соседних блоков);
  • «-» означает, что этот блок имеет 2 двери — в соседний слева и соседний справа блок;
  • «|» означает, что этот блок имеет 2 двери — в соседний сверху и снизу блоки;
  • «^» означает, что этот блок имеет 1 дверь — в соседний сверху блок;
  • «>» означает, что этот блок имеет 1 дверь — в соседний справа блок;
  • «<» означает, что этот блок имеет 1 дверь — в соседний слева блок;
  • «v» означает, что этот блок имеет 1 дверь — в соседний снизу блок;
  • «L» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний слева блок;
  • «R» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний справа блок;
  • «U» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний сверху блок;
  • «D» означает, что этот блок имеет 3 двери — отсутствует дверь в соседний снизу блок;
  • «*» означает, что этот блок является стеной и не имеет дверей.

Лево, право, верх и низ определяются из представления лабиринта в виде таблицы, где строки пронумерованы сверху вниз от 1 до n, а столбцы слева направо от 1 до m.

В предпоследней строке содержатся два целых числа — координаты блока (xT, yT) (1 ≤ xT ≤ n, 1 ≤ yT ≤ m), где находится Тесей.

В последней строке содержатся два целых числа — координаты блока (xM, yM) (1 ≤ xM ≤ n, 1 ≤ yM ≤ m), где расположен Минотавр.

Гарантируется, что блок, в котором находится Минотавр (а также блок, в котором находится Тесей), не является блоком-стеной. Блоки, в которых изначально находятся Минотавр и Тесей, могут совпадать.

Выходные данные

Если Тесей не сможет добраться до Минотавра, то выведите -1 в единственной строке выходных данных. В противном случае выведите минимальное количество минут, за которое он сможет это сделать.

Примечание

В момент времени 0 Тесей уже находится в лабиринте в блоке с координатами (xT, yT).

A. Ваня и забор

реализация *800

Ваня с друзьями идёт по запрещенной территории возле забора высотой h. Чтобы охранник их не заметил, высота каждого из друзей не должна превышать h. При этом каждый из них может пригнуться, тогда его точно не будет видно охраннику. Высота i-го из друзей равняется ai.

Будем считать, что ширина человека, идущего в полный рост, равна 1, а согнутого — 2. Друзья хотят идти по дороге в один ряд, чтобы иметь возможность разговаривать друг с другом. Какой минимальной ширины должна быть дорога, чтобы все они поместились на ней в один ряд и охранник никого не увидел?

Входные данные

В первой строке входных данных записаны два целых числа n и h (1 ≤ n ≤ 1000, 1 ≤ h ≤ 1000) — количество друзей и высота забора соответственно.

Во второй строке записаны n целых чисел ai (1 ≤ ai ≤ 2h), i-е из которых равняется высоте i-го друга.

Выходные данные

Выведите единственное целое число — минимальную подходящую ширину дороги.

Примечание

В первом примере пригнуться нужно третьему другу, тогда потребуется ширина дороги 1 + 1 + 2 = 4.

Во втором примере никому не нужно сгибаться и достаточно ширины 1 + 1 + 1 + 1 + 1 + 1 = 6.

В третьем примере пригнуться необходимо всем, кроме друга с номером n, а минимальная ширина дороги равна 2 + 2 + 2 + 2 + 2 + 1 = 11.

B. Ваня и кухонный комбайн

математика реализация *1400

Ваня измельчает картофель в вертикальном кухонном комбайне. В любой момент времени в комбайне помещается количество картофеля высоты не более h, при этом комбайн измельчает k сантиметров картофеля за секунду. Если картофеля в комбайне меньше k сантиметров, то за данную секунду комбайн измельчает весь оставшийся в нём картофель.

У Вани есть n картофелин, высота i-й из которых равна ai. Он поочередно засовывает в комбайн картофелины, начиная с картофелины номер 1 и заканчивая картофелиной номер n. Формально, каждую секунду происходит следующее:

  1. Если у Вани ещё остались картофелины, то он последовательно засовывает их в комбайн, пока там не кончится место.
  2. Комбайн измельчает k сантиметров картофеля (или просто всё, что есть в комбайне).

По имеющейся информации о параметрах комбайна и картофелин вычислите, за какое время весь картофель будет измельчён.

Входные данные

В первой строке входных данных находятся числа n, h и k (1 ≤ n ≤ 100 000, 1 ≤ k ≤ h ≤ 109) — количество картофелин, высота комбайна и количество картофеля, измельчаемое за одну секунду, соответственно.

Во второй строке записаны n целых чисел ai (1 ≤ ai ≤ h) — высоты картофелин.

Выходные данные

Выведите одно целое число — количество секунд, которые потребуются на измельчение всего имеющегося картофеля.

Примечание

Рассмотрим первый пример.

  1. Сначала Ваня засовывает в комбайн картофелину высотой 5. Через одну секунду в комбайне остаётся картофель высотой 2.
  2. Теперь Ваня засовывает картофелину высотой 4, и через секунду там остаётся количество картофеля высоты 3.
  3. Ваня засовывает картофель высотой 3, через секунду там снова столб картофеля высотой 3.
  4. Ваня засовывает картофелины высотой 2 и 1, через секунду опять остаётся количество картофеля высоты 3.
  5. На этой секунде комбайн измельчает весь оставшийся картофель и завершает свою работу.

Во втором примере Ваня засовывает в комбайн картофелину высотой 5 и ждёт две секунды, чтобы она полностью измельчилась. Аналогично для 4 следующих картофелин. Итого потребуется 2·5 = 10 секунд.

В третьем примере Ваня сразу засовывает в комбайн весь имеющийся картофель и ждёт 2 секунды.

C. Ваня и надпись

битмаски Комбинаторика реализация Строки *1500

Ваня шёл по улице и увидел надпись «Hide&Seek». Поскольку Ваня — программист, ему сразу пришла идея воспользоваться операцией & (побитовое И) для этих двух слов в 64-ричной системе счисления (0..9A..Za..z-_) и получить новое слово. Теперь Ваня придумал некоторую строку s и задался вопросом, сколько существует различных пар слов длины |s| (длина строки s), побитовое И которых равно данному слову s? Поскольку ответ может быть очень большим, Ваня просит вас вычислить его по модулю 109 + 7.

Для перевода букв слова в 64-ричную систему счисления Ваня использует следующее соответствие знаков и чисел:

  • цифрам от «0» до «9» соответствуют числа от 0 до 9;
  • буквам от «A» до «Z» соответствуют числа от 10 до 35;
  • буквам от «a» до «z» соответствуют числа от 36 до 61;
  • символу «-» соответствует число 62;
  • символу «_» соответствует число 63.
Входные данные

В единственной строке входных данных записано слово s (1 ≤ |s| ≤ 100 000), состоящее только из цифр, больших и маленьких букв английского алфавита, символов «-» и «_».

Выходные данные

Выведите единственное целое число — количество возможных пар слов, побитовое И которых равняется строке s, по модулю 109 + 7.

Примечание

Для подробного описания функции побитовое И можно посмотреть соответствующую статью в Википедии.

В первом примере возможны 3 варианта:

  1. z&_ = 61&63 = 61 = z
  2. _&z = 63&61 = 61 = z
  3. z&z = 61&61 = 61 = z

E. Ваня и шарики

Бинарный поиск дп Перебор реализация *2300

Ваня играет в игру, в которой на поле размером n × n в каждой клетке находится шарик со значением 0, 1, 2 или 3. Требуется за один ход уничтожить крест из шариков, такой что произведение значений составляющих его шариков максимально. Кресты из шариков могут быть обычные и повёрнутые. Например:


**o**
**o**
ooooo
**o**
**o**

или


o***o
*o*o*
**o**
*o*o*
o***o

Формально, крест задаётся тремя целыми числами r, c и d, такими что d ≤ r, c ≤ n - d + 1. При этом обычный крест состоит из шариков с координатами (x, y) (здесь x означает номер строки, а y — столбца), такими что выполнено |x - r|·|y - c| = 0 и |x - r| + |y - c| < d. Повёрнутый крест состоит из шариков с координатами (x, y), такими что |x - r| = |y - c| и |x - r| < d.

Ваня хочет узнать максимально возможное произведение значений шариков, образующих один крест. Поскольку ответ может быть слишком большим, Ваня хочет знать это число по модулю 109 + 7.

Входные данные

В первой строке входных данных находится число n (1 ≤ n ≤ 1000) — размерность таблицы с шариками.

В каждой из следующих n строк записано n символов «0», «1», «2» или «3», описывающих значения, записанные в шариках.

Выходные данные

Выведите самое большое возможное произведение по модулю 109 + 7. Обратите внимание, что требуется не максимизировать остаток от деления, а найти максимальное число и вывести его по модулю 109 + 7.

Примечание

В первом примере максимальное произведение достигается на повёрнутом кресте с центром в точке (3, 3) и радиусом 1: 2·2·3·3·3 = 108.

A. Вася любит числа

математика реализация *800

Вася очень любит числа n и k. Сейчас Вася хочет найти наименьшее целое число x большее n такое, что x делится нацело на число k.

Входные данные

В единственной строке находится пара целых чисел n и k (1 ≤ n, k ≤ 109).

Выходные данные

Выведите наименьшее целое число x > n, делящееся на число k.

B. Такой же календарь

реализация *1600

У девочки Маши есть очень красивый календарь y-го года. В календаре отмечены все дни вместе со своими днями недели: понедельник, вторник, среда, четверг, пятница, суббота и воскресенье.

Календарь настолько красивый, что теперь Маша хочет узнать следующий после y-го год, когда календарь будет точно таким же. Помогите ей найти этот год.

Обратите внимание, что високосные годы содержат 366 дней. Год считается високосным, если он делится на 400, либо он делится на 4 и при этом не делится на 100 (https://ru.wikipedia.org/wiki/Високосный_год).

Входные данные

В единственной строке находится целое число y (1000 ≤ y < 100'000) — номер года календаря.

Выходные данные

Выведите одно целое число y' — следующий после y-го год, когда календарь будет точно таким же. Обратите внимание, что вам нужно найти первый после y-го год с совпадающим календарём.

Примечание

Сегодня 13-е июня 2016-го года, понедельник.

C. Мила и шоколад

математика реализация теория чисел *1600

Маленькой Миле дали задачу. У неё есть n досок, пронумерованных целыми числами от 1 до n. Она должна покрасить их странным образом.

Непокрашенная доска может быть покрашены в красный цвет, если её номер делится на число a, а также может быть покрашена в синий цвет, если её номер делится на число b. Таким образом, доска номер которой делится на a и на b может быть покрашена как в красный, так и в синий цвет.

После покраски она получит p шоколадок за каждую доску красного цвета и q шоколадок за каждую доску синего цвета.

Обратите внимание, что она может красить доски в любом порядке.

Помогите Миле найти наибольшее количество шоколадок, которые она может получить.

Входные данные

Единственная строка содержит пять целых чисел n, a, b, p и q (1 ≤ n, a, b, p, q ≤ 109).

Выходные данные

Выведите одно целое число s — наибольшее количество шоколадок, которые может получить Мила.

Обратите внимание, что ответ может не поместиться в 32-битном типе данных. Для сохранения числа вы можете использовать, например, тип long long в языке C++ или тип long в языке Java.

C. Медвежонок и клетчатое поле

поиск в глубину и подобное реализация снм *2400

Вам дано клетчатое поле из n строк и n столбцов. Каждая клетка либо пуста (обозначается символом «.»), либо занята (обозначается символом «X»).

Две пустые клетки соединены напрямую, если у них есть общая сторона. Две клетки (r1, c1) (то есть клетка, расположенная в ряду r1 и столбце c1) и (r2, c2) соединены путём, если существует последовательность пустых клеток, начинающаяся с (r1, c1) и заканчивающаяся на (r2, c2), такая что любые две соседние клетки последовательности соединены напрямую. Компонентой связности называется множество пустых клеток, такое что любые две клетки множества соединены путём, и при этом никакая клетка множества не соединена путём ни с какой пустой клеткой не из этого множества.

Ваш друг Лимак — большой медведь гризли, способный разрушать препятствия в некоторой области. Точнее, вы можете попросить Лимака разрушить все препятствия в некотором квадрате k × k, то есть превратить все занятые клетки в свободные. Однако попросить помощи у Лимака можно только один раз.

Выбранный квадрат должен находиться строго внутри сетки. Возможно, что все клетки уже пусты и помощь Лимака вам никак не поможет.

Вы любите большие компоненты связности. Какую самую большую компоненту связности можно получить, попросив Лимака о помощи не более одного раза?

Входные данные

В первой строке входных данных записаны два целых числа n и k (1 ≤ k ≤ n ≤ 500) — размер сетки и размер помощи Лимака соответственно.

В каждой из последующих n строк записаны n символов, определяющих i-ю строку поля. Каждый символ — это либо «.», либо «X», обозначающие соответственно пустую или занятую клетку.

Выходные данные

Выведите максимально возможный размер (количество клеток) одной компоненты связности после помощи Лимака.

Примечание

В первом примере Лимак может сделать пустыми все клетки в каком-нибудь квадрате размером 2 × 2. Оптимальный способ выбрать квадрат показан красным на левом рисунке ниже. Таким образом, можно получить компоненту связности размером 10 клеток, отмеченную синим на правом рисунке ниже.

D. Медведь и преследование

графы математика Перебор поиск в глубину и подобное реализация Теория вероятностей *2900

В Беарляндии n городов, пронумерованных целыми числами от 1 до n. Они соединены m двунаправленными дорогами. Дорога номер i соединяет два различных города ai и bi, и никакие две дороги не соединяют одну и ту же пару городов. От любого города можно добраться до любого другого, используя только данные дороги.

Расстоянием между городами a и b называется минимальное количество дорог, которыми придётся воспользоваться, чтобы попасть из a в b.

Лимак — медведь гризли. Он преступник, и ваша задача его поймать, или, по крайней мере, попытаться. У вас осталось только два дня (сегодня и завтра), а затем он улизнёт навсегда.

Ваше главное оружие — БВД (Беарляндский Высокоточный Детектор). Когда вы используете БВД, находясь при этом в каком-нибудь городе, он сообщает вам расстояние между городом, где вы находитесь, и городом, где сейчас находится Лимак. К сожалению, БВД может быть использован только один раз в день.

Вам мало что известно о местоположении Лимака, поэтому вы предполагаете, что он находится в одном из n городов страны, выбранном случайно и с равной вероятностью (то есть Лимак изначально находится в каждом городе с вероятностью ). Вы разработали следующий план:

  1. Выбрать один из городов и применить там БВД.
    • Сразу после применения БВД можно попытаться поймать Лимака (но это может быть плохой идеей). В этом случае вы выбираете какой-то город и ищете Лимака там. Если Лимак действительно в этом городе, то вы выигрываете, в противном случае Лимак становится осторожнее, и его уже никогда не поймать (вы проигрываете).
  2. Подождать 24 часа и снова применить БВД. Вы знаете, что за это время Лимак обязательно изменит своё местоположение, а именно, он выберет случайно и равновероятно одну дорогу ведущую из его текущего города и пройдёт по ней в соседний город.
  3. На следующий день вы можете снова выбрать любой город и применить БВД там.
  4. Теперь уже обязательно попробовать поймать Лимака. Для этого вы выбираете какой-то город и ищете в нём Лимака. Если он там, то вы побеждаете, если нет — проигрываете.

Каждый раз, когда вам требуется выбрать город, вы можете выбирать любой из n городов, то есть мгновенное перемещение не является для вас проблемой.

Чему равна вероятность поймать Лимака, если вы будете действовать оптимально?

Входные данные

В первой строке входных данных записаны два числа n и m (2 ≤ n ≤ 400, ) — количество городов и количество дорог соответственно.

Затем следуют m строк, описывающих дороги. В i-й из этих строк записаны два числа ai и bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — номера городов, соединённых i-й дорогой.

Гарантируется, что никакая пара городов не соединена более чем одной дорогой и что от любого города можно добраться до любого другого, используя только данные дороги.

Выходные данные

Выведите одно вещественное число — вероятность обнаружить Лимака, если действовать оптимально. Ваш ответ будет считаться правильным, если его абсолютная ошибка не будет превосходить 10 - 6.

А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если |a - b| ≤ 10 - 6.

Примечание

В первом примере Беарляндия состоит из трёх городов, и между каждой парой этих городов есть дорога. Рассмотрим один из оптимальных сценариев.

  1. Использовать БВД в городе 1.
    • С вероятностью Лимак окажется в этом городе, и БВД выдаст расстояние 0. В таком случае нужно сразу хватать Лимака — мы точно не ошибёмся.
    • С вероятностью расстояние равно 1, потому что Лимак находится в городе 2 или городе 3. В этом случае оптимально будет дождаться следующего дня.
  2. Вы ждёте, а Лимак переходит в соседний город.
    • С вероятностью Лимак находился в городе 2 и перешёл в город 3.
    • он перешёл из 2 в 1.
    • он перешёл из 3 в 2.
    • он перешёл из 3 в 1.
  3. Снова использовать БВД в городе 1 (хотя разрешено сделать это и в любом другом городе).
    • Если расстояние 0, то Лимак находится в городе 1 (вы побеждаете).
    • Если расстояние 1, то Лимак либо в городе 2, либо в городе 3. Тогда попробуем поискать его в городе 2 (или 3, не имеет значения).

Пользуясь такой стратегией, вы проиграете, только если Лимак был изначально в городе 2 и перешёл в город 3. Вероятность проигрыша равна . Ответ равен .

A. Иррациональная задача

реализация теория чисел *1100

Маленькому Пете задали в качестве домашнего задания следующую задачу:

Дана функция ( обозначает операцию взятия остатка по модулю). Требуется посчитать количество целых чисел x из промежутка [a;b] таких, что f(x) = x.

К сожалению, Петя забыл, в каком порядке должны браться остатки, а просто записал 4 числа. С равной вероятностью может оказаться, что брать остатки для вычисления функции нужно в любом из 24 возможных порядков. К примеру, если у Пети есть числа 1, 2, 3, 4, то он может брать остатки именно в таком порядке, а может сначала брать остаток по модулю 4, затем по модулям 2, 3, 1. Также существует 22 других перестановки этих чисел, в порядке которых могут браться остатки. В этой задаче 4 числа, записанных Петей, будут попарно различны.

Теперь Петя уже не может выполнить задачу так, как от него требовал учитель, но ради развлечения он решил найти количество таких целых чисел , что вероятность того, что для них f(x) = x, не меньше чем 31.4159265352718281828459045%. Иными словами, Пете подойдут те числа x, для которых существует не менее 7 таких перестановок чисел p1, p2, p3, p4, что f(x) = x.

Входные данные

В первой строке входного файла находятся 6 целых чисел, разделенных пробелами: p1, p2, p3, p4, a, b (1 ≤ p1, p2, p3, p4 ≤ 1000, 0 ≤ a ≤ b ≤ 31415).

Гарантируется, что числа p1, p2, p3, p4 будут попарно различны.

Выходные данные

Выведите количество целых чисел из заданного интервала, удовлетворяющих заданным условиям.

A. Медвежонок и пять карт

Конструктив реализация *800

Маленький медвежонок Лимак любит играть в игры. Сейчас у него есть пять карт. На каждой карте написано одно целое число. Лимак может сделать ровно один ход, сбросив некоторые карты. Его цель — минимизировать сумму чисел на оставшихся у него в руках картах.

За этот единственный ход Лимак может сбросить две или три карты, на которых написаны одинаковые числа. Разумеется, если у него нет двух или трёх карт с одинаковыми числами, то он не делает никакого хода.

Вам даны значения на всех пяти картах, которые есть у Лимака. Какую минимальную сумму чисел на оставшихся картах он может получить, сделав не более одного хода?

Входные данные

В первой строке входных данных даны пять целых чисел t1, t2, t3, t4 и t5 (1 ≤ ti ≤ 100) — значения, написанные на картах.

Выходные данные

Выведите минимальную возможную сумму чисел на оставшихся картах после не более чем одного хода Лимака.

Примечание

В первом примере у Лимака есть карты с числами 7, 3, 7, 3 и 20. Возможны следующие варианты:

  • Ничего не делать, тогда на руках останутся карты с суммой 7 + 3 + 7 + 3 + 20 = 40.
  • Сбросить две карты с числом 7. Оставшиеся карты дают сумму 3 + 3 + 20 = 26.
  • Сбросить две карты с числом 3. Останется 7 + 7 + 20 = 34.

Поскольку требуется минимизировать сумму на оставшихся картах, то ответ 26.

Во втором примере не существует двух или трёх карт с одинаковыми числами, поэтому Лимак не делает ничего, и ответ 7 + 9 + 1 + 3 + 8 = 28.

В третьем примере на всех картах написаны одинаковые числа. Оптимальным ответом будет сбросить три любые карты. Две оставшиеся дадут сумму 10 + 10 = 20.

B. Медвежонок и поиск преступников

Конструктив реализация *1000

В Беарляндии n городов, пронумерованных целыми числами от 1 до n. Города расположены на одной длинной прямой. Расстояние между городами i и j равняется |i - j|.

Лимак живёт в городе a и работает в полиции. Он занимается поимкой преступников, а это достаточно сложно сделать, когда не знаешь, где преступники спрятались. Достоверно известно, что в каждом городе находится не более одного преступника.

Лимак собирается применить БВД (Беарляндский Высокоточный Детектор), который для каждого расстояния d определит, сколько преступников находится на расстоянии d от города a. После этого Лимак может поймать преступников в тех городах, про которые он точно уверен, что в них прячутся преступники.

Вам известно расположение преступников, определите, скольких из них поймает Лимак, используя БВД.

Входные данные

В первой строке входных данных записаны два числа n и a (1 ≤ a ≤ n ≤ 100) — количество городов в Беарляндии и номер города, в котором живёт Лимак, соответственно.

Во второй строке находятся n целых чисел t1, t2, ..., tn (0 ≤ ti ≤ 1), i-е из которых означает, что в городе i прячутся ti преступников.

Выходные данные

Выведите количество преступников, которых поймает Лимак.

Примечание

В первом примере имеется шесть городов, и Лимак живёт в третьем из них (синяя стрелочка на рисунке). Преступники отмечены красным.

Используя БВД Лимак получит следующую информацию:

  • Один преступник находится на расстоянии 0 от третьего города — Лимак может быть уверен, что преступник находится в городе 3.
  • Один преступник находится на расстоянии 1 от третьего города — Лимак не знает, находится ли он в городе 2 или в городе 4.
  • На расстоянии 2 от третьего города находятся 2 преступника — Лимак точно знает, что один преступник находится в городе 1 и один преступник в городе 5.
  • На больших расстояниях преступников нет.

Таким образом, Лимак поймает преступников в городах 1, 3 и 5, то есть ответ 3.

Во втором примере (рисунок ниже), БВД даёт Лимаку информацию, что один преступник находится на расстоянии 2 от города Лимака. Поскольку есть только один город на расстоянии 2, то Лимак точно знает, что там находится преступник.

A. Хороший контест

реализация *800

На Codeforces цвет хэндла пользователя зависит от рейтинга: красный — с 2400 единиц, оранжевый — с 2200 и так далее. После каждого рейтингового контеста у каждого из участников рейтинг меняется в зависимости от того, насколько хорошо он выступил.

Антон хочет, чтобы его хэндл был красного цвета, поэтому он считает, что написал контест хорошо, если он обогнал участника, цвет хэндла которого до соревнования был красным и чей рейтинг после соревнования увеличился (то есть изменился на положительную величину).

Чтобы не просматривать результаты вручную, Антон написал программу, которая по изменениям рейтинга участников, которых он обогнал, определяет, хорошо ли он написал контест. А вы сможете?

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 100) — количество участников, которых обогнал Антон.

В следующих n строках приводятся результаты выступления этих участников. В i-й из этих строк содержится хэндл участника namei и два целых числа beforei, afteri ( - 4000 ≤ beforei, afteri ≤ 4000) — рейтинг этого участника до контеста и его рейтинг после контеста соответственно. Хэндл каждого участника является непустой строкой, состоящей из не более чем 10 символов, каждый из которых является строчной или заглавной буквой английского алфавита, цифрой, символом «_» или «-».

Гарантируется, что все хэндлы различны.

Выходные данные

Выведите «YES» (без кавычек), если Антон написал контест хорошо, и «NO» (без кавычек) в противном случае.

Примечание

В первом примере Антон обогнал пользователя Burunduk1, хэндл которого был красным до соревнования и чей рейтинг после контеста увеличился.

Во втором примере у Applejack не увеличился рейтинг после соревнования, а хэндлы Fluttershy и Pinkie_Pie не были красными до него.

D. Кай и вечность

Перебор реализация сортировки *2600

Снежная королева, уходя, дала Каю задание выложить из льдинок слово «вечность». Кай очень серьёзно взялся за задание, поскольку если Кай сумеет это сделать, то он станет сам себе господин, и ему подарят весь мир и пару коньков.

Под дворцом Снежной королевы расположено бесконечное клеточное поле. На нём хаотично разбросаны n льдинок, причём каждая льдинка лежит в центре ячейки клеточного поля и никакие две льдинки не лежат в одной ячейке. Для оценки сложности задания Кай смотрит на некоторые квадраты размера k × k с углами, лежащими в узлах поля, и сторонами, параллельными осям координат, и считает количество льдинок внутри квадрата.

Однако так Кай смотрит только на сложность какого-то фрагмента поля. Для того чтобы правильно оценить сложность всего поля в целом, Кай придумал такой критерий: для каждого x (1 ≤ x ≤ n) он хочет узнать количество квадратов k × k с углами, лежащими в узлах поля, и сторонами, параллельными осям координат, в которых содержится ровно x льдинок.

Помогите Каю оценить сложность задания, полученного от Снежной королевы.

Входные данные

В первой строке вводятся числа n и k (1 ≤ n ≤ 100 000, 1 ≤ k ≤ 300) — количество льдинок и параметр k соответственно. В следующих n строках вводятся по два целых числа xi и yi ( - 109 ≤ xi, yi ≤ 109) — координаты ячеек, в которых лежат льдинки. Гарантируется, что никакие две льдинки не лежат в одной ячейке.

Выходные данные

Выведите n чисел: количество квадратов k × k, содержащих ровно 1, 2, ..., n льдинок соответственно.

A. Раздача мороженого

Конструктив реализация *800

После приключения с зеркалом Кай и Герда поселились снова у себя и теперь раздают летом детям мороженое.

С утра у них есть x пачек мороженого. Так как Кай и Герда раздают мороженое бесплатно, очередь к ним выстраивается ещё ночью. Каждый человек в очереди либо хочет взять несколько пачек мороженого для себя и друзей, либо дать Каю и Герде несколько пачек мороженого (грузчикам, которые привозят мороженое, приходится стоять в той же очереди).

Если к их домику подходит грузчик, несущий d пачек мороженого, Кай с Гердой забирают всё мороженое, которое он несёт. Если же к ним подходит ребёнок, который хочет взять d пачек мороженого, то Кай с Гердой дают ему d пачек, если у них хватает мороженого, в противном случае ребенок не забирает ни одной пачки и уходит грустный.

Каю хочется посчитать, сколько мороженого у них останется после того, как очередь опустеет, а Герде хочется узнать количество грустных детей после раздачи.

Входные данные

Первая строка содержит целые числа n и x, разделенные пробелом (1 ≤ n ≤ 1000, 0 ≤ x ≤ 109).

Следующие n строк содержат символ «+» или «-» и число di, разделённые пробелом (1 ≤ di ≤ 109). При этом запись «+ di» в i-й строке означает, что на i-м с начала очереди месте стоит грузчик, несущий di пачек мороженого, а запись «- di» означает, что там стоит ребёнок, который хочет взять di пачек мороженого.

Выходные данные

Выведите через пробел два числа — количество пачек мороженого, которое останется после выполнения всех операций, и количество детей, ушедших от раздачи грустными.

Примечание

Рассмотрим первый пример.

  1. Изначально у Кая и Герды есть 7 пачек мороженого.
  2. Грузчик приносит им ещё 5 пачек, их становится 12.
  3. Приходит ребёнок и просит 10 пачек мороженого. Ему дают 10 пачек и их остаётся 2.
  4. Приходит ребёнок и просит 20 пачек мороженого. Столько у Кая и Герды нет, поэтому ребёнок уходит грустным.
  5. Грузчик приносит 40 пачек мороженого, их становится 42.
  6. Приходит ребёнок, и забирает 20 пачек мороженого, их остаётся 22.

B. Зверинец маленькой разбойницы

Конструктив реализация сортировки *1100

Неугомонная маленькая разбойница любит наблюдать за испугом животных в своём зверинце. Однажды ей вздумалось выстроить их по неубыванию роста. Когда она им приказала выстроиться, они настолько перепугались, что сделали это неправильно.

Маленькая разбойница рассердилась было, но ей вдруг пришла в голову странная затея. Она решила попробовать сама расставить зверей как надо. Для этого она иногда называет числа l и r, такие что число r - l + 1 чётно. После этого все звери, стоящие на позициях с l по r включительно, меняются местами: зверь на позиции l меняется со зверем на позиции l + 1, зверь на позиции l + 2 меняется со зверем l + 3, ..., наконец, зверь на позиции r - 1 меняется со зверем r.

Помогите маленькой разбойнице расставить всех животных в порядке неубывания роста. Вам нужно назвать не более 20 000 отрезков, так как после совершения слишком большого количества операций маленькой разбойнице надоест, и она начнёт снова пугать зверей.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100) — количество зверей у маленькой разбойницы.

В второй строке через пробел записано n чисел a1, ..., an (1 ≤ ai ≤ 109), где ai — высота зверя, изначально стоящего на i-м месте.

Выходные данные

Выведите последовательность действий, которая расположит зверей в порядке неубывания роста.

В ответе должно быть записано несколько строк, i-ая из которых должна содержать два числа li и ri через пробел (1 ≤ li < ri ≤ n) — описания отрезков, которые должна называть маленькая разбойница. Отрезки должны быть записаны в порядке применения операций.

Количество операций не должно превышать 20 000.

Если звери стоят в порядке неубывания роста изначально, разрешается не выводить ничего.

Примечание

Обратите внимание, что не требуется минимизировать число совершённых операций. Достаточно, чтобы их было не больше 20 000.

A. Враги в школе

реализация *800

У Ария в школе есть n врагов. Каждый день он дерётся со всеми своими врагами, которые пришли в школу в этот день. У врагов Ария есть коварный план, благодаря которому они всегда могут одержать над ним победу, но чтобы этим планом воспользоваться, они должны собраться все вместе. Это значит, что если хотя бы один из врагов не придёт в конкретный день в школу, то Арий побьёт всех присутствующих врагов, в противном случае они одержат верх на Арием.

Про каждого из своих врагов Арий знает его расписание — придёт он в школу или нет в каждый конкретный день. Вычислите максимальное количество последовательных дней, в течение которых Арий будет побеждать свои врагов.

Обратите внимание, что если в какой-то день никто из врагов не пришёл, Арий всё же считает, что он победил всех присутствующих врагов.

Входные данные

В первой строке входных данных записаны два числа n и d (1 ≤ n, d ≤ 100) — количество врагов и количество дней соответственно.

В i-й из последующих d строк находится строка длины n, состоящая из символов «0» и «1». В j-й позиции строки записан символ «0», если враг номер j будет отсутствовать в день номер i.

Выходные данные

Выведите единственное целое число — максимальное количество последовательных дней, в течение которых Арий будет побеждать своих врагов.

Примечание

В первом и втором примерах Арий побеждает своих врагов в каждый из d дней.

В третьем примере Арий побеждает врагов в дни 1, 3 и 4, а враги, соответственно, побеждают в дни 2 и 5. Таким образом, максимальное количество победных для Ария дней подряд равняется 2, это дни 3 и 4.

A. Майк и телефон

Конструктив Перебор реализация *1400

Купаясь на пляже, Майк случайно уронил свой телефон в воду. Сильно не беспокоясь, Майк купил дешевый телефон с кнопочной клавиатурой в качестве замены. Клавиатура состоит из десяти цифровых кнопок одинакового размера, расположенных привычным образом:

Вместе со старым телефоном Майк потерял и весь список контактов, и теперь он может вспомнить только как двигались его пальцы при наборе того или иного номера. Формально, движениями пальцев следует считать последовательность векторов, соединяющих центры кнопок, последовательно нажимаемых в процессе набора номера. К примеру, движения пальцев для номеров "586" и "253" совпадают:

Майк уже успел набрать номер по "памяти пальцев" и начать вызов, поэтому ему очень важно знать, может ли он быть уверен в том, что звонит по правильному номеру? Другими словами, существует ли какой-нибудь номер отличный от данного, с такими же движениями пальцев?

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 9) — количество цифр в номере, который Майк уже успел набрать.

Во второй строке содержится сам номер, состоящий из n цифр от «0» до «9».

Выходные данные

Если другого номера, соответствующего движениям пальцев Майка для набранного им номера, не существует и он может быть уверен в правильности номера, выведите «YES» (без кавычек).

В противном случае, в первой строке выведите «NO» (без кавычек).

Примечание

В качестве пояснения к первому примеру входных данных используйте картинки из условия выше.

E. Майк и геометрическая задача

геометрия дп Комбинаторика реализация Структуры данных *2000

Майк готовится к IMO, но плохо знаком с геометрией, поэтому его учитель дал ему занимательную геометрическую задачу. Пусть f([l, r]) = r - l + 1 — число целых точек в отрезке [l, r] (l ≤ r) (считаем, что ). Даны два числа n и k и n отрезков [li, ri] на оси Ox, и требуется посчитать

Другими словами, требуется посчитать сумму количеств целых точек в каждом из возможных пересечений любых k отрезков.

Так как искомое значение может быть очень большим, выведите его остаток от деления на 1000000007 (109 + 7).

Майк затрудняется решить эту задачу и нуждается в вашей помощи. Вы же не откажете ему в этом, не так ли?

Входные данные

В первой строке содержатся два целых числа n и k (1 ≤ k ≤ n ≤ 200 000) — количество отрезков и количество отрезков в рассматриваемых группах пересечений.

Затем следуют n строк, i-я из которых содержит два целых числа li, ri ( - 109 ≤ li ≤ ri ≤ 109), описывающих i-й отрезок.

Выходные данные

В единственной строке выведите одно целое число — ответ на задачу Майка по модулю 1000000007 (109 + 7).

A. Юный физик

математика реализация *1000

В одной школе в 11 классе учится мальчик Вася. Как-то раз Вася решил посмотреть матч своей любимой хоккейной команды. А поскольку мальчик очень любит хоккей, даже больше, чем физику, он забыл сделать уроки. В частности, забыл сделать задачки по физике. На следующий день учитель очень разозлился на Васю, и решил его проучить. Он дал нерадивому ученику, казалось бы, простую задачку: дано покоящееся тело в пространстве, и даны силы, действующие на него. Тело можно считать материальной точкой с координатами (0; 0; 0). Васе нужно было ответить, находится ли оно в равновесии. «Ерунда!» — подумал Вася, нужно лишь проверить, что сумма всех векторов равна 0, и принялся решать задачу. Но впоследствии оказалось, что этих сил может быть очень-очень много, и Вася не справится без вашей помощи. Помогите ему. Напишите программу, которая определяет по заданным векторам сил, покоится тело или движется.

Входные данные

В первой строке задано натуральное число n (1 ≤ n ≤ 100), далее следует n строк по три целых числа в каждой: координата xi, координата yi и координата zi вектора силы, приложенной к телу ( - 100 ≤ xi, yi, zi ≤ 100).

Выходные данные

Выведите слово "YES" если тело находится в равновесии, или слово "NO" если не находится.

B. Ставки

жадные алгоритмы реализация *1200

В Челябинске живет очень уважаемый бизнесмен Никита со странным прозвищем "БОСС". Как-то раз Никита решил съездить с его другом Алексеем на чемпионат мира по летнему биатлону. Никита, как особо важная персона, получил жетон, позволяющий ставить на каждом участке не более чем на одного спортсмена.

Для начала друзья узнали правила: в гонке n участков равной длины и m участников. Участники пронумерованы от 1 до m. Про каждого участника известно:

  • li — номер участка, с которого биатлонист начинает бежать,
  • ri — номер участка, на котором биатлонист заканчивает бежать,
  • ti — время, которое требуется биатлонисту чтобы преодолеть один участок пути,
  • ci — прибыль в рублях, которую получит поставивший на него человек, в случае победы i-ого спортсмена на одном из участков.

i-ый биатлонист проезжает участки с li по ri включительно. Весь путь участник пробегает за (ri - li + 1)·ti единиц времени. Одну секцию участник пробегает ровно за ti единиц времени. В случае победы спортсмена на k участках поставивший на него получит k·ci рублей.

На каждом участке победитель определяется независимо следующим образом: если есть хотя бы один биатлонист, бегущий данный участок, то из всех них победителем является тот, кто пробежал этот участок за минимальное время (преодолел участок за меньшее время, чем другие). В случае равенства времени побеждает спортсмен с меньшим порядковым номером. Если же участников этапа нет, то победитель на этом этапе неопределен. Стоит добавить, что в летнем биатлоне все участники движутся с постоянной скоростью.

Также стоит добавить, что Никита может ставить на каждом участке на любого участника, бегущего данный участок.

Помогите друзьям определить максимальную возможную прибыль.

Входные данные

В первой строке находится два целых числа n и m (1 ≤ n, m ≤ 100). Далее следуют m строк, в каждой из которых записано 4 целых числа li, ri, ti, ci (1 ≤ li ≤ ri ≤ n, 1 ≤ ti, ci ≤ 1000).

Выходные данные

Выведите одно целое число — максимальную прибыль в рублях, которую могут получить друзья. На каждом из n участков разрешается поставить деньги не более чем на одного спортсмена.

Примечание

В первом тесте оптимально ставить: на 1-2 участках на 1 биатлониста, на 3 участке на 3 биатлониста, на 4 участке на 4 биатлониста. Итого: прибыль 5 рублей за 1 участок,прибыль 5 рублей за 2 участок, прибыль 30 рублей за 3 участок, прибыль 20 рублей за 4 участок. Суммарная прибыль 60 рублей.

Во втором тесте оптимально ставить: на 1 и 5 участках на 1 биатлониста, на 2-4 участке на 2 биатлониста, на 6-7 участках на 4 спортсмена. На 8 участке нет победителя. На 1 участке прибыль 10 рублей, на 2,3,4 по 15 рублей, на 5 участке прибыль 10 рублей, на 6,7 участках прибыль 20 рублей. Суммарная прибыль 105 рублей.

C. Игра

реализация *2000

В одной школе с Васей учится мальчик Костя. Костя не любит физику, он любит разные онлайн игры. Каждый день, приходя домой, Костя бросает свою сумку в самый дальний угол и садится за свой любимый компьютер. Костя даже ест не отрываясь от игры. На днях Костик купил новую RPG игру «ЗайцButtle», которая отличается от всех своих конкурентов в этом жанре огромным количеством артефактов. Как известно, артефакты делятся на базовые и составные. В продаже доступны только базовые артефакты. Более мощные составные артефакты собираются из некоторого количества базовых артефактов.

После сборки составного артефакта, все его компоненты изчезают.

Костя является главой альянса, поэтому он обязательно должен помнить, какие артефакты есть не только у него, но и у его союзников. Вы должны определить по последовательности купленных Костей и его союзниками артефактов, сколько и каких артефактов собрал каждый из них. Считается, что изначально ни у кого нет артефактов.

Входные данные

В первой строке находится 4 натуральных числа: k (1 ≤ k ≤ 100) — количество союзников Кости, n (1 ≤ n ≤ 50) — количество базовых артефактов, m (0 ≤ m ≤ 50) — количество составных артефактов, q (1 ≤ q ≤ 500) — количество покупок его друзей. Следующие n строк содержат названия базовых артефактов. После них в m строках содержатся описания составных артефактов в следующем формате:

<Название арт.>: <Арт. №1> <Количество aрт. №1>, <Арт. №2> <Количество aрт. №2>, ... <Арт. №X> <Количество aрт. №Х>

Все количества — натуральные числа, не большие 100 (1 ≤ X ≤ n).

Названия всех артефактов различны, состоят из строчных букв латинского алфавита, длина каждого названия — от 1 до 100 символов включительно. Все слова в формате описания составного артефакта разделены ровно одним пробелом. Гарантируется, что все составляющие нового артефакта различны и уже встречались во входных данных в качестве названий базовых артефактов.

Дальше каждая из последующих q строчек характеризуется числом ai, номером друга, купившего артефакт (1 ≤ ai ≤ k), и наименованием купленного базового артефакта. Будем считать, что рюкзаки у героев бездонные и любой последующий купленный артефакт влезает.

Гарантируется, что после очередной покупки появляется не более одной возможности собрать составной артефакт. Если такая возможность появилась, герой ей обязательно воспользуется.

Выходные данные

Выходной файл должен состоять из k блоков. В первой строке должно находиться число bi — количество различных артефактов у i-ого союзника. Далее в блоке должно располагаться bi строк с наименованиями этих артефактов и количеством этих артефактов, причем строки должны быть выведены в соответствии с лексикографическим порядком названий артефактов. В каждом блоке все артефакты должны быть различны, а все числа кроме bi положительны.

E. Подотрезки

реализация Структуры данных *1800

Программист Саша недавно начал изучать структуры данных. Его тренер Стас сказал ему решить задачу о нахождении минимума на отрезке массива за , с которой Саша справился. Чтобы Саша не думал, что все изучил, Стас задал ему новую задачу. Для каждого отрезка фиксированной длины Саша должен найти максимальный элемент из тех, что встречаются на данном отрезке ровно один раз. Помогите Саше решить эту задачу.

Входные данные

В первой строке находится два натуральных числа n и k (1 ≤ n ≤ 105, 1 ≤ k ≤ n) — количество элементов массива и длина отрезка.

Далее следует n строк: в i-ой находится одно число ai ( - 109 ≤ ai ≤ 109).

Выходные данные

Выведите nk + 1 чисел, по одному в строке: в i-ой строке выведите максимальное из тех чисел подмассива ai ai + 1ai + k - 1, что встречается на этом подмассиве ровно 1 раз. Если таких чисел в данном подмассиве нет, выводите "Nothing".

A. Берляндская мода

реализация *1000

Согласно правилам берляндской моды, каждый берляндец должен носить пиджак с ровно одной незастёгнутой пуговицей, но, в отличие от нашей, не обязательно последней. Также, если пуговица только одна, то, несмотря на основное правило, она должна быть застёгнута, чтобы пиджак не распахивался.

Вам задан пиджак с n пуговицами. Определите, правильно ли он застёгнут.

Входные данные

В первой строке находится целое число n (1 ≤  n ≤  1000) —- количество пуговиц на пиджаке.

Во второй строке находятся n целых чисел ai (0 ≤ ai ≤ 1). Число ai = 0, если i-я пуговица не застёгнута. В противном случае ai = 1.

Выходные данные

В единственной строке выведите слово "YES" в случае, если пиджак застёгнут правильно. В противном случае выведите слово "NO".

B. s-палиндром

реализация Строки *1600

Назовём строку "s-палиндромом", если она симметрична относительно своей середины. Например, строка "oHo" является "s-палиндромом", а строка "aa" не является. Строка "aa" не является "s-палиндромом", поскольку вторая половина строки не является зеркальным отражением первой.

Английский алфавит

Вам задана строка s. Определите является ли она "s-палиндромом".

Входные данные

Вам задана строка s (1 ≤ |s| ≤ 1000), состоящая из букв английского алфавита.

Выходные данные

Выведите "TAK", если строка s является "s-палиндромом" и "NIE" в противном случае.

C. Экспоненциальная запись

реализация Строки *1800

Вам задано положительное вещественное число x.

Ваша задача преобразовать его в "простой экспоненциальный формат".

Пусть x = a·10b, где 1 ≤ a < 10, тогда в общем случае "простой экспоненциальный формат" имеет вид "aEb". Если b равно нулю, то часть "Eb" должна быть опущена. Если a является целым числом, то оно должно быть записано без вещественной точки. Также a и b не должны содержать лидирующих нулей.

Входные данные

В единственной строке находится положительное вещественное число x. Длина заданной строки не превосходит 106. Обратите внимание, что вам задано очень большое число, поэтому вы не можете использовать встроенные типы данных "float", "double" и другие.

Выходные данные

Выведите одну строку — "простой экспоненциальный формат" заданного числа x.

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

A. Лоренцо Фон Маттерхорн

Деревья Перебор реализация Структуры данных *1500

Барни живет в Нью-Йорке. Нью-Йорк содержит бесконечное число перекрестков, пронумерованных целыми числами, начиная с 1. Известно, что в городе существует дорога, соединяющая перекрестки с номерами i и 2i, и дорога, соединяющая перекрестки с номерами i и 2i + 1, для любого целого положительного i. Все дороги в городе двусторонние. Легко убедиться, что между любыми двумя перекрестками существует ровно один кратчайший путь.

Изначально передвижение по любой дороге является бесплатным, однако, так как намечается «День пощечедавания», в ближайшее время произойдет q последовательных событий:

1. Правительство издает новое правило, определяемое тройкой целых чисел v, u и w, согласно которому стоимость передвижения по всем дорогам на кратчайшем пути от u до v увеличивается на w долларов.

2. Барни идет из перекрестка v до перекрестка u, где хочет обниматься с девушкой. Барни всегда использует кратчайший путь (по количеству посещенных вершин и дорог) для перемещения между перекрестками.

Теперь правительству нужна ваша помощь: каждый раз, когда Барни отправляется обниматься с девушкой, вам нужно сообщать, сколько долларов Барни должен заплатить (т.е. суммарную стоимость передвижения по всем дорогам, которые он пройдет).

Входные данные

Первая строка содержит единственное целое число q (1 ≤ q ≤ 1 000).

Следующие q строк описывают происходящие события в хронологическом порядке. Каждая из следующих строк имеет вид 1 v u w и соответствует событию, когда правительство издает правило об увеличении стоимости прохождения по всем дорогам на кратчайшем пути от перекрестка u до перекрестка v на w долларов, либо имеет вид 2 v u и соответствует событию, когда Барни идет от перекрестка v до перекрестка u по кратчайшему пути.

Для всех описаний событий выполняется 1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109.

Выходные данные

Для каждого события второго типа выведите суммарную стоимость прохождения дорог, которые Барни пройдет на своем пути. Ответы выводите в том же порядке, что и соответствующие им запросы.

Примечание

В запросах первого примера:

  1. Перекрестки на пути — 3, 1, 2 и 4.
  2. Перекрестки на пути — 4, 2 и 1.
  3. Перекрестки на пути — 3 и 6.
  4. Перекрестки на пути — 4, 2, 1 и 3. Стоимости прохождения по дорогам равны 32, 32 и 30 в порядке прохождения. Ответ равен 32 + 32 + 30 = 94.
  5. Перекрестки на пути — 6, 3 и 1.
  6. Перекрестки на пути — 3 и 7. Стоимость прохождения по дороге между ними равна 0.
  7. Перекрестки на пути — 2 и 4. Стоимость прохождения по дороге между ними равна 32 (увеличенная на 30 после первого события и на 2 после второго).

C. PLEASE

дп Комбинаторика математика матрицы реализация *2000

Как известно, работа Барни это «PLEASE», и ему в целом нечем заняться на работе, и поэтому он решил сыграть в «чашки и ключ». В этой игре участвуют три одинаковые чашки, выставленные в ряд слева направо. Изначально ключ к сердцу Барни находится под стоящей посередине чашкой.

Затем, за один ход Барни меняет местами чашку посередине с одной из двух других чашек случайным образом (он выберет каждую с одинаковой вероятностью), так что выбранная чашка становится посередине. Игра длится n ходов, и в каждом из них Барни независимо выбирает чашку для обмена со средней на каждом ходу, а ключ всегда остается под чашкой, под которой был в самом начале.

После n-го хода Барни просит девушку указать на чашку, содержащую ключ. Девушка указывает на стоящую посередине чашку, но Барни отвлекся во время игры и не знает, находится ли там ключ или нет. Поэтому Барни просит вас сообщить ему вероятность того, что девушка указала на правильную чашку.

Число ходов n может быть очень большим, поэтому Барни не сообщил вам его. Вместо этого он дал вам массив a1, a2, ..., ak, такой, что

другими словами, n равно произведению чисел данного массива.

Из-за проблем с точностью Барни просит вас сообщить ответ в виде несократимой дроби. Другими словами, найдите ответ в виде p / q, причем , где  — наибольший общий делитель. Так как p и q могут быть очень большими, достаточно вывести остаток от деления каждого из них на 109 + 7.

Заметьте, что мы хотим, чтобы наибольший общий делитель p и q был равен 1, а не наибольший общий делитель их остатков от деления на 109 + 7.

Входные данные

В первой строке содержится единственное целое число k (1 ≤ k ≤ 105) — количество элементов в массиве, данном Барни.

Во второй строке содержатся k целых чисел a1, a2, ..., ak (1 ≤ ai ≤ 1018) — элементы массива.

Выходные данные

В единственной строке выведите строку вида x / y, где x — остаток от деления p на 109 + 7, а y — остаток от деления q на 109 + 7.

A. Случай с ананасом

математика реализация *900

У Теда есть ананас, который лает как бульдог! В момент времени t (в секундах) ананас лает первый раз, а затем каждые s секунд лает дважды с промежутком в одну секунду. Таким образом, он лает в моменты времени t, t + s, t + s + 1, t + 2s, t + 2s + 1 и так далее.

Утром Барни проснулся и хочет съесть ананас Теда, но Барни не может есть ананас, пока тот лает. Барни собирается съесть ананас в момент времени x (в секундах), поэтому он просит вас сообщить, будет ли он лаять в это время.

Входные данные

В единственной строке входных данных содержатся три целых числа t, s и x (0 ≤ t, x ≤ 109, 2 ≤ s ≤ 109) — момент времени, когда ананас лает в первый раз, количество секунд между лаянием ананаса, и момент времени, когда Барни хочет съесть ананас соответственно.

Выходные данные

В единственной строке выведите «YES» (без кавычек) если в момент времени x ананас будет лаять или «NO» в противном случае.

Примечание

В первом и втором примерах из условия ананас будет лаять в моменты 3, 13, 14, ..., так что в момент 4 он лаять не будет, но будет лаять в момент 3.

В третьем и четвертом примерах из условия ананас будет лаять в моменты 3, 11, 12, 19, 20, 27, 28, 35, 36, 43, 44, 51, 52, 59, ..., так что и в момент 51, и в момент 52 он будет лаять.

B. Барникл

математика Перебор реализация Строки *1400

Барни, находясь в баре, загляделся на красивую девушку. Он хочет точным выстрелом пронзить ее стрелой любви, и поэтому ему нужно знать расстояние между ним и девушкой.

Барни попросил бармена Карла сообщить ему, чему равно это расстояние, но тот был так занят разговорами с другими посетителями, что написал значение расстояния (а это вещественное число) на салфетке. Однако, для этого Карл использовал экспоненциальную запись числа. Экспоненциальная запись некоторого вещественного числа x это запись в форме AeB, где A — некоторое вещественное число, B — целое число, а x равняется A × 10B. В нашей задаче A может принимать вещественные значения от 0 до 9, а B неотрицательно.

Барни плохо знаком с экспоненциальной записью, поэтому он просит вас сообщить ему, чему равно расстояние в его обычной десятичной записи с минимально возможным количеством знаков после десятичной точки (или без десятичной точки, если его значение целое). Смотрите формат выходных данных для более подробной информации.

Входные данные

Первая и единственная строка входных данных содержит экспоненциальную запись числа в виде a.deb, где a, d и b — целые числа, а e соответствует обычному символу 'e' (0 ≤ a ≤ 9, 0 ≤ d < 10100, 0 ≤ b ≤ 100) — экспоненциальную запись искомого расстояния.

a и b не содержат ведущих нулей, а d не содержит нулей в конце своей записи (но может быть равно 0). Также, b не может быть отличным от 0, если a равно 0.

Выходные данные

В единственной строке выведите вещественное число x (искомое расстояние) в его десятичной записи.

То есть, если x — целое число, выведите его значение без дробной части и десятичной точки и без ведущих нулей.

В противном случае, выведите x в виде p.q, где p и q — целые числа, p не содержит ведущих нулей (но может быть равным нулю), а q не содержит нулей в конце своей записи (и не может быть равным нулю).

A. Старт коллайдера

реализация *1000

Совсем скоро произойдёт запуск самого нового, мощного и необычного коллайдера, который расположен вдоль прямой. В нём будут запущены n частиц. Все они расположены на одной прямой, причем в одной точке не может быть двух или более частиц. Координаты частиц совпадают с расстоянием в метрах от центра коллайдера, то есть xi — это и координата i-й частицы, и одновременно её позиция в коллайдере. Все координаты частиц — целые чётные числа.

Про каждую частицу известно направление её движения — она будет двигаться либо влево, либо вправо после старта коллайдера. Все частицы начнут двигаться одновременно в момент старта коллайдера. Каждая частица будет двигаться ровно влево или ровно вправо с постоянной скоростью 1 метр в микросекунду. Считайте, что коллайдер достаточно большой, и частицы не могут вылететь из него за обозримое время.

Напишите программу, которая найдет момент первого столкновения двух каких-либо частиц коллайдера. Иными словами, требуется найти количество микросекунд до первого такого момента, когда какие-либо две частицы окажутся в одной точке.

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 200 000) — количество частиц.

Во второй строке следует n символов «L» и «R», причём если i-й символ равен «L», то i-я частица будет двигаться влево, иначе i-й символ равен «R», и i-я частица будет двигаться вправо.

В третьей строке следует последовательность различных целых чётных чисел x1, x2, ..., xn (0 ≤ xi ≤ 109) — координаты частиц в порядке слева направо. Гарантируется, что координаты частиц заданы в порядке возрастания.

Выходные данные

В первой строке выведите единственное целое число — первый момент времени (в микросекундах), в который две частицы окажутся в одной точке и произойдет взрыв.

Выведите единственное целое число -1, если столкновения частиц не произойдет.

Примечание

В первом примере из условия первый взрыв произойдёт через 1 микросекунду, так как частицы с номерами 1 и 2 одновременно окажутся в точке с координатой 3.

Во втором примере из условия взрыв никогда не произойдёт, так как никакие две частицы никогда не окажутся в одной точке одновременно.

B. Одна бомба

реализация *1400

Вам задано описание склада, который представляет из себя прямоугольное клетчатое поле размера n × m. Каждая клетка склада может быть либо пустой («.»), либо занятой стеной («*»).

У вас есть одна бомба. Если её заложить в клетке (x, y), то при срабатывании она уничтожит все препятствия, находящиеся в строке x, и все препятствия, находящиеся в столбце y.

Перед вами стоит задача определить, можно ли с помощью взрыва ровно одной бомбы уничтожить все стены на складе. Бомбу разрешается закладывать как в пустую клетку, так и в клетку со стеной.

Входные данные

В первой строке следует два целых положительных числа n и m (1 ≤ n, m ≤ 1000) — количество строк и столбцов поля.

Следующие n строк содержат по m символов «.» и «*» — описание склада. j-й символ в i-й из них соответствует клетке (i, j).Если символ равен «.», то соответствующая клетка пустая. В противном случае символ равен «*», и в соответствующей клетке находится стена.

Выходные данные

Если невозможно уничтожить все стены с помощью одной бомбы, выведите в первую строку «NO» (без кавычек).

В противном случае выведите в первую строку «YES» (без кавычек), а во вторую два целых числа — координаты клетки, в которую нужно заложить бомбу. Если вариантов ответа несколько, разрешается вывести любой из них.

B. Менеджер памяти

реализация *1600

До релиза первой национальной операционной системы BerlOS осталось совсем чуть-чуть. В ней не готовы всего несколько компонентов — менеджер памяти в том числе. По задумке разработчиков, в первой версии он будет очень прост и прямолинеен. Менеджер памяти будет поддерживать три операции:

  • alloc n — выделить n байт памяти и вернуть идентификатор выделенного блока x;
  • erase x — удалить блок с идентификатором x;
  • defragment — дефрагментировать свободную память, переместив все блоки максимально к началу памяти, сохранив их относительный порядок.

Модель памяти в данном случае очень проста. Память представляет собой последовательность m байт, условно пронумерованных от первого до m-го.

Первая операция alloc n принимает в качестве единственного параметра размер блока памяти, который предстоит выделить. При обработке этой операции в памяти выбирается свободный блок из n байт, идущих подряд. Если таких блоков несколько, то выбирается ближайший к началу памяти (первому байту). Все эти байты помечаются использованными, и менеджер возвращает 32-битное целое знаковое число, являющееся идентификатором этого блока. Если свободный блок такого размера найти невозможно, то функция возвращает специальное значение NULL.

Вторая операция erase x принимает в качестве параметра идентификатор некоторого блока. Она возвращает память системе, помечая байты этого блока свободными для последующего использования. В том случае, если этому идентификатору не соответствует ранее выделенный блок, который еще не был удален, то функция возвращает специальное значение ILLEGAL_ERASE_ARGUMENT.

Последняя операция defragment не имеет аргументов и просто перемещает занятые участки памяти вплотную к ее началу, не меняя их относительный порядок. Таким образом, после этой операции вся свободная память образует один непрерывный участок, который идет следом за использованной памятью.

В текущей реализации требуется использовать в качестве идентификаторов последовательные целые числа от 1. Каждый успешный вызов alloc должен возвращать очередное число. Неудачные вызовы alloc не оказывают влияния на описанную нумерацию.

Ваша задача состоит в том, чтобы написать реализацию менеджера памяти. Для каждой команды alloc нужно выводить возвращаемое значение. Также следует выводить ILLEGAL_ERASE_ARGUMENT для всех неудачных вызовов erase.

Входные данные

В первой строке входных данных содержатся два целых положительных числа t и m (1 ≤ t ≤ 100;1 ≤ m ≤ 100), где t — количество операций, заданных менеджеру памяти на исполнение, а m — размер доступной памяти в байтах. Далее в t строках заданы сами операции. Первая операция задается строкой alloc n (1 ≤ n ≤ 100), где n целое число. Вторая задается строкой erase x, где x произвольное 32-битное целое знаковое число. Третья операция задается строкой defragment.

Выходные данные

Выведите последовательность строк. Каждая строка должна содержать либо результат работы операции alloc, либо ILLEGAL_ERASE_ARGUMENT как результат неудачного выполнения операции erase. Вывод следует осуществлять в порядке совершения операций. Реализация alloc должна возвращать в качестве идентификаторов выделенных блоков целые числа, начиная с 1.

E. Проверка макросов

дп Разбор выражений реализация *2600

Большинство программистов на C/C++ знают об отличных возможностях, предоставляемых директивами препроцессора #define, но также многим известны и проблемы, возникающие при их неаккуратном использовании.

В данной задаче мы рассматриваем следующую модель конструкций #define (также называемых макросами). Каждый макрос имеет свои имя и значение. Объявляется он следующим образом:

#define имя_макроса значение_макроса

После этого объявления везде, где в программе встречается слово "имя_макроса" (как отдельный токен, т.е. как подстрока, окружённая неалфавитными символами), оно заменяется на "значение_макроса". В "значение_макроса" в рамках нашей модели может быть записано только какое-либо арифметическое выражение, содержащее переменные, четыре арифметических операции, скобки, а также имя ранее объявленных макросов (в этом случае замена производится по цепочке). Процесс замены макросов на их значения называется подстановкой.

Одна из основных проблем, возникающих при использовании макросов — когда после выполнения подстановки получается арифметическое выражение, в котором из-за разных приоритетов операций может неожиданно измениться порядок вычисления.

Рассмотрим это на следующем примере. Определим такую конструкцию #define:

#define sum x + y

и пусть далее в программе считается выражение "2 * sum". После подстановки макроса получится выражение "2 * x + y", вместо интуитивно ожидаемого "2 * (x + y)".

Определим "подозрительной" ситуацию, когда после выполнения подстановки макроса порядок вычислений меняется, выходя за пределы какого-либо макроса. Соответственно, Ваша задача — по набору определений #define и заданному выражению определить, является это выражение подозрительным или нет.

Определим это более формально. Выполним обычную подстановку макросов в заданном выражении. Кроме того, выполним "безопасную" подстановку макросов в выражение: окружив значение каждого макроса скобками; после этого, пользуясь арифметическими правилами раскрытия скобок, можно опустить некоторые скобки. Если при этом можно получить выражение, полностью совпадающее с результатом обычной подстановки (посимвольно, но игнорируя пробелы), то это выражение и система макросов считаются корректными, иначе — подозрительными.

Примечание. В этом критерии операция деления рассматривается с математической точки зрения, а не в смысле языка C++ (в котором под ним подразумевается деление нацело). Например, в выражении "a*(b/c)" мы можем опустить скобки и получить выражение "a*b/c".

Входные данные

В первой строке записано единственное число n (0 ≤ n ≤ 100) — число конструкций #define в рассматриваемой программе.

Далее идут n строк, в каждой из которых записана ровно одна конструкция #define. Каждая конструкция имеет вид:

#define name expression

где

  • name — имя макроса,
  • expression — выражение, на которое будет заменяться данный макрос. Выражение — это непустая строка, составленная из чисел, названий переменных, имён ранее объявленных макросов, круглых скобок и знаков операций +-*/. Гарантируется, что выражение (до и после подстановки макросов) является корректным арифметическим выражением, в котором отсутствуют унарные операции. В выражении содержатся только целые неотрицательные числа, не превосходящие 109.

Все имена (имена конструкций #define и имена их аргументов) являются строками из латинских символов, чувствительными к регистру. Гарантируется, что имя любой переменной отлично от имени любой конструкции #define.

Далее, в последней строке записано некоторое выражение expression, для которого и требуется выполнить проверку. Это выражение непусто и удовлетворяет тем же ограничениям, что и выражения в конструкциях #define.

Во входных строках может присутствовать произвольное число пробелов в любом месте, если только эти пробелы не разрывают слово "define" или имена конструкций или переменных. В частности, до и после символа "#" может стоять произвольное число пробелов.

Длина любой строки входного файла не превосходит 100 символов.

Выходные данные

Выведите строку "OK", если выражение корректно с точки зрения критерия, описанного в условии, иначе выведите "Suspicious".

E. Информационная реформа

Деревья дп реализация *2700

Несмотря на то, что уже XXI век на дворе, СМИ в Моржландии не сильно распространены. Оповещение городов ведется с помощью гонцов которые могут путешествовать только по дорогам. Сеть дорог в Моржландии устроена так, что от каждого города до любого другого можно добраться ровно одним способом, и длины дорог равны между собой.

Решением правителя Северного Полюса было принято провести информационную реформу. Было решено выбрать несколько городов и назначить их областными центрами. На обслуживание областного центра приходится тратить k рыбликов (местная валюта) в год. Считается, что областной центр всегда имеет информацию о последних новостях.

Каждому городу, не являющемуся областным центром, было принято решение назначить областной центр, который будет отвечать за информированность этого города. В таком случае затраты на обслуживание равняются dlen рыбликам в год, где len — расстояние от города до соответствующего областного центра, измеряемое в количестве дорог, которые надо проехать.

Ваша задача минимизировать расходы на проведение реформы.

Входные данные

В первой строке заданы два целых числа n и k (1 ≤ n ≤ 180, 1 ≤ k ≤ 105).

Во второй строке записано n - 1 целых чисел di, нумерующихся с единицы (di ≤ di + 1, 0 ≤ di ≤ 105).

В следующих n - 1 строках заданы пары номеров городов соединенных дорогой.

Выходные данные

В первой строке выведите минимальное количество рыбликов, затрачиваемых на обслуживание за один год. Во второй строке выведите n чисел, где i-ое число будет обозначать номер областного центра, который был назначен i-ому городу. Если i-й город сам является областным центром, то следует вывести число i.

Если решений несколько, выведите любое.

A. Карты

жадные алгоритмы реализация *800

В колоде карт есть n карт (nчётное число). На каждой карте написано целое положительное число. В новую карточную игру будут играть n / 2 человек. Каждому из игроков перед началом игры будет роздано ровно по две карты, причём каждая карта из колоды будет роздана ровно одному игроку.

Перед вами стоит задача найти такой способ раздачи карт, чтобы у каждого из игроков сумма чисел, написанных на полученных им картах, совпадала. Гарантируется, что входные данные таковы, что это всегда возможно.

Входные данные

В первой строке входных данных записано целое положительное число n (2 ≤ n ≤ 100) — количество карт. Гарантируется, что n чётно.

Во второй строке следует последовательность из n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 100), где ai равно числу, написанному на i-й карте.

Выходные данные

Выведите n / 2 пар целых чисел, по одной паре в строке — номера карт, которые нужно отдать каждому игроку. Каждая карта должна быть роздана ровно одному игроку. Карты нумеруются в том же порядке, в котором описываются во входных данных, начиная с единицы. Гарантируется, что входные данные таковы, что ответ всегда существует. Если возможных правильных ответов несколько, разрешается вывести любой из них.

Примечание

В первом примере карты распределены таким образом, что у каждого из игроков сумма чисел равна 8.

Во втором примере все значения ai равны между собой. Следовательно, любое разбиение на пары является правильным ответом.

A. Наибольшее возрастание

дп жадные алгоритмы реализация *800

Вам задан массив, состоящий из n целых чисел. Перед вами стоит задача определить наибольшую длину возрастающего подмассива заданного массива.

Подмассивом называется последовательность подряд идущих элементов массива. Подмассив называется возрастающим, если каждый из его элементов строго больше предыдущего.

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 105) — количество чисел.

Во второй строке следует n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 109).

Выходные данные

Выведите наибольшую длину возрастающего подмассива заданного массива.

B. Степени двойки

математика Перебор реализация Структуры данных *1500

Вам задано n чисел a1, a2, ..., an. Найдите количество пар индексов i, j (i < j) таких, что ai + aj является степенью двойки (то есть найдется такое целое число x, что ai + aj = 2x).

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 105) — количество чисел.

Во второй строке следует n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 109).

Выходные данные

Выведите количество пар индексов i, j (i < j) таких, что ai + aj является степенью числа 2.

Примечание

В первом примере в ответ входят следующие пары индексов: (1, 4) и (2, 4).

Во втором примере каждая пара индексов (i, j) (где i < j) входит в ответ.

C. Сотовая связь

Бинарный поиск реализация *1500

На прямой заданы n точек — позиции населенных пунктов, а также m точек — позиции вышек сотовой связи. Все вышки работают одинаково, они обеспечивают сотовой связью все населенные пункты, которые удалены от нее не более чем на r.

Перед вами стоит задача определить минимальное r, чтобы каждый населенный пункт был обеспечен сотовой связью. Иными словами надо найти наименьшее r такое, что для каждого города найдется хотя бы одна вышка на расстоянии не более чем r.

Если r = 0, то вышка обеспечивает сотовой связью только ту точку, где она расположена. Одна вышка может обеспечивать сотовой связью любое количество населенных пунктов, при условии, что все они расположены от неё на расстоянии не более чем r.

Входные данные

В первой строке следует два целых положительных числа n и m (1 ≤ n, m ≤ 105) — количество населенных пунктов и количество вышек.

Во второй строке следует последовательность из n целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — координаты населенных пунктов. Допустимо, что в одной точке может быть несколько населенных пунктов. Все координаты населенных пунктов заданы в порядке неубывания.

В третьей строке следует последовательность из m целых чисел b1, b2, ..., bm ( - 109 ≤ bj ≤ 109) — координаты вышек сотовой связи. Допустимо, что в одной точке может быть несколько вышек. Все координаты вышек заданы в порядке неубывания.

Выходные данные

Выведите минимальное число r такое, что каждый населенный пункт будет обеспечен сотовой связью.

A. Мишка и игра

реализация *800

Мишка — маленький белый медвежонок. А как известно, маленькие медвежата в свободное время любят играть в кости на шоколадки. Одним замечательным солнечным утром, гуляя по льдинам, Мишка встретила своего друга Криса, которому и предложила сыграть в эту занимательную игру.

Правила её очень просты: сначала определяется значение n — количество раундов игры. В очередном раунде каждый из игроков один раз бросает стандартный игральный кубик, на грани которого нанесены различные числа от 1 до 6. Игрок, выбросивший большее значение, становится победителем в раунде. В случае, если выпавшие значения равны, победа не засчитывается никому.

В самой же игре побеждает участник, выигравший в большем количестве раундов. Если же количества побед, заслуженных игроками, равны, то объявляется ничья.

Мишка ещё совсем маленькая и плохо умеет вести счёт, а потому попросила Вас понаблюдать за ходом игры и сообщить ей результат. Помогите ей!

Входные данные

В первой строке входных данных содержится число n (1 ≤ n ≤ 100) — количество раундов игры.

Следующие n строк содержат описание раундов. В i-й из них содержится пара целых чисел mi и ci (1 ≤ mi,  ci ≤ 6) — результаты бросков Мишки и Криса в i-ом раунде соответственно.

Выходные данные

В случае победы Мишки в единственной строке выведите "Mishka" (без кавычек), а в случае победы Криса выведите "Chris" (без кавычек). Если же игра сведётся к ничьей, то выведите "Friendship is magic!^^" (без кавычек).

Примечание

В первом примере Мишка проигрывает в первом раунде, однако выигрывает во втором и третьем, а потому становится победителем.

Во втором примере Мишка выигрывает в первом раунде, Крис выигрывает во втором раунде, и игра со счётом 1:1 сводится к ничьей.

В третьем примере первый раунд выигрывает Крис, а два последующих раунда играются вничью. Победитель — Крис.

B. Мишка и путешествие

математика реализация *1400

Маленькая Мишка — большая путешественница. В каких только странах она не побывала! После долгих раздумий о том, куда бы поехать в этом году, выбор её пал на XXX — прекрасную, но малоизвестную северную страну.

Вот несколько интересных фактов об этой стране:

  1. В состав XXX входят n городов, k из которых (только представьте себе!) являются столицами.
  2. Все города этой страны красивы, но по-разному. Красота i-го города описывается величиной ci.
  3. Все города последовательно соединены дорогами, включая 1-й и n-й город, образуя замкнутый маршрут 1 — 2 — ... — n — 1. Формально, для каждого 1 ≤ i < n существует дорога между городами i и i + 1, и еще одна между городами 1 и n.
  4. Каждый город-столица напрямую соединен дорогами со всеми остальными городами. Формально, если город x — столица, то для каждого 1 ≤ i ≤ n,  i ≠ x, существует дорога между городами x и i.
  5. Между любыми двумя городами существует не более одной дороги.
  6. Стоимость проезда между городами напрямую зависит от показателей их красоты. Так, если между городами i и j существует дорога, то стоимость проезда по ней равна ci·cj.

Мишка уже начала собираться в путешествие, но ещё не определилась со своим маршрутом, а потому попросила вас помочь ей оценить суммарную стоимость проезда по всем дорогам XXX. Формально, по всем различным парам городов a и b (a < b), таких, что a и b соединены дорогой, требуется посчитать сумму произведений ca·cb. Поможете ей?

Входные данные

В первой строке входных данных содержатся числа n и k (3 ≤ n ≤ 100 000, 1 ≤ k ≤ n) — количество городов в XXX и количество столиц среди них соответственно.

Во второй строке содержится n целых чисел c1, c2, ..., cn (1 ≤ ci ≤ 10 000) — показатели красоты каждого из городов.

В третьей строке содержится k различных целых чисел id1, id2, ... idk (1 ≤ idi ≤ n) — номера городов, являющихся столицами. Номера городов заданы в порядке возрастания.

Выходные данные

Выведите единственное целое число — суммарную стоимость проезда по всем существующим дорогам в XXX.

Примечание

Рисунок, описывающий первый пример:

Несложно посчитать, что суммарная стоимость дорог равна 17.

Рисунок, описывающий второй пример:

Несложно посчитать, что суммарная стоимость дорог равна 71.

C. Крис и дорога

геометрия реализация *2100

А пока Мишка увлечена своим путешествием...

Крис — маленький бурый медвежонок. Никому не известно, где и когда он познакомился с Мишкой, однако вот уже долгое время они неразлучны (этот случай не в счёт). Впрочем, девочки девочками, а без лучших друзей никуда. Таким другом и является Джон. Однажды, гуляя вместе с другом, Джон подкинул Крису идею следующей задачи:

По бесконечной горизонтальной дороге ширины w, ограниченной прямыми y = 0 и y = w, движется автобус, представляющий собой выпуклый многоугольник из n вершин. Автобус непрерывно движется с постоянной скоростью v по прямой Ox в сторону уменьшения координат, то есть со временем меняются только x-координаты его точек. Формально, за время t каждая из x-координат его точек уменьшится на vt.

В точке (0, 0) находится пешеход, который может перемещаться только по вертикальному пешеходному переходу, представляющему отрезок, соединяющий точки (0, 0) и (0, w) со скоростью, не превосходящей u. Таким образом, пешеход может перемещаться только по прямой Oy в любом направлении с произвольной скоростью, не превосходящей u, не выходя за пределы дороги. Пешеход умеет мгновенно менять свою скорость, так, например, он может мгновенно остановиться.

Считается, что пешеход попал под автобус, если в некоторый момент времени точка, в которой находится пешеход, находится строго внутри многоугольника автобуса (в случае нахождения точки в вершине или на границе многоугольника считается, что пешеход не попал под автобус).

По данному в момент времени 0 положению автобуса, помогите Крису определить минимальное время, за которое пешеход сможет перейти дорогу, оказавшись в точке (0, w), не попав при этом под автобус.

Входные данные

В первой строке входных данных содержатся четыре целых числа n, w, v, u (3 ≤ n ≤ 10 000, 1 ≤ w ≤ 109, 1 ≤ v,  u ≤ 1000) — количество вершин многоугольника, ширина дороги, скорости автобуса и пешехода соответственно.

Следующие n строк описывают вершины многоугольника в порядке его обхода против часовой стрелки. В i-й из них содержится пара целых чисел xi и yi ( - 109 ≤ xi ≤ 109, 0 ≤ yi ≤ w) — координаты i-й вершины многоугольника. Гарантируется, что многоугольник — невырожденный.

Выходные данные

Выведите вещественное число t — время, необходимое пешеходу, чтобы перейти дорогу, не попав под автобус. Относительная или абсолютная погрешность ответа не должна превышать 10 - 6.

Примечание

Рисунок ниже описывает начальное положение автобуса и пешехода в первом примере из условия.

A. Тор

Перебор реализация Структуры данных *1600

Тор постепенно привыкает к жизни на земле. Недавно Локи подарил ему смартфон, на котором уже установлены n приложений. Тору очень нравится новый телефон, но ему не хватает информации о количестве непрочитанных оповещений от приложений (возможно, это Локи наложил на телефон проклятье, кто знает).

Последовательно произойдёт q событий, каждое из которых будет одного из трёх типов:

  1. Приложение x порождает новое оповещение (которое, разумеется, изначально не прочитано).
  2. Тор просматривает все оповещения от приложения x (в том числе перечитывает уже прочитанные).
  3. Тор просматривает первые t оповещений, сгенерированных какими-либо приложениями (то есть первые t событий первого типа). Гарантируется, что к этому моменту уже произошло хотя бы t событий первого типа. Обратите внимание, что Тор читает не первые t непросмотренных оповещений, а просто первые t оповещений, в том числе просматривая какие-то заново.

Помогите Тору определить количество непросмотренных оповещений после каждого события. Считайте, что изначально никаких оповещений в телефоне не было.

Входные данные

В первой строке входных данных записаны целые числа n и q (1 ≤ n, q ≤ 300 000) — количество приложений и количество событий соответственно.

Следующие q строк содержат описания событий, в i-й из них будет сначала записано целое число typei — тип события. Если typei = 1 или typei = 2, то далее следует целое число xi. А если typei = 3, то далее следует целое число ti (1 ≤ typei ≤ 3, 1 ≤ xi ≤ n, 1 ≤ ti ≤ q).

Выходные данные

Выведите количество непрочитанных оповещений после каждого события.

Примечание

В первом примере:

  1. Приложение 3 создаёт оповещение (количество непрочитанных оповещений равно 1).
  2. Приложение 1 создаёт оповещение (количество непрочитанных оповещений равно 2).
  3. Приложение 2 создаёт оповещение (количество непрочитанных оповещений равно 3).
  4. Тор читает все оповещения, созданные приложением 3, остаётся 2 непрочитанных оповещения.

Во втором примере:

  1. Приложение 2 создаёт оповещение (количество непрочитанных оповещений равно 1).
  2. Приложение 4 создаёт оповещение (количество непрочитанных оповещений равно 2).
  3. Приложение 2 создаёт оповещение (количество непрочитанных оповещений равно 3).
  4. Тор читает первые три оповещения, и непрочитанных оповещений становится 0.
  5. Приложение 3 создаёт оповещение (количество непрочитанных оповещений равно 1).
  6. Приложение 3 создаёт оповещение (количество непрочитанных оповещений равно 2).

C. Чёрная вдова

графы дп математика реализация *2900

Наталья Романова собирается протестировать новое оружие, которое ей выдали в S.H.I.E.L.D. Чтобы определить результат эксперимента, ей требуется найти количество решений следующего уравнения:

Здесь означает логическое ИЛИ (OR), а означает логическое исключающее ИЛИ (то есть XOR), а vi, j — булевы переменные и их отрицания. Наталья называет левую часть уравнения XNF формулой. Каждое условие в скобках называется клаузой, а переменные vi, j — литералами.

На самом деле в уравнении Натальи левая часть является 2-XNF-2 формулой от переменных x1, x2, ..., xm и их отрицаний. XNF формула называется 2-XNF-2 формулой, если:

  1. ki ≤ 2 для всех 1 ≤ i ≤ n, то есть размер каждой клаузы не превосходит двух.
  2. Каждая переменная встречается в формуле суммарно (как с отрицанием, так и без него) не более чем дважды. Обратите внимание, что переменная может дважды встретиться с отрицанием и ни разу без него (или наоборот).

У Натальи есть формула от m переменных, состоящая из n клауз. Обязательно посмотрите на примеры, чтобы убедиться, что вы правильно понимаете, как задаётся формула.

Наталья больше любит практику, чем теорию, поэтому просит вас найти количество решений уравнения, чтобы уже начать стрелять. Формально, требуется найти количество способов установить значения булевых переменных x1, ..., xm в true или false (всего существует 2m способов), так что равенство будет выполнено. Поскольку это число может быть очень большим, выведите остаток от его деления на 109 + 7.

Обратите внимание, что какая-то переменная может дважды появиться в одной и той же клаузе, а может не появиться вообще ни разу (однако присвоение ей true или false всё равно даёт разные способы).

Входные данные

В первой строке входных данных записаны два целых числа n и m (1 ≤ n, m ≤ 100 000) — количество клауз и количество переменных соответственно.

В следующих n строках описывается формула. В i-й из них сначала следует число ki — количество литералов в i-й клаузе. Далее следуют ki ненулевых целых чисел ai, 1, ..., ai, ki. Если ai, j > 0, то vi, j равняется xai, j, в противном случае это отрицание x - ai, j (1 ≤ ki ≤ 2,  - m ≤ ai, j ≤ m, ai, j ≠ 0).

Выходные данные

Выведите ответ по модулю 1 000 000 007 (109 + 7).

Примечание

В первом примере уравнение имеет следующий вид:

Во втором примере уравнение выглядит так:

В третьем примере уравнение принимает вид:

A. Халк

реализация *800

Доктор Брюс Беннер ненавидит своих врагов (сильнее, чем это делают другие). Как мы знаем, он с трудом общается, когда превращается в Халка. Поэтому он просит вас помочь ему с выражением своих чувств.

Халк очень любит погружение, и его чувства крайне сложные. Они состоят из n уровней, первый из них — это ненависть, второй — любовь, третий снова ненависть и так далее...

Например, для n = 1 чувства Халка выражаются как "I hate it", для n = 2 это уже "I hate that I love it", а для n = 3 — "I hate that I love that I hate it".

Помогите Брюсу выразить свои чувства на n-м уровне погружения.

Входные данные

В единственной строке входных данных записано единственное целое число n (1 ≤ n ≤ 100) — количество уровней погружения.

Выходные данные

Выведите строку, описывающую чувства доктора Бреннера.

A. Beru-такси

геометрия Перебор реализация *900

Рабочий Василий живёт в точке (a, b) координатной плоскости. Он очень торопится на работу, поэтому ему нужно как можно быстрее уехать из дома. В новом приложении он нашёл n свободных Beru-такси, про каждое из которых известны координаты на плоскости (xi, yi), а также скорость vi.

Считая, что каждый из n водителей сразу поедет к Василию по прямой и с максимальной скоростью, определите, через какое минимальное время Василий сможет сесть в Beru-такси.

Входные данные

В первой строке входных данных содержится два целых числа a и b ( - 100 ≤ a, b ≤ 100) — координаты дома Василия.

Во второй строке входных данных содержится число n (1 ≤ n ≤ 1000) — количество свободных Beru-такси.

В i-й из последующих n строк записаны три целых числа xi, yi и vi ( - 100 ≤ xi, yi ≤ 100, 1 ≤ vi ≤ 100) — координаты i-й машины и её скорость соответственно.

Несколько машин могут находиться в одной точке. Координаты машин могут совпадать с координатами дома Василия.

Выходные данные

Выведите единственное число — минимальное время, через которое какая-нибудь из машин такси окажется в точке (a, b). Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6.

А именно: пусть ваш ответ равен a, а ответ жюри — b. Проверяющая программа будет считать ваш ответ правильным, если .

Примечание

В первом примере первое такси доедет за время 2, а второе за время 1, значит ответом будет число 1.

Во втором примере такси 2 и 3 приедут одновременно.

B. Интересный напиток

Бинарный поиск дп реализация *1100

Рабочий Василий очень любит отдыхать после работы, поэтому его часто можно встретить в каком-нибудь баре. Как и все программисты, Василий очень любит напиток «Пикола», который продаётся в n различных магазинах города. Известно, что в i-м магазине бутылка напитка стоит xi монет.

Василий планирует покупать одну бутылку своего любимого напитка на протяжении q дней. Он знает, что в i-й день у него с собой будет mi монет, и теперь он хочет для каждого из дней узнать, в каком количестве магазинов он сможет купить одну бутылочку Пиколы.

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 100 000) —количество магазинов в городе, продающих любимый напиток Василия.

Во второй строке входных данных содержится n чисел xi (1 ≤ xi ≤ 100 000) — цена за одну бутылку напитка в i-м магазине.

В третьей строке входных данных содержится число q (1 ≤ q ≤ 100 000) —количество дней, в течение которых Василий планирует покупать напиток.

В следующих q строках входных данных содержатся целые числа mi (1 ≤ mi ≤ 109) — количество денег, которое есть у Василия в i-й день.

Выходные данные

Выведите q целых чисел, i-е из которых должно равняться количеству магазинов, в которых Василий может купить одну бутылочку любимого напитка в день i.

Примечание

В первом запросе ни в одном магазине Василию не хватит денег.

Во втором запросе Василию хватит денег, чтобы купить напиток в магазинах под номерами 1, 2, 3 и 4.

В третьем запросе Василию хватит денег, чтобы купить напиток в магазине под номером 1.

И в последнем запросе Василий может купить свой напиток в любом магазине.

E. Рабочая рутина

реализация Структуры данных *2500

Василий наконец-то пришёл на работу, где его ждала гора важных поручений. У Василия есть матрица из n строк и m столбцов, а также q поручений. Каждое из поручений состоит в том, чтобы поменять местами два прямоугольника в матрице.

Для каждого поручения Василию известны числа ai, bi, ci, di, hi, wi, где, ai это номер строки верхнего левого угла первого прямоугольника запроса, а bi это номер его столбца, ci это номер строки верхнего левого угла второго прямоугольника, di — номер его столбца, а hi и wi это высота и ширина прямоугольников соответственно.

Гарантируется, что прямоугольники в одном запросе не пересекаются и не касаются, то есть никакая клетка не принадлежит сразу обоим прямоугольникам, и никакие две клетки, принадлежащие разным многоугольникам, не являются соседними по стороне. Тем не менее, прямоугольники запроса могут иметь общий угол.

Василия интересует, как будет выглядеть матрица после выполнения всех поручений.

Входные данные

В первой строке входных данных записаны три целых числа n, m и q (2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000) — количество строк и столбцов в матрице, а также количество поручений, которые требуется выполнить Василию.

В следующих n строках содержится по m целых чисел vi, j (1 ≤ vi, j ≤ 109) — изначальные значения ячеек в матрице.

В каждой из следующих q строк содержится по шесть целых чисел — ai, bi, ci, di, hi, wi (1 ≤ ai, ci, hi ≤ n, 1 ≤ bi, di, wi ≤ m).

Выходные данные

Выведите n строк по m чисел в каждой — матрицу после всех изменений.

A. Фотографии Брейна

реализация *800

Маленького, но очень смелого мышонка Брейна не взяли в летнюю школу юных злодеев. Он расстроился и решил отодвинуть свои планы по захвату мира, а вместо этого податься в фотографы.

Как вам наверняка известно, самые крутые фотографии получаются на пленку (ведь тогда в хештегах можно указать #пленка).

Брейн наснимал очень много красочных фотографий на цветную и черно-белую пленки. Затем проявил и перевел их в цифровой вид. Но вот незадача! Теперь цветные и черно-белые фотографии лежат в одной папке, и, чтобы их рассортировать, нужно потратить не один час!

Так как Брейн теперь фотограф, а не программист, он просит вас помочь ему для одной фотографии определить, цветная она или черно-белая.

Фотография представляет собой матрицу размера n × m, в каждой ячейке которой хранится символ, обозначающий цвет соответствующего пикселя. Всего существует 6 цветов:

  • 'C' (cyan) — голубой
  • 'M' (magenta) — пурпурный
  • 'Y' (yellow) — желтый
  • 'W' (white) — белый
  • 'G' (grey) — серый
  • 'B' (black) — черный

Фотографию можно считать черно-белой, если в ней есть только белый, серый или черный цвет. Если же присутствует хоть один пиксель голубого, пурпурного или желтого цвета, она цветная.

Входные данные

В первой строке содержится два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и столбцов в матрице пикселей фотографии соответственно.

Далее следуют n строк, описывающих строки матрицы. Каждая из них состоит из m разделенных пробелом символов, описывающих цвета пикселей в строке. Каждый из символов в строке является одним из символов 'C', 'M', 'Y', 'W', 'G' или 'B'.

Выходные данные

В единственной строчке выведите «#Black&White» (без кавычек), если фотография черно-белая, и «#Color» (без кавычек), если цветная.

D. Персистентный шкаф

битмаски поиск в глубину и подобное реализация Структуры данных *2200

Недавно в школе Алина узнала о том, что такое персистентные структуры данных: это структуры данных, которые при внесении в них каких-то изменений сохраняют все свои предыдущие состояния и доступ к этим состояниям.

По приходу домой Алина решила придумать свою персистентную структуру данных. Долго раздумывать не пришлось: прямо перед ее кроватью располагается книжный шкаф. Он, по мнению Алины, весьма подходит в качестве персистентной структуры данных.

Шкаф состоит из n полок, на каждой из которых есть ровно m позиций для книг. Полки в шкафу Алина нумерует от 1 до n, а позиции на полках — от 1 до m. Изначально шкаф пуст, то есть на каждой позиции на каждой полке книга отсутствует.

Алина выписала подряд q операций, которые будут друг за другом производиться со шкафом. Каждая из операций может быть одного из четырех типов:

  • 1 i j — Поставить книгу в шкаф на позицию j на полке i, если ее там нет.
  • 2 i j — Убрать книгу из шкафа с позиции j на полке i, если она там есть.
  • 3 i — Поменять расположение книг на полке i на противоположное. Это означает, что со всех позиций на полке i, где книга присутствует, книгу следует убрать, а на все позиции на полке i, где книга отсутствует, книгу следует поставить.
  • 4 k — Вернуть все книги в шкафу в то состояние, в котором они находились после выполнения k-й операции. В частности, k = 0 означает, что шкаф следует привести в изначальное состояние, то есть убрать книгу с каждой позиции на каждой полке.

После выполнения каждой операции Алину интересует количество книг в шкафу. Алина учится на отлично, поэтому она без труда нашла искомые количества. Интересно, а у вас получится?

Входные данные

В первой строке содержится три натуральных числа n, m и q (1 ≤ n, m ≤ 103, 1 ≤ q ≤ 105) — размеры шкафа и количество операций соответственно.

В следующих q строках содержится описание операций в порядке их выполнения — в i-й из них содержится описание i-й операции в одном из четырех форматов, описанных в условии.

Гарантируется, что номера полок и номера позиций заданы корректно, а во всех операциях четвертого типа число k соответствует одной из операций, выполненных ранее, либо равно 0.

Выходные данные

Для каждой операции выведите в отдельной строке количество книг в шкафу после её выполнения. Ответы выводите в хронологическом порядке.

Примечание

Иллюстрация ко второму примеру из условия.

A. Циклический сдвиг букв

жадные алгоритмы Конструктив реализация Строки *1200

Вам дана непустая строка s, состоящая из строчных букв английского алфавита. Требуется ровно один раз выбрать в s непустую подстроку и сдвинуть её буквы по циклу: «z» «y» «x» «b» «a» «z», то есть заменить каждую букву подстроки на предыдущую в английском алфавите (а букву «a» на букву «z»).

Требуется определить, какую лексикографически минимальную строку можно получить после выполнения ровно одного сдвига?

Входные данные

В первой строке входных данных записана строка s (1 ≤ |s| ≤ 100 000), состоящая из строчных букв английского алфавита.

Выходные данные

Выведите лексикографически минимальную строку, которую можно получить из s, сдвинув ровно одну непустую подстроку.

Примечание

Строка s называется лексикографически меньшей, чем строка t такой же длины, если существует такое 1 ≤ i ≤ |s|, что s1 = t1, s2 = t2, ..., si - 1 = ti - 1, а si < ti.

B. Восстановление строки

жадные алгоритмы Конструктив математика реализация *1900

Любой строке s, состоящей из символов «0» и «1», можно сопоставить четвёрку чисел a00, a01, a10 и a11, где axy — количество двухсимвольных подпоследовательностей строки s, равных последовательности {x, y}.

В данной задаче вам дана четвёрка чисел a00, a01, a10 и a11, требуется найти непустую строку s, которая этой четверке чисел соответствует, либо определить, что такой строки не существует. Можно доказать, что если хотя бы один ответ существует, то найдется ответ, длина которого не превосходит 1 000 000.

Входные данные

В единственной строке входных данных записаны четыре неотрицательных целых числа a00, a01, a10 и a11, каждое из которых не превосходит 109.

Выходные данные

Если подходящая непустая строка существует, то выведите её в единственной строке выходных данных. В противном случае выведите «Impossible». Длина ответа не должна превосходить 1 000 000.

A. Соковыжималка

реализация *900

Коля хочет приготовить себе свежевыжатый апельсиновый сок. У него есть n апельсинов с размерами a1, a2, ..., an. Коля кладёт эти апельсины в соковыжималку в фиксированном порядке: сначала апельсин размера a1, затем апельсин размера a2 и так далее. В соковыжималку помещаются апельсины размером не более b, поэтому если Коля видит апельсин строго большего размера, то он его выкидывает и переходит к следующему.

У соковыжималки имеется контейнер для отходов, который переполняется, когда Коля выжмет апельсинов суммарным размером строго больше d. Как только это происходит, Коля опорожняет контейнер (даже если апельсинов больше не осталось) и продолжает выжимать сок дальше. Сколько раз Коле придется опорожнить контейнер?

Входные данные

В первой строке входных данных даны три целых числа n, b и d (1 ≤ n ≤ 100 000, 1 ≤ b ≤ d ≤ 1 000 000) — количество апельсинов, максимально допустимый размер апельсина, который помещается в соковыжималку, и параметр d, определяющий условие опорожнения контейнера для отходов.

Во второй строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1 000 000) — размеры апельсинов, перечисленные в том порядке, в котором Коля будет пробовать добавлять их в соковыжималку.

Выходные данные

Выведите единственное целое число — сколько раз Коле придётся опорожнить контейнер для отходов.

Примечание

В первом тестовом примере Коля сделает сок из двух апельсинов и после этого очистит контейнер.

Во втором тестовом примере апельсин не помещается в соковыжималку и Коля останется без сока.

B. Контрольные пункты

жадные алгоритмы реализация сортировки *1500

Спортсмен Вася участвует в соревнованиях по спортивному ориентированию. На соревновательной прямой расположены n контрольных пунктов с координатами x1, x2, ..., xn. Вася стартует из точки с координатой a. Ему необходимо посетить как минимум n - 1 контрольный пункт, чтобы финишировать. Участники могут посещать контрольные пункты в произвольном порядке.

Васю интересует, какие контрольные пункты и в каком порядке ему нужно посещать, чтобы пройденное им расстояние было минимально возможным. Помогите ему вычислить это расстояние.

Входные данные

В первой строке входных данных даны два целых числа n и a (1 ≤ n ≤ 100 000,  - 1 000 000 ≤ a ≤ 1 000 000) — количество контрольных пунктов и начальная координата Васи соответственно.

Во второй строке записаны n целых чисел x1, x2, ..., xn ( - 1 000 000 ≤ xi ≤ 1 000 000) — координаты контрольных пунктов.

Выходные данные

Выведите одно целое число — минимальное суммарное расстояние, которое нужно пройти Васе, чтобы посетить как минимум n - 1 контрольный пункт.

Примечание

В первом примере требуется посетить хотя бы два контрольных пункта. Оптимальный вариант — сначала дойти до третьего (расстояние 12 - 10 = 2), а потом до второго (расстояние 12 - 7 = 5). Итоговое расстояние равняется 2 + 5 = 7.

Во втором примере достаточно посетить один контрольный пункт, поэтому оптимально будет направиться в точку  - 10.

B. Индикатор прогресса

математика реализация *1300

Индикатор прогресса (progress bar) — это элемент графического интерфейса, отображающий на сколько выполнен тот или иной процесс на данный момент. Рассмотрим следующий вид такого индикатора:

Индикатор представляет собой n квадратиков, расположенный в ряд. Для определенности пронумеруем их натуральными числами от 1 до n слева направо. Каждый квадратик имеет насыщенность (ai для i-го квадратика), которая измеряется целым числом от 0 до k. При отображении индикатора для некоторого i (1 ≤ i ≤ n) квадратики 1, 2, ... , i - 1 имеют насыщенность k, квадратики i + 1, i + 2, ... , n имеют насыщенность 0, а насыщенность квадратика i может принимать любое значение от 0 до k.

То есть в индикаторе всегда первые несколько квадратиков имеют насыщенность k, последние несколько квадратиков имеют насыщенность 0, отличную от 0 и k насыщенность может иметь не более одного квадратика.

Степень завершенности процесса измеряется в процентах. Пусть процесс выполнен на t%. Тогда выполняется неравенство:

Пример подобного индикатора можно видеть на рисунке.

Для заданных n, k, t определите насыщенности всех квадратиков ai индикатора прогресса.

Входные данные

Через пробел перечислены 3 целых числа n, k, t (1 ≤ n, k ≤ 100, 0 ≤ t ≤ 100).

Выходные данные

Выведите n чисел. i-ое из них должно быть равно ai.

D. Пасьянс

Перебор реализация *2200

У Васи есть колода карт в 54 листа (52 стандартных карты и 2 различных джокера). Это все, что у него есть на данный момент. Чтобы не умереть со скуки, Вася раскладывает из них пасьянс.

Вася раскладывает nm карт в виде прямоугольника n × m. Если среди них есть джокеры, то Вася должен заменить их на некоторые из 54 - nm оставшихся (т. е. не лежащих на столе) карт так, чтобы джокеров не осталось. Вася может выбирать карты для замены произвольным образом. Помните, что каждая карта присутствует в колоде в единственном экземпляре. Вася старается сделать замену таким образом, чтобы пасьянс сошелся.

Вася считает, что пасьянс сошелся, если после замены джокеров существует два не пересекающихся квадрата 3 × 3, внутри каждого из которых все карты имеют либо одинаковую масть, либо попарно различные достоинства.

Определите по начальной позиции — может ли пасьянс сойтись или нет. И если да — укажите способ, которым это можно сделать.

Входные данные

В первой строке находятся целые числа n и m (3 ≤ n, m ≤ 17, n × m ≤ 52). В следующих n строках находятся по m слов в каждой. Каждое слово состоит из двух букв. Джокеры обозначаются «J1» и «J2» соответственно. Для всех остальных карт первая буква обозначает достоинство, а вторая — масть. Возможные достоинства: «2», «3», «4», «5», «6», «7», «8», «9», «T», «J», «Q», «K» и «A». Возможные масти: «C», «D», «H» и «S». Все карты различны.

Выходные данные

Если пасьянс может сойтись — в первой строке выведите «Solution exists.» без кавычек. Во второй строке выведите каким образом нужно заменить джокеры. Возможны три варианта:

  • «There are no jokers.» — если джокеров во входных данных нет.
  • «Replace Jx with y.» — если джокер один. x — его номер, а y — карта, на которую его следует заменить.
  • «Replace J1 with x and J2 with y.» — если оба джокера присутствуют во входных данных. x и y здесь — различные карты, на которые нужно заменить первого и второго джокеров соответственно.

В третьей строке выведите координаты левого верхнего угла первого квадрата 3 × 3 в формате «Put the first square to (r, c).», где r и c — строка и столбец соответственно. Аналогичным образом в четвертой строке выведите координаты второго квадрата 3 × 3 в формате «Put the second square to (r, c).».

Если решений несколько — выведите любое.

Если решений нет — в единственной строке выведите «No solution.» без кавычек.

Смотрите примеры для более точного понимания формата вывода.

Примечание

Претесты покрывают все возможные форматы вывода.

A. Ходы короля

реализация *800

На стандартной шахматной доске стоит один король. Вам задано его положение в формате "cd", где c это буква колонки от 'a' до 'h', а d это номер строки от '1' до '8'. Найдите количество ходов допустимых для короля.

Вы можете уточнить допустимые ходы короля здесь https://ru.wikipedia.org/wiki/Король_(шахматы).

Ходы короля из позиции e4
Входные данные

В единственной строке находится положение короля в формате "cd", где 'c' это буква колонки от 'a' до 'h', а 'd' это номер строки от '1' до '8'.

Выходные данные

Выведите одно целое число x — количество ходов допустимых для короля.

A. Автобус в Удайлэнд

Перебор реализация *800

Кодер ZS и Бабуин Крис едут в Удайлэнд! Чтобы туда добраться, им нужно сесть в специальный автобус IOI. В автобусе IOI всего n рядов мест. В каждом ряду присутствуют четыре места, разделенные на пары проходом. К моменту прихода ZS'а и Криса некоторые места в автобусе оказались уже занятыми.

ZS и Крис — закадычные друзья. Они непременно хотят занять пару соседних незанятых мест. Два места считаются соседними, если они находятся в одном ряду и в одной паре. Сможете ли вы помочь ZS'у и Крису определить по заданной конфигурации автобуса, где им следует сесть?

Входные данные

Первая строка содержит единственное число n (1 ≤ n ≤ 1000) — количество рядов мест в автобусе.

Далее следуют n строк. Каждая из них содержит ровно 5 символов, первые два из которых означают первую пару мест в ряду, третий символ означает проход (он всегда равен '|'), а последние два из них означают вторую пару мест в ряду.

Каждый символ, исключая проход, равен 'O' или 'X', причём 'O' означает пустое место, а 'X' означает занятое место. Изучите тестовые примеры для лучшего понимания задачи.

Выходные данные

Если Крис и ZS могут занять пару соседних незанятых мест, выведите в первой строке «YES» (без кавычек). В следующих n строках выведите конфигурацию автобуса, где символы, соответствующие местам ZS'а и Криса заменены символами '+'. Таким образом, конфигурация должна отличаться от конфигурации входных данных ровно в двух символах (во входных данных они равны 'O', в выходных данных — '+').

Если подходящей для Криса и ZS'а пары мест не существует, выведите в первую строку «NO» (без кавычек).

Если ответов несколько, выведите любой из них.

Примечание

Обратите внимание, что следующая конфигурация является некорректной для первого примера из условия, так как места должны быть в одной паре.

O+|+X

XO|XX

OX|OO

XX|OX

OO|OO

OO|XX

B. Крис и магический квадрат

Конструктив реализация *1400

Кодер ZS и Бабуин Крис пришли ко входу в Удайлэнд. У входа они увидели магическую таблицу размера n × n, заполненную целыми числами. Крис заметил, что ровно одна из ячеек таблицы пуста, и для того, чтобы войти в Удайлэнд, друзьям нужно заполнить эту ячейку целым положительным числом.

Крис пробовал заполнять ячейку различными числами, но это не помогло. Тогда Кодер ZS понял, что им нужно вставить целое положительное число такое, что все числа в ячейках образуют магический квадрат. Это значит, что ему нужно вставить такое число, что сумма чисел в каждой строке таблицы (), в каждом столбце таблицы () и в двух больших диагоналях (главной — и побочной — ) равны между собой.

Крис не знает, каким числом нужно заполнить ячейку. Помогите Крису найти подходящее целое положительное число, или определите, что это невозможно.

Входные данные

Первая строка содержит единственное целое число n (1 ≤ n ≤ 500) — количество строк и столбцов в магической таблице.

Далее следуют n строк, каждая из которых содержит n целых чисел, причём j-ое число в i-ой из них равно ai, j (1 ≤ ai, j ≤ 109 или ai, j = 0), число в i-ой строке и в j-ом столбце магической таблице. Если соответствующая ячейка пуста, ai, j равняется 0. Иначе, ai, j положительно.

Гарантируется, что существует ровно одна пара целых чисел i, j (1 ≤ i, j ≤ n), таких, что ai, j = 0.

Выходные данные

Выведите единственное положительное целое число x (1 ≤ x ≤ 1018), которым следует заполнить пустую ячейку таблицы для того, чтобы вся таблица стала магическим квадратом. Если такого целого x не существует, выведите  - 1.

Если существует несколько решений, выведите любое из них.

Примечание

В первом примере из условия пустую ячейку можно заполнить числом 9, чтобы сделать таблицу магическим квадратом. Действительно,

Сумма чисел в каждой строке равна:

4 + 9 + 2 = 3 + 5 + 7 = 8 + 1 + 6 = 15.

Сумма чисел в каждом столбце равна:

4 + 3 + 8 = 9 + 5 + 1 = 2 + 7 + 6 = 15.

Сумма чисел на диагоналях равна:

4 + 5 + 6 = 2 + 5 + 8 = 15.

В третьем примере из условия невозможно заполнить пустую ячейку числом так, чтобы сделать таблицу магическим квадратом.

A. Мемори и вороны

математика реализация *800

В ряд записаны n целых чисел b1, b2, ..., bn. Для всех i от 1 до n специальная ворона вычисляет значение ai по следующей процедуре:

  • Ворона устанавливает ai равным 0.
  • Затем ворона прибавляет bi к ai, потом вычитает bi + 1, потом прибавляет bi + 2 и так далее. Формально: ai = bi - bi + 1 + bi + 2 - bi + 3....

Мемори собрала с ворон значения a1, a2, ..., an и теперь хочет восстановить изначальную последовательность b1, b2, ..., bn, сможете ли вы помочь ей в этом?

Входные данные

В первой строке входных данных записано целое число n (2 ≤ n ≤ 100 000) — количество чисел в обеих последовательностях.

В следующей строке записаны n целых чисел, i-е из которых равняется ai ( - 109 ≤ ai ≤ 109).

Выходные данные

Выведите n целых чисел, соответствующих последовательности b1, b2, ..., bn. Гарантируется, что ответ единственный и помещается в 32-битный целочисленный тип.

Примечание

В первом примере вороны сообщают значения 6,  - 4, 8,  - 2 и 3, для индексов 1, 2, 3, 4 и 5 соответственно. Можно проверить, что исходная последовательность 2, 4, 6, 1, 3 дала бы именно такие ответы. Например, 6 = 2 - 4 + 6 - 1 + 3, а  - 4 = 4 - 6 + 1 - 3.

Во втором примере последовательность 1,  - 3, 4, 11, 6 соответствует информации, полученной от ворон. Например, 5 = 11 - 6, а 6 = 6.

B. Мемори и трезубец

реализация Строки *1100

Мемори гуляет по декартовой плоскости, начиная в точке начала координат. У неё есть последовательность действий s:

  • Символ «L» означает шаг на единицу влево.
  • Символ «R» означает шаг на единицу вправо.
  • Символ «U» означает шаг на единицу вверх.
  • Символ «D» означает шаг на единицу вниз.

Мемори хочет, чтобы, последовательно исполнив все команды, она снова оказалась в точке начала координат. У неё есть специальный трезубец, который за одно применение может изменить любой символ в строке s на один из символов «L», «R», «U» или «D». Однако пользоваться трезубцем нелегко, поэтому Мемори хочет минимизировать количество его применений или определить, что добиться желаемого невозможно в принципе.

Входные данные

В единственной строке входных данных записана строка s (1 ≤ |s| ≤ 100 000) — последовательность инструкций, которая есть у Мемори.

Выходные данные

Если невозможно изменить строку так, чтобы Мемори заканчивала путешествие в точке начала координат, то выведите -1 в единственной строке выходных данных. В противном случае выведите минимальное требуемое количество изменений.

Примечание

В первом примере Мемори сначала идёт направо, потом снова направо, затем вверх. Можно показать, что эту последовательность инструкций невозможно изменить таким образом, чтобы она возвращала Мемори в начало координат.

Во втором примере Мемори сначала идёт вверх, потом вниз, потом вверх, потом направо. Одним из возможных решений является изменение строки s на «LDUR», для этого потребуется внести только одно изменение.

A. Соня и запросы

реализация Структуры данных *1400

Сегодня сова Соня выучила длинные числа и сразу же позвала в гости своих друзей, чтобы продемонстрировать им свои навыки. У Сони есть мультимножество с числами, изначально пустое. Друзья сделают t запросов, каждый одного из трёх видов:

  1.  +  ai — добавить целое неотрицательное число ai в мультимножество. Обратите внимание, что, поскольку у Сони мультимножество, в нём может содержаться несколько одинаковых чисел.
  2.  -  ai — удалить целое неотрицательное число ai из мультимножества. Гарантируется, что такое число есть в мультимножестве. Если в мультимножестве было несколько экземпляров числа ai, то при выполнении данной операции удаляется только один из них.
  3. ? s — ответить, сколько чисел в мультимножестве (включая повторы) подходит под шаблон s, состоящий из 0 и 1. В шаблоне 0 соответствует чётным цифрам, а 1 — нечётным. Число x подходит под шаблон s, если чётность i-й справа цифры числа, записанного в десятичной системе, подходит под i-ю справа цифру шаблона. При этом если шаблон короче соответствующего числа, то он дополняется нулями слева. Аналогично, если десятичная запись числа короче шаблона, то оно также дополняется нулями слева.

Например, под шаблон s = 010 подходят числа 92, 2212, 50 и 414, но не подходят числа 3, 110, 25 и 1030.

Входные данные

В первой строке входных данных записано число t (1 ≤ t ≤ 100 000) — количество операций, которые предстоит выполнить Соне.

Следующие t строк описывают запросы в порядке их поступления. В начале i-й из этих строк записан символ ci — тип операции данного запроса. Если ci равен «+» или «-», то после него через пробел записано целое число ai (0 ≤ ai < 1018), которое не может иметь лидирующие нули (кроме, собственно, числа 0, записывающегося как «0»). Если же ci равен «?», то после него через пробел записана последовательность из нулей и единиц, количество которых не превосходит 18, определяющая соответствующий данному запросу шаблон.

Гарантируется, что во входных данных содержится хотя бы один запрос «?».

Гарантируется, что перед удалением числа хотя бы один его экземпляр присутствовал в мультимножестве.

Выходные данные

Для каждого запроса третьего типа выведите количество подходящих чисел в мультимножестве. Каждое число учитывается количество раз, равное количеству вхождений в мультимножество в данный момент времени.

Примечание

Рассмотрим, какие числа подходят под операции третьего типа, пронумерованные в порядке их появления во входным данных:

  1. 1 и 241.
  2. 361.
  3. 101 и 361.
  4. 361.
  5. 4000.

A. Встреча друзей

математика реализация *1100

Сегодня в большом лесу произойдёт долгожданное событие — ёжик Филя приедет погостить к своей подруге Соне!

Соня — сова, поэтому она днём спит, а в с минуты l1 по r1 включительно она готова развлекать гостя. Также в течение минуты k Соня отвлекается на чистку перьев и забывает обо всём. В этот момент она не может развлекать Филю.

Филя очень много работает, поэтому планирует приехать в гости с минуты l2, по минуту r2 включительно.

Определите, сколько минут Филя и Соня смогут провести вместе.

Входные данные

В единственной строке входных данных записаны целые числа l1, r1, l2, r2 и k (1 ≤ l1, r1, l2, r2, k ≤ 1018, l1 ≤ r1, l2 ≤ r2) — границы отрезков времени, когда друзья могут уделить время друг другу, и минута, в течение которой Соня чистит перья.

Выходные данные

Выведите одно целое число — количество минут, которые Соня и Филя смогут провести вместе.

Примечание

В первом примере друзья общаются в течение 9-й и 10-й минут.

Во втором примере друзья общаются с 50-й по 74-ю минуту и затем с 76-й по 100-ую.

B. Филя и задание

реализация сортировки *1200

Сегодня ёжик Филя впервые пошёл в школу! Учительница дала ему домашнее задание, с которым ёжик, к сожалению, не может справиться без вашей помощи.

У Фили есть массив целых неотрицательных чисел a1, a2, ..., an. Он сначала один раз выбирает целое положительное число x, после чего он к некоторым числам массива прибавляет данное x (не более одного раза к каждому элементу массива), из некоторых вычитает x (не более одного раза к каждому элементу массива), а некоторые числа оставляет нетронутыми. Нужно сказать, можно ли таким образом сделать массив из одинаковых чисел.

Филя хочет знать, можно ли так выбрать x, а затем совершить такие действия, что в итоге массив будет состоять из одинаковых чисел.

Входные данные

В первой строке входных данных содержится число n (1 ≤ n ≤ 100 000) — количество чисел в массиве Фили. Во второй строке содержится n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 109) — элементы массива.

Выходные данные

Если c помощью описанной в условии операции невозможно сделать все числа в массиве одинаковыми, то выведите «NO» (без кавычек). В противном случае выведите «YES» (без кавычек).

Примечание

В первом примере следует выбрать x = 1, после чего прибавить его к первому и последнему элементам и вычесть из второго и третьего.

A. Чокнутый компьютер

реализация *800

Кодер ZS кодит на чокнутом компьютере. Если не вводить слова на протяжении c секунд, то все, что было введено, исчезает!

Формально, если слово ввели в секунду a, а затем следующее в секунду b, то если b - a ≤ c, ко всем словам на экране просто добавляется новое слово. Если же b - a > c, то все, что было на экране, пропадает, и после этого только что введенное слово появляется на экране.

К примеру, если c = 5, а слова вводятся в секунды 1, 3, 8, 14, 19, 20, то в секунду 8 на экране будут 3 слова. После этого все исчезает в секунду 13, так как ничего введено не было. В секунды 14 и 19 еще два слова вводятся, и, наконец-то, в секунду 20 вводится еще одно слово и всего 3 слова присутствуют на экране.

Вам даны моменты времени, когда Кодер ZS вводил каждое слово. Определите, сколько слов присутствует на экране после того, как он закончил вводить все слова.

Входные данные

В первой строке содержится два целых числа n и c (1 ≤ n ≤ 100 000, 1 ≤ c ≤ 109) — количество слов, введенных Кодером ZS, и задержка чокнутого компьютера соответственно.

Следующая строка содержит n целых чисел t1, t2, ..., tn (1 ≤ t1 < t2 < ... < tn ≤ 109), где ti означает секунду, когда Кодер ZS ввел i-ое слово.

Выходные данные

Выведите единственное целое положительное число — количество слов на экране после того, как все n слов были введены, иными словами, в секунду tn.

Примечание

Первый пример разобран в условии.

Во втором примере из условия, после введения первого слова в секунду 1, оно исчезает, так как в следующее слово вводится в секунду 3 и 3 - 1 > 1. Аналогично, только 1 слово будет присутствовать на экране в секунду 9. Затем вводят слово в секунду 10, так что на экране останутся два слова, так как раннее из них не исчезнет, ведь 10 - 9 ≤ 1.

C. Домашняя работа по зельеварению

реализация сортировки *1200

Харри Хоттер, Роналдо, Герман и их друзья приступили к занятиям в новом учебном году в MDCS школе Ораторства и Страдания. Сейчас они очень счастливы встретить друг друга спустя долгое время. Солнышко сияет, птички поют, цветы распускают свои бутоны, а преподаватель зельеварения, профессор Сноб такой же надутый как и всегда. Из-за своей внутренней злобы и разочарования в жизни он задал ученикам много домашней работы.

Каждому из n учеников была дана ровно одна задача. Некоторые студенты справляются с задачами быстрее, чем другие. Они хотят перераспределить задания таким образом, что каждому из них по-прежнему достанется ровно одна задача. У каждого студента есть его уровень лени, а у каждой задачи есть своя сложность. Профессор Сноб пытается повышать рабочую этику, поэтому каждому ученику была выдана задача, сложность которой равна уровню лени данного ученика. Оба значения определяются последовательностью a, где ai равняется одновременно уровню лени и сложности задания, полученного студентом i.

Время, которое потребуется студенту на выполнение задания, равняется произведению его уровня лени на сложность задачи. Студентам интересно, чему равно минимальное суммарное время выполнения заданий, если они перераспределят их оптимальным способом. При этом каждый студент должен сделать ровно одно задание. Ответ выведите по модулю 10 007.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100 000) — количество заданий. В последующих n строках записано по одному целому числа ai (1 ≤ ai ≤ 100 000), означающему уровень лени и сложность задачи i-го студента.

Выходные данные

Выведите минимальное суммарное время выполнения заданий по модулю 10 007.

Примечание

В первом примере, если ученики поменяются задачами, то время выполнения составит 3 + 3 = 6.

A. Ефим и странная оценка

дп математика реализация *1700

Ефим только что получил оценку за контрольную работу. Сначала он расстроился, увидев её, поскольку ожидал увидеть более приятный результат. Но затем он придумал хитрый план, как улучшить свой балл.

Ефим учится в необычной школе, так что оценка может выражаться очень длинным дробным числом. За одну секунду Ефим может попросить учителя округлить результат в произвольном месте после запятой (в том числе округлить до целого числа).

До конца перемены осталось t секунд, так что Ефиму нужно незамедлительно действовать. Помогите ему определить максимальный результат, который он сможет получить, потратив на это не более t секунд. Обратите внимание, что Ефим может использовать не все t секунд, в том числе он может вообще ни разу не попросить учителя округлить оценку.

В данной задаче используются классические правила округления: если выполняется округление до разряда n, то смотрят на цифру, стоящую в разряде n + 1. Если эта цифра меньше 5, то разряд n остаётся без изменений, а все последующие цифры заменяются на 0 (и отбрасываются). Если же в разряде n + 1 стоит цифра 5 или больше, то цифра в разряде n увеличивается на 1, выполняются все необходимые переносы (если требуется), все последующие разряды заменяются на 0. В конце все нули обязательно отбрасываются.

Например, если число 1.14 округлить до первого разряда после запятой, то получится 1.1, а если если округлить до целых число 1.5, то получится 2. Округление числа 1.299996121 до пятого знака после запятой даст число 1.3.

Входные данные

В первой строке входных данных содержатся два целых числа n и t (1 ≤ n ≤ 200 000, 1 ≤ t ≤ 109) — длина оценки, полученной Ефимом, и количество секунд до конца перемены соответственно.

Во второй строке записана сама оценка. Гарантируется, что оценка является положительным числом, в ней присутствует хотя бы одна цифра после запятой и её запись не заканчивается на 0.

Выходные данные

Выведите максимальный результат, который может получить Ефим. Не выводите незначащие нули.

Примечание

В первых двух примерах изначальная оценка Ефима 10.245. За первую секунду Ефим может получить 10.25, а за вторую — 10.3. Обратите внимание, что ответ 10.30 будет засчитан как неверный.

В третьем примере Ефиму невыгодно округлять полученную оценку.

A. Витя в деревне

реализация *1100

Летом Витя всегда гостит у своей бабушки в деревне. И вот одним прекрасным летом у Вити вскочила большая бородавка. Все бабушки знают, что бородавки нужно сводить на убывающую луну. Поэтому Вите необходимо узнать, когда луна будет убывать.

Лунный цикл длится 30 дней. Размер видимой части луны (в Витиных условных единицах) во время каждого из дней цикла равен 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, после чего цикл повторяется, то есть после второго вхождения 1 снова следует 0.

Поскольку интернета в деревне нет, Витя в течение n последовательных дней смотрел на луну и записывал размер видимой части луны в своих условных единицах. Помогите Вите узнать, на (n + 1)-й день луна уменьшится, увеличится или это невозможно определить.

Входные данные

В первой строке входных данных задано число n (1 ≤ n ≤ 92) — количество дней, в течение которых Витя записывал размер видимой части луны.

Во второй строке входных данных находятся n чисел ai (0 ≤ ai ≤ 15) — записи Вити.

Гарантируется, что входные данные корректны.

Выходные данные

Если Витя может быть уверен, что размер видимой части луны в день n + 1 будет меньше размера луны в день n, то выведите «DOWN» в единственной строке выходных данных. Если он может быть уверен, что размер видимой части луны увеличится, то выведите «UP». Если определить, что произойдёт с луной, невозможно, то выведите -1.

Примечание

В первом примере размер луны на следующий день станет равным 8, поэтому ответ «UP».

Во втором примере размер луны на следующий день станет равным 11, поэтому ответ «DOWN».

В третьем примере нельзя определить размер луны на следующий день, потому что он может стать равным 7 или 9, поэтому ответ -1.

B. Ini-файл

*особая задача реализация *2200

С помощью ini-файлов в Windows записываются настройки приложений. Каждая строка ini-файла либо определяет некоторое значение, либо начинает секцию.

Строка, определяющая значение, имеет вид "key=value", где key — это название некоторого свойства, а value — его значение. По обе стороны key и value могут быть пробелы, которые стоит игнорировать.

Строка, начинающая секцию, имеет вид "[section]". Эта строка обозначает, что все последующие строки вида "key=value" определяют свойства для секции section. Разумеется, следующая строка начала секции меняет текущую секцию. В строках этого вида тоже могут встречаться незначащие пробелы (до и после любой квадратной скобки).

Cтроки, у которых первый непробел является символом ";", следует игнорировать.

Ваша задача, написать программу, которая обработает заданный корректный ini-файл и выведет его в специальном виде:

  • сначала следует разместить строки вида "key=value", для которых секция не определена;
  • затем следует разместить все секции в лексикографическом (алфавитном) порядке их названий;
  • внутри каждого блока, описанного в двух предыдущих пуктах, строки вида "key=value" следует упорядочить лексикографически по "key";
  • если существует более одной пары "key=value" с одинаковым "key" для одной секции (или с неопределенной секцией), то следует выводить только последнее вхождение (для порядка определенного входными данными);
  • все незначащие пробелы и переводы строк следует удалить.
Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 510) — количество строк в данном ini-файле.

Далее в n строках описан корректный ini-файл. Значения section, key и value состоят только из латинских букв, цифр и символов "." и "-".

Длины всех строк не превышают 255 символов и не меньше 1 символа, суммарная длина всех строк не превосходит 10000.

Выходные данные

Выведите заданный ini-файл в требуемом виде.

H. Переворот

*особая задача реализация *1600

14ое марта — день числа π = 3.1415926...

В честь этого дня организация Goofy Nephews Unity (GNU) хочет выпустить самую быструю математическую программу в 1:59:26 утра.

Сейчас 1:11:11 утра, а команда еще даже не запускала свою программу. Из-за нехватки времени они хотят проверить свою программу с помощью нескольких запросов. Они наняли Ормизда, одного из лучших программистов в мире, и поручили ему написать проверяющую программу. Но у Ормизда есть дела поважнее, поэтому он просит вас написать небольшую часть проверочной программы. Ваша задача — написать программу, которая переворачивает числа.

Переворачивать числа просто. Например, после переворота 1234 получается 4321.

Учтите, что если число отрицательное, после переворота оно остается отрицательным. Например, после переворота  - 123 превращается в  - 321.

Также вы должны удалять все лидирующие нули до и после переворота.

Входные данные

В первой строке записано целое число n. Оно строго меньше 101000 по модулю. Это число может содержать лидирующие нули — в этом случае их требуется опускать. Гарантируется, что во входных данных меньше 10001 символа.

Выходные данные

Выведите одно число — результат переворота заданного числа. Не выводите лидирующие нули.

I. Бесполезные числа

*особая задача реализация *1500

Неотрицательное целое число a является делителем неотрицательного целого числа b тогда и только тогда, когда существует положительное целое число c, такое что a × c = b.

Генерал Сурен разделяет неотрицательные целые числа на 3 группы:

  • Число счастливое (happy), если оно делится хотя бы на одну из своих цифр, но не на любую.
  • Число еще счастливее (happier), если оно делится на любую свою цифру.
  • Число грустное (upset), если оно не делится ни на одну свою цифру.

Генерал Сурен просит вас определить тип заданного числа.

Входные данные

В первой строке записано одно неотрицательное число n (1 ≤ n ≤ 108).

Выходные данные

Выведите маленькими буквами тип числа: happy, happier или upset.

Примечание

Во втором тесте: 29994 делится только на 2.

В третьем тесте: 23 — простое число.

E. Шифр

реализация *3100

Недавно Боря увидел большое электронное табло. На табло зашифровано некоторое число. Само число состоит из n разрядов, каждый из которых записан с помощью маленькой латинской буквы.

Рядом с табло находится табличка, которая описывает схему шифрования. Так для каждого разряда i и цифры j известен символ c, которым она кодируется. При этом разным цифрам могут соответствовать одинаковые буквы.

Каждую секунду число, которое кодируется на табло, увеличивается на один. А через секунду после того, как все n цифр числа, зашифрованного на табло, оказываются равны девяти, табло издает очень громкий звук.

Андрей знает, какое число было зашифровано на табло в самом начале. Ему стало интересно, через сколько секунд Боря сможет точно определить это число. Считайте, что Боря абсолютно точно может замерять время, а также, что первый раз число на табло поменяется ровно через секунду после того, как Боря увидел табло.

Входные данные

В первой строке задано целое число t (1 ≤ t ≤ 100) — количество тестовых примеров. Описание каждого теста начинается с числа n (1 ≤ n ≤ 18) — количества символов в зашифрованном числе. В следующей строке записано n цифр без пробелов (возможно с ведущими нулями) — зашифрованное число. В следующих n строках записано по десять символов. Если j-й символ в строке i равен c, то цифра j - 1 в i-м разряде (более старшие разряды описаны раньше) кодируется буквой c.

Выходные данные

Для каждого тестового примера в отдельной строке выведите одно целое число без ведущих нулей — минимальное количество секунд, которое необходимо, чтобы расшифровать число.

A. Одномерный японский кроссворд

реализация *800

Не так давно Адалтик узнал, что такое японский кроссворд. Японский кроссворд — это изображение, представляемое таблицей размера a × b квадратных клеток, каждая из которых имеет либо белый, либо черный цвет. Слева от строк и сверху от столбцов располагаются числа, которые шифруют данную строку или столбец. Количество чисел показывает, сколько групп чёрных клеток находятся в соответствующей строке или столбце, а сами числа — сколько идущих подряд чёрных клеток содержит каждая из этих групп (подробнее про японский кроссворд можно прочесть в Википедии по ссылке https://ru.wikipedia.org/wiki/Японский_кроссворд).

Адалтик счел общий случай японского кроссворда слишком сложным и нарисовал строку из n клеток (то есть японский кроссворд размера 1 × n), которую он хочет зашифровать числами так же, как в японском кроссворде.

Пример шифрования одной строки японского кроссворда.

Помогите Адалтику найти числа, шифрующие нарисованную им строку кроссворда.

Входные данные

В первой строке содержится целое положительное число n (1 ≤ n ≤ 100) — длина строки. Во второй строке содержится строка, состоящая из n символов 'B' или 'W', ('B' соответствует черной клетке, 'W' — белой клетке в строке, нарисованной Адалтиком).

Выходные данные

В первой строке должно содержаться целое неотрицательное число k — количество чисел, шифрующих строку, то есть количество групп черных клеток в строке.

Во второй строке должно содержаться k целых чисел, шифрующих строку, то есть соответствующих размерам групп последовательных черных клеток в порядке слева направо.

Примечание

Последний пример из условия соответствует рисунку из условия.

B. Пароли

математика реализация сортировки Строки *1100

Ваня собирается зайти на свой любимый сайт Codehorses. Всего Ваня использует n различных паролей для сайтов, однако, какой именно пароль он указывал при регистрации на Codehorses, он не помнит.

Ваня будет вводить пароли в порядке неубывания их длин, а пароли одинаковой длины — в произвольном порядке. Как только Ваня введет правильный пароль, он сразу окажется авторизован на сайте. Ваня не будет вводить один и тот же пароль несколько раз.

На ввод любого пароля Ваня тратит одну секунду. Однако, если Ваня k раз введет неправильный пароль, то следующую попытку ввода он сможет совершить только через 5 секунд. Каждую попытку ввода Ваня совершает незамедлительно, то есть всегда, когда у него есть возможность вводить очередной пароль, Ваня этим занят.

Сообщите, сколько секунд потребуется Ване, чтобы зайти на Codehorses, в лучшем для него случае (если он потратит минимально возможное количество секунд) и в худшем для него случае (если он потратит максимально возможное количество секунд).

Входные данные

В первой строке входных данных содержится два целых числа n и k (1 ≤ n, k ≤ 100) — количество паролей Вани и количество неудачных попыток, после которых доступ к сайту блокируется на 5 секунд.

В следующих n строках содержатся пароли, по одному в строке — различные непустые строки, состоящие из букв латинского алфавита и цифр. Длина каждого пароля не превосходит 100 символов.

Заключительная строка входных данных содержит пароль Вани к Codehorses. Гарантируется, что пароль Вани к Codehorses совпадает с одним из n его паролей.

Выходные данные

Выведите два целых числа — время (в секундах), которое потребуется Ване для авторизации на Codehorses в лучшем для него случае и худшем для него случае соответственно.

Примечание

Рассмотрим первый тест. Так как все пароли одинаковой длины, Ваня может ввести правильный пароль как первым, так и последним. Если он вводит правильный пароль первым, то он тратит на это ровно 1 секунду. Следовательно, ответ в лучшем случае равен 1. Если же он вводит его последним, до этого он введёт остальные 4 пароля. Он потратит 2 секунды на ввод первых 2 неправильных паролей, после этого ему придется подождать 5 секунд, так как он ввёл 2 неправильных пароля. Потом он потратит ещё 2 секунды на ввод 2 неправильных паролей, опять подождёт 5 секунд и наконец введёт верный пароль, потратив на это ещё 1 секунду. Итого в худшем случае он сможет авторизоваться за 15 секунд.

Рассмотрим второй тест. Как бы Ваня ни вводил пароли, он не сможет добиться того, чтобы доступ к сайту заблокировался. Так как необходимый пароль имеет длину 2, Ваня в любом случае введёт сначала все пароли длины 1, потратив на это 2 секунды. Затем, в лучшем случае, он сразу введёт необходимый пароль, и ответ в лучшем случае будет равен 3, а в худшем случае сначала введёт неверный пароль длины 2, и только потом верный, и потратит 4 секунды.

A. Сломанные часы

Перебор реализация *1300

У вас есть сломанные часы, про которые известно, в 12- или 24-часовом формате HH:MM они должны показывать время. В 12-часовом формате часы изменяются в пределах от 1 до 12, а в 24-часовом — от 0 до 23. И в том, и в другом формате минуты изменяются от 0 до 59.

Вам задано время в формате HH:MM, которое показывают сломанные часы. Исправьте в нём минимальное количество цифр так, чтобы часы стали показывать верное время в заданном формате.

Например, если часы показывают 00:99, то, чтобы сделать время корректным в 24-часовом формате, достаточно заменить первую цифру 9 на цифру 3 и получить 00:39. Однако, чтобы получить корректную запись времени в 12-часовом формате, придётся дополнительно исправить как минимум две цифры, например дополнительно заменить второй 0 на 1 и получить 01:39.

Входные данные

В первой строке входных данных находится одно из чисел 12 или 24, обозначающее соответственно 12- или 24-часовой формат, в котором должны работать часы.

Во второй строке входного файла дано время, которое показывают часы, в формате HH:MM, то есть первые два символа описывают количество часов, а вторые два — количество минут.

Выходные данные

В единственной строке выходного файла выведите время в формате HH:MM, которое удовлетворяет условиям задачи и отличается от исходного в минимальном количестве позиций. Если подходящих решений несколько, можете вывести любое.

B. Стихотворный шаблон

реализация Строки *1200

Вам задан текст, состоящий из n строк. Каждая строка содержит несколько слов, состоящих из строчных английских букв, разделённых пробелами.

Назовём слогом строчку, содержащую ровно одну гласную букву и некоторое (возможно, нулевое) количество согласных. Гласными буквами принято считать «a», «e», «i», «o», «u», «y».

Каждое слово в тексте, в котором есть хотя бы одна гласная буква, можно разбить на слоги. При этом каждая буква слова должна попасть ровно в один слог. Например, слово «mamma» можно разбить на слоги как «ma» и «mma», «mam» и «ma», и «mamm» и «a». Слова, целиком состоящие из согласных букв, будем игнорировать.

Стихотворным шаблоном для данного текста называется последовательность p1, p2, ..., pn из n неотрицательных целых чисел. Текст подходит под стихотворный шаблон, если для каждого i от 1 до n можно разбить все слова в i-й строке на слоги так, чтобы суммарное количество слогов равнялось бы pi.

Определите, подходит ли заданный текст под заданный стихотворный шаблон.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 100) — количество строк в тексте.

Во второй строке даны числа p1, ..., pn (0 ≤ pi ≤ 100) — стихотворный шаблон для данного текста.

В следующих n строках дан сам текст. Текст состоит из строчных букв английского алфавита и пробелов. Гарантируется, что все строки непусты, каждая строка начинается и заканчивается буквой, слова разделены ровно одним пробелом. Длина каждой строки не превышает 100 символов.

Выходные данные

В единственной строке выведите «YES» (без кавычек), если текст подходит под заданный шаблон, и «NO» в противном случае.

Примечание

В первом примере слова можно разбить на слоги следующим образом:

in-tel
co-de
ch al-len-ge

Поскольку в слове «ch» в третьей строке нет ни одной гласной буквы, оно игнорируется при подсчете количества слогов. В итоге мы получаем по 2 слога в первых двух строках и 3 слога в третьей.

F. Циклический шифр

китайская теорема об остатках реализация Структуры данных теория чисел *2800

Вам задан набор из n последовательностей. Каждая из последовательностей состоит из целых положительных чисел, не превосходящих m. Все числа внутри одной последовательности различны, но одно и то же число может встречаться в разных последовательностях. Длина i-й последовательности равна ki.

Раз в секунду числа в каждой последовательности циклически сдвигаются на одну позицию влево, то есть числа на позициях i > 1 переходят на позиции i - 1, а первое число становится последним.

Каждую секунду будем выписывать первое число каждой последовательности в новый массив. Для всех чисел 1 до m найдем самый длинный подотрезок этого массива, все элементы которого равны этому числу.

Будем проделывать эту операцию на протяжении 10100 секунд. Для каждого числа от 1 до m определите самый длинный из подотрезков, найденных за это время.

Входные данные

В первой строке входных данных записаны два числа n и m (1 ≤ n, m ≤ 100 000) — количество последовательностей и максимальное число, которое может встретиться в последовательностях.

В следующих n строках даны сами последовательности. В каждой строке сначала записано число ki (1 ≤ ki ≤ 40) — количество чисел в последовательности, а затем ещё ki целых положительных чисел — сама последовательность. Гарантируется, что числа в каждой последовательности попарно различны и не превосходят m.

Суммарная длина всех последовательностей не превосходит 200 000.

Выходные данные

Выведите m чисел, i-е из которых равняется длине самого большого подотрезка, все числа в котором равны i и который встретился в выписываемом массиве за первые 10100 секунд.

A. Новый год: встреча друзей

математика реализация сортировки *800

В Лайнландии на прямой Ox живут три друга. Первый живет в точке x1, второй живет в точке x2, а третий — в точке x3. Они собираются вместе встретить Новый Год, для чего им необходимо всем оказаться в одной точке. Какое минимальное суммарное расстояние им надо пройти, чтобы собраться вместе в одной точке и встретить Новый год?

Гарантируется, что правильный ответ всегда является целым числом.

Входные данные

В первой строке следует три различных целых числа x1, x2 и x3 (1 ≤ x1, x2, x3 ≤ 100) — координаты домов первого, второго и третьего друга.

Выходные данные

Выведите единственное целое число — минимальное суммарное расстояние, которое нужно пройти друзьям, чтобы собраться вместе.

Примечание

В первом тестовом примере друзья должны встретиться в точке 4. Таким образом, первый друг должен пройти расстояние 3 (от точки 7 до точки 4), второй друг также должен пройти расстояние 3 (от точки 1 до точки 4), а третий друг не должен никуда идти, так как живёт в точке 4.

B. Анализ текстового документа

Разбор выражений реализация Строки *1100

Современные текстовые редакторы обычно показывают некоторую информацию для текущего редактируемого документа — например, количество слов, количество страниц или количество знаков.

В этой задаче вам предстоит реализовать похожую функциональность.

Задана строка, состоящая только из:

  • прописных и строчных букв английского алфавита,
  • символов подчёркивания (они используются в качестве разделителей),
  • круглых скобок (как открывающих, так и закрывающих).

Гарантируется, что каждая открывающая скобка имеет парную закрывающую, идущую следом. Аналогично, каждая закрывающая скобка имеет парную открывающую, которая расположена до неё. Для каждой пары соответствующих скобок верно, что между ними нет каких-либо других скобок. Иными словами, каждая скобка в строке входит в пару «открывающая-закрывающая», и такие пары не вкладываются друг в друга.

Например, допустимой строкой является: «_Hello_Vasya(and_Petya)__bye_(and_OK)».

Словом называется нерасширяемая последовательность подряд идущих букв, то есть последовательность букв, такая что слева и справа от неё находится скобка или символ подчёркивания, или соответствующий символ отсутствует. Пример выше содержит семь слов: «Hello», «Vasya», «and», «Petya», «bye», «and» и «OK». Напишите программу, которая найдет:

  • длину самого длинного слова вне скобок (выведите 0, если слов вне скобок нет),
  • количество слов внутри скобок (выведите 0, если слов внутри скобок нет).
Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 255) — длина заданной строки. Во второй строке записана строка, состоящая только из строчных и прописных английских букв, открывающих и закрывающих скобок, а также символов подчёркивания.

Выходные данные

Выведите два числа:

  • длину самого длинного слова вне скобок (выведите 0, если слов вне скобок нет),
  • количество слов внутри скобок (выведите 0, если слов внутри скобок нет).
Примечание

В первом примере слова «Hello», «Vasya» и «bye» записаны вне скобок, а слова «and», «Petya», «and» и «OK» — внутри. Обратите внимание, что слово «and» встречается дважды, и учитывать в ответе его тоже следует два раза.

D. Озёра в Берляндии

графы жадные алгоритмы поиск в глубину и подобное реализация снм *1600

Карта Берляндии представляет собой прямоугольник размера n × m, состоящий из клеток размера 1 × 1. Каждая из клеток карты является либо сушей, либо водой. Со всех краёв Берляндия омывается океаном.

Озёрами называются такие связные по сторонам максимальные по включению области из клеток с водой, которые не имеют общих границ с океаном. Другими словами, озеро — это область клеток с водой, такая что из любой клетки можно добраться до любой другой, не покидая озера, двигаясь только между соседними по стороне клетками, никакая из клеток не расположена на границе прямоугольника и нельзя добавить ещё одну клетку с водой, так что по-прежнему можно будет добраться от любой клетки до любой другой.

Перед вами стоит задача засыпать землей минимальное количество клеток таким образом, чтобы в Берляндии стало ровно k озёр. Изначально на карте находятся не менее k озер.

Входные данные

В первой строке входных данных записаны три целых положительных числа n, m и k (1 ≤ n, m ≤ 50, 0 ≤ k ≤ 50) — размеры карты и количество озёр, которые должны остаться на карте.

В следующих n строках следует по m символов — описание карты. Каждый из символов — либо «.» (означает, что соответствующая клетка это участок с водой), либо «*» (означает, что соответствующая клетка — это участок суши).

Гарантируется, что на данной карте не менее k озер.

Выходные данные

В первую строку выведите минимальное количество клеток, которые из воды нужно превратить в сушу.

В следующие n строк выведите m символов — карта после внесения в неё изменений. Формат должен строго соответствовать формату карты из входных данных (размеры карты выводить не нужно). Если решений несколько, выведите любое из них.

Гарантируется, что ответ всегда существует.

Примечание

В первом примере всего содержится два озера — первое состоит из клеток (2, 2) и (2, 3), а второе состоит из клетки (4, 3). Выгодно засыпать второе озеро, так как оно наименьшее по размеру. Обратите внимание, что участок воды в нижнем левом углу поля не является озером, так как этот участок граничит с океаном.

F. st-остов

графы жадные алгоритмы реализация снм *2300

Вам задан связный неориентированный граф, состоящий из n вершин и m рёбер. Каждое ребро соединяет две различные вершины, любую пару вершин соединяет не более одного ребра.

Также вам даны две различные вершины s и t, а также две величины ds и dt. Перед вами стоит задача построить любой остов заданного графа (обратите внимание, что граф невзвешенный), у которого степень вершины s не превышает ds, а степень вершины t не превышает dt, либо сообщить, что это невозможно.

Остов (покрывающее дерево) графа G — такой его подграф, который является деревом и содержит все вершины графа G. Иными словами, это связный граф, содержащий n - 1 ребро и полученный из заданного графа G удалением некоторых рёбер.

Степенью вершины называется число инцидентных этой вершине рёбер.

Входные данные

В первой строке следует два целых числа n и m (2 ≤ n ≤ 200 000, 1 ≤ m ≤ min(400 000, n·(n - 1) / 2)) — количество вершин и количество рёбер соответственно.

В следующих m строках следует описание рёбер графа. В каждой из строк находятся по два целых числа u и v (1 ≤ u, v ≤ n, u ≠ v) — номера вершин, соединённых очередным ребром. Гарантируется, что в графе не содержится петель и кратных рёбер, а также то, что граф связный.

В последней строке следуют четыре целых числа s, t, ds и dt (1 ≤ s, t ≤ n, s ≠ t, 1 ≤ ds, dt ≤ n - 1).

Выходные данные

Если ответа не существует, выведите в первую строку «No» (без кавычек).

В противном случае в первую строку выведите «Yes» (без кавычек). В следующей (n - 1)-й строке выведите по два целых числа — описание рёбер остова. Каждое из рёбер остова должно быть выведено ровно один раз.

Выводить ребра можно в любом порядке. Концы ребер также можно выводить в любом порядке.

Если решений несколько, выведите любое из них.

A. Проверка календаря

реализация *1000

Вам заданы названия двух дней недели.

Определите, могла ли в невисокосном году произойти ситуация, что первое число одного месяца выпало на первый из заданных дней недели, а первое число следующего месяца — на второй из заданных дней недели. Оба месяца при этом должны принадлежать к одному году.

В задаче предполагается использования григорианского календаря, состоящего из 12 месяцев. Количество дней в каждом из 12 месяцев в невисокосном году равняется соответственно: 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31.

Названия дней недели записаны с помощью строчных английских букв: «monday» (понедельник), «tuesday» (вторник), «wednesday» (среда), «thursday» (четверг), «friday» (пятница), «saturday» (суббота), «sunday» (воскресенье).

Входные данные

Входные данные состоят из двух строк, в каждой из которых записано название одного из семи дней недели. Гарантируется, что каждая из строк совпадает с одной какой-то строкой из множества «monday», «tuesday», «wednesday», «thursday», «friday», «saturday», «sunday».

Выходные данные

Выведите «YES» (без кавычек), если ситуация, описанная в условии, могла произойти в течение одного невисокосного года. В противном случае выведите «NO» (без кавычек).

Примечание

Во втором примере можно взять 1 февраля и 1 марта 2015 года. Оба эти дня были воскресеньями.

В третьем примере можно взять 1 июля и 1 августа 2017 года. Первый из этих дней это суббота, а второй вторник.

B. Пакетная сортировка

жадные алгоритмы математика Перебор реализация *1500

Вам задана таблица, состоящая из n строк и m столбцов.

Числа в каждой строке образуют перестановку от чисел 1 до m.

Разрешается не более одного раза для каждой строки поменять в ней два числа местами. Также разрешается не более одного раза поменять местами два столбца целиком. Таким образом, суммарно можно совершить от 0 до n + 1 действия. Описанные действия можно выполнять в любом порядке.

Проверьте, можно ли с помощью указанных действий добиться ситуации, чтобы в каждой строке была записана тождественная перестановка 1, 2, ..., m. Другими словами, существует ли такая последовательность действий, в результате которой числа в каждой из строк будут отсортированы по возрастанию.

Входные данные

В первой строке входных данных записаны два числа n и m (1 ≤ n, m ≤ 20) — количество строк и столбцов в заданной таблице.

В следующих n строках записаны по m чисел — содержимое таблицы. Гарантируется, что числа в каждой строке образуют перестановку чисел от 1 до m.

Выходные данные

Выведите «YES» (без кавычек), если с помощью указанных действий можно получить тождественную перестановку одновременно во всех строках таблицы. В противном случае выведите «NO» (без кавычек).

Примечание

В первом примере можно действовать следующим образом:

  1. Сначала поменять местами второй и третий столбец. После этого действия таблица будет выглядеть так:
    1 2 3 4
    1 4 3 2
  2. Затем во второй строке поменять местами числа на второй и четвёртой позиции. После этого действия таблица будет выглядеть так:
    1 2 3 4
    1 2 3 4

C. Трассировка луча

жадные алгоритмы математика реализация сортировки теория чисел хэши *1800

В прямоугольной комнате размером n на m метров расположено k датчиков, датчик номер i расположен в точке с координатами (xi, yi). Все датчики расположены в различных точках, находящихся строго внутри прямоугольника.

Противоположные углы комнаты находятся в точках с координатами (0, 0) и (n, m). Стены комнаты расположены параллельно осям координат.

В момент времени 0, из точки (0, 0) в направлении точки (1, 1) выпускается лазерный луч. Луч летит со скоростью метров в секунду. Таким образом, луч окажется в точке (1, 1) ровно через одну секунду после старта.

При столкновении со стеной луч отражается по закону, что угол падения равен углу отражения. При попадании луча в любой из четырёх углов комнаты он останавливается.

Определите для каждого датчика первый момент времени, когда луч пройдет сквозь точку, содержащую этот датчик. Для датчиков, через которые луч не пройдёт, выведите  - 1.

Входные данные

В первой строке входных данных записаны три числа n, m и k (2 ≤ n, m ≤ 100 000, 1 ≤ k ≤ 100 000) — размеры комнаты и количество датчиков.

В следующих k строках записаны по два целых числа xi и yi (1 ≤ xi ≤ n - 1, 1 ≤ yi ≤ m - 1) — координаты датчиков. Гарантируется, что никакие два датчика не находятся в одной точке.

Выходные данные

Выведите k целых чисел, i-е из которых должно равняться времени в секундах, через которое луч пройдёт через i-й датчик, или  - 1, если этого не произойдёт.

Примечание

В первом примере луч пройдёт последовательно через точки со следующими координатами: (0, 0), (1, 1), (2, 2), (3, 3). Таким образом, через 3 секунды после вылета луч остановится в точке (3, 3).

Во втором примере луч пройдёт последовательно через точки со следующими коорданатами: (0, 0), (1, 1), (2, 2), (3, 3), (2, 4), (1, 3), (0, 2), (1, 1), (2, 0), (3, 1), (2, 2), (1, 3), (0, 4). В этом примере луч остановится в точке (0, 4) через 12 секунд после вылета. За это время он отразится от стен в точках (3, 3), (2, 4), (0, 2), (2, 0) и (3, 1).

A. Прыгающий шарик

реализация *1000

В новой версии знаменитой игры Пинбол одним из элементов игрового поля является последовательность из n бамперов, пронумерованных от 1 до n. Всего есть два типа бамперов, обозначаемых символами '<' и '>'. Если на бампер номер i попадает шарик, то он выбрасывается направо (в позицию i + 1), если бампер имеет тип '>', либо налево (в позицию i - 1), если бампер в позиции i имеет тип '<'. В случае если соответствующей позиции не существует, то есть i - 1 < 1 или i + 1 > n, шарик падает с игрового поля.

В зависимости от того, на какой из бамперов шарик упадёт в начале игры, он либо в какой-нибудь момент упадёт и покинет игровое поле, либо будет прыгать по нему бесконечно. Для заданной последовательности типов бамперов вычислите количество позиций, таких что, начав с соответствующих бамперов, шарик когда-нибудь покинет игровое поле.

Входные данные

В первой строке входных данных записано число n (1 ≤ n ≤ 200 000) — длина последовательности бамперов. Во второй строке записана строка, состоящая только из символов '<' и '>'. Символ, стоящий на i-й позиции в данной строке, определяет тип бампера на позиции i.

Выходные данные

Выведите одно целое число — количество позиций, таких что, начав в них, шарик когда-нибудь покинет игровое поле.

Примечание

В первом примере шарик упадёт с игрового поля, если начнёт в позициях 1 или 2.

Во втором примере шарик упадёт с игрового поля при любой стартовой позиции.

B. Еда в самолёте

математика реализация *1200

В самолёте SuperPuperJet бесконечное количество рядов, пронумерованных положительными целыми числами, начиная с 1, в порядке от кабины пилотов к хвосту самолёта. В каждом ряду по шесть мест, обозначенных буквами от «a» до «f». Места «a», «b» и «c» расположены по левую сторону от прохода (если смотреть в сторону кабины), а места «d», «e» и «f» — по правую. При этом места «a» и «f» расположены рядом с окнами, а места «c» и «d» — у прохода.

 

Пришло время обеда, и две стюардессы приступили к раздаче еды. Для этого они двигаются от первых рядов к хвосту, при этом всё время стоят друг от друга через ряд, из-за наличия между ними тележки с едой. Таким образом, в начале одна стюардесса обслуживает ряд 1, а другая ряд 3. Как только оба ряда будут обслужены, они передвинут тележку на один ряд вперёд, после чего первая стюардесса обслужит ряд 2, а вторая — ряд 4. Затем они сдвинутся на три ряда, первая стюардесса обслужит ряд 5, а вторая — ряд 7, после чего они опять сдвинутся на один ряд вперёд и так далее.

Стюардессы работают с одинаковой скоростью, обслуживая одного пассажира за 1 секунду и передвигаясь вперёд на один ряд также за 1 секунду. Каждая стюардесса сначала обслуживает пассажиров на местах справа от прохода (то есть по левую руку от себя, так как стюардессы смотрят в сторону хвоста), а затем пассажиров слева от прохода. При этом пассажиры всегда обслуживаются в порядке от окна к центру. Таким образом, в каждом ряду первым будет обслужен пассажир на месте «f», а последним — пассажир на месте «c». Считайте, что все места в самолёте заняты.

Вася сидит на месте s в ряду n и хочет узнать, через сколько секунд он получит свой долгожданный обед.

Входные данные

В единственной строке входных данных описывается место Васи в формате ns, где n (1 ≤ n ≤ 1018) — номер ряда и s — место в данном ряду, обозначенное символом от «a» до «f». Номер ряда и номер места не разделяются пробелом.

Выходные данные

Выведите единственное целое число — количество секунд, через которое Вася получит свой обед.

Примечание

В первом примере Вася будет первым, кого обслужит первая стюардесса, поэтому Вася получит свою еду через 1 секунду.

Во втором примере стюардессы сначала потратят 6 секунд на обслуживание рядов 1 и 3, затем за 1 секунду сдвинутся на один ряд вперёд. Поскольку каждая стюардесса сначала обслуживает места справа от прохода в порядке от окна к проходу, Вася получит свою еду ещё через 3 секунды. Итого 6 + 1 + 3 = 10.

C. Спрятанное слово

Конструктив Перебор реализация Строки *1600

Определим игровое поле как таблицу из 2 рядов и 13 столбцов. В каждой клетке таблицы записана заглавная буква английского алфавита. Некоторые клетки могут содержать одинаковые буквы. Рассмотрим пример таблицы:


ABCDEFGHIJKLM
NOPQRSTUVWXYZ

Назовём две клетки соседними, если у них есть общая сторона или общий угол. В приведённом примере клетка «A» является соседней с клетками с буквами «B», «N» и «O». Клетка не является соседней сама себе.

Последовательность клеток называется путём, если любые две соседние клетки последовательности являются соседними клетками поля. В приведённом примере «ABC» является путём, также как и «KXWIHIJK». Последовательность клеток «MAB» путём не является, так как «M» не соседняя с «A». Одна клетка может входить в путь несколько раз (но не может занимать две соседние позиции в пути, так как клетка не является соседней сама себе).

Вам дана строка s, состоящая из 27 заглавных букв английского алфавита. Каждая заглавная буква английского алфавита встречается в s хотя бы один раз. Требуется построить какую-нибудь таблицу, содержащую какой-нибудь путь, такой что если выписать буквы в клетках вдоль этого пути, получится строка s. Если решения не существует выведите «Impossible».

Входные данные

В единственной строке входных данных записана строка s, состоящая из 27 заглавных букв английского алфавита. Каждая буква встречается в строке s хотя бы один раз.

Выходные данные

Выведите две строки, каждая из которых содержит 13 заглавных букв английского алфавита, определяющие строки таблицы. Если правильных решений несколько, выведите любое из них. Если решений не существует, выведите «Impossible».

B. Сумма чека

Разбор выражений реализация Строки *1600

Василий вышел из магазина и ему стало интересно пересчитать сумму в чеке. Чек представляет собой строку, в которой названия покупок и их цены записаны подряд без пробелов. Чек имеет вид «name1price1name2price2...namenpricen», где namei (название i-го продукта) — это непустая строка длины не более 10, состоящая из строчных букв латинского алфавита, а pricei (цена i-го продукта) — это непустая строка, состоящая из точек и цифр. Продукты с одинаковым названием могут иметь разные цены.

Цена каждого продукта записана в следующем формате. Если продукт стоит целое количество рублей, то копейки не пишутся.

Иначе, после записи количества рублей к цене приписывается точка, за которой следом ровно двумя цифрами записаны копейки (если копеек менее 10, то используется лидирующий ноль).

Также, каждые три разряда (от менее значимых к более значимым) в записи рублей разделяются точками. Лишние лидирующие нули недопустимы, запись цены всегда начинается с цифры и заканчивается цифрой.

Например, записи цен:

  • «234», «1.544», «149.431.10», «0.99» и «123.05» являются корректными,
  • «.333», «3.33.11», «12.00», «.33», «0.1234» и «1.2» не являются корректными.

Напишите программу, которая по содержимому чека найдет суммарную цену всех покупок.

Входные данные

В первой строке содержится непустая строка s длины не более 1000 — содержимое чека Василия. Гарантируется, что чек задан в формате, описанном в условии. Гарантируется, что каждая цена в чеке составляет не менее одной копейки и не более 106 рублей.

Выходные данные

Выведите суммарную цену всех покупок строго в том же формате, в котором задаются цены покупок во входных данных.

A. Интервью с Олегом

реализация Строки *900

Поликарп взял у Олега интервью и записал его себе в блокнот без знаков препинания и пробелов, чтобы сэкономить время и успеть все записать. В итоге, интервью представляет собой строку s, состоящую из n строчных букв латинского алфавита.

В речи Олега есть слово-паразит ogo, а также все слова, которые получаются из слова ogo приписыванием справа к нему слога go. Например, слова ogo, ogogo, ogogogo являются паразитами, а слова go, og, ogog, ogogog и oggo — не являются.

Слова-паразиты имеют максимальный возможный размер, то есть, например, в речи ogogoo нельзя считать, что слово-паразит это ogo, а goo является частью обыкновенной фразы интервью. В данном случае словом-паразитом является подстрока ogogo.

До печати Поликарпу необходимо заменить каждое слово-паразит на последовательность из трёх звездочек. Обратите внимание, что независимо от длины слова-паразита оно заменяется ровно на три звёздочки.

Поликарп быстро справился с этой задачей. А сможете ли это сделать вы? Время пошло!

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 100) — длина интервью.

Во второй строке следует строка s длины n, состоящая из строчных букв латинского алфавита.

Выходные данные

Выведите текст интервью после замены каждого слова-паразита на «***». Допустимо, что в ответе подстрока «***» будет идти подряд несколько раз.

Примечание

В первом примере одно слово-паразит ogogo, поэтому интервью для печати выглядит как «a***b».

Во втором примере два слова-паразита ogo и ogogogo, поэтому интервью без слов-паразитов выглядит как «***gmg***».

B. Прожекторы

дп реализация *1200

Театральная сцена представляет собой прямоугольное поле размером n × m. Директор театра выдал вам план сцены, согласно которому на ней будут располагаться актёры. На плане отмечено в каких клетках будут стоять актёры, а в каких нет.

Прожектор, установленный на сцену, будет светить в одном из четырёх направлений (если смотреть на план сцены сверху) — влево, вверх, вправо или вниз. Таким образом, под позицией прожектора понимается клетка, в которую он установлен, а также направление, в котором он светит.

Перед вами стоит задача поставить на сцену прожектор в хорошую позицию. Позиция называется хорошей, если одновременно выполняются два условия:

  • в соответствующей ей клетке нет актёра;
  • в направлении, в котором светит прожектор, находится хотя бы один актёр.

Перед вами стоит задача посчитать количество хороших позиций для установки прожектора. Две позиции установки прожектора считаются различными, если отличаются клетки расположения прожектора, или направление, в котором он светит.

Входные данные

В первой строке следует два целых положительных числа n и m (1 ≤ n, m ≤ 1000) — количество строк и количество столбцов в плане.

В следующих n строках следует по m целых чисел, каждое равно либо 0, либо 1, — описание плана. Если очередное число равно 1, то в соответствующей клетке находится актёр, а если 0, то клетка останется пустой. Гарантируется, что в плане есть хотя бы один актёр.

Выходные данные

Выведите единственное целое число — количество хороших позиций для установки прожектора.

Примечание

В первом примере хорошими позициями для установки прожектора являются:

  1. клетка (1, 1) и направление вправо;
  2. клетка (1, 1) и направление вниз;
  3. клетка (1, 3) и направление влево;
  4. клетка (1, 3) и направление вниз;
  5. клетка (1, 4) и направление влево;
  6. клетка (2, 2) и направление влево;
  7. клетка (2, 2) и направление вверх;
  8. клетка (2, 2) и направление вправо;
  9. клетка (2, 4) и направление влево.

Таким образом, в данном примере всего 9 хороших позиций.

A. Toda 2

жадные алгоритмы реализация *1800

D. Running Over The Bridges

жадные алгоритмы математика реализация *2200

Polycarp is playing a game called "Running Over The Bridges". In this game he has to run over n bridges from the left to the right. Bridges are arranged one after the other, so the i-th bridge begins where the (i - 1)-th bridge ends.

You have the following data about bridges: li and ti — the length of the i-th bridge and the maximum allowed time which Polycarp can spend running over the i-th bridge. Thus, if Polycarp is in the beginning of the bridge i at the time T then he has to leave it at the time T + ti or earlier. It is allowed to reach the right end of a bridge exactly at the time T + ti.

Polycarp can run from the left side to the right one with speed 0.5, so he will run over a bridge with length s in time s. Besides, he has several magical drinks. If he uses one drink, his speed increases twice (i.e. to value 1) for r seconds. All magical drinks are identical. Please note that Polycarp can use a drink only at integer moments of time, and he drinks it instantly and completely. Additionally, if Polycarp uses a drink at the moment T he can use the next drink not earlier than at the moment T + r.

What is the minimal number of drinks Polycarp has to use to run over all n bridges? If this number is not greater than 105, then you have to find out the moments of time when Polycarp has to use each magical drink.

Input

The first line contains two integers n and r (1 ≤ n ≤ 2·105, 1 ≤ r ≤ 1012) — the number of bridges and the duration of the effect of a magical drink.

The second line contains a sequence of integers l1, l2, ..., ln (1 ≤ li ≤ 5·106), where li is equal to the length of the i-th bridge.

The third line contains a sequence of integers t1, t2, ..., tn (1 ≤ ti ≤ 107), where ti is equal to the maximum allowed time which Polycarp can spend running over the i-th bridge.

Output

The first line of the output should contain k — the minimal number of drinks which Polycarp has to use, or -1 if there is no solution.

If the solution exists and the value of k is not greater than 105 then output k integers on the next line — moments of time from beginning of the game when Polycarp has to use drinks. Print the moments of time in chronological order. If there are several solutions, you can output any of them.

Note

In the first case, there is only one bridge and it is clear that Polycarp cannot run over it without magical drinks. So, if he will use one magical drink on start (moment of time 0), and the second one — three seconds later (moment of time 3), he will be able to reach the end of the bridge in time. Please note, in this case there are several possible answers to the problem. For example, Polycarp can use the first drink at the moment of time 4 and the second one — at the moment of time 7.

In the second case, Polycarp cannot run over all bridges even if he will use magical drinks. So, answer in this case is -1.

In the fourth case, Polycarp can run over all bridges without magical drinks.

E. Award Ceremony

жадные алгоритмы реализация *2200

G. Car Repair Shop

реализация *1600

H. Delete Them

Конструктив реализация *1300

A. Ночь в музее

реализация Строки *800

Гриша, подобно персонажу известной кинокомедии, нашел себе ночную работу в музее естественной истории. В первую же смену ему выдали его главное орудие труда — эмбоссер — и приказали провести инвентаризацию всей экспозиции.

Эмбоссер представляет собой устройство для «печати» текста на пластиковой ленте. Текст набирается последовательно, буква за буквой. В устройство входят колесо с нанесёнными по кругу строчными буквами английского алфавита, неподвижная засечка, которая указывает на текущую букву, и кнопка, печатающая выбранную букву. За одно действие можно повернуть колесо с алфавитом на одну букву влево либо вправо по циклу. Изначально засечка эмбоссера указывает на букву a. Остальные буквы расположены так, как показано на рисунке.

После внесения предмета в базу Гриша должен с помощью эмбоссера выдавить на пластиковой ленте название и прикрепить его к экспонату. Возвращать колесо обратно в позицию, соответствующую букве a, не требуется.

Наш герой боится, что некоторые особо устрашающие экспонаты могут ожить и начать за ним свою охоту, поэтому он хочет как можно быстрее напечатать все названия. Помогите ему: для данного названия экспоната определите минимальное количество поворотов колеса, необходимое для его печати.

Входные данные

Единственная строка входных данных содержит название экспоната — строку, состоящую из не менее, чем одного, и не более, чем ста символов. Гарантируется, что строка состоит из строчных букв английского алфавита.

Выходные данные

Выведите единственное целое число — минимальное количество поворотов колеса, за которое Гриша сможет напечатать название экспоната.

Примечание

 

Для набора слова из первого примера необходимо сделать следующую последовательность поворотов:

  1. от a до z (1 поворот против часовой стрелки),
  2. от z до e (5 поворотов по часовой стрелке),
  3. от e до u (10 поворотов против часовой стрелки),
  4. от u до s (2 поворотa против часовой стрелки).
Итого потребуется 1 + 5 + 10 + 2 = 18 поворотов.

F. Видеокарты

математика Перебор реализация Структуры данных теория чисел *1900

Маленький Влад обожает играть в популярную игру Bota-2 на своем компьютере. На днях разработчики сообщили о выходе её продолжения под названием Bota-3. Разумеется, Влад тут же её приобрёл, но оказалось, что компьютер Влада слишком старый для этой игры, поэтому он отправился в магазин за обновлением для него.

В магазине Влад увидел n видеокарт, i-я из которых имеет свою мощность ai, выражаемую целым положительным числом. Для того, чтобы игра точно заработала, Влад решил купить не одну, а несколько видеокарт и объединить их мощности по новейшей технологии. Для использования этой технологии одна из видеокарт выбирается в качестве ведущей, а все остальные видеокарты подключаются к ней в качестве вторичных. Для корректной работы этой конструкции необходимо, чтобы мощность каждой видеокарты была кратна мощности ведущей видеокарты. Для обеспечения совместимости мощность каждой вторичной видеокарты может быть понижена до любого меньшего целого положительного значения. При этом мощность опорной видеокарты должна оставаться оригинальной, то есть не может быть уменьшена.

У Влада очень много денег, поэтому он может купить любые видеокарты. Помогите ему выбрать такие видеокарты, чтобы после необходимого понижения их мощностей и соединения их по новой технологии суммарная итоговая мощность видеокарт была максимальной.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 200 000) — количество видеокарт в магазине.

Во второй строке находится n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 200 000), обозначающих мощности видеокарт.

Выходные данные

В единственной строке выведите целое число — максимальную возможную суммарную итоговую мощность видеокарт.

Примечание

В первом примере выгодно купить видеокарты с мощностями 3, 15 и 9. В таком случае можно выбрать видеокарту с мощностью 3 ведущей, а все остальные видеокарты будут с ней совместимы. Суммарная мощность в таком случае будет равна 3 + 15 + 9 = 27. Если же купить все видеокарты и выбрать видеокарту с мощностью 2 ведущей, то мощности каждой из остальных трёх видеокарт придётся понизить на 1, чтобы они стали кратны 2, а значит итоговая мощность будет 2 + 2 + 14 + 8 = 26, что менее выгодно. Обратите внимание, что не разрешается понижать мощность ведущей видеокарты, то есть получить сумму мощностей 3 + 1 + 15 + 9 = 28 нельзя.

Во втором примере выгодно купить все видеокарты, а в качестве ведущей выбрать видеокарту с мощностью 2. Видеокарта с мощностью 7 с ней несовместима, поэтому её мощность придется понизить до 6. Суммарная мощность будет равна 8 + 2 + 2 + 6 = 18.

A. Куплю лопату

Конструктив математика Перебор реализация *800

Поликарпу срочно понадобилась лопата! Он пришёл в магазин и выбрал подходящую. Лопата, которая подошла Поликарпу, продается по цене k бурлей. Считайте, что в магазине неограниченное количество таких лопат.

В кармане у Поликарпа есть неограниченное количество «дестюльников» (монет номиналом в 10 бурлей) и ровно одна монета номинала r (1 ≤ r ≤ 9).

Какое наименьшее количество лопат придётся купить Поликарпу, чтобы он смог расплатиться за покупку без сдачи? Очевидно, что за 10 лопат он сможет расплатиться без сдачи (заплатив требуемую сумму «дестюльниками», не используя монету номинала r), но, возможно, он сможет купить меньшее количество лопат и расплатиться без сдачи. Обратите внимание, что Поликарп должен купить хотя бы одну лопату.

Входные данные

В единственной строке входных данных записаны два целых числа k и r (1 ≤ k ≤ 1000, 1 ≤ r ≤ 9) — цена одной лопаты и номинал монеты в кармане Поликарпа, отличной от «дестюльника».

Помните, что ещё у него в кармане неограниченное количество монет номинала 10, то есть их хватит на покупку любого количества лопат.

Выходные данные

Выведите искомое минимальное количество лопат, которые нужно купить Поликарпу, чтобы расплатиться без сдачи.

Примечание

В первом примере Поликарп может купить 9 лопат, заплатив 9·117 = 1053 бурлей. В самом деле, эту сумму он может заплатив используя монеты номиналом 10 бурлей и одну монету номиналом 3 бурля. Купить меньшее количество лопат (и при этом расплатиться без сдачи), он не может.

Во втором примере Поликарпу достаточно купить одну лопату.

В третьем примере Поликарп должен купить 2 лопаты, заплатив 2·15 = 30 бурлей. Эту сумму он, очевидно, может заплатить без сдачи.

C. Санаторий

Бинарный поиск жадные алгоритмы Конструктив математика реализация *1200

Василий провел свой отпуск в санатории и, вернувшись, обнаружил, что совершенно забыл о подробностях отдыха!

В столовой санатория каждый день проходили завтрак, обед и ужин (конечно, именно в таком порядке). Единственное, что осталось у Василия — карточка из столовой, в которой находится запись о том, сколько раз он посещал завтрак, обед или ужин (таким образом, запись представляет собой три неотрицательных целых числа). Василий мог иногда пропустить ту или иную трапезу, например, в один и тот же день он мог посетить завтрак и ужин, но пропустить обед, а в какой-то из дней он мог не ходить в столовую вовсе.

Василий уже не помнит, в какое время суток он приехал в санаторий (перед завтраком, перед обедом, перед ужином, или после ужина), а в какое уехал (до завтрака, до обеда, до ужина или после ужина) поэтому он готов рассматривать любой из этих вариантов. После приезда в санаторий Василий не покидал его до момента отъезда. Обратите внимание, Василий мог уехать из санатория в тот же день, что и приехал.

По записи в карточке помогите Василию определить, какое наименьшее количество трапез в столовой санатория он мог пропустить. Трапезы, проходящие в день приезда Василия до его приезда и трапезы, проходящие в день отъезда Василия после его отъезда, пропущенными считать не следует.

Входные данные

В единственной строке входных данных содержатся три целых числа b, d и s (0 ≤ b, d, s ≤ 1018,  b + d + s ≥ 1) — количество завтраков, обедов и ужинов, которые посетил Василий во время отдыха в санатории, соответственно.

Выходные данные

Выведите единственное целое число — наименьшее возможное количество трапез, пропущенных Василием.

Примечание

В первом примере из условия Василий пропустил бы один ужин, если, например, приехал бы к завтраку, пробыл два дня в санатории (включая день приезда) и уехал после завтрака третьего дня.

Во втором примере из условия Василий мог приехать к завтраку, сходить на него, и сразу же покинуть санаторий, не пропустив ни одной трапезы.

В третьем примере из условия Василий мог пробыть в санатории один полный день, не пропустив ни одной трапезы.

A. Кузнечик и строка

реализация *1000

Как-то раз, прыгая по лужайке, кузнечик наткнулся на листок со строкой. Кузнечику очень интересно, какой минимальной прыгучестью он должен обладать, чтобы иметь возможность оказаться за дальним концом строки, прыгая только по гласным буквам латинского алфавита. Прыгучесть — максимальная возможная длина прыжка кузнечика.

Формально, считайте, что в начальный момент кузнечик находится непосредственно перед крайним левым символом строки. Его цель — оказаться в позиции за крайним правым символом строки. За один прыжок кузнечик может прыгнуть вправо на любое расстояние от 1 до величины своей прыгучести.

Рисунок соответствует первому примеру из условия.

Гласными буквами латинского алфавита считаются следующие: 'A', 'E', 'I', 'O', 'U' и 'Y'.

Входные данные

В первой строке входных данных следует непустая строка состоящая из заглавных букв латинского алфавита. Гарантируется, что длина строки не превосходит 100.

Выходные данные

Выведите одно целое число a — минимальную прыгучесть кузнечика (в количестве символов), чтобы иметь возможность преодолеть заданную строку, прыгая только по гласным буквам.

A. Антон и Даник

реализация Строки *800

Антону нравится играть в шахматы. Поэтому он часто играет в эту увлекательную игру со своим другом Даником.

Однажды, Антон с Даником сыграли n партий подряд. Для каждой партии друзьям известно, кто в ней победил — Антон или Даник. При этом ни одна из партий не окончилась вничью.

Антону стало интересно, кто же выиграл больше раз — он или Даник? Помогите Антону и определите это.

Входные данные

В первой строке входных данных находится единственное число n (1 ≤ n ≤ 100 000) — количество партий, которое сыграли Антон с Даником.

Во второй строке входных данных находится строка s, состоящая ровно из n заглавных латинских букв «A» или «D» — исходы шахматных партий. При этом i-й символ строки s равен «A», если в i-й партии победил Антон, или «D», если в i-й партии победил Даник.

Выходные данные

Если Антон выиграл большее количество партий, чем Даник, выведите «Anton» (без кавычек).

Если Даник выиграл большее количество партий, чем Антон, выведите «Danik» (без кавычек).

Если Антон и Даник выиграли поровну партий, выведите «Friendship» (без кавычек).

Примечание

В первом примере Антон выиграл 6 партий, а Даник — всего одну. Следовательно, ответ — «Anton».

Во втором примере Антон выиграл 3 партии, а Даник — 4. Значит, ответ — «Danik».

В третьем Антон и Даник выиграли по 3 партии. Поэтому ответ — «Friendship».

B. Антон и цифры

жадные алгоритмы математика Перебор реализация *800

Недавно Антон нашёл у себя дома коробку с цифрами. В коробке было k2 цифр 2, k3 цифр 3, k5 цифр 5 и k6 цифр 6.

Любимые числа Антона — 32 и 256. Поэтому он, конечно же, решил составить из цифр, находившихся в коробке, свои любимые числа. При этом он хочет, чтобы сумма составленных чисел была как можно больше. Помогите Антону найти эту сумму!

Каждую цифру можно использовать не более одного раза, то есть в составленных Анотоном числах должно быть не больше k2 цифр 2, k3 цифр 3 и так далее. Неиспользованные цифры в сумме не учитываются.

Входные данные

В единственной строке входных данных находятся четыре целых числа k2, k3, k5, k6 — количество цифр 2, 3, 5 и 6 соответственно (0 ≤ k2, k3, k5, k6 ≤ 5·106).

Выходные данные

В единственной строке выходных данных выведите единственное число — максимальную сумму любимых чисел Антона, которые можно составить с помощью цифр из коробки.

Примечание

В первом примере есть пять цифр 2, одна цифра 3, три цифры 5 и четыре цифры 6. Антон может из этих цифр составить три числа 256 и одно число 32. Тогда ответ будет равен 256 + 256 + 256 + 32 = 800. Заметьте, что после составления чисел осталась одна цифра 2 и одна цифра 6. В ответе они никак не учитываются.

Во втором примере выгоднее всего составить одно число 256. Поэтому ответ равен 256.

D. Антон и шахматы

реализация *1700

Антону нравится играть в шахматы. А еще ему нравится программирование. Именно поэтому Антон решил написать шахматную программу. Однако, шахматы на обычной доске 8 на 8 кажутся ему слишком простыми, поэтому он решил использовать бесконечную шахматную доску.

Первая проблема, с которой столкнулся Антон — проверка на шах королю. Антон не знает, как её реализовать и обратился к вам за помощью.

Предположим, на бесконечной шахматной доске находится один белый король и несколько чёрных фигур. Из чёрных фигур есть только ладьи, слоны и ферзи, поскольку другие шахматные фигуры Антон ещё не реализовал в своей программе. Считается, что белый король находится под шахом, если какая-либо чёрная фигура может попасть на клетку с белым королём за один ход.

Помогите Антону и напишите программу, которая для каждой заданной позиции определяет, находится ли белый король под шахом.

Напоминаем, как ходят шахматные фигуры:

  • Слон ходит на любое количество клеток по любой диагонали. Он не может «перепрыгивать» через фигуры, то есть на клетках, через которые он проходит, не может стоять никакая другая чёрная фигура.
  • Ладья ходит на любое количество клеток по вертикали или горизотали. Она также не может «перепрыгивать» через фигуры.
  • Ферзь ходит на любое количество клеток как по горизонали и вертикали, так и по диагонали. Он тоже не может «перепрыгивать» через фигуры.
Входные данные

В первой строке входных данных находится одно целое цисло n (1 ≤ n ≤ 500 000) — количество чёрных фигур.

Во второй строке входных данных находятся два целых числа x0 и y0 ( - 109 ≤ x0, y0 ≤ 109) — координаты белого короля.

В следующих n строках находится символ, обозначающий тип фигуры, а также два целых числа xi и yi ( - 109 ≤ xi, yi ≤ 109) — описание i-й чёрной фигуры. Символ «B» означает слона, «R» — ладью, «Q» — ферзя. Гарантируется, что никакие две фигуры не находятся в одной клетке.

Выходные данные

В единственной строке выходных данных выведите «YES» (без кавычек), если белый король находится под шахом, и «NO» (без кавычек) в противном случае.

Примечание

Иллюстрация к первому примеру:

Здесь видно, что король находится под шахом, так как черный слон может за один ход попасть на клетку с белым королем. Поэтому ответ — «YES».

Иллюстрация ко второму примеру:

Здесь слон не может за один ход попасть на клетку с белым королем, так как ему «мешает» черная ладья, а слон не умеет «перепрыгивать» через фигуры. Ладья также не может сделать этого, так как она не умеет ходить по диагонали. Следовательно, король не находится под шахом и ответ — «NO».

F. Антон и школа

битмаски Конструктив математика реализация *2500

Антон учится в школе. Его любимый предмет — массивоведение. Этот предмет ему легко даётся, он обычно решает задачи по массивоведению очень быстро.

Однажды, когда Антон в очередной раз справился со всеми задачами по массивоведению за десять минут, учительница дала ему задачу посложнее: даны два массива b и c длины n, и надо найти массив a такой, что

где a and b обозначает операцию побитового И, а a or b обозначает операцию побитового ИЛИ.

Хотя Антон обычно решает задачи по массивоведению очень быстро, эта задача оказалась ему не по зубам. Поэтому он решил обратиться к Вам за помощью. Помогите Антону решить эту задачу!

Входные данные

В первой строке входных данных находится одно целое число n (1 ≤ n ≤ 200 000) — размер массивов b и c.

Во второй строке входных данных находится n целых чисел bi (0 ≤ bi ≤ 109) — элементы массива b.

В третьей строке входных данных находится n целых чисел ci (0 ≤ ci ≤ 109) — элементы массива c.

Выходные данные

Если решения не существует, выведите одно число  - 1.

Иначе в единственной строке выходных данных выведите через пробел n целых неотрицательных чисел ai — элементы массива a. Если решений несколько, разрешается вывести любое из них.

A. Остап и Кузнечик

реализация Строки *800

В пути до Рио-де-Жaнeйро Остап развлекается, играя с кузнечиком, которого он взял с собой в специальной коробочке. Остап строит для кузнечика полосу препятствий длиной n, некоторые клетки полосы свободные, а другие полностью заняты. В одну из свободных клеток Остап помещает кузнечика, а в другую — маленькое насекомое, которое кузнечик хочет съесть.

Известно, что за один прыжок кузнечик может переместиться в любую свободную клетку на расстоянии в точности k от текущей, при этом для прыжка кузнечика не имеет значения, свободны или пусты промежуточные клетки. Например, если k = 1, то кузнечик может прыгать только в соседнюю клетку, а если k = 2, то через клетку.

Определите, существует ли последовательность корректных прыжков, которая приводит кузнечика в клетку с насекомым.

Входные данные

В первой строке входных данных записаны два целых числа n и k (2 ≤ n ≤ 100, 1 ≤ k ≤ n - 1) — количество клеток в полосе препятствий и длина прыжка кузнечика.

Во второй строке записана строка длины n, состоящая только из символов «.», «#», «G» и «T». Символ «.» означает, что данная клетка пуста, символ «#» означает, что в данной клетке находится препятствие, и кузнечик не может в неё прыгать, символ «G» означает, что кузнечик изначально находится в данной клетке, и, наконец, символ «T» означает, что в этой клетке находится маленькое насекомое, до которого хочет допрыгать кузнечик. Гарантируется, что символы «G» и «T» встречаются в данной строке ровно один раз.

Выходные данные

Если существует последовательность прыжков (каждый длины k), приводящая кузнечика из его начальной клетки в клетку с насекомым, то выведите «YES» (без кавычек) в единственной строке выходных данных. В противном случае выведите «NO» (без кавычек).

Примечание

В первом примере кузнечику достаточно совершить один прыжок вправо, тогда он сразу попадёт из позиции 2 в позицию 4.

Во втором примере кузнечик совершает прыжки только в соседние клетки, но путь до насекомого свободен — кузнечик может добраться до него за 5 прыжков влево.

В третьем примере кузнечик не может совершить ни одного прыжка.

В четвёртом примере кузнечик может прыгать только по клеткам с нечётными координатами, поэтому он никогда не доберётся до насекомого.

A. Лидер комнаты

реализация *1000

Напомним вам часть правил соревнований формата Codeforces. Изложенные в условии задачи правила немного упрощены по сравнению с официальными, поэтому используйте текст условия в качестве формального документа.

В начале раунда участники распределяются по комнатам. В каждой комнате находится ровно n участников. Участникам предлагается за время соревнования решить пять задач — A, B, C, D и E. За каждую из этих задач, в зависимости от того, когда сдана данная задача и сдана ли вообще, участники получают некоторое количество баллов. Кроме того, участник может делать взломы других участников. За каждый удачный взлом участник получает 100 баллов, за каждый неудачный — теряет 50 баллов. Количество баллов у каждого участника является суммой баллов по всем его задачам с учетом взломов.

Вам предлагается для некоторой комнаты определить ее лидера — участника с наибольшим количеством баллов.

Входные данные

В первой строке содержится целое число n — количество участников в комнате (1 ≤ n ≤ 50). В следующих n строках описаны участники данной комнаты. i-я строка имеет формат «nicki plusi minusi ai bi ci di ei» — ник участника, количество удачных взломов, количество неудачных взломов и количество баллов по задачам A, B, C, D, E соответственно. Ник каждого участника состоит из латинских букв, цифр, а также символов подчеркивания и имеет длину от 1 до 20 символов. На числа наложены следующие ограничения:

  • 0 ≤ plusi, minusi ≤ 50;
  • 150 ≤ ai ≤ 500 или ai = 0, если задача A не сдана;
  • 300 ≤ bi ≤ 1000 или bi = 0, если задача B не сдана;
  • 450 ≤ ci ≤ 1500 или ci = 0, если задача C не сдана;
  • 600 ≤ di ≤ 2000 или di = 0, если задача D не сдана;
  • 750 ≤ ei ≤ 2500 или ei = 0, если задача E не сдана.

Все числа во входных данных целые. У всех участников различные ники. Гарантируется, что лидер в комнате ровно один (то есть нет двух участников с максимальным количеством баллов).

Выходные данные

Выведите в единственной строке ник лидера комнаты.

Примечание

Количество очков, которые получит каждый участник из примера следующие:

  • Petr3860
  • tourist4140
  • Egor4030
  • c00lH4x0R - 350
  • some_participant2220

Таким образом, лидером комнаты является tourist.

A. Алёна и тетрадки

Перебор реализация *1300

Маленькая девочка Алёна пошла в канцелярский магазин, чтобы купить тетрадки для школы. В школе они изучают всего четыре предмета, следовательно девочка хочет, чтобы по каждому предмету у нее было одинаковое количество тетрадок. В магазине продаются три вида комплектов тетрадок: можно купить комплект из одной тетрадки за a рублей, комплект из двух тетрадок за b рублей и комплект из трех тетрадок за c рублей. У девочки уже куплены n тетрадок.

Какое минимальное количество денег девочке нужно будет потратить в магазине для покупки такого количество тетрадок k, чтобы n + k делилось на 4? Количество комплектов каждого вида в магазине не ограничено. Алёна может покупать комплекты разных типов одновременно.

Входные данные

В единственной строке вам заданы 4 числа n, a, b, c через пробел (1 ≤ n, a, b, c ≤ 109).

Выходные данные

В единственное строке выведите минимальное количество рублей, которое нужно потратить на покупку такого количества k тетрадей, чтобы n + k делилось на 4.

Примечание

В первом тесте из условия Алёна может купить 3 комплекта по 1 тетрадке, потратив 3a = 3 рубля. Итого она получит 4 тетрадки и сможет их распределить по предметам поровну.

Во втором тесте из условия Алёна может купить комплект из 2 тетрадок за b = 1 рубль. Итого у нее будет 8 тетрадок.

В третьем тесте Алёна может распределить тетрадки, которые у нее уже есть, между 4 предметами поровну, поэтому она может ничего не покупать.

В четвертом тесте Алёна должна купить один комплект из одной тетрадки.

A. Сложный экзамен Arpa и наивный чит Mehrdad

математика реализация теория чисел *1000

Существует остров под названием страна Arpa, красивые девушки живут на нем.

Mehrdad хочет стать министром страны Arpa. Arpa приготовил ему экзамен. Экзамен состоит из одной задачи: по заданному числу n определите последнюю цифру числа 1378n.

Mehrdad озадачен и обратился за помощью к вам. Помогите ему!

Входные данные

Единственная строка содержит целое число n (0  ≤  n  ≤  109).

Выходные данные

Выведите одно целое число — последнюю цифру числа 1378n.

Примечание

В первом тесте из примера последняя цифра числа 13781 = 1378 равна 8.

Во втором тесте из примера последняя цифра числа 13782 = 1378·1378 = 1898884 равна 4.

A. Владик и перелеты

жадные алгоритмы Конструктив реализация *1200

Владик — спортивный программист. В этом году он собирается победить на международной олимпиаде школьников по информатике. Но все не так просто, как кажется: перед Владиком стоит вопрос, как выгоднее всего добраться до места проведения олимпиады.

Владику известно n аэропортов. Все аэропорты расположены на одной прямой. Каждый аэропорт имеет свой уникальный порядковый номер от 1 до n, дом Владика находится возле аэропорта с номером a, а место проведения олимпиады — рядом с аэропортом, имеющим номер b. Дом Владика и место проведения олимпиады могут находиться возле одного и того же аэропорта.

Чтобы добраться до олимпиады, Владик может совершить любое количество промежуточных перелетов, однако он должен начать в аэропорте a и завершить свой полет в аэропорте b.

Каждый аэропорт принадлежит ровно одной из двух обслуживающих компаний. Стоимость перелета из аэропорта с номером i в аэропорт с номером j равняется нулю, если эти аэропорты принадлежат одной компании, и |i - j|, если они принадлежат разным компаниям.

Найдите минимальную стоимость, за которую Владик может долететь на олимпиаду.

Входные данные

В первой строке входных данных записаны три целых числа n, a, и b (1 ≤ n ≤ 105, 1 ≤ a, b ≤ n) — количество аэропортов, номер аэропорта, из которого Владик начнет свой путь, и номер аэропорта, рядом с которым проводится олимпиада.

Далее записана строка длины n, состоящая только из символов 0 и 1. Если на позиции i в данной строке стоит 0, то i-й аэропорт принадлежит первой компании, а иначе — второй компании.

Выходные данные

Выведите одно целое число — минимальную стоимость, за которую Владик может долететь на олимпиаду.

Примечание

В первом примере Владик может сперва долететь до аэропорта с номером 2, заплатив |1 - 2| = 1 единицу стоимости (поскольку аэропорты принадлежат разным компаниями), а затем бесплатно долететь из аэропорта 2 до 4 (поскольку аэропорты принадлежат одинаковым компаниям). Таким образом, стоимость такого перелета равна 1. Долететь бесплатно невозможно, поэтому ответ на пример равен 1.

Во втором примере Владик может сразу бесплатно долететь из аэропорта 5 до аэропорта 2, поскольку они принадлежат одинаковым компаниям.

B. Хлоя и последовательность

Бинарный поиск битмаски Конструктив реализация *1200

Хлоя, как и Владик, — спортивный программист. У нее не было проблем с тем, чтобы добраться до олимпиады, но на самой олимпиаде ей понадобилась ваша помощь! У нее не получается решить следующую задачу.

Рассмотрим следующий алгоритм генерации последовательностей целых чисел. Первоначально имеется последовательность из одного элемента, равного 1. Далее производится (n - 1) шаг. На каждом шаге берется последовательность, полученная на предыдущем шаге, приписывается сама к себе в конец, а в середину вставляется символ с минимальным положительным, не использованным ранее, числом. Например, после первого шага получится последовательность [1, 2, 1], а после второго — [1, 2, 1, 3, 1, 2, 1].

Необходимо вывести значение элемента, стоящего на k-й позиции (элементы пронумерованы с 1) в итоговой последовательности, т. е. после (n - 1) шага. Помогите Хлое решить задачу!

Входные данные

В единственной строке содержатся два целых числа n и k (1 ≤ n ≤ 50, 1 ≤ k ≤ 2n - 1).

Выходные данные

Выведите одно целое число — число, стоящее в итоговой последовательности на позиции k.

Примечание

В первом примере итоговая последовательность — [1, 2, 1, 3, 1, 2, 1]. Число, стоящее на второй позиции, равно 2.

Во втором примере итоговая последовательность — [1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1]. Число на восьмой позиции  — 4.

A. Коровоконг изучает циклические сдвиги

реализация Строки *900

Коровоконг учится произносить слова! Однажды учитель дал ему новое слово, которое необходимо научиться правильно произносить. Будучи исполнительным студентом, Коровоконг сразу же выполнил задание.

Теперь Коровоконг хочет образовать новые слова, используя данное. Для этого он берёт текущее слово и переставляет его последнюю букву в начало. Такую операцию он называет циклическим сдвигом. Он может применить эту операцию произвольное количество раз, например, последовательно применяя циклический сдвиг к слову «abracadabra», он получит слова «aabracadabr», «raabracadab» и так далее.

Теперь Коровоконг хочет знать, сколько различных слов он может получить, применяя операцию циклического сдвига. Изначальную строку также необходимо учитывать.

Входные данные

В первой строке входных данных записана строка s (1 ≤ |s| ≤ 50) — слово, которое даётся Коровоконгу в самом начале. Строка s содержит только маленькие буквы английского алфавита («a»–«z»).

Выходные данные

Выведите одно целое число, равное количеству различных строк, которые можно получить, применяя операцию циклического сдвига к строке из входных данных.

Примечание

В первом примере Коровоконг может получить строки «abcd», «dabc», «cdab» и «bcda».

Во втором примере не имеет значения, сколько раз Коровоконг применит операцию циклического сдвига, он сможет получить только строку «bbb».

В третьем примере Коровоконг может получить две строки «yzyz» и «zyzy».

B. Коровоконг решает пазл

реализация *1400

Коровоконг обожает собирать пазлы.

Сейчас у него есть два одинаковых кусочка пазла, из которых требуется собрать прямоугольник. Каждый из кусочков описывается прямоугольником n на m, в каждой клетке которого стоит символ «X», если эта клетка является частью кусочка, и «.» если нет. Гарантируется, что все клетки кусочка образуют 4-связную (связную по стороне) область. Для лучшего понимания того, как задаётся один кусочек пазла, прочитайте формат входных данных и посмотрите на примеры.

Кусочки пазла очень тяжёлые, поэтому Коровоконг не может вращать или переворачивать их, однако разрешается делать параллельный перенос. Разумеется, после совмещения двух кусочков они не должны пересекаться.

Во входных данных вам даётся описание одного из двух одинаковых кусочков. Определите, можно ли совместить два кусочка и получить прямоугольник. Прямоугольник должен быть сплошным, то есть не должен содержать ни одной пустой клетки внутри или на границе. Не забывайте, что Коровоконг не может поворачивать или переворачивать кусочки пазла и что после наложения друг на друга кусочки не должны пересекаться, то есть никакие два «X» из разных кусочков не могут занимать одну клетку.

Входные данные

В первой строке входных данных записаны два числа n и m (1 ≤ n, m ≤ 500) — размеры прямоугольника, описывающего один кусочек пазла.

В следующих n строках содержится описание кусочка пазла. Каждая из них имеет длину m и состоит только из символов «.» и «X». Символ «X» означает, что данная клетка является частью кусочка, а «.» означает пустую клетку.

Гарантируется, что описание кусочка содержит хотя бы один символ «X> и что все «X» образуют 4-связную (то есть связную по стороне) область.

Выходные данные

Выведите «YES», если Коровоконг может собрать прямоугольник, и «NO» в противном случае.

Примечание

В первом примере можно собрать прямоугольник следующим образом:


111222
111222

Во втором примере без использования поворотов и переворотов собрать прямоугольник нельзя.

В третьем примере можно сдвинуть один из кусочков на один вправо и получить следующий прямоугольник:


.....
..XX.
.....
.....
.....

A. Компот

математика реализация *800

У Николая есть a лимонов, b яблок и c груш. Он решил приготовить из них компот. По рецепту фрукты должны быть в соотношении 1: 2: 4, то есть на каждый лимон в компоте должно быть ровно 2 яблока и ровно 4 груши. При этом фрукты нельзя измельчать, ломать или разрезать, поэтому в компот обязательно должны попасть целиком фрукты — лимоны, яблоки и груши.

Перед вами стоит задача определить максимальное суммарное количество лимонов, яблок и груш, из которых можно сварить компот по рецепту. Возможна ситуация, когда Николай не сможет для приготовления компота использовать ни одного фрукта, в таком случае выведите 0.

Входные данные

В первой строке следует целое положительное число a (1 ≤ a ≤ 1000) — количество лимонов, которые есть у Николая

Во второй строке следует целое положительное число b (1 ≤ b ≤ 1000) — количество яблок, которые есть у Николая.

В третьей строке следует целое положительное число c (1 ≤ c ≤ 1000) — количество груш, которые есть у Николая.

Выходные данные

Выведите максимальное суммарное количество лимонов, яблок и груш, из которых можно сварить компот по рецепту.

Примечание

В первом примере Николай может использовать для приготовления компота 1 лимон, 2 яблока и 4 груши, поэтому ответ 1 + 2 + 4 = 7.

Во втором примере Николай может использовать для приготовления компота 3 лимона, 6 яблок и 12 груш, поэтому ответ 3 + 6 + 12 = 21.

В третьей примере Николаю не хватит груш, чтобы приготовить сколько-нибудь компота, поэтому ответ 0.

B. Расшифровка

реализация Строки *900

Поликарп без ума от шифрования, поэтому он пишет Свете сообщения в зашифрованном виде. Медианной буквой в слове он называет ту, которая находится в середине слова. Если слово четной длины, то медианная буква та, которая стоит левее из двух средних букв. Медианная буква выделена в следующих примерах: contest, info. Если слово состоит из одной буквы, то, по определению выше, она и будет его медианной буквой.

Поликарп шифрует каждое слово следующим образом: он выписывает медианную букву слова, затем удаляет эту букву из слова и повторяет процесс до тех пор, пока в слове есть хоть одна буква. Например, слово volga он зашифрует в слово logva.

Вам задано слово s, зашифрованное Поликарпом, а ваша задача — расшифровать его.

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 2000) — длина зашифрованного слова.

Во второй строке следует строка s длины n, состоящая из строчных букв латинского алфавита — зашифрованное слово.

Выходные данные

Выведите слово, которое зашифровал Поликарп.

Примечание

В первом примере Поликарп зашифровал слово volga. Сначала он выписал букву l, стоящую в позиции 3, после чего его слово приняло вид voga. После этого, Поликарп выписал букву o, стоящую в позиции 2, а его слово стало равным vga. Затем, Поликарп выписал букву g, стоящую во второй позиции, после этого слово изменилось на va. Потом он выписал букву v, а затем букву a. Таким образом, зашифрованное слово выглядит как logva.

Во втором примере Поликарп зашифровал слово no. Сначала он выписал букву n, слово стало равным o, и он выписал букву o. Таким образом, в этом примере, слово и его зашифровка выглядят одинаково.

В третьем примере Поликарп зашифровал слово baba. Сначала он выписал букву a, стоящую в позиции 2, после чего слово стало равным bba. Затем он выписал букву b, стоящую в позиции 2, а его слово приняло вид ba. После этого он выписал сначала букву b, стоящую в позиции 1, слово приняло вид a, и он выписал эту букву a. Таким образом, зашифрованное слово выглядит как abba.

C. Трамвай

Конструктив математика реализация *1600

Трамвай в Берляндии ходит по прямой от точки 0 до точки s и обратно, преодолевая 1 метр за t1 секунд в обоих направлениях. То есть трамвай ходит равномерно прямолинейно, мгновенно разворачиваясь в точках x = 0 и x = s.

В точке x1 находится Игорь. Ему нужно попасть в точку x2. Игорь преодолевает 1 метр за t2 секунд.

Перед вами стоит задача определить минимальное время, за которое Игорь может добраться из точки x1 в точку x2, если известно, где находится трамвай и в каком направлении он едет в момент, когда Игорь пришел в точку x1.

Игорь может неограниченное количество раз заходить в трамвай в любой момент времени, когда позиции его и трамвая совпадают. Точки, в которых Игорь может заходить и выходить из трамвая, не обязательно целочисленные. Считайте, что любая высадка/посадка происходит мгновенно. Игорь может произвольным образом перемещаться по прямой (но не быстрее, чем 1 метр за t2 секунд) или даже стоять на месте.

Входные данные

В первой строке следуют три целых числа s, x1 и x2 (2 ≤ s ≤ 1000, 0 ≤ x1, x2 ≤ s, x1 ≠ x2) — максимальная координата точки, до которой доезжает трамвай, точка, в которой находится Игорь и точка, в которую ему нужно попасть.

Во второй строке следуют два целых числа t1 и t2 (1 ≤ t1, t2 ≤ 1000) — время в секундах, за которое трамвай преодолевает 1 метр, и время в секундах, за которое Игорь преодолевает 1 метр.

В третьей строке следуют два целых числа p и d (1 ≤ p ≤ s - 1, d равняется 1 или ) — позиция трамвая в момент, когда Игорь пришел в точку x1, а также направление движения трамвая в этот же момент. Если , то трамвай движется в направлении от точки s в точку 0. Если d = 1, то трамвай движется в направлении от точки 0 в точку s.

Выходные данные

Выведите минимальное время в секундах, за которое Игорь может добраться из точки x1 в точку x2.

Примечание

В первом примере Игорю выгоднее пойти пешком и не ждать трамвай. Таким образом, ему нужно пройти 2 метра и он сможет это сделать суммарно за 8 секунд, так как он преодолевает 1 метр за 4 секунды.

Во втором примере Игорь может, например, пойти в сторону точки x2 и дойти до точки 1 за 6 секунд (так как ему нужно пройти для этого 3 метра, а он преодолевает 1 метр за 2 секунды). В этот момент времени, трамвай также будет находится в точке 1, поэтому Игорь может зайти в него, и доехать оставшийся 1 метр за 1 секунду. Таким образом, Игорь доберётся до точки x2 суммарно за 7 секунд.

E. Замена чисел

жадные алгоритмы математика реализация *1900

У Евгения есть n карточек, на каждой из которых написано ровно одно целое число. Евгений хочет поменяться с Николаем некоторыми карточками так, чтобы количество четных чисел на его карточках стало равно количеству нечетных чисел на его карточках, при этом все числа стали различными.

У Николая есть m карточек, на которых написаны различные числа от 1 до m, то есть у Николая есть ровно одна карточка, на которой написано число 1, ровно одна карточка, на которой написано число 2 и так далее.

Назовем обменом процесс, в котором Евгений отдает одну из своих карт Николаю, и берет у него одну другую карту. Перед вами стоит задача найти минимальное количество обменов карт, а также определить какие на какие карточки нужно обменивать Евгению.

Входные данные

В первой строке следуют два целых числа n и m (2 ≤ n ≤ 2·105, 1 ≤ m ≤ 109) — количество карточек у Евгения и количество карточек у Николая. Гарантируется, что n четно.

Во второй строке следует последовательность из n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 109) — числа на карточках Евгения.

Выходные данные

Если ответа не существует, выведите -1.

В противном случае, в первую строку выведите минимальное количество обменов. Во вторую строку выведите n чисел — карточки Евгения после обмена с Николаем. Порядок карточек должен совпадать с порядком карт из входных данных. Если i-я карточка не обменивалась, то i-е число должно совпадать с числом из входных данных. В противном случае, будет считаться, что эта карточка была поменяна, и i-е число должно равняться числу на карточке, на которую она была поменяна.

Если ответов несколько, разрешается вывести любой из них.

B. Расшифровка генома мамонта

реализация Строки *900

Расшифровка генома берляндского мамонта подходит к концу!

Одна из немногих оставшихся задач — восстановление нераспознанных нуклеотидов в найденной цепочке s. Каждый нуклеотид кодируется прописной буквой латинского алфавита: 'A', 'C', 'G' или 'T'. Нераспознанный нуклеотид кодируется знаком вопроса '?'. Таким образом, s — это строка, состоящая из букв 'A', 'C', 'G', 'T' и символов '?'.

Известно, что в расшифрованном геноме берляндского мамонта количества нуклеотидов каждого из четырех видов равны между собой.

Требуется расшифровать геном и заменить каждый нераспознанный нуклеотид на один из четырёх так, чтобы количества нуклеотидов каждого из четырёх типов стали равны между собой.

Входные данные

В первой строке следует целое число n (4 ≤ n ≤ 255) — длина генома.

Во второй строке следует строка s длины n — описание генома, состоящее из символов 'A', 'C', 'G', 'T' и '?'.

Выходные данные

Если расшифровать геном возможно, выведите его расшифровку. Если существует много вариантов расшифровки, то выведите любой из них. Если искомой замены не существует, то выведите три знака равно подряд «===» (без кавычек).

Примечание

В первом примере можно заменить первый знак вопроса на букву 'A', второй знак вопроса на букву 'G', в третий — на букву 'T', тогда каждого нуклеотида в геноме будет по 2.

Во втором примере геном уже корректно расшифрован и каждого нуклеотида в нём ровно по одному.

В третьем и четвертом примерах корректно расшифровать геном невозможно.

C. Серверы

реализация *1300

В лаборатории есть n серверов, каждый из которых может выполнять задания. Серверы пронумерованы уникальными целыми числоми от 1 до n.

Известно, что в течение суток поступит q заданий, i-е из которых характеризуется тремя величинами: ti — секунда поступления задания, ki — количество серверов, которые нужны для его выполнения, а также di — продолжительность выполнения этого задания в секундах. Все ti — различны.

Для того, чтобы выполнить i-е пришедшее задание, нужно ki серверов, которые должны быть свободны в секунду ti. После начала выполнения задания каждый из них будет занят в течение ближайших di секунд. Таким образом, они будут заняты в секунды ti, ti + 1, ..., ti + di - 1. Из всех свободных серверов для выполнения будут выбраны ki серверов с наименьшими номерами. Если в секунду ti не хватает свободных серверов, то задание будет проигнорировано.

Напишите программу, определяющую, какие задания будут выполнены серверами, а какие будут проигнорированы.

Входные данные

В первой строке следует два целых положительных числа n и q (1 ≤ n ≤ 100, 1 ≤ q ≤ 105) — количество серверов и количество заданий.

В каждой из следующих q строк записаны по три целых числа, в i-й из них записаны целые числа ti, ki и di (1 ≤ ti ≤ 106, 1 ≤ ki ≤ n, 1 ≤ di ≤ 1000) — секунда поступления i-го задания, количество серверов, необходимых для его выполнения, а также время выполнения этого задания. Задания заданы в хронологическом порядке, и все они поступят в разные секунды.

Выходные данные

Выведите q строк. Если i-е задание будет принято на выполнение, выведите в i-й строке сумму номеров серверов, на которых будет выполняться это задание. В противном случае выведите -1.

Примечание

В первом примере в секунду 1 придет первое задание, которое будет выполняться на серверах с номерами 1, 2 и 3 (сумма номеров равна 6) в течение двух секунд. В секунду 2 поступит второе задание, которое будет проигнорировано, так как в эту секунду будет свободен только сервер номер 4. В секунду 3 придет третье задание. К этому времени как раз освободятся серверы с номерами 1, 2 и 3, поэтому третье задание будет выполняться на всех имеющихся серверах с номерами 1, 2, 3 и 4 (сумма номеров равна 10).

В втором примере в секунду 3 придет первое задание, которое будет выполняться на серверах с номерами 1 и 2 (сумма равна 3) в течение трех секунд. В секунду 5 поступит второе задание, которое будет выполняться на сервере номер 3, так как первые два сервера будут заняты выполнением первого задания.

E. Комментарии

поиск в глубину и подобное Разбор выражений реализация Строки *1700

Редкая статья в интернете обходится без возможности комментирования. Вот и на сайте, который написал Поликарп, у каждой статьи есть лента комментариев. Каждый комментарий на сайте Поликарпа — это непустая строка из строчных или прописных латинских букв. Комментарии имеют древовидную структуру, то есть у каждого комментария, кроме корневых (то есть комментариев самого верхнего уровня) есть ровно один родительский комментарий. При сохранении комментариев на жесткий диск Поликарп использует следующий формат. Каждый комментарий он записывает так:

  • сначала следует текст комментария;
  • затем следует количество комментариев, для которых он является родительским (то есть тех, которые даны в ответ на этот комментарий);
  • после этого следуют комментарии, для которых этот является родительским (запись комментариев происходит по такому же алгоритму).
Все элементы в записи выше разделяются единичными запятыми. Аналогично, комментарии первого уровня Поликарп записывает через запятую. Например, если комментарии имели вид:

то первый будет записан как «hello,2,ok,0,bye,0», второй как «test,0», а третий как «one,1,two,2,a,0,b,0». Вся ветка комментариев будет записана как: «hello,2,ok,0,bye,0,test,0,one,1,two,2,a,0,b,0». По заданной ветке комментариев в формате описанном выше выведите комментарии в другом формате:

  • сначала выведите d — максимальную глубину вложенности комментариев;
  • затем выведите d строк, i-я из них соответствует комментариям вложенности i;
  • для i-й строки выведите комментарии вложенности i в порядке их появления в записи Поликарпа, разделённые единичными пробелами.
Входные данные

В первой строке следует непустая ветка всех комментариев, состоящая из строчных и прописных букв латинского алфавита, цифр и запятых.

Гарантируется, что каждый комментарий — это непустая строка из строчных или прописных латинских букв. Каждое из количеств комментариев — целое число, состоящее хотя бы из одной цифры, которое либо равно 0, либо не содержит лидирующих нулей.

Длина заданной строки не превышает 106 символов. Гарантируется, что заданная структура комментариев корректна.

Выходные данные

Выведите комментарии в формате, описанном в условии. Для каждого уровня вложенности комментарии выводите в том же порядке, в котором они заданы во входных данных.

Примечание

Первый пример разобран в условии.

A. Санта-Клаус и место в классе

математика реализация *800

Санта-Клаус пришел на рождественскую олимпиаду раньше всех, и ему предстоит первым занять свое место за партой! В аудитории, где находится его место, находятся n рядов по m парт, при этом за каждой партой находятся два рабочих места. Ряды пронумерованы слева направо от 1 до n, а парты в ряду — 1 до m начиная от доски. Обратите внимание, что в отличии от театров и кинотеатров ряды идут не параллельно экрану/доске, а перпендикулярно (см. рисунок).

Организаторы рождественской олимпиады пронумеровали все рабочие места числами от 1 до 2nm. Места пронумерованы по рядам (т. е. сначала пронумерованы все места первого ряда, затем — все места второго и так далее), в одном ряду места пронумерованы начиная от доски (т. е. с первой парты этого ряда), за одной партой сначала пронумеровано место слева, затем — место справа.

Рисунок иллюстрирует первый и второй примеры входных/выходных данных.

Санта-Клаус знает, что его место имеет номер k. Помогите ему узнать, в каком ряду за какую парту ему нужно сесть, а также слева его место или справа!

Входные данные

В единственной строке находятся три целых числа n, m и k (1 ≤ n, m ≤ 10 000, 1 ≤ k ≤ 2nm) — число рядов и число парт в каждом ряду, а так же номер места Санта-Клауса.

Выходные данные

Выведите два целых числа: номер ряда r, номер парты d, а также символ s, означающий сторону парты, за которую нужно сесть Санта-Клаусу. Символ s должен быть «L», если ему нужно сесть за левую сторону, и «R», если место Санта-Клауса справа.

Примечание

Первый и второй примеры показаны на картинке. Зеленым выделено место Санта-Клауса в первом примере, а голубым — его место во втором примере.

В третьем примере два ряда по четыре парты, а место Санта-Клауса — четвертое. Значит, его место в первом ряду за второй партой справа.

B. Санта-Клаус и проверка клавиатуры

реализация Строки *1500

Санта-Клаус решил разобрать свою клавиатуру, чтобы её почистить. После того, как он поставил все клавиши обратно, он с ужасом понял, что что-то не так: некоторые пары клавиш перепутаны между собой! Таким образом, Санта-Клаус подозревает, что каждая клавиша либо стоит на своём месте, либо заняла место другой, а та другая — на месте первой.

Для того, чтобы убедиться в этом, найти ошибку и восстановить верное расположение, Санта-Клаус набрал текст своей любимой скороговорки, смотря только на надписи на клавиатуре.

Вам даны любимая скороговорка Санта-Клауса и строка, которая получилась в результате набора. Определите, какие пары клавиш Санта-Клаус мог перепутать. Каждая клавиша должна принадлежать не более чем одной паре перепутанных клавиш.

Входные данные

Входные данные состоят из двух строк s и t — любимой скороговорки Санта-Клауса и строки, которая получилась после набора скороговорки. Строки s и t непусты и имеют одинаковую длину, которая не превышает 1000, включительно. Обе строки состоят только из строчных латинских букв.

Выходные данные

Если предположение Санта-Клауса неверно и клавиатура требует починки и её нельзя починить, поменяв местами буквы в нескольких непересекающихся парах, выведите одно число «-1» (без кавычек).

Иначе в первой строке выведите число k (k ≥ 0) — количество пар букв, которые нужно поменять местами. Затем в следующих k строках выведите по две буквы, разделённые пробелом — буквы, которые необходимо поменять местами на клавиатуре. Все выведенные буквы должны быть различны.

Если ответов несколько, выведите любой. Как пары, так и буквы в парах можно выводить в любом порядке.

Каждая буква должна присутствовать не более чем в одной паре. Санта-Клаус считает, что клавиши расположены корректно, если он может набрать на клавиатуре текст своей любимой скороговорки без ошибок.

A. Задача Бахгольда

жадные алгоритмы математика реализация теория чисел *800

Задача Бахгольда формулируется очень просто. Дано целое положительное число n. Требуется представить его в виде суммы максимального количества простых слагаемых. Известно, что представление в виде суммы простых существует для всех целых положительных чисел, больших 1.

Напомним, целое положительное число k называется простым, если оно больше 1 и у него ровно два целых положительных делителя — 1 и k.

Входные данные

В единственной строке записано целое число n (2 ≤ n ≤ 100 000).

Выходные данные

В первой строке выведите целое число k — максимально возможное количество простых слагаемых.

В следующей строке выведите k чисел — сами простые слагаемые. Их сумма должна быть равна n. Числа можно выводить в любом порядке. Если оптимальных решений несколько, разрешается вывести любое из них.

C. Голосование

жадные алгоритмы реализация *1500

В организации Alternative Cake Manufacturing (ACM) работает n сотрудников. Сейчас там проводится очень важное голосование, и все ведущие мировые СМИ пытаются спрогнозировать его результат.

Так получилось, что каждый из сотрудников имеет ярко выраженные политические взгляды и принадлежит либо к фракции депубликанцев, либо к фракции ремократов, и каждой фракции выгоден свой результат голосования. Процедура голосования устроена крайне необычно:

  1. Каждый из n сотрудников высказывается по очереди, начиная с сотрудника номер 1 и заканчивая сотрудником номер n. При этом если к моменту, когда сотруднику пора высказаться, его уже лишили права голоса, то он просто пропускает свой ход (и уже никак не участвует в голосовании в последствии).
  2. Высказывание сотрудника состоит в том, чтобы лишить права голоса любого другого сотрудника или ничего не сделать. Лишать права голоса можно как тех кто уже высказался, так и тех, кому только предстоит высказаться. Лишение права голоса действует в течение всего процесса голосования.
  3. Когда все сотрудники выскажутся, процедура повторяется: снова по очереди высказываются все от сотрудника 1 до сотрудника n, кто ещё не лишился права голоса.
  4. Повторения процедуры происходят до тех пор, пока не останется только один сотрудник с правом голоса, то он в одиночку решает исход голосования. Разумеется, он принимает решение в пользу своей фракции.

Зная порядок голосования и то, что все сотрудники действуют оптимально (и знают порядок голосования и кто принадлежит какой фракции), вы должны предсказать, какая фракция одержит верх.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 200 000) — количество сотрудников.

Далее записана строка из n символов, i-й из которых равен «D», если i-й человек поддерживает депубликанцев, либо «R», если i-й человек поддерживает ремократов.

Выходные данные

Выведите «D», если на голосовании будет принято решение, устраивающее фракцию депубликанцев, и «R», если ремократов.

Примечание

Рассмотрим один из вариантов голосования:

  1. 1-й сотрудник лишает голоса сотрудника 5.
  2. 2-й сотрудник лишает голоса сотрудника 3.
  3. 3-й сотрудник пропускает ход, так как его лишил голоса сотрудник 2.
  4. 4-й сотрудник лишает голоса сотрудника 2.
  5. 5-й сотрудник пропускает ход, так как его лишил голоса сотрудник 1.
  6. 1-й сотрудник опять высказывается и лишает голоса сотрудника 4.
  7. Только сотрудник 1 остался с правом голоса, поэтому голосование заканчивается принятием решения в пользу фракции депубликанцев.

A. Жизнь без нулей

реализация *1000

Вы можете себе представить, что было, если бы все нули исчезли из нашей жизни? Конечно же, появилось бы множество проблем.

Рассмотрим, например, что случилось бы с операцией сложения. Пусть дано верное равенство a + b = c, где a и b — целые положительные числа, а c — сумма a и b. Удалим все нули из этого равенства. Останется ли оно верным после этого?

Например, пусть дано равенство 101 + 102 = 203. Если мы удалим все нули, получится 11 + 12 = 23 — верное равенство.

Но если дано равенство 105 + 106 = 211, после удаления всех нулей получится 15 + 16 = 211 — неверное равенство.

Входные данные

Во входных данных 2 строки, в первой записано целое число a, во второй записано целое число b — числа из уравнений, описанного выше (1 ≤ a, b ≤ 109). Эти числа не содержат лидирующих нулей. Значение c определяется по формуле c = a + b.

Выходные данные

Выведите одну строку: если равенство будет верно после удаления всех нулей, выведите "YES", иначе выведите "NO".

B. Стена Facetook

Разбор выражений реализация Строки *1500

Facetook — широко известная социальная сеть. Недавно в ней появилась новая функция — стена с приоритетами. Эта функция позволяет сортировать всех ваших друзей по коэффициенту дружбы. Чем больше вы общаетесь с другом, тем больше будет его коэффициент дружбы.

На коэффициент дружбы влияет 3 типа действий:

  • 1. человек X написал на стене человек Y ("X posted on Y's wall") — 15 очков;
  • 2. человек X прокомментировал сообщение человека Y ("X commented on Y's post") — 10 очков;
  • 3. человеку X понравилось сообщение человека Y ("X likes Y's post") — 5 очков.

X и Y — два различных имени. Каждое действие увеличивает коэффициент дружбы между X и Y (и наоборот) на данное количество очков (коэффициент дружбы между X и Y равен коэффициенту дружбы между Y и X).

Вам дано n действий в формате, описанном выше. Выведите все различные имена, которые встречаются в списке действий, в отсортированном порядке в соответствие с коэффициентом дружбы с вами.

Входные данные

В первой строке записано ваше имя. Во второй строке записано целое число n, количество действий (1 ≤ n ≤ 100). Далее следует n строк. Гарантируется, что каждая строка содержит описание ровно одного действия в описанном выше формате. Между каждой парой слов в строке есть ровно один пробел, никаких других пробелов в строке нет. Все буквы имеют нижний регистр. Все имена во входных данных имеют длину от 1 до 10 строчных латинских букв.

Выходные данные

Выведите m строк, где m — количество различных имен во входных данных (исключая вас). Каждая строка должна содержать ровно одно имя. Имена должны быть отсортированы в по убыванию коэффициента дружбы с вами (т. е. люди с большим коэффициентом дружбы должны идти раньше). Если два или больше человек имеют одинаковый коэффициент дружбы, выводите их в алфавитном (лексикографическом) порядке.

Учтите, что нужно выводить все имена, присутствующие во входных данных (исключая вас), даже если человек имеет нулевой коэффициент дружбы с вами.

Лексикографическое сравнение реализует оператор "<" в современных языках программирования. Строка a лексикографически меньше строки b, если либо a является префиксом b, либо существует такое i (1 ≤ i ≤ min(|a|, |b|)), что ai < bi, а для любого j (1 ≤ j < i) aj = bj, где |a| и |b| обозначают длины строк a и b соответственно.

D. Максимальная сумма

Деревья дп жадные алгоритмы математика реализация Структуры данных *2000

Ахмед и Мостафа участвуют в соревнованиях по программированию уже много лет. Однажды их тренер Фегла попросил их решить одну непростую задачу. Конечно же, Ахмед справился, а Мостафа — нет.

Эта задача похожа на классическую задачу, но имеет другую структуру и ограничения.

В классической задаче дан массив целых чисел, требуется найти такой подмассив данного массива, что сумма чисел в нем максимальная возможная. Подмассив — последовательность из одного или нескольких подряд идущих элементов данного массива.

Но в данной задаче дано n маленьких массивов. Из них получается один большой массив — конкатенацией одного или нескольких экземпляров маленьких массивов (каждый маленький массив может встречаться в большом более одного раза). Большой массив задан в виде массива индексов (1-индексированных) маленьких массивов. Конкатенация должна быть выполнена в том же порядке, в котором числа записаны в массиве. После конкатенации на большом массиве решается описанная выше классическая задача.

Например, пусть маленькие массивы — {1, 6, -2}, {3, 3} и {-5, 1}. Индексы большого массива — {2, 3, 1, 3}. Так, после конкатенации большой массив будет {3, 3, -5, 1, 1, 6, -2, -5, 1}. В этом примере максимальная сумма равна 9.

Помогите Мостафе решить эту задачу.

Входные данные

В первой строке записано два целых числа n и m, где n — количество маленьких массивов (1 ≤ n ≤ 50), а m — количество индексов большого массива (1 ≤ m ≤ 250000). Далее следует n строк. Первое число в i-ой — целое число l, размер i-го маленького массива (1 ≤ l ≤ 5000). Далее следует l целых чисел, каждое из которых не меньше -1000 и не больше 1000. Последняя строка содержит m целых чисел — индексы большого массива. Вы должны конкатенировать маленькие массивы в этом порядке. Каждый индекс не меньше 1 и не больше n.

Маленькие массивы нумеруются от 1 до n в том же порядке, в котором они заданы во входных данных. Некоторые маленькие массивы могут не использоваться для построения большого массива.

Заметьте, что массив очень большой. Поэтому, если Вы попытаетесь построить его в явном виде, вы скорее всего превысите ограничения по времени и/или по памяти.

Выходные данные

Выведите одно число — наибольшую сумму на каком-либо подмассиве сформированного большого массива. Учтите, что подмассив суммирования не может быть пустым, то есть он должен включать в себя хотя бы один элемент.

Пожалуйста, не используйте спецификатор %lld для записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

A. Новый год и спешка

Бинарный поиск математика Перебор реализация *800

В последний день уходящего 2016 года Лимак собирается принять участие в соревновании по спортивному программированию. Соревнование начнётся в 20:00 и будет продолжаться четыре часа, то есть ровно до полуночи. Участникам будет предложено n задач, упорядоченных по возрастанию сложности, то есть задача 1 будет самой лёгкой, а задача номер n — самой сложной. Лимак знает, что ему потребуется i минут на решение i-й задачи.

Друзья Лимака планирую устроить роскошную новогоднюю вечеринку и Лимак хочет прибыть в полночь или ранее. Он знает, что ему требуется ровно k минут чтобы добрать до места проведения вечеринки от своего дома, где он собирается участвовать в соревновании.

Сколько максимум задач может успеть решить Лимак, так чтобы не опоздать на новогоднюю вечеринку?

Входные данные

В первой строке входных данных записаны два целых числа n и k (1 ≤ n ≤ 10, 1 ≤ k ≤ 240) — количество задач в соревновании и количество минут, за которое Лимак доберётся от дома до места проведения вечеринки.

Выходные данные

Выведите одно целое число, равное максимальному количеству задач, которое может решить Лимак, так чтобы прибыть на новогоднюю вечеринку ровно в полночь или раньше.

Примечание

В первом примере на соревновании участникам предложено 3 задачи и Лимаку требуется 222 минуты, чтобы доехать до места проведения вечеринки. Для решения задач требуется 5, 10 и 15 минут соответственно. Лимак может решить первые две задачи, потравив на это 5 + 10 = 15 минут, после чего выехать в 20:15 и приехать на вечеринку в 23:57 (через 222 минуты). Таким образом он решит две задачи, но на решение третьей времени уже не хватит и ответ равен 2.

Во втором примере Лимак может решить все 4 задачи за 5 + 10 + 15 + 20 = 50 минут. В 20:50 он сможет выехать из дома и прибыть на вечеринку ровно в полночь.

В третьем примере Лимаку нужна только 1 минута, чтобы оказаться на вечеринке, так что ему хватит времени для решения всех 7 задач.

B. Новый год и северный полюс

геометрия реализация *1300

В данной задаче мы будем полагать, что планета Земля является идеальным шаром, а её поверхность — идеальной сферой. Длину экватора и любого меридиана будем считать равной в точности 40 000 километров. Таким образом, путешествие от Северного полюса к Южному полюсу или наоборот занимает 20 000 километров.

Полярный медвежонок Лимак живёт на Северном полюсе. Незадолго до нового года он помогает кое-кому развозить подарки по всему миру. К сожалению, вместо точных координат мест, которые Лимак должен посетить, ему выдали лишь описание маршрута движения, в предположении, что он начинает на Северном полюсе. Описание маршрута состоит из n частей. На i-м участке Лимак должен двигаться ti километров в направлении, определяемом строкой diri, которая является одной из строк «North», «South», «West», «East». Данные направления означают движение на север, юг, запад и восток соответственно.

Лимак не уверен, что описание маршрута корректно. Помогите ему проверить выполнение следующих условий:

  • Если в некоторый момент времени (перед выполнением какой-либо инструкции или во время выполнения одной из них) Лимак находится на Северном полюсе, то он может двигаться только на юг.
  • Если в некоторый момент времени (перед выполнением какой-либо инструкции или во время выполнения одной из них) Лимак находится на Южном полюсе, то он может двигаться только на север.
  • Путешествие обязательно должно завершаться на Северном полюсе.

Проверьте, что все три условия выше выполняются и выведите «YES» или «NO».

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 50).

В i-й из последующих n строк записано целое число ti и строка diri (1 ≤ ti ≤ 106, ) — длина i-го участка маршрута и направление, в котором должен двигаться Лимак.

Выходные данные

Выведите «YES», если данный маршрут удовлетворяет всем трём условиям. В противном случае выведите «NO».

Примечание

Рисунок ниже демонстрирует как будет выглядеть путешествие Лимака в первых двух примерах. Во втором примере ответ «NO», поскольку путешествие не заканчивается на Северном полюсе.

D. Новый год и фейерверки

дп Перебор поиск в глубину и подобное реализация Структуры данных *1900

Одной из популярных традиций встречи нового года является запуск в небо фейерверков. Обычно фейерверк взлетает вертикально вверх в течение некоторого времени, после чего взрывается и разделяется на несколько частей, летящих в разных направлениях. Иногда эти части через некоторое время снова взрываются, также разделяясь на несколько частей и так далее.

Лимак живёт на бесконечном клетчатом поле и у него есть один фейерверк. Поведение этого фейерверка после запуска описывается рекурсией глубины n и продолжительностью каждого из уровней рекурсии t1, t2, ..., tn. Как только Лимак запустит фейерверк в какой-нибудь клетке поля, тот начнёт двигаться вверх. После прохождения t1 клеток (включая стартовую) он взрывается и разделяется на две части, каждая из которых двигается в направлении, изменённом на 45 градусов (для лучшего понимания посмотрите картинки ниже). Таким образом, одна часть будет двигаться в направлении вверх и влево, а другая в направлении вверх и вправо. Каждая из этих частей пройдёт t2 клеток, после чего также разделится на две части, каждая из которых также изменит траекторию на 45 градусов. Процесс будет продолжаться до n-го уровня рекурсии, после чего все 2n - 1 частей взорвутся и исчезнут не создавая новых частей.

После нескольких уровней рекурсивного разделения частей фейерверка может так оказаться, что две или более частей находятся в одной и той же клетке в один и тот же момент времени — такая ситуация разрешена и эти части не сталкиваются.

Перед тем как запустить данный фейерверк Лимак хочет убедиться в безопасности этого запуска. Сможете ли вы посчитать количество клеток, которые хотя бы один раз будут посещены какой-либо частью фейерверка?

Входные данные

В первой строке входных данных записано целое число n (1 ≤ n ≤ 30) — глубина рекурсии разделения фейерверка на части.

Во второй строке записаны n целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 5). На i-м уровне каждая из 2i - 1 частей фейерверка пройдёт ti клеток перед тем как взорвётся.

Выходные данные

Выведите одно целое число, равное количеству клеток которые будут посещены хотя бы одной частью фейерверка хотя бы один раз.

Примечание

Рассмотрим первый пример. Рисунки ниже показывают как будет выглядеть процесс работы фейерверка после каждого уровня рекурсии. Лимак запускает фейерверк из самой нижней красной клетки. После прохождения t1 = 4 клеток (отмеченных красным) он взрывается и делится на две части (их дальнейшее движение показано зелёным). Все взрывы отмечены символом «X». На последнем рисунке присутствуют 4 красных, 4 зелёных, 8 оранжевых и 23 розовых клетки. Таким образом, итоговое количество посещённых клеток равняется 4 + 4 + 8 + 23 = 39.

Для второго примера рисунки демонстрируют ситуацию на 4, 5 и 6 уровнях рекурсии. На рисунке посередине показаны направления всех частей, которые будут двигаться на следующем уровне.

F. Новый год и поиск корня

Деревья интерактив Конструктив реализация *2800

Это интерактивная задача. В секции «Протокол взаимодействия» вы найдёте информацию о том, как сбрасывать буфер вывода (делать операцию 'flush').

Новогоднее дерево высоты h является полным двоичным деревом, вершины которого некоторым образом пронумерованы от 1 до 2h - 1. В данной задаче мы будем считать, что h не меньше 2. Рисунок ниже изображает пример новогоднего дерева высоты 3:

Полярные медведи очень любят украшать новогодние деревья, и Лимак конечно же не исключение. Чтобы украсить дерево, ему требуется сначала найти его корень, то есть вершину у которой ровно два соседа (предполагая, что h ≥ 2). Маленькому медвежонку будет крайне непросто это сделать, так как он не может окинуть взглядом всё дерево. Сможете ли вы ему помочь?

Входных данные содержат t тестовых примеров. В начале каждого тестового примера на ввод подаётся единственное число h. Далее вы можете сделать не более 16 запросов в формате «? x», где x — некоторое целое число от 1 до 2h - 1 включительно. В качестве ответа вам будет дан список всех соседей вершины x (подробнее смотрите секцию «Протокол взаимодействия»). Например если про дерево с картинки выше сделать запрос «? 1», то в качестве ответа будут получены 3 его соседа: 4, 5 и 7. Ваша задача — найти индекс корневой вершины y и сообщить его в формате запроса «! y». Вы сможете считать значение h для следующего тестового примера только после вывода ответа для предыдущего примера и выполнения операции 'flush'.

В каждом тестовом примере дерево фиксировано с самого начала и не изменяется в зависимости от запросов.

Входные данные

В первой строке ввода содержится единственное целое число t (1 ≤ t ≤ 500) — количество тестовых примеров.

В начале обработки каждого тестового примера следует считать из ввода целое число h (2 ≤ h ≤ 7) — высоту дерева. Вы не сможете считать значение h для следующего примера, пока не дадите ответ на текущий.

Протокол взаимодействия

Чтобы запросить список соседей вершины x выведите «? x» (без кавычек) в отдельной строке. Не забудьте вывести символ конца строки и выполнить операцию 'flush' чтобы получить ответ.

Ответ на запрос состоит из двух строк. В первой из них записано целое число k (1 ≤ k ≤ 3) — количество соседей вершины x. Во второй строке записаны k различных целых чисел t1, ..., tk (1 ≤ t1 < ... < tk ≤ 2h - 1) — индексы вершин смежных вершине x, перечисленные в порядке возрастания.

Сделав не более 16 запросов для одного тестового примера вы должны сообщить y — индекс корня дерева. Выведите «! y» (без кавычек) и символ конца строки, после чего выполните операцию 'flush'.

В каждом тестовом примере дерево фиксировано с самого начала и не изменяется в зависимости от запросов.

Если вы ничего не выведите или забудете сделать операцию 'flush', то можете получить вердикт Idleness Limit Exceeded.

Для сброса буфера вывода (то есть для операции 'flush') сразу после вывода числа или ответа и перевода строки можно сделать:

  • fflush(stdout) в языке C++;
  • System.out.flush() в Java;
  • stdout.flush() в Python;
  • flush(output) в Pascal;
  • смотрите документацию для других языков.

Если в любой момент ваша программа считает h = 0 или k = 0 она должна немедленно завершиться с нулевым кодом возврата (например, вызовом exit(0)). Это означает, что проверяющая программа обнаружила некорректный запрос или вывод и вывела 0, так как не может дальше обрабатывать запросы. В этом случае вы получите вердикт «Wrong Answer», но если ваша программа не завершится после считывания h = 0 или k = 0 то это может привести к получению вердиктов «Runtime Error», «Time/Memory limit exceeded» или любых других поскольку ваша программа продолжит считывать мусор из уже закрытого потока ввода.

Взломы. Для взломов не разрешается использовать мультитест. Чтобы совершить взлом, используйте следующий формат входных данных:

В первой строке следует записать одно целое число t равное 1.

Во второй строке должно быть записано одно целое число h. В каждой из последующих 2h - 2 строк должна быть записана пара целых чисел ai и bi (1 ≤ ai, bi ≤ 2h - 1), означающая что две вершины с данными индексами соединены ребром. Выведенный набор рёбер должен задавать полное двоичное дерево высоты h.

Разумеется, это описание дерева не будет доступно взламываемому участнику.

Примечание

В первом примере дерево соответствует изображённому на рисунке в условии.

Второй пример состоит из двух наборов входных данных. Дерево в первом из них имеет высоту 2 и содержит 3 вершины. Дерево во втором примере имеет высоту 4 и содержит 15 вершин. Оба дерева изображены на рисунке ниже.

B. Интерактивные быки и коровы (простая версия)

Конструктив Перебор реализация *1600

Эта задача слегка необычна, она интерактивная. В ней вы должны реализовать взаимодействие с тестирующей системой. Это означает, что ваша программа может осуществлять запросы и получать ответы в режиме онлайн. Пожалуйста, используйте операции отчистки буфера вывода после вывода каждого вашего запроса. Например, в C++ можно использовать fflush(stdout), в Java вызов System.out.flush(), а в Pascal — flush(output).

«Быки и коровы» — это логическая игра для двух игроков, вариация коммерческой настольной игры Mastermind.

Первый игрок загадывает секретную строку, которая состоит из 4 различных цифр. Строка может начинаться с 0.

Затем второй игрок отгадывает загаданную секретную строку, делая попытки. Каждая попытка — это строка из четырех цифр. Если совпадение произошло и в позиции и по значению, то говорят, что встретился «бык», а если совпадение произошло по значению, но не по позиции, то встретилась «корова». Попытка может содержать одинаковые цифры.

Формально, допустим секретная строка это s, а попытка — это строка x. Тогда количество быков равно количеству таких позиций i (1 ≤ i ≤ 4), что s[i] = x[i]. Количество коров — это количество таких цифр c, что s содержит c в позиции i (то есть s[i] = c), x содержит c, но x[i] ≠ c.

Например, если секретная строка это «0427», а попытка второго игрока это «0724», то результат это 2 быка и 2 коровы (быки это "0" и "2", а коровы это "4" и "7"). Если секретная строка это «0123», а попытка второго игрока равна «0330», тогда результат это 1 бык и 1 корова.

В этой задаче вам надо отгадать секретную строку s, которая была загадана тестирующей системой. Загаданная строка состоит из 4 цифр, все цифры в ней различны.

Вы можете делать попытки, посылая строки из 4 цифр (не обязательно различных). Результатом на запрос является количество быков и коров. Если ответ системы равен "4 0", то значит вы отгадали секретную строку и ваша программа должна завершить своё исполнение обычным образом. Кроме того, в вашу программу будет отправлено "4 0", если вы слелали некорректный ход. В этом случае программу также надо завершить обычным образом, а вердикт на этот тест будет «неправильный ответ».

Ваша программа должна совершить не более 50 запросов.

Вы можете взламывать решения других участников, задавая 4-цифренную секретную строку (все цифры должны быть различны).

Входные данные

Для того, чтобы читать ответы на запросы ваша программа должна использовать стандартный ввод.

Программа будет получать пары неотрицательных целых чисел, по одной паре в строке. Первое число в паре — количество быков, второе — коров. Если пришла пара "4 0", то ваша программа должна завершить исполнение.

Тестирующая система даст прочитать очередную пару только после записи в стандартный вывод соответствующего запроса (не забудьте после вывода запроса сделать flush).

Выходные данные

Программа должна использовать стандартный вывод, чтобы осуществлять запросы.

Каждый запрос — это строка из 4 цифр. После вывода строки осуществите операцию flush. После вывода запроса программа должна прочитать результат из стандартного ввода.

Программа может сделать не более 50 запросов.

Примечание

Секретная строка s в примере это «0123».

A. Леша и разбиение массива

жадные алгоритмы Конструктив реализация *1200

Одним весенним днем, идя в университет, Леша нашел массив A. Леша очень любит разбивать массив на несколько частей. В этот раз он решил, что неплохо было бы найти разбиение массива A на несколько, а возможно и на один, новых массивов, причем чтобы сумма элементов в каждом новом массиве не была равна нулю. Ещё одним необходимым условием является то, что при склейке новых массивов должен получиться старый массив A.

Леша очень устал после университета, и поэтому разбиение массива было поручено вам. Помогите Леше!

Входные данные

В первой строке входных данных находится одно целое число n (1 ≤ n ≤ 100) — количество элементов в массиве A.

В следующей строке входных данных находятся n целых чисел a1, a2, ..., an ( - 103 ≤ ai ≤ 103) — элементы массива A.

Выходные данные

Если необходимого разбиения массива A не существует, то в единственной строке выходных данных выведите «NO» (без кавычек).

Иначе в первой строке строке выходных данных выведите «YES» (без кавычек). В следующей строке выходных данных следует вывести целое число k — количество массивов в разбиении. В каждой из следующих k строк следует вывести пару целых чисел li, ri, означающих, что подотрезок A[li... ri] исходного массива A является i-м массивом в разбиении. Числа li, ri должны удовлетворять следующим условиям:

  • l1 = 1
  • rk = n
  • ri + 1 = li + 1, для всех 1 ≤ i < k.

Если ответов несколько, то выведите любой.

B. Илья и игра в крестики-нолики

Перебор реализация *1100

Илья заядлый игрок в крестики-нолики на поле 4 × 4. Илья всегда начинает ходить первым и ходит крестиком. Сегодня он сыграл очень много игр со своим другом Арсением. Друзья очень устали и не доиграли одну игру. Следующий ход в недоигранной игре за Ильей. Помогите определить, можно ли было Илье, сделав ровно один ход, выиграть Арсения.

Напомним правила игры в крестики-нолики на поле 4 × 4. Перед первым ходом все клетки поля пустые. Игроки по-очереди ставят свои знаки (первый игрок крестики, второй игрок нолики) на свободные клетки. Первый ход делает игрок, который ходит крестиком. Второй игрок ходит ноликом. Выигрывает тот игрок, который смог первым поставить три своих знака в ряд рядом друг с другом (по горизонтали, вертикали или диагонали).

Входные данные

Состояние игры в крестики-нолики задано в четырех строках входных данных.

Каждая из строк содержит по четыре подряд идущих символа. Каждый из символов равен '.' (свободная клетка), 'x' (маленькая латинская буква x) либо 'o' (маленькая латинская буква o). Гарантируется, что во входных данных дано состояние, которое может получиться при игре в крестики-нолики, и следующий ход за Ильей (в частности, это означает, что игра не окончена). Также во входных данных может быть задано пустое поле игры в крестики-нолики. Это значит, что друзья устали не сделав ни хода.

Выходные данные

В единственную строку выходных данных необходимо вывести «YES», если Илья мог бы выиграть ровно за один ход. Иначе следует вывести «NO».

Примечание

В первом примере у Ильи было два возможных хода для победы — это ход в самую левую свободную клетку и ход в самую левую свободную клетку в первой строке.

Во втором тестовом примере победить за один ход невозможно.

В третьем тестовом примере существует всего один возможный ход для победы Ильи — ход в самую нижнюю свободную клетку между двумя крестиками.

В четвертом тестовом примере победить за один ход невозможно.

C. Владик и чат

дп Конструктив Перебор реализация Строки *2200

Недавно Владик нашел себе новое увлечение — написание ботов для социальных сетей. Ботов он хочет писать не простых, а с использованием машинного обучения. Поэтому он собрался обучать ботов на данных.

Первым делом он решил выкачать t чатов. Владик написал скрипт, который должен был выкачать все чаты. По каким-то неизвестным причинам переписки выкачались неполными, а точнее у некоторых сообщений оказался неизвестен отправитель. Зато известно, что если пользователь отсылал несколько сообщений подряд, то они объединялись в одно. То есть нет двух подряд сообщений в одном чате с одним и тем же автором. Ещё известно, что отправитель сообщения не упоминал себя в сообщении.

Владик хочет восстановить отправителя для каждого сообщения с неизвестным отправителем, так чтобы у любых двух последовательных сообщений одного чата были разные отправители, и никакой отправитель не упоминал бы себя в своих сообщениях.

Он не придумал как это делать, поэтому просит вас помочь ему. Помогите Владику восстановить отправителей сообщений для каждого чата!

Входные данные

В первой строке входных данных находится единственное целое число t (1 ≤ t ≤ 10) — количество выкачанных чатов. Далее задано t чатов. Каждый чат задан в следующем формате.

В первой строке каждого описания записано целое число n (1 ≤ n ≤ 100) — количество пользователей в чате.

В следующей строке находятся n различных имен пользователей разделенных пробелом. Каждое имя пользователя состоит из прописных и строчных латинских букв и цифр, причем имя не может начинаться на цифру. Два имени пользователя различаются даже тогда, когда они различаются только регистром букв. Длина имени положительна и не превышает 10 символов.

В следующей строке дано целое число m (1 ≤ m ≤ 100) — количество сообщений в чате. В следующих m строках находятся сообщения в одном из следующих форматов, по одному на строке:

  • <имя отправителя>:<текст сообщения> — формат сообщения, для которого известен отправитель. Имя отправителя должно присутствовать в списке имен пользователей чата.
  • <?>:<текст сообщения> — формат сообщения, для которого неизвестен отправитель.

Текст сообщения может состоять из маленьких и больших латинских букв, цифр, '.' (точка), ',' (запятая), '!' (восклицательный знак), '?' (вопросительный знак) или ' ' (пробел). Текст сообщения не содержит пробелов в конце. Длина текста сообщения положительна и не превышает 100 символов.

Определим, что значит упоминание пользователя в сообщении. Пользователь упоминается в сообщении, если он содержится в сообщении в качестве слова. Иными словами так, что соседний слева и соседний справа от имени символы либо отсутствуют либо не равны латинской букве и цифре. Например, сообщение «Vasya, masha13 and Kate!» может содержать упоминания пользователей «Vasya», «masha13», «and» и «Kate», но не «masha».

Гарантируется, что в каждом чате, заданном во входных данных, для всех известных пользователей выполняется, что пользователь не упоминает сам себя в сообщении и нет двух подряд идущих сообщений с одним и тем же известным отправителем.

Выходные данные

Во входные данные следует вывести информацию о t чатах в следующем формате:

Если нет ни одного способа восстановить неизвестных отправителей в чате, то для такого чата следует вывести «Impossible». Иначе следует вывести m сообщений в формате:

<имя отправителя>:<текст сообщения>

Если возможных ответов несколько, следует вывести любой.

A. Поймать всех!

реализация *1000

Баш хочет когда-нибудь стать мастером Покемонов. Ему нравятся многие покемоны, но больше всего он впечатлен Бульбазавром. Он еще слишком юн, чтобы поймать Бульбазавра по-настоящему, поэтому он придумал свой способ поймать его.

Каждый день Баш берет первую страницу газеты и вырезает из нее буквы. Он составляет из них слова "Bulbasaur" (без кавычек) и клеит себе на стену. Башу важен регистр букв: первая буква "Bulbasaur" должна быть заглавная, а остальные — строчные. Составив очередное слово, он считает, что поймал одного Бульбазавра. Затем он продолжает вырезать буквы и составлять из них слово, пока на странице еще достаточно букв для составления слова "Bulbasaur".

Вам дан текст первой страницы газеты. Сколько Бульбазавров поймает Баш сегодня?

Помните: заглавные и строчные буквы считаются разными.

Входные данные

Единственная строка содержит строку s (1  ≤  |s|  ≤  105) — текст на первой странице газеты, без пробелов и знаков препинания. |s| — длина строки s.

Строка s состоит из заглавных и строчных букв латинского алфавита, то есть .

Выходные данные

Выведите единственное число — ответ на задачу.

Примечание

В первом тесте из примера Баш может выбрать выделенные буквы: Bulbbasaur.

Во втором примере невозможно поймать ни одного Бульбазавра.

В третьем примере можно расположить буквы в порядке BulbasaurBulbasauraddrgndgddgargndbb и составить два слова "Bulbasaur".

A. Праздник равенства

математика реализация *800

В Берляндии наступил праздник равенства. В честь праздника король решил за счёт государственной казны уравнять благосостояние всех граждан Берляндии.

Всего в Берляндии n граждан, благосостояние каждого из которых оценивается целым числом в ai бурлей (бурль — денежная единица Берляндии).

Вы — королевский казначей, которому требуется посчитать минимальные расходы королевства на подарок короля. Король может только давать деньги, а отбирать их он не имеет права.

Входные данные

В первой строке входных данных содержится целое число n (1 ≤ n ≤ 100) — количество граждан Королевства.

Во второй строке содержатся n чисел a1, a2, ..., an, где ai (0 ≤ ai ≤ 106) — благосостояние i-го гражданина.

Выходные данные

В единственную строку выходных данных выведите выведите целое число S — минимальное количество бурлей, которое придётся потратить.

Примечание

В первом примере, если прибавить первому гражданину 4 бурля, второму 3, третьему 2 и четвёртому 1, то у всех граждан благосостояние станет равным 4.

Во втором примере достаточно дать третьему гражданину один бурль.

В третьем примере нужно отдать по два бурля первому и третьему гражданам, чтобы благосостояние всех граждан стало равным 3.

В четвёртом примере можно никому ничего не давать, так как у всех граждан уже по 12 бурлей.

B. Сломанная гирлянда

Перебор реализация теория чисел *1100

Ничто не вечно в этом мире, понял Костя утром 7-го января, увидев частично перегоревшую четырехцветную гирлянду. Он сразу задался целью заменить сломанные лампочки, однако он не знает сколько лампочек каждого цвета требуется. Гарантируется, что для каждого из четырех цветов хотя бы одна лампочка осталась рабочей.

Известно, что гирлянда состоит из лампочек четырёх цветов: красного, синего, жёлтого и зелёного. Гирлянда сделана следующим образом: если вы возьмёте четыре любые подряд идущие лампочки, то среди них нет лампочек одинакового цвета. Например, гирлянда может иметь вид «RYBGRYBGRY», «YBGRYBGRYBG», «BGRYB», но не может «BGRYG», «YBGRYBYGR» или «BGYBGY». Буквы обозначают цвета: 'R' — красный, 'B' — синий, 'Y' — жёлтый, 'G' — зелёный.

Используя то, что для каждого цвета хотя бы одна лампочка всё еще горит, посчитайте количество перегоревших лампочек каждого из четырёх цветов.

Входные данные

В первой и единственной строке входных данных содержится строка s (4 ≤ |s| ≤ 100), описывающая гирлянду, i-й символ которой описывает цвет i-й по порядку от начала гирлянды лампочки:

  • 'R' — лампочка горит красным,
  • 'B' — лампочка горит синим,
  • 'Y' — лампочка горит жёлтым,
  • 'G' — лампочка горит зелёным,
  • '!' — лампочка перегорела.

Других символов, кроме описанных пяти, строка s содержать не может.

Гарантируется, что в заданной строке присутствует хотя бы раз каждая из четырех букв 'R', 'B', 'Y' и 'G'.

Гарантируется, что строка s представляет собой корректную гирлянду с некоторыми перегоревшими лампочками, то есть например строка «GRBY!!!B» не может находится во входных данных.

Выходные данные

В единственную строку выходных данных выведите четыре целых числа kr, kb, ky, kg — количество перегоревших лампочек красного, синего, жёлтого и зелёного цветов соответственно.

Примечание

В первом тесте из примеров нет перегоревших лампочек.

Во втором примере очевидно, что перегорела одна синяя лампочка, так как лампочки другого цвета на её месте не могло быть по условию.

C. Несправедливый опрос

Бинарный поиск Конструктив математика реализация *1700

На уроке литературы Серёжа заметил чудовищную несправедливость, ему кажется, что некоторых учеников спрашивают чаще чем других.

Рассадка в классе представляет собой прямоугольник, в котором n рядов по m учащихся в каждом.

Учительница опрашивает учеников в следующем порядке: сначала она спрашивает всех учеников с первого ряда в порядке их рассадки на ряду, после опроса всех учеников на очередном ряду она переходит к следующему, по порядку следования опроса, ряду. Если учительница опросила последний ряд, то направление опроса сменяется, то есть опрашивается предыдущий ряд. Порядок опроса рядов выглядит следующим образом: 1-й ряд, 2-й ряд, ..., n - 1-й ряд, n-й ряд, n - 1-й ряд, ..., 2-й ряд, 1-й ряд, 2-й ряд, ...

Порядок опроса учеников на одном ряду всегда один и тот же: 1-й ученик, 2-й ученик, ..., m-й ученик.

За урок учительница успела опросить ровно k вопросов у учеников в порядке описанном выше. Серёжа сидит в x-м ряду, на y-м по порядку месте. Сергей решил доказать учителю, что ученики опрашиваются неравномерно, помогите ему вычислить три величины:

  1. максимальное количество вопросов, заданных одному из учеников,
  2. минимальное количество вопросов, заданных одному из учеников,
  3. сколько раз учительница спросила Серёжу.

Если в классе только один ряд, то учительница всегда опрашивает детей с него.

Входные данные

Первая и единственная строка содержит пять целых чисел n, m, k, x и y (1 ≤ n, m ≤ 100, 1 ≤ k ≤ 1018, 1 ≤ x ≤ n, 1 ≤ y ≤ m).

Выходные данные

Выведите три числа:

  1. максимальное количество вопросов, заданных одному из учеников,
  2. минимальное количество вопросов, заданных одному из учеников,
  3. сколько раз учительница спросила Серёжу.
Примечание

Порядок опроса учеников в первом тесте:

  1. ученик с первого ряда сидящий за первой партой, то есть Серёжа;
  2. ученик с первого ряда сидящий за второй партой;
  3. ученик с первого ряда сидящий за третьей партой;
  4. ученик с первого ряда сидящий за первой партой, то есть Серёжа;
  5. ученик с первого ряда сидящий за второй партой;
  6. ученик с первого ряда сидящий за третьей партой;
  7. ученик с первого ряда сидящий за первой партой, то есть Серёжа;
  8. ученик с первого ряда сидящий за второй партой;

Порядок опроса учеников во втором тесте:

  1. ученик с первого ряда сидящий за первой партой;
  2. ученик с первого ряда сидящий за второй партой;
  3. ученик со второго ряда сидящий за первой партой;
  4. ученик со второго ряда сидящий за второй партой;
  5. ученик с третьего ряда сидящий за первой партой;
  6. ученик с третьего ряда сидящий за второй партой;
  7. ученик с четвёртого ряда сидящий за первой партой;
  8. ученик с четвёртого ряда сидящий за второй партой, то есть Серёжа;
  9. ученик с третьего ряда сидящий за первой партой;

E. Точки

математика реализация *1700

На плоскости задано N точек. Напишите программу, которая найдет сумму квадратов расстояний между всеми парами точек.

Входные данные

Первая строка входного файла содержит единственное натуральное число N (1 ≤ N ≤ 100 000) — количество точек. Последующие N строк содержат по два целых числа X и Y ( - 10 000 ≤ X, Y ≤ 10 000) — координаты точек. Данные могут содержать совпадающие точки.

Выходные данные

Единственная строка выходного файла должна содержать сумму квадратов расстояний между всеми парами точек.

A. Петя и календарь

математика реализация *800

Петя решил сделать календарь на текущий месяц. Для этого он рисует таблицу, в которой столбцы будут соответствовать неделям (неделя — семь последовательных дней, начинающиеся в понедельник и заканчивающиеся в воскресение), строки — дням недели, а в клетках таблицы будут записаны числа месяца. Например, календарь на январь 2017-го года выглядит так:

Петя задался вопросом: а сколько столбцов будет в этой таблице, если известно, какой это месяц и каким днем недели является первое число? Год считается невисокосным.

Входные данные

В единственной строке находятся два целых числа m и d (1 ≤ m ≤ 12, 1 ≤ d ≤ 7) — номер месяца на календаре (январь — первый месяц, декабрь — двенадцатый) и день недели первого числа этого месяца (1 — понедельник, 7 — воскресенье).

Выходные данные

Выведите единственное число: число столбцов в таблице.

Примечание

Первый пример соответствует январю 2017, показанному в таблице в условии.

Во втором примере 1-е января — понедельник, поэтому месяц помещается в 5 столбцах.

В третьем примере 1-е ноября — суббота, достаточно 5 столбцов.

A. Даша и лестница

Конструктив математика Перебор реализация *1000

По пути на занятия по программированию тигра Дашу ждало первое испытание — огромная лестница!

Ступеньки лестницы были пронумерованы, начиная с единицы до бесконечности. Как известно, тигры очень любят все чередующееся, не исключено, что это как-то связано с их окраской. Поэтому на некотором отрезке своего пути она посчитала два числа — количество ступенек с чётными и нечётными номерами.

Вам необходимо проверить, существует ли такой промежуток ступенек c l-й по r(1 ≤ l ≤ r), для которого числа, посчитанные Дашей, верны.

Входные данные

В единственной строке вам заданы два целых числа a, b (0 ≤ a, b ≤ 100) — количество чётных и нечётных ступенек соответственно.

Выходные данные

В единственной строке выходных данных выведите «YES», если отрезок ступенек, описанный входными данными существует, и «NO» в противном случае.

Примечание

В первом примере один из подходящих промежутков от 1 до 5. В этом интервале две четные ступеньки — 2 и 4, и три нечетных: 1, 3 и 5.

B. Даша и друзья

математика Перебор реализация *1300

Бег с препятствиями на кольцевом треке очень популярен в стране, в которой живет Даша, поэтому немудрено, что по пути на занятия она смогла застать следующую картину:

Трек представляет собой окружность длины L, в различных точках которой находятся n препятствий. Спортсмены всегда пробегают трек против часовой стрелки, если смотреть на него сверху. Все препятствия расположены на целочисленном расстоянии друг от друга вдоль трека.

Ее друзья попугай Кефа и леопард Саша участвовали в соревнованиях и каждый из них пробежал один круг. Каждый из друзей стартовал из некоторой целочисленной точки трека. Оба друга, для каждого из n препятствий записали расстояние от своего старта вдоль трека. Таким образом, каждый из них записал n чисел в порядке возрастания, каждое из этих чисел было в пределах от 0 до L - 1 включительно.

Рассмотрим пример. Пусть L = 8, синие кружки — препятствия, а зеленые точки — старты Кефы (A) и Саши (B). Тогда Кефа выпишет последовательность [2, 4, 6], а Саша — [1, 5, 7].

В стране есть разные треки, у всех из них совпадает общая длина и количество препятствий, но положения препятствий могут быть разные. Даше интересно, пробежали ли Саша и Кефа они один и тот же трек, или они участвовали на разных треках.

Напишите программу, которая проверит, что трек Кефы и трек Саши совпадают (то есть один может быть получен из другого изменением точки старта). Обратите внимание, что они всегда пробегают трек в одинаковом направлении — против часовой стрелки, если смотреть на него сверху.

Входные данные

В первой строке записаны два целых числа n и L (1 ≤ n ≤ 50, n ≤ L ≤ 100) — количество препятствий на треке и его длина.

Во второй строке записаны n различных целых чисел в порядке возрастания — расстояния от старта Кефы до каждого из препятствий в порядке их преодоления. Все числа целые, лежат в границах от 0 до L - 1 включительно.

Во второй строке записаны n различных целых чисел в порядке возрастания — расстояния от старта Саши до каждого из препятствий в порядке их преодоления. Все числа целые, лежат в границах от 0 до L - 1 включительно.

Выходные данные

Выведите «YES» (без кавычек), если Кефа и Саша пробежали совпадающие треки (то есть такие, что положения всех препятствий совпадают, если начать из одинаковых точек трека). Выведите «NO» (без кавычек) в противном случае.

Примечание

Первый пример разобран в условии.

C. Даша и пароль

дп Перебор реализация *1500

Преодолев лестницу, Даша оказалась на занятиях. Чтобы начать заниматься, ей необходимо ввести пароль. Пароль — это строка длины n, удовлетворяющая следующим требованиям:

  • В строке присутствует как минимум одна цифра,
  • В строке присутствует как минимум одна строчная (маленькая) буква латинского алфавита,
  • В строке присутствует как минимум один из трёх перечисленных символов — '#', '*', '&'.

Учитывая, что это занятия по программированию, просто так записать пароль не получится.

Для каждого символа пароля закреплена некоторая строка длины m, на каждой из этих n строк стоит указатель на некоторый символ в этой строке. Символ номер i на экране это символ, на который указывает указатель в i-ой строке. Изначально все указатели стоят на символе с индексом 1 (все позиции в этой задаче нумеруются с единицы).

За одну операцию Даша может передвинуть указатель любой одной строки на один символ влево или вправо. Строки цикличны, то есть при сдвиге указателя, который стоит на символе с индексом 1, влево, он перемещается на символ с индексом m, а при сдвиге вправо с позиции m он переместится на позицию 1.

Вам необходимо определить минимальное количество операций, необходимых для того, чтобы строка, отображаемая на экране, стала паролем.

Входные данные

В первой строке находятся два целых числа n, m (3 ≤ n ≤ 50, 1 ≤ m ≤ 50) — длина пароля и длина строк закрепленных за символами пароля.

В каждой из следующих n строк находится строка, закрепленная за i-м символом строки-пароля, длины m, состоящая из цифр, строчных латинских букв и символов '#', '*', '&'.

Входные данные таковы, что всегда можно получить строку-пароль.

Выходные данные

Выведите одно целое число — минимальное количество операций, необходимых для того, чтобы строка, отображаемая на экране, стала паролем.

Примечание

В первом примере для получения оптимального ответа нужно передвинуть указатель третьего символа на один влево.

Во втором примере одной из возможных последовательностей действий будет:

  • сдвинуть указатель второго символа вправо.
  • сдвинуть указатель третьего символа дважды вправо.

F. Даша и фотографии

дп Перебор реализация Структуры данных *2600

Даша решила немного отдохнуть после решения задачи D и стала просматривать фотографии с прошедших олимпиад.

Назовем фотографией матрицу размера n × m, состоящую из строчных латинских букв.

Некоторые k фотографий особенно заинтересовали её, так как их можно было получить из фотографии-шаблона путем покраски прямоугольной области в некоторый цвет. Назовем такие фотографии особенными.

Более формально i-я особенная фотография получается из фотографии-шаблона путем замены всех символов на некотором прямоугольнике с левым верхним углом в клетке с координатами (ai, bi) и с правым нижним углом в клетке с координатами (ci, di) на символ ei.

Даша просит вас найти особенную фотографию, суммарное расстояние от которой до всех остальных особенных фотографий минимально. И вычислить это расстояние.

Определим расстояние между двумя фотографиями, как сумму расстояний между всеми соответствующими буквами. Расстоянием между двумя буквами является модуль разницы их позиций в алфавите. Например, расстояние между буквами 'h' и 'm' равно |8 - 13| = 5, потому что буква 'h' 8-я в алфавите, а буква 'm' — 13-я.

Входные данные

Первая строка содержит три целых числа n, m, k (1 ≤ n, m ≤ 103, 1 ≤ k ≤ 3·105) — количество строк в фотографии-шаблоне, количество столбцов и количество особенных фотографий заинтересовавших Дашу.

Следующие n строк содержат строку длины m состоящую из маленьких латинских символов — описание фотографии-шаблона.

Каждая из следующих k строк содержат описание особенной фотографии в следующем формате, «ai bi ci di ei» (1 ≤ ai ≤ ci ≤ n, 1 ≤ bi ≤ di ≤ m), где (ai, bi) — координата левого верхнего угла прямоугольника, (ci, di) — правого нижнего, а ei — маленькая латинская буква на которую происходит замена в описанном прямоугольнике фотографии-шаблона.

Выходные данные

В единственную строку выходных данных необходимо вывести минимальное суммарное расстояние от найденной особенной фотографии до всех остальных особенных фотографий.

Примечание

В первом примере фотографии выглядят так:


bba aaa
bba acc
aaa acc

Расстояние между ними равно 10.

B. USB vs. PS/2

жадные алгоритмы реализация сортировки *1400

В связи с увеличением количества студентов в Берляндском государственном университете было решено оборудовать новый компьютерный кабинет. Вам было поручено купить мыши, и как можно дешевле, ведь в стране кризис!

Компьютеры, заказанные для кабинета, оказались существенно разными. Некоторые из них имеют только порты USB, некоторые — только PS/2, а на некоторых присутствуют оба варианта.

На сайте компьютерного магазина вы нашли прайс-лист, в котором для m мышей указаны цена и тип порта, к которому мышь можно подключить (USB или PS/2). Каждая мышь из списка есть в магазине в единственном экземпляре.

Вы хотите купить некоторый набор мышей из данного прайс-листа так, чтобы в первую очередь максимизировать количество оборудованных мышами компьютеров (не гарантируется, что удастся оборудовать все компьютеры), а при равенстве этой величины минимизировать суммарную стоимость купленных мышей.

Входные данные

В первой строке следуют три целых числа a, b и c (0 ≤ a, b, c ≤ 105) — количество компьютеров, имеющих только USB входы, количество компьютеров, имеющих только PS/2 входы, и количество компьютеров, у которых присутствуют оба варианта, соответственно.

Затем на новой строке записано единственное целое число m (0 ≤ m ≤ 3·105) — количество мышей в прайс-листе.

Далее следуют m строк, описывающих очередную мышь. В i-й строке сначала записано целое число vali (1 ≤ vali ≤ 109) — стоимость i-й мыши, затем, через пробел, тип порта (USB или PS/2), необходимый для её подключения.

Выходные данные

Выведите два целых числа через пробел — количество оборудованных компьютеров и суммарную стоимость приобретённых мышей.

Примечание

В первом примере можно купить первые три мыши, оборудовав один из компьютеров с USB входом мышью с USB выходом, а две PS/2 мыши подключить к компьютеру с PS/2 и компьютеру с обоими входами.

D. Максимальный путь

дп жадные алгоритмы реализация *2300

Дана прямоугольная таблица 3 × n, в каждой клетке которой записано число. Разрешается переходить из клетки в клетку, если они имеют общую сторону.

Найдите такой путь из верхней левой в правую нижнюю клетку таблицы, чтобы никакая клетка таблицы не была посещена дважды, а сумма чисел, записанных в клетках найденного пути, была максимальной.

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 105) — количество столбцов в таблице.

В следующих трёх строках следует по n целых чисел — описание таблицы, причём j-е число в i-й строке соответствует ячейке таблицы aij ( - 109 ≤ aij ≤ 109).

Выходные данные

Выведите максимальную сумму чисел на пути из левой верхней в правую нижнюю клетку таблицы. Путь не должен посещать никакую клетку дважды.

Примечание

Путь для первого примера из условия:

Путь для второго примера:

A. Тимофей и береза

графы Деревья дп поиск в глубину и подобное реализация снм *1600

Каждый Новый Год Тимофей и его друзья рубят в лесу дерево из n вершин и приносят его домой. Чтобы получше его украсить, они превращают его в березу. Береза — дерево из n вершин, каждая вершина i которого покрашена в какой-то цвет ci.

Но вот настал день рождения, и мама Тимофея попросила его вынести березу. Тимофей выносит березу так: хватает за какую-то вершину, остальные вершины опускаются вниз, и дерево становится подвешенным за вершину, за которую он схватил. После этого он идет с ним на улицу и выкидывает.

Попытавшись ухватить березу, Тимофей понял, что его раздражают разноцветные переливы. Поддерево раздражает Тимофея, если в нем есть вершины разных цветов. Он хочет найти, за какую вершину ему нужно взяться, чтобы ни одно поддерево не раздражало его. При этом он не рассматривает все дерево целиком как поддерево, потому что он не видит цвет корневой вершины.

Поддерево некоторой вершины — это подграф, содержащий эту вершину и всех ее потомков.

Определите, есть ли вершина, схватившись за которую, Тимофей не будет раздражен.

Входные данные

Первая строка содержит одно натуральное число n (2 ≤ n ≤ 105) — количество вершин в дереве.

Каждая из следующих n - 1 строк содержит два натуральных числа u и v (1 ≤ u, v ≤ n, u ≠ v), означающие, что существует ребро между вершинами u и v. Гарантируется, что данный граф является деревом.

В следующей строке содержатся n натуральных чисел c1, c2, ..., cn (1 ≤ ci ≤ 105), задающих цвета вершин.

Выходные данные

В первой строке выведите «NO», если Тимофей не может взять березу так, чтобы его ничто не раздражало.

В противном случае выведите «YES», а в следующей строке выведите номер вершины, за которую Тимофею нужно схватить березу. Если существует несколько ответов, выведите любой.

C. Тимофей и перемодулирование

математика Перебор реализация теория чисел *2600

Тимофей очень любит числа, но, к сожалению, он еще не умеет работать с большими числами, поэтому он выполняет все операции по своему любимому простому модулю m. А еще Тимофей любит арифметические прогрессии и всюду их ищет.

На день рождения ему подарили последовательность различных целых чисел a1, a2, ..., an. Тимофею стало интересно, можно ли переставить элементы последовательности так, чтобы она стала арифметической прогрессией по модулю m.

Арифметическая прогрессия по модулю m длины n с первым элементом x и разницей d — это последовательность целых чисел x, x + d, x + 2d, ..., x + (n - 1)·d, где каждый элемент взят по модулю m.

Входные данные

В первой строке находятся два целых числа m и n (2 ≤ m ≤ 109 + 7, 1 ≤ n ≤ 105, m — простое) — любимый простой модуль Тимофея и число элементов в последовательности.

Во второй строке даны n различных целых чисел a1, a2, ..., an (0 ≤ ai < m) — элементы последовательности.

Выходные данные

Выведите -1, если невозможно переставить элементы последовательности так, чтобы она стала арифметической прогрессией по модулю m.

Иначе, выведите два целых числа — первый элемент получившейся прогрессии x (0 ≤ x < m) и ее разницу d (0 ≤ d < m).

Если ответов несколько, выведите любой.

A. Вас вызывает Таймыр

математика Перебор реализация *800

Товарищ Дюжиков занимается подбором артистов для дня рождения Тимофея и заодно принимает поздравления с Таймыра.

Итак, товарища Дюжикова раз в n минут вызывает с Таймыра Илюша-альпинист, то есть в минуты n, 2n, 3n и так далее. Раз в m минут приходят артисты и выступают, то есть в минуты m, 2m, 3m и так далее. Поскольку связь работает плохо, ни одного звонка пропустить нельзя, зато вот артистов очень много. Если день длится z минут (то есть состоит из минут 1, 2, ..., z), сколько артистов надо утопить, чтобы во время звонков не было артистов? Считайте, что и звонок, и выступление артиста длятся ровно одну минуту.

Входные данные

Единственная строка содержит три целых числа — n, m, z (1 ≤ n, m, z ≤ 104)

Выходные данные

Выведите единственное число — минимальное количество артистов, которых надо утопить, чтобы во время звонков не было артистов.

Примечание

В первом тесте артисты приходят ежеминутно, так же звонит и Илья, поэтому всех артистов надо утопить.

Во втором тесте артисты со звонком пересекаются на 2-ой и 4-ой минутах.

В третьем тесте они пересекаются только на 6-ой минуте.

B. Тимофей и кубики

Конструктив реализация *900

У маленького Тимофея день рождения! В этот прекрасный день родители подарили ему набор из n кубиков. На каждом кубике было написано некоторое число ai. Тимофей выложил все кубики в ряд и ушел распаковывать остальные подарки.

В это время старший брат Тимофея Дима взял и переложил кубики по следующему правилу. Предположим, кубики пронумерованы от 1 до n по порядку. Тогда на i-м шаге Дима развернул отрезок кубиков с i-го по (n - i + 1)-й, и так пока i ≤ n - i + 1.

После этого Дима с чистой совестью ушел гулять. Когда маленький Тимофей вернулся, он заметил, что кубики лежат не так, как раньше, и очень расстроился. Помогите Тимофею как можно скорее и спасите праздник — восстановите исходный ряд кубиков по ряду, оставленному Димой.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 2·105) — число кубиков.

Во второй строке находятся n целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109), где ai — число, написанное на i-м кубике после перестановок, сделанных Димой.

Выходные данные

Выведите через пробел n чисел — числа, написанные на кубиках в исходном порядке.

Можно показать, что существует ровно один ответ.

Примечание

Рассмотрим первый пример.

  1. Сначала у нас был ряд [2, 3, 9, 6, 7, 1, 4].
  2. После первой операции ряд стал [4, 1, 7, 6, 9, 3, 2].
  3. После второй операции ряд стал [4, 3, 9, 6, 7, 1, 2].
  4. После третьей операции ряд стал [4, 3, 7, 6, 9, 1, 2].
  5. Во время четвертой операции повернулся только центральный элемент, поэтому ряд остался таким же, а именно [4, 3, 7, 6, 9, 1, 2]. Значит, ряд [2, 3, 9, 6, 7, 1, 4] является ответом.

A. Слишком много контестов

математика реализация *900

В самых разных частях света ежегодно проводится множество соревнований по каль... то есть простите, бильярду, и команда Джинотега старается посетить их все. Если соревнование проходит далеко от родного города участников, команда летит на самолёте туда и обратно.

Лучшие друзья Джинотеги, команда Base, взломали почту ребят и нашла там все их электронные посадочные талоны за этот год. На каждом талоне написаны города вылета и прилёта. Теперь друзьям интересно, где же Джинотега сейчас, дома или на каком-нибудь соревновании? Base знают, что

  • у них есть данные обо всех полётах Джинотеги за этот год (в произвольном порядке),
  • Джинотега летает только из дома на соревнования и обратно,
  • после каждого соревнования Джинотега обязательно возвращается домой (однако они могут летать на соревнование в один город несколько раз),
  • и наконец, в начале года все участники Джинотеги были дома.

Помогите им определить, где же Джинотега находится сейчас!

Входные данные

В первой строке входного файла содержится единственное целое число n: количество полётов, совершённых командой (1 ≤ n ≤ 100). Во второй строке содержится строка из 3 заглавных латинских букв: название аэропорта в родном городе Джинотеги. Каждая из следующих n строк содержит информацию об очередном полёте в формате «XXX->YYY», где «XXX» — аэропорт вылета, а «YYY» — аэропорт прилёта. Ровно один из этих аэропортов — домашний аэропорт Джинотеги.

Гарантируется, что информация о полётах согласована с предположениями друзей, описанных в основной части условия.

Выходные данные

Если Джинотега сейчас находится дома, выведите «home» (без кавычек), иначе выведите «contest».

Примечание

В первом тесте из условия участники команды могли сначала слетать из SVO в CDG и вернуться, а затем слетать из SVO в LHR и вернуться. Таким образом, Джинотега сейчас находится дома. Во втором тесте Джинотега должна сейчас находиться в RAP, поскольку обратного полёта оттуда нет в списке.

B. Обфускация кода

жадные алгоритмы реализация Строки *1100

Костя очень любит писать контесты на Codeforces. Правда, его расстраивает, что его постоянно взламывают. Поэтому перед очередным контестом он решил обфусцировать свой код (то есть изменить его так, чтобы сделать менее читабельным).

Обфускация происходит так. Сперва Костя смотрит на первый идентификатор в своей программе и заменяет все его вхождения на букву a, затем смотрит на следующий, который ещё не был заменён, и заменяет все его вхождения на букву b, и так далее. Костя — хороший программист, поэтому в его изначальной программе не бывает однобуквенных имён. Кроме того, в любой его программе не более 26 различных идентификаторов.

Вам дан список идентификаторов из некоторой программы в том порядке, в котором они встречаются в программе, с удалёнными пробелами и символами переноса строки. Определите, могла ли эта программа получиться в результате обфускации Костей.

Входные данные

В единственной строке входного файла содержится строка S, состоящая из маленьких латинских букв (1 ≤ |S| ≤ 500) — список идентификаторов программы с удалёнными пробелами.

Выходные данные

Если данная программа могла получиться в результате обфускации Костей, выведите «YES» (без кавычек), иначе выведите «NO».

Примечание

В первом примере, один из возможных списков идентификаторов такой: «number string number character number string number». Обфускация такой программы выглядела бы следующим образом:

  • заменить все вхождения number на a, в результате получается «a string a character a string a»,
  • заменить все вхождения string на b, в результате получается «a b a character a b a»,
  • заменить все вхождения character на c, в результате получается «a b a c a b a»,
  • все идентификаторы заменены, поэтому обфускация завершается.

E. Складывание дерева

Деревья дп жадные алгоритмы поиск в глубину и подобное реализация *2200

Ваня хочет уменьшить дерево. Для этого он может произвольное количество раз выполнять следующую операцию. Сначала Ваня выбирает вершину v и два пути одной длины, идущих из неё и не имеющих никаких общих вершин, кроме v. Обозначим эти пути за a0 = v, a1, ..., ak и b0 = v, b1, ..., bk. Кроме того, у вершин a1, ..., ak, b1, ..., bk не должно быть других соседей, кроме соседних вершин в соответствующем пути. После этого Ваня может «наложить» один путь на другой, тем самым, фактически, удалив вершины b1, ..., bk:

Помогите Ване определить, можно ли последовательным применением этой операции получить из дерева путь. Если ответ положительный, также определите минимально возможную длину такого пути.

Входные данные

Первая строка входного файла содержит единственное целое число n — количество вершин в дереве (2 ≤ n ≤ 2·105).

Следующие n - 1 строк описывают рёбра дерева. Каждая из этих строк содержит два целых числа u и v (1 ≤ u, v ≤ n, u ≠ v), разделённых пробелом: номера концов соответствующего ребра. Гарантируется, что заданный граф является деревом.

Выходные данные

Если получить путь невозможно, выведите -1. Иначе выведите минимально возможное число ребер в пути.

Примечание

В первом примере можно получить путь из трех ребер после наложения путей 2 - 1 - 6 и 2 - 4 - 5.

Во втором примере нельзя совершить ни одной корректной операции. Например, нельзя склеить пути 1 - 3 - 4 и 1 - 5 - 6, поскольку у вершины 6 есть сосед 7, которого нет в соответствующем пути.

A. Снековик

реализация Структуры данных *1100

Согласно древней легенде, давным-давно жители Анк-Морпорка провинились перед Госпожой Удачей, и та прокляла их. Она сказала, что однажды на город упадут n снеков разных размеров, а жители должны будут составить их в один большой Снековик. При этом, естественно, внизу должны будут быть самые большие снеки, а наверху — самые маленькие.

Прошли годы, и однажды на город стали действительно падать самые разнообразные снеки — от огромных Кендер-сюр до маленьких Что-по-чёмс. И жители города принялись строить из них Снековика.

Правда, их поджидала одна неприятность. Каждый день на город выпадал один снек, но падали они в каком-то странном порядке. Поэтому жители не всегда могли водрузить очередной снек на вершину Снековика; иногда им приходилось выпавший только что снек откладывать до тех пор, пока не выпадут все снеки больше его. Конечно, чтобы не разозлить Госпожу Удачу, жители все-таки устанавливали каждый снек, как только для того появлялась возможность.

Напишите программу, которая будет моделировать деятельность жителей города по постройке Снековика.

Входные данные

В первой строке находится одно натуральное число n (1 ≤ n ≤ 100 000) — общее количество снеков, которые выпадут в городе.

Во второй строке находятся n чисел, i-е из которых равно размеру снека, выпадающего в i-й день. Все размеры — различные натуральные числа от 1 до n.

Выходные данные

Выведите в выходной файл n строк. На i-й из них выведите размеры всех снеков, которые будут установлены на снековик в i-й день, в том порядке, в котором они будут установлены. Если в какой-то день не будет установлен ни один снек, оставьте соответствующую строку выходного файла пустой.

Примечание

В примере в первый день выпадает снек размера 3, и его сразу можно устанавливать. Во второй день выпадает снек размера 1, его устанавливать еще нельзя, т.к. снек размера 2 пока отсутствует. В третий день выпадает снек размера 2, его тут же устанавливают, после чего устанавливают выпавший ранее снек размера 1.

C. Джон Сноу и его любимое число

дп Перебор реализация сортировки *1800

Джон Сноу сражается с белыми ходоками. У него есть n рейнджеров, каждый из которых имеет свою силу. Также у Джона Сноу есть любимое число x. Каждый рейнджер может сражаться с белым ходоком, если сила этого белого ходока равна его силе. Однако он думает, что его рейнджеры слабые и нуждаются в улучшении. Джон думает, что если он возьмет побитовый XOR сил некоторых рейнджеров с его любимым числом x, то он может получить солдат с более высокой силой. Итак, он решил сделать следующую операцию k раз:

  1. Расставить всех рейнджеров в ряд в порядке возрастания сил.
  2. Взять побитовый XOR (пишется как ) силы каждого второго рейнджера в ряду, начиная с самого первого, с числом x и обновить его силу.

    Предположим, что у Джона есть 5 рейнджеров с силами [9, 7, 11, 15, 5], и он выполняет операцию 1 раз с x = 2. Сначала он упорядочивает рейнджеров в порядке их сил, [5, 7, 9, 11, 15]. Далее он делает следующее:

    1. Сила первого рейнджера обновляется значением , то есть 7.
    2. Сила второго рейнджера остается прежней, то есть равной 7.
    3. Сила третьего рейнджера обновляется значением , то есть 11.
    4. Сила четвертого рейнджера остается прежней, то есть равной 11.
    5. Сила пятого рейнджера обновляется значением , то есть 13.

    Новые силы 5 рейнджеров [7, 7, 11, 11, 13].

    Теперь Джон хочет знать максимальную и минимальную силу рейнджеров после выполнения операций, описанных выше, k раз. Он хочет вашей помощи по этой задаче. Можете ли вы помочь ему?

Входные данные

Первая строка содержит три целых числа n, k, x (1 ≤ n ≤ 105, 0 ≤ k ≤ 105, 0 ≤ x ≤ 103) — количество рейнджеров у Джона, количество раз, которое Джон выполнит операцию, описанную выше, и любимое число Джона соответственно.

Вторая строка содержит n целых чисел, обозначающих силы рейнджеров, a1, a2, ..., an (0 ≤ ai ≤ 103).

Выходные данные

Выведите два целых числа — максимальная и минимальная силы рейнджеров после выполнения k операций.

A. Год поступления в университет

*особая задача реализация сортировки *800

В Берляндском университете есть факультет компьютерных наук. В социальной сети «ЕстьКонтакт!» для каждого курса этого факультета есть специальная группа, название которой равно году поступления студентов соответствующего курса в университет.

Каждый из студентов, учащихся в университете, всегда вступает в группу своего курса, а также во все группы, год поступления студентов в которые отличается не более чем на x от года поступления этого студента, где x — некоторое неотрицательное целое число. Значение x вам не дано, но оно может быть однозначно определено по имеющимся данным. Считайте, что в другие группы студенты не вступают.

Вам задана информация о списке групп студента по имени Игорь, в которые он вступил. По этой информации вам необходимо определить год поступления Игоря в университет.

Входные данные

В первой строке записано целое положительное нечётное число n (1 ≤ n ≤ 5) — количество групп, в которых состоит Игорь.

В следующей строке следует n различных целых чисел a1, a2, ..., an (2010 ≤ ai ≤ 2100) — годы поступления студентов для каждой из групп, в которых состоит Игорь.

Гарантируется, что входные данные корректны и ответ обязательно существует. Группы записаны в произвольном порядке.

Выходные данные

Выведите год поступления Игоря в университет.

Примечание

В первом примере значение x = 1. Игорь поступил в университет в 2015-м году. Поэтому он вступил в группы студентов с годами поступления 2014, 2015 и 2016.

Во втором примере значение x = 0. Игорь вступил лишь в одну группу, которая соответствует году его поступления.

A. Герои

Перебор реализация *1400

Грядёт 2012-ый год...

Согласно древней хорадрической легенде, именно в этом, 2012-м году, Диабло со своими братьями Мефисто и Баалом вырвется из ада, и неисчислимые орды демонов поработят человеческий мир. Но семеро отважных героев уже собрались на вершине горы Арреат, чтобы защитить нас, простых смертных, от влияния этого ужасного зла.

Семеро великих, вот они: амазонка Anka, варвар Chapay, волшебница Cleo, друид Troll, некромант Dracul, паладин Snowy и профессиональная девушка-киллер Hexadecimal. Герои уже знают, сколько опыта дадут за каждого из трёх мегабоссов: a — за Мефисто, b — за Диабло и c — за Баала.

Вот беда: героев аж целых семь, а мегабоссов всего трое! Тогда наши герои решили разделиться на три группы, где каждая группа пойдёт уничтожать своего мегабосса. Каждый член группы получит опыта, округлённое вниз, где x — количество опыта за убитого мегабосса, а y — количество людей в группе.

Герои не хотят обижать друг друга, поэтому хотят разделиться на группы так, чтобы разница между персонажем, получившим максимальное число опыта и персонажем, получившим минимальное число опыта, была минимальна. Поскольку разделений на группы может быть несколько, то нужно найти такое, при котором суммарное количество симпатий в группах максимально.

Известно, что одни герои вызывают симпатию у других. Но если персонажу p нравится персонаж q, то это вовсе не значит, что персонажу q нравится персонаж p. Никакой герой не нравится сам себе.

Суммарное количество симпатий в группах — это количество таких упорядоченных пар (p, q), что герои p и q состоят в одной группе, и при этом герою p нравится герой q (но неважно, нравится ли герою q герой p). В случае, если герои p и q нравятся друг другу и состоят в одной группе, эта пара должна быть учтена дважды, как (p, q) и как (q, p).

Группа может состоять даже из одного персонажа, но важно, чтобы каждый мегабосс был уничтожен. Все герои должны быть задействованы в походе против зла. Ни один герой не может находиться более, чем в одной группе.

Гарантируется, что каждый герой в состоянии уничтожить любого мегабосса в одиночку.

Входные данные

В первой строке дано единственное неотрицательное целое число n (0 ≤ n ≤ 42) — количество симпатий между героями. В последующих n строках дано описание симпатий в формате «p likes q», означающих, что герою p нравится герой q (p  ≠  q). Каждая симпатия описана во входных данных ровно один раз, никакому герою не нравится он сам.

В последней строке даны три целых числа a, b и c (1 ≤ a, b, c ≤ 2·109), разделённые пробелом: опыт за Мефисто, опыт за Диабло и опыт за Баала.

Во всех претестах, за исключением примеров из условия, выполняется: a = b = c.

Выходные данные

Выведите два целых числа — минимальную разницу в опыте между персонажами, которые получат максимальное и минимальное количество очков опыта, и максимальное суммарное количество симпатий в группах (количество дружб между персонажами, оказавшимися в одной группе).

В этой задаче в первую очередь надо минимизировать разницу опыта, и среди всех таких разделений на группы выбрать такое, что суммарное количество симпатий максимально.

Примечание

Пояснение к первому примеру: первую группу могут сформировать Dracul, Troll и Anka, вторую группу — Hexadecimal и Snowy, а третью — Cleo и Chapay.

D. Ковёр-из-домино

дп реализация *2300

...И с вами снова... Теле-Майк!

Устали от однообразного интерьера? Надоела серая обыденность? Мечтаете о головокружительных изменениях вашей скромной обители? У нас есть, что предложить вам!

Этот Ковёр-из-домино всего за $99.99 изменит вашу жизнь! Вы можете постелить им пол, повесить его на стену или даже на потолок! Кроме всего прочего...

Вирус Хексадесимал, насмотревшись рекламы, захотела заполучить такой Ковёр-из-домино и обязательно сфотографироваться на его фоне. Но ясное дело — вирус никогда не согласится покупать лицензионный Ковёр! Поэтому она заказала грузовик домино и решила смастерить такой Ковёр сама.

Оригинальный Ковёр-из-домино представляет собой поле из квадратиков размера n × m. Каждый квадратик является половиной кости домино и может быть ориентирован либо вертикально, либо горизонтально, независимо от соседей. Вертикально ориентированные половинки домино выглядят так:

А горизонтально ориентированные вот так:

Отсюда можно заметить, что некоторые половинки выглядят одинаково в обоих положениях, а некоторые — по-разному.

Кости домино, которые купила Хексадесимал, представляют собой неразрезаемые фишки размера 1 × 2, которые можно класть либо вертикально, либо горизонтально. Если кость расположить вертикально, то обе её половинки должны быть вертикально ориентированными; если горизонтально, то обе половинки должны быть ориентированы горизонтально.

Ниже приведены правильные и неправильные примеры вертикально и горизонтально расположенных костей домино:

Вирус Хексадесимал собирает свой собственный Ковёр-из-домино так, что выполняются следующие условия:

  • каждая клетка ковра покрыта костью домино, т.е. нет пустых клеток;
  • все кости домино лежат строго внутри ковра и не накладываются друг на друга;
  • если есть горизонтальная кость домино, у которой левая половина лежит в столбце j, то нет горизонтальных костей домино, у которых левая половина лежит в столбце j - 1 или j + 1.

Прежде чем начать собирать свой собственный Ковёр-из-домино, вирус хочет узнать количество способов достичь намеченной цели по модулю 109 + 7.

Можете предполагать, что количество костей домино каждого вида у вируса бесконечно велико.

Входные данные

В первой строке даны два целых числа n и m, разделённые пробелом — размер Ковра-из-домино (1 ≤ n, m ≤ 250). В последующих 4n + 1 строках содержится 4m + 1 символов.

Каждый квадратик Ковра-из-домино — половина кости домино — описывается квадратом 3 × 3. Символ 'O' в этом квадрате обозначает наличие точки, символ '.' — её отсутствие.

Каждый квадрат 3 × 3 очерчен от соседних квадратов символами '#' так, как показано в примерах.

Гарантируется, что каждый квадратик описывает корректную половину кости домино.

Во всех претестах Ковры-из-домино имеют размер 2 × 2 и 4 × 4.

Выходные данные

Выведите одно число — количество способов собрать Ковёр-из-домино по модулю 109 + 7, пользуясь только стандартными костями домино размера 1 × 2.

Примечание

Пояснение к первому примеру: корректные способы собрать Ковёр-из-домино изображены ниже:

В свою очередь, следующий способ является некорректным:

A. Новый пароль

*особая задача реализация *800

Иннокентий решил сменить пароль от социальной сети «ЕстьКонтакт!», но ему лень придумывать новый пароль самому. Поэтому он обратился за помощью к вам.

Иннокентий решил, что придуманный пароль должен удовлетворять следующим условиям:

  • длина пароля должна быть равна n,
  • пароль должен состоять только из строчных латинских букв,
  • количество различных символов в пароле должно быть равно k,
  • любые два подряд идущих символа в пароле должны быть различны.

Перед вами стоит задача помочь Иннокентию и придумать для него новый пароль, удовлетворяющий всем описанным условиям.

Входные данные

В первой строке следуют два целых положительных числа n и k (2 ≤ n ≤ 100, 2 ≤ k ≤ min(n, 26)) — длина пароля и количество различных символов в нем.

Обратите внимание, что исходя из ограничений искомый новый пароль всегда существует.

Выходные данные

Выведите любой пароль, который удовлетворяет всем условиям Иннокентия.

Примечание

В первом примере один из подходящих новых паролей — java, так как его длина равна 4 и в нём используется 3 различных строчных буквы a, j и v.

Во втором примере один из подходящих новых паролей — python, так как его длина равна 6 и он состоит из 6 различных строчных букв.

В третьей примере один из подходящих новых паролей — phphp, так как его длина равна 5 и в нём используется 2 различных строчных буквы p и h.

Обратите внимание, что для всех подходящий паролей из примеров также выполняется условие того, что никакие два одинаковых символа не идут подряд.

B. Максимизируй сумму цифр

*особая задача математика реализация *1300

У Антона есть целое число x. Ему стало интересно, у какого целого положительного числа, не превосходящего x, сумма цифр максимальна.

Перед вами стоит задача помочь Антону и найти число, которое его интересует. Если таких чисел несколько, определите наибольшее такое число.

Входные данные

В первой строке следует целое положительное число x (1 ≤ x ≤ 1018) — число, которое есть у Антона.

Выходные данные

Выведите целое положительное число, не превосходящее x, у которого сумма цифр максимальна. Если таких чисел несколько, выведите наибольшее такое число. Выведенное число не должно содержать лидирующих нулей.

C. Онлайн-курсы в БГУ

*особая задача графы поиск в глубину и подобное реализация *1500

В Берляндском государственном университете теперь можно учиться онлайн! Для получения диплома среди всего многообразия онлайн-курсов Поликарпу необходимо пройти k главных онлайн-курса его специальности. Всего для прохождения доступны n курсов.

Ситуация осложняется тем, что онлайн-курсы зависят друг от друга и для каждого курса есть список тех, которые необходимо обязательно пройти до начала прохождения этого онлайн-курса (список может быть пустым, что означает отсутствие таких ограничений).

Помогите Поликарпу пройти наименьшее количество курсов суммарно, чтобы получить cпециальность (то есть пройти все главные курсы и необходимые для их прохождения курсы). Напишите программу, которая выводит порядок прохождения курсов.

Поликарп проходит курсы последовательно, то есть он может приступать к прохождению следующего только после окончания предыдущего. Каждый из курсов можно проходить не более одного раза.

Входные данные

В первой строке записаны n и k (1 ≤ k ≤ n ≤ 105) — количество онлайн-курсов и количество главных курсов специальности Поликарпа.

Вторая строка содержит k различных целых чисел от 1 до n — номера главных онлайн-курсов специальности Поликарпа.

Далее следует n строк, каждая из которых описывает очередной курс: i-я из них соответствует курсу i. Каждая строка начинается с целого числа ti (0 ≤ ti ≤ n - 1) — количества курсов, от которых зависит i-й. Далее следует последовательность из ti различных целых чисел от 1 до n — номера курсов в произвольном порядке, от которых зависит i-й. Гарантируется, что никакой курс не может зависеть сам от себя.

Гарантируется, что сумма по всем значениям ti не превосходит 105.

Выходные данные

Выведите -1, если не существует способа получения специальности.

В противном случае в первую строку выведите целое число m — минимальное количество онлайн-курсов, которое необходимо пройти для получения специальности. Во вторую строку выведите m различных целых чисел — номера курсов, которые надо пройти, в хронологическом порядке их прохождения. Если ответов несколько разрешается вывести любой из них.

Примечание

В первом примере можно сначала пройти курсы номер 1 и 2, после чего можно будет пройти курс номер 4, а затем курс номер 5, который является главным. После этого останется пройти только курс номер 3, который является последним непройденным главным курсом.

D. Нарисуй скобки!

*особая задача реализация *1400

Скобочная последовательность квадратных скобок называется правильной, если путем вставки в нее символов «+» и «1» можно получить из нее корректное математическое выражение. Например, последовательности «[[]][]», «[]» и «[[][[]]]» — правильные, в то время как «][», «[[]» и «[[]]][» — нет.

Нарисуйте заданную последовательность с помощью минималистичной псевдографики в полоске наименьшей возможной высоты — используйте символы '+', '-' и '|'. Например, последовательность «[[][]][]» должна быть изображена в виде:


+- -++- -+
|+- -++- -+|| |
|| || ||| |
|+- -++- -+|| |
+- -++- -+

Каждая скобка должна быть изображена с помощью одного или более символа '|' (вертикальная часть) и символов '+' и '-' как на примере выше.

Скобки следует отрисовывать без промежутков одну за другой, лишь разделяя пары последовательных парных скобок полоской шириной в один пробел (чтобы не произошло визуального слияния двух скобок в один символ). Изображение должно иметь минимальную возможную высоту.

Вложенная скобка всегда меньше окружающей её, но каждая скобка отдельно стремиться занять максимальным образом высоту изображения. Так, пара заключительных скобок в примере выше занимает всю высоту изображения.

Внимательно изучите примеры ниже, они достаточным образом поясняют условие задачи. Обратите внимание, что в этой задаче ответ (картинка) строится однозначно единственным образом.

Входные данные

В первой строке следует целое чётное число n (2 ≤ n ≤ 100) — длина скобочной последовательности.

Во второй строке следует скобочная последовательность — это n символов «[» и «]». Гарантируется, что заданная скобочная последовательность является правильной.

Выходные данные

Выведите нарисованную скобочную последовательность в формате, описанном в условии. Не выводите лишних (ненужных) пробелов.

C. Максимальное число

*особая задача жадные алгоритмы Конструктив реализация *1200

У Степана есть новейшее устройство с экраном, на котором могут отображаться цифры. Каждая из цифр изображается в семисекционных областях так, как показано на рисунке ниже.

Таким образом, например, для изображения цифры 3 нужно подсветить 5 секций на экране, а для цифры 66 секций.

Заряда новейшего устройства хватает, чтобы подсветить суммарно n секций на экране.

Степану стало интересно — какое максимальное число может быть изображено на экране его новейшего устройства. Перед вами стоит задача определить это число. Обратите внимание, что оно не должно содержать лидирующих нулей. Считайте, что семисекционных областей на экране устройства хватит для изображения любого целого числа.

Входные данные

В первой строке следует целое число n (2 ≤ n ≤ 100 000) — количество секций, которые могут быть подсвечены на экране устройства одновременно.

Выходные данные

Выведите максимальное число, которое может быть изображено на экране новейшего устройства Степана.

D. Правда или ложь

*особая задача Конструктив реализация сортировки *1500

У Васи есть последовательность кубиков, на каждом из которых написано ровно одно целое число. Вася любит порядок, поэтому выставил все свои кубики в ряд. Таким образом, последовательность чисел, записанных на кубиках в порядке слева направо равна a1, a2, ..., an.

Пока Вася отсутствовал, его маленький брат Степан поиграл с кубиками и поменял местами некоторые из них, после чего последовательность чисел на кубиках стала выглядеть как b1, b2, ..., bn.

Степан утверждает, что трогал только кубики, стоящие на позициях с l по r, не убирал и не добавлял другие кубики (иными словами, он переставил кубики на позициях с l по r произвольным образом).

Перед вами стоит задача определить, возможна ли то, что Степан говорит правду, либо он гарантированно обманывает своего брата.

Входные данные

В первой строке следует три целых числа n, l, r (1 ≤ n ≤ 105, 1 ≤ l ≤ r ≤ n) — количество кубиков, которые есть у Васи, и позиции, о которых сказал Степан.

Во второй сроке следует последовательность a1, a2, ..., an (1 ≤ ai ≤ n) — последовательность номеров на кубиках в том порядке, в котором их расставил Вася.

В третьей сроке следует последовательность b1, b2, ..., bn (1 ≤ bi ≤ n) — последовательность номеров на кубиках после того, как Степан поиграл с ними.

Гарантируется, что Степан не убирал и не добавлял никакие кубики, а только переставлял имеющиеся.

Выходные данные

Выведите «LIE» (без кавычек), если Степан гарантированно обманывает брата. В противном случае, выведите «TRUTH» (без кавычек).

Примечание

В первом примере возможна ситуация при которой Степан говорит правду. Изначально последовательность кубиков выглядит как [3, 4, 2, 3, 1]. Степан мог сначала поменять местами кубики в позициях 2 и 3 (после этого последовательность кубиков выглядела бы как [3, 2, 4, 3, 1]), а затем поменять местами кубики в позициях 3 и 4 (после этого последовательность кубиков выглядела бы как [3, 2, 3, 4, 1]).

Во втором примере невозможна ситуация, при которой Степан говорит правду, так как он сообщил, что менял местами только кубики с позиции 1 до позиции 2, но из примера видно, что он гарантированно переместил кубик, стоящий изначально в позиции 3. Поэтому Степан гарантированно обманывает своего брата.

В третьем примере при любых значениях l и r возможна ситуация, при которой Степан говорит правду.

K. Степан и гласные

*особая задача реализация Строки *1600

Степан любит при написании слов повторять гласные буквы несколько раз, например, вместо слова «pobeda» он может написать «pobeeeedaaaaa».

Сереже это не нравится, и он хочет написать программу, которая форматирует слова, написанные Степаном, и преобразует все подряд идущие повторяющиеся гласные в одну. Гласными буквами являются буквы «a», «e», «i», «o», «u» и «y».

Есть исключения: если буквы «e» или «o» идут подряд ровно 2 раза, как в словах «feet» и «foot», то их не следует заменять на одну. Например, слово «iiiimpleeemeentatiioon» в отформатированном виде выглядит как «implemeentatioon».

Сережа занят, поэтому вам предстоит написать программу форматирования за него.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 100 000) — количество букв в слове, которое написал Степан.

Во второй строке следует строка s длины n, состоящая из строчных букв латинского алфавита — слово, которое написал Степан.

Выходные данные

Выведите одну строку — слово, написанное Степаном, в отформатированном виде, согласно условию задачи.

A. Серийный убийца

Перебор реализация Строки *900

Наш любимый детектив Шерлок занят поиском серийного убийцы, который убивает одного человека каждый день. Используя свой дедуктивный метод, он узнал, что у киллера есть стратегия для выбора следующей жертвы.

В первый день у убийцы есть две потенциальных жертвы. Он выбирает одну из них, убивает ее и заменяет ее новой потенциальной жертвой. Та же процедура повторяется каждый день. Таким образом, каждый день у убийцы есть две потенциальных жертвы, из которых он выбирает. Шерлок знает имена потенциальных жертв в первый день. Кроме этого, он знает, кого убили в каждый день и кто — новая потенциальная жертва, заменившая убитую.

Вам необходимо вычислить для каждого дня две потенциальные жертвы, из которых киллер выбирал в этот день, ведь Шерлок надеется найти в этой информации какую-то закономерность.

Входные данные

Первая строка содержит два имени (длина каждого не превосходит 10) потенциальных жертв в первый день.

Вторая строка содержит целое число n (1 ≤ n ≤ 1000) — число дней.

Каждая из следующих n строк содержит два имени (длина каждого не превосходит 10) — сначала имя человека, убитого в этот день, затем имя человека, ставшего новой потенциальной жертвой.

Входные данные согласованы, то есть гарантируется, что каждый убитый человек является одной из двух потенциальных жертв в этот день. Гарантируется, что имена всех людей различны и состоят из строчных букв латинского алфавита.

Выходные данные

Выведите n + 1 строку, i-я строка должна содержать имена двух людей, из которых убийца выбирает жертву в i-й день. (n + 1)-я строка должна содержать два имени, из которых будет выбрана следующая жертва. В каждой строке два имени могут быть выведены в любом порядке.

Примечание

В первом примере изначально потенциальные жертвы это ross и rachel.

  • После дня 1: ross убит, и появляется joey.
  • После дня 2: rachel убит, и появляется phoebe.
  • После дня 3: phoebe убит, и появляется monica.
  • После дня 4: monica убит, и появляется chandler.

C. Химикаты Молли

Бинарный поиск математика Перебор реализация Структуры данных *1800

У Молли Хупер есть n химикатов, расположенных в ряд. Каждый из химикатов имеет величину влиятельности, для химиката i эта величина равна ai.

Молли хочет, чтобы Шерлок в нее влюбился. Она собирается смешать все химикаты из некоторого отрезка так, чтобы сделать любовное зелье с величиной влиятельности, равной некоторой целой неотрицательной степени числа k. Величина влиятельности зелья равна сумме величин влиятельности химикатов на отрезке, из которого зелье составлено.

Помогите Молли найти количество отрезков, которые она может выбрать.

Входные данные

Первая строка содержит два целых числа n и k (1 ≤ n ≤ 105, 1 ≤ |k| ≤ 10) — количество химикатов и число k, неотрицательной степенью которого должна быть величина влиятельности зелья.

Вторая строка содержит n целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — величины влиятельности химикатов.

Выходные данные

Выведите единственное целое число — число пригодных отрезков.

Примечание

Помните, что k0 = 1.

В первом примере Молли может получить следующие величины влиятельности:

  • 2: отрезки [1, 1], [2, 2], [3, 3], [4, 4];

  • 4: отрезки [1, 2], [2, 3], [3, 4];

  • 6: отрезки [1, 3], [2, 4];

  • 8: отрезки [1, 4].

Среди них величины 2, 4 и 8 являются степенями k = 2. Таким образом, ответ 8.

Во втором примере Молли может выбрать отрезки [1, 2], [3, 3], [3, 4].

F. Пари Шерлока и Мориарти

геометрия графы Деревья Конструктив разделяй и властвуй реализация Структуры данных *2800

Шерлок и Мориарти встретились для финальной битвы умов. Шерлок дал Мориарти правильный выпуклый n-угольник. Кроме того, он дал ему некоторые диагонали в этом многоугольнике, которые разделяют его на регионы. Гарантируется, что диагонали не пересекаются во внутренних точках.

Шерлок посчитал для каждого региона его важность. Важность региона, образованного вершинами многоугольника с номерами a1, a2, ... , ax, равна 2a1 + 2a2 + ... + 2ax. Затем Шерлок упорядочил регионы в порядке увеличения важности. После этого он присвоил каждому региону уникальный номер от 1 до k, где k — количество регионов, а номер региона это его позиция в упорядоченном по важности списке.

Шерлок хочет, чтобы Мориарти раскрасил регионы, используя не более чем 20 цветов так, чтобы все простые пути между двумя одноцветными регионами проходили через хотя бы один регион, покрашенный в цвет с номером меньше, чем номер цвета данных регионов. Простой путь между двумя регионами f и h это последовательность регионов r1, r2, ... rt такая, что r1 = f, rt = h, для каждого 1 ≤ i < t регионы ri и ri + 1 имеют общую сторону, а также ri = rj если и только если i = j.

Мориарти не смог ответить и спросил решение у Шерлока. Помогите Шерлоку предоставить ответ Мориарти.

Входные данные

В первой строке содержатся два целых числа n и m (3 ≤ n ≤ 100000, 0 ≤ m ≤ n - 3) — количество вершин в многоугольнике и количество проведенных диагоналей.

Следующие m строк содержат по два целых числа a и b (1 ≤ a, b ≤ n), которые описывают диагональ между вершинами a и b. Гарантируется, что заданы корректные диагонали, то есть a и b не совпадают и не являются соседними вершинами. Гарантируется, что диагонали не пересекаются.

Выходные данные

Пусть число регионов равно k.

Выведите k целых чисел, каждое от 1 до 20 — цвета регионов в порядке увеличения важности.

Если существует несколько решение, выведите любое из них. Можно показать, что существует хотя бы одно решение.

Примечание

Во втором примере регионы будут в таком порядке: (1, 2, 3), (1, 3, 4), (1, 4, 5), (1, 5, 6), т. е. регион (1, 2, 3) будет первым, затем регион (1, 3, 4) и так далее.

Мы можем покрасить регионы 1 и 3 в один цвет, так как регион 2 будет на пути из 1 в 3, и его цвет равен 1, что меньше, чем цвет регионов 1 и 3, который равен 2.

A. Игра в напёрстки

Конструктив математика реализация *1000

В свободное время Бомбослав любит наблюдать из окна как ребята во дворе играют "на интерес" в известную игру в напёрстки. Для игры требуется два человека, ведущий и игрок. Ведущий берёт три одинаковых непрозрачных напёрстка и прячет под один из них шарик. Затем он несколько раз меняет некоторые пары напёрстков местами, после чего игрок должен угадать, под каким напёрстком сейчас находится шарик.

Бомбослав заметил, что ребята во дворе не очень изобретательны в своих действиях, и ведущий всегда меняет местами левый напёрсток со средним на нечётных действиях (то есть на первом, третьем, пятом и так далее) и средний с правым на чётных действиях (то есть на втором, четвёртом и так далее).

Пронумеруем напёрстки от 0 до 2 слева направо. То есть левый напёрстком имеет номер 0, средний номер 1, а правый номер 2. Бомбослав не успел увидеть начало игры, но посчитал, что ведущий совершил n действий и в итоге шарик оказался под напёрстком x. Под каким напёрстком находился шарик в самом начале?

Входные данные

В первой строке входных данных записано одно цело число n (1 ≤ n ≤ 2·109) — количество действий, совершённых ведущим.

Во второй строке записано одно целое число x (0 ≤ x ≤ 2) — номер напёрстка, под которым оказался шарик через n действий.

Выходные данные

Выведите одно целое число от 0 до 2, означающее номер напёрстка, под которым находился шарик в самом начале.

Примечание

В первом примере шарик изначально лежал под средним напёрстком и ведущий совершил четыре действия.

  1. Первым действием ведущий поменял местами левый и средний напёрстки. В результате шарик оказался под левым напёрстком.
  2. Вторым действием ведущий поменял местами средний и правый напёрстки. Шарик остался под левым напёрстком.
  3. Третьим действием ведущий снова поменял местами левый и средний напёрстки. В результате шарик снова оказался посередине.
  4. Последним четвёртым действием ведущий опять поменял местами средний и правый напёрстки и шарик оказался под правым напёрстком.

C. Алёна и таблички

Бинарный поиск дп жадные алгоритмы реализация Структуры данных *1600

На уроке информатики маленькая девочка Алёна осваивает редактирование таблиц в одной очень известной программе.

Сейчас у неё есть таблица из целых чисел, состоящая из n строк и m столбцов. Через ai, j будем обозначать число в i-й строке и j-м столбце. Будем говорить, что таблица отсортирована по неубыванию по j-му столбцу, если ai, j ≤ ai + 1, j для всех i от 1 до n - 1.

Учительница дала Алёне k заданий. Для каждого из заданий известны два числа l и r и требуется ответить на вопрос: если от таблицы оставить только строки с l по r включительно, то будет ли она отсортирована по неубыванию хотя бы по одному столбцу? Другими словами, существует ли такое j, что ai, j ≤ ai + 1, j для всех i от l до r - 1 включительно.

Алёна ещё слишком маленькая, чтобы справиться с заданием самостоятельно — помогите ей!

Входные данные

В первой строке входных данных записаны два целых положительных числа n и m (1 ≤ n·m ≤ 100 000) — количество строк и столбцов в таблице соответственно. Обратите внимание, что дано ограничение только на произведение этих чисел, то есть на количество элементов таблицы.

В каждой из следующих n строк записаны m целых чисел, j-e число в i-й из этих строк соответствует значению ai, j (1 ≤ ai, j ≤ 109).

В следующей строке входных данных задано число k (1 ≤ k ≤ 100 000) — количество заданий учительницы, которые нужно выполнить Алёне.

В i-й из последующих k строк числа li и ri (1 ≤ li ≤ ri ≤ n).

Выходные данные

В i-й строке выведите "Yes", если в таблице, полученной из исходной оставлением строк с li по ri включительно будет столбец, по которому она отсортирована по неубыванию, и "No" в противном случае.

Примечание

В приведенном примере таблица не отсортирована ни по одному столбцу, но, например, строки 1–3 отсортированы по столбцу 1, а строки 4–5 по столбцу 3.

D. Облако хештегов

Бинарный поиск жадные алгоритмы реализация Строки *1800

Вася ведёт публичную страницу организации «Мышь и клавиатура», где постоянно публикует различные новости из мира спортивного программирования. Для удобства поиска по новостям Вася прикрепляет к каждой из них список хештегов. В данной задаче хештегом называется строка, состоящая из маленьких букв английского алфавита и ровно одного символа '#', расположенного в начале строки. Длиной хештега будем называть количество символов в нём, без учёта символа '#'.

Начальство Васи распорядилось, что хештеги у каждой новости должны быть расположены в лексикографическом порядке (для пояснения смотрите примечания).

Поскольку Васе не хочется менять порядок хештегов в уже написанной новости, он решил удалить у некоторых хештегов некоторый суффикс (какое-то количество последних символов), при этом можно даже удалить весь текст хештега, оставив только символ '#', но сам символ '#' удалять нельзя. Из всех возможных вариантов такого удаления Вася хочет выбрать тот, в котором суммарно будет удалено минимальное количество символов. Если и таких вариантов несколько, то разрешается использовать любой из них.

Входные данные

В первой строке находится одно число n (1 ≤ n ≤ 500 000) — количество хештегов в новости.

Каждая из следующих n строк содержит ровно один хештег положительной длины.

Гарантируется, что суммарная длина всех хештегов (то есть всех строк, без учёта символа '#') не превосходит 500 000.

Выходные данные

Выведите полученные после удаления символов хештеги.

Примечание

Слово a1, a2, ..., am длины m лексикографически не превосходит слова b1, b2, ..., bk длины k, если выполняется одно из двух:

  • либо в первой позиции i, такой что ai ≠ bi, символ ai идёт раньше по алфавиту, чем символ bi, то есть в первой различающейся позиции символ слова a меньше символа слова b;
  • либо, если такой позиции i нет, и m ≤ k, то есть второе слово начинается с первого либо совпадает с ним

Про последовательность слов говорят, что они идут в лексикографическом порядке, если каждое слово в нём (кроме последнего) лексикографически не превосходит следующего за ним.

Для слов, состоящих из маленьких латинских букв, лексикографический порядок совпадает с алфавитным порядком расположения слов в словаре.

Хештег, состоящий только из символа '#', лексикографически не больше любого другого хештега. Поэтому в третьем примере мы не можем оставить два первых слова и сократить два вторых.

B. Побитовая формула

битмаски Перебор поиск в глубину и подобное Разбор выражений реализация *1800

Вася недавно прочитал о битовых операциях, которые используются в компьютерах: AND, OR и XOR. Он неплохо изучил их свойства и придумал новую игру. Изначально Вася выбирает разрядность m для своей игры, это значит, что все числа в игре будут состоять из m битов. Потом он просит Петю выбрать некоторое одно m-битное число. После этого Вася вычисляет значения n переменных. Каждой из переменных присваивается либо константное m-битное число, либо результат выполнения битовой операции, операндами которой могут являться уже определенные переменные или выбранное Петей число. После этого сумма очков, которую получает Петя, равна сумме значений всех переменных.

Вася хочет узнать, какое число должен выбрать Петя, чтобы получить минимально возможное число очков, и какое число он должен выбрать, чтобы получить максимальное число очков. В обоих случаях, если у Пети есть несколько способов получить такую сумму, найдите минимальное число, которое он может выбрать.

Входные данные

В первой строке содержатся два целых числа n и m — количество переменных и разрядность, соответственно (1 ≤ n ≤ 5000; 1 ≤ m ≤ 1000).

В следующих n строках содержится описание переменных. В каждой строке описывается ровно одна переменная. Описание имеет следующий вид: имя новой переменной, пробел, знак «:=», снова пробел, далее два варианта:

  1. Число в битовой записи длиной ровно m битов.
  2. Первый операнд, пробел, битовая операция («AND», «OR» или «XOR»), пробел, второй операнд. Каждый операнд — это либо имя уже определенной переменной, либо символ '?', обозначающий выбранное Петей число.

Имена переменных — строки из строчных латинских букв длиной не более 10 символов. Все имена переменных различны.

Выходные данные

В первой строке выведите минимальное число, которое должен выбрать Петя, чтобы сумма значений всех переменных была минимальна, во второй строке — минимальное число, которое должен выбрать Петя, чтобы сумма значений всех переменных была максимальна. Оба числа выведите в виде двоичного m-битного числа.

Примечание

В первом тесте если Петя выбирает число 0112, то a = 1012, b = 0112, c = 0002, сумма их значений равна 8. Если же он выберет число 1002, то a = 1012, b = 0112, c = 1112, сумма их значений равна 15.

Для второго теста минимальная и максимальная суммы переменных a, bb, cx, d и e равны 2 и не зависят от загаданного числа, поэтому минимальное число, которое может выбрать Петя — 0.

A. Хайку

реализация Строки *800

Хайку — жанр традиционной японской лирической поэзии.

Стихотворение хайку состоит из 17 слогов, которые разбиты на три фразы, содержащие 5, 7 и 5 слогов соответственно (первая фраза должна содержать ровно 5 слогов, вторая — ровно 7 слогов, а третья — ровно 5). Мастерством хайку считается в этих трех фразах описать момент. В маленьком стихотворении каждое слово на счету, поэтому для хайку характерна символичность — каждое слово приобретает особую весомость, значимость. Сказать многое малым количеством слов — главный принцип хайку.

В данной задаче для простоты мы будем считать, что количество слогов в фразе равно количеству гласных букв в ней. Гласными буквами считаются только «a», «e», «i», «o» и «u».

Имеются три фразы некоторого стихотворения. Определите — являются они хайку или нет.

Входные данные

Входные данные представляют собой три строки длиной от 1 до 100 символов каждая. В i-й строке записана i-я фраза стихотворения. Каждая фраза состоит из одного или более слов, которые разделены одним или более пробелами. Словом считается некоторая непустая последовательность строчных латинских букв. В начале и в конце фразы может находиться некоторое количество пробелов (возможно, ни одного). В каждой фразе имеется хотя бы один символ, не являющийся пробелом. Смотрите пример для более точного понимания.

Выходные данные

Выведите «YES» (без кавычек) если стихотворение является хайку. Иначе выведите «NO» (тоже без кавычек).

B. Пасхальные яйца

Конструктив реализация *1200

Пасхальный кролик разложил n яиц по кругу и теперь хочет их покрасить.

Каждое яйцо должно быть покрашено в один из 7 цветов: красный, оранжевый, желтый, зеленый, голубой, синий или фиолетовый. При этом должны выполняться следующие условия:

  • В каждый из 7 цветов покрашено хотя бы одно яйцо.
  • Любые четыре расположенных подряд яйца покрашены в различные цвета.

Помогите пасхальному кролику раскрасить яйца требуемым образом. Известно, что это всегда можно сделать.

Входные данные

В единственной строке находится целое число n (7 ≤ n ≤ 100).

Выходные данные

Выведите строку длиной n, где i-ый символ этой строки должен описывать цвет i-го яйца по порядку обхода круга. Цвета обозначаются следующими символами: «R» — красный, «O» — оранжевый, «Y» — желтый, «G» — зеленый, «B» — голубой, «I» — синий, «V» — фиолетовый.

Если возможных ответов несколько — выведите любой из них.

Примечание

Как яйца будут раскрашены в первом примере можно видеть на картинке:

A. Андрюша и носки

реализация *800

Андрюша очень аккуратный и чистоплотный мальчик, поэтому он всегда следит за порядком в своей комнате. В том числе, он очень внимательно относится к укладыванию своих вещей в шкаф.

Сегодня перед ним встала нелегкая задача — сложить в шкаф носки. У Андрюши есть n разных пар носков, которые изначально сложены в мешок. Пары носков пронумерованы от 1 до n. Андрюша хочет убрать носки в шкаф по парам. Для этого он по одному достает носки из мешка, и для каждого вытащенного носка смотрит, доставал ли он уже его пару. Если нет, что значит, что пара текущего носка все еще находится в мешке, то Андрюша кладет текущий носок на стол перед собой. Иначе он убирает текущий носок и его пару в шкаф.

Андрюша очень внимательный, поэтому он запомнил, в каком порядке доставал носки из мешка. Теперь он задумался, а какое максимальное количество носков одновременно лежало перед ним на столе? Помогите Андрюше ответить на этот вопрос.

Входные данные

В первой строке находится единственное целое число n (1 ≤ n ≤ 105) — число пар носков.

Во второй строке через пробел перечислены 2n чисел x1, x2, ..., x2n (1 ≤ xi ≤ n), которые описывают, в каком порядке Андрюша доставал носки из мешка. А именно, число xi означает, что i-м по порядку Андрюша достал носок из пары xi.

Гарантируется, что Андрюша достал ровно два носка из каждой пары.

Выходные данные

В единственной строке выведите одно число — максимальное число носков, которые когда-либо лежали на столе перед Андрюшей.

Примечание

В первом примере из условия Андрюша достает из мешка носок из первой пары и кладет его на стол. Затем он достает следующий носок, который также из первой пары, так что он сразу же берет оба носка и убирает их в шкаф. Таким образом, максимум один носок лежал на столе.

Рассмотрим, что происходит во втором примере:

  • Сначала на столе ничего нет, Андрюша достает носок из пары номер 2.
  • На столе лежит носок (2). Андрюша достает носок из пары номер 1 и кладет его на стол.
  • На столе лежат носки (1, 2). Андрюша достает носок из пары номер 1, но такой носок уже есть на столе. Поэтому Андрюша убирает оба носка в шкаф.
  • На столе лежит носок (2). Андрюша достает носок из пары номер 3 и кладет его на стол.
  • На столе лежат носки (2, 3). Андрюша достает носок из пары номер 2, но такой носок уже есть на столе. Поэтому Андрюша убирает оба носка в шкаф.
  • На столе лежит носок (3). Андрюша достает носок из пары номер 3, но такой носок уже есть на столе. Поэтому Андрюша убирает оба носка в шкаф.
Таким образом, на столе единовременно лежало максимум два носка.

D. Иннокентий и футбольная лига

2-sat графы жадные алгоритмы кратчайшие пути реализация Строки *1900

Иннокентий — президент только что созданной футбольной лиги в Байтландии. Первая задача, которая стоит перед ним — обеспечить трансляцию всех матчей лиги по телевидению. Как вы, возможно, знаете, во время футбольного матча на экране отображаются сокращенные названия команд и текущий счет. Конечно, будет странно, если сокращенные названия клубов соперников совпадут, поэтому Иннокентий должен придумать. как сократить название каждого из клубов лиги до трех букв так, чтобы у всех команд лиги были разные названия.

Название каждого клуба состоит из двух слов: названия команды и города, в котором располагается клуб, например, «DINAMO BYTECITY». Иннокентий не хочет сильно искажать название, поэтому он хочет выбрать сокращенное название для каждого из клубов таким образом, чтобы:

  1. либо сокращенное название клуба совпадало с первыми тремя буквами названия команды, например, для вышеприведенный команды это «DIN»,
  2. либо первые две буквы сокращенного названия клуба совпадали с первыми двумя буквами названия команды, а третья — с первой буквой города команды. Например, для вышеприведенный команды это «DIB».

Кроме этого, если для какой-то команды x выбран второй вариант названия, то не должно быть команды, у которой выбран первый вариант сокращенного названия, совпадающий с первым вариантом названия команды x. Например, если сокращенное название вышеприведенной команды это «DIB», то никакая команда, у которой выбран первый вариант сокращенного названия, не должна иметь сокращенного названия «DIN». При этом возможно, что какая-то команда получит название «DIN», где «DI» — первые две буквы названия команды, а «N» — первая буква города. Конечно, никакие две команды не должны иметь одинакового сокращенного названия.

Помогите Иннокентию выбрать сокращенное название для каждой из команд. Если это невозможно, сообщите об этом. Если возможных ответов несколько, Иннокентия устроит любой из них. Если для некоторой команды совпадают оба варианта сокращенного названия, то Иннокентий все равно будет формально считать, что выбран только один из этих вариантов.

Входные данные

В первой строке находится единственное целое число n (1 ≤ n ≤ 1000) — число футбольных клубов в лиге.

В каждой из следующих n строк находятся два слова — название команды и название города очередного клуба. И название команды, и название города состоят из заглавных букв латинского алфавита и имеют длину не менее 3 и не более 20.

Выходные данные

Если выбрать сокращенные названия, удовлетворив требованиям Иннокентия, невозможно, выведите единственную строку «NO».

Иначе в первую строку выведите «YES». Далее выведите n строк, в каждой строке выведите выведите сокращенное название очередного клуба. Выводите клубы в том же порядке, в каком они заданы во входных данных.

Если возможных ответов несколько, выведите любой.

Примечание

В первом примере можно выбрать первый вариант названия для обеих команд.

Во втором примере невозможно подобрать названия, т. к. по условию нельзя у одной команды выбрать первый вариант названия, а у второй выбрать второй вариант названия, если первые варианты названий у этих команд совпадают.

В третьем примере можно выбрать вторые варианты названий у первых двух команд, и первый вариант — у третьей команды.

В четвертом примере обратите внимание на то, что разрешается, чтобы выбранное название некоторой команды x совпадало с первым вариантом названия y, если первый вариант названия x не совпадает с первым вариантом названия y.

H. Автобусы и интранет

Бинарный поиск геометрия реализация *3100

В городе запустили автобусный маршрут, представляющий собой замкнутую ломаную на плоскости, все звенья которой параллельны осям координат. На маршруте будет работать m автобусов, двигающихся по циклу вдоль ломаной в одном направлении с одинаковой постоянной скоростью (временем остановок автобусов в рамках данной задачи можно пренебречь).

Автобусы начинают движение по маршруту в первой вершине ломаной с равными промежутками. Пусть T — это время, за которое один автобус проезжает по кругу весь маршрут. Тогда автобус 1 начинает движение в момент времени 0, автобус 2 — в момент времени T / m, третий — в момент времени 2T / m, и т.д.; наконец, автобус m стартует в момент (m - 1)T / m. Таким образом, интервалы между всеми парами соседних автобусов (в том числе, между последним и первым) одинаковы.

Автобусы могут обмениваться информацией при помощи беспроводных передатчиков одинаковой мощности. Если мощность передатчиков на автобусах равна D, то обмен информацией возможен между автобусами на расстоянии D или меньше.

Кроме этого, автобусы оснащены распределенной системой слежения за маршрутом. Для того, чтобы все автобусы двигались строго по графику, система должна периодически синхронизировать данные на всех автобусах. В момент синхронизации автобус 1 обменивается информацией с автобусом 2, автобус 2 с автобусом 3, и т.д., кроме этого, автобус m обменивается информацией с автобусом 1.

Вам, как сотруднику аналитического отдела, поставили задачу найти минимальное значение D, при котором синхронизацию возможно проводить хотя бы время от времени.

Входные данные

В первой строке записано два целых числа n и m (2 ≤ n, m ≤ 105) — количество вершин ломаной и количество автобусов соответственно.

Следующие n строк описывают вершины ломаной в порядке ее обхода. Каждая из этих строк содержит два целых числа xi, yi ( - 1000 ≤ xi, yi ≤ 1000) — координаты очередной вершины.

Гарантируется, что каждое звено ломаной (в том числе, между последней и первой вершиной) параллельно одной из осей координат. Кроме этого, никакие две последовательные вершины ломаной не совпадают. Ломаная может иметь самопересечения и проходить по одному отрезку несколько раз.

Выходные данные

Выведите одно вещественное число — ответ на задачу. Ответ будет принят, если абсолютная или относительная погрешность не превосходит 10 - 6.

Примечание

Пусть все автобусы проезжают 1 единицу расстояния в секунду. В первом примере, через 0.5 секунды автобусы окажутся на расстоянии 1, поэтому можно выбрать D = 1.

Во втором примере, через 0.5 секунды оба автобуса окажутся в точке (0.5, 0), поэтому можно выбрать D = 0.

C. INTERCALC

*особая задача реализация *1800

DO YOU EXPECT ME TO FIND THIS OUT?

WHAT BASE AND/XOR LANGUAGE INCLUDES string?

DON'T BYTE OF MORE THAN YOU CAN CHEW

YOU CAN ONLY DISTORT THE LARGEST OF MATHEMATICS SO FAR

SAYING "ABRACADABRA" WITHOUT A MAGIC AND WON'T DO YOU ANY GOOD

THE LAST STACK RUPTURES. ALL DIE. OH, THE EMBARRASSMENT!

I HAVE NO ARRAY AND I MUST SCREAM

ELEMENTS MAY NOT BE STORED IN WEST HYPERSPACE

Входные данные

Первая строка входных данных содержит одно целое число n (1 ≤ n ≤ 10).

Вторая строка входных данных содержит n целых чисел ai (1 ≤ ai ≤ 11), разделенных пробелами.

Выходные данные

Выведите одно целое число.

D. Чувствительные палиндромы

*особая задача реализация *1900

Входные данные

В единственной строке входных данных записана строка цифр. В строке будет от 1 до 10 символов, включительно.

Выходные данные

Выведите «Yes» или «No».

E. Запутанная схема

*особая задача Перебор реализация *2000

Входные данные

Входные данные состоят из четырех строк, каждая из которых содержит одну цифру - 0 или 1.

Выходные данные

Выведите одну цифру, 0 или 1.

F. Crunching Numbers Just for You

*особая задача реализация *1900

Вы работаете над новой функциональностью для сайта по продаже авиабилетов: возможностью сортировать билеты по цене! Вы уже написали код, который возвращает список билетов, остался последний шаг...

Дан массив целых чисел. Отсортируйте его в порядке неубывания элементов.

Входные данные

Входные данные состоят из одной строки, в которой через пробел записаны целые числа. Первое число — размер массива n (1 ≤ n ≤ 10). Следующие n чисел — элементы массива (1 ≤ ai ≤ 100).

Выходные данные

Выведите элементы отсортированного массива, разделенные пробелами.

Примечание

Помните, это очень важная функциональность, и нужно убедиться, что пользователи оценят ее появление!

A. Антон и многогранники

реализация Строки *800

Любимые геометрические фигуры Антона — правильные многогранники. Напомним, что правильных многогранников всего пять видов:

  • Тетраэдр. У тетраэдра 4 треугольных грани.
  • Куб. У куба 6 квадратных граней.
  • Октаэдр. У октаэдра 8 треугольных граней.
  • Додекаэдр. У додекаэдра 12 пятиугольных граней.
  • Икосаэдр. У икосаэдра 20 треугольных граней.

Все пять видов многогранников показаны на рисунке ниже:

У Антона есть целая коллекция из n многогранников. Однажды ему стало интересно, сколько суммарно граней у всех фигур в его коллекции. Помогите Антону найти это число!

Входные данные

В первой строке входных данных находится целое число n (1 ≤ n ≤ 200 000) — количество многогранников в коллекции у Антона.

В следующих n строках входных данных находится по одной строке si — название i-го многогранника в коллекции Антона. Строка может иметь следующий вид:

  • «Tetrahedron» (без кавычек), если i-й многогранник в коллекции Антона — тетраэдр.
  • «Cube» (без кавычек), если i-й многогранник в коллекции Антона — куб.
  • «Octahedron» (без кавычек), если i-й многогранник в коллекции Антона — октаэдр.
  • «Dodecahedron» (без кавычек), если i-й многогранник в коллекции Антона — додекаэдр.
  • «Icosahedron» (без кавычек), если i-й многогранник в коллекции Антона — икосаэдр.
Выходные данные

Выведите одно целое число — суммарное число граней у всех многогранников в коллекции Антона.

Примечание

В первом примере у Антона есть один икосаэдр, один куб, один тетраэдр и один додекаэдр. У икосаэдра 20 граней, у куба — 6, у тетраэдра — 4 и, наконец, у додекаэдра — 12. Итого 20 + 6 + 4 + 12 = 42 грани.

B. Не бойся

жадные алгоритмы математика реализация *1300

С того момента, как гигантские головы появились в небе, все человечество в опасности, поэтому все Рики и Морти из всех параллельных вселенных собираются в группы, чтобы найти решение, чтобы избавиться от гигантских голов.

Всего есть n параллельных вселенных, участвующих в этом событии (n Риков и n Морти). То есть в каждой из n вселенных есть один Рик и один Морти. Они собираются в m групп. Каждый человек может быть в нескольких группах, и каждая группа может содержать произвольное количество людей.

Рики и Морти зарегистрировались онлайн в этих группах. Также человек может вступить в группу больше одного раза (разработчик этого сайта не рассмотрел эту возможность).

Лето из вселенной #1 знает, что в каждой параллельной вселенной (включая это лето) ровно один из Рика и Морти из этой вселенной предатель и ровно один верен, но никто не знает кто именно. Лето знает, что мы обречены, если существует группа, в которой каждый участник предатель (они спланируют и уничтожат мир).

Лето знает, что если есть вероятность того, что миру конец (иначе говоря, есть группа, в которой все участники предатели), то оно должно немедленно отменить это событие. Поэтому оно хочет знать отменять ли событие. Вы должны ответить ему да только в том случае, если существует хотя бы один сценарий (из 2n возможных сценариев, 2 возможных сценария для того, кому быть предателем в каждой вселенной) такой, что миру наступит конец.

Входные данные

Первая строка входных данных содержит два целых числа n и m (1 ≤ n, m ≤ 104) — количество вселенных и количество групп соответственно.

Следующие m строк содержат информацию о группах. i-я из них сначала содержит целое число k (количество раз, которое кто-то вступил в i-ю группу, k > 0), за которым следует k целых чисел vi, 1, vi, 2, ..., vi, k. Если vi, j отрицательное, это значит, что Рик из вселенной номер  - vi, j вступил в группу, иначе это значит, что Морти из вселеннй номер vi, j вступил в неё.

Сумма всех k по всем группам не превышает 104.

Выходные данные

В единственной строке выведите ответ на вопрос Лета. Выведите «YES», если оно должно отменить событие, иначе «NO».

Примечание

В первом тестовом примере 1-я группа содержит только Рика из вселенной номер 3, поэтому в случае, если он предатель, тогда все участники его группы предатели, и поэтому Лето должно отменить событие.

A. Анастасия и камушки

математика реализация *1100

Анастасия очень любит гулять в Центральном Ужляндском Парке. Но просто гулять ей стало неинтересно, поэтому она начала коллекционировать ужляндские камушки. Сначала она решила собрать все камушки, которые найдет в парке.

У неё есть всего два кармана. В каждом кармане помещается до k камушков. В парке можно найти камушки n видов, причем камушков i-го типа в парке ровно wi штук. Анастасия очень ответственно относится к новому хобби, поэтому она никогда не смешает камушки двух разных видов в одном кармане. Но это не мешает ей класть камушки одного вида в разные карманы. К сожалению, она не может тратить всё своё время на сбор камушков, поэтому она может приносить камушки из парка только один раз за день.

Помогите ей узнать минимальное количество дней, необходимое для того, чтобы собрать все камушки Ужляндского парка. Помните, что Анастасия не может переносить в одном кармане камушки разных видов одновременно.

Входные данные

В первой строке входных данных содержится два числа n и k (1 ≤ n ≤ 105, 1 ≤ k ≤ 109) — количество видов камушков и количество камушков, которые помещаются в каждый карман.

Во второй строке содержится n целых чисел w1, w2, ..., wn (1 ≤ wi ≤ 104) — количество камушков каждого из видов.

Выходные данные

Выведите одно целое число — минимальное количество дней, которое понадобится Анастасии, чтобы собрать все камушки Ужляндского парка.

Примечание

В первом примере в первый день Анастасия может собрать все камушки первого вида, во второй день — второго вида, в третий — третьего.

Во втором примере одним из оптимальных ответов является такой:

  • В первый день Анастасия собирает 8 камушков третьего вида.
  • Во второй день она собирает 8 камушков четвертого вида.
  • В третий день она собирает 3 камушка первого вида и 1 камушек четвертого.
  • В четвертый день она собирает 7 камушков пятого вида.
  • В пятый день она собирает 1 камушек второго вида.

B. Маша и геометрическая депрессия

математика Перебор реализация *1700

Маша очень любит алгебру. И вот на очередном уроке строгий учитель Двастан задал ей новое задание.

Дана геометрическая прогрессия b, определяемая двумя целыми числами b1 и q. Напомним, что геометрическая прогрессия — это такая последовательность чисел b1, b2, b3, ..., что для любого i > 1 выполняется bi = bi - 1·q, где q — знаменатель прогрессии. Но в Ужляндии все прогрессии особенные: как b1, так и q могут быть равными 0. Также Двастан задал m «плохих» целых чисел a1, a2, ..., am, и целое число l.

Маша по порядку выписывает все члены прогрессии (в том числе повторяющиеся) на доску, пока выполняется условие |bi| ≤ l (запись |x| означает модуль числа x). Есть одно исключение: если элемент прогрессии, который сейчас должен быть выписан, присутствует среди «плохих» чисел, то Маша его не выписывает, а пропускает, переходя к следующему элементу прогрессии.

Поскольку скоро урок подойдет к концу, Маше нужно быстро посчитать, сколько же чисел она выпишет. Чтобы не впасть в депрессию, она просит помощи у вас: помогите Маше посчитать, сколько же чисел она выпишет, или выведите «inf», если она выпишет бесконечное количество чисел.

Входные данные

В первой строке входных данных содержится четыре целых числа b1, q, l, m (-109 ≤ b1, q ≤ 109, 1 ≤ l ≤ 109, 1 ≤ m ≤ 105) — первый элемент прогрессии, знаменатель прогрессии, модуль максимального значения, которое может быть выписано и количество «плохих» чисел соответственно.

В второй строке задано m различных целых чисел a1, a2, ..., am (-109 ≤ ai ≤ 109) — числа, которые пропускают, если они будут в прогрессии.

Выходные данные

В единственной строке выведите количество чисел, которые выпишет Маша, или «inf» (без кавычек), если ей придется выписать бесконечное количество чисел.

Примечание

В первом примере Маша выпишет числа 3, 12, 24. Элемент прогрессии 6 она пропустит, так он есть среди «плохих» чисел. Элементы, большие 24, она выписывать не будет, так как они больше l по абсолютному значению.

Во втором примере Маша не выпишет ни одного числа, так как все элементы прогрессии равны 123, а это число является «плохим».

В третьем примере Маше придется выписать бесконечное количество чисел, равных 123.

B. Разноцветное поле

реализация сортировки *1400

Лиса Кейл ехала в автобусе и смотрела в окно. За окном было поле, имеющее форму n × m прямоугольника, который был разделен на 1 × 1 квадраты. Некоторые квадраты были безжизненны, в то время как на других росли фрукты и овощи: на них росла морковь, киви или виноград.

Лиса внимательно рассмотрела поле и заметили следующую закономерность.

  • Предположим все строки пронумерованы от 1 до n сверху вниз, а столбцы от 1 до m слева направо. Пусть ячейка (квадрат) в i-ой строке и j-ом столбце обозначается как (i, j).
  • Во-первых, оказалось, что каждый квадрат был либо удобрен либо нет. Неудобренные квадраты оказались безжизненными, в то время как на удобренных выросли фрукты и овощи. Посадка фруктов и овощей на удобренные участки происходила слева-направо сверху-вниз: (1, 1) → ... → (1, m) → (2, 1) → ... → (2, m) → ... → (n, 1) → ... → (n, m). Неудобренные участки при посадке игнорировались.
  • При посадке на ячейку была посажена одна культура (морковь, киви или виноград). Посадка культур осуществлялась по циклу, начиная с моркови. Т.е. морковь была посажена в первую удобренную клетку, во вторую — киви, в третью — виноград, в четвертую — морковь, в пятую — киви и т.д.

Следующий рисунок демонстрирует пример процедуры посадки. Здесь белые клетки обозначают удобренные ячейки, а черные — неудобренные (безжизненные).

Напишите программу, которая определяет название культуры каждой из заданных t клеток.

Входные данные

Первая строка содержит четыре положительных целых числа n, m, k, t (1 ≤ n ≤ 4·104, 1 ≤ m ≤ 4·104, 1 ≤ k ≤ 103, 1 ≤ t ≤ 103), обозначающих высоту, ширину, количество неудобренных клеток и количество клеток для определения культур на них.

Следующие k строк содержат пары координат a, b (1 ≤ a ≤ n, 1 ≤ b ≤ m), которые обозначают, что клетки (a, b) являются неудобренными. Гарантируется, что никакая клетка не встречается дважды в этом списке.

Следующие t строк содержат координаты i, j (1 ≤ i ≤ n, 1 ≤ j ≤ m), которые обозначают, что для клетки (i, j) надо определить культуру на ней.

Выходные данные

Для каждой из t заданных клеток выведите:

  • «Waste» — если клетка безжизненна,
  • «Carrots», «Kiwis» или «Grapes» — если там растет морковь, киви или виноград соответственно.
Примечание

Пример соответствует картинке из условия.

A. Мишка и старший брат

реализация *800

Мишка Лимак хочет стать самым большим медведем, ну, или хотя бы стать больше своего старшего брата Боба.

Сейчас вес Лимака равен a, а вес Боба равен b. Гарантируется, что вес Лимака меньше или равен весу Боба.

Лимак ест много, и его вес утраивается каждый год, а вес Боба удваивается каждый год.

Через сколько целых лет Лимак станет строго больше (т. е. будет весить строго больше) Боба?

Входные данные

В единственной строке находятся два целых числа a и b (1 ≤ a ≤ b ≤ 10) — веса Лимака и Боба соответственно.

Выходные данные

Выведите одно целое число — через сколько целых лет Лимак станет строго больше Боба.

Примечание

В первом примере изначально вес Лимака равен 4, а вес Боба — 7. Через год их веса равны 4·3 = 12 и 7·2 = 14 соответственно (один вес утроился, а второй удвоился). Лимак все еще не больше Боба. Через два года их веса равны 36 и 28, то есть вес Лимака больше, чем вес Боба. Лимак стал больше Боба через два года, поэтому вы должны вывести 2.

Во втором примере веса Лимака и Боба в последующие года равны: 12 и 18, затем 36 и 36, и наконец 108 и 72 (через три года). Ответ равен 3. Помните, что Лимак хочет стать строго больше Боба, и его не устроят равные веса.

В третьем примере Лимак станет больше Боба через один год, их веса будут равны 3 и 2 соответственно.

A. Новый маршрут

реализация сортировки *1100

Вдоль главной дороги Берляндии расположены n городов. Они заданы целыми координатами относительно начала дороги a1, a2, ..., an. Все координаты различны.

Перемещаться между городами можно только на автобусе, но все автобусы так устарели, что министр транспорта принял решение запустить новый маршрут с обновленными машинами. Министр планирует минимизировать затраты на организацию маршрута, то есть соединить два города с минимальным расстоянием между ними. Расстояние между городами определяется модулем разности их координат.

Иногда может существовать больше одной пары городов с расстоянием, равным минимальному. Министру также важно знать, сколько таких пар существует.

Напишите программу, которая определит минимальное расстояние по всем парам городов и количество пар с данным расстоянием.

Входные данные

В первой строке задано целое положительное число n (2 ≤ n ≤ 2·105).

Во второй строке задано n целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109). Все числа ai различны.

Выходные данные

Выведите два числа — минимальное расстояние по всем парам городов и количество пар с данным расстоянием.

Примечание

В первом примере существует одна пара городов с минимальным расстоянием между ними — первый и четвертый города. Расстояние равно |4 - 6| = 2.

B. Считалка

реализация *1300

n детей стоят по кругу и играют в считалочку. Дети пронумерованы по часовой стрелке от 1 до n. В начале первый из них становится ведущим. Игра состоит из k шагов. На i-м шаге ведущий по часовой стрелке отсчитывает, начиная со следующего человека от себя, ai человек. Последний, на кого указал ведущий, выбывает из игры, а ведущим становится следующий за ним участник.

Например, если в текущий момент по кругу стоят дети [8, 10, 13, 14, 16], ведущим является ребенок 13, а значение ai = 12, то счет закончится на ребенке 16, который покинет игру. Следующим ведущим станет ребенок 8.

Напишите программу, которая для каждого шага выводит номер ребенка, который покинет игру на этом шаге.

Входные данные

В первой строке задано два целых числа n и k (2 ≤ n ≤ 100, 1 ≤ k ≤ n - 1).

В следующей строке задано k целых чисел a1, a2, ..., ak (1 ≤ ai ≤ 109).

Выходные данные

Выведите k чисел, где i-е из них равно номеру ребенка, выбывшего на i-м шаге.

Примечание

Разберем первый пример:

  • На первом шаге выбывает ребенок 4, ведущим становится ребенок 5.
  • На втором шаге выбывает ребенок 2, ведущим становится ребенок 3.
  • На третьем шаге выбывает ребенок 5, ведущим становится ребенок 6.
  • На четвертом шаге выбывает ребенок 6, ведущим становится ребенок 7.
  • На последнем шаге выбывает ребенок 1, ведущим становится ребенок 3.

A. Олег и акции

математика реализация *900

Простой клиент банка Олег каждый день проверяет цены на акции, которыми сейчас владеет. Его интересуют цены на n акций. Открыв в очередной раз сайт с котировками, Олег заметил, что каждую секунду цена ровно одной акции Олега опускается на k рублей (заметьте, что в разные секунды может меняться цена разных акций, но в каждую секунду меняется цена только одной акции). Цена акций может стать отрицательной. Олега очень заинтересовал этот процесс, и он решил спросить у аналитика Игоря, через какое минимальное количество секунд цена всех его n акций может стать одинаковой, либо же удостовериться, что такого никогда не случится. Однако Игорь оказался слишком занят делами в своем офисе, и попросил вас помочь Олегу. Справитесь ли вы с этим поручением?

Входные данные

На первой строке через пробел даны числа n и k (1 ≤ n ≤ 105, 1 ≤ k ≤ 109) — количество акций Олега и количество рублей, на которые каждую секунду опускается цена произвольной акции Олега.

На следующей строке через пробел даны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109) — цены акций Олега на момент, когда он открыл сайт с котировками.

Выходные данные

На первой и единственной строке выведите одно целое число — через какое минимальное количество секунд цены всех акций могут стать одинаковыми, либо выведите «-1», если такого произойти не может.

Примечание

Рассмотрим первый пример.

В первую секунду цена третьей акции становится 12 рублей, далее во вторую секунду цена первой акции становится 9 рублей, и в следующую секунду цена третьей акции опускается до 9 рублей. Таким образом, цены всех акций стали равны 9 рублям за 3 секунды.

Возможны и другие варианты развития событий, однако вышеприведенный является минимальным по количеству секунд, которое потребовалось, чтобы сделать цены всех акций равными. Таким образом, ответ равен 3.

Во втором примере можно заметить, что четность цен обоих акций никогда не будет меняться, и изначально они разной четности, а значит, цены никогда не смогут стать равными.

В третьем примере минимальным по количеству секунд является такой вариант развития событий: сначала опускается цена второй акции, затем трететьей, затем четвертой, и так 999999999 раз. Так как за секунду опускается цена только одной акции, то на весь процесс потребуется 999999999 * 3 = 2999999997 секунд.

B. Игорь и путь на работу

графы кратчайшие пути поиск в глубину и подобное реализация *1600

Проснувшись со звонком будильника, аналитик Игорь заспешил на работу. Совершив все необходимые утренние процедуры и позавтракав, Игорь сел в свой автомобиль. Открыв GPS-навигатор, он увидел, что в некоторых районах его родного города Банкополиса ведутся дорожные работы, поэтому они недоступны для проезда. Однако на этом неприятности Игоря не закончились: оказалось, что в его авто сломался руль, и он может совершить не более двух поворотов по пути в свой офис в банке.

Банкополис представляет из себя клетчатое поле из n строк и m столбцов. Помогите аналитику Игорю найти путь из дома в его офис, содержащий не более двух поворотов и не посещающий клетки, в которых проводятся дорожные работы, либо установить, что такого пути не существует, и Игорю придется отчитываться перед начальством за то, что он не явился на работу. Поворотом считается смена направления движения в пути. В силу своей конструкции автомобиль Игоря может двигаться только влево, вправо, вверх и вниз, изначально Игорь может выбрать любое направление движения. Игорь все еще сонный, поэтому он нуждается в вашей помощи.

Входные данные

На первой строке через пробел даны два числа n и m (1 ≤ n, m ≤ 1000)— количество строк и столбцов поля соответственно.

В каждой из последующих n строк содержится m символов, описывающих соответствующую строку поля. Возможные варианты символов:

  • «.» — свободная клетка;
  • «*» — клетка, в которой проводятся дорожные работы;
  • «S» — клетка, в которой находится дом аналитика Игоря;
  • «T» — клетка, в которой находится офис банка Игоря.

Гарантируется, что символы «S» и «T» встречаются ровно по одному разу.

Выходные данные

Выведите «YES», если существует путь от дома Игоря до его офиса, делающий не более двух поворотов, и «NO» иначе.

Примечание

Первый пример изображен на следующей картинке:

Во втором примере добраться из дома Игоря в его офис меньше чем за 4 поворота нельзя, а значит, не существует пути, использующего не больше 2-х поворотов. Путь из 4-х поворотов показан ниже:

C. Мышиная проблема

геометрия математика реализация сортировки *2300

Аналитик Игорь задремал на работе, и ему приснился сон. Во сне у Игоря на рабочем столе завелось много компьютерных мышей, поэтому он купил себе мышеловку.

Рабочий стол можно представить как бесконечную плоскость, тогда мышеловка представляет из себя прямоугольник, стороны которого параллельными осям координат, противоположные углы которого находятся в точках с координатами (x1, y1) и (x2, y2).

Игорь хочет поймать всех мышей. Анализируя их поведение, Игорь выяснил, что каждая мышь ползет прямолинейно с постоянной скоростью, скорость мыши номер i равна (vix, viy), что означает, что координата x позиции мыши увеличивается за секунду на vix, а координата y — на viy. Изначально мышеловка поднята, и мыши могут свободно передвигаться по столу. Игорь может в любой момент времени опустить мышеловку, при этом он поймает всех мышей, оказавшихся строго внутри мышеловки.

Игорь очень трудолюбивый и даже во сне трудится на своей работе, поэтому он просит вас написать программу, которая по заданным координатам мышеловки, позициям мышей в начальный момент времени и их скоростям вычислит ближайший момент времени, в который ему удастся поймать всех мышей. Обратите внимание, что Игорь может опустить мышеловку только один раз.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 100 000) — количество компьютерных мышей у Игоря в офисе.

Вторая строка содержит четыре целых числа x1, y1, x2 и y2 (0 ≤ x1 ≤ x2 ≤ 100 000), (0 ≤ y1 ≤ y2 ≤ 100 000) — координаты противоположных углов мышеловки.

Следующие n строк содержат информацию о мышах.

В i-й из этих строк содержится четыре целых числа rix, riy, vix и viy, (0 ≤ rix, riy ≤ 100 000,  - 100 000 ≤ vix, viy ≤ 100 000), где (rix, riy) — позиция мыши в начальный момент времени, а (vix, viy) — ее скорость.

Выходные данные

В единственной строке выведите минимальное неотрицательное t такое, что если Игорь опустит мышеловку в момент времени t секунд, то все компьютерные мыши окажутся строго внутри мышеловки. Если такого t не существует, выведите -1.

Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6.

А именно: пусть ваш ответ равен a, а ответ жюри b. Ваш ответ будет засчитан, если .

Примечание

Ниже приведена иллюстрация первого примера.

Точки A, B, C, D - начальные положение мышей, отрезками показан их путь.

Тогда в первый момент времени, в котором все точки будут находиться в прямоугольнике, прямоугольник будет выглядеть следующим образом:

Иллюстрация второго примера выглядит так:

Как видно на изображении, мыши A, D и B никогда не попадут в прямоугольник.

A. Ограбление Банка

Перебор реализация *800

Преступник попытался ограбить банк, но не смог завершить свое дело. Однако, он смог открыть все сейфы.

Клиент банка Олег любит деньги (а кто нет?), поэтому он решил извлечь выгоду из этого неудачного ограбления и украсть часть денег из сейфов. В ряд расположено много сейфов, i-й слева сейф имеет номер номер i. В сейфах всего находятся n купюр. Купюра номер i лежит в сейфе xi. Сейчас Олег находится около сейфа a. Кроме того, есть два охранника, один из которых стоит около сейфа b такого, что b < a, то есть он стоит левее Олега. Второй охранник стоит около сейфа c такого, что c > a, то есть он стоит правее Олега.

Охранники ленивые, поэтому они не двигаются. В каждую секунду Олег может либо взять всю купюры из сейфа, перед которым он стоит, либо передвинуться к любому из соседних сейфов. Однако, он не может передвинуться к сейфу, около которого стоит охранник, так как в таком случае он будет обвинен в грабеже. Определите максимальное количество купюр, которое может собрать Олег.

Входные данные

В первой строке находятся три целых числа a, b и c (1 ≤ b < a < c ≤ 109) — позиции Олега, первого охранника и второго охранника, соответственно.

Вторая строка содержит целое число n (1 ≤ n ≤ 105) — число купюр.

Следующая строка содержит n целых чисел x1, x2, ..., xn (1 ≤ xi ≤ 109), которые означают, что i-я купюра лежит в сейфе xi. Заметьте, что xi не обязательно различные.

Выходные данные

Выведите одно число: максимальное число купюр, которое может взять Олег.

Примечание

В первом примере Олег может взять купюры из сейфов 4, 5, 6 (заметьте, что в сейфе 5 лежат 2 купюры). Олег не может взять купюры из сейфов 7 и 8, так как он не может пройти мимо второго охранника. Кроме того, Олег не может взять купюры из сейфов 3 и 2, так как он не может пройти мимо первого охранника. Итого. он может взять максимум 4 купюры.

Во втором примере Олег не может взять ни одной купюры, не проходя мимо охранников.

A. Покупка дома

Перебор реализация *800

Волшебник Зейн никогда ни в кого не влюблялся раньше, но сейчас ему понравилась одна девушка, имя которой нам неизвестно.

Девушка живет в доме номере m в деревне. Всего в деревне есть n домов, и они расположены на прямой улицу слева направо: дом 1, дом 2, ..., дом n. Дома строились по плану, поэтому дома i и i + 1 (1 ≤ i < n) расположены ровно в 10 метрах друг от друга. В этой деревне некоторые дома заняты, а некоторые — нет. Конечно, занятые дома нельзя купить.

Вам будут даны n целых чисел a1, a2, ..., an, которые обозначают занятость и цену домов. Если дом i занят, и поэтому не может быть куплен, то ai равняется 0. Иначе дом i может быть куплен, и ai означает сумму в долларах, необходимую для покупки этого дома.

У Зейна есть только k долларов, и поэтому для него непросто выбрать дом, который он должен купить, чтобы жить как можно ближе к своей возлюбленной. Помогите Зейну определить минимальное расстояние от дома его возлюбленной до некоторого дома, который он может себе позволить купить.

Входные данные

Первая строка содержит три целых числа n, m, и k (2 ≤ n ≤ 100, 1 ≤ m ≤ n, 1 ≤ k ≤ 100) — количество домов в деревне, дом, где живет девушка, и количество денег, которое есть у Зейна (в долларах), соответственно.

Вторая строка содержит n целых числел a1, a2, ..., an (0 ≤ ai ≤ 100), обозначающих занятость и цену домов.

Гарантируется, что am = 0, и что возможно купить хотя бы один дом за сумму не больше k долларов.

Выходные данные

Выведите одно число — минимально возможное расстояние (в метрах) от дома возлюбленной Зейна до дома, который может купить Зейн.

Примечание

В первом примере с k = 20 долларами Зейн может купить только дом 5. Расстояние от дома m = 1 до дома 5 равно 10 + 10 + 10 + 10 = 40 метров.

Во втором примере Зейн может купить дома 6 и 7. Лучше купить дом 6, чем дом 7, потому что дом m = 3 и дом 6 находятся на расстоянии 30 метров, а дом m = 3 и дом 7 — на расстоянии 40 метров.

B. Найти кость

реализация *1300

Волшебник Зейн хочет показать публике фокус с переставлением стаканов.

Есть n стаканов, пронумерованных от 1 до n, расположенных вдоль оси x на столе, на котором имеется m отверстий. Более точно, стакан номер i стоит на столе на позиции x = i.

Игральная кость изначально находится в позиции x = 1. Зейн запутает аудиторию, меняя пару стаканов местами ровно k раз, i-ми по порядку переставляя стаканы на позициях x = ui и x = vi. Если в любой момент времени кость оказывается в позиции, где есть отверстие в столе, она падает в него, и остается на месте до конца фокуса.

Не забудьте, что Зейн волшебник. Поэтому, когда он меняет местами два стакана, он не двигает их по столу, а телепортирует стаканы (вместе с костью, если она внутри какого-то из них) на необходимые позиции. Поэтому, например, при переставлении местами стаканов на местах x = 4 и x = 6, они не окажутся на позиции x = 5 ни в какой момент операции.

Щенок Зейна Инзейн озадачен. Зейн отошел, и Инзейн не может найти свою любимою игральную кость, и будет очень утомительно пытаться открыть все стаканы. Инзейн знает, что сообщество Codeforces уже успешно помогло Зейну, поэтому просит помочь ему тоже. Помогите Инзейну определить финальную позицию кости.

Входные данные

Первая строка содержит три целых числа n, m и k (2 ≤ n ≤ 106, 1 ≤ m ≤ n, 1 ≤ k ≤ 3·105) — количество стаканов, количество отверстий и количество операций переставления, соответственно.

Вторая строка содержит m различных целых чисел h1, h2, ..., hm (1 ≤ hi ≤ n) — координаты вдоль оси x отверстий на столе.

Каждая из следующих k строк содержит два целых числа ui и vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — позиции, стаканы на которых нужно переставить.

Выходные данные

Вывеедите одно целое число — финальную позиции кости вдоль оси x.

Примечание

В первом примере после каждой из операций кость оказывается на позициях x = 2, x = 5, x = 7, и x = 1, соответственно.

Во втором примере после первой операции кость окажется в позиции x = 2 и упадет в отверстие.

A. k-Факторизация

математика реализация теория чисел *1100

Дано натуральное число n. Необходимо разложить его ровно на k чисел, таких, что все числа строго больше 1, а их произведение равно n, либо сообщить о том, что это невозможно.

Входные данные

В единственной строке заданы два числа n и k (2 ≤ n ≤ 100000, 1 ≤ k ≤ 20).

Выходные данные

Если разложить n на k множителей невозможно, выведите -1.

Иначе выведите k натуральных чисел, таких, что их произведение в точности равно n. Числа можно выводить в любом порядке. Если возможных ответов несколько, выведите любой из них.

B. Нечетная сумма

дп жадные алгоритмы реализация *1400

Дана последовательность из n целых чисел a1, a2, ..., an. Необходимо найти такую её подпоследовательность, что её сумма нечётна и максимальна по всем таким подпоследовательностям. Гарантируется, что в заданной последовательности найдется подпоследовательность с нечетной суммой.

Подпоследовательность — это последовательность, которую можно получить из другой последовательности путем удаления некоторых элементов, не меняя порядок оставшихся элементов.

Напишите программу, которая найдет сумму искомой подпоследовательности.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 105).

Во второй строке задано n целых чисел a1, a2, ..., an ( - 104 ≤ ai ≤ 104). В данной последовательности есть хотя бы одна подпоследовательность с нечетной суммой.

Выходные данные

Выведите сумму искомой подпоследовательности.

Примечание

В первом примере сумма второго и четвертого элементов равна 3.

A. Морковные торты

Перебор реализация *1100

В одной из игр Playrix печь выпекает за t минут k морковных тортов, причем все торты выпекаются одновременно по прошествии t минут с начала выпекания. Аркадию нужно получить хотя бы n тортов для выполнения задания, а сейчас у него нет ни одного, зато есть сколько угодно ингредиентов и одна печь. Кроме того, Аркадий может построить еще одну такую же печь для ускорения процесса, это займет d минут. Во время постройки новой печи выпекать торты может только старая печь, после конца постройки обе печи выпекают параллельно. Аркадий не может построить более одной новой печи.

Определите, целесообразно ли строительство второй печи, то есть уменьшит это минимальное время получения n тортов, или нет. Если время приготовления без второй печи равно времени приготовления тортов с ней, то строительство печи нецелесообразно.

Входные данные

В первой строке следует четыре целых числа n, t, k, d (1 ≤ n, t, k, d ≤ 1 000) — количество тортов, которые нужно испечь, время, за которое печь выпекает k тортов, количество тортов, выпекаемое за один раз, а также время, которое нужно для строительства второй печи.

Выходные данные

Если строительство второй печи целесообразно, выведите «YES». В противном случае, выведите «NO».

Примечание

В первом примере с помощью одной печи можно сделать 8 тортов за 12 минут. Если построить вторую печь за 5 минут, то по истечении 6-ти минут, первая печь испечёт 4 торта, а вторая испечёт еще 4 по истечении 11-ти минут. Поэтому строить вторую печь целесообразно.

Во втором примере не имеет значения, строить вторую печь или нет, так как в обоих случаях время приготовления 8-ми тортов равно 12-ти минутам. Поэтому строительство второй печи нецелесообразно.

В третьем примере первая печь успеет приготовить 11 тортов за 3 минуты, что больше необходимых 10-ти. Вторую печь строить нецелесообразно, так как её строительство занимает даже больше времени, чем приготовление нужного количества тортов с помощью одной печи.

B. Покупка футболок

реализация Структуры данных *1400

В магазин привезли партию новых футболок, состоящую из n штук. Каждая футболка характеризуется тремя параметрами pi, ai и bi, где pi — это цена i-й футболки, ai — цвет i-й футболки спереди, а bi — цвет i-й футболки со спины. Все pi — различны, а величины ai и bi — целые числа от 1 до 3.

Известно, что в магазин придут m покупателей. Каждый из них хочет купить ровно одну футболку. Про каждого из покупателей известен его любимый цвет, cj — любимый цвет j-го покупателя.

Покупатель согласен купить футболку, если хотя бы с одной стороны она его любимого цвета. При этом среди всех футболок, которые покупатель согласен купить, он выберет самую дешёвую. Если в магазине не осталось подходящих футболок, то покупатель не будет ничего покупать. Считайте, что все покупатели приходят по очереди, и обслуживание нового покупателя не начнется, пока не закончится обслуживание предыдущего.

Перед вами стоит задача для каждого покупателя определить цену футболки, которая будет им куплена.

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 200 000) — количество футболок в магазине.

В следующей строке следует последовательность целых чисел p1, p2, ..., pn (1 ≤ pi ≤ 1 000 000 000), где pi равно цене i-й футболки.

В следующей строке следует последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ 3), где ai равно цвету футболки i спереди.

В следующей строке следует последовательность целых чисел b1, b2, ..., bn (1 ≤ bi ≤ 3), где bi равно цвету футболки i со спины.

В следующей строке следует целое положительное число m (1 ≤ m ≤ 200 000) — количество покупателей.

В следующей строке следует последовательность c1, c2, ..., cm (1 ≤ cj ≤ 3), где cj равно любимому цвету покупателя j.

Покупатели будут приходить в магазин в том же порядке, что перечислены во входных данных. Обслуживание нового покупателя не начнется, пока не закончится обслуживание предыдущего.

Выходные данные

Выведите в первую строку m целых чисел, причём j-е число должно быть равно стоимости футболки, которую приобретёт покупатель j. Если покупатель j не сможет найти подходящей футболки, выведите -1.

C. Фонтаны

Бинарный поиск реализация Структуры данных *1800

Аркадий — заядлый игрок в Gardenscapes. Аркадий хочет построить два новых фонтана. Есть список из n доступных ему фонтанов, про каждый фонтан известна его красота и стоимость. В игре есть два вида денежных ресурсов: монеты и алмазы, поэтому стоимость каждого из фонтанов может быть выражена в монетах или алмазах. Монеты и алмазы нельзя обменивать друг на друга.

Помогите Аркадию выбрать два фонтана с максимальной суммарной красотой таких, что он может купить на имеющиеся у него ресурсы оба одновременно.

Входные данные

Первая строка содержит три целых числа n, c и d (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 000) — количество фонтанов, количество монет и количество алмазов, которые есть у Аркадия.

В следующих n строках следует описание фонтанов. В каждой строке сначала следует два целых числа bi и pi (1 ≤ bi, pi ≤ 100 000) — красота и стоимость фонтана номер i, а затем буква «C» или «D» — в чем измеряется стоимость фонтана номер i — в монетах или в алмазах, соответственно.

Выходные данные

Выведите максимальную суммарную красоту ровно двух фонтанов, которые Аркадий может построить. Если невозможно построить два фонтана, выведите 0.

Примечание

В первом примере Аркадию нужно построить второй фонтан с красотой 4, который стоит 3 монеты. Первый фонтан он построить не сможет, так как ему не хватит на это монет. Также, Аркадию нужно построить третий фонтан с красотой 5, который стоит 6 алмазов. Таким образом, суммарная красота построенных фонтанов равна 9.

Во втором примере всего два фонтана, но Аркадий не сможет построить их оба, так как для постройки первого фонтана нужно 5 монет, а у Аркадия есть всего 4 монеты.

B. Роботомания

графы Конструктив реализация *1400

Весь мир охватила роботомания и, чтобы не отставать от прогресса, великий берляндский программист Дравдэ решил создать собственного робота. Дравдэ долго и упорно трудился над роботом. Он научил его ходить кратчайшим путем из одной точки в другую, научил записывать все свои передвижения, но, как и во многих программах Дравдэ, нашелся баг — робот не всегда ходил кратчайшими путями. Благо, что собственные передвижения робот записывал правильно. Теперь Дравдэ хочет узнать, когда его робот неправильно работает. Эх, если бы Дравдэ помнил карту местности, на которой происходило тестирование робота, он бы легко сказал правильно прошел робот или нет. Но карта местности безвозвратно потерялась, и поэтому он поручает вам проверить: существует ли хотя бы одна такая карта, на которой путь записанный роботом является кратчайшим.

Карта представляет собой бесконечное клетчатое поле, где каждая клетка либо пустая, либо содержит препятствие. Также известно, что робот никогда не пытается врезаться в препятствие. По записи робота о его передвижении определите, существует ли хотя бы одна такая карта, что на ней можно выбрать стартовую клетку для робота (стартовая клетка должна быть пустой), при движении из которой запись корректна (робот ни во что не врезается, двигаясь только по пустым клеткам), и путь из стартовой точки в конечную является кратчайшим.

За один ход робот может передвинуться на любую соседнюю по стороне клетку, если она не является препятствием.

Входные данные

В первой строке входного файла содержится запись ходов робота. Запись ходов — это непустая строка, состоящая из прописных латинских букв L, R, U и D, обозначающих соответственно передвижение влево, вправо, вверх и вниз. Длина строки не превосходит 100.

Выходные данные

Выходной файл должен содержать в первой строке единственное слово OK (если существует описанная карта) или BUG (если не существует такой карты).

G. Ложные Новости (простая)

реализация Строки *800

Поскольку сегодня первое апреля, Хайди подозревает, что новости, о которых она сегодня читает, являются ложными. Она не хочет выглядеть глупо перед другими участниками.

Она знает, что новость является ложной, если в ней содержится строка «heidi» в качестве подпоследовательности.

Помогите Хайди определить, является ли данный фрагмент новости истинным, но, пожалуйста, будьте предельно осторожны...

Входные данные

В первой и единственной строке содержится непустая строка s длиной не более чем 1000, состоящая из строчных букв латинского алфавита (a-z).

Выходные данные

Выведите «YES» (без кавычек), если строка s содержит последовательность «heidi» в качестве подпоследовательности. В противном случае, выведите «NO» (без кавычек).

Примечание

Строка s содержит другую строку p как подпоследовательность, если возможно удалить некоторое (возможно нулевое) количество символов из s и получить p.

B. Минимальное число шагов

жадные алгоритмы Комбинаторика математика реализация *1400

Дана строка из букв «a» и «b». Мы хотим произвести над ней некоторые операции. На каждом шагу мы выбираем одну из подстрок «ab» в данной строке и заменяем ее на строку «bba». Если в строке нет подстрок «ab», то мы останавливаемся. Выведите минимальное число шагов, которое требуется нам сделать перед тем, как мы остановимся, по модулю 109 + 7.

Строка «ab» встречается как подстрока, если где-то есть буква «b» сразу после буквы «a».

Входные данные

Единственная строка содержит изначальную строку, состоящую только из букв «a» и «b», имеющую длину от 1 до 106.

Выходные данные

Выведите минимальное число шагов по модулю 109 + 7.

Примечание

Первый пример: «ab»  →  «bba».

Второй пример: «aab»  →  «abba»  →  «bbaba»  →  «bbbbaa».

A. Is it rated?

реализация сортировки *900

Is it rated?

Вот он. Главный вопрос спортивного программирования, Codeforces и всего такого. И именно вам предстоит дать на него ответ.

Прошел очередной раунд на Codeforces. Никакие два участника не набрали одинаковое число баллов. Для каждого участника сверху вниз по таблице известен его рейтинг до раунда, а также его рейтинг после раунда.

Известно, что если хотя бы у одного участника рейтинг изменился, то раунд точно был рейтинговым.

Кроме того, известно, что если раунд был рейтинговым, и некоторый участник с более низким рейтингом оказался в таблице результатов раунда выше участника с более высоким рейтингом, то точно изменился рейтинг хотя бы одного участника раунда.

В рамках данной задачи никаких других предположений о формулах подсчета рейтинга делать не нужно.

Определите, был ли раунд рейтинговым, нерейтинговым, или же невозможно определить это достоверно.

Входные данные

В первой строке содержится единственное целое число n (2 ≤ n ≤ 1000) — количество участников раунда.

Каждая из следующих n строк содержит два целых числа ai и bi (1 ≤ ai, bi ≤ 4126) — рейтинг участника, занявшего i-е место в таблице результатов, до и после раунда, соответственно. Участники перечислены в порядке сверху вниз по таблице результатов.

Выходные данные

Если раунд точно был рейтинговым, выведите «rated». Если раунд точно был нерейтинговым, выведите «unrated». Если нельзя достоверно сказать, был раунд рейтинговым или нет, выведите «maybe».

Примечание

В первом примере рейтинги участников на третьем и пятом местах изменились, следовательно, раунд был рейтинговым.

Во втором примере рейтинги участников не изменились, однако участник на втором месте имеет рейтинг ниже участника на четвертом месте. Значит, если бы раунд был рейтинговым, чей-то рейтинг точно бы изменился.

В третьем примере рейтинги участников также не изменились, однако все участники заняли места по невозрастанию рейтинга. Таким образом, нельзя достоверно сказать, были рейтинги пересчитаны или нет.

B. Охота на футболки

Перебор реализация *1300

Не так давно на платформе Codeforces прошел контест Codecraft-17. Лучшие 25 участников, а также дополнительно случайные 25 из попавших в 500 лучших участников, получают фирменную футболку Codeforces.

К сожалению, вам не удалось попасть в число 25 лучших участников, однако, заняв место p, вы смогли попасть в 500 лучших.

Сейчас идет отборочный раунд 8VC Venture Cup 2017. Было объявлено, что обладатели футболок Codecraft-17 будут выбраны следующим образом. Пусть s — количество баллов у первого места в отборочном раунде 8VC Venture Cup 2017. Тогда будет выполнен следующий псевдокод:


i := (s div 50) mod 475
repeat 25 times:
i := (i * 96 + 42) mod 475
print (26 + i)

Здесь «div» — оператор целочисленного деления, «mod» — оператор взятия остатка от деления.

В результате исполнения данного псевдокода будет выведено 25 целых чисел от 26 до 500. Это будут номера мест участников, получающих футболки Codecraft-17. Гарантируется, что выведенные 25 чисел будут попарно различны при любом значении s.

Вы лидируете в отборочном раунде 8VC Venture Cup 2017, имея в наличии x баллов. Вы полагаете, что если наберете хотя бы y баллов в текущем раунде, то точно займете первое место.

Чтобы изменить свой итоговый балл, вы можете сделать любое количество как успешных, так и неудачных попыток взлома. Успешный взлом приносит вам 100 баллов, неудачная попытка вычитает 50 баллов. Однако делать успешные взломы тяжело.

Вы хотите одновременно выиграть текущий раунд и обеспечить себе призовую футболку за Codecraft-17. Какое наименьшее число успешных взломов вам придется для этого сделать?

Входные данные

Единственная строка содержит три целых числа p, x и y (26 ≤ p ≤ 500; 1 ≤ y ≤ x ≤ 20000) — ваше место в Codecraft-17, текущее количество баллов у вас в отборочном раунде 8VC Venture Cup 2017, и наименьшее количество баллов, которое вы считаете достаточным для победы в текущем раунде.

Выходные данные

Выведите единственное целое число — минимальное количество успешных взломов, которое необходимо сделать, чтобы выиграть отборочный раунд 8VC Venture Cup 2017 и одновременно получить футболку Codecraft-17.

Гарантируется, что достижение этой цели возможно при любых входных данных.

Примечание

В первом примере вам не нужно делать никаких взломов, поскольку 10880 баллов уже приносят 239-му месту (то есть, вам) футболку Codecraft-17. В таком случае, в соответствии с приведенным псевдокодом, футболки получат участники, занявшие следующие места:


475 422 84 411 453 210 157 294 146 188 420 367 29 356 398 155 102 239 91 133 365 312 449 301 343

Во втором примере вам необходимо сделать два успешных взлома и одну неудачную попытку взлома, чтобы ваш результат стал равен 7408.

В третьем примере вам придется сделать целых 24 успешных взлома, чтобы ваше количество баллов стало равно 10400.

В четвертом примере достаточно сделать 6 неудачных попыток взлома (не делая при этом ни одного успешного взлома), чтобы ваш результат стал равен 6500, чего как раз достаточно для победы в текущем раунде и получения футболки.

A. Счастливый год

реализация *900

Помимо множества праздников в течение всего года жители Берляндии еще и считают некоторые годы счастливыми. Год называется счастливым, когда его запись содержит не более 1 ненулевой цифры. Так годы 100, 40000, 5 — счастливые, а 12, 3001 и 12345 — нет.

Вам задан текущий год в Берляндии. Найдите, сколько лет придется ждать жителям Берляндии до следующего счастливого года.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 109) — текущий год в Берляндии.

Выходные данные

Выведите количество лет от текущего года до следующего счастливого.

Примечание

В первом примере следующий счастливый год — 5. Во втором — 300. В третьем — 5000.

B. Средняя продолжительность сна

математика реализация Структуры данных *1300

Уже неделю Поликарп не может отдохнуть — его мучает бессонница. Как известно, неделя в Берляндии длится целых k дней!

С этой проблемой Поликарп обратился ко врачу. Врач спросил, сколько часов Поликарп спит в среднем в неделю. К счастью, Поликарп в течение n последних дней записывал в дневник количество часов сна в каждый из дней. Таким образом, у него есть последовательность a1, a2, ..., an, где ai — количество часов сна в i-й день.

Записей накопилось так много, что он не может сам подсчитать среднее значение. Поэтому Поликарп просит вас помочь ему с расчетами. При подсчете искомого среднего значения Поликарп планирует учесть в качестве недели каждые k подряд идущих дней. Таким образом, при в подсчетах будет учтена n - k + 1 неделя. Например, если k = 2, n = 3, а a = [3, 4, 7], то искомое значение будет равно .

Напишите программу, которая найдет среднее арифметическое суммарных продолжительностей сна Поликарпа за все недели.

Входные данные

В первой строке задано два целых положительных числа n и k (1 ≤ k ≤ n ≤ 2·105).

Во второй строке задано n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 105).

Выходные данные

Выведите единственное число — среднее арифметическое суммарной продолжительности сна Поликарпа за неделю.

Ответ считается правильным, если абсолютная или относительная погрешность не превосходит 10 - 6. В частности, это означает, что достаточно вывести вещественное число с 6 или более знаками после десятичной точки.

Примечание

В третьем примере всего n - k + 1 = 7 недель, поэтому ответ — сумма по всем неделям, деленная на 7.

D. Разделение массива

Бинарный поиск реализация Структуры данных *1900

У Васи есть массив a, состоящий из положительных чисел. Вася хочет разделить этот массив на две непустые непрерывные части (префикс и суффикс) так, чтобы сумма всех элементов в левой части была равна сумме элементов в правой части.

Такое разделение возможно не для каждого массива. Поэтому Вася перед тем, как разделить массив, переместит ровно один его элемент (т. е. удалит произвольный элемент массива и вставит его в массив на любую позицию).

Вставка элемента в ту же самую позицию, из которой он был удалён, тоже считается перемещением.

Может ли Вася, переместив нужный элемент в правильную позицию, разделить массив?

Входные данные

В первой строке задано единственное число n (1 ≤ n ≤ 100000) — размер массива.

Во второй строке задано n чисел a1, a2... an (1 ≤ ai ≤ 109) — элементы массива.

Выходные данные

Выведите YES, если Вася может разделить массив после перемещения одного элемента. Иначе выведите NO.

Примечание

В первом тесте из условия можно перенести второй элемент в конец массива.

Во втором тесте никакой перенос не позволит разделить массив.

В третьем тесте можно переместить на одну позицию влево четвёртый элемент.

A. Хочешь на свидание?

математика реализация сортировки *1500

Устав от жизни в Банкополисе, Леха решил переехать в тихий городок Вичкополис. По приезду он сразу же начал расширять сеть взломанных им компьютеров. За неделю Леха успел получить доступ к n компьютерам по всему городу. А так как в Вичкополисе только одна прямая улица, то и все компьютеры, взломанные Лехой, находятся на одной прямой.

Введем систему координат на единственной улице Вичкополиса. Пронумеруем все компьютеры, взломанные хакером, целыми числами от 1 до n. Тогда i-й компьютер, взломанный Лехой, находится в точке с координатой xi. При этом местоположения всех компьютеров попарно различны.

После трудной недели Лехе потребовался отдых. Поэтому он решил пригласить свою знакомую Нуру в ресторан. Однако девушка согласилась идти на свидание только с одним условием: Леха должен решить поставленную ей задачу.

Нура хочет, чтобы Леха посчитал сумму F(a) для всех a, где a — непустое подмножество множества взломанных Лехой компьютеров. Более формально, обозначим множество целых чисел от 1 до n включительно как A. Нура просит хакера найти значение . При этом F(a) вычисляется как максимум среди расстояний между всеми парами компьютеров, вошедших во множество a. Более формально, . Так как ответ может получиться достаточно большим, Нура просит найти значение интересующей ее суммы по модулю 109 + 7.

Однако Леха так устал, взламывая компьютеры, что уже не может решить эту задачку. Помогите хакеру попасть на свидание с Нурой.

Входные данные

В первой строке задано одно целое число n (1 ≤ n ≤ 3·105) — количество компьютеров, взломанных Лехой.

Во сторой строке задано n целых чисел x1, x2, ..., xn (1 ≤ xi ≤ 109) — координаты взломанных хакером компьютеров. Гарантируется, что все числа xi попарно различны.

Выходные данные

Выведите одно число — значение суммы, которую просит найти Нура, по модулю 109 + 7.

Примечание

Рассмотрим первый тест. У нас есть всего три подмножества , и . В первых двух к итоговой сумме прибавится 0, а в третьем 7 - 4 = 3. Итого ответ 0 + 0 + 3 = 3.

Во втором тесте у нас есть семь подмножеств, из них ответ увеличат следующие: , , , . Итого ответ (4 - 3) + (4 - 1) + (3 - 1) + (4 - 1) = 9.

A. Плагин

реализация *1400

Поликарп очень часто думает над смыслом бытия. Он делает это постоянно, даже когда набирает текст в редакторе. Каждый раз когда он задумывается, он частично перестает себя контролировать и многократно нажимает клавиши, которые нужно было нажать лишь единожды. Например, вместо фразы «how are you» он может набрать «hhoow aaaare yyoouu».

Поликарп решил автоматизировать процесс исправления подобных ошибок. Он решил написать плагин к текстовому редактору, который будет удалять пары одинаковых идущих подряд букв (если такие есть в тексте). Конечно, это не совсем то, что надо Поликарпу, но ведь надо же с чего-то начинать!

Помогите Поликарпу и напишите основной модуль плагина. Ваша программа, должна удалять из строки все пары одинаковых букв, которые идут подряд. Если после удаления возникают новые пары, то программа должна удалять и их. Формально, ее работа должна быть эквивалентна следующей: пока в строке есть пара подряд идущих одинаковых букв, удалить эту пару. Отметим, что удалять «дубли» можно в произвольном порядке, так как любой порядок удаления приводит к одному и тому же результату.

Входные данные

Входные данные состоят из единственной строки, которую необходимо обработать. Длина строки — от 1 до 2·105 символов включительно. Строка содержит только строчные буквы латинского алфавита.

Выходные данные

Выведите заданную строку после окончания ее обработки. Гарантируется, что результат будет содержать хотя бы один символ.

B. Форматирование последовательности

реализация Строки *1700

Поликарп очень аккуратен. Даже числовые последовательности он набирает аккуратно, не то что его одноклассники. Если он видит последовательность, в которой нет пробела после запятой, стоят два пробела подряд или присутствует еще какая-либо неаккуратность, он тут же начинает ее исправлять. Например, запись «1,2 ,3,...,   10» он исправит на «1, 2, 3, ..., 10».

В этой задаче задана строка s, которая составлена последовательной записью частей, каждая из которых может быть:

  • положительным целым числом произвольной длины (лидирующие нули недопустимы),
  • символом «запятая» («,»),
  • символом «пробел» (« »),
  • многоточием («...» — т.е. тремя точками, записанными подряд).

Поликарп хочет добавлением и удалением пробелов в строке s добиться того, чтобы:

  • после каждой запятой шел ровно один пробел (если запятая является последним символом строки, то это правило к ней не применимо),
  • перед каждым многоточием был ровно один пробел (если многоточие начинает строку, то это правило к нему не применимо),
  • если два подряд идущих числа разделялись исключительно пробелами (одним или более), то следует оставить ровно один из них,
  • других пробелов быть не должно.

Автоматизируйте труд Поликарпа — напишите программу, которая будет обрабатывать заданную строку s.

Входные данные

Входные данные содержат единственную строку s. Ее длина — от 1 до 255 символов. Строка s не начинается и не заканчивается пробелом. Ее содержимое соответствует описанию, данному выше.

Выходные данные

Выведите строку s после обработки. Вывод вашей программы должен посимвольно совпадать с ожидаемым ответом. Вывод строки допустимо заканчивать как с заключительным переводом строки, так и без него.

E. По парам

графы Деревья дп поиск в глубину и подобное реализация снм *2700

В классе у Поликарпа учится n человек (включая его самого). Недавно все ученики класса писали сочинение «Мой лучший друг». Сочинение каждого ученика было посвящено одному из учеников класса — лучшему другу. Заметим, что вовсе не обязательно у ученика b лучшим другом является ученик a, если у a лучший друг — b.

А сейчас учительница ведет весь класс в музей истории спортивного программирования. Учеников ждут захватывающие истории о легендарных героях: tourist, Petr, tomek, SnapDragon — вот о ком пойдет речь!

Учительница решила разбить учеников на пары так, чтобы каждая пара состояла из ученика и его лучшего друга. Возможно, ей не удастся разбить всех учеников на пары, не беда — она хочет выделить наибольшее количество таких пар. Если существует более одного варианта сделать это, она хочет выделить пары так, чтобы пар мальчик-девочка было как можно больше. Конечно, каждый ученик должен входить не более чем в одну пару.

Входные данные

Первая строка содержит целое число n (2 ≤ n ≤ 105), n — количество учеников в классе. Далее в n строках содержится информация об учениках, по одному в строке. Каждая строка содержит два целых числа fi, si (1 ≤ fi ≤ n, fi ≠ i, 1 ≤ si ≤ 2), где fi обозначает номер лучшего друга i-го ученика, а si обозначает пол i-го ученика (если мальчик, то si = 1, а если девочка, то si = 2).

Выходные данные

В первую строку выведите два числа t, e, где t — максимальное количество образованных пар, а e — максимальное количество среди них пар вида мальчик-девочка. Далее выведите t строк, каждая из строк должна содержать пару ai, bi (1 ≤ ai, bi ≤ n) — номера учеников в i-ой паре. Пары выводите в любом порядке. Числа в парах выводите в любом порядке. Если существует несколько решений, выведите любое.

Примечание

Рисунок ниже соответствует первому примеру. На нем ромбы обозначают мальчиков, а квадраты — девочек. Стрелки ведут от ученика к его лучшему другу, жирные (не пунктирные) обозначают пары из ответа.

A. На отлично!

математика реализация *900

Нура — ученица одной из небезызвестных школ. Для нее этот год последний в школе — в следующем году Нура уже будет учиться в университете. Однако, чтобы поступить в самый престижный университет, она должна закончить школу «на отлично».

В школе, где учится Нура, учителя ставят ученикам в электронный журнал отметки, выражающиеся целыми числами от 1 до k. Наихудшая отметка — 1, наилучшая — k. Отметка, идущая в аттестат, вычисляется как среднее арифметическое всех оценок, округленное к ближайшему целому. В случае, если существует несколько вариантов, округление производится в большую сторону. Например, 7.3 округляется до 7, а 7.5 и 7.8784 — к 8.

Для примера, если отметки Нуры [8, 9], то отметка в аттестат получается равной 9, поскольку их среднее арифметическое 8.5 округляется до 9, но по отметкам [8, 8, 9] отметка в аттестате будет равна 8.

Чтобы закончить школу «на отлично», отметка, идущая в аттестат, должна быть равна k.

За год Нура получила n отметок. Однако она не уверена, что этих отметок хватит, чтобы получить в аттестат отметку k. За помощью Нура решила обратиться к интернет-сообществу. Там на ее просьбу о помощи сразу же откликнулся хакер Алексей, или попросту Леха. Ради Нуры он готов взломать электронный журнал школы и поставить Нуре дополнительно любые отметки от 1 до k. В то же время Леха не хотел бы, чтобы его проникновение в электронный журнал заметили, поэтому он решил поставить как можно меньше дополнительных отметок. Помогите Лехе посчитать минимальное количество отметок, которые он должен поставить, чтобы итоговая отметка Нуры стала равна k.

Входные данные

В первой строке заданы два целых числа n и k (1 ≤ n ≤ 100, 1 ≤ k ≤ 100) — количество отметок, уже полученных Нурой, а также величина наилучшей отметки.

Во второй строке заданы n целых чисел a1, a2, ..., an (1 ≤ ai ≤ k) — отметки, полученные Нурой до вмешательства Лехи.

Выходные данные

Выведите одно число — минимальное количество отметок, которые должен поставить Леха, чтобы итоговая отметка Нуры стала равна k.

Примечание

Рассмотрим первый пример.

Максимальная отметка — 10, Нура получила две отметки — 8 и 9, поэтому отметкой в аттестат будет 9. Чтобы исправить это, Леха может добавить отметки [10, 10, 10, 10] (итого 4 отметки) в журнал, получив тем самым средний балл, равный . Следовательно, новая отметка в аттестате — 10. Меньшим количеством добавлений обойтись нельзя.

Во втором примере Леха может дописать [5, 5, 5] в журнал, тем самым сделав средний балл равным 4.5, чего достаточно, чтобы получить 5 в аттестат.

A. Владик и вежливость

Перебор реализация *800

Владик и Валера на очередном соревновании выиграли a и b конфет соответственно. Владик предложил Валере 1 свою конфету, после этого Валера, чтобы никто не подумал, что он менее щедрый, дал Владику 2 свои конфеты, Владик по той же причине следующий раз дал уже 3 свои конфеты...

Более формально, ребята по очереди давали друг другу на одну конфету больше, чем получали на предыдущем шаге.

Так продолжалось до момента, когда один из них не смог дать нужное количество своих конфет. Конфеты, которые ребята получили друг от друга, они не считают своими. Вам нужно узнать, кто первый не сможет дать нужное количество конфет.

Входные данные

Единственная строка входных данных содержит два целых числа a, b (1 ≤ a, b ≤ 109) — количество конфет Владика и Валеры соответсвенно.

Выходные данные

Единственная строка выходного файла должна содержать «Vladik» в случае, если Владик первый не сможет дать нужное количество конфет, и «Valera» иначе.

Примечание

Иллюстрация первого примера:

Иллюстрация второго примера:

B. Владик и сложная книга

реализация сортировки *1200

Владик начал читать сложно написанную книгу по алгоритмам, содержащую n страниц. Для того, чтобы улучшить понимание написанного, его друзья посоветовали ему читать страницы в некотором порядке, заданном перестановкой P = [p1, p2, ..., pn], где pi обозначает номер страницы, которую следует читать i-й по очереди.

Иногда мама Владика сортировала по возрастанию некоторый отрезок перестановки P с позиции l по r включительно, так как очень любит порядок. Для каждого из таких случаев Владик знает x — какую по счету страницу из перестановки он сейчас должен прочитать. Ему интересно, поменялась ли страница, которую он будет читать после сортировки, другими словами, поменялось ли px. После каждой такой сортировки он возвращал перестановку в изначальное состояние, поэтому можно считать, что каждая такая сортировка независима от других.

Входные данные

В первой строке находится два целых числа n, m (1 ≤ n, m ≤ 104) — длина перестановки и количество случаев.

В следующей строке входных данных задано n целых чисел p1, p2, ..., pn (1 ≤ pi ≤ n) — элементы перестановки P. Напомним, что все элементы перестановки различны.

В каждой из m следующих строк задано по три целых числа li, ri, xi (1 ≤ li ≤ xi ≤ ri ≤ n) — левая и правая границы сортируемого подотрезка в i-м случае и позиция, которая интересует Владика, после сортировки.

Выходные данные

Для каждого случая в отдельной строке выведите «Yes», если страница, которую будет читать Владик, останется такой же и «No» иначе.

Примечание

Объяснение первого примера:

  1. [1, 2, 3, 4, 5] — перестановка после сортировки, так как 3-й элемент не изменился, ответ «Yes».
  2. [3, 4, 5, 2, 1] — перестановка после сортировки, так как 1-й элемент изменился, ответ «No».
  3. [5, 2, 3, 4, 1] — перестановка после сортировки, так как 3-й элемент не изменился, ответ «Yes».
  4. [5, 4, 3, 2, 1] — перестановка после сортировки, так как 4-й элемент не изменился, ответ «Yes».
  5. [5, 1, 2, 3, 4] — перестановка после сортировки, так как 3-й элемент изменился, ответ «No».

C. Владик и запоминающаяся поездка

дп реализация *1900

Владик очень часто ездит на поездах. Некоторые из этих поездок запоминаются ему особо хорошо, одна из таких поездок:

Владик находится на начальной станции поезда, и сейчас в него хотят зайти n человек (включая Владика). Они уже выстроились в некотором порядке, и для каждого из них известен код города ai, в который они направляются.

Начальник поезда выбирает некоторое количество непересекающихся отрезков исходной последовательности людей (отрезки не обязаны покрывать всю последовательность). Люди, находящиеся в одном и том же отрезке, будут находиться в одном и том же вагоне поезда. Отрезки выбираются так, что если в город x едет как минимум один человек, то все люди, которые направляются в город x должны будут находиться в одном вагоне. Это обозначает, что они не имеют права принадлежать разным отрезкам. Следует заметить, что все люди, которые едут в город x, либо едут в него и находятся в одном вагоне, либо вовсе не едут никуда.

Комфортность поездки в поезде с людьми на отрезке с l по r равна XORразличных кодов городов у людей на отрезке с l по r. Операция XOR также известна как исключающее побитовое ИЛИ.

Общая комфортность выбранных отрезков вычисляется как сумма комфортности каждого отдельного отрезка.

Помогите Владику узнать максимальную достижимую общую комфортность.

Входные данные

Первая строка входных данных содержит одно целое число n (1 ≤ n ≤ 5000) — количество людей.

Следующая строка содержит n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 5000), где ai — код города, в который направляется i-й человек.

Выходные данные

Единственная строка выходного файла должна содержать одно целое число — максимальная общая комфортность.

Примечание

В первом примере выгодное разделение следующие: [4, 4] [2, 5, 2] [3], ответ считается следующим образом: 4 + (2 xor 5) + 3 = 4 + 7 + 3 = 14

Во втором примере выгодное разделение следующие: 5 1 [3] 1 5 [2, 4, 2] 5, ответ считается следующим образом: 3 + (2 xor 4) = 3 + 6 = 9.

A. Сахир и перекресток

реализация *1200

Сахир гулял по улице и набрел на пересечение двух дорог. Каждая дорога состоит из двух частей, каждая часть имеет 3 полосы, идущие от перекрестка и 3 полосы, идущие к перекрестку, по одной для каждого направления выезда. Таким образом, всего имеется 4 части дорог. Каждая часть имеет 4 светофора: по одному на каждую идущую к перекрестку полосу, (l — для полосы, поворачивающей налево, s — для полосы, едущей прямо, r — для полосы, поворачивающей направо), а также светофор p для пешеходов, переходящих эту дорогу.

На перекрестке случится происшествие, если машина собьет пешехода. Такое может случиться, если светофор для пешеходного перехода и светофор для некоторой полосы, которая пересекает этот переход, одновременно горят зеленым.

Сахир наблюдает за конфигурацией светофоров. Помогите ему определить, возможно ли происшествие при текущей конфигурации светофоров.

Входные данные

Входные данные содержат четыре строки, каждая из которых описывает одну из частей дорог, в порядке против часовой стрелки.

Каждая строка содержит четыре целых числа l, s, r, p — для полосы, поворачивающий налево, едущей прямо, поворачивающей направо, и для пешеходного перехода, соответственно. Возможные значения — 0 для красного сигнала и 1 для зеленого.

Выходные данные

На единственной строке выведите «YES», если происшествие возможно, и «NO» иначе.

Примечание

В первом примере происшествия возможны, так как машины из части 1 могут сбить пешеходов частей 1 и 4. Кроме того, машины частей 2 и 3 могут сбить пешеходов части 4.

Во втором примере ни одна из машин не может пересечь переход части 4, только на котором горит зеленый свет. Поэтому происшествия невозможны.

D. Сахир и детский сад

графы Деревья поиск в глубину и подобное реализация *2700

Сахир работает в детском саду. Всего в саду n детей и m различных игрушек. Чтобы поиграть с игрушками, дети должны следовать определенному протоколу:

  • У каждого ребенка есть набор любимых игрушек. Он запрашивает эти игрушки по одной в различные моменты времени. Ребенок начинает играть, только когда у него окажутся все игрушки из любимого набора.
  • Если ребенок начал играть, то рано или поздно он отдаст все игрушки обратно. Никто не будет держать игрушки вечно.
  • Дети запрашивают игрушки в различные моменты времени, никакие два ребенка не запрашивают игрушки одновременно.
  • Если ребенку дали запрашиваемую игрушку, то он не отдаст ее, пока не закончит играть со своим любимым набором.
  • Если ребенку не дали запрашиваемую игрушку, то он будет ждать, пока ее ему дадут. Он не может запросить другую игрушку, пока ждет. То есть, каждый ребенок в каждый момент времени ждет не более одной игрушки.
  • Если два ребенка ждут одну и ту же игрушку, то сначала ее получит тот, кто запросил ее раньше.

Дети не любят играть друг с другом, поэтому они никогда не делятся игрушками. Когда ребенок запрашивает игрушку, то решение дать ему ее или нет зависит от того, свободна игрушка, или нет. Если игрушка свободна, Сахир даст ее ребенку. Иначе ребенок будет ждать ее и не сможет запрашивать другие игрушки, пока ждет.

Дети умные и замечают, если случилось так, что им придется ждать запрошенных игрушек бесконечно долго. В таких случаях они начинают плакать. Другими словами, группа плачущих детей это такая группа детей, в которой каждый ребенок ждет игрушку, которая находится у кого-то другого из этой группы.

У вас есть сценарий, в котором все дети запрашивают все игрушки из их любимых наборов, кроме одного ребенка x, который запросит еще одну игрушку. Сценарий таков, что после выполнения запросов из сценария некоторые дети начнут играть, а некоторые будут ждать последнюю игрушку, но никто не будет плакать. Если ребенок x будет ждать какую-то игрушку, то он сделает свой оставшийся запрос после ее получения. Иначе, он сразу же запросит ее. Когда ребенок x это сделает, сколько детей начнут плакать?

Вам дан сценарий и q независимых запросов. Каждый запрос будет иметь форму x y, что означает, что оставшийся запрос ребенка x — это игрушка y. Ваша задача — помочь Сахиру определить размер максимальной плачущей группы детей после того, как ребенок x сделает свой последний запрос.

Входные данные

Первая строка содержит четыре целых числа n, m, k, q (1 ≤ n, m, k, q ≤ 105) — количество детей, игрушек, запросов детей в сценарии и вариантов последнего запроса.

Каждая из следующих k строк содержит по два целых числа a, b (1 ≤ a ≤ n, 1 ≤ b ≤ m), означающих, что в сценарии ребенок a запрашивает игрушку b. Запросы даны в порядке их появления.

Каждая из следующих q строк содержит по два целых числа x и y (1 ≤ x ≤ n, 1 ≤ y ≤ m) — варианты последнего запроса (ребенок x запросит игрушку y как только сможет).

Гарантируется, что все запросы в сценарии удовлетворяют протоколу, и никто не плачет после выполнения запросов из сценария. Все запросы в сценарии различны, и никакой вариант последнего запроса не совпадает с запросами в сценарии.

Выходные данные

Для каждого запроса выведите на отдельной строке число детей, которые начнут плакать после того, как ребенок x сделает свой последний запрос (игрушку y). Заметьте, что все варианты последнего запроса независимы.

Примечание

В первом примере ребенок 1 ждет игрушку 2, которая находится у ребенка 2, а ребенок 2 ждет игрушку 3, которая находится у ребенка 3. Когда ребенок 3 сделает свой последний запрос (он может сделать это сразу), то игрушка, которую он запросит, будет у ребенка 1. Каждый из трех детей будет ждать игрушку, которая находится у другого ребенка, и никто не будет играть, поэтому все трое начнут плакать.

Во втором примере после исполнения сценария у ребенка номер i будет находиться игрушка i для 1 ≤ i ≤ 4. Дети 1 и 3 уже собрали свой любимый набор. После того, как они закончат играть, игрушка 3 освободится, а игрушку 1 отдадут ребенку 2, и он соберет любимый набор. После того, как он закончит играть, игрушки 1 и 2 освободятся, и ребенок 5 возьмет игрушку 1. Итак:

  • В первом варианте ребенок 5 возьмет игрушку 3, и когда он закончит играть, сможет играть ребенок 4.
  • Во втором варианте ребенок 5 запросит игрушку 4, которая находится у ребенка 4. В то же время ребенок 4 ждет игрушку 1, которая сейчас находится у ребенка 5. Никто из них не сможет начать играть, и они оба заплачут.

A. Соревнование

реализация *1100

Паша участвует в соревновании по программированию на одном небезызвестном сайте. На этот раз он настроен на победу и сделает всё возможное, чтобы достичь её!

На этом соревновании есть n задач, задачу с номером i Паша решает гарантированно верно за ai единиц времени. В один момент времени он может думать только над одной задачей из списка. Решение по задаче на сайт он отправляет мгновенно. Паша может отправлять сколько угодно решённых им задач в один момент времени.

Но сайт, на котором проходит соревнование, не выдерживает очень большое количество участников, поэтому он работает далеко не всегда. Паше поступила информация о том, что сайт будет работать m промежутков времени, j-й промежуток описывается своими границами времени lj и rj. Отправить задачу Паша может только в те моменты времени, когда сайт работает. Иными словами, Паша может отправить решение в момент времени T в том случае (и только в том случае), если существует такой промежуток x, что lx ≤ T ≤ rx.

Так как Паша очень хочет победить, он захотел узнать свой наилучший результат. Мы должны помочь ему, сказав, в какой минимальный момент времени он сможет сдать все задачи, если будет действовать оптимально, или же сказать, что вне зависимости от выбора стратегии он не успеет этого сделать.

Входные данные

В первой строке входных данных содержится целое положительное число n (1 ≤ n ≤ 1000) — количество задач в соревновании. Во второй строке задано n целых положительных чисел ai (1 ≤ ai ≤ 105) — время, которое Паша тратит на решение задачи с номером i.

В третьей строке содержится целое неотрицательное число m (0 ≤ m ≤ 1000) — количество отрезков времени, когда сайт работает. Следующие m строк описывают сами отрезки времени. j-я из них содержит два целых числа lj и rj (1 ≤ lj < rj ≤ 105) — границы j-го отрезка.

Гарантируется, что отрезки не пересекаются и заданы в порядке возрастания времён, то есть для любого j > 1 выполняется условие lj > rj - 1.

Выходные данные

Если Паша успевает решить и отправить все задачи до конца соревнования, то выведите минимальное время, за которое он сможет это сделать.

Если же Паша не успеет решить и отправить все задачи за отведённое время, выведите «-1» (без кавычек).

Примечание

В первом тесте из условия Паша может сделать так: он сначала решает вторую задачу за 4 единицы времени и сразу же отправляет её, поскольку в этот момент времени сайт работает. После он решает первую задачу ещё за 3 единицы времени и отправляет её в момент времени 7, поскольку тогда начинается второй отрезок времени, когда сайт работает.

Во втором тесте Паша придумывает задачу позже, чем заканчивается последний отрезок времени, когда он мог её отправить.

В третьем тесте Паша успевает послать решение в самом конце промежутка.

A. Утраченное настроение прошлого

жадные алгоритмы Конструктив реализация сортировки *900

Несколько лет назад Хитаги встретила гигантского краба, которых украл весь ее вес. С тех пор она избегает контакта с кем-либо, так как боится, что ее секрет будет замечен.

Чтобы снова получить свой вес, необходима особая последовательность целых чисел. Эта последовательность была давно разрушена, однако, с помощью Каики, возможно, получится восстановить ее.

Необходимая последовательность a имеет длину n. Утерянные элементы в ней сейчас заменены нулями. У Каики есть еще одна последовательность b, длина которой k равна числу утерянных элементов в a (т.е. числу нулей). Хитаги должна заменить каждый ноль в a одним элементом из b так, что каждый элемент из b будет использован ровно один раз. Хитаги, однако, знает, что, кроме 0, ни одно число не встречается суммарно в a и b более одного раза.

Если получившаяся последовательность не является возрастающей, то она позволит вернуть Хитаги вес. Вам предстоит определить, возможно ли такое. Другими словами, вы должны определить, возможно ли заменить каждый ноль в последовательности a числом из последовательности b так, чтобы каждое число из b было использовано ровно единожды, и получившаяся последовательность не являлась возрастающей.

Входные данные

Первая строка содержит два положительных целых числа n (2 ≤ n ≤ 100) и k (1 ≤ k ≤ n) — длины последовательностей a и b, соответственно.

Вторая строка содержит n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 200) — последовательность, имеющаяся у Хитаги и содержащая ровно k нулей.

Третья строка содержит k целых чисел b1, b2, ..., bk (1 ≤ bi ≤ 200) — элементы, которыми нужно заменить нули в последовательности Хитаги.

Гарантируется, что, кроме 0, ни одно целое число не встречается в a и b суммарно более чем один раз.

Выходные данные

Выведите «Yes», если возможно заменить нули в a элементами из b и сделать последовательность не возрастающей, и «No» иначе.

Примечание

В первом примере:

  • Последовательность a имеет вид 11, 0, 0, 14.
  • Два элемента последовательности утеряны, возможными кандидатами в b являются 5 и 4.
  • Возможно получить две последовательности: 11, 5, 4, 14 и 11, 4, 5, 14, они обе подходят. Поэтому ответ «Yes».

Во втором примере единственная возможная последовательность — 2, 3, 5, 8, 9, 10, которая является возрастающей, следовательно, не подходит.

A. Карен и игра

жадные алгоритмы Перебор реализация *1700

На пути к школе Карен зациклилась на одной игре в телефоне!

Игра описывается следующими правилами. На каждом уровне есть таблица с n строками и m столбцами. Каждая ячейка содержит изначально число 0.

Ход состоит в выборе одной строки или одного столбца и прибавлении 1 ко всем ячейкам этого столбца или строки.

Чтобы пройти уровень, нужно, чтобы после всех ходов число в j-й ячейке i-го столбца равнялось gi, j.

Карен застряла на одном из уровней, и хочет пройти его за минимальное число ходов. Помогите ей!

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 100) — количество строк и количество столбцов в таблице, соответственно.

Следующие n строк содержат по m целых чисел каждая. Число j в i-й из этих строк равняется gi, j (0 ≤ gi, j ≤ 500).

Выходные данные

Если уровень нельзя пройти, выведите -1.

Иначе выведите на первой строке одно число k — минимальное число ходов, необходимое для прохождения уровня.

Каждая из следующих k строк должна содержать описание одного хода в одном из следующих форматов:

  • row x, (1 ≤ x ≤ n) — ход «выбрать строку x».
  • col x, (1 ≤ x ≤ m) — ход «выбрать столбец x».

Если есть несколько оптимальных решений, выведите любое.

Примечание

В первом примере таблица имеет 3 строки и 5 столбцов. Карен может выполнить следующие 4 хода, чтобы пройти уровень:

Во втором примере в таблице 3 строки и 3 столбца. Ясно, что невозможно пройти уровень, так как любой ход создаст три 1 в таблице, но необходимо получить только одну 1 по центру.

В третьем тесте у Карен таблица с 3 строками и 3 столбцами. Она может выполнить следующие 3 хода, чтобы пройти уровень:

Это не единственное решение, например, другое — выполнить ходы col 1, col 2, col 3.

E. Карен и район

Бинарный поиск Конструктив реализация *2900

Прошло много лет после событий предыдущих задач, и Карен уже закончила учиться и собирается переехать в новый район.

Район состоит из n домов, расположенных на прямой, пронумерованных от 1 до n слева направо, с равными расстояниями между ними.

Каждый в этом районе любит тишину и покой. Поэтому когда новый житель переезжает сюда, он выбирает такой дом, что минимальное расстояние до любого из занятых домов является максимально возможным. Если домов с максимально возможным минимальным расстоянием несколько, житель выбирает самый левый из них.

Обратите внимание, что первый житель всегда выбирает дом номер 1.

Карен будет k-м по счету жителем этого района. Если все, включая ее, следуют вышеописанному правилу, в какой дом переедет она?

Входные данные

Единственная строка сожержит два целых числа n и k (1 ≤ k ≤ n ≤ 1018), описывающие число домов в районе и то, что Карен является k-м по счету жителем, переезжающим в район, сооветственно.

Выходные данные

Выведите одно число: номер дома, который выберет Карен.

Примечание

В первом примере в районе 6 домов, и Карен — четвертый по счету житель.

  1. Первый житель выберет дом 1.
  2. Второй житель выберет дом 6.
  3. Третий житель выберет дом 3.
  4. Четвертый житель выберет дом 2.

Во втором примере в районе 39 домов, Карен — третий по счету житель.

  1. Первый житель выберет дом 1.
  2. Второй житель выберет дом 39.
  3. Третий житель выберет дом 20.

A. Карен и утро

Перебор реализация *1000

Карен готовится к новому школьному дню!

Сейчас время чч:мм по 24-часовому формату. Как вы знаете, Карен любит палиндромы, поэтому ей кажется, что если проснуться в момент времени, являющийся палиндромом, то день будет удачный.

Сколько минимум минут ей нужно еще поспать, чтобы время было палиндромом, когда она проснется?

Напомним, что палиндром это строка, которая читается одинаково слева направо и справа налево. Например, 05:39 — это не палиндром, так как 05:39 справа налево — 93:50. С другой стороны, 05:50 — палиндром, потому что 05:50 справа налево — 05:50.

Входные данные

Единственная строка содержит время в формате чч:мм (00 ≤  мм  ≤ 23, 00 ≤  мм  ≤ 59).

Выходные данные

Выведите единственное число — минимальное число минут Карен должна поспать, чтобы проснуться в момент времени, являющийся палиндромом.

Примечание

В первом примере Карен должна поспать минимум 11 минут. Тогда она проснется в 05:50, что является палиндромом.

Во втором примере Карен может проснуться прямо сейчас, так как текущее время 13:31 является палиндромом.

В третьем примере Карен должна поспать минимум 1 минуту. Она может проснуться в 00:00, когда время является палиндромом.

B. Карен и кофе

Бинарный поиск реализация Структуры данных *1400

Для того, чтобы оставаться бодрой и внимательной во время занятий, Карен нужен кофе!

Карен — поклонница кофе — хочет узнать оптимальную температуру заваривания кофе. Для этого она потратила некоторое время на чтение нескольких книг рецептов, в том числе общепризнанную книгу «Искусство ковфефе».

Карен знает n рецептов кофе. i-й из них рекомендует заваривать кофе при температуре от li до ri градусов включительно.

Карен считает, что температура является приемлемой, если хотя бы k рецептов рекомендуют ее.

Карен очень непостоянная, поэтому у нее есть q вопросов. В каждом вопросе она хочет заварить кофе с целочисленной температурой от a до b градусов включительно, и хочет узнать, сколько приемлемых целочисленных температур находятся в этом промежутке.

Входные данные

В первой строке содержится три целых числа n, k (1 ≤ k ≤ n ≤ 200000) и q (1 ≤ q ≤ 200000) — число рецептов, минимальное количество рецептов, необходимое для признания температуры приемлемой, и количество вопросов Карен, соответственно.

Следующие n строк описывают рецепты. А именно, i-я их этих строк содержит два целых числа li и ri (1 ≤ li ≤ ri ≤ 200000), означающих, что i-й рецепт рекомендует заваривать кофе с температурой между li и ri градусами включительно.

Следующие q строк описывают вопросы Карен. Каждая их этих строк содержит два целых числа a и b (1 ≤ a ≤ b ≤ 200000), означающих, что она хочет узнать число приемлемых целочисленных температур между a и b градусами включительно.

Выходные данные

Для каждого вопроса выведите одно целое число — число приемлемых целочисленных температур между a и b градусами включительно.

Примечание

В первом примере Карен знает 3 рецепта.

  1. Первый рекомендует заваривать кофе при температуре между 91 и 94 градусами включительно.
  2. Второй рекомендует заваривать кофе при температуре между 92 и 97 градусами включительно.
  3. Третий рекомендует заваривать кофе при температуре между 97 и 99 градусами включительно.

Температура является приемлемой, если хотя бы 2 рецепта ее рекомендуют.

У Карен 4 вопроса.

В первом вопросе она хочет узнать число приемлемых целочисленных температур между 92 и 94 градусами включительно. Таких 3: 92, 93 и 94 градуса являются приемлемыми.

Во втором вопросе она хочет узнать число приемлемых целочисленных температур между 93 и 97 градусами включительно. Таких 3: 93, 94 и 97 градуса являются приемлемыми.

В третьем вопросе она хочет узнать число приемлемых целочисленных температур между и 95 и 96 градусами включительно. Таких нет.

В последнем вопросе она хочет узнать число приемлемых целочисленных температур между 90 and 100 градусами включительно. Таких 4: 92, 93, 94 и 97 градуса являются приемлемыми.

Во втором примере Карен знает 2 рецепта.

  1. Первых их них, «wikiHow to make Cold Brew Coffee», рекомендует заваривать кофе при температуре ровно 1 градус.
  2. Второй, «Разве является кофе то, что не заварено при температуре не меньше 36.3306 температур Солнца?», рекомендует заваривать кофе при ровно 200000 градусов.

Температура является приемлемой, если хотя бы 1 рецепт ее рекомендует.

В первом и единственном вопросе Карен хочет узнать, сколько приемлемых температур действительно являются осмысленными. Таких нет.

A. Поиск сокровищ

математика реализация теория чисел *1200

Капитан Билл Колибри и его команда получили интересное предложение об испытании. Незнакомец вручил им карту, зелье перемещения и сообщил, что, только используя данный зелье, они смогут добраться до сокровища.

На бутылке с зельем написаны два значения x и y. Они определяют четыре шага, которые можно совершить с данным зельем:

Карта указывает, что позиция Капитана Билла Колибри — (x1, y1), а позиция сокровища — (x2, y2).

Помогите Капитану Биллу Колибри с выбором, принимать предложение или нет. Если Капитан может добраться до сокровища с этим зельем, то выведите "YES", иначе — "NO" (без кавычек).

Зелье можно использовать бесконечное количество раз.

Входные данные

В первой строке записаны четыре целых числа x1, y1, x2, y2 ( - 105 ≤ x1, y1, x2, y2 ≤ 105) — позиции Капитана Билла Колибри и сокровища соответственно.

Во второй строке записаны два целых числа x, y (1 ≤ x, y ≤ 105) — значения на бутылке с зельем.

Выходные данные

Выведите "YES", если Капитан может добраться до сокровища, используя только данное зелье. Иначе выведите "NO" (без кавычек).

Примечание

В первом примере можно применить такие шаги:

  1. — первый тип шага
  2. — третий тип шага

B. Макес и произведение

Комбинаторика математика реализация сортировки *1500

После возвращения из армии Макес получил в подарок массив a, состоящий из n целых положительных чисел. Так как он очень давно не решал задачи, его заинтересовал следующий вопрос: сколько существует таких упорядоченных троек (i,  j,  k), что i < j < k, а ai·aj·ak — минимально. Помогите ему в этом!

Входные данные

В первой строке входных данных задано целое положительное число n (3 ≤ n ≤ 105) — количество элементов в массиве a. Во второй строке задано n положительных целых чисел ai (1 ≤ ai ≤ 109) — элементы массива.

Выходные данные

Выведите единственное число — количество упорядоченных троек (i,  j,  k), что i,  j и k — попарно различны, а ai·aj·ak — минимально.

Примечание

В первом тесте из условия Макес всегда выберет три единицы из четырёх, а количество способов их выбрать — 4.

Во втором тесте выбирается тройка чисел (1, 2, 3). Так как 3 встречается в массиве дважды, а единица и двойка — единожды, то количество способов будет равно 2.

В третьем тесте выбирается тройка (1, 1, 2), её можно выбрать единственным способом.

A. Дипломы и грамоты

математика реализация *800

В олимпиаде участвовали n школьников, и теперь некоторым из них нужно раздать дипломы, некоторым грамоты, а оставшиеся школьники не получат ничего.

Школьник, получивший диплом или грамоту, является призером. Жюри утвердило, что грамот нужно раздать ровно в k раз больше, чем дипломов. Более того, количество призеров должно быть не больше половины количества школьников (то есть не больше половины n). При этом жюри допускает, что в олимпиаде может не быть призеров вообще.

Требуется определить, какое максимальное количество призеров может быть в олимпиаде с учетом описанных требований, и вывести, соответственно, количество школьников, получивших дипломы, количество школьников, получивших грамоты и количество школьников, которые ничего не получили.

Входные данные

В единственной строке даны два натуральных числа n и k (1 ≤ n, k ≤ 1012), где n — количество школьников, участвовавших в олимпиаде, а k — число, определяющее, во сколько раз количество грамот должно быть больше количества дипломов.

Выходные данные

В единственной строке через пробел выведите три числа: количество школьников, получивших дипломы, количество школьников, получивших грамоты и количество школьников, которые ничего не получили, с учетом того, что количество призеров максимально.

Жюри допускает, что в олимпиаде может не быть призеров вообще.

B. Игра с перестановкой

реализация *1600

n детей стоят по кругу и играют в игру. Дети пронумерованы по часовой стрелке таким образом, что номера образуют перестановку a1, a2, ..., an длины n. Это последовательность целых чисел, такая, что каждое число от 1 до n встречается в ней ровно один раз.

Игра состоит из m шагов. На каждом шаге текущий ведущий на позиции i отсчитывает ai человек по часовой стрелке, начиная со следующего человека. Тот, на кого ведущий указал последним, становится новым ведущим.

Вам дана последовательность l1, l2, ..., lm — номера ведущих в начале каждого шага. Ребенок с номером l1 — первый ведущий.

Напишите программу, которая восстановит возможную перестановку a1, a2, ..., an. Если существует несколько решений, то выведите любое. Если нет решения, то выведите -1.

Входные данные

В первой строке записаны два целых числа n, m (1 ≤ n, m ≤ 100).

Во второй строке записаны m целых чисел l1, l2, ..., lm (1 ≤ li ≤ n) — номера ведущих в начале каждого шага.

Выходные данные

Выведите такую перестановку длины n a1, a2, ..., an, что номера ведущих при игре с ней будут в точности l1, l2, ..., lm. Если существует несколько решений, то выведите любое.

Если не существует перестановки, удовлетворяющей описанным условиям, выведите -1.

Примечание

Рассмотрим порядок ведущих в первом примере:

  • Ребенок 2 начинает.
  • После 2 ведущим становится 2 + a2 = 3.
  • После 3 ведущим становится 3 + a3 = 5. Так как это больше, чем 4, по кругу переходит к 1.
  • После 1 ведущим становится 1 + a1 = 4.
  • После 4 ведущим становится 4 + a4 = 8. Значит по кругу это остается 4.

C. Диванный вор

Перебор реализация *2000

Скоро начинается очередной раунд на DecoForces! Дедушка Макс хотел поучаствовать в раунде, но за 15 минут до начала обнаружил пропажу — кто-то украл его любимый диван, на котором он писал контесты.

К счастью, вор оставил записку для дедушки Макса. Записка привела его на склад диванов. Но вот незадача — дедушка не может определить, какой из диванов был украден у него, так как внешне они все одинаковые!

Представим склад как прямоугольное поле n × m клеток. Каждый диван занимает две клетки склада, соседние по стороне. Каждую клетку занимает не более одного дивана (но могут быть и пустые клетки).

Считается, что диван A расположен левее дивана B, если существуют две таких клетки a и b, что a принадлежит дивану A, b принадлежит дивану B, и xa < xb. Диван A расположен выше дивана B, если существуют две таких клетки a и b, что a принадлежит дивану A, b принадлежит дивану B, и ya < yb. Аналогично определяем, когда какой-то диван правее или выше другого.

Обратите внимание, что во всех условиях выполняется A ≠ B. Также диван A может одновременно быть и выше другого дивана B, и ниже него. То же для левого и правого условий.

В записке, которую нашёл дедушка Макс, указывалось, что левее его дивана расположено cntl диванов, правее — cntr диванов, выше — cntt диванов и ниже — cntb диванов.

Помогите дедушке по этим данным найти его диван! Гарантируется, что не более одного дивана подходит под заданные условия.

Выведите номер дивана дедушки Макса. Если нет такого дивана, что все условия соблюдаются, то выведите -1.

Входные данные

В первой строке записано целое число d (1 ≤ d ≤ 105) — количество диванов на складе.

Во второй строке записаны два числа n, m (1 ≤ n, m ≤ 105) — размеры склада.

В следующих d строках записано по четыре целых числа x1, y1, x2, y2 (1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m) — координаты i-го дивана. Гарантируется, что клетки (x1, y1) и (x2, y2) имеют общую сторону, (x1, y1)  ≠  (x2, y2) и ни одна клетка не покрыта более чем одним диваном.

В последней строке записаны четырех целых числа cntl, cntr, cntt, cntb (0 ≤ cntl, cntr, cntt, cntb ≤ d - 1).

Выходные данные

Выведите номер дивана, для которого все условия соблюдаются. Диваны пронумерованы от 1 до d в порядке входных данных. Если такого дивана нет, то выведите -1.

Примечание

Рассмотрим второй пример.

  • У первого дивана 0 расположены слева от него, 2 справа (1, 1) находится слева и от (5, 5), и от (5, 4)), 0 сверху и 2 снизу (и 2-й, и 3-й диваны находятся ниже).
  • У второго дивана cntl = 2, cntr = 1, cntt = 2 and cntb = 0.
  • У третьего дивана cntl = 2, cntr = 1, cntt = 1 and cntb = 1.

Второй диван подходит под данные условия.

В третьем примере:

  • У первого дивана cntl = 1, cntr = 1, cntt = 0 and cntb = 1.
  • У второго дивана cntl = 1, cntr = 1, cntt = 1 and cntb = 0.

И так как нет ни одного дивана с набором (1, 0, 0, 0), то ответ -1.

D. Разноцветные машины

реализация Структуры данных *1700

Алиса и Боб заскучали во время длинной поездки на машине, и поэтому решили сыграть в игру. Из окна они видят проезжающие мимо машины разных цветов. Машины едут подряд одна за другой.

В игре следующие правила. Сначала Алиса выбирает некоторый цвет A, потом Боб выбирает некоторый цвет B (A ≠ B). После каждой машины они обновляют количество машин их выбранного цвета, проехавших мимо них. Назовем эти числа после i-й машины cntA(i) and cntB(i).

  • Если cntA(i) > cntB(i) для каждого i, то побеждает Алиса.
  • Если cntB(i) ≥ cntA(i) для каждого i, то побеждает Боб.
  • В ином случае игра завершается ничьей.

Боб знает все цвета машин, которые проедут мимо них, и их порядок. Алиса уже выбрала цвет A, и Боб теперь хочет выбрать такой цвет B, что с ним он выиграет (ничья не считается победой). Помогите ему найти такой цвет.

Если существует несколько решений, то выведите любое из них. Если не существует ни одного такого цвета, то выведите -1.

Входные данные

В первой строке записаны два целых числа n и A (1 ≤ n ≤ 105, 1 ≤ A ≤ 106) — количество машин и цвет, выбранный Алисой.

Во второй строке записаны n целых чисел c1, c2, ..., cn (1 ≤ ci ≤ 106) — цвета машин, которые увидят Алиса и Боб, в порядке их появления.

Выходные данные

Выведите такой цвет B (1 ≤ B ≤ 106), что если Боб выберет его, то выиграет. Если существует несколько решений, то выведите любое из них. Если не существует ни одного такого цвета, то выведите -1.

Гарантируется, что если существует хотя бы одно решение, то существует также решение с (1 ≤ B ≤ 106).

Примечание

Рассмотрим доступность цветов в первом примере:

  • cnt2(i) ≥ cnt1(i) для каждого i, соответственно, цвет 2 выигрышный.
  • cnt4(2) < cnt1(2), поэтому цвет 4 не является выигрышным для Боба.
  • Для всех остальных цветов cntj(2) < cnt1(2), поэтому они тоже недоступны.

В третьем примере любой цвет, кроме цвета 10, приемлем.

B. Мистер Б и PR сдвиги

математика реализация Структуры данных *1900

Недавно Мистер Б получил странный сигнал из космоса, который он непременно решил исследовать.

После некоторых преобразований сигнал оказался перестановкой p из n элементов, либо некоторым ее циклическим сдвигом. Для дальнейшего анализа Мистеру Б понадобилась некоторая определенность, а потому он захотел выбрать из всех циклических сдвигов данной перестановки некоторую с наименьшим отклонением.

Отклонением перестановки p назовем величину .

Найдите циклический сдвиг перестановки p с наименьшим отклонением. Если таких несколько, выведите номер любого из них.

Номером k (0 ≤ k < n) циклического сдвига перестановки p определим как число сдвигов вправо, необходимых для получения этого сдвига, то есть:

  • k = 0: сдвиг p1, p2, ... pn,
  • k = 1: сдвиг pn, p1, ... pn - 1,
  • ...,
  • k = n - 1: сдвиг p2, p3, ... pn, p1.
Входные данные

В первой строке задано одно натуральное число n (2 ≤ n ≤ 106) — размер перестановки.

В следующей строке задано n натуральных чисел p1, p2, ..., pn (1 ≤ pi ≤ n) через пробел — элементы перестановки. Гарантируется, что все элементы различны.

Выходные данные

Выведите два целых числа через пробел: минимальное возможное отклонение циклического сдвига перестановки p и номер такого сдвига. Если таких сдвигов несколько, выведите номер любого из них.

Примечание

В первом примере заданная перестановка p является тождественной, поэтому ее отклонение равно 0, а соответствующий номер сдвига равен 0.

Во втором примере отклонение перестановки p равно 4, отклонение 1-го циклического сдвига (1, 2, 3) равно 0, отклонение 2-го циклического сдвига (3, 1, 2) равно 4, оптимальным является 1-й циклический сдвиг.

В третьем примере отклонение перестановки p равно 4, отклонение 1-го циклического сдвига (1, 3, 2) равно 2, отклонение 2-го циклического сдвига (2, 1, 3) также равно 2, оптимальными являются 1-й и 2-й циклические сдвиги.

A. Double Cola

математика реализация *1100

Шелдон, Леонард, Пенни, Раджеш и Говард стоят в очереди к автомату по продаже баночек с напитком «Double Cola», других людей в очереди нет. Первый в очереди (Шелдон) покупает баночку, выпивает ее содержимое и раздваивается! Получившиеся два Шелдона встают в конец очереди. Затем следующий в очереди (Леонард) покупает баночку, выпивает и встает в конец очереди в двойном экземпляре, и так далее. Этот процесс продолжается до бесконечности.

Например, третью баночку колы выпьет Пенни, и очередь будет выглядеть так: Раджеш, Говард, Шелдон, Шелдон, Леонард, Леонард, Пенни, Пенни.

Напишите программу, которая выведет имя человека, выпившего n-ую баночку.

Обратите внимание, что в самом начале очередь выглядит так: Шелдон, Леонард, Пенни, Раджеш, Говард. Первым человеком является Шелдон.

Входные данные

Входные данные состоят из единственного целого числа n (1 ≤ n ≤ 109).

Гарантируется, что в претестах проверяется правильность написания всех пяти имен, то есть в них встречаются все пять возможных ответов.

Выходные данные

Выведите единственную строку — имя человека, который выпьет n-ую баночку колы. Баночки нумеруются от 1. Обратите внимание, что следует выводить имена в следующем написании: "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" (без кавычек). Именно в этом порядке друзья стоят в очереди изначально.

B. Множества

Конструктив реализация хэши *1700

Маленький Вася очень любит играть со множествами из натуральных чисел. Для того, чтобы играть было еще интереснее, Вася выбрал n таких непустых множеств, что никакие два из них не имеют общих элементов.

Однажды он захотел показать своим друзьям, что играть с числами очень интересно. Для этого он выписал на n·(n - 1) / 2 листочках бумаги всевозможные объединения двух различных множеств и перемешал сами листочки. Числа в объединениях он выписывал в произвольном порядке.

Например, если n = 4, а сами множества имеют вид {1, 3}, {5}, {2, 4}, {7}, то количество пар множеств окажется равным шести. На шести листочках могут быть указаны следующие числа:

  • 2, 7, 4.
  • 1, 7, 3;
  • 5, 4, 2;
  • 1, 3, 5;
  • 3, 1, 2, 4;
  • 5, 7.

Затем Вася показал эти листочки друзьям, но n множеств сохранил от них в секрете. Друзья смогли быстро вычислить, какие множества загадал Вася. А сможете ли вы восстановить множества по заданным листочкам?

Входные данные

В первой строке входного файла находится число n (2 ≤ n ≤ 200), n — количество имещихся у Васи множеств. Далее в n·(n - 1) / 2 строках записаны наборы чисел на листочках. Каждый набор начинается с числа ki (2 ≤ ki ≤ 200) — количества записанных чисел на i-ом листочке, а далее записаны ki чисел aij (1 ≤ aij ≤ 200). Все числа в строках разделены ровно одним пробелом. Гарантируется, что входные данные построены по описанным выше правилам из n непересекающихся множеств.

Выходные данные

Выведите в n строках описание множеств Васи. Первое число в строке — это количество чисел в текущем множестве, а далее должны быть записано множество перечислением своих элементов. Числа разделяйте пробелами. Каждое число и каждое множество нужно выводить ровно один раз. Множества и числа в них выводите в любом порядке. Если ответов несколько, выведите любой.

Гарантируется, что решение существует.

A. Мистер Б и чтение книги

реализация *900

Как-то раз Мистер Б получил в подарок книгу про инопланетян и решил прочесть её. Данная книга состояла из c страниц.

Скорость чтения Мистера Б в первый день составляет v0 страниц, однако, втягиваясь, каждый следующий день он читает на a страниц больше, чем в предыдущий (в первый день он читает v0 страниц, во второй — v0 + a, в третий — v0 + 2a и т.д.). При этом, как бы он не старался, Мистер Б не может читать больше чем v1 страниц в день.

Также, чтобы не терять контекст произведения, Мистеру Б приходится каждый день, начиная со второго, перечитывать l последних прочитанных им страниц. Мистер Б заканчивает читать книгу, как только прочтет последнюю страницу в первый раз.

Определите, сколько дней Мистеру Б понадобится, чтобы полностью прочитать книгу.

Входные данные

В первой и единственной строке задано пять целых чисел через пробел: c, v0, v1, a и l (1 ≤ c ≤ 1000, 0 ≤ l < v0 ≤ v1 ≤ 1000, 0 ≤ a ≤ 1000) — количество страниц, минимальная скорость чтения, максимальная скорость чтения, ускорение и количество страниц, которое перечитывает Мистер Б каждый день.

Выходные данные

Выведите единственное целое число — количество дней, необходимое Мистеру Б, чтобы полностью прочесть книгу.

Примечание

В первом примере книга состоит из 5 страниц, которые Мистер Б прочтет в первый же день.

Во втором примере в первый день Мистер Б прочтет страницы с номерами 1 - 4, во второй день: 4 - 11, в третий: 11 - 12 и закончит чтение.

В третьем примере Мистер Б будет читать ровно по 1 странице в день и прочитает всю книгу за 15 дней.

A. Окабэ и Лаборатория гаджетов будущего

реализация *800

Окабэ должен обновить Лабораторию гаджетов будущего после того, как он попытался выполнить несколько сумасшедших экспериментов! Лаборатория представлена как квадратная таблица из целых чисел размера n на n. Лаборатория является хорошей, если каждое число, не равное 1, может быть представлено как сумма числа в той же строке и числа в том же столбце. Другими словами, для каждых x, y таких, что 1 ≤ x, y ≤ n и ax, y ≠ 1, должны существовать индексы s и t такие, что ax, y = ax, s + at, y, где ai, j означает число в i-й строке и j-м столбце.

Помогите Окабэ определить, является ли данная лаборатория хорошей!

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 50) — размер лаборатории.

Каждая из следующих n строк содержит n целых чисел, описывающих строку таблицы. Целое число j в i-й строке равно ai, j (1 ≤ ai, j ≤ 105).

Выходные данные

Выведите «Yes», если данная лаборатория является хорошей и «No» иначе.

Вы можете выводить каждую букву строчной или заглавной.

Примечание

В первом примере число 6 в левом нижнем углу может быть представлено в виде суммы числа 2 выше него и числа 4 справа. То же выполняется для каждого числа, не равного 1 в этой таблице, поэтому ответ — «Yes».

Во втором примере 5 не может быть представлено в виде суммы числа в той же строке и числа в том же столбце. Поэтому ответ «No».

A. Мне скучно жить

математика реализация теория чисел *800

Закончилось время каникул. Благодаря помощи хакера Лехи, Нура все же смогла поступить в университет своей мечты, который находится в Павлополисе. Как известно, на очной форме обучения университеты предоставляют студентам общежития, поэтому Нуре пришлось переехать в Павлополис. Теперь Леха остался совсем один в тихом городке Вичкополисе. От скуки он даже едва не впал в депрессию!

Чтобы хоть немного развеяться Леха придумал для себя задачу. Он выбирает два целых числа A и B, а затем считает наибольший общий делитель чисел «A факториал» и «B факториал». Более формально, хакер хочет посчитать НОД(A!, B!). Как известно, факториал числа x равен произведению всех положительных целых чисел, не превосходящих x. Таким образом, x! = 1·2·3·...·(x - 1)·x. Например, 4! = 1·2·3·4 = 24. Напомним, что НОД(x, y) определяется, как такое наибольшее целое число q, что делит x нацело и делит y нацело.

Леха научился решать такую задачку очень быстро. А сможете ли вы?

Входные данные

В первой и единственной строке входного файла дано два целых числа A и B (1 ≤ A, B ≤ 109, min(A, B) ≤ 12).

Выходные данные

Выведите одно число — наибольший общий делитель чисел A! и B!.

Примечание

Рассмотрим пример.

4! = 1·2·3·4 = 24. 3! = 1·2·3 = 6. Наибольший общий делитель чисел 24 и 6 равен 6.

B. Решение кроссворда

Перебор реализация Строки *1000

Вскоре Лехе наскучило считать наибольшие общие делители двух факториалов. Поэтому он решил заняться разгадыванием кроссвордов. Как известно, это очень интересное занятие, но может быть и очень сложным время от времени. В ходе разгадывания одного из кроссвордов Лехе пришлось решить несложную задачу. А сможете ли вы?

У Лехи есть две строки s и t. Теперь хакер хочет изменить строку s так, чтобы она встречалась в t в качестве подстроки. Все изменения должны иметь вид: Леха выбирает некоторую позицию в строке s и заменяет символ в этой позиции на знак вопроса «?». Хакер уверен, что знак вопроса «?» при сравнении может играть роль произвольного символа. Например, если в результате он получит строку sab?b», то она встретится в taabrbb» как подстрока.

Гарантируется, что длина строки s не превосходит длины строки t. Помогите хакеру Лехе заменить в s минимальное количество символов на знаки вопроса «?» так, чтобы результат встречался в t в качестве подстроки. Символ «?» при сравнении следует считать равным любому другому символу.

Входные данные

В первой строке следует два целых числа n и m (1 ≤ n ≤ m ≤ 1000) — длина строки s и длина строки t соответственно.

Во второй строке следует n строчных латинских букв — строка s.

В третьей строке следует m строчных латинских букв — строка t.

Выходные данные

В первую строку выведите целое число k — минимальное количество символов, которые нужно заменить. Во второй строке выведите k различных целых чисел — позиции букв в строке s, которые нужно заменить. Позиции выводите в любом порядке. Если ответов несколько, разрешается вывести любой из них. Нумерация позиций начинается с единицы.

C. Хакер, собирай чемоданы!

Бинарный поиск жадные алгоритмы реализация сортировки *1600

Как известно, лучший способ отвлечься от чего-либо — заниматься своим любимым делом. Для хакера Лехи любимое дело это работа.

Чтобы не скучать, Леха начал усердно работать, то есть взламывать компьютеры по всему миру. За такое усердие начальство дало хакеру отпуск продолжительностью ровно x дней. Как известно, большинство людей предпочитают куда-нибудь уехать на время отпуска, поэтому Леха сразу пошёл в туристическое агенство. Там он выяснил, что осталось n непроданных путевок. i-я путевка характеризуется тремя числами li, ri, costi — день отъезда из Вичкополиса, день возврата в Вичкополис и стоимость путевки соответственно. Продолжительностью i-й путевки называют величину ri - li + 1.

При этом Леха хочет разделить свой отпуск на две части. Кроме того он хочет потратить как можно меньше денег. Более формально, Леха хочет выбрать ровно две путевки i и j (i ≠ j) так, чтобы они не пересекались, сумма их продолжительностей была равна ровно x, а суммарная стоимость была минимальна. Две путевки i и j не пересекаются, если выполняется хотя бы одно из условий: ri < lj или rj < li.

Помогите Лехе выбрать необходимые путевки!

Входные данные

В первой строке заданы два целых числа n и x (2 ≤ n, x ≤ 2·105) — количество путевок в туристическом агентстве и продолжительность отпуска соответственно.

В следующих n строках следуют по три целых числа li, ri и costi (1 ≤ li ≤ ri ≤ 2·105, 1 ≤ costi ≤ 109) — описание очередной путевки.

Выходные данные

Выведите одно целое число — минимальное количество денег, которые потратит Леха, либо  - 1, если невозможно выбрать две непересекающиеся путевки с суммарной продолжительностью ровно x.

Примечание

В первом примере примере Леха должен выбрать первую и третью путевки. Тогда их суммарная продолжительность будет равна (3 - 1 + 1) + (6 - 5 + 1) = 5, а суммарная стоимость будет равна 4 + 1 = 5.

Во втором примере продолжительность каждой из путевок равна 3, поэтому невозможно выбрать две путевки с суммарной продолжительностью равной 2.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

A. Двоичный протокол

реализация *1100

Поликарп изобрел новый двоичный протокол для передачи данных. Он кодирует положительное целое десятичное число в двоичную строку следующим алгоритмом:

  • Каждая цифра представляется числом символов '1' равным значению этой цифры (для 0 — это ноль единиц).
  • Цифры записываются одна за другой в порядке, как в оригинальном числе, и разделяются единственным символом '0'.

И хотя Поликарп научился представлять число в виде двоичной строки, он так и не сумел понять, как перевести строку обратно в число. Помогите ему посчитать закодированное число.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 89) — длина строки s.

Во второй строке записана строка s из символов '0' и '1' — число в формате бинарной строки. Гарантируется, что число, соответствующее строке, положительное и не превышает 109. Строка всегда начинается с символа '1'.

Выходные данные

Выведите закодированное число.

B. Пять в ряд

Перебор реализация *1600

Алиса и Боб играют в игру «Пять в ряд» на поле 10 × 10. По очереди они ставят крестики и нолики, по одному за раз. Алиса ставит крестики, Боб — нолики.

В текущей партии они совершили некоторое количество ходов, и теперь ход Алисы. Ей интересно, может ли она поставить крестик так, чтобы сразу победить.

Алиса побеждает, когда какие-либо крестики на поле образуют линию длины не меньше 5. Линия может быть горизонтальной, вертикальной или диагональной.

Входные данные

Задана матрица 10 × 10 (10 строк по 10 символов в каждой) с крестиками, обозначаемыми заглавными латинскими буквами 'X', ноликами — буквами 'O' и пустыми клетками — символами '.'. Количество крестиков равно количеству ноликов, и существует хотя бы один крестик и нолик. Существует хотя бы одна пустая клетка.

Гарантируется, что в текущей расстановке никто еще не достиг победы.

Выходные данные

Выведите 'YES', если Алиса может победить в один ход, поставить крестик в какую-либо свободную клетку. В противном случае выведите 'NO'.

C. Multi-judge Solving

жадные алгоритмы реализация *1600

Макес решает задачи на Decoforces и множестве других онлайн платформ. Каждая задача характеризуется своей сложностью — целым положительным числом. Сложности измеряются одинаково на всех платформах (т.е. задача со сложностью d на Decoforces такая же трудная, как и задача со сложностью d на любой другой платформе).

Макес выбрал для решения n задач на Decoforces со сложностями a1, a2, ..., an. Он может решать задачи в произвольном порядке. Однако, чтобы решить задачу i со сложностью ai, надо заранее решить хотя бы одну задачу со сложностью (не имеет значения, на какой платформе).

Перед решением выбранного списка задач Макес уже решал задачи с максимальной сложностью k.

С заданными условиями легко заметить, что Макес не всегда может решить все выбранные задачи, какой бы порядок он не использовал. Поэтому он хочет решить некоторые задачи на других платформах так, чтобы завершить решение задач из своего списка.

Для каждого целого положительного y хотя бы на одной платформе помимо Decoforces существует задача со сложностью y.

Макес может решать задачи на любой платформе в любое время, не обязательно решать задачи из списка подряд одну за другой.

У Макеса не очень много свободного времени, поэтому он просит вас посчитать минимальное количество задач, которые ему потребуется решить на других платформах, чтобы решить все выбранные задачи на Decoforces.

Входные данные

В первой строке записаны два целых числа n, k (1 ≤ n ≤ 103, 1 ≤ k ≤ 109).

Во второй строке записаны n целых чисел, разделенных пробелами, a1, a2, ..., an (1 ≤ ai ≤ 109).

Выходные данные

Выведите минимальное количество задач, которые Макесу потребуется решить на других платформах, чтобы решить все выбранные задачи на Decoforces.

Примечание

В первом примере Макес сначала решает задачи 1 и 2. Потом, чтобы решить задачу со сложностью 9, он должен сначала решить задачу со сложностью не меньше 5. Единственные доступные — сложности 5 и 6 на каких-то других платформах. Решение одной из этих задач даст Макесу возможность решить задачу 3.

Во втором примере он может решить каждую задачу с самого начала.

D. Подходящая замена

Бинарный поиск жадные алгоритмы реализация *1500

Даны две строки s и t, состоящие из строчных латинских букв, в строке s могут также встречаться символы '?'.

Пригодность строки s подсчитывается следующим способом:

Две любые буквы можно поменять местами, такую операцию можно проделывать неограниченное число раз над любой парой позиций. Среди всех полученных строк s выберите такую, что количество непересекающихся вхождений строки t в нее максимально. Пригодность — это полученное максимальное количество.

Замените все символы '?' строчными латинскими буквами таким образом, чтобы пригодность строки s была максимальна.

Входные данные

В первой строке записана строка s (1 ≤ |s| ≤ 106).

Во второй строке записана строка t (1 ≤ |t| ≤ 106).

Выходные данные

Выведите строку s с символами '?', замененными строчными латинскими буквами таким образом, чтобы пригодность этой строки была максимальна.

Если есть несколько строк с максимальной пригодностью, то выведите любую.

Примечание

В первом примере строка "baab" может быть преобразована в "abab", у которой пригодность равна 2. Значит и у строки "baab" такая же пригодность.

Во втором примере максимальная возможная пригодность равна 1, и таких строк несколько десятков, "azbz" — одна из них.

В третьем примере в строке нет символов '?', а ее пригодность равна 0.

A. Столы в ресторане

реализация *1200

В ресторане есть a столов на одного и b столов на двух человек.

Известно, что сегодня вечером в ресторан придут n групп людей, состоящих из одного или двух людей.

Если очередная группа состоит из одного человека, то его сажают за свободный одноместный столик. Если такого нет, то его сажают за свободный двухместный столик. Если и такого нет, а есть двухместный столик, за которым сидит один человек, то его сажают за этот столик. В противном случае, этому человеку будет отказано в обслуживании.

Если очередная группа состоит из двух человек, то их сажают за свободный двухместный столик. Если же свободных двухместных столиков нет, то этой группе из двух человек будет отказано в обслуживании.

Вам будет задан хронологический порядок прихода групп людей и вам предстоит определить количество человек, которым будет отказано в обслуживании.

Входные данные

В первой строке следуют три целых числа n, a и b (1 ≤ n ≤ 2·105, 1 ≤ a, b ≤ 2·105) — количество групп людей, которые придут в ресторан, количество одноместных и количество двухместных столиков.

Во второй строке следует последовательность целых чисел t1, t2, ..., tn (1 ≤ ti ≤ 2) — описание групп посетителей в хронологическом порядке. Если ti равно единице, то i-я группа состоит из одного человека, в противном случае, i-я группа состоит из двух человек.

Выходные данные

Выведите количество человек, которым будет отказано в обслуживании.

Примечание

В первом примере первая группа состоит из одного человека, который займет единственный свободный одноместный столик. Следующая группа целиком займет двухместный столик, после чего останется один свободный двух местный столик. Третья группа состоит из одного человека, который займет одно место за оставшимся двухместным столиком. Четвертая группа состоит из одного человека, который займет оставшееся место за двухместным столиком. Таким образом, все посетители будут обслужены.

Во втором примере первая группа состоит из одного человека, который займет единственный свободный одноместный столик. Следующая группа состоит из одного человека, который займет одно место за единственным свободным двухместным столиком. Затем придет группа из двух человек, которых посадить некуда, поэтому этим двум людям в обслуживании будет отказано. Четвертая группа состоит из одного человека, который займет оставшееся место за двухместным столиком. Таким образом, 2 посетителя не будут обслужены.

B. Чёрный квадрат

реализация *1300

У Поликарпа есть клетчатый лист бумаги размера n × m. Поликарп закрасил некоторые клетки этого листа чёрным цветом, остальные остались белыми. Вдохновленный историей о картине Малевича «Черный квадрат», Поликарп решил закрасить минимальное количество белых клеток листа в чёрный цвет так, чтобы все чёрные клетки на листе бумаги образовывали квадрат.

Перед вами стоит задача определить минимальное количество клеток, которые нужно закрасить в чёрный цвет, чтобы получился чёрный квадрат со сторонами параллельными сторонам листа? Все клетки, не принадлежащие квадрату, должны быть белого цвета. Сторона квадрата должна иметь ненулевую длину.

Входные данные

В первой строке следует два целых числа n и m (1 ≤ n, m ≤ 100) — размеры листа бумаги.

В следующих n строках следует по m символов 'B' и 'W' — описание изначальных цветов клеток. Если очередной символ равен 'B', то соответствующая клетка чёрного цвета, в противном случае, белого.

Выходные данные

Выведите минимальное количество клеток, которые нужно закрасить в чёрный цвет, чтобы получился чёрный квадрат со сторонами параллельными сторонам листа. Все клетки, не принадлежащие квадрату, должны быть белого цвета. Если этого сделать невозможно, выведите -1.

Примечание

В первом примере нужно закрасить 5 клеток — (2, 2), (2, 3), (3, 2), (3, 3) и (4, 2). Тогда получится квадрат с длиной стороны равной трём, а левый верхний угол квадрата будет находиться в точке (2, 2).

Во втором примере все клетки поля изначально закрашены в чёрный цвет и образуют прямоугольник, поэтому квадрат получить невозможно.

В третьем примере все клетки поля изначальное закрашены в белый цвет, поэтому достаточно закрасить любую из клеток поля, чтобы получить квадрат с длиной стороны равной единице.

B. Сортировка карт

реализация сортировки Структуры данных *1600

У Василия есть колода, состоящая из n карт. На каждой карте написано ровно одно целое число от 1 до 100 000. Возможно, что на некоторых картах написаны одинаковые числа.

Василий решил отсортировать все карты в колоде. Для этого он по очереди берёт одну верхнюю карту из колоды и если число, написанное на ней, равно минимальному среди всех оставшихся чисел в колоде, он откладывает эту карту в сторону. В противном случае, Василий кладёт эту карту вниз колоды и берёт сверху колоды следующую карту. Процесс заканчивается, когда в колоде не останется карт. Можно считать, что Василий в любой момент времени знает минимальное число, записанное на какой-то из оставшихся в колоде картах, но не знает, где эта карта (или карты) находится в колоде.

Перед вами стоит задача определить суммарное количество раз, которое Василий посмотрит верхнюю карту из колоды.

Входные данные

В первой строке следует целое положительное число n (1 ≤ n ≤ 100 000) — количество карт в колоде.

Во второй строке следует последовательность из n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 100 000), где ai равно числу, написанному на i-й сверху карте из колоды.

Выходные данные

Выведите суммарное количество раз, которое Василий посмотрит верхнюю карту из колоды.

Примечание

В первом примере Василий посмотрит сначала карту с числом 6, положит ее вниз колоды, затем карту с числом 3, также положит ее вниз колоды, и затем карту с числом 1. Он отложит карту с числом 1, так как на ней написан минимальное число из оставшихся в колоде. После этого карты в колоде будут лежать в порядке [2, 6, 3] сверху вниз. После этого Василий посмотрит верхнюю карту с числом 2 и отложит её. После этого карты в колоде будут лежать в порядке [6, 3] сверху вниз. Затем Василий посмотрит карту с числом 6, положит ее вниз колоды, а затем карту с числом 3, которую отложит. После этого в колоде останется одна карта с числом 6, которую Василий посмотрит и отложит. Таким образом, Василий посмотрит 7 карт.

A. Унимодальный массив

реализация *1000

Массив целых чисел называется унимодальным, если он:

  • сначала строго возрастает;
  • затем постоянен (константный);
  • потом строго убывает.

Первый блок (возрастания) и последний блок (убывания) могут отсутствовать. Допустимо, что отсутствуют оба этих блока одновременно.

Например, следующие три массива унимодальны: [5, 7, 11, 11, 2, 1], [4, 4, 2], [7], а следующие три не являются унимодальными: [5, 5, 6, 6, 1], [1, 2, 1, 2], [4, 5, 5, 6].

Напишите программу, которая проверяет заданный массив на унимодальность.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 100) — количество элементов в массиве.

Во второй строке следуют n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1 000) — элементы массива.

Выходные данные

Если массив унимодальный, выведите «YES». В противном случае, выведите «NO».

Любую букву можно выводить в любом регистре (заглавную или строчную).

Примечание

В первом примере массив унимодален, так как сначала он возрастает (с позиции 1 до позиции 2, включительно), затем постоянен (с позиции 2 до позиции 4, включительно), а затем убывает (с позиции 4 до позиции 6, включительно).

B. Раскладки клавиатуры

реализация Строки *800

В Берляндии распространены две раскладки для клавиатур, которые различаются только порядком следования букв на клавишах. Все остальные клавиши совпадают. В Берляндии используют алфавит, который содержит 26 букв и совпадает с английским.

Вам будут заданы две строки по 26 букв в каждой — все клавиши первой и второй раскладки в порядке слева направо сверху вниз.

Также вам будет задан набранный текст, который состоит из прописных и строчных букв английского алфавита и цифр. Известно, что он был набран по ошибке в первой раскладке, хотя хотели набрать его во второй. Выведите этот текст, если бы использовалась вторая раскладка, а не первая при его наборе.

Так как все клавиши кроме буквенных совпадают, то регистр букв и символы отличные от букв остаются неизменными.

Входные данные

В первой строке следует строка длины 26, состоящая из различных строчных букв латинского алфавита — первая раскладка.

Во второй строке следует строка длины 26, состоящая из различных строчных букв латинского алфавита — вторая раскладка.

В третьей строке следует непустая строка s, состоящая из строчных и заглавных латинских букв, а также цифр — набранный текст в первой раскладке. Длина строки s не превосходит 1000.

Выходные данные

Выведите текст, если бы он был набран во второй раскладке.

B. Петя и ЕГЭ

реализация Строки *1600

Настали тяжелые времена. Сегодня Пете нужно набрать на экзамене по информатике 100 баллов. Все задачи на экзамене Пете кажутся простыми, но он боится, что не успеет сделать одну из них за такой маленький промежуток времени, поэтому он обратился к вам за помощью.

В условии даётся шаблон (строка, состоящая из строчных латинских букв, символов «?» и «*»). Известно, что символ «*» встречается в шаблоне не более одного раза.

Также в условии даны n строк-запросов, и для каждой необходимо определить, подходит ли она под данный шаблон, или нет.

Все было бы хорошо, но специальные символы в шаблоне в этой задаче действуют не так, как обычно!

Строка подходит под шаблон, если можно в шаблоне заменить каждый из символов «?» на одну хорошую строчную латинскую букву, а символ «*» (если он есть) — на любую, в том числе пустую, строку из плохих строчных латинских букв так, чтобы результат совпал со строкой.

В условии также даны буквы, считающиеся хорошими. Плохими являются все остальные буквы латинского алфавита.

Входные данные

В первой строке находится строка, содержащая от 1 до 26 различных строчных латинских букв. Это буквы, которые считаются в задаче хорошими. Все остальные буквы — плохие.

Во второй строке находится шаблон — строка s из строчных букв латинского алфавита, символов «?» и «*» (1 ≤ |s| ≤ 105). Гарантируется, что символ «*» встречается в s не более одного раза.

Во третьей строке находится целое число n (1 ≤ n ≤ 105) — количество строк-запросов.

Далее следуют n строк, в каждой из них находится по одной непустой строке, состоящей из строчных латинских букв — очередная строка-запрос.

Гарантируется, что сумма длин всех строк-запросов не превосходит 105.

Выходные данные

Выведите n строк: в i-й строке необходимо вывести «YES», если i-я строка-запрос удовлетворяет шаблону, и «NO» в противном случае.

Вы можете выводить каждую из букв в любом регистре.

Примечание

Объяснение первого теста. Символ «?» можно заменять на хорошие буквы «a» и «b», поэтому видно, что на первый запрос ответ «YES», а на второй запрос ответ «NO», потому что третья буква не может совпасть.

Объяснение второго теста.

  • Первый запрос: «NO», потому что символ «*» можно заменять на строку из плохих букв, а единственный способ совпасть со строкой-запросом — заменить его на строку «ba», где оба символа — хорошие.
  • Второй запрос: «YES», потому что «?» можно заменить на соответствующие хорошие буквы, а «*» — на пустую строку, и строки совпадут.
  • Третий запрос: «NO», потому что «?» нельзя заменять на плохие буквы.
  • Четвертый запрос: «YES», потому что «?» можно заменить на хорошие символы «a», а «*» — на строку из плохих букв «x».

C. Странное излучение

Бинарный поиск математика реализация *2500

n человек стоят на координатной прямой в точках с положительными целочисленными координатами, строго меньшими 106. Для каждого человека известно, в какую сторону он смотрит (влево или вправо), и его максимальная скорость.

У вас есть возможность разместить одну бомбу в точку с целочисленной неотрицательной координатой, и взорвать ее. В этот момент все люди побегут со своей максимальной скоростью в те стороны, в которые они смотрят, а от бомбы начнут распространяться два странных луча со скоростью s: влево и вправо. Конечно, скорость лучей s строго больше скорости любого человека.

Странность лучей в том, что в момент, когда положение некоторого луча и его направление совпадает с положением и направлением бега некоторого человека, скорость этого человека увеличивается на скорость луча.

Требуется положить бомбу в такое место, чтобы минимальный момент времени, в который и мимо точки 0, и мимо точки 106 пробежал хотя бы один человек, был как можно меньше. Иными словами, найдите минимальный момент времени t такой, что существует точка, в которую можно положить бомбу так, чтобы в момент времени t и мимо точки 0, и мимо точки 106 кто-то пробежал.

Входные данные

В первой строке находятся два целых числа n и s (2 ≤ n ≤ 105, 2 ≤ s ≤ 106) — количество человек на прямой и скорость лучей.

В следующих n строках находятся описания людей. В i-й из этих строк находятся три целых числа xi, vi и ti (0 < xi < 106, 1 ≤ vi < s, 1 ≤ ti ≤ 2) — координата i-го человека на прямой, его максимальная скорость и направление, в котором он побежит (1 — влево, т.е. в сторону уменьшения координаты, и 2 — вправо, т.е. в сторону увеличения координаты), соответственно.

Гарантируется, что точки 0 и 106 будут когда-либо достигнуты людьми независимо от положения бомбы.

Выходные данные

Выведите минимальное время, за которое могут быть достигнуты обе точки 0 и 106.

Ваш ответ будет считаться правильным, если его абсолютная или относительная точность не превосходит 10 - 6. А именно, если ваш ответ равен a, а ответ жюри равен b, то ваш ответ будет зачтен, если .

Примечание

В первом примере оптимально поставить бомбу в точке с координатой 400000. Тогда в момент времени 0 скорость первого станет 1000 и он достигнет точки 106 в момент времени 600. На второго человека бомба не повлияет и он достигнет точки 0 в момент времени 500000.

Во втором примере оптимально поставить бомбу в точке с координатой 500000. Лучи догонят обоих людей в момент времени 200. В этот момент первый находится в точке с координатой 300000, а второй 700000. Их скорость станет равна 1500 и в момент времени 400 они одновременно пересекут точки 0 и 106.

D. Красно-черная паутина

Деревья разделяй и властвуй реализация Структуры данных *2800

Сластене очень нравится наблюдать за жизнью обитателей тенистой рощи, находящейся неподалеку от Мармеладного замка. На этот раз ее вниманием завладел странный красно-черный желейный паук, восседающий в центре огромной паутины.

Паутина странного паука представляет собой набор из n узлов, соединенных прочными нитями, каждая из которых покрашена либо в красный, либо в черный цвет. Используя эти нити, паук перемещается между узлами паутины, причем ни одна нить не соединяет узел с самим собой и для любых двух различных узлов существует единственная последовательность нитей, их соединяющая.

Как настоящий энтузиаст, Сластена начала исследовать замечательные свойства паутины. После нескольких часов наблюдения Сластена заметила, что каждая нить имеет собственное значение клейкости x, что само по себе удивительный факт.

Но больше всего Сластену интересует желейность данной паутины. Рассмотрим те из кратчайших путей между всеми парами узлов в паутине, на которых количество нитей каждого цвета отличается не более, чем вдвое. Для каждого такого пути посчитаем произведение клейкостей всех нитей на пути. Желейностью паутины Сластена называет произведение всех полученных величин по всем путям. Из путей, отличающихся только направлением движения, учитывается только один.

Естественно, данное число очень большое, а Сластена большие числа не любит. Поэтому она просит вас посчитать желейность данной паутины и вывести ответ по модулю 109 + 7.

Входные данные

В первой строке задано число узлов паутины n (2 ≤ n ≤ 105).

В следующих n - 1 строках следуют по четыре числа, описывающие i-ю нить паутины: узлы ui, vi (1 ≤ ui ≤ n, 1 ≤ vi ≤ n), клейкость нити xi (1 ≤ x ≤ 109 + 6), а также цвет нити ci (). Красный цвет задается числом 0, а черный цвет — числом 1.

Выходные данные

Выведите единственное число — желейность паутины по модулю 109 + 7. Если не существует путей таких, что число красных и черных нитей отличается не более, чем вдвое, выведите 1.

Примечание

В первом примере существует 4 пары узлов, количество нитей двух цветов между которыми отличается не более, чем вдвое. Это пары (1, 3) с произведением клейкостей на пути 45, (1, 5) с произведением клейкостей на пути 45, (3, 4) с произведением клейкостей на пути 25 и (4, 5) с произведением клейкостей на пути 25. Желейность такой паутины равняется 1265625.

A. Бесполезная игрушка

реализация *900

Прогуливаясь по улицам Зефирного города, Сластена увидела у уличных торговцев веселую бесполезную игрушку, нынче очень популярную в Sweetland — карамельный спиннер! Ей тоже захотелось приобщиться к всеобщему помешательству, поэтому она тут же приобрела себе сие чудо инженерной мысли.

Спиннер в королевстве Sweetland имеет вид V-образного кусочка карамели, способного вращаться вокруг невидимой магической оси. В каждый момент времени он может находиться в одном из четырех положений, каждое из которых повернуто на 90 градусов относительно предыдущего (причем после последнего положения снова следует первое):

При закручивании спиннера тот начинает вращение, описываемое следующим алгоритмом: спиннер сохраняет свое положение в течение одной секунды, а затем величественно огибает ось и принимает следующее по или против часовой стрелки положение в зависимости от стороны, в которую он был закручен. Процесс повторяется до тех пор, пока спиннер не остановится.

Сластене удалось закрутить спиннер так, что он сумел провращаться ровно n секунд. Будучи поражена элегантностью вращения чудного устройства, Сластена совсем забыла, в какую сторону она его закрутила! К ее счастью, она абсолютно точно запомнила начальное положение спиннера, и хочет восстановить направление вращения по имеющейся информации. Помогите ей это сделать.

Входные данные

В первой строке даны два символа, разделенные пробелом — начальное и конечное положения спиннера. Положение кодируется одним из четырех символов: v (ASCII-код 118, строчная v), < (ASCII-код 60), ^ (ASCII-код 94) и > (ASCII-код 62), соответствующих положениям на рисунке.

Во второй строке дано n (0 ≤ n ≤ 109) — число секунд, которое вращался спиннер.

Гарантируется, что конечное положение спиннера — результат его n-секундного вращения в том или ином направлении при данном начальном положении.

Выходные данные

Выведите cw, если Сластена закрутила спиннер по часовой стрелке, ccw — если против часовой, и undefined, если направление определить нельзя.

B. Торжественный вечер

реализация Структуры данных *1100

Конец июля — время, когда в Мармеладном замке проводится торжественный вечер! На него собираются гости со всего королевства, чтобы пообсуждать новейшие тенденции в мире сладостей. Однако обсуждаемая в этот вечер информация обладает некоторой долей секретности и, оказавшись в нехороших руках, может посеять раздор в королевстве Sweetland. Поэтому на вечер важно не пропустить незваных гостей.

Мармеладный замок оборудован 26 входами, пронумероваными от A до Z. Про каждого гостя известно, через какой из входов он должен войти — это сделано из соображений безопасности. Дверь каждого входа открывают прямо перед проходом первого гостя через нее, и закрывают сразу после прохода последнего, который должен пройти через эту дверь. Никакие два гостя не приходят одновременно.

Для того, чтобы через вход не смогли прошмыгнуть недоброжелатели, на открытый вход должен быть поставлен конфетный охранник. Таких в замке ровно k, поэтому если в какой-то конкретный момент открыты более чем k дверей, то некоторые из них будут без присмотра Обратите внимание, что охранник не может покинуть свой пост, пока соответствующая дверь открыта: он освобождается только после закрытия этой двери.

У Сластены закралось подозрение, что на вечер все-таки могли проникнуть незваные гости. Помогите ей проверить, были ли в какой-то момент открыты более чем k дверей одновременно, если известен порядок, в котором в замок попали все приглашенные на вечер люди.

Входные данные

В первой строке даны два числа n и k — количество гостей на вечере и количество охранников (1 ≤ n ≤ 106, 1 ≤ k ≤ 26).

В следующей строке находятся n заглавных букв латинского алфавита s1s2... sn, где si — вход, через который в замок попал i-й гость.

Выходные данные

Выведите «YES», если хотя бы одна из дверей осталась без присмотра во время вечера, и «NO» в противном случае.

Вы можете выводить каждую из букв в любом регистре (заглавную или строчную).

Примечание

В первом примере дверь входа A открывается перед приходом первого гостя и закрывается после прихода второго гостя, а дверь входа B открывается перед приходом третьего гостя и закрывается после прихода пятого. Охранник спокойно может обслужить обе двери, потому что первая закроется раньше, чем откроется вторая.

Во втором примере дверь B открывается перед приходом второго гостя, но единственный охранник не может покинуть дверь A, потому что третий гость должен через нее пройти.

C. Звёздное небо

дп реализация *1600

На небе задана декартова система координат. Там видно n звёзд, i-я имеет координаты (xi, yi), максимальную яркость c, общую для всех звёзд, и начальную яркость si (0 ≤ si ≤ c).

С течением времени звёзды мерцают. В момент времени 0 i-я звезда имеет яркость, равную начальной si. Пусть в момент времени t какая-то звезда имеет яркость x. Тогда в (t + 1)-й момент времени эта звезда будет иметь яркость x + 1, если x + 1 ≤ c, а иначе у неё будет яркость 0.

Вы хотите q раз посмотреть на небо. В i-й раз вы посмотрите в момент времени ti и увидите прямоугольник, стороны которого параллельны осям координат, левый нижний угол имеет координаты (x1i, y1i), а правый верхний — (x2i, y2i). Для каждого просмотра вы хотите узнать суммарную яркость звёзд, лежащих в просмотренном прямоугольнике.

Звезда лежит в прямоугольнике, если она лежит на его границе, либо лежит строго внутри него.

Входные данные

Первая строка содержит три целых числа n, q, c (1 ≤ n, q ≤ 105, 1 ≤ c ≤ 10) — количество звёзд, количество просмотров неба и максимальная яркость звёзд.

Следующие n строк содержат описание звёзд. i-я из этих строк содержит три целых числа xi, yi, si (1 ≤ xi, yi ≤ 100, 0 ≤ si ≤ c ≤ 10) — координаты i-й звезды и её начальная яркость.

Следующие q строк содержат описание участков неба. i-я из этих строк содержит пять целых чисел ti, x1i, y1i, x2i, y2i (0 ≤ ti ≤ 109, 1 ≤ x1i < x2i ≤ 100, 1 ≤ y1i < y2i ≤ 100) — момент времени i-го просмотра и координаты просмотренного прямоугольника.

Выходные данные

Для каждого просмотра выведите суммарную яркость просмотренных звёзд.

Примечание

Рассмотрим первый пример.

При первом просмотре видно только первую звезду. В момент времени 2 её яркость равна 3, поэтому ответ на этот запрос — 3.

При втором просмотре видно только вторую звезду. В момент времени 0 её яркость равна 0, поэтому ответ на этот запрос — 0.

При третьем просмотре видно обе звезды. В момент времени 5 яркость первой равна 2, а второй — 1, поэтому ответ на этот запрос — 3.

A. Громкость текста

реализация *800

Задан текст из слов, разделенных единичным пробелом. Каждое слово содержит только строчные и прописные латинские буквы.

Громкость слова — это количество прописных (заглавных) букв в этом слове. Громкость текста — это максимальная из громкостей слов в нем.

Посчитайте громкость заданного текста.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 200) — длина текста.

Во второй строке записан текст из слов, разделенных единичным пробелом, s1, s2, ..., si. Каждое слово состоит из строчных и прописных латинских букв.

Выходные данные

Выведите одно целое число — громкость заданного текста.

Примечание

В первом примере есть всего одно слово, в нем 5 прописных букв.

Во втором примере все слова содержат по 0 прописных букв.

B. Флаг Берляндии

Перебор реализация *1600

Флаг Берляндии представляет собой прямоугольное поле размера n × m. Для флага выполняются следующие условия:

  • Флаг раскрашен в три цвета, которые соответствуют буквам 'R', 'G' и 'B'.
  • Флаг состоит из трех равных по длине и ширине полос, параллельных друг другу и сторонам флага. Каждая полоса окрашена ровно в один цвет.
  • Каждый цвет должен быть использован ровно в одной полосе.

Задано прямоугольное поле размера n × m, состоящее только из символов 'R', 'G' и 'B'. Выведите "YES" (без кавычек), если данное поле представляет собой корректный флаг Берляндии. В противном случае, выведите "NO" (без кавычек).

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 100) — размеры поля.

В следующих n строках следуют по m символов 'R', 'G' и 'B' — описание поля.

Выходные данные

Если данная матрица представляет собой корректный флаг Берляндии, то выведите "YES" (без кавычек). В противном случае выведите, "NO" (без кавычек).

Примечание

В третьем примере нет трех параллельных линий.

Строки в поле из четвертого примера параллельны друг другу и сторонам матрицы. Однако, они имеют разную ширину — 2, 1 и 1, соответственно.

C. Две печати

Перебор реализация *1500

У одного очень важного человека есть лист бумаги в форме прямоугольника a × b.

Также у него есть n печатей, каждая из которых оставляет на бумаге оттиск — прямоугольник размера xi × yi. Печать надо ставить параллельно сторонам листа (но можно поворачивать на 90 градусов).

Очень важный человек хочет выбрать две любые различные печати и поставить ими два оттиска. Каждая из выбранных печатей ставит ровно один оттиск. Оттиски надо поставить так, чтобы они не пересекались (но они могут касаться сторонами), а суммарная занимаемая ими площадь была наибольшей. Какую наибольшую площадь можно занять двумя печатями?

Входные данные

Первая строка содержит три целых числа n, a и b (1 ≤ n, a, b ≤ 100).

Каждая из следующих n строк содержит два целых числа xi, yi (1 ≤ xi, yi ≤ 100).

Выходные данные

Выведите максимальную суммарную площадь, которую можно покрыть двумя печатями. Если две печати выбрать невозможно, выведите 0.

Примечание

В первом примере можно повернуть второй оттиск на 90 градусов. Потом разместить первый оттиск сразу под вторым и занять весь лист.

Во втором примере нельзя выбрать последний оттиск, так как он не поместится. Выбрав первый и третий оттиски, мы получим максимальную площадь.

В третьем примере не существует такой пары оттисков, что они оба могут поместиться на листе.

E. Васина функция

Бинарный поиск математика реализация *2100

Вася изучает теорию чисел. Он определил функцию f(a, b) следующим образом:

  • f(a, 0) = 0;
  • f(a, b) = 1 + f(a, b - gcd(a, b)), где gcd(a, b) это наибольший общий делитель a и b.

У Васи есть два числа x и y, и он хочет вычислить f(x, y). Он хотел сделать это сам, но его способ может занять слишком много времени. Так что он просит вас написать программу, с помощью которой можно посчитать эту функцию быстро.

Входные данные

Первая и единственная строка содержит два целых числа x и y (1 ≤ x, y ≤ 1012).

Выходные данные

Выведите f(x, y).

A. Арья и Бран

реализация *900

Бран и его старшая сестра Арья родом из одного дома. Бран очень любит конфеты, поэтому Арья собирается дать ему немного конфет.

Изначально у Арьи и Брана 0 конфет. В i-й из следующих n дней, Арья найдет ai конфет в коробке, которую ей даст Многоликий Бог. Каждый день она может отдать Брану не более 8 конфет. Если она не отдает конфеты в тот же день, они остаются у нее и она может отдать их позже.

Ваша задача — найти минимальное количество дней, которое потребуется Арье, чтобы дать Брану k конфет до конца n-го дня. Формально, требуется вывести минимальный номер дня к концу которого будут выданы k конфет (дни нумеруются от 1 до n).

Выведите -1, если за заданные n дней дать k конфет невозможно.

Входные данные

В первой строке дано 2 целых числа n и k (1 ≤ n ≤ 100, 1 ≤ k ≤ 10000).

Во второй строке дано n целых чисел a1, a2, a3, ..., an (1 ≤ ai ≤ 100).

Выходные данные

Если Арья не сможет дать Брану k конфет за n дней, выведите -1.

В противном случае выведите одно целое число — минимальное количество дней, которое потребуется Арье, чтобы дать Брану k конфет до конца n-го дня.

Примечание

В первом примере Арья может дать Брану 3 конфеты за 2 дня.

Во втором примере Арья может дать Брану 17 конфет за 3 дня, так как она может давать ему не более 8 конфет в день.

В третьем примере Арья не может дать Брану 9 конфет, так как она может давать ему не более 8 конфет в день и должна отдать конфеты за 1 день.

B. Игра рядов

жадные алгоритмы Перебор реализация *1900

Армия Дейенерис Таргариен состоит из k групп, i-я из групп состоит из ai солдат. Она хочет перевезти свою армию на другой берег моря, чтобы завладеть Железным троном. Для этого она купила самолет. В самолете n рядов по 8 мест. Будем называть места соседними, если они в одном ряду и это места {1, 2}, {3, 4}, {4, 5}, {5, 6}, {7, 8}.

Ряд в самолет

Дейенерис Таргариен хочет расположить свою армию так, чтобы солдаты из разных групп не сидели на соседних местах.

Ваша задача — определить, возможно ли рассадить её армию так, чтобы условие выше выполнялось.

Входные данные

Первоя строка содержит два целых числа n и k (1 ≤ n ≤ 10000, 1 ≤ k ≤ 100) — количество рядов и количество групп солдат, соответственно.

Вторая строка содержит k целых чисел a1, a2, a3, ..., ak (1 ≤ ai ≤ 10000), где ai обозначает количество солдат в i-й группе.

Гарантируется, что a1 + a2 + ... + ak ≤ 8·n.

Выходные данные

Если возможно расположить солдат в самолете, выведите «YES» (без кавычек). В противном случае выведите «NO» (без кавычек).

Вы можете выводить каждую из букв в любом регистре.

Примечание

В первом примере Дейенерис может расположить солдат как показано на картинке.

Во втором примере невозможно рассадить солдат, так как солдат из первой группы всегда будет сидеть на соседнем месте с кем-то из второй группы.

В третьем примере Дейенерис может расположить первую группу на местах (1, 2, 7, 8), а второю группу — на оставшиеся места.

В четвертом примере она может расположить первые две группы на места (1, 2) и (7, 8), третью группу на место (3), а четвертую группу — на места (5, 6).

C. Биатлон

Бинарный поиск реализация *1700

Пожалуй многие слышали о том, что недавно завершился чемпионат мира по биатлону. Хотя наш герой Валерий сам и не присутствовал на этом зрелищном мероприятии, а лишь наблюдал за ним по телевизору, оно так его привлекло, что он решил записаться в биатлонную секцию.

Разумеется, как впрочем и любой спорт, биатлон на практике оказался очень трудным, требующим много времени и усилий занятием. Тренировки, тренировки и тренировки — вот что ждало Валеру на его пути к великим биатлонным свершениям.

Что касается самих тренировок, вы все, наверно, знаете что каждый профессиональный биатлонист должен быстро бегать на лыжах и точно стрелять на огневом рубеже. Только в этом случае можно рассчитывать на успех, потому что бег и стрельба - две основные составляющие биатлона. Что касается лыжной подготовки, то Валеру можно смело похвалить, поскольку бегает он действительно быстро, а в меткости стрельбы ему похвастаться особо нечем.

На биатлонной базе, где Валера готовится к соревнованиям, расположено огромное стрельбище, на котором находится n мишеней. Каждая мишень имеет форму круга, а центры всех кругов расположены на оси Ох. На последней тренировке Валера сделал целых m выстрелов. Для того чтобы ему было проще следить за собственными результатами, одному небезызвестному программисту, которым, разумеется, являетесь вы, было поручено написать программу, которая бы сообщала, сколько и какие мишени Валера закрыл, а какие ему так и не удалось поразить. Более конкретно, для каждой мишени программа должна выдать номер первого успешного попадания в нее или «-1», если такого не оказалось. Мишень считается закрытой, если выстрел попал внутрь круга или на его границу. Он очень рассчитывает на вас, и, возможно, благодаря вам он когда-нибудь будет побеждать на международной арене.

Входные данные

В первой строке входного файла содержится целое число n (1 ≤ n ≤ 104) — количество мишеней. В последующих n строках содержатся описания мишеней. Каждая мишень представляет собой круг, центр которого расположен на оси Ox. Каждый круг задан координатой центра x ( - 2·104 ≤ x ≤ 2·104), а также своим радиусом r (1 ≤ r ≤ 1000). Гарантируется, что никакая пара мишеней не совпадает, не пересекается и не вкладывается друг в друга, однако может касаться.

В следующей строке содержится целое число m (1 ≤ m ≤ 2·105) — количество выстрелов. Последующие m строк содержат описания выстрелов, которые являются точками на плоскости, заданными своими координатами x и y ( - 2·104 ≤ x, y ≤ 2·104).

Все числа во входных данных целые.

Мишени и выстрелы нумеруются с единицы в том порядке, в котором они заданы во входных данных.

Выходные данные

В первой строке выведите единственное число — число закрытых Валерой мишеней. Во вторую строку для каждой из мишеней выведите номер первого в неё попадания или «-1» (без кавычек), если такого не существует. Числа разделяйте пробелами.

A. Щедрый Кефа

Перебор реализация *900

Как-то у себя в чулане Кефа нашёл n шариков. Для удобства обозначим цвет i-го шарика как si — строчная буква английского алфавита. У Кефы есть k друзей. Кефин друг обидится, если получит два шарика одного цвета. Кефа хочет раздать все шарики своим друзьям. Помогите Кефе узнать, сможет ли он раздать все шарики и при этом не обидеть своих друзей — выведите «YES», в случае положительного ответа, и «NO», иначе. Обратите внимание, что Кефин друг не обидится, если не получит ни одного шарика.

Входные данные

В первой строке входных данных содержатся два числа, разделенные одним пробелом, n и k (1 ≤ n, k ≤ 100) — количество шариков и количество друзей соответственно.

В следующей строке входных данных содержится строка s — цвета шариков.

Выходные данные

Ответ на задачу — «YES» или «NO» в единственной строке без кавычек.

Вы можете выводить каждую из букв в любом регистре.

Примечание

В первом примере Кефа может отдать 1-й и 3-й шарик первому другу, а 2-й и 4-й второму.

Во втором примере Кефа вынужден отдать каждому другу шарики цвета a, но при этом один останется, значит ответ «NO».

A. Сортировка подпоследовательностями

математика поиск в глубину и подобное реализация снм сортировки *1400

Дана последовательность a1, a2, ..., an, состоящая из различных целых чисел. Требуется разбить эту последовательность на максимальное число подпоследовательностей так, чтобы после сортировки по возрастанию чисел внутри каждой из них итоговая последовательность также оказалась отсортированной по возрастанию.

Под сортировкой по возрастанию чисел внутри подпоследовательности понимается процесс, в котором числа, входящие в подпоследовательность, упорядочиваются по возрастанию, а числа, не входящие в подпоследовательность, не меняют свои позиции.

При разбиении последовательности на подпоследовательности каждый элемент должен войти ровно в одну подпоследовательность.

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 105) — длину последовательности.

Вторая строка входных данных содержит n различных целых чисел a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — элементы последовательности. Гарантируется, что все элементы последовательности различны.

Выходные данные

В первой строке выведите максимальное число подпоследовательностей k, на которое можно разбить исходную последовательность, выполнив условие задачи.

В следующих k строках выведите описание подпоследовательностей в следующем формате: количество элементов в подпоследовательности ci (0 < ci ≤ n), а затем ci целых чисел l1, l2, ..., lci (1 ≤ lj ≤ n) — индексы этих элементов в исходной последовательности.

Индексы можно выводить в любом порядке. Каждый индекс от 1 до n должен присутствовать в выводе ровно один раз.

Если возможных ответов несколько, выведите любой из них.

Примечание

Пояснение к ответу на первый сэмпл:

После сортировки первой подпоследовательности мы получим последовательность 1 2 3 6 5 4.

После сортировки второй подпоследовательности ничего не изменится.

После сортировки третьей подпоследовательности мы получим последовательность 1 2 3 4 5 6.

После сортировки последней подпоследовательности ничего не изменится.

A. Разнообразие

жадные алгоритмы реализация Строки *1000

Вычислите, какое наименьшее число символов надо поменять в строке s, чтобы в ней стало не менее k различных букв, либо выведите, что это сделать невозможно.

Строка s состоит только из маленьких латинских букв, и заменять буквы можно также только на маленькие латинские.

Входные данные

Первая строка входных данных содержит строку s, состоящую только из маленьких латинских букв (1 ≤ |s| ≤ 1000, |s| означает длину строки s).

Вторая строка входных данных содержит целое число k (1 ≤ k ≤ 26).

Выходные данные

Выведите одну строчку с минимальным количеством букв, которые необходимо заменить, либо слово «impossible» (без кавычек), если это сделать невозможно.

Примечание

В первом примере в строке есть 6 различных букв, поэтому ничего менять не требуется.

Во втором примере в строке изначально есть 4 различных буквы: {'a', 'h', 'o', 'y'}. Для получения 5 различных букв необходимо заменить одну из букв 'o' на букву, которая в строке не встречается, например на {'b'}.

В третьем примере получить 7 различных букв невозможно, поскольку длина строки 6.

A. Шахматный турнир

реализация сортировки *1100

Совсем скоро в Берляндии пройдет шахматный турнир!

В турнире примут участие n шахматистов, которые будут разделены на две команды по n шахматистов в каждой. Первую команду будет спонсировать госкорпорация БерНефть, а вторую — БерЖКХ. По замыслу организаторов, конечно, должна победить команда БерНефти!

Таким образом, перед организаторами стоит задача разделить всех n шахматистов на две команды по n шахматистов в каждой так, чтобы наверняка победила первая команда.

Каждый шахматист характеризуется своим рейтингом ri. Известно, что шахматист с большим рейтингом всегда побеждает шахматиста с меньшим рейтингом. Если рейтинги равны, то победить может любой из шахматистов.

После распределения по командам будет проведена жеребьевка в процессе которой будут сформированы n пар соперников: в каждой паре — один шахматист из первой команды и один из второй. Каждый шахматист должен попасть ровно в одну пару. Каждая пара сыграет ровно одну партию. Жеребьевка осуществляется случайным образом.

Возможно ли организаторам так разбить всех n шахматистов на две команды по n шахматистов в каждой, что независимо от результатов жеребьевки в каждой шахматной партии победит шахматист из первой команды?

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100).

Во второй строке записаны n целых чисел a1, a2, ... a2n (1 ≤ ai ≤ 1000).

Выходные данные

Если возможно так разбить всех n шахматистов на две команды по n шахматистов в каждой, что независимо от результатов жеребьевки в каждой шахматной партии победит шахматист из первой команды, то выведите «YES». Иначе выведите «NO».

B. Люба и билет

жадные алгоритмы Перебор реализация *1600

У Любы есть билет, состоящий из 6 цифр. За один ход она может выбрать цифру в любой позиции и заменить её на произвольную другую цифру.

Люба хочет узнать, какое минимальное количество цифр в билете ей необходимо изменить, чтобы он стал счастливым.

Напомним, что билет является счастливым, если сумма первых трёх его цифр равняется сумме последних трёх его цифр.

Входные данные

Во входных данных задана строка, состоящая ровно из 6 символов, являющихся цифрами от 0 до 9 — номер билета Любы. Номер билета может начинаться с цифры 0.

Выходные данные

Выведите единственное число — минимальное количество цифр, которые необходимо изменить в билете, чтобы он стал счастливым.

Примечание

В первом примере билет уже является счастливым, поэтому ответ на тест — 0.

Во втором примере можно заменить цифры 4 и 5 на два нуля и получить счастливый билет. Можно легко увидеть, что ответа меньше добиться нельзя.

В третьем примере можно заменить любой ноль на 3. Очевидно, что невозможно добиться более оптимального ответа.

A. Резюме

Перебор реализация *1500

Хидэо Кодзима вот только уволился из Конами. Сейчас он ищет себе новое место работы. Несмотря на то, что Хидэо довольно известный человек, ему все еще нужно резюме для трудоустройства.

В течение своей продолжительной карьеры Хидэо принял участие в разработке n игр. Некоторые из них вышли крайне успешными, некоторые оказались не столь качественными. Хидэо хочет удалить несколько игр (возможно ни одной) из своего резюме, чтобы произвести лучшее впечатление на работодателей. В результате в его резюме никакая неудачная игра не должна идти сразу после удачной игры.

Более формально, задан массив s1, s2, ..., sn из нулей и единиц. Ноль соответствует неуспешной игре, единица — успешной. Игры заданы в том порядке, в каком они были изданы, Хидэо не имеет права менять местами какие-либо значения. Он хочет удалить некоторые элементы так, чтобы не существовало нулевого элемента, который стоит сразу после единичного.

Кроме того, Хидэо в резюме хочет упомянуть как можно больше игр. Помогите гению узнать максимальное количество игр, которые он может оставить в своем резюме.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100).

Во второй строке записаны n целых чисел, разделенные пробелами, s1, s2, ..., sn (0 ≤ si ≤ 1). 0 соответствует неуспешной игре, 1 — успешной.

Выходные данные

Выведите единственное целое число — максимальное количество игр, которые Хидэо может оставить в своем резюме так, чтобы никакая неудачная игра не шла сразу после удачной игры.

A. Объединение двусвязных списков

реализация *1500

Двусвязный список — одна из фундаментальных структур данных. Двусвязный список представляет собой последовательность элементов, в каждом из которых содержится информация о предыдущем и следующем элементах списка. В этой задаче все списки имеют линейную структуру: то есть у каждого элемента списка кроме первого есть ровно один предыдущий элемент, у каждого элемента списка кроме последнего есть ровно один следующий элемент, список не замкнут в цикл.

В этой задаче вам даны n ячеек памяти, образующие один или более двусвязных списков. Каждая ячейка памяти содержит информацию об элементе одного из списков. Ячейки памяти пронумерованы от 1 до n.

Для каждой ячейки памяти i известен номер ячейки, в которой содержится предыдущий элемент списка (величина li) и номер ячейки, в которой содержится следующий элемент списка (величина ri). Если ячейка памяти i содержит информацию о таком элементе, у которого нет предыдущего элемента в списке, то li = 0. Аналогично, если ячейка памяти i содержит информацию о таком элементе, у которого нет следующего элемента в списке, то ri = 0.

На рисунке изображены три списка.

Например, для рисунка выше значения l и r следующие: l1 = 4, r1 = 7; l2 = 5, r2 = 0; l3 = 0, r3 = 0; l4 = 6, r4 = 1; l5 = 0, r5 = 2; l6 = 0, r6 = 4; l7 = 1, r7 = 0.

Объедините все заданные списки в один, подсоединив их друг к другу в любом порядке. В частности, если входные данные уже содержат один список, то каких-либо действий производить не надо. Выведите результирующий список в виде пар значений li, ri.

Каких-либо других действий, кроме как подсоединений начала одного списка к концу другого, совершать нельзя.

Входные данные

Первая строка входных данных содержит целое число n (1 ≤ n ≤ 100) — количество ячеек памяти, в которых расположены двусвязные списки.

Следующие n строк содержат по два целых числа li, ri (0 ≤ li, ri ≤ n) — номера ячеек памяти предыдущего и следующего элемента списка для ячейки памяти i. Величина li = 0, если у элемента ячейки памяти i нет предыдущего элемента в его списке. Величина ri = 0, если у элемента ячейки памяти i нет следующего в его списке.

Гарантируется, что входные данные содержат описание одного или более двусвязных списков. Все списки имеют линейную структуру: то есть у каждого элемента списка кроме первого есть ровно один предыдущий элемент, у каждого элемента списка кроме последнего есть ровно один следующий элемент, список не замкнут в цикл. Каждая ячейка памяти содержит информацию об одном элементе некоторого списка, каждый элемент каждого списка записан в одной из n заданных ячеек.

Выходные данные

Выведите n строк, i-я из строк должна содержать величины li и ri — номера ячеек памяти предыдущего и следующего элемента списка для ячейки памяти i после объединения всех списков из входных данных в один. Если решений несколько, выведите любое из них.

G. Пары в университете

реализация *900

В университете учится n групп студентов. В течение учебного дня у каждой группы может состояться не более 7 пар. Для этого выделено семь временных слотов, пронумерованных от 1 до 7.

Для каждой группы известно её расписание на понедельник, то есть известны временные слоты, в которые будут проходить пары у этой группы.

Ваша задача — определить минимальное количество аудиторий, необходимых для проведения пар у всех групп в понедельник. Учитывайте, что в один и тот же слот в одной аудитории может заниматься не более одной группы.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 1000) — количество групп.

В каждой из следующих n строк содержится последовательность из 7 нулей и единиц — расписание занятий в понедельник для очередной группы. Если символ на некоторой позиции равен 1, то у группы есть пара в соответствующий временной слот. В противном случае, этой пары у группы нет.

Выходные данные

Выведите минимальное количество аудиторий, необходимых для проведения пар у всех групп в понедельник.

Примечание

В первом примере достаточно одной аудитории, которая будет занята в каждый из семи временных слотов либо первой группой, либо второй.

Во втором примере нужно три аудитории, так как в седьмой временной слот пара есть у всех трёх групп.

I. Уровень шума

математика поиск в глубину и подобное реализация *1900

Столица Берляндии имеет вид прямоугольника размером n × m кварталов. Все кварталы делятся на три типа:

  • обычные (обозначаются символом '.') — такие кварталы сами не производят шума, но не являются препятствиями для распространения шума;
  • источники шума (обозначаются заглавными латинскими буквами от 'A' до 'Z') — такие кварталы являются источниками шума и не являются препятствиями для распространения шума;
  • сильно застроенные (обозначаются символом '*') — такие кварталы являются шумоизолированными, в них не проникает шум, и они сами являются препятствиями для распространения шума.

Квартал, который обозначается буквой 'A', производит q единиц шума. Квартал, который обозначается буквой 'B', производит q единиц шума. И так далее, вплоть до квартала, обозначаемого буквой 'Z', который производит 26·q единиц шума. В городе может располагаться произвольное количество кварталов, обозначаемых одинаковыми буквами.

При распространении от источника при переходе к соседнему по стороне кварталу шум затихает в два раза (при делении следует округлять вниз). Шум распространяется по цепочке. Например, если квартал расположен на расстоянии 2 от источника шума, то величина шума, который дойдёт до квартала, делится на 4. Таким образом, уровень шума, дошедший от источника к кварталу определяется исключительно длиной кратчайшего пути между ними. Сильно застроенные кварталы являются препятствиями, шум в них не проникает.

Значения в ячейках таблицы справа показывают суммарный уровень шума в соответствующих кварталах для q = 100, первое слагаемое — шум от квартала 'A', второе слагаемое — шум от квартала 'B'.

Уровень шума в квартале определяется как сумма шумов от всех источников. Для оценки качества жизни населения столицы Берляндии требуется найти количество кварталов, уровень шума в которых превышает допустимую норму p.

Входные данные

В первой строке содержатся четыре целых числа n, m, q и p (1 ≤ n, m ≤ 250, 1 ≤ q, p ≤ 106) — размеры столицы Берляндии, количество единиц шума, которое производит квартал 'A', и допустимая норма шума.

В следующих n строках содержится по m символов — описание кварталов столицы в соответствии с условием. Возможно, что в столице Берляндии отсутствуют кварталы любого из трёх типов.

Выходные данные

Выведите количество кварталов, уровень шума в которых превышает допустимую норму p.

Примечание

Иллюстрация к первому примеру находится в основной части условия задачи.

K. Проездные билеты

жадные алгоритмы реализация сортировки *1800

Вечером Поликарп решил проанализировать свои сегодняшние расходы на поездки в общественном транспорте.

Автобусная сеть в столице Берляндии устроена таким образом, что каждый автобус курсирует по маршруту между двумя конечными остановками. Промежуточных остановок у автобуса нет. Таким образом, каждый из автобусов непрерывно курсирует по маршруту от одной конечной остановки до другой и назад. Между парой остановок курсирует не более одного автобуса.

Поликарп совершил n поездок на автобусе, каждая из которых задается названием остановки, откуда он уехал, и названием остановки, куда он приехал. В записях Поликарпа поездки следуют в хронологическом порядке.

Известно, что одна поездка на автобусе любого маршрута стоит a бурлей. Однако, если пассажир совершает пересадку, то цена поездки уменьшается до b бурлей (b < a). Считается, что пассажир совершает пересадку, если остановка, на которой он садится в автобус, совпадает с остановкой, на которой он вышел из предыдущего автобуса. Очевидно, что первая поездка не может быть совершена после пересадки.

Например, если Поликарп совершил последовательно три поездки: «BerBank» «University», «University» «BerMall», «University» «BerBank», то он заплатит a + b + a = 2a + b бурлей. Из BerBank он приехал в University, там пересел и поехал в BerMall. Затем он прошёл пешком до University и вернулся в BerBank.

Поликарп мог купить не более чем k проездных по цене f бурлей за один проездной. Проездной покупается для одного автобусного маршрута и делает любую поездку по этому маршруту (в любом направлении) бесплатной. Единожды купленный проездной может использоваться неограниченное количество раз любом из двух направлений.

Какую наименьшую сумму денег мог потратить Поликарп сегодня, если бы приобрел не более k проездных оптимальным образом?

Входные данные

В первой строке записаны пять целых чисел n, a, b, k, f (1 ≤ n ≤ 300, 1 ≤ b < a ≤ 100, 0 ≤ k ≤ 300, 1 ≤ f ≤ 1000), где:

  • n — количество поездок Поликарпа,
  • a — цена одной обычной поездки,
  • b — цена одной поездки после пересадки,
  • k — максимальное количество проездных,
  • f — цена одного проездного.

Далее следуют n строк, описывающие поездки в порядке их совершения. Каждая строка содержит ровно два различных слова, разделенных единичным пробелом — название стартовой остановки и название финальной остановки для очередной поездки Поликарпа. Все названия состоят из прописных и строчных букв латинского алфавита, содержат от 1 до 20 букв. Прописные и строчные буквы следует считать различными.

Выходные данные

Выведите наименьшую сумму денег, которую Поликарп мог потратить сегодня, если бы приобрел не более k проездных оптимальным образом.

Примечание

В первом примере Поликарп может купить проездной на маршрут «BerBank University», потратив 8 бурлей. Заметим, что его вторая поездка «University» «BerMall» совершается после пересадки; следовательно, за эту поездку он заплатит 3 бурля. Таким образом, искомая сумма денег равна 8 + 3 = 11 бурлей.

Во втором примере Поликарпу невыгодно покупать проездные. Заметим, что каждая его поездка, кроме первой, совершена после пересадки. Следовательно, искомая сумма денег равна 2 + 1 + 1 + 1 = 5 бурлей.

M. Погода на завтра

математика реализация *1000

Вася придумал свою систему прогнозирования погоды. Он знает информацию о средней температуре воздуха в каждый из последних n дней. Считайте, что средняя температура в каждый из дней — целое число.

Вася считает, что если средние температуры за последние n дней составляют арифметическую прогрессию, в которой первый член равен средней температуре в первый день, второй член равен средней температуре во второй день и так далее, то температура в следующий, (n + 1)-й день будет равна следующему члену арифметической прогрессии. В противном случае, как считает Вася, температура в (n + 1)-й день будет равна температуре в n-й день.

Перед вами стоит задача помочь Васе предсказать среднюю температуру на завтра, то есть в (n + 1)-й день.

Входные данные

В первой строке содержится целое число n (2 ≤ n ≤ 100) — количество дней, для которых известна информация о средней температуре.

Во второй строке содержится последовательность целых чисел t1, t2, ..., tn ( - 1000 ≤ ti ≤ 1000), где ti — средняя температура воздуха в день i.

Выходные данные

Выведите среднюю температуру воздуха в день (n + 1), которую предскажет Вася согласно своему алгоритму. Обратите внимание, что абсолютная величина предсказанной температуры может превышать 1000.

Примечание

В первом примере последовательность средних температур представляет собой арифметическую прогрессию, в которой первый член равен 10, а каждый следующий уменьшается на 5. Поэтому предсказанная температура в шестой день  - 10 - 5 =  - 15.

Во втором примере последовательность средних температур представляет собой арифметическую прогрессию, в которой первый член равен 1, а каждый следующий равен предыдущему. Поэтому предсказанная температура в пятый день также будет равна 1.

В третьем примере средние температуры не составляют арифметическую прогрессию, поэтому температура в четвёртый день равна температуре в третий день, то есть  - 5.

В четвёртом примере последовательность средних температур представляет собой арифметическую прогрессию, в которой первый член равен 900, а следующий увеличен на 100. Поэтому предсказанная температура в третий день 1000 + 100 = 1100.

B. Rooter's Song

геометрия Конструктив реализация сортировки Структуры данных *1900

Куда бы мы не шли, кого бы не нашли, на нашем месте, исполним эту песню вместе!

На плоскости расположена прямоугольная сцена размера w × h с вершинами в точках (0, 0), (w, 0), (w, h) и (0, h).

По краям сцены находятся n танцоров. i-й из них относится к одной из следующих групп:

  • Вертикальные: стоит в (xi, 0), двигается в положительном направлении y (вверх);
  • Горизонтальные: стоит в (0, yi), двигается в положительном направлении x (вправо).

В соответствии с планом танца, i-й танцор должен стоять на месте первые ti миллисекунд, а затем начать двигаться в заданном направлении со скоростью 1 единица в миллисекунду, пока не достигнет другого края сцены. Никакие два танцора не имеют одновременно совпадающую группу, позицию и время ожидания.

Когда два танцора сталкиваются (т.е. находятся в одной точке, и оба из них двигаются), они мгновенно обмениваются направлениями движения и продолжают двигаться.

Танцоры останавливаются, как только они достигнут границы. Найдите точку остановки для каждого танцора.

Входные данные

Первая строка содержит три целых числа n, w и h (1 ≤ n ≤ 100 000, 2 ≤ w, h ≤ 100 000) — число танцоров, ширина и высота сцены, соответственно.

Каждая из следующих n строк описывает танцора: i-я из них содержит три целых числа gi, pi и ti (1 ≤ gi ≤ 2, 1 ≤ pi ≤ 99 999, 0 ≤ ti ≤ 100 000), описывающие группу танцора gi (gi = 1 — вертикальные, gi = 2 — горизонтальные), позицию, и время ожидания. Если gi = 1, то pi = xi; иначе pi = yi. Гарантируется, что 1 ≤ xi ≤ w - 1 и 1 ≤ yi ≤ h - 1. Гарантируется, что никакие два танцора не имеют одинаковую группу, позицию и время одновременно.

Выходные данные

Выведите n строк, i-я из которых содержит два целых числа (xi, yi) — позицию остановки i-го танцора.

Примечание

Первый пример соответствует начальной расстановке, показанной в условии, траектории танцоров показаны различными цветами на следующем рисунке.

Во втором примере никакие танцоры не сталкиваются.

A. Odds and Ends

реализация *1000

Где у нас есть шансы? И где у нас их нет? Где явится надежда, и будет ли навек?

Вам дана последовательность целых чисел a1, a2, ..., an длины n. Определите, можно ли разделить ее на нечетное число непустых подотрезков, каждый из которых имеет нечетную длину, и начинается и заканчивается нечетным числом.

Подотрезком называется часть элементов последовательности, идущие друг за другом. Например, {3, 4, 5} и {1} являются подотрезками последовательности {1, 2, 3, 4, 5, 6}, а {1, 2, 4} и {7} — нет.

Входные данные

В первой строке находится одно целое число n (1 ≤ n ≤ 100) — длина последовательности.

Во второй строке находятся n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 100) — элементы последовательности.

Выходные данные

Выведите «Yes», если возможно выполнить требования, и «No» иначе.

Вы можете выводить каждую из букв в любом регистре (заглавную или строчную).

Примечание

В первом примере можно разделить последовательность на 1 подотрезок: {1, 3, 5}, и все условия будут выполнены.

Во втором примере, например, можно разделить на 3 подотрезка: {1, 0, 1}, {5}, {1}.

В третьем примере один из подотрезков должен начинаться с числа 4, которое является четным, а значит, условия не могут быть выполнены.

В четвертом примере, последовательность может быть разделена на 2 подотрезка: {3, 9, 9}, {3}, но это не является решением, так как 2 — четное число.

A. Домино

Конструктив реализация *1300

Широко известна задача о количестве замощений доминошками размера 1 × 2 поля размера 2 × n. Возможно, вы помните, что она сводится к числам Фибоначчи. Ниже речь пойдет о другой задаче, в которой вам тоже предстоит иметь дело с замощениями доминошками прямоугольного поля.

Задано прямоугольное поле размера 4 × n, то есть такое, которое содержит четыре строки и n столбцов. Требуется найти любое такое его замощение доминошками 1 × 2, что каждый из n - 1 возможных вертикальных разрезов по линиям сетки пересекает хотя бы одну доминошку, разделяя ее пополам. Никакие две доминошки в искомом замощении не должны накладываться, каждая клетка поля должна быть покрыта ровно одной доминошкой. Доминошки разрешается поворачивать, то есть можно использовать как доминошки 2 × 1, так и 1 × 2.

Напишите программу, которая находит произвольное искомое замощение.

Входные данные

В первой строке дано одно натуральное число n (1 ≤ n ≤ 100) — количество столбцов поля.

Выходные данные

Если решения не существует, выведите «-1» (без кавычек). Иначе выведите четыре строки по n символов в каждой — описание замощения, в котором каждый вертикальный разрез пересекает хотя бы одну доминошку. Замощение следует выводить, раскрасив поле в не более чем 26 цветов. Каждую доминошку нужно покрасить в один цвет. Разные доминошки могут быть покрашены в один и тот же цвет, но доминошки одного цвета не должны касаться по стороне. Для обозначения цветов нужно использовать строчные буквы латинского алфавита. Выведите любой из допустимых способов замощения.

D. Сумма медиан

Бинарный поиск Перебор реализация Структуры данных *2300

В одном небезызвестном алгоритме нахождения k-порядковой статистики нужно разбить все элементы на пятерки подряд идущих элементов и найти медиану каждой пятерки. Медианой называют средний элемент отсортированного массива (для пятерки — это третий по величине элемент). Для оценки скорости работы этого алгоритма на современной видеокарте требуется уметь находить сумму медиан в каждой пятерке упорядоченного множества.

Суммой медиан отсортированного k-элементного множества S = {a1, a2, ..., ak}, где a1 < a2 < a3 < ... < ak, будем называть

Оператор обозначает взятие остатка, то есть обозначает остаток при делении x на y.

Для проведения нагрузочного тестирования потребовалось быстро вычислять сумму медиан для изменяющегося множества.

Входные данные

В первой строке задано число n (1 ≤ n ≤ 105) — количество операций, производимых с множеством.

Далее в каждой из n строк описана одна из трех операций:

  • add x — добавить в множество элемент x;
  • del x — удалить из множества элемент x;
  • sum — найти сумму медиан множества.

Для любой операции add x верно, что элемент x непосредственно перед операцией не входит в множество.

Для любой операции del x верно, что элемент x непосредственно перед операцией входит в множество.

Все числа во входных данных — положительные целые числа, не превосходящие 109.

Выходные данные

Для каждой операции sum выведите на отдельной строке сумму медиан текущего множества. Если множество пусто, то выведите 0.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать потоки cin, cout (также вы можете использовать спецификатор %I64d).

B. Арпа и список чисел

реализация теория чисел *2100

Арпа нашел список из n чисел. Он считает, что список плохой, если и только если он не пустой и НОД (см. примечания для пояснения) чисел в списке равен 1.

Арпа может выполнять следующие два типа операций:

  • Выбрать число и удалить его, стоимость операции равна x,
  • Выбрать число и увеличить его на 1, стоимость операции равна y.

У Арпы нет ограничений на количество применений второй операции на одно и то же число.

Помогите Арпе найти минимально возможную стоимость сделать список хорошим.

Входные данные

Первая строка содержит три целых числа n, x и y (1 ≤ n ≤ 5·105, 1 ≤ x, y ≤ 109) — число элементов в списке и числа x и y.

Вторая строка содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 106) — элементы списка.

Выходные данные

Выведите одно число: минимальную стоимость сделать лист хорошим.

Примечание

В первом примере число 1 должно быть удалено (со стоимостью 23), а число 16 должно быть увеличено на 1 (со стоимостью 17).

НОД (наибольший общий делитель) множества чисел равняется максимальному целому числу, которое делит все числа из множества. Больше информации о НОД здесь.

A. Арпа и исследования мексиканской волны

математика реализация *800

Арпа исследует мексиканскую волну.

На стадионе n зрителей, пронумерованных от 1 до n. они начинают мексиканскую волну в момент времени 0.

  • В момент времени 1 встает первый зритель.
  • В момент времени 2, встает второй зритель.
  • ...
  • В момент времени k, встает k-й зритель встает.
  • В момент времени k + 1 встает (k + 1)-й зритель, а первый — садится.
  • В момент времени k + 2 встает (k + 2)-й зритель, а второй — садится.
  • ...
  • В момент времени n встает n-й зритель, а (n - k)-й зритель садится.
  • В момент времени n + 1 садится (n + 1 - k)-й зритель.
  • ...
  • В момент времени n + k садится n-й зритель.

Арпа хочет узнать, сколько людей стоит в момент времени t.

Входные данные

В первой строке находятся три целых числа n, k, t (1 ≤ n ≤ 109, 1 ≤ k ≤ n, 1 ≤ t < n + k).

Выходные данные

Выведите одно целое число: число стоящих зрителей в момент времени t.

Примечание

Далее сидящий зритель обозначен как -, а стоящий — как ^.

  • При t = 0  ---------- число стоящих зрителей равно 0.
  • При t = 1  ^--------- число стоящих зрителей равно 1.
  • При t = 2  ^^-------- число стоящих зрителей равно 2.
  • При t = 3  ^^^------- число стоящих зрителей равно 3.
  • При t = 4  ^^^^------ число стоящих зрителей равно 4.
  • При t = 5  ^^^^^----- число стоящих зрителей равно 5.
  • При t = 6  -^^^^^---- число стоящих зрителей равно 5.
  • При t = 7  --^^^^^--- число стоящих зрителей равно 5.
  • При t = 8  ---^^^^^-- число стоящих зрителей равно 5.
  • При t = 9  ----^^^^^- число стоящих зрителей равно 5.
  • При t = 10 -----^^^^^ число стоящих зрителей равно 5.
  • При t = 11 ------^^^^ число стоящих зрителей равно 4.
  • При t = 12 -------^^^ число стоящих зрителей равно 3.
  • При t = 13 --------^^ число стоящих зрителей равно 2.
  • При t = 14 ---------^ число стоящих зрителей равно 1.
  • При t = 15 ---------- число стоящих зрителей равно 0.

A. Цифры

математика Перебор реализация *2500

Джон задал Джеку очень сложную задачу. Он написал огромное положительное число A0 на кусочек бумаги. Это число не превосходит 10200000. На каждом шагу Джек может написать знаки ' + ' между некоторыми цифрами текущего числа (возможно, ни одного) и вычислить сумму выражения. Затем он может выполнить такую же операцию над получившейся суммой, и так далее. Получившиеся суммы обозначаются A1, A2 и так далее. Его задача состоит в том, чтобы в итоге получить число из одной цифры.

Проблема в том, что на кусочке бумаги не так уж и много места. Там осталось место только для трех строчек, поэтому Джек не может сделать больше трех операций. Он хочет использовать всю бумагу, поэтому он должен выполнить ровно три операции.

Джек не может добавлять лидирующие нули к промежуточным результатам, но он может писать знак ' + ' перед цифрами 0. Например, если текущее число равно 1000100, то 10 + 001 + 00 является корректным шагом, результат которого равняется 11.

Входные данные

Первая строка содержит одно целое число N (1 ≤ N ≤ 200000) — число цифр в A0.

Вторая строка содержит целое число A0 из N цифр без лидирующих нулей.

Выходные данные

Выведите ровно три строки. Каждая строка будет шагом, выполненным Джеком. Результатом третьего шага должно быть однозначное число.

Каждый шаг должен состоять из цифр и знаков ' + '. Шаги не должны содержать несколько знаков ' + ' подряд, пробелов, а также знаков ' + ' перед первой и после последней цифры. Кроме того, они должны быть арифметически согласованными.

Возможно, что решение не единственно. В таком случае, выведите любое из них.

Примечание

В первом примере Джек не может нигде поставить знак ' + ', поэтому он просто пишет 1 в каждой из строк и решает задачу. В этом случае решение единственно.

Во втором примере Джек сначала пишет знаки ' + ' между каждой парой последовательных цифр, получая результат 5 + 8 + 0 + 6 = 19. Он делает то же на втором шаге, получая 1 + 9 = 10. Затем он пишет 1 + 0 = 1, поэтому после трех шагов результат равен 1 и его решение корректно.

G. Терминал в ванной комнате

реализация *1700

Смит проснулся в углу грязной, давно не использовавшейся ванной комнаты. Его щиколотки пристегнуты цепями к трубам. Рядом с ним лежит кассетный проигрыватель, на нем надпись от руки: «Послушай меня». Он находит кассету в его заднем кармане. После того, как он вставил кассету в проигрыватель, он видит ключ, свисающий с потолка, прицепленный к некой машине, которая подключена к терминалу рядом с ним. После того, как он нажал «Play», зазвучал грубый голос:

«Слушай, Смит. Как ты можешь видеть, ты в достаточно тяжелой ситуации, чтобы спастись, тебе надо отгадать загадку.

Тебе даны N строк, которые описывают слова. Каждое слово имеет максимальную длину L и состоит из символов от «a» до «e». Тебе также даны M строк, которые описывают шаблоны.

Шаблон — это строка длины  ≤  L, состоящая из символов от «a» до «e», а так же не более 3 символов «?». Символ «?» — неизвестный символ, что значит, что он может быть равен любому из символов от «a» до «e», а также пустому символу.

Для каждого шаблона найди число слов, которые соответствуют данному шаблону. После того, как ты решишь задачу и введешь ответы в терминал, ключ упадет с потолка и ты сможешь убежать. Да начнется игра.»

Помогите Смиту спастись.

Входные данные

Первая строка содержит два целых числа N и M (1 ≤ N ≤  100 000, 1 ≤ M ≤  5000) — число слов и число шаблонов, соответственно.

Следующие N строк содержат слова, после этих N строк, следуют M строк, описывающих шаблоны. Каждое слово и каждый шаблон имеют максимальную длину L (1 ≤ L ≤ 50). В каждом шаблоне есть не более трех символов «?». Каждый шаблон содержит не более трех символов «?». Все другие символы в словах и шаблонах являются строчными латинскими буквами от «a» до «e».

Выходные данные

Выведите M строк, в каждой — одно число, описывающее число слов, которые соответствуют очередному шаблону.

Примечание

Если мы изменим '?' на 'b', 'e' и пустой символ, мы получим 'abc', 'aec' и 'ac', соответственно.

A. Дневник Тома Реддла

Перебор реализация Строки *800

Гарри Поттер стремится уничтожить крестражи Сами-Знаете-Кого. Первый крестраж, о котором Гарри узнал из Тайной Комнаты — это дневник Тома Реддла. Он был у Джинни и заставил её открыть Тайную Комнату. Гарри хочет узнать, как много разных людей видели дневние, чтобы убедиться, что они не находятся под его влиянием.

У него есть n имён людей, которые видели дневник в порядке, в котором они читали его. Гарри хочет для каждого человека узнать, видел ли он дневник ранее.

Формально, для имени si в i-й строке, выведите «YES» (без кавычек) если существует индекс j, такой что si = sj и j < i, иначе выведите «NO» (без кавычек).

Входные данные

В первой строке ввода содержится целое число n, (1 ≤ n ≤ 100) — количество имён в списке.

Затем следуют n строк, в каждой из которых содержится имя si, состоящее из строчных букв английского алфавита. Длина каждой строки находится в пределах от 1 до 100.

Выходные данные

Выведите n строк, в каждой из которых выведите «YES» или «NO» (без кавычек), в зависимости от того, встречалось ли это имя ранее.

Вы можете вывести любую букву как заглавной, так и строчной.

Примечание

В примере 1 для i = 5 существует j = 3 такое, что si = sj и j < i, поэтому ответ для i = 5 равен «YES».

B. Какой этаж?

Перебор реализация *1500

В доме Поликарпа на каждом этаже одинаковое количество квартир. К сожалению, Поликарп не помнит, сколько именно квартир на каждом этаже, зато он помнит, что квартиры пронумерованы от 1 снизу вверх. Таким образом, в нумерации сначала идут квартиры первого этажа, затем второго и так далее. Поликарп не помнит точное количество квартир в доме, вы можете считать дом бесконечно высоким (то есть содержащим бесконечное количество квартир). Обратите внимание, этажи нумеруются с 1.

Про некоторые квартиры Поликарп помнит, на каких этажах они расположены. Гарантируется, что воспоминания Поликарпа непротиворечивы. То есть существует дом с одинаковым количеством квартир на каждом этаже, такой что квартиры из воспоминания Поликарпа имеют те этажи, которые он запомнил.

Может ли он на основании этой информации указать точный этаж для квартиры n?

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n ≤ 100, 0 ≤ m ≤ 100), где n — номер квартиры, этаж которой надо определить, и m — количество квартир в воспоминании Поликарпа.

Далее следуют m строк, которые описывают воспоминание Поликарпа: каждая из этих строк содержит пару чисел ki, fi (1 ≤ ki ≤ 100, 1 ≤ fi ≤ 100), которая означает, что квартира ki находится на этаже fi. Все значения ki — различны.

Гарантируется, что воспоминания Поликарпа непротиворечивы.

Выходные данные

Выведите номер этажа, на котором расположена квартира n, если его номер однозначно определяется по воспоминанию Поликарпа. Выведите -1, если однозначно восстановить номер этажа невозможно.

Примечание

В первом примере 6-я квартира находится на 2-м этаже, а 7-я уже на 3-м, следовательно, 6-я квартира последняя на своём этаже, а всего на этаже 3 квартиры. Таким образом, 10-я квартира находится на 4-м этаже.

Во втором примере на каждом этаже может быть 3 или 4 квартиры, поэтому мы не можем узнать, на каком этаже находится 8-я квартира.

C. Возможно, вы имели в виду...

дп жадные алгоритмы реализация *1500

Текстовый редактор Beroffice имеет широкие возможности по работе с текстами. Одна из возможностей — автоматический поиск опечаток и формирование предложения по их исправлению.

При наборе текста в Beroffice используются только строчные буквы английского алфавита (то есть 26 букв от a до z). При наборе слова Beroffice предполагает, что слово набрано с опечаткой, если встречаются три или более согласные буквы подряд. Единственное исключение — если блок подряд идущих согласных букв состоит из одинаковых букв, то этот блок (даже если его длина больше или равна трём) не считается опечаткой. Формально, слово набрано с опечаткой, если в слове существует блок не менее чем из трёх согласных подряд и эти согласные — не одна и та же буква.

Например:

  • следующие слова набраны с опечатками: «hellno», «hackcerrs» и «backtothefutttture»;
  • следующие слова набраны без опечаток: «helllllooooo», «tobeornottobe» и «oooooo».

Редактор Beroffice при обнаружении слова с опечаткой вставляет минимальное количество пробелов в слово (разделяя его на несколько слов) так, что каждое из получившихся слов набрано без опечаток.

Реализуйте эту функциональность редактора Beroffice. Считайте гласными только буквы 'a', 'e', 'i', 'o' и 'u'. Все остальные буквы следует считать согласными.

Входные данные

В единственной строке входных данных содержится непустое слово, состоящее из строчных букв английского алфавита. Длина слова — от 1 до 3000 букв.

Выходные данные

Выведите заданное слово без изменений, если оно не содержит опечаток. Если слово содержит хотя бы одну опечатку, то вставьте в него наименьшее количество пробелов так, что каждое из получившихся слов не содержит опечаток. Если решений несколько, то выведите любое из них.

D. Телефонная книга Поликарпа

реализация сортировки Структуры данных *1600

В телефонной книге Поликарпа записаны n телефонных номеров. Каждый номер — это целое 9-значное число, которое начинается с отличной от 0 цифры. Все номера — различны.

На телефоне Поликарпа установлена последняя версия операционной системы Berdroid. При частичном наборе номера Berdroid подсказывает все номера из телефонной книги, подстрокой которых является набранная последовательность цифр. Например, если в телефонной книге Поликарпа записаны три номера 123456789, 100000000 и 100123456, то:

  • при наборе последовательности цифр 00 будут подсказаны номера 100000000 и 100123456,
  • при наборе последовательности цифр 123 будут подсказаны номера 123456789 и 100123456,
  • а при наборе последовательности цифр 01 будет подсказан только номер 100123456.

Для каждого номера в телефонной книге Поликарпа найдите наименьшую по длине последовательность цифр, которую надо набрать, чтобы Berdroid подсказал только один этот номер.

Входные данные

Первая строка входных данных содержит единственное целое число n (1 ≤ n ≤ 70000) — количество номеров в телефонной книге Поликарпа.

Далее следуют сами номера по одному номеру в строке. Каждый номер — это целое положительное 9-значное число, которое начинается с цифры от 1 до 9. Все номера — различны.

Выходные данные

Выведите ровно n строк: i-я строка должна содержать наиболее короткую непустую последовательность цифр, при наборе которой будет подсказан только один i-й номер из телефонной книги. Если таких последовательностей несколько, выведите любую из них.

E. Перенумерация тестов

жадные алгоритмы реализация *2200

Совсем недавно завершилась Всеберляндская олимпиада по программированию! Теперь Владимир хочет добавить прошедшее соревнование в качестве тренировки на популярный сайт Codehorses.

К сожалению, в архиве олимпиады не царит идеальный порядок. Например, файлы с тестами названы не в соответствии с некоторой логикой, а произвольным образом.

Владимир хочет переименовать файлы с тестами так, чтобы их имена составляли различные целые числа от 1 без промежутков, то есть имели имена «1», «2», ..., «n», где n — общее количество файлов с тестами.

Некоторые из файлов содержат тесты из условия (примеры), а остальные — это просто файлы с обыкновенными тестами. Возможна ситуация, когда примеров нет, а также ситуация, когда все тесты являются примерами. Владимир хочет переименовать файлы так, чтобы примеры из условия составляли первые несколько тестов, а все следующие по порядку файлы содержали обыкновенные тесты.

Единственная операция, которую Владимир осуществляет — это переименование файлов с помощью операции командной строки «move». В результате своей работы Владимир хочет написать скрипт, каждая строка которого имеет вид «move file_1 file_2», которая обозначает, что файл «file_1» следует переименовать в файл «file_2». Если файл «file_2» существовал на момент выполнения строки скрипта, то этот файл будет затёрт. После строки «move file_1 file_2» файл «file_1» более не существует, но обязательно существует файл «file_2», содержащий содержимое файла «file_1» до этой команды «move».

Помогите Владимиру написать скрипт, который содержит минимальное количество строк, такой что после его выполнения:

  • все примеры составляют несколько первых тестов и файлы имеют названия «1», «2», ..., «e», где e — количество файлов с примерами;
  • остальные файлы содержат оставшиеся обыкновенные тесты и имеют названия «e + 1», «e + 2», ..., «n», где n — общее количество всех тестов.
Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 105) — количество файлов с тестами.

Далее следует n строк, каждая описывает один файл с тестом. Строка имеет вид «name_i type_i», где «name_i» — имя файла, а «type_i» равно «1», если i-й файл содержит пример из условия и «0» — если обычный тест. Имя каждого файла — строка из цифр и строчных букв латинского алфавита, длина имени файла содержит от 1 до 6 символов. Гарантируется, что все имена файлов различны.

Выходные данные

В первую строку выведите минимальное количество строк в скрипте Владимира. Далее выведите сам скрипт, каждая строка должна иметь вид «move file_1 file_2», где «file_1» — название существующего в момент исполнения строки файла, а «file_2» — строка из цифр и строчных букв латинского алфавита, длина имени файла должна быть от 1 до 6 символов.

A. Отказавшиеся финалисты

жадные алгоритмы реализация *800

В этом году, как и в прошлых, MemSQL приглашает на финал 25 лучших участников из отборочного раунда Start[c]up для участия в финале в офисе компании. Однако не все, кто прошел в финал, могут позволить себе поездку в офис компании.

Изначально в офис компании приглашаются 25 лучших участников. Каждый приглашенный участник либо принимает, либо отклоняет приглашение. Если участник отклоняет приглашение, то вместо него приглашается еще не приглашенный участник, выступивший лучше всех других еще не приглашенных в отборочном раунде. Этот процесс продолжается до тех пор, пока приглашение не примут 25 участников.

После того, как квалификационный раунд закончился, и участники финального раунда в офисе компании выбраны, вы знаете K из финалистов, которые приняли приглашение, и места, которые они заняли в отборочном раунде (места нумеруются с 1, в отборочном раунде не было участников с одинаковыми местами). Определите минимально возможное количество участников, которые были приглашены, но отказались от участия в финале в офисе компании.

Входные данные

Первая строка содержит целое число K (1 ≤ K ≤ 25) — количество финалистов в офисе компании, о которых вы знаете. Вторая строка содержит целые числа r1, r2, ..., rK (1 ≤ ri ≤ 106) — места известных вам финалистов в отборочном раунде. Гарантируется, что все эти места различны.

Выходные данные

Выведите одно целое число: минимальное число участников, которые могли отказаться от участия в финале в офисе компании.

Примечание

В первом примере вы знаете всех 25 финалистов. Участники, занявшие 1, 13, и 27 места в отборочном раунде должны были отказаться, поэтому ответ равен 3.

D. Мощный массив

математика реализация Структуры данных *2200

Имеется массив натуральных чисел a1, a2, ..., an. Рассмотрим некоторый его подмассив al, al + 1, ..., ar, где 1 ≤ l ≤ r ≤ n, и для каждого натурального числа s обозначим через Ks число вхождений числа s в этот подмассив. Назовем мощностью подмассива сумму произведений Ks·Ks·s по всем различным натуральным s. Так как количество различных чисел в массиве конечно, сумма содержит лишь конечное число ненулевых слагаемых.

Необходимо вычислить мощности каждого из t заданных подмассивов.

Входные данные

Первая строка содержит два целых числа n и t (1 ≤ n, t ≤ 200000) — длина массива и количество запросов соответственно.

Вторая строка содержит n натуральных чисел ai (1 ≤ ai ≤ 106) — элементы массива.

Следующие t строк содержат по два натуральных числа l и r (1 ≤ l ≤ r ≤ n) — индексы левого и правого концов соответствующего подмассива.

Выходные данные

Выведите t строк, где i-ая строка содержит единственное натуральное число — мощность подмассива i-го запроса.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

Примечание

Рассмотрим следующий массив (см. пример 2) и его подмассив [2, 7] (цветом выделены элементы подмассива):

Тогда K1 = 3, K2 = 2, K3 = 1, и мощность равна 32·1 + 22·2 + 12·3 = 20.

A. Махмуд, Ехаб и MEX

жадные алгоритмы реализация *1000

Доктор Зло похитил Махмуда и Ехаба в злую страну из-за их плохого выступления на Всезлейской Олимпиаде по Информатике. Доктор согласился отпустить ребят, если они решат несколько задач.

Доктор Зло интересуется теорией множеств, поэтому у него есть множество из n целых чисел. Доктор Зло называет множество злым, если MEX от этого множества равен x. MEX множества чисел называется минимальное неотрицательное целое число, которое в нём не содержится. Например, MEX множества {0, 2, 4} равен 1, а MEX множества {1, 2, 3} равен 0.

Доктор Зло собирается сделать своё множество злым. Для этого он хочет проделать над ним некоторое количество операций. Во время каждой операции он может добавить в множество любое неотрицательное целое число или удалить из множества любое число, которое в нём содержится. Какое минимальное число операций ему придётся проделать, чтобы сделать массив злым?

Входные данные

В первой строке содержатся два целых числа n и x (1 ≤ n ≤ 100, 0 ≤ x ≤ 100) — размер множества Доктора Зло и необходимый MEX.

Во второй строке содержатся n различных целых неотрицательных чисел, не превосходящих 100 — элементы множества.

Выходные данные

Выведите единственное число — минимальное число операций, которое придётся сделать Доктору Зло.

Примечание

В первом тестовом примере Доктору Зло необходимо добавить в множества числа 1 и 2, используя 2 операции.

Во втором тестовом примере Доктору Зло необходимо удалить 0 из множества. После этого множество станет пустым, поэтому его MEX равен 0.

В третьем тестовом примере массив уже злой.

A. Квази-палиндром

Перебор реализация *900

Назовем число квази-палиндромным, если добавление некоторого количества ведущих нулей (возможно нулевого) делает из него строку-палиндром.

Строка t называется палиндромом, если она одинаково читается как слева направо, так и справа налево.

Например, числа 131 и 2010200квази-палиндромные, они могут быть преобразованы в строки "131" и "002010200", соответственно, которые являются палиндромами.

Задано целое число x Проверьте, является ли оно квази-палиндромным.

Входные данные

В первой строке записано одно целое число без ведущих нулей x (1 ≤ x ≤ 109).

Выходные данные

Выведите «YES», если число xквази-палиндромное. Иначе выведите «NO» (без кавычек).

C. 1-2-3

графы реализация *1800

Илья работает в компании по производству роботов. Илья пишет программы для игровых моделей, его текущий проект «Боб» — игровой робот нового поколения. Начальник Ильи интересуется его продвижениями в работе. В частности он хочет узнать, насколько Боб лучше предыдущей модели, «Алисы».

Теперь Илья хочет сравнить навыки своих роботов в простой игре «1-2-3». Эта игра похожа на «Камень-ножницы-бумага»: роботы втайне друг от друга выбирают число из набора {1, 2, 3} и одновременно произносят свое число. Если роботы сказали одно и то же число, тогда объявляется ничья и никто не получает очки. Но если числа различны, то один из роботов зарабатывает очко: робот, назвавший 3, побеждает робота, назвавшего 2, 2 побеждает 1 и 1 побеждает 3.

Программы роботов выбирают числа таким образом, что их выбор в (i + 1)-й игре зависит только от их выбора в i-й игре.

Илья знает, что роботы сыграют ровно k игр, Алиса выберет число a в первой игре, а Боб выберет число b в первой игре. Также он знает программы обоих роботов и может сказать, какое число выберет робот на основе выбора в предыдущей игре. Илья не хочет ждать, пока все k игр будут сыграны, и он просит вас подсчитать количество очков, которое наберет каждый из роботов после финальной игры.

Входные данные

В первой строке записаны три целых числа k, a, b (1 ≤ k ≤ 1018, 1 ≤ a, b ≤ 3).

После идет 3 строки, в i-й из них записаны 3 числа Ai, 1, Ai, 2, Ai, 3, где Ai, j описывает выборы чисел Алисы, если Алиса выбрала i в прошлой игре, а Боб выбрал j (1 ≤ Ai, j ≤ 3).

После идет 3 строки, в i-й из них записаны 3 числа Bi, 1, Bi, 2, Bi, 3, где Bi, j описывает выборы чисел Боба, если Алиса выбрала i в прошлой игре, а Боб выбрал j (1 ≤ Bi, j ≤ 3).

Выходные данные

Выведите два числа. Первое — количество очков, набранное Алисой, второе — количество очков, набранное Бобом, после k игр.

Примечание

Во втором примере игра идет следующим образом:

В четвертой и седьмой игре побеждает Боб, в первой игре ничья, а во всех остальных побеждает Алиса.

D. Очередная задача про запросы в массиве

реализация Структуры данных *1800

Вам дается массив a размера n и q запросов к нему. Есть запросы двух типов:

  • 1 li ri — осуществить циклический сдвиг отрезка [li, ri] вправо. То есть, для каждого такого x, что li ≤ x < ri, ax + 1 становится равным прежнему значению ax, а ali становится равным прежнему значению ari;
  • 2 li ri — перевернуть отрезок [li, ri].

Также заданы m важных позиций в массиве b1, b2, ..., bm. Для каждого такого i, что 1 ≤ i ≤ m, выведите то число, которое будет стоять на позиции bi в массиве после обработки всех запросов.

Входные данные

В первой строке записаны три целых числа n, q и m (1 ≤ n, q ≤ 2·105, 1 ≤ m ≤ 100).

Во второй строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109).

Дальше идут q строк. В i-й из них записаны три целых числа ti, li, ri, где ti — тип i-го запроса, [li, ri] — отрезок, на котором запрос выполняется (1 ≤ ti ≤ 2, 1 ≤ li ≤ ri ≤ n).

В последней строке записаны m целых чисел b1, b2, ..., bm (1 ≤ bi ≤ n) — важные позиции в массиве.

Выходные данные

Выведите m чисел, i-е из которых равно числу на позиции bi после обработки всех запросов.

A. Честная игра

реализация сортировки *1000

Петя и Вася решили сыграть в игру. Для этого у них есть n карточек (n — чётное число), на каждой из которых записано одно целое число.

До игры Петя выберет одно целое число, а затем Вася — другое целое число (отличное от числа, которое выбрал Петя). В ходе игры они заберут себе все карточки, на которых записаны выбранные ими числа. К примеру, если до игры Петя выбрал число 5, то он заберёт себе все карточки, на которых записано число 5, если Вася выбрал число 10, то он заберёт себе все карточки, на которых записано число 10.

Игра считается честной, если Петя и Вася забрали себе все n карточек, при этом каждый из них забрал поровну карточек.

Определите, могут ли Петя и Вася выбрать до игры числа таким образом, чтобы игра была честной.

Входные данные

В первой строке записано целое положительное число n (2 ≤ n ≤ 100) — количество карточек. Гарантируется, что n — чётное число.

Следующие n строк содержат последовательность целых чисел a1, a2, ..., an (по одному числу в строке, 1 ≤ ai ≤ 100) — числа, записанные на n карточках.

Выходные данные

Если Петя и Вася не смогут выбрать по числу до игры таким образом, чтобы игра была честной, выведите в первую строку «NO» (без кавычек). В этом случае ничего больше выводить не нужно.

В противном случае выведите в первую строку «YES» (без кавычек), а во вторую строку выведите два различных числа — число, которое должен выбрать Петя, и число, которое должен выбрать Вася, чтобы игра была честной. Если ответов несколько, разрешается вывести любой из них.

Примечание

В первом примере игра будет честной, если, например, Петя выберет число 11, а Вася — число 27. Тогда они заберут себе все карточки, при этом Петя заберёт себе 1-ю и 4-ю, а Вася — 2-ю и 3-ю. Таким образом, каждый из них заберёт ровно по две карточки.

Во втором примере честная игра невозможна, так как числа на карточках равны между собой, а числа, которые выберут Петя и Вася до игры, должны быть различными.

В третьем примере невозможно забрать все имеющиеся карточки. Петя и Вася максимально смогут забрать пять карточек, если, например, Петя выберет число 10, а Вася выберет число 20. Но для честной игры необходимо, чтобы они забрали себе все 6 имеющихся карточек.

B. Поликарп и буквы

Перебор реализация Строки *1000

Поликарп любит строчные буквы и недолюбливает прописные. Однажды он получил строку s, состоящую только из строчных и прописных букв английского алфавита.

Пусть A — множество индексов строки. Назовем его симпатичным, если:

  • в индексах из A стоят различные строчные буквы;
  • в строке нет таких прописных (заглавных) букв, которые расположены между элементами из A (иными словами, не существует такого j, что s[j] — прописная буква и a1 < j < a2 для некоторых a1 и a2 из A).

Напишите программу, которая найдет наибольшее количество элементов симпатичного множества индексов.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 200) — длина строки s.

Вторая строка — это строка s, состоящая из строчных и прописных букв английского алфавита.

Выходные данные

Выведите наибольшее количество элементов симпатичного множества индексов для строки s.

Примечание

В первом примере искомыми позициями могут являться позиции 6 и 8 или позиции 7 и 8. В позициях 6 и 7 стоит буква 'a', в позиции 8 стоит буква 'b'. Пара позиций 1 и 8 не подходит, так как между ними стоит прописная буква 'B'.

Во втором примере искомыми позициями, например, являются позиции 7, 8 и 11. Существуют и другие способы выбрать симпатичное множество, состоящее из трёх элементов.

В третьем примере строка s не содержит строчных букв, следовательно, ответ равен 0.

C. Автобус

жадные алгоритмы математика реализация *1500

Автобус курсирует по координатной прямой Ox от точки x = 0 до точки x = a. Выехав из точки x = 0, он доезжает до точки x = a, сразу разворачивается и едет обратно в точку x = 0. Вернувшись в точку x = 0, он сразу снова едет в точку x = a и так далее. Таким образом, автобус курсирует от x = 0 до x = a и обратно. Переезд из точки x = 0 в x = a или из точки x = a в x = 0 называется рейсом автобуса. Всего автобус должен совершить k рейсов.

Бензобак автобуса вмещает b литров бензина. На преодоление единицы расстояния автобус тратит ровно один литр бензина. Свой путь автобус начинает с полным бензобаком.

Между x = 0 и x = a в точке x = f находится заправка. Других заправок на пути автобуса нет. Проезжая мимо заправки в любом из двух направлений, автобус может остановиться и пополнить запас бензина в бензобаке. Таким образом, после остановки на заправку в бензобаке автобуса будет b литров бензина.

Какое минимальное количество раз автобус должен дозаправиться в точке x = f, чтобы начав путь в точке x = 0 совершить k рейсов?

Входные данные

В первой строке записаны четыре целых числа a, b, f, k (0 < f < a ≤ 106, 1 ≤ b ≤ 109, 1 ≤ k ≤ 104) — точка окончания первого автобусного рейса, вместимость бензобака автобуса, точка, в которой расположена заправка, а также требуемое количество рейсов.

Выходные данные

Выведите минимальное количество дозаправок автобуса, которые необходимы, чтобы совершить k рейсов. Если автобус не сможет совершить k рейсов, выведите -1.

Примечание

В первом примере автобус вынужден дозаправляться на каждом рейсе.

Во втором примере автобус может проехать без дозаправки 10 единиц расстояния. Это соответствует тому, что автобус проехал весь первый рейс, а затем 4 единицы расстояния второго рейса и оказался на заправке. Он может дозаправиться, закончить второй рейс и проехать 2 единицы расстояния от третьего рейса. В этом случае он снова окажется на заправке. Затем он может заполнить бак до 10 литров, закончить третий рейс и проехать полностью четвертый рейс. В конце пути у автобуса будет пустой бак.

В третьем примере автобус не может проехать все 3 рейса, так как если он заправится на втором рейсе, в баке будет только 5 литров бензина, а до следующей возможности заправиться автобус должен проехать 8 единиц расстояния.

D. Сделай перестановку!

жадные алгоритмы математика реализация *1500

У Ивана есть массив, состоящий из n элементов. Каждый из элементов — целое число от 1 до n.

Совсем недавно Иван узнал о перестановках и их лексикографическом порядке. Теперь он хочет изменить значения минимального количества элементов в своём массиве таким образом, чтобы его массив стал перестановкой (то есть каждое из целых чисел от 1 до n встречалось в его массиве ровно по одному разу). Если существует много способов сделать заданный массив перестановкой за минимальное количество изменений, то среди них Иван хочет выбрать такой, что полученная перестановка лексикографически минимальна.

Таким образом, в первую очередь Иван хочет минимизировать количество измененных элементов, а во вторую — минимизировать лексикографически полученную перестановку.

Для того, чтобы определить, какая из двух перестановок лексикографически меньше, они сначала сравниваются по первому элементу. При их равенстве — по второму, и так далее. Среди двух перестановок x и y лексикографически меньше будет x, если xi < yi, где i — первый индекс, в котором перестановки x и y различаются.

Определите, как будет выглядеть массив Ивана, если он осуществит задуманное.

Входные данные

В первой строке следует целое число n (2 ≤ n ≤ 200 000) — количество элементов в массиве Ивана.

Во второй строке следует последовательность целых чисел a1, a2, ..., an (1 ≤ ai ≤ n) — описание массива Ивана.

Выходные данные

В первую строку выведите q — минимальное количество элементов, которые нужно изменить в массиве Ивана для того, чтобы массив стал перестановкой. Во вторую строку выведите лексикографически минимальную перестановку, которая получается с помощью q изменений.

Примечание

В первом примере нужно заменить тройку, стоящую в позиции 1, на единицу, а двойку, стоящую в позиции 3, нужно заменить на четвёрку. Тогда мы получим перестановку [1, 2, 4, 3], изменив два числа — эта перестановка лексикографически минимальная из всех подходящих перестановок.

Во втором примере ничего изменять не нужно, так как данный массив является перестановкой.

A. Между офисами

реализация *800

Вы возможно знаете, что у одной компании есть два офиса в Америке: один из них в Сан-Франциско, а другой в Сиэтле. Будучи менеджером в этой компании, вам приходится много перемещаться между этими двумя городами. Вы всегда летаете на самолете.

Вам больше нравится летать из Сиэтла в Сан-Франциско, чем в обратном направлении, так как в Сан-Франциско теплее. Вы настолько заняты, что не помните, сколько раз летали в каждом направлении. Однако. про каждый из последних n дней вы помните, были ли вы в офисе в Сан-Франциско, или в офисе в Сиэтле в тот день. Вы всегда летаете ночью, поэтому вы не могли быть в обоих офисах в один и тот же день. По данной информации определите, летали ли вы больше из Сиэтла в Сан-Франциско за последние n дней, или нет.

Входные данные

Первая строка содержит одно целое число n (2 ≤ n ≤ 100) — количество дней.

Вторая строка содержит строку длины n, состоящую только из заглавных букв «S» и «F» латинского алфавита. Если i-я буква — это «S», то вы были в офисе в Сиэтле в тот день, иначе вы были в Сан-Франциско. Дни даны в хронологическом порядке, то есть сегодня — последний день в этой последовательности.

Выходные данные

Выведите «YES», если вы летали больше раз из Сиэтла в Сан-Франциско, и «NO» иначе.

Вы можете вывести каждую из букв в любом регистре (заглавную или строчную).

Примечание

В первом примере вы изначально были в Сан-Франциско, затем прилетели в Сиэтл, пробыли там два дня и вернулись в Сан-Франциско. В каждом направлении вы совершили один перелет, таким образом ответ — «NO».

Во втором примере вы просто прилетели из Сиэтла в Сан-Франциско, то есть ответ «YES».

В третьем примере вы все время находились в Сан-Франциско, поэтому ответ «NO».

В четвертом примере если вы замените буквы «S» на единицы, а «F» — на нули, то вы получите первые несколько цифр π в двоичной системе счисления. Это была не очень полезная информация.

A. Разблокируйте

Перебор реализация Строки *900

По мере развития технологий производители стараются сделать экран разблокировки телефона настолько удобным, насколько возможно. Чтобы разблокировать новый телефон, домашнему щенку Аркадия Му-му надо пролаять пароль. Пароль представляется телефоном в виде строки из двух строчных латинских букв.

Каштанка, заклятый враг Му-му, хочет разблокировать ее телефон, чтобы получить некоторую важную информацию. Однако, она может пролаять лишь n различных слов, каждое из которых может быть представлено как строка из двух строчных латинских букв. Каштанка хочет пролаять несколько слов (не обязательно различных) одно за другим так, чтобы произнести строку, которое содержит пароль как подстроку. Определить, возможно разблокировать телефон таким образом, или нет.

Входные данные

Первая строка содержит две строчные латинские буквы — пароль на телефоне.

Вторая строка содержит одно целое число n (1 ≤ n ≤ 100) — количество слов, которое знает Каштанка.

Следующие n строк содержат по две строчные латинские буквы каждая, описывающие слова, известные Каштанке. Гарантируется, что эти слова различны.

Выходные данные

Выведите «YES», если Каштанка может пролаять несколько слов друг за другим так, чтобы получившаяся строка содержала пароль, и «NO» иначе.

Вы можете выводить каждую букву в любом регистре (заглавную или строчную).

Примечание

В первом примере пароль равен «ya», Каштанка может пролаять «oy», затем «ah» и затем «ha», образовав в итоге строку «oyahha», которая содержит пароль. Поэтому ответ «YES».

Во втором примере Каштанка не может получить строку, содержащую пароль как подстроку. Обратите внимание, она может пролаять, например, «ht», затем «tp», получив «http», но эта строка не содержит «hp» как подстроку.

В третьем примере строка «hahahaha» содержит «ah» как подстроку.

B. Наперегонки со временем

реализация *1400

Вам когда-нибудь приходилось объяснять координатору, почему до контеста осталось восемь часов, а ни одной задачи ещё не сделано? Мише приходилось. И на этот раз у него нашлось действительно весомое оправдание: он попал в пространственно-временной парадокс! Пространство и время поменялись местами.

Из-за парадокса всё пространство превратилось в гигантский циферблат часов с тремя стрелками — часовой, секундной и минутной. Стрелки застыли, показывая время h часов, m минут, s секунд.

Последний раз Миша общался с координатором ровно в t1 часов, поэтому сейчас стоит на цифре t1 на этом циферблате. Контест должен быть готов к t2 часам. В терминах парадокса это значит, что Миша должен каким-то образом оказаться на цифре t2. При этом он может перемещаться не только вперёд, ведь в сложившихся обстоятельствах у времени больше нет направления.

Стрелки часов очень длинные, Миша не может их обойти. Перешагнуть их он тоже не может: это приведёт к коллапсу пространства-времени. То есть если, допустим, часовая стрелка указывает на 12 часов, то Миша не может перейти от 11 часов к 1 часу через верх, а должен обходить часы снизу (конечно, если там ему не мешают другие стрелки).

По данному положения циферблата и положениям t1 и t2 определите, успеет ли Миша подготовить контест вовремя, то есть сможет ли он добраться из позиции t1 в позицию t2 по циферблату.

Входные данные

Пять целых чисел h, m, s, t1, t2 (1 ≤ h ≤ 12, 0 ≤ m, s ≤ 59, 1 ≤ t1, t2 ≤ 12, t1 ≠ t2).

Гарантируется, что ни позиция Миши, ни время, к которому должен быть готов контест, не совпадают с позицией ни одной из стрелок.

Выходные данные

Выведите «YES» (без кавычек), если Миша успеет подготовить контест, и «NO», если не успеет.

Вы можете выводить каждую букву как заглавной, так и строчной («YeS» и «yes» можно вывести вместо «YES»).

Примечание

Примеры показаны на рисунках ниже слева направо. Начальная позиция Миши показана зеленым, конечная — розовым. Обратите внимание, положение стрелок на рисунках неточное, но близко к точному, при этом ответ от этих изменений не меняется.

D. Огромные строки

битмаски дп Перебор реализация Строки *2200

Дано n строк s1, s2, ..., sn, состоящих из символов 0 и 1. Далее m раз создается новая строка как конкатенация уже имеющихся. Формально, на i-м шаге конкатенация saisbi записывается в новую строку sn + i (нумерация шагов ведется с 1). После каждой операции вам нужно найти максимальное положительное целое число k такое, что в полученной строке встречаются все возможные строки из 0 и 1 длины k (а таких различных строк 2k) как подстроки. Если такого k не существует, выведите 0.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 100) — количество строк. Следующие n строк содержат строки s1, s2, ..., sn (1 ≤ |si| ≤ 100) по одной в строке. Суммарная длина строк не превосходит 100.

Следующая строка содержит число m (1 ≤ m ≤ 100) — количество операций. За ней следуют m строк, содержащих по два целых числа ai и bi (1 ≤ ai, bi ≤ n + i - 1) — номера строк, образующих новую строку sn + i.

Выходные данные

Выведите m строк, содержащие по одному целому числу — ответы на запросы после операций.

Примечание

В первой операции создается строка "0110". Для k = 1 две возможные бинарные строки длины k — это "0" и "1", они обе являются подстроками новой строки. Для k = 2 и больше существуют строки длины k, не встречающиеся в получившейся строке (для k = 2 такая строка — это "00"). Поэтому ответ равен 1.

Во второй операции создается строка "01100". Теперь присутствуют все строки длины k = 2.

В третьей операции создается строка "1111111111". В ней нет нулей, поэтому ответ равен 0.

A. Художественное занятие

Перебор реализация *1100

Камень... Бумага!

После того как Карен придумала детерменированную стратегию для победы (поражения?) в игру камень-ножницы-бумага, её брат, Коёми, придумал новую игру в качестве замены. Правила этой игры таковы.

В начале выбирается целое число n. Коёми и Карен независимо выбирают по n различных положительных целых чисел, которые обозначаются как x1, x2, ..., xn и y1, y2, ..., yn, соответственно. Затем они показывают друг другу свои последовательности и меняют их до тех пор, пока все 2n чисел не станут различными. Затем две последовательности фиксируются и больше не меняются.

После этого они считают число упорядоченных пар (i, j) (1 ≤ i, j ≤ n), таких, что величина xi xor yj равна одному из 2n целых чисел. Здесь xor означает побитовое сложение по модулю 2 двух целых чисел. Эта операция часто обозначается как ^ или xor в языках программирования.

Карен выигрывает, если число таких пар чётно, в противном случае выигрывает Коёми. Определите победителя.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 2 000) — длина обеих последовательностей.

Во второй строке через пробел заданы n целых чисел x1, x2, ..., xn (1 ≤ xi ≤ 2·106) — последовательность, выбранная Коёми.

В третьей строке через пробел заданы n целых чисел y1, y2, ..., yn (1 ≤ yi ≤ 2·106) — последовательность, выбранная Карен.

Гарантируется, что данные 2n чисел попарно различны, то есть не существует пары (i, j) (1 ≤ i, j ≤ n), такой, что выполняется хотя бы одно: xi = yj; i ≠ j и xi = xj; i ≠ j и yi = yj.

Выходные данные

Выведите имя победителя: «Koyomi» или «Karen» (без кавычек). Обратите внимание на регистр букв.

Примечание

В первом тестовом примере 6 пар удовлетворяют условию: (1, 1), (1, 2), (2, 1), (2, 3), (3, 2) и (3, 3). Карен победит, так как 6 — чётное число.

Во втором тестовом примере существует 16 таких пар, поэтому Карен выиграет снова.

A. Поезда

математика реализация *1500

Вася живет посередине Программистской ветки метро. У него есть две девушки: Даша и Маша, живущие на разных концах ветки, каждая не ведающая о существовании другой.

Когда у Васи появляется свободное время, он едет к одной из своих девушек. Он спускается в метро в некоторый момент времени, ждет первый поезд и едет на нем до конца ветки к соответствующей девушке. Однако поезда ходят с разной частотой: в Дашином направлении станцию проезжает один поезд в a минут, а в Машином — один поезд в b минут. В случае, если поезда подошли одновременно, Вася едет в направлении с меньшей частотой хождения поездов, то есть к той девушке, в чью сторону поезда ходят реже (см. пояснение к третьему примеру).

Известно, что поезда начинают свое хождение одновременно до появления Васи. То есть расписание поездов таково, что существует момент времени, когда два поезда приезжают одновременно.

Помогите Васе посчитать, к какой девушке он будет попадать чаще.

Входные данные

В первой строке записано два целых числа a и b (a ≠ b, 1 ≤ a, b ≤ 106).

Выходные данные

Выведите «Dasha», если Вася будет чаще попадать к Даше, «Masha», если к Маше, и «Equal», если одинаково часто к обеим девушкам.

Примечание

Разберем третий пример.

Пусть поезда начали свое хождение в нулевой момент времени. Понятно, что моменты прибытия поездов будут периодичны с периодом 6. Поэтому достаточно показать, что спускаясь в метро в момент времени внутри полуинтервала (0, 6], он будет попадать к обеим девушкам одинаково часто.

Если он спустился в момент от 0 до 2, он уезжает к Даше на поезде, прибывающем ко второй минуте.

Если он спустился в момент от 2 до 3, он уезжает к Маше на поезде, прибывающем к третьей минуте.

Если он спустился в момент от 3 до 4, он уезжает к Даше на поезде, прибываюшем к четвертой минуте.

Если он спустился в момент от 4 до 6, то он дожидается прибытия обоих поездов к шестой минуте и уезжает к Маше, потому что в ее направлении поезда ходят реже.

Суммарно на Дашу и Машу приходится поровну — по три минуты, значит к обеим девушкам он будет попадать одинаково часто.

B. Вася и Типы

реализация Строки *1800

Программист Вася изучает новый язык программирования &K*. Язык &K* по своему синтаксису напоминает языки семейства C, однако он гораздо более мощный, и поэтому правила реальных C-подобных языков к нему не применимы. Для полного понимания условия внимательно прочитайте описание языка ниже, и следуйте ему, а не аналогичным правилам в реальных языках программирования.

В &K* есть очень мощная технология указателей — к имеющемуся типу X можно приписать звездочку после него и получить тип X * . Это называется операцией взятия указателя. А есть противоположная операция — к любому типу X, являющемуся указателем, можно приписать слева амперсанд и получить тип &X, на который ссылается X. Это называется операцией разыменовывания.

В языке &K* есть только два базовых типа данных — void и errtype. Также в этом языке есть операторы typedef и typeof.

  • Оператор "typedef A B" определяет новый тип данных B, эквивалентный типу A. В A могут быть звездочки и амперсанды, а в B — не могут. Например, оператор typedef void** ptptvoid создаст новый тип ptptvoid, который может использоваться в качестве void**.
  • Оператор "typeof A" возвращает тип A, приведённый к void, т. е. возвращает эквивалентный ему тип void**...* с необходимым количеством звёздочек (возможно и нулевым). То есть после определения типа ptptvoid, как показано выше, оператор typeof ptptvoid вернёт void**.

Попытка разыменовать тип void приводит к ошибке: особому типу данных errtype. Для errtype верно следующее соотношение: errtype* = &errtype = errtype. Попытка использовать не объявленный ранее тип данных так же приведет к типу errtype.

С помощью typedef можно определить один тип несколько раз. Из всех определений силу имеет только последнее. Однако все типы, которые были определены с его использованием ранее, не меняются.

Заметим также, что операция разыменовывания имеет меньший приоритет, чем операция взятия указателя, иными словами &T *  всегда равно T.

Учтите, что операторы выполняются последовательно, один за другим. Пусть у нас есть два оператора "typedef &void a" и "typedef a* b". Сначала a принимает значение errtype, а затем b принимает значение errtype* = errtype, но не &void* = void (см. пример 2).

Вася еще не до конца понимает эту мощную технологию, поэтому он попросил вас помочь в ней разобраться. Напишите программу, которая обрабатывает эти операторы и операции.

Входные данные

В первой строке находится целое число n (1 ≤ n ≤ 100) — количество операторов. Далее идет n строк с операторами. Каждый оператор имеет один из двух видов: либо "typedef A B", либо "typeof A". В первом случае тип B отличается от типов void и errtype, а так же не содержит звездочек и амперсандов.

Все названия типов данных — непустые строки из не более чем 20 строчных латинских букв. Количество звездочек и амперсандов по отдельности при одном типе в любом операторе не превышает 10, однако при приведении некоторых типов к void c несколькими звездочками, их количество может превысить 10.

Выходные данные

На каждый оператор typeof выведите в отдельной строке ответ на этот оператор — тип, который вернул данный оператор.

Примечание

Разберем второй пример.

После первых двух запросов typedef тип b эквивалентен void*, а сvoid**.

Следующий запрос typedef переопределяет b — теперь он равен &b = &void* = void. Тип с при этом не меняется.

После чего тип с определяется как &&b* = &&void* = &void = errtype. На тип b это никак не влияет, поэтому следующий typedef определяет c, как &void* = void.

Далее тип b снова переопределяется как &void = errtype.

Отметим, что тип c в следующем запросе определяется именно как errtype******* = errtype, а не &void******* = void******. Тоже самое происходит и в последнем typedef.

D. Красивая дорога

графы Деревья дп поиск в глубину и подобное реализация снм сортировки *2300

Давным давно где-то в Азии в одной стране шли междоусобные войны.

Каждый из n городов хотел захватить власть, поэтому иногда один город собирал армию и отправлял ее в поход против другого города.

Прокладывание дорог было делом трудным, поэтому их в стране было мало, а именно n - 1. Также из любого города до любого другого можно было добраться по этим дорогам.

Даже во время войны жители Востока остаются людьми духовно богатыми и ценящими красоту природы. И, дабы оставить на века память о своем великом походе, на дороге, на которой в пути армия провела больше всего времени, сажали одно красивое дерево. Жители Востока любят природу, поэтому если таких дорог было несколько, то по одному дереву сажалось на каждой.

Недавно, когда были обнаружены летописи той войны, выяснилось, что каждый город напал на каждый ровно по одному разу. Всего было ровно n(n - 1) походов. Всем стало интересно, какая дорога после тех войн стала самой красивой, то есть на какой дороге посадили больше всего красивых деревьев.

Входные данные

В первой строке записано целое число n (2 ≤ n ≤ 105) — количество городов. Следующие n - 1 строк содержат по три целых числа: номера городов ai, bi (1 ≤ ai, bi ≤ n), соединяемых i-ой дорогой и количество дней di, затрачиваемое армией на переход по ней (1 ≤ di ≤ 109). Длины некоторых дорог могут совпадать.

Выходные данные

В первой строке выведите два числа — количество красивых деревьев на самой красивой дороге и количество самых красивых дорог. Во второй строке выведите список самых красивых дорог, в порядке возрастания номеров. Дороги пронумерованы от 1 до n - 1 в том порядке, в котором они даны во входных данных.

Пожалуйста, не используйте спецификатор %lld для записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

A. Поиск красивых чисел

Перебор реализация *900

Дано два списка различных ненулевых цифр.

Назовем число красивым, если в его записи (в системе счисления по основанию 10) присутствует хотя бы одна цифра из первого списка и хотя бы одна цифра из второго списка. Чему равно минимальное натуральное (положительное целое) красивое число?

Входные данные

В первой строке даны числа n, m (1 ≤ n, m ≤ 9) – длины первого и второго списка соответственно.

Во второй строке через пробел даны n различных целых цифр a1, a2, ..., an (1 ≤ ai ≤ 9) – элементы первого списка.

В третьей строке через пробел даны m различных целых цифр b1, b2, ..., bm (1 ≤ bi ≤ 9) – элементы второго списка.

Выходные данные

Выведите минимальное натуральное красивое число.

Примечание

В первом примере красивыми являются числа 25, 46, 24567 и многие другие. Из них минимальным является 25. 42 и 24 не являются красивыми, так как в них отсутствуют цифры из второго списка.

Во втором примере красивыми являются все числа, в чьей записи встречаются не только цифры 9. Очевидно, минимальным из таких чисел является 1, так как это минимальное натуральное число.

A. Дела

реализация *800

На сегодня Люба запланировала n дел. i-е дело она выполняет за ai единиц времени. Гарантируется, что для любого будет выполняться ai ≥ ai - 1, то есть последовательность времён отсортирована по неубыванию.

Также у Любы хватит сил на то, чтобы не более k любых дел выполнить за x единиц времени вместо ai ().

Люба — очень ответственный человек, поэтому она должна выполнить все n дел и хочет узнать, за какое минимальное время она сможет это сделать.

Входные данные

В первой строке входных данных задано три целых числа n, k, x (1 ≤ k ≤ n ≤ 100, 1 ≤ x ≤ 99) — общее количество дел, количество дел, которые Люба может выполнить за x единиц времени, и само время x.

В следующей строке задано n целых чисел ai (2 ≤ ai ≤ 100) — время, которое Любе необходимо потратить на выполнение дела с номером i.

Гарантируется, что , а также, что для любого будет выполняться ai ≥ ai - 1.

Выходные данные

Выведите единственное целое число — минимальное время, которое понадобится Любе на выполнение всех n дел.

Примечание

В первом тестовом примере выгоднее всего выполнить дела с номерами 3 и 4 за время x = 2 вместо a3 и a4 соответственно. Тогда ответ будет равняться 3 + 6 + 2 + 2 = 13.

Во втором тестовом примере можно выбрать любые два дела и выполнить их за время x вместо ai. Тогда ответ будет равняться 100·3 + 2·1 = 302.

B. Сбалансированная подстрока

дп реализация *1500

Задана строка s, состоящая только из символов 0 и 1. Подстрока [l, r] в s — это строка slsl + 1sl + 2... sr, ее длина равна r - l + 1. Подстрока называется сбалансированной, если количество нулей (0) в ней совпадает с количеством единиц.

Найдите длину наидлиннейшей сбалансированной подстроки s.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100000) — длина строки s.

Вторая строка — строка s длиной ровно n. В s содержатся только символы 0 и 1.

Выходные данные

Если в s нет ни одной непустой сбалансированной подстроки, то выведите 0. Иначе выведите длину наидлиннейшей сбалансированной подстроки.

Примечание

В первом примере можно выбрать подстроку [3, 6]. Она сбалансирована, длина — 4. Также можно выбрать подстроку [2, 5].

Во втором примере нет ни одной непустой сбалансированной подстроки.

B. Сортировка монет

реализация снм сортировки *1500

Недавно Дима познакомился с Сашей в филателистическом магазине, и с тех пор они собирают монеты вместе. Их любимое занятие — сортировать коллекции монет. Саше нравится порядок, поэтому он хочет, чтобы монеты были расположены в ряд, причём сначала шли монеты, вышедшие из обращения, а потом монеты, всё ещё находящиеся в обращении.

Для упорядочивания монет Дима использует алгоритм, один шаг которого выглядит следующим образом:

  1. Дима просматривает все монеты слева направо;
  2. если он видит, что i-я монета ещё в ходу, а (i + 1)-я уже вышла из обращения, то он меняет эти две монеты местами, и продолжает смотреть на монеты дальше, начиная с (i + 1)-й.

Дима повторяет этот шаг до тех пор, пока не окажется, что на очередном шаге не произошло ни одного обмена. Сложностью упорядочивания Дима называет количество шагов, которые ему требуются в соответствии с процедурой, описанной выше, то есть, количество раз, которое он будет начинать просматривать монеты с начала. В частности, для уже упорядоченной исходной последовательности монет сложность упорядочивания равна единице.

Сегодня Саша в очередной раз позвал Диму в гости, чтобы предложить ему следующую игру. Сначала он выложил в ряд перед Димой n монет, все из которых вышли из обращения. Затем Саша n раз выбирает какую-то из монет, которая вышла из обращения, и заменяет её на монету, которая находится в обращении. В ходе этого процесса Саша постоянно интересуется у Димы, какова на данный момент сложность упорядочивания последовательности.

Задачу усложняет тот факт, что Диме нельзя трогать монеты, и поэтому определять сложность упорядочивания ему приходится в уме. Помогите Диме справиться с этим заданием.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 300 000) — количество монет, которые Саша выложил в ряд перед Димой.

Следующая строка содержит n целых различных чисел p1, p2, ..., pn (1 ≤ pi ≤ n) — позиции монет, если смотреть слева направо, которые Саша меняет на монеты, находящиеся в ходу. Сначала Саша заменяет монету, находящуюся на позиции p1, затем монету, находящуюся на позиции p2 и так далее.

Выходные данные

Выведите n + 1 чисел a0, a1, ..., an, где a0 — сложность упорядочивания последовательности в начале, a1 — сложность упорядочивания после замены одной монеты и так далее.

Примечание

Разберём первый пример. Будем обозначать за O монету, вышедшую из обращения, а за X — монету в обращении.

Изначально в ряду лежат монеты, вышедшие из обращения, поэтому Дима один раз просмотрит их слева направо, и не совершит никаких обменов.

После замены Сашей первой монеты на находящуюся в обращении Дима на первом шаге алгоритма три раза поменяет эту монету с последующей, после чего один раз просмотрит монеты и завершит процесс:

XOOO  →  OOOX

После замены Сашей третьей монеты действия Димы выглядят следующим образом:

XOXO  →  OXOX  →  OOXX

После замены Сашей четвёртой монеты действия Димы выглядят следующим образом:

XOXX  →  OXXX

Наконец, после замены Сашей второй монеты весь ряд оказывается состоящим из монет, находящихся в обращении, и Дима один раз просмотрит ряд слева направо.

C. Национальное достояние

2-sat графы поиск в глубину и подобное реализация *2100

Как вы все знаете, в стране Книгерии находится самая большая в мире библиотека. В ней есть десятки тысяч книг, написанных в самые разные периоды человеческой истории.

Здесь была длинная и неинтересная история...

Книгерийский алфавит настолько большой, что его буквы обозначаются целыми положительными числами. Каждая буква алфавита бывает строчной и прописной, прописная версия буквы, соответствующей числу x, обозначается как x'. Кодировка BSCII, используемая повсеместно в Книгерии, устроена таким образом, что прописные буквы упорядочиваются в порядке увеличения числа, обозначающего букву, аналогично упорядочиваются строчные буквы, но при этом все прописные буквы алфавита следуют до всех строчных букв алфавита. Например, верны следующие утверждения: 2 < 3, 2' < 3', 3' < 2.

Слово x1, x2, ..., xa не превосходит слова y1, y2, ..., yb в лексикографическом порядке если верно одно из двух условий:

  • либо a ≤ b и x1 = y1, ..., xa = ya, то есть первое слово является префиксом второго;
  • либо есть такая позиция 1 ≤ j ≤ min(a, b), что x1 = y1, ..., xj - 1 = yj - 1 и xj < yj, то есть, в первой позиции, в которой слова отличаются, в первом слове стоит меньшая буква.

Как следствие, слово «3' 7 5» следует в лексикографическом порядке до слова «2 4' 6». Говорят, что слова в последовательности следуют в лексикографическом порядке, если каждое слово последовательности лексикографически не превосходит следующего слова в последовательности.

У Дениса есть последовательность слов, записанных строчными буквами. Денис хочет поменять некоторые буквы на прописные (такой процесс называется капитализацией) таким образом, чтобы слова стали следовать в лексикографическом порядке. Однако по некоторым причинам он столкнулся с проблемой: он не может капитализировать одну букву в конкретном слове. Единственная операция, которую он может проделать с буквой, это капитализировать все вхождения данной буквы во всех словах. Такую операцию можно проделать любое количество раз с произвольными буквами книгерийского алфавита.

Помогите Денису выбрать, какие буквы надо капитализировать, чтобы слова в заданной последовательности стали идти в лексикографическом порядке, либо определите, что это невозможно.

Обратите внимание, некоторые слова могут совпадать.

Входные данные

В первой строке даются числа n и m (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000) — количество слов и количество букв в книгерийском алфавите соответственно. Буквы книгерийского алфавита обозначаются целыми числами от 1 до m.

Каждая из последующих n строк содержит описание слова в формате li, si, 1, si, 2, ..., si, li (1 ≤ li ≤ 100 000, 1 ≤ si, j ≤ m), где li обозначает длину слова, а si, j задаёт последовательность букв в слове. Слова даны в порядке, в котором они идут в последовательности.

Гарантируется, что суммарная длина всех слов не превышает 100 000.

Выходные данные

В первой строке выведите «Yes» (без кавычек), если возможно капитализировать некоторое подмножество букв таким образом, чтобы последовательность слов стала отсортированной лексикографически. Иначе выведите «No» (без кавычек).

Если требуемое возможно, во второй строке выведите k — количество букв, которые надо капитализировать, а в третьей строке выведите k различных чисел — номера этих букв. Обратите внимание, минимизировать значение k не требуется.

Номера букв можно выводить в любом порядке. Если существует несколько возможных ответов, выведите любой из них.

Примечание

В первом примере слова после капитализации букв 2 и 3 выглядят следующим образом:

  • 2'
  • 1
  • 1 3' 2'
  • 1 1

Верно соотношение 2' < 1, поэтому первое слово лексикографически не превосходит второго. Второе слово является префиксом третьего, следовательно они идут в лексикографическом порядке. Так как у третьего и четвертого слов первая буква совпадает, а 3' < 1, то третье слово не превосходит четвертого лескикографически.

Во втором примере слова уже расположены в лексикографическом порядке, а значит можно не капитализировать буквы.

В третьем примере не существует набора букв, путём капитализации которых можно добиться, чтобы слова были расположены в лексикографическом порядке.

B. Кратность разностей

математика реализация теория чисел *1300

Дан набор из n целых чисел. Требуется выбрать из них ровно k чисел таким образом, что разность любых двух выбранных чисел будет делиться на m, либо определить, что это сделать невозможно.

Числа могут повторяться как в исходном наборе, так и среди выбранных чисел, но количество вхождений любого числа среди выбранных не должно превосходить количества его вхождений в исходный набор.

Входные данные

В первой строке входных данных находятся три целых числа n, k и m (2 ≤ k ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000) — количество чисел в наборе, количество чисел, которые нужно выбрать, и требуемый делитель разности любых двух выбранных чисел.

Во второй строке входных данных находятся n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 109) — числа в наборе.

Выходные данные

Если выбрать k чисел требуемым образом невозможно, то в единственной строке выведите «No» (без кавычек).

Иначе, в первой строке выходных данных выведите «Yes» (без кавычек). Во второй строке выведите k целых чисел b1, b2, ..., bk — выбранные числа. Если существует несколько подходящих решений, выведите любое из них.

A. Леша и сломаный контест

реализация Строки *1100

Как-то раз Леша готовил контест про своих друзей и случайно удалил его. К счастью, все задачи сохранились, но теперь их нужно найти среди других задач.

Но задач слишком много, чтобы сделать это вручную. Леша просит Вас написать программу, которая по названию задачи определит, принадлежит ли задача этому контесту.

Известно, что задача принадлежит контесту тогда и только тогда, когда в ней содержится имя одного друга Леши в качестве подстроки ровно один раз. Его друзей зовут «Danil», «Olya», «Slava», «Ann» и «Nikita».

Имена чувствительны к регистру.

Входные данные

В единственной строке содержится строка из строчных и заглавных букв латинского алфавита, а также знаков «_» длиной не более 100 — название задачи.

Выходные данные

Выведете «YES», если задача принадлежит контесту, и «NO» в противном случае. Вы можете выводить ответ в любом регистре.

B. Составление команд

реализация Структуры данных *2300

В этот раз Берляндская командная олимпиада по информатике проводится в отдалённом городке, куда ходит лишь один небольшой автобус. В нём есть n пассажирских мест, каждое из которых занято за одним из участвующих городов, то есть место i может занять только участник из города ai.

Сегодня автобус сделал m рейсов, каждый раз привозя n участников. Участников выстроили в очередь в порядке прибытия, люди из одного автобуса встают в очередь в том порядке, в котором они занимали места в автобусе. Так, если мы выпишем города, из которых прибыли участники в очереди, мы получим последовательность a1, a2, ..., an, повторенную m раз.

После прибытия всех рейсов участники начинают объединяться в команды. Если в очереди стоят k человек подряд из одного города, они собирают команду и выходят из очереди. Команды образовываются в произвольном порядке, пока есть k человек подряд из одного города.

Помогите организаторам определить, сколько участников будет находиться в очереди после того, как все команды уйдут из очереди. Можно доказать, что ответ не зависит от порядка, в котором образуются команды.

Входные данные

В первой строке содержатся числа n, k и m, разделённые пробелом (1 ≤ n ≤ 105, 2 ≤ k ≤ 109, 1 ≤ m ≤ 109).

Следующая строка содержит n чисел a1, a2, ..., an (1 ≤ ai ≤ 105), где ai — номер города, представитель которого должен занять место i в автобусе.

Выходные данные

Выведите одно число — количество оставшихся в очереди участников.

Примечание

Во втором примере очередь состоит из десяти участников из одного города. Девять из них образуют команду. В конце в очереди будет стоять лишь участник.

A. Диагноз Бори

реализация *900

Кажется, Боря серьезно заболел. Чтобы проверить это и узнать точный диагноз, ему нужно пройти обследование у n врачей. Каждому из врачей требуется вся информация обо всех предыдущих обследованиях, поэтому Боря должен посещать их в заданном порядке (т. е. сначала посетить доктора 1, затем доктора 2, затем доктора 3 и так далее). И только от последнего врача Боря получит информацию о своём здоровье.

График работы у врачей непростой. Врач под номером i выходит на работу в день si и работает каждый di-й день. Таким образом, он работает в дни si, si + di, si + 2di, ....

Приём врача занимает довольно много времени, поэтому Боря не может посещать более чем одного врача за день. За какое наименьшее время он сможет обойти всех врачей?

Входные данные

В первой строке содержится число n — количество врачей (1 ≤ n ≤ 1000).

Следующие n строк содержат по два числа si и di (1 ≤ si, di ≤ 1000).

Выходные данные

Выведите наименьший возможный номер дня, в который Боря может получить результат.

Примечание

В первом примере Боря может посетить врачей в дни 2, 3 и 4.

Во втором примере Боря может посетить врачей в дни 10 и 11.

B. Настольный теннис

реализация Структуры данных *1200

К теннисному столу выстроилась очередь из n человек. Сначала первые двое играют партию в теннис. Потом проигравший встаёт в конец очереди, а победитель играет со следующим человеком из очереди, и так далее. Они играют до тех пор, пока кто-нибудь не выиграет в k партиях подряд. Этот игрок признаётся победителем.

Про каждого из участников вы знаете его силу игры в теннис, и у всех игроков они различны. В партии всегда побеждает игрок с большей силой. Определите, кто станет победителем.

Входные данные

В первой строке находятся два числа, разделённые пробелом: n и k (2 ≤ n ≤ 500, 2 ≤ k ≤ 1012) — количество людей и количество побед подряд, после которого игрок становится победителем, соответственно.

В следующей строке содержится n целых чисел a1, a2, ..., an (1 ≤ ai ≤ n), выражающих силу игроков. Гарантируется, что эта строка содержит перестановку, то есть все ai различны.

Выходные данные

Выведите одно число — силу победителя.

Примечание

Партии во втором примере:

3 играет с 1. 3 побеждает, 1 идет в конец очереди.

3 играет с 2. 3 побеждает. У него две победы подряд, он становится победителем.

A. Аккорд

Перебор реализация *1200

Вася учится музыке.

Он уже знает много интересного. Например, он знает, что существует 12 нот: C, C#, D, D#, E, F, F#, G, G#, A, B, H. Еще он знает, что далее ноты повторяются по циклу: за H снова идет C, а перед C стоит H. Ноту C в начале этого ряда и ноту C после H мы считаем одинаковыми и будем отождествлять. Расстояние между нотами по звукоряду измеряется в тонах: между двумя последовательными нотами ровно один полутон, то есть 0,5 тона. Расстояние берется от нижней ноты к верхней, то есть расстояние между C и E — 4 полутона, а между E и C — 8 полутонов.

Еще Вася знает, что такое аккорд. Аккорд — это неупорядоченный набор из не менее чем трех нот. Однако Вася пока разбирается лишь с трезвучиями, то есть с аккордами ровно из трех нот. Он уже различает два вида трезвучий — мажорные и минорные.

Определим мажорное трезвучие. Пусть трезвучие состоит из нот X, Y и Z. Если мы можем так упорядочить ноты, что расстояние по звукоряду между X и Y — 4 полутона, а между Y и Z — 3 полутона, то трезвучие называется мажорным. Соответственно, между X и Z образовывается интервал в 7 полутонов.

Минорное трезвучие отличается тем, что расстояние между X и Y должно быть 3 полутона, а между Y и Z — 4 полутона.

Например, трезвучие «C E G» является мажорным: между C и E — 4 полутона, а между E и G — 3. А трезвучие «C# B F» является минорным, потому что если мы упорядочим ноты как «B C# F», то между B и C# будет 3 полутона, а между C# и F — как раз 4.

Помогите Васе классифицировать трезвучие, данное ему учительницей.

Входные данные

В единственной строке через пробел записаны 3 ноты в обозначении, указанном выше.

Выходные данные

Выведите «major», если аккорд является мажорным, «minor», если минорным, и «strange», если учительница подсунула Васе какой-то странный аккорд, не являющийся ни мажорным, ни минорным. Вася обещает вам, что ответ всегда будет однозначным. То есть не бывает аккордов, являющихся одновременно мажорными и минорными.

B. Клавиатура

реализация *1500

Вася учится печатать. У него в распоряжении есть необычная клавиатура: она прямоугольная, с n рядами клавиш по m клавиш в каждом, причем клавиши бывают двух типов. На некоторых написаны маленькие латинские буквы, а некоторые клавиши играют роль клавиши «Shift» на обычной клавиатуре, то есть делают маленькие буквы большими.

Одной рукой Вася может нажать на одну или на две клавиши, причем на две можно нажать только если евклидово расстояние между центрами клавиш не превосходит x. Клавиши считаются квадратами со стороной 1. Между соседними клавишами нет пустого пространства.

Вася — очень ленивый мальчик, поэтому он старается печатать одной рукой — второй он ест чипсы. Однако может так случиться, что какой-то символ одной рукой не набирается, потому что расстояние от него до ближайшей клавиши «Shift» строго больше x. В таком случае ему приходится задействовать вторую руку. После набора этого символа он возвращает ее обратно к чипсам.

Вам дана Васина клавиатура и текст. Посчитайте минимальное количество раз, которое Васе придется использовать вторую руку.

Входные данные

В первой строке заданы три целых числа — n, m, x (1 ≤ n, m ≤ 30, 1 ≤ x ≤ 50).

В последующих n строках описываются все клавиши клавиатуры. Каждая строка содержит описание ровно m клавиш, без пробелов. Клавиши-буквы обозначаются соответствующими маленькими буквами. Клавиши «Shift» обозначается символом «S».

Далее идет длина текста q (1 ≤ q ≤ 5·105). В последней строке дан текст T, состоящих из q символов: больших и маленьких латинских букв.

Выходные данные

Если Вася может набрать текст, то выведите минимальное количество раз, которое ему придется задействовать вторую руку. В противном случае выведите «-1» (без кавычек).

Примечание

В первом примере символ «A» напечатать невозможно, так как клавиши «Shift» на клавиатуре нет.

Во втором примере невозможно напечатать символ «e», так как такой клавиши нет на клавиатуре.

В четвертом примере невозможно одной рукой напечатать символы «T», «G». Все остальные, которые есть на клавиатуре, напечатать можно. Эти символы встречаются в тексте 2 раза, поэтому ответ 2.

A. Automatic Door

реализация *2200

There is an automatic door at the entrance of a factory. The door works in the following way:

  • when one or several people come to the door and it is closed, the door immediately opens automatically and all people immediately come inside,
  • when one or several people come to the door and it is open, all people immediately come inside,
  • opened door immediately closes in d seconds after its opening,
  • if the door is closing and one or several people are coming to the door at the same moment, then all of them will have enough time to enter and only after that the door will close.

For example, if d = 3 and four people are coming at four different moments of time t1 = 4, t2 = 7, t3 = 9 and t4 = 13 then the door will open three times: at moments 4, 9 and 13. It will close at moments 7 and 12.

It is known that n employees will enter at moments a, 2·a, 3·a, ..., n·a (the value a is positive integer). Also m clients will enter at moments t1, t2, ..., tm.

Write program to find the number of times the automatic door will open. Assume that the door is initially closed.

Input

The first line contains four integers n, m, a and d (1 ≤ n, a ≤ 109, 1 ≤ m ≤ 105, 1 ≤ d ≤ 1018) — the number of the employees, the number of the clients, the moment of time when the first employee will come and the period of time in which the door closes.

The second line contains integer sequence t1, t2, ..., tm (1 ≤ ti ≤ 1018) — moments of time when clients will come. The values ti are given in non-decreasing order.

Output

Print the number of times the door will open.

Note

In the first example the only employee will come at moment 3. At this moment the door will open and will stay open until the moment 7. At the same moment of time the client will come, so at first he will enter and only after it the door will close. Thus the door will open one time.

C. Downloading B++

Бинарный поиск реализация *2300

Only T milliseconds left before the start of well-known online programming contest Codehorses Round 2017.

Polycarp needs to download B++ compiler to take part in the contest. The size of the file is f bytes.

Polycarp's internet tariff allows to download data at the rate of one byte per t0 milliseconds. This tariff is already prepaid, and its use does not incur any expense for Polycarp. In addition, the Internet service provider offers two additional packages:

  • download a1 bytes at the rate of one byte per t1 milliseconds, paying p1 burles for the package;
  • download a2 bytes at the rate of one byte per t2 milliseconds, paying p2 burles for the package.

Polycarp can buy any package many times. When buying a package, its price (p1 or p2) is prepaid before usage. Once a package is bought it replaces the regular tariff until package data limit is completely used. After a package is consumed Polycarp can immediately buy a new package or switch to the regular tariff without loosing any time. While a package is in use Polycarp can't buy another package or switch back to the regular internet tariff.

Find the minimum amount of money Polycarp has to spend to download an f bytes file no more than in T milliseconds.

Note that because of technical reasons Polycarp can download only integer number of bytes using regular tariff and both packages. I.e. in each of three downloading modes the number of downloaded bytes will be integer. It means that Polycarp can't download a byte partially using the regular tariff or/and both packages.

Input

The first line contains three integer numbers f, T and t0 (1 ≤ f, T, t0 ≤ 107) — size of the file to download (in bytes), maximal time to download the file (in milliseconds) and number of milliseconds to download one byte using the regular internet tariff.

The second line contains a description of the first additional package. The line contains three integer numbers a1, t1 and p1 (1 ≤ a1, t1, p1 ≤ 107), where a1 is maximal sizes of downloaded data (in bytes), t1 is time to download one byte (in milliseconds), p1 is price of the package (in burles).

The third line contains a description of the second additional package. The line contains three integer numbers a2, t2 and p2 (1 ≤ a2, t2, p2 ≤ 107), where a2 is maximal sizes of downloaded data (in bytes), t2 is time to download one byte (in milliseconds), p2 is price of the package (in burles).

Polycarp can buy any package many times. Once package is bought it replaces the regular tariff until package data limit is completely used. While a package is in use Polycarp can't buy another package or switch back to the regular internet tariff.

Output

Print the minimum amount of money that Polycarp needs to pay to download B++ compiler no more than in T milliseconds. If there is no solution, print the only integer -1.

Note

In the first example Polycarp has to buy the first additional package 5 times and do not buy the second additional package. He downloads 120 bytes (of total 26·5 = 130 bytes) in 120·8 = 960 milliseconds (960 ≤ 964). He spends 8·5 = 40 burles on it.

In the second example Polycarp has enough time to download 10 bytes. It takes 10·20 = 200 milliseconds which equals to upper constraint on download time.

In the third example Polycarp has to buy one first additional package and one second additional package.

In the fourth example Polycarp has no way to download the file on time.

E. Field of Wonders

реализация Строки *1500

Polycarpus takes part in the "Field of Wonders" TV show. The participants of the show have to guess a hidden word as fast as possible. Initially all the letters of the word are hidden.

The game consists of several turns. At each turn the participant tells a letter and the TV show host responds if there is such letter in the word or not. If there is such letter then the host reveals all such letters. For example, if the hidden word is "abacaba" and the player tells the letter "a", the host will reveal letters at all positions, occupied by "a": 1, 3, 5 and 7 (positions are numbered from left to right starting from 1).

Polycarpus knows m words of exactly the same length as the hidden word. The hidden word is also known to him and appears as one of these m words.

At current moment a number of turns have already been made and some letters (possibly zero) of the hidden word are already revealed. Previously Polycarp has told exactly the letters which are currently revealed.

It is Polycarpus' turn. He wants to tell a letter in such a way, that the TV show host will assuredly reveal at least one more letter. Polycarpus cannot tell the letters, which are already revealed.

Your task is to help Polycarpus and find out the number of letters he can tell so that the show host will assuredly reveal at least one of the remaining letters.

Input

The first line contains one integer n (1 ≤ n ≤ 50) — the length of the hidden word.

The following line describes already revealed letters. It contains the string of length n, which consists of lowercase Latin letters and symbols "*". If there is a letter at some position, then this letter was already revealed. If the position contains symbol "*", then the letter at this position has not been revealed yet. It is guaranteed, that at least one letter is still closed.

The third line contains an integer m (1 ≤ m ≤ 1000) — the number of words of length n, which Polycarpus knows. The following m lines contain the words themselves — n-letter strings of lowercase Latin letters. All words are distinct.

It is guaranteed that the hidden word appears as one of the given m words. Before the current move Polycarp has told exactly the letters which are currently revealed.

Output

Output the single integer — the number of letters Polycarpus can tell so that the TV show host definitely reveals at least one more letter. It is possible that this number is zero.

Note

In the first example Polycarpus can tell letters "b" and "c", which assuredly will be revealed.

The second example contains no letters which can be told as it is not clear, which of the letters "v" or "s" is located at the third position of the hidden word.

In the third example Polycarpus exactly knows that the hidden word is "aba", because in case it was "aaa", then the second letter "a" would have already been revealed in one of previous turns.

F. Lost in Transliteration

реализация *1300

There are some ambiguities when one writes Berland names with the letters of the Latin alphabet.

For example, the Berland sound u can be written in the Latin alphabet as "u", and can be written as "oo". For this reason, two words "ulyana" and "oolyana" denote the same name.

The second ambiguity is about the Berland sound h: one can use both "h" and "kh" to write it. For example, the words "mihail" and "mikhail" denote the same name.

There are n users registered on the Polycarp's website. Each of them indicated a name represented by the Latin letters. How many distinct names are there among them, if two ambiguities described above are taken into account?

Formally, we assume that two words denote the same name, if using the replacements "u "oo" and "h "kh", you can make the words equal. One can make replacements in both directions, in any of the two words an arbitrary number of times. A letter that resulted from the previous replacement can participate in the next replacements.

For example, the following pairs of words denote the same name:

  • "koouper" and "kuooper". Making the replacements described above, you can make both words to be equal: "koouper" "kuuper" and "kuooper" "kuuper".
  • "khun" and "kkkhoon". With the replacements described above you can make both words to be equal: "khun" "khoon" and "kkkhoon" "kkhoon" "khoon".

For a given list of words, find the minimal number of groups where the words in each group denote the same name.

Input

The first line contains integer number n (2 ≤ n ≤ 400) — number of the words in the list.

The following n lines contain words, one word per line. Each word consists of only lowercase Latin letters. The length of each word is between 1 and 20 letters inclusive.

Output

Print the minimal number of groups where the words in each group denote the same name.

Note

There are four groups of words in the first example. Words in each group denote same name:

  1. "mihail", "mikhail"
  2. "oolyana", "ulyana"
  3. "kooooper", "koouper"
  4. "hoon", "khun", "kkkhoon"

There are five groups of words in the second example. Words in each group denote same name:

  1. "hariton", "kkkhariton", "khariton"
  2. "hkariton"
  3. "buoi", "boooi", "boui"
  4. "bui"
  5. "boi"

In the third example the words are equal, so they denote the same name.

H. Palindromic Cut

Перебор реализация Строки *1800

Kolya has a string s of length n consisting of lowercase and uppercase Latin letters and digits.

He wants to rearrange the symbols in s and cut it into the minimum number of parts so that each part is a palindrome and all parts have the same lengths. A palindrome is a string which reads the same backward as forward, such as madam or racecar.

Your task is to help Kolya and determine the minimum number of palindromes of equal lengths to cut s into, if it is allowed to rearrange letters in s before cuttings.

Input

The first line contains an integer n (1 ≤ n ≤ 4·105) — the length of string s.

The second line contains a string s of length n consisting of lowercase and uppercase Latin letters and digits.

Output

Print to the first line an integer k — minimum number of palindromes into which you can cut a given string.

Print to the second line k strings — the palindromes themselves. Separate them by a space. You are allowed to print palindromes in arbitrary order. All of them should have the same length.

K. Road Widening

жадные алгоритмы Конструктив реализация *1800

Mayor of city S just hates trees and lawns. They take so much space and there could be a road on the place they occupy!

The Mayor thinks that one of the main city streets could be considerably widened on account of lawn nobody needs anyway. Moreover, that might help reduce the car jams which happen from time to time on the street.

The street is split into n equal length parts from left to right, the i-th part is characterized by two integers: width of road si and width of lawn gi.

For each of n parts the Mayor should decide the size of lawn to demolish. For the i-th part he can reduce lawn width by integer xi (0 ≤ xi ≤ gi). After it new road width of the i-th part will be equal to s'i = si + xi and new lawn width will be equal to g'i = gi - xi.

On the one hand, the Mayor wants to demolish as much lawn as possible (and replace it with road). On the other hand, he does not want to create a rapid widening or narrowing of the road, which would lead to car accidents. To avoid that, the Mayor decided that width of the road for consecutive parts should differ by at most 1, i.e. for each i (1 ≤ i < n) the inequation |s'i + 1 - s'i| ≤ 1 should hold. Initially this condition might not be true.

You need to find the the total width of lawns the Mayor will destroy according to his plan.

Input

The first line contains integer n (1 ≤ n ≤ 2·105) — number of parts of the street.

Each of the following n lines contains two integers si, gi (1 ≤ si ≤ 106, 0 ≤ gi ≤ 106) — current width of road and width of the lawn on the i-th part of the street.

Output

In the first line print the total width of lawns which will be removed.

In the second line print n integers s'1, s'2, ..., s'n (si ≤ s'i ≤ si + gi) — new widths of the road starting from the first part and to the last.

If there is no solution, print the only integer -1 in the first line.

A. Чтение книги

реализация *800

Недавно Люба купила себе очень интересную книгу. Она знает, что сможет прочитать её ровно за t секунд. Так как книга очень интересная, Люба хочет прочитать её как можно быстрее.

Но в каждые из n суток у неё есть очень важные дела, которые она должна выполнять. Продолжительность занятости Любы в i-е сутки составляет ai секунд. Всё остальное время она может тратить на прочтение книги.

Помогите Любе определить минимальный номер суток, в которые она может закончить читать книгу.

Гарантируется, что номер этих суток не превосходит n.

Напомним, что в сутках 86400 секунд.

Входные данные

В первой строке входных данных задано два целых числа n и t (1 ≤ n ≤ 100, 1 ≤ t ≤ 106) — количество суток и время, необходимое для прочтения книги.

В следующей строке задано n целых чисел ai (0 ≤ ai ≤ 86400) — продолжительности занятости Любы в i-е сутки.

Выходные данные

В единственной строке входных данных выведите минимальный номер суток, в которые Люба сможет прочитать книгу.

Гарантируется, что номер этих суток не превосходит n.

B. Мишка и японские кроссворды

реализация *1100

Одномерный японский кроссворд можно представить в виде двоичной строки длины x. Закодируем его в массив a длины n, где n — количество отрезков, состоящих полностью из цифр 1, ai — длина i-го отрезка. Никакая пара отрезков не касается и не пересекается.

Например:

  • Если x = 6 и кроссворд 111011, тогда он кодируется в {3, 2};
  • Если x = 8 и кроссворд 01101010, тогда он кодируется в {2, 1, 1};
  • Если x = 5 и кроссворд 11111, тогда он кодируется в {5};
  • Если x = 5 и кроссворд 00000, тогда он кодируется пустым массивом.

Мишка хочет нарисовать новый японский кроссворд. Он уже выбрал длину и закодированную версию кроссворда. Теперь он хочет проверить, что существует ровно один кроссворд такой, что его длина и закодированная версия совпадают с выбранными. Помогите ему проверить это!

Входные данные

В первой строке записаны два целых числа n и x (1 ≤ n ≤ 100000, 1 ≤ x ≤ 109) — количество элементов в закодированной версии кроссворда и длина кроссворда, выбранные Мишкой.

Во второй строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 10000) — закодированная версия кроссворда.

Выходные данные

Выведите YES, если существует ровно один кроссворд с заданной длиной и закодированной версией. Иначе выведите NO.

C. Петя и катакомбы

Деревья жадные алгоритмы реализация снм *1300

Однажды Петя — очень храбрый исследователь — решил заняться изучением великих парижских катакомб. Так как Петя не очень опытный в этом деле, его исследование заключается в хождении по катакомбам.

Катакомбы представляют из себя набор комнат, некоторые из которых соединены переходами, переход может соединять комнату с самой собой, по переходам можно ходить в любую сторону. Переходы могут находиться на разных глубинах, что позволяет им не пересекаться. Каждую минуту Петя выбирает произвольным образом переход из комнаты, в которой он находится, и проходит его за одну минуту. Когда он заходит в комнату в минуту i, он делает в журнал запись — число ti:

  • Если Петя уже был в этой комнате, он записывает минуту, когда он был в этой комнате в предыдущий раз;
  • Иначе Петя записывает в журнал произвольное неотрицательное целое число, строго меньшее текущей минуты i.

Изначально Петя находился в какой-то из комнат в минуту 0, при этом число t0 он не записывал.

В какой-то момент Петя устал, бросил журнал и пошёл домой (не обязательно в той же комнате, из которой он начинал). Вася нашёл этот журнал, и теперь ему интересно: какое наименьшее количество комнат может быть в катакомбах, согласно журналу Пети?

Входные данные

В первой строке находится одно целое число n (1 ≤ n ≤ 2·105) — количество записей в журнале Пети.

Во второй строке находятся n целых чисел t1, t2, ..., tn (0 ≤ ti < i) — записи в журнале.

Выходные данные

В первой строке выведите единственное число — минимальное возможное количество комнат в парижских катакомбах.

Примечание

В первом тестовом примере последовательность комнат, по которым прошёл Петя, могла быть 1 → 1 → 2 или 1 → 2 → 1, или, например, 1 → 2 → 3. Минимальное число комнат равно 2.

Во втором тестовом примере эта последовательность могла быть 1 → 2 → 3 → 1 → 2 → 1.

D. Восстановление строки

графы Конструктив реализация *2000

Назовем подстроку некоторой строки самой частой, если количество ее вхождений не меньше количества вхождений любой другой подстроки.

Дано множество строк. Назовем какую-то строку хорошей, если все элементы множества являются ее самыми частыми подстроками. Восстановите непустую минимальную по длине хорошую строку, а из таких — лексикографически минимальную. Если же таких строк не существует, то выведите «NO» (без кавычек).

Подстрокой называется непрерывная подпоследовательность букв строки. Например, «ab», «c», «abc» являются подстроками строки «abc», а «ac» — нет.

Количество вхождений подстроки в строку равно количеству таких позиций в данной строке, в которых встречается данная подстрока. Вхождения подстроки могут перекрываться.

Строка a лексикографически меньше строки b, если a является префиксом b, или в a стоит меньшая буква на первой позиции, где a и b отличаются.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 105) — количество строк в данном множестве.

Далее следуют n строк, каждая из которых содержит непустую строку из строчных латинских букв. Гарантируется, что все строки различны.

Суммарная длина всех данных строк не превышает 105.

Выходные данные

Выведите непустую минимальную по длине хорошую строку, а из таких минимальную лексикографически, либо «NO» (без кавычек), если таких строк не существует.

Примечание

Можно показать, что в первом тесте есть два варианта хорошей строки минимальной длины: «cfmailru» и «mailrucf». Первый вариант является минимальным лексикографически.

A. Div. 64

реализация *1000

Топ-модель Изабелла участвует в конкурсе. Чтобы поразить судей, ей нужно продемонстрировать свои математические таланты.

Испытание будет следующим: для заданной строки, состоящей только из 0 и 1, сказать, возможно ли вычеркнуть какие-то цифры так, чтобы оставшиеся цифры являлись записью натурального числа, делящегося на 64, в двоичной системе счисления.

Входные данные

В первой строке дана непустая двоичная строка s длины не более 100.

Выходные данные

Выведите «yes» (без кавчек), если возможно вычеркнуть цифры требуемым образом, и «no» (без кавычек) иначе.

Примечание

В первом примере можно получить строку 1 000 000, которая является двоичной записью числа 64, вычеркнув две единицы.

Больше о двоичной системе счисления можно прочитать по ссылке: https://ru.wikipedia.org/wiki/Двоичная_система_счисления

B. Кубики для Маши

Перебор реализация *1300

На день рождения маленькой Маше-растеряше подарили набор кубиков, о которых она давно мечтала. Набор состоит из n кубиков.

На каждой из 6 граней каждого кубика написана ровно одна цифра от 0 до 9. Маше стало интересно для какого наибольшего натурального числа x она может составить все числа от 1 до x при помощи кубиков.

Для этого Маша может поворачивать кубики и ставить их в ряд. После этого она смотрит на верхние грани использованных кубиков слева направо и составляет из этих цифр число.

Число не может содержать лидирующие нули. При составлении числа не обязательно использовать все кубики. Если Маша не может получить даже число 1, то следует вывести число 0.

Обратите внимание: Маша не может получить цифру 6 из цифры 9, или 9 из 6 при перевороте кубика.

Входные данные

В первой строке дано целое число n (1 ≤ n ≤ 3) - количество кубиков, которое подарили Маше.

В следующих n строк записано по 6 целых чисел aij (0 ≤ aij ≤ 9) — число на j-й грани i-го кубика.

Выходные данные

Выведите единственное число — такое максимальное x, что Маша-растеряша может собрать из кубиков все числа от 1 до x или 0, если она не может собрать даже число 1.

Примечание

В первом примере Маша может составить все числа от 1 до 87, но число 88 она не может составить, так как нет двух кубиков с цифрами 8.

C. Сборка кубика

Перебор реализация *1500

В перерывах между конкурсами топ-модель Изабелла старается не скучать и развиваться. Например, сейчас она учится собирать кубик Рубика 2x2x2.

Сразу научиться собирать кубик довольно непросто, поэтому она сначала хочет научиться понимать, можно ли из текущего положения собрать кубик поворотом ровно одной грани на 90 градусов в любую сторону.

Чтобы проверять правильность своих ответов, ей хочется иметь программу, которая будет по заданной раскраске граней кубика говорить, можно ли его собрать требуемым образом.

Кубик является собранным, если для каждой грани верно, что все квадратики этой грани имеют один цвет.

https://ru.wikipedia.org/wiki/Кубик_Рубика

Входные данные

В первой строке дана последовательность из 24 целых чисел ai (1 ≤ ai ≤ 6), где ai — номер цвета i-го квадратика. Гарантируется, что каждый из цветов встречается ровно 4 раза.

Выходные данные

Выведите «YES», если кубик можно собрать поворотом одной грани, и «NO» иначе.

Примечание

В первом тестовом примере раскраска выглядит так:

Во втором тестовом примере раскраска выглядит так:

Кубик можно собрать поворотом грани, содержащей квадратики 13, 14, 15, 16.

A. Локальные экстремумы

Перебор реализация *800

Вам дан массив a. Некоторый элемент массива ai называется локальным минимумом, когда он строго меньше своих соседей (то есть, ai < ai - 1 и ai < ai + 1). Элемент называется локальным максимумом, когда он строго больше своих соседей (ai > ai - 1 и ai > ai + 1). Так как у a1 и an есть только по одному соседу, они не являются ни локальными минимумами, ни локальными максимумами.

Элемент называется локальным экстремумом, когда он либо локальный минимум, либо локальный максимум. Посчитайте количество локальных экстремумов в данном массиве.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 1000) — количество элементов в массиве a.

Во второй строке записаны n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1000) — элементы массива a.

Выходные данные

Выведите количество локальных экстремумов в данном массиве.

C. К-доминирующий символ

Бинарный поиск реализация *1400

Вам дана строка s, состоящая из строчных латинских букв. Символ c называется k-доминирующим, когда каждая подстрока s длины не меньше k содержит символ c.

Найдите минимальное значение k такое, что в строке существует хотя бы один k-доминантный символ.

Входные данные

Первая строка — строка s, состоящая из строчных латинских букв (1 ≤ |s| ≤ 100000).

Выходные данные

Выведите одно число — минимальное значение k такое, что в строке существует хотя бы один k-доминантный символ.

B. Библиотека виджетов

графы дп Разбор выражений реализация *2300

Вася пишет свою собственную библиотеку для построения графического пользовательского интерфейса. Свое детище Вася назвал VTK (VasyaToolKit). Одним из интересных аспектов данной библиотеки является упаковка виджетов друг в друга.

Виджетом называется некоторый элемент графического интерфейса. Каждый виджет имеет ширину и высоту, и занимает некоторый прямоугольник на экране. В Васиной библиотеке любой виджет имеет тип Widget. Далее для простоты мы будем отождествлять виджет и его тип.

Типы HBox и VBox — производные от типа Widget, поэтому тоже являются типами Widget. Виджеты HBox и VBox — особенные. Они могут хранить в себе другие виджеты. Оба эти виджета с помощью метода pack() могут вложить непосредственно в себя какой либо другой виджет. Виджеты типов HBox и VBox могут хранить в себе несколько других виджетов, в том числе несколько одинаковых — они просто будут отображены несколько раз. В результате выполнения метода pack() сохраняется только ссылка на вложенный виджет, то есть при изменении вложенного виджета, его изображение в виджете, в который он вложен, тоже изменится.

Будем считать, что виджет a вложен в виджет b если существует цепочка виджетов a = c1, c2, ..., ck = b, k ≥ 2, для которых ci вложен непосредственно в ci + 1 для любого 1 ≤ i < k. В Васиной библиотеке не допускается ситуация, что виджет a вложен в виджет a (то есть в себя) — при попытке вложить виджеты друг в друга таким образом сразу же выдается ошибка.

Также виджеты HBox и VBox имеют параметры border и spacing, которые задаются методами set_border() и set_spacing() соответственно. По умолчанию оба этих параметра равны 0.

На картинке выше видно каким образом виджеты упаковываются в HBox и VBox. При этом HBox и VBox автоматически меняют свой размер в зависимости от размеров вложенных виджетов. Сами HBox и VBox отличаются только тем, что в HBox виджеты упаковываются по горизонтали, а в VBox — по вертикали. При этом параметр spacing задает расстояние между соседними виджетами, а border — рамку вокруг всех вложенных виджетов нужной ширины. Вложенные виджеты располагаются ровно в том порядке, в котором для них был вызван метод pack(). Если внутри HBox или VBox нет ни одного вложенного виджета, то их размеры равны 0 × 0 вне зависимости от параметров border и spacing.

Построение всех виджетов идет с помощью скриптового языка VasyaScript. Описание этого языка вы найдете в описании входных данных.

Для контрольной проверки верности своего кода Вася просит написать вас программу, вычисляющую размеры всех виджетов по исходному коду на языке VasyaScript.

Входные данные

В первой строке находится целое число n — количество инструкций (1 ≤ n ≤ 100). В последующих n строках располагаются инструкции на языке VasyaScript по одной инструкции на строку. Ниже приведен список возможных инструкций.

  • «Widget [name]([x],[y])» — создание нового виджета [name] типа Widget шириной [x] единиц и высотой [y] единиц.
  • «HBox [name]» — создать новый виджет [name] типа HBox.
  • «VBox [name]» — создать новый виджет [name] типа VBox.
  • «[name1].pack([name2])» — упаковать виджет [name2] в виджет [name1]. При этом виджет [name1] должен иметь тип HBox или VBox.
  • «[name].set_border([x])» — установить виджету [name] параметр border в [x] единиц. Виджет [name] должен иметь тип HBox или VBox.
  • «[name].set_spacing([x])» — установить виджету [name] параметр spacing в [x] единиц. Виджет [name] должен иметь тип HBox или VBox.

Все инструкции записаны без пробелов в начале и в конце строки, слова внутри инструкции разделены ровно одним пробелом. Непосредственно перед числами и непосредственно после них пробелов нет.

Регистр букв имеет значение, то есть, например «wiDget x» — некорректная инструкция. Во входных данных регистр букв соблюден.

Все названия виджетов состоят из малых латинских букв и имеют длину от 1 до 10 символов включительно. Названия всех виджетов попарно различны. Все числа в скрипте целые от 0 до 100 включительно.

Гарантируется, что приведенный скрипт корректен, то есть все действия с виджетами происходят после их создания и никакой виджет не вложен сам в себя. Гарантируется, что в скрипте создается хотя бы один виджет.

Выходные данные

Для каждого виджета в отдельной строке выведите через пробел его название, ширину и высоту. Строки должны быть упорядочены лексикографически по названию виджета.

Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).

Примечание

В первом примере виджеты располагаются следующим образом:

C. Игра с фишками

Перебор реализация Структуры данных *2300

Рассмотрим следующую игру. Имеется прямоугольное поле размера n × m, в некоторых клетках которого находятся фишки.

На каждой фишке нарисована стрелка. Таким образом, каждая фишка на поле показывает в одном из направлений: вверх, вниз, налево или направо.

Игрок может выбрать одну из фишек и сделать ей ход.

Ход подразумевает следующую последовательность действий. Выбранная фишка назначается текущей. После этого игрок проверяет есть ли фишки в той же строке (или в том же столбце), что и текущая фишка, на которые указывает стрелка текущей фишки. Если там есть хотя бы одна фишка, то ближайшая из них назначается новой текущей фишкой, а бывшая текущая фишка удаляется с поля. После этого проверка повторяется. Этот процесс может повторяться несколько. Если новая фишка не найдена, текущая фишка удаляется с поля и ход игрока заканчивается.

В результате хода игрок получает некоторое количество очков, равное количеству удаленных фишек.

По заданной начальной расстановке фишек определите максимальное количество очков, которое может получить игрок за один ход, а также количество таких ходов.

Входные данные

В первой строке даны два целых числа n и m (1 ≤ n, m, n × m ≤ 5000). Далее идут n строк по m символов в каждой — описание игрового поля. «.» означает, что данная клетка пуста. «L», «R», «U», «D» означают, что в данной клетке есть фишка и стрелка на ней указывает налево, направо, вверх или вниз соответственно.

Гарантируется, что на поле имеется хотя бы одна фишка.

Выходные данные

Выведите два числа — максимальное количество очков, которое может получить игрок за один ход и количество ходов, позволяющих получить это максимальное количество очков.

Примечание

В первом примере наибольшее количество очков приносит фишка в позиции (3, 3). Ее ход можно проследить на следующей картинке:

Все остальные фишки приносят меньше очков.

A. Алчность

жадные алгоритмы реализация *900

У Жафара есть n банок колы. Каждую банку можно описать двумя числами: оставшимся объемом колы в ней ai и ее вместительностью bi (ai  ≤  bi).

Жафар решил перелить всю оставшуюся колу в 2 банки. Определите, может ли он это сделать, или нет.

Входные данные

Первая строка содержит одно целое число n (2 ≤ n ≤ 100 000) — количество банок колы.

Вторая строка содержит n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 109) — объем колы в каждой банке.

Третья строка содержит n целых чисел b1, b2, ..., bn (ai ≤ bi ≤ 109) — вместительности банок.

Выходные данные

Выведите «YES» (без кавычек), если возможно перелить всю оставшуюся колу в 2 банки. Иначе выведите «NO» (без кавычек).

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере кола изначально в 2 банках, поэтому ответ «YES».

B. Гнев

жадные алгоритмы реализация *1200

Руки, проливающие кровь невинную.

В линию выстроены n виновных людей, i-й из них держит в руках коготь длины Li. По звонку каждый человек убивает нескольких людей перед собой. Все люди убивают одновременно. А именно, i-й человек убивает j-го человека если и только если j < i и j ≥ i - Li.

Вам даны длины когтей. Найдите число людей, которые останутся в живых после того, как прозвенит звонок.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 106) — количество виновных людей.

Вторая строка содержит n целых чисел L1, L2, ..., Ln (0 ≤ Li ≤ 109), где Li — длина когтя в руках i-го человека.

Выходные данные

Выведите одно число — количество человек, которые останутся в живых после того, как прозвенит звонок.

Примечание

В первом примере последний человек убьет всех перед собой.

A. Шахматы для троих

реализация *900

Алексей, Борис и Василий скоро примут участие в командном шахматном соревновании. Так как они все в одной команде, они решали вместе потренироваться перед турниром. Однако, это оказалось сделать не так просто, ведь шахматы — игра для двух человек.

Тогда они решили играть по следующим правилам:

  • Алексей и Борис играют первую игру, Василий наблюдает;
  • Когда игра заканчивается, проигравший становится наблюдателем, а предыдущий наблюдатель садится играть против победителя.

Алексей, Борис и Василий играют таким образом, что ничьих не случается.

Сегодня они сыграли n игр, после каждой запоминали победителя. Они решили записать историю игр, описывающую, кто победил в каждой из них. Но теперь они сомневаются, что записанная информация корректна, и хотят узнать, могла ли получиться такая история (то есть, нет таких игр, в которых побеждает игрок, следящий за матчем). Помогите им проверить это!

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 100) — количество игр, сыгранных Алексеем, Борисом и Василием.

Далее идет n строк, описывающие историю игр. i-я строка содержит одно целое число ai (1 ≤ ai ≤ 3), равное 1, если Алексей победил в i-й игре, 2 — Борис победил в i-й игре и 3 — Василий победил в i-й игре.

Выходные данные

Выведите YES, если такая история игр возможна. В противном случае выведите NO.

Примечание

В первом примере возможна следующая ситуация:

  1. Алексей выигрывает, следующую партию вместо Бориса играет Василий;
  2. Алексей выигрывает, Борис заменяет Василия;
  3. Борис выигрывает.

Ситуация во втором примере невозможна, так как Борис проигрывает первую партию и поэтому не может участвовать во второй.

B. Прекрасные делители

Перебор реализация *1000

Недавно Люба узнала о существовании прекрасных чисел. Число называется прекрасным, если в своей двоичной записи оно имеет сначала k + 1 единицу, а потом k нулей.

Примеры прекрасных чисел:

  • 12 (110);
  • 1102 (610);
  • 11110002 (12010);
  • 1111100002 (49610).

Более формально, число является прекрасным, если существует такое целое положительное k, что оно имеет вид (2k - 1) * (2k - 1).

У Любы есть число n, она хочет найти его максимальный прекрасный делитель. Помогите ей с этим!

Входные данные

В единственной строке входных данных задано целое число n (1 ≤ n ≤ 105) — число, для которого Люба хочет найти максимальный прекрасный делитель.

Выходные данные

В единственной строке выходных данных выведите единственное число — максимальный прекрасный делитель заданного числа. Очевидно, что он всегда существует.

D. Кредитная карта

дп жадные алгоритмы реализация Структуры данных *1900

Недавно Люба приобрела себе кредитную карту и начала активно ей пользоваться. Рассмотрим отрезок из n подряд идущих дней.

Изначально на кредитной карте Любы находится 0 единиц денежных средств.

В i-й день вечером происходит денежная операция на сумму ai. Если ai > 0, то на счёт Любы зачисляется ai денежных средств. Если ai < 0, то со счёта списывается ai денежных средств. Если же ai = 0, то в этот день проверяется состояние счёта на предмет задолженности.

Люба может прийти в банк в любой из n дней утром и положить дополнительно на счёт какое-либо положительное количество денег. Но из-за лимита она не может допустить, чтобы в какой-либо момент количество денежных средств на карте превышало d.

Может случиться, что количество денег на карте Любы превысит d после какой-либо вечерней транзакции. В этом случае ответ равен «-1».

Люба не хочет превысить этот лимит. Также она не хочет, чтобы в какой-либо из дней проверки (в те дни, когда ai = 0) на её кредитной карте был отрицательный баланс. Также для Любы дорога до банка занимает очень много времени, поэтому ей нужно узнать минимальное количество дней, когда ей необходимо будет прийти в банк и положить дополнительные деньги на карту, либо узнать, что заданным ограничениям удовлетворить невозможно. Помогите ей с этим!

Входные данные

В первой строке задано два целых числа n, d (1 ≤ n ≤ 105, 1 ≤ d ≤ 109) — количество дней в рассматриваемом отрезке времени и ограничение на количество денег.

Во второй строке задано n целых чисел a1, a2, ... an ( - 104 ≤ ai ≤ 104), где ai описывает операцию в i-й день.

Выходные данные

В единственной строке выведите «-1» (без кавычек), если Люба не сможет класть деньги на карту так, чтобы удовлетворить всем вышеописанным ограничениям, либо же минимальное количество дней, необходимое для этого.

A. Деление пиццы

Перебор реализация *1200

Студенты Вася и Петя учатся в БГУ (Байтляндском Государственном Университете). На одной из перемен они решили перекусить и заказали пиццу. Пицца представляет собой круг некоторого радиуса. Пиццу доставили уже разрезанную на n кусков, i-й кусок представляет собой сектор с углом равным ai. Вася и Петя хотят разделить все куски на два непрерывных сектора так, чтобы разница углов этих секторов была минимальна. Углом сектора называется сумма углов всех кусков пиццы входящих в него. Обратите внимание, что один из секторов может быть пустым.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 360) — количество кусков, на которые разрезана пицца.

Во второй строке записаны n целых чисел ai (1 ≤ ai ≤ 360) — углы секторов, на которые разрезана пицца. Сумма всех ai равна 360.

Выходные данные

Выведите одно целое число — минимально возможную разницу между углами секторов пиццы которые достанутся Васе и Пете.

Примечание

В первом тесте Вася может взять 1 и 2 куски, а Петя 3 и 4. Тогда ответ равен |(90 + 90) - (90 + 90)| = 0.

Во третьем тесте есть только один кусок, который полностью достанется Васе или Пете. Поэтому ответ равен |360 - 0| = 360.

В четвертом тесте Вася может взять 1 и 4 куски, тогда Пете достанутся 2 и 3 куски. Ответ в этом случае равен |(170 + 10) - (30 + 150)| = 0.

Поясняющая картинка к четвертому тесту:

Красный и зеленый сектора состоят каждый из двух соседних кусков пиццы, поэтому Вася может взять зеленый сектор, а Петя красный.

A. Ярмарка в Скарборо

реализация *800

Are you going to Scarborough Fair?

Parsley, sage, rosemary and thyme.

Remember me to one who lives there.

He once was the true love of mine.

Уильям хочет отвести подругу к самому высокому зданию на острове 28, однако никто из них не знает, как туда пройти.

Уильям просит своего друга, Грика, подсказать, как туда дойти. Грик помогает ребятам и даёт им задание.

Несмотря на то, что подруга Уильяма хочет помочь, Уильям решает справиться с ним самостоятельно.

Грик даёт Уильяму строку длины n.

Уильяму необходимо произвести m операций, каждая из которых описывается четырьмя параметрами l, r, c1, c2, означающими, что все символы c1 на промежутке [l, r] (от l-го до r-го, включая l и r) должны быть заменены на c2. Строка индексируется начиная с 1.

Грику необходимо узнать строку после всех m операций.

Входные данные

В первой строке содержатся два целых числа n и m (1 ≤ n, m ≤ 100).

Во втрой строке содержится строка s длины n, состоящая из строчных букв латинского алфавита.

В каждой из последующих m строк содержатся описания операций. Каждая операция задаётся четырьмя параметрами l, r, c1, c2 (1 ≤ l ≤ r ≤ n, c1, c2 являются строчными буквами латинского алфавита), разделёнными пробелами.

Выходные данные

Выведите строку s после применения всех m операций, описанных выше.

Примечание

Во втором тестовом примере:

После применения первой операции строка становится равной wxxak.

После применения второй операции строка становится равной waaak.

После применения третьей операции строка становится равной gaaak.

A. Округление

математика реализация *800

У Васи есть целое неотрицательное число n. Он хочет округлить его до ближайшего целого числа, которое оканчивается на 0. Если число n уже заканчивается на 0, то Вася считает его уже округлённым.

Например, если n = 4722, то ответ равен 4720. Если n = 5, то Вася может округлить число как до 0, так и до 10, оба варианта являются правильными ответами.

Определите результат округления Васей числа n.

Входные данные

В первой строке записано целое число n (0 ≤ n ≤ 109) — число Васи.

Выходные данные

Выведите результат округления Васей числа n. Обратите внимание, что в некоторых случаях ответ неоднозначен. В таком случае выведите любой из верных ответов.

Примечание

В первом примере n = 5. Ближайшими целыми числами, которые оканчиваются на ноль, являются числа 0 и 10. Любой из этих двух ответов будет считаться верным, поэтому вы можете вывести любое из двух чисел — 0 или 10.

B. Правильное питание

Перебор реализация теория чисел *1100

У Васи есть n бурлей. Одна бутылка Бер-Колы стоит a бурлей, а один батончик Барса стоит b бурлей. Он может покупать любое целое неотрицательное количество бутылок Бер-Колы и любое целое неотрицательное количество батончиков Барс.

Определите, сможет ли Вася купить какое-то количество бутылок Бер-Колы и батончиков Барс таким образом, чтобы потратить ровно n бурлей.

Иными словами, вам необходимо найти два неотрицательных целых числа x и y таких, что Вася может купить x бутылок Бер-Колы, y батончиков Барс, при этом x·a + y·b = n, либо сообщить, что такие числа найти невозможно.

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 10 000 000) — количество денег, которые есть у Васи.

Во второй строке записано целое число a (1 ≤ a ≤ 10 000 000) — стоимость одной бутылки Бер-Колы.

В третьей строке записано целое число b (1 ≤ b ≤ 10 000 000) — стоимость одного батончика Барс.

Выходные данные

Если Вася не сможет купить Бер-Колу и батончики Барс так, чтобы потратить ровно n бурлей, выведите «NO» (без кавычек).

В противном случае, в первую строку выведите «YES» (без кавычек). Во вторую строку выведите два целых неотрицательных числа x и y — количество бутылок Бер-Колы и количество батончиков Барс, которые должен купить Вася, чтобы потратить ровно n бурлей, то есть x·a + y·b = n. Если ответов несколько разрешается вывести любой из них.

Любое из чисел x и y может быть равно 0.

Примечание

В первом примере Вася может купить две бутылки Бер-Колы и один батончик Барс, тогда он потратит ровно 2·2 + 1·3 = 7 бурлей.

Во втором примере, Вася может потратить ровно n бурлей несколькими способами:

  • купить две бутылки Бер-Колы и пять батончиков Барс;
  • купить четыре бутылки Бер-Колы и не покупать батончиков Барс;
  • не покупать Бер-Колу и купить 10 батончиков Барс.

В третьем примере невозможно купить Бер-Колу и батончики Барс, чтобы потратить ровно n бурлей.

C. Телефонные номера

реализация Строки *1400

У Васи есть несколько телефонных книг, в которые он записаны телефонные номера его друзей. У каждого из его друзей может быть один телефонный номер, а может быть и несколько.

Вася решил упорядочить информацию о телефонах друзей. Вам будет задано n строк — все записи из телефонных книг Васи. Каждая запись начинается с имени друга. Затем следует количество телефонных номеров в текущей записи, а затем сами телефонные номера. Возможно, что в одной и той же записи записано несколько одинаковых телефонов.

Также Вася считает, что если телефонный номер a является суффиксом телефонного номера b (то есть номер b заканчивается на номер a), и оба номера записаны Васей, как номера одного и того же человека, то номер a записан без кода города и его учитывать не следует.

Перед вами стоит задача вывести упорядоченную информацию о телефонах друзей Васи, объединив разные записи в телефонных книгах для одних и тех же людей. Допустимо, что два разных человека имеют один и тот же номер. Если один человек имеет два номера x и y, причём x является суффиксом y (то есть y оканчивается на x), то выводить номер x не нужно. Если в телефонных книгах Васи номер какого-то друга записан несколько раз в одинаковом формате, учитывать его нужно ровно один раз.

Ознакомьтесь с примерами, для лучшего понимания условия и формата вывода.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 20) — количество записей в телефонных книгах Васи.

В следующих n строках следуют описания самих записей в формате, описанном в условии. Считайте, что имена друзей Васи — это непустые строки, чья длина не превосходит 10. Имена записаны строчными буквами латинского алфавита. Количество телефонных номеров в одной записи — от 1 до 10. Сами телефонные номера состоят только из цифр. Если представить телефонный номер как строку, то её длина от 1 до 10. Телефонные номера могут содержать лидирующие нули.

Выходные данные

Выведите упорядоченную информацию о телефонных номерах друзей Васи. Сначала выведите m — количество друзей, которые встречаются в телефонных книгах Васи.

Следующие m строк должны содержать записи в следующем формате «имя количество номера». Номера следует разделять пробелом. Каждая такая запись должна содержать все телефонные номера очередного друга.

Друзей можно выводить в любом порядке, телефонные номера для одной записи также можно выводить в любом порядке.

B. Месяцы и годы

реализация *1200

Все в России живут по Григорианскому календарю. Согласно календарю, в январе 31 день, в феврале 28 или 29 дней (в зависимости от того, является год високосным, или нет), в марте 31 день, в апреле 30 дней, в мае 31 день, в июне 30 дней, в июле 31 день, в августе 31 день, в сентябре 30 дней, в октябре 31 день, в ноябре 30 дней, в декабре 31 день.

Год является високосным в двух случаях: либо его номер кратен 4, но при этом не кратен 100, либо кратен 400. Например, високосными являются годы 2000 и 2004, но годы 1900 и 2018 високосными не являются.

В данной задаче вам будет задано n (1 ≤ n ≤ 24) целых чисел a1, a2, ..., an и вам нужно проверить, верно ли, что эти числа могли являться длительностями в днях n подряд идущих месяцев согласно Григорианскому календарю. Обратите внимание, что соответствующие ответу месяцы могут быть в нескольких подряд идущих годах. Иными словами, проверьте, существует ли такой месяц в некотором году, что его длительность равна a1, длительность следующего за ним месяца равна a2, и так далее.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 24) — количество чисел.

Во второй строке следуют n целых чисел a1, a2, ..., an (28 ≤ ai ≤ 31) — числа, которые нужно проверить.

Выходные данные

Если существует искомый период подряд идущих месяцев, выведите «YES» (без кавычек). В противном случае, выведите «NO» (без кавычек).

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере числа могут задавать месяцы: июль — август — сентябрь — октябрь.

Для второго примера ответа нет, так как не бывает двух месяцев подряд, количество дней в которых равно 30.

В третьем примере числа задают месяцы: февраль (високосного года) — март — апрель – май — июнь.

В четвёртом примере количество дней во втором месяце равно 28, то есть это февраль. После февраля идёт март, в котором 31 день, а не 30, поэтому ответ на этот пример NO.

В пятом примере числа задают месяцы: декабрь — январь — февраль (невисокосного года).

E. Удаление отрезков

Потоки реализация снм Структуры данных *2000

У Васи есть массив целых чисел, состоящий из n элементов.

Вася производит с массивом следующие операции: каждый раз он находит самый длинный отрезок подряд идущих одинаковых чисел (если таких несколько, то Вася выберет самый левый из них) и удаляет его из массива. Например, если массив Васи имеет вид [13, 13, 7, 7, 7, 2, 2, 2], то после одной операции массив примет вид: [13, 13, 2, 2, 2].

Определите количество описанных операций, которое произведёт Вася до того момента, как его массив станет пустым (то есть Вася удалит из него все элементы).

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 200 000) — количество элементов в массиве.

Во второй строке следует последовательность a1, a2, ..., an (1 ≤ ai ≤ 109) — описание массива Васи.

Выходные данные

Выведите количество операций, которые произведет Вася, чтобы удалить из массива все элементы.

Примечание

В первом примере Вася сначала удалит две пятёрки, стоящие во второй и третьей позициях. После этого массив будет выглядеть как [2, 2]. Во время второй операции Вася удалит две двойки, стоящие в первой и второй позициях. После этого массив станет пустым, и Вася закончит выполнение операций.

Во втором примере Васе нужно пять операций, чтобы удалить все элементы из массива. Во время каждой операции он будет удалять самый левый элемент из массива.

В третьем примере Васе нужно три операции, чтобы удалить все элементы из массива. Во время первой операции он удалит все числа 4, во время второй — все числа 100, а во время третьей — все числа 2.

В четвёртом примере во время первой операции Вася удалит два первых числа 10. После этого массив примет вид [50, 10, 50, 50]. Затем во время второй операции Вася удалит два крайних правых числа 50, массив примет вид [50, 10]. Во время третьей операции — число 50, массив примет вид [10]. Во время последней четвертой операции он удалит единственное число 10. После этого массив Васи станет пустым.

B. Бегущий Студент

геометрия Перебор реализация *1200

И снова несчастье свалилось на голову Бедного Студента. Он опаздывает на экзамен.

Добежав до остановки, которая находится в точке (0, 0), он сел в маршрутку и поехал по прямой, параллельной оси OX, в сторону увеличения координаты x.

Бедный Студент знает следующее:

  • за весь рейс маршрутка делает ровно n остановок, i-ая остановка происходит в точке (xi, 0)
  • координаты всех остановок различны
  • маршрутка едет с постоянной скоростью, равной vb
  • можно предполагать, что посадка и высадка пассажиров на остановках происходит мгновенно
  • Студент может выйти из маршрутки только на остановках
  • Студенту придется выйти из маршрутки на конечной остановке, если он не выйдет раньше
  • университет, в котором будет проводиться экзамен, находится в точке (xu, yu)
  • Студент может бежать от остановки до университета по прямой с постоянной скоростью vs сколь угодно долго
  • расстояние между двумя точками можно считать по формуле:
  • Студент уже едет в маршрутке, поэтому выйти на первой остановке он не может

Бедный Студент хочет добраться до университета как можно быстрее. Помогите ему выбрать остановку, на которой нужно выходить. Если таких остановок несколько, то выберите ту, от которой расстояние до университета наименьшее.

Входные данные

В первой строке даны три целых числа: 2 ≤ n ≤ 100, 1 ≤ vb, vs ≤ 1000. Во второй строке даны n неотрицательных целых чисел в порядке возрастания: координаты xi остановки номер i. Гарантируется, что x1 равно нулю, а xn ≤ 105. В третьей строке даны координаты университета, целые числа xu и yu, по модулю не превышающие 105.

Выходные данные

В единственной строке выведите ответ на задачу — номер оптимальной остановки.

Примечание

Как известно, студенты — люди особые, а маршрутки, обычно, никуда не спешат. Поэтому не нужно удивляться, если скорость студента будет больше или равна скорости маршрутки.

C. Числа Хексадесимал

математика Перебор реализация *1200

Одним прекрасным июльским утром в Мэйнфрейме случилось очень страшное событие: злобный вирус Мегабайт каким-то образом открыл доступ к блоку памяти своей не менее злобной сестры Хексадесимал. Он загрузил в неё огромный поток из n различных натуральных чисел от 1 до n, чтобы получить полный контроль над её энергией.

Но его план провалился по той простой причине, что Хексадесимал не воспринимала никакой информации, кроме чисел, записанных в двоичной системе счисления. Это значит, что если десятичная запись исходного числа содержала какие-то символы, отличные от 0 или 1, то оно не сохранялось в памяти. Теперь Мегабайт хочет узнать, сколько чисел было успешно загружено.

Входные данные

Входные данные содержат единственное число n (1 ≤ n ≤ 109).

Выходные данные

Выведите единственное число — ответ на задачу.

Примечание

Для n = 10 в ответ входят числа 1 и 10.

B. Африканский кроссворд

реализация Строки *1100

Африканский кроссворд представляет собой прямоугольную таблицу n × m, в каждую ячейку которой вписана ровно одна буква. В этой таблице (еще ее называют сеткой) зашифровано некоторое слово, которое нужно расшифровать.

Чтобы решить кроссворд, нужно вычеркнуть все повторяющиеся буквы в строках и в столбцах. Другими словами, буква должна быть вычеркнута в том и только в том случае, когда в соответствующих ей строке или столбце помимо нее есть еще хотя бы одна такая же буква. Причем все такие буквы вычеркиваются одновременно.

Когда все повторяющиеся буквы будут вычеркнуты, оставшиеся буквы следует выписать в одну строчку. Раньше идут те буквы, которые находятся выше, если они в одной строке — раньше идет та буква, которая левее. Полученное слово является ответом.

Вам предлагается решить африканский кроссворд и вывести слово, которое в нем зашифровано.

Входные данные

В первой строке содержатся два целых числа n и m (1 ≤ n, m ≤ 100). В следующих n строках содержится по m маленьких латинских букв — сетка кроссворда.

Выходные данные

В единственной строке выведите зашифрованное слово. Гарантируется, что ответ состоит хотя бы из одной буквы.

A. Найдите лишнего

геометрия реализация *800

Вам дано n различных точек на плоскости, ни одна из них не лежит на оси OY. Проверьте, что существует точка, после удаления которой все оставшиеся точки будут лежать по одну сторону от оси OY.

Входные данные

В первой строке следует целое положительное число n (2 ≤ n ≤ 105).

Далее следуют n строк, в i-й из которых записаны два целых числа xi и yi (|xi|, |yi| ≤ 109, xi ≠ 0) — координаты очередной точки. Никакие две точки не совпадают.

Выходные данные

Выведите «Yes», если существует искомая точка, «No» — иначе.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере можно удалить вторую точку.

Во втором примере не существует точки, подходящей под условие.

В третьем примере можно удалить любую точку.

A. Поход к другу

жадные алгоритмы реализация *1100

Свин решил сходить в гости к другу.

Оказалось, что дом Свина находится в точке 0, а дом его друга — в точке m на координатной прямой.

В мире, где живет Свин, можно перемещаться с помощью телепортов.

Чтобы воспользоваться телепортом, нужно прийти в определенную точку (туда, где этот телепорт находится) и выбрать, куда телепортироваться: для каждого телепорта известна самая правая точка, куда он может отправить посетителя, называемая пределом телепорта.

Формально, телепорт, расположенный в точке x с пределом y, может переместить из точки x до любой точки отрезка [x; y], включая границы.

Помогите Свину узнать, может ли он прийти к другу, используя только телепорты или сообщите, что ему придется поехать к другу на своем гоночном болиде.

Входные данные

На первой строке через пробел даны числа n и m (1 ≤ n ≤ 100, 1 ≤ m ≤ 100) — количество телепортов и координаты дома друга.

Следующие n строк содержат информацию о телепортах.

В i-й из этих строк содержится два целых числа ai, bi, (0 ≤ ai ≤ bi ≤ m), где ai — координата i-го телепорта, а bi — его предел.

Гарантируется, что ai ≥ ai - 1 для всех i (2 ≤ i ≤ n).

Выходные данные

Выведите «YES», если существует путь от дома Свина до дома друга, использующий только телепорты, и «NO» иначе.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

Первый пример изображен на следующей картинке:

Свин с помощью первого телепорта от своего дома (точки 0) добирается до точки 2, дальше с помощью второго от точки 2 до точки 3, и с помощью третьего от точки 3 до точки 5, где и живет друг.

Второй пример изображен на следующей картинке:

Как видно на картинке, добраться от дома Свина до дома друга нельзя.

A. Задача о голодном студенте

жадные алгоритмы реализация *900

Пары в университете только что закончились, и Иван решил пойти в местное кафе CFK поесть жареной курочки.

В CFK лакомство продается маленькими и большими порциями. В маленькой порции 3 куска курицы, в большой — 7 кусков. Иван хочет съесть ровно x кусков. Он интересуется, может ли он купить столько курицы.

Формально, Иван хочет узнать, можно ли выбрать два неотрицательных целых числа a и b такие, что при покупке a маленьких порций и b больших порций он в сумме получит ровно x кусков.

Помогите Ивану справиться с этим вопросом для нескольких вариантов значений x!

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100) — количество тестов.

В i-й из следующих n строк записано по одному целому числу xi (1 ≤ xi ≤ 100) — количество кусков курицы, которые Иван хочет съесть.

Выходные данные

Выведите n строк. В i-й строке выведите YES, если Иван может купить ровно xi кусков. В противном случае выведите NO.

Примечание

В первом примере Иван может купить две маленьких порции.

Во втором примере Иван не может купить ровно 5 кусков, так как маленькой порции недостаточно, а две маленькие или одна большая — уже слишком много.

B. Грязекраб

жадные алгоритмы реализация *1200

И опять Вова играет в компьютерную игру, теперь в ролевую. Герою Вовы поручили квест: расправиться с жестоким монстром грязекрабом.

На протяжении двух часов Вова преследовал краба и анализировал его тактику. У грязекраба h2 пунктов здоровья и сила атаки a2. Зная это, Вова решил купить очень много зелий для восстановления здоровья и подготовиться в битве.

У героя Вовы h1 пунктов здоровья и сила атаки a1. Также у него есть огромный запас зелий восстановления здоровья, каждое из которых увеличивают здоровье на c1 пунктов, когда Вова пьет зелье. Все зелья одинаковы. Гарантируется, что c1 > a2.

Сражение состоит из нескольких фаз. В начале каждой фазы Вова может либо атаковать монстра (уменьшая его здоровье на a1 пунктов), либо пить зелье восстановления здоровья (повышая здоровье Вовы на c1 пунктов; здоровье может превышать значение h1). Дальше, если сражение еще не окончено, грязекраб атакует Вову, уменьшая его здоровье на a2 пунктов. Сражение заканчивается, когда здоровье Вовы или грязекраба становится 0 пунктов или меньше. Возможно, сражение закончится в середине фазы после атаки Вовы.

Разумеется, Вова хочет победить в сражении. К тому же он хочет это сделать как можно быстрее. Поэтому он хочет придумать стратегию, которая позволит ему победить за наименьшее количество фаз.

Помогите Вове придумать стратегию! Считайте, что у Вовы никогда не закончатся зелья и что он всегда может победить.

Входные данные

В первой строке записаны три целых числа h1, a1, c1 (1 ≤ h1, a1 ≤ 100, 2 ≤ c1 ≤ 100) — здоровье Вовы, сила атаки Вовы и количество пунктов здоровья, которые восстанавливает зелье.

Во второй строке записаны два целых числа h2, a2 (1 ≤ h2 ≤ 100, 1 ≤ a2 < c1) — здоровье грязекраба и его сила атаки.

Выходные данные

В первой строке выведите одно целое число n — минимальное количество фаз, необходимых для победы.

Затем выведите n строк, в i-й строке должно быть либо слово HEAL, если Вова пьет зелье на i-й фазе, либо STRIKE, если атакует грязекраба.

Стратегия должна быть корректной: герой Вовы не должен быть побежден до победы над грязекрабом, и здоровье монстра должно быть равно 0 или меньше после последнего хода Вовы.

Если существуют несколько оптимальных ответов, выведите любой из них.

Примечание

В первом примере герой Вовы должен восстановить здоровье до или после своей первой атаки. В противном случае его здоровье будет равно нулю после 2 фаз, когда ему надо 3 атаки для победы.

Во втором примере не требуется никакого восстановления здоровья, двух ударов достаточно для того, чтобы оставить монстра с нулем здоровья и победить с 6 пунктами здоровья в остатке.

E. Обмены в строке

Перебор реализация Строки хэши *2200

Изначально была дана строка s длины n, состоящая из строчных латинских букв. Её скопировали ровно k раз, получив при этом k одинаковых строк s1, s2, ..., sk. После этого в каждой из них поменяли местами ровно одну пару символов (возможно, одинаковых, но находящихся на разных позициях).

Вам необходимо по заданным k строкам s1, s2, ..., sk восстановить любую подходящую строку s. Обратите внимание, что суммарная длина всех строк не превосходит 5000 (то есть k·n ≤ 5000).

Входные данные

В первой строке задано два целых числа k и n (1 ≤ k ≤ 2500, 2 ≤ n ≤ 5000, k · n ≤ 5000) — количество получившихся строк и длина каждой из них.

В следующих k строках заданы сами строки s1, s2, ..., sk, состоящие из строчных латинских букв. Гарантируется, что длина каждой из строк равна n.

Выходные данные

В единственной строке выведите любую подходящую строку s, либо же «-1» (без кавычек), если такой строки не существует.

Примечание

В первом тестовом примере строка s1 получается из строки acab перестановкой местами 2 и 4 символов, строка s2 получается перестановкой 1 и 2 символов, а строка s3 — 3 и 4 символов.

Во втором тестовом примере s1 получается из строки kbub перестановкой 3 и 4 символов, s2 — перестановкой 2 и 4 символов, а s3 — перестановкой 1 и 3 символов.

В третьем тестовом примере невозможно получить никакую строку, удовлетворяющую условиям.

A. Новый год и количество карт

Перебор реализация *800

У вашего друга есть n карт.

Вы знаете, что на одной стороне каждой из карт написана строчная буква латинского алфавита, а на другой — цифра.

Сейчас все карты лежат на столе так, что видна ровно одна сторона каждой карты.

Вы хотите проверить, верно ли следующее утверждение для всех данных карт: «Если на одной стороне карты гласная, то на другой — четная цифра.» Более формально, гласная — одна из букв «a», «e», «i», «o» и «u», а четная цифра — одна из «0», «2», «4», «6» и «8».

Например, если на карте с одной стороны «a», а с другой — «6», то утверждение для нее верно. Также, утверждение верно для карты с «b» и «4», а также для карты с «b» и «3» (так как буква — не гласная). Утверждение неверно, например, для карты с «e» и «5». Вы хотите проверить, верно ли утверждение для всех карт. В частности, если ни на одной карте нет гласной, утверждение верно.

Чтобы проверить это утверждение, вы можете перевернуть некоторые карты и посмотреть на другую сторону. Определите, какое минимальное число карт нужно перевернуть, чтобы проверить, что данное утверждение верно.

Входные данные

Единственная строка содержит строку s (1 ≤ |s| ≤ 50), которая описывает стороны карт, которые вы видите на столе. Каждый символ строки s — либо строчная буква латинского алфавита, либо цифра.

Выходные данные

Выведите единственное число — минимальное число карт, которое вам нужно перевернуть, чтобы проверить данное утверждение.

Примечание

В первом примере нужно перевернуть обе карты. Обратите внимание, даже если одна сторона карт имеет одинаковые буквы, другая сторона может различаться.

Во втором примере не нужно переворачивать ни одной карты. Утверждение является бессодержательной истиной, так как нет ни одной карты с гласной буквой.

В третьем примере нужно перевернуть вторую и четвертую карты.

B. Новый год и ручной робот

Перебор реализация *1200

Боб запрограммировал робота для движения по двумерному лабиринту.

В лабиринте есть препятствия. Свободные клетки обозначаются как «.», а препятствия — как «#».

В лабиринте есть один робот. Его начальная позиция обозначается буквой «S». В этой позиции нет препятствий. В лабиринте есть единственный выход. Его позиция обозначается буквой «E». В этой позиции нет препятствий.

Робот может двигаться только вверх, вниз, налево и вправо.

Когда Боб программировал робота, он выписал строчку, состоящую из цифр от 0 до 3, включительно. Он хотел сделать так, чтобы каждая цифра задавала уникальное направление, чтобы робот, следуя указаниям в данной строке, доходил бы до финиша. К сожалению, он забыл назначить цифрам направления.

Робот выберет некоторое случайное соответствие направлений цифрам. Различным цифрам робот поставит в соответствие различные направления. Затем робот выполнит данные ему инструкции, в соответствии с данной строкой и выбранному соответствию направлений цифрам. Если инструкции выведут робота за пределы лабиринта, или он врежется в препятствие, робот сломается. Если робот в любой момент времени окажется на точке с выходом, то он остановится и дальше не будет исполнять инструкции.

Боб никак не может отладить свой робот, поэтому он просит вас определить число вариантов соответствий направлений цифрам таких, что робот не сломается и доберется до выхода.

Входные данные

Первая строка содержит два целых числа n и m (2 ≤ n, m ≤ 50) — размеры лабиринта.

Следующие n строк содержат по m символов каждая и описывают лабиринт.

Каждый символ лабиринта — это «.», «#», «S» или «E».

Гарантируется, что в лабиринте ровно одна буква «S» и ровно одна буква «E».

Последняя строка содержит строку s (1 ≤ |s| ≤ 100) — команды роботу. Каждая символ строки s — цифра от 0 до 3.

Выходные данные

Выведите единственное число — количество соответствий направлений цифрам таких, что данные роботу команды приведут его к выходу.

Примечание

В первом примере единственным подходящим соответствием будет , где D — вниз, L — влево, U — вверх, R — вправо.

C. Новый год и керлинг

геометрия математика Перебор реализация *1500

Кэрол играет в керлинг.

У нее есть n дисков радиуса r на плоскости.

Изначально все диски находятся выше линии y = 10100.

Кэрол пускает диски по направлению к прямой y = 0 по одному в порядке от 1 до n.

Когда она пускает i-й диск, она ставит его центр в точку (xi, 10100), а затем толкает его так, что его y координата начинает уменьшаться, а координата x остается постоянной. Диск останавливается, когда он касается прямой y = 0 или любого предыдущего диска. Обратите внимание, как только диск остановился, он больше не двигается, даже от удара следующих дисков.

Вычислите координату y центров всех дисков после того, как они остановятся.

Входные данные

Первая строка содержит два целых числа n и r (1 ≤ n, r ≤ 1 000) — количество дисков и радиус каждого диска, соответственно.

Следующая строка содержит n целых чисел x1, x2, ..., xn (1 ≤ xi ≤ 1 000) — x-координаты дисков.

Выходные данные

Выведите единственную строку с n числами. i-е из этих чисел должно быть равно итоговой y-координате центра i-го диска. Ваш ответ будет зачтен, если его абсолютная или относительная ошибка не превосходит 10 - 6.

А именно, пусть ваш ответ для определенного диска равен a, а ответ жюри — b. Ваш ответ будет зачтен, если для всех дисков.

Примечание

В первом примере конечные позиции дисков показаны на рисунке:

В частности, обратите внимание на положение последнего диска.

F. Новый год и радужные развилки

графы жадные алгоритмы реализация *2400

У Роя и Бива есть множество из n точек на бесконечной числовой прямой.

Каждая точка имеет один из трех цветов: красный, зеленый или синий.

Рой и Бив хотят соединить все точки несколькими линиями. Линии могут быть проведены между любой парой данных точек. Стоимость линии равна расстоянию между точками, которые она соединяет.

Рой и Бив хотят провести линии так, чтобы они оба видели, что все точки соединены (напрямую или через несколько линий).

Однако, не все так просто: Рой не видит красный цвет, а Бив — синий.

Поэтому они хотят выбрать линии так, что если убрать все красные точки, то оставшиеся синие и зеленые точки будут соединены, и, аналогично, если убрать все синие точки, то оставшиеся красные и зеленые точки будут соединены.

Вычислите минимальную суммарную стоимость набора линий, который удовлетворяет вышеприведенным ограничениям.

Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 300 000) — количество точек.

Следующие n строк содержат по два объекта pi и ci (pi — целое число, 1 ≤ pi ≤ 109, ci — заглавная буква латинского алфавита «R», «G» или «B») — позиция i-й точки и цвет i-й точки. «R» обозначает красный цвет, «G» — зеленый, а «B» — синий. Позиции даны в строго возрастающем порядке.

Выходные данные

Выведите одно целое число: минимальную стоимость подходящего набора линий.

Примечание

В первом тесте из условия оптимально нарисовать линии между точками (1,2), (1,4), (3,4). Их стоимости равны 4, 14, 5, соответственно.

D. Разноцветные точки

жадные алгоритмы реализация Структуры данных *2100

Вам дан набор разноцветных точек на прямой. Две точки считаются соседними, если между ними нет других точек. У каждой точки может быть не более двух соседних — одна слева и одна справа.

Вы выполняете последовательность действий над этим набором. За одно действие вы удаляете все точки a, у которых есть соседняя точка цвета, отличного от цвета точки a. Все точки удаляются одновременно, т.е. сначала вы определяете, какие точки следует удалить, и затем удаляете их. После этого вы выполняете следующее действие и т.д. Если действие не удалит ни одной точки, его невозможно выполнить.

Сколько действий можно будет выполнить на заданном наборе точек так, чтобы каждое из них удалило хотя бы одну точку?

Входные данные

Входные данные состоят из единственной строки строчных латинских букв. Буквы задают цвета точек в том порядке, в котором они расположены на прямой: первая буква задает цвет самой левой точки, вторая — цвет второй слева точки и т.д.

Строка содержит от 1 до 106 букв.

Выходные данные

Выведите одно число — количество действий, которые можно выполнить на заданном наборе точек так, чтобы каждое действие удалило хотя бы одну точку.

Примечание

В первом примере первое действие удалит две средние точки и оставит точки "ab", которые затем удалит второе действие. После этого не останется точек, над которыми можно было бы выполнить третье действие.

Во втором примере первое действие удалит четыре средние точки и оставит точки "aa". Ни у одной из них нет соседних точек другого цвета, поэтому второе действие невозможно выполнить.

A. Путь домой

дп жадные алгоритмы поиск в глубину и подобное реализация *800

Лягушка живет на координатной прямой Ox и должна добраться домой в точку n из точки 1. Она может прыгать вправо на расстояние не более чем d. Таким образом, после прыжка из x она перемещается в точку x + a, где a — целое число от 1 до d.

Для каждой точки от 1 до n известно, есть ли в ней лилия. Лягушка может прыгать только по лилиям. Гарантируется, что в точках 1 и n лилии обязательно есть.

Определите минимальное количество прыжков, которые нужны сделать лягушке, чтобы попасть из точки 1 домой в точку n. Считайте, что изначально лягушка находится в точке 1. Если лягушка не может добраться домой, то выведите -1.

Входные данные

В первой строке записаны два целых числа n и d (2 ≤ n ≤ 100, 1 ≤ d ≤ n - 1) — точка, в которую лягушка хочет попасть, и максимальная длина прыжка лягушки.

Во второй строке записана строка s длины n, состоящая из нулей и единиц. Если очередной символ строки s равен нулю, то в соответствующей точке нет лилии, в противном случае, в соответствующей точке лилия есть. Гарантируется, что первый и последний символы строки s равны единице.

Выходные данные

Если лягушка не сможет попасть домой, выведите -1.

В противном случае, выведите минимальное количество прыжков, которые нужно сделать лягушке, чтобы попасть из точки 1 в точку n.

Примечание

В первом примере лягушка может добраться до дома за два прыжка: первый прыжок из точки 1 в точку 4 (длина прыжка равна трём), а второй прыжок из точки 4 в точку 8 (длина прыжка равна четырём).

Во втором примере лягушка не сможет добраться до дома, так как ей нужно для этого прыгнуть на расстояние три, а максимальная длина её прыжка равна двум.

B. Обрамление дверей

жадные алгоритмы реализация *1600

У Пети есть одинаковые деревянные бруски длины n. Он хочет сделать обрамление для двух дверей. Каждое обрамление имеет две боковые стороны длины a и одну верхнюю сторону длины b. Для каждой из сторон нужен цельный кусок бруска.

Определите минимальное количество брусков, которые необходимы для двух дверей. Петя может резать бруски на любые части, но каждая из сторон двери должна быть цельным куском бруска (или целиком одним бруском).

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 1 000) — длина брусков.

Во второй строке следует целое число a (1 ≤ a ≤ n) — длина боковых сторон обрамления дверей.

В третьей строке следует целое число b (1 ≤ b ≤ n) — длина верхней стороны обрамления дверей.

Выходные данные

Выведите минимальное количество брусков длины n, которые необходимы для обрамления двух дверей.

Примечание

В первом примере достаточно одного бруска, так как суммарная длина всех сторон обрамления для двух дверей равна 8.

Во втором примере нужно 6 брусков, так как для каждой из сторон обрамления нужен новый брусок.

A. Ближайшие минимумы

реализация *1100

Задана последовательность (массив) целых чисел длины n своими элементами a0, a1, ..., an - 1. Требуется найти расстояние между парой ближайших минимумов в массиве. Гарантируется, что в массиве минимальное значение (минимум) встречается хотя бы два раза.

Входные данные

В первой строке входных данных задано одно целое положительное число n (2 ≤ n ≤ 105) — размер массива. Во второй строке заданы через пробел n целых чисел a0, a1, ..., an - 1 (1 ≤ ai ≤ 109) — элементы массива. Гарантируется, что в массиве минимальное значение (минимум) встречается хотя бы два раза.

Выходные данные

Выведите единственное целое положительное число — расстояние между парой ближайших минимальных значений в массиве.

B. Два торта

Бинарный поиск Перебор реализация *1200

В самый канун Нового года Иван решил приступить к оформлению праздничного стола. Иван купил два торта и разрезал их на части: первый торт был разрезан на a кусков, а второй — на b кусков.

Иван знает, что на празднование соберется n человек (включая его самого), так что он должен разложить n тарелок для торта. Теперь его задача — распределить торты по тарелкам. Иван хочет это сделать таким образом, чтобы выполнялись следующие условия:

  1. каждый кусок торта лежит на какой-либо тарелке;
  2. на каждой тарелке лежит хотя бы один кусок торта;
  3. ни на одной тарелке не лежат куски обоих тортов.

Чтобы сделать гостей чуточку счастливее, Иван хочет распределить торты так, чтобы минимальное количество кусков торта на тарелке было максимально. Формально, Иван хочет знать такое максимальное число x, что он может распределить торты по тарелкам, соблюдая все вышеприведенные условия, и на каждой тарелке будет хотя бы x кусков торта.

Помогите Ивану найти это число x!

Входные данные

В первой строке записаны три целых числа n, a и b (1 ≤ a, b ≤ 100, 2 ≤ n ≤ a + b) — количество тарелок, количество кусков первого торта и количество кусков второго торта, соответственно.

Выходные данные

Выведите такое максимальное число x, что Иван может распределить распределить торты по тарелкам таким образом, чтобы на каждой было не меньше x кусков торта.

Примечание

В первом примере есть только один способ распределить, на каждой тарелке будет ровно по 1 куску торта.

Во втором примере можно положить на первые две тарелки 3 и 4 куска первого торта, а на оставшиеся — по 5 кусков второго торта. Минимальное число кусков на тарелке — 3. Существуют и другие валидные распределения.

E. Сортировка стеком

жадные алгоритмы Конструктив реализация Структуры данных *2000

Предположим, дан массив a, стек s (изначально пустой) и массив b (также пустой).

Можно производить следующие операции, пока a или s непусты:

  • Взять первый элемент a, положить его на верхушку s и удалить из a (если a не пустой);
  • Взять элемент с верхушки s, добавить его в конец массива b и удалить из s (если s не пустой).

Операции можно осуществлять в произвольном порядке.

Если существует способ проделать операции в таком порядке, что массив b отсортирован в неубывающем порядке в конце процесса, то назовем массив a стек-сортируемым.

Например, [3, 1, 2]стек-сортируемый, потому что b будет отсортированным после следующих операций:

  1. Удалить 3 из a и положить на верхушку s;
  2. Удалить 1 из a и положить на верхушку s;
  3. Удалить 1 из s и добавить в конец b;
  4. Удалить 2 из a и положить на верхушку s;
  5. Удалить 2 из s и добавить в конец b;
  6. Удалить 3 из s и добавить в конец b.

После всех операций b = [1, 2, 3], поэтому [3, 1, 2]стек-сортируемый. [2, 3, 1] — не стек-сортируемый.

Заданы первые k элементов некоторой перестановки p размера n (напоминаем, что перестановка размера n — это такой массив размера n, где каждое число от 1 до n встречается ровно один раз). Необходимо восстановить оставшиеся n - k элементов этой перестановки, так чтобы она стала стек-сортируемой. Если существует несколько ответов, то выберите такой, что p лексикографически максимальна (массив q лексикографически больше массива p тогда и только тогда, когда существует такое целое число k, что для всех i < k qi = pi, and qk > pk). Запрещено как-то переставлять или менять первые k элементов.

Выведите лексикографически максимальную перестановку p, которую можно получить.

Если ответа не существует, то выведите -1.

Входные данные

В первой строке записаны два целых числа n и k (2 ≤ n ≤ 200000, 1 ≤ k < n) — размер желаемой перестановки и количество элементов, которые уже заданы.

Во второй строке записаны k чисел p1, p2, ..., pk (1 ≤ pi ≤ n) — первые k элементов перестановки p. Эти числа попарно различны.

Выходные данные

Если возможно восстановить стек-сортируемую перестановку p размера n такую, что первые k элементов перестановки p совпадают с заданными, выведите максимальную лексикографически из таковых.

В противном случае выведите -1.

A. Занимательная алхимия

реализация *800

Во время нового года особым спросом пользуются разноцветные елочные шарики. В 2018 году алхимия дошла аж до того, что для создания необходимого елочного шарика достаточно взять пару-тройку магических кристаллов разных цветов и немного пошаманить.

Грише требуется получить несколько шариков желтого, зеленого и синего цветов. Достоверно известно, что для получения одного желтого шарика требуются два магических кристалла желтого цвета, зеленого — один желтый и один синий, а для синего — три кристалла синего цвета.

На настоящий момент Гриша располагает A кристаллами желтого цвета и B кристаллами синего цвета. Определите, сколько кристаллов ему требуется дополнительно приобрести, чтобы суметь создать необходимое число шариков.

Входные данные

В первой строке заданы числа A и B (0 ≤ A, B ≤ 109) — количество имеющихся у Гриши желтых и синих кристаллов.

Во второй строке следуют три числа x, y, z (0 ≤ x, y, z ≤ 109) — необходимое число елочных шариков желтого, зеленого и синего цветов.

Выходные данные

Выведите одно число — минимальное количество дополнительных кристаллов, которые придется приобрести Грише.

Примечание

В первом примере на создание двух желтых, одного зеленого и одного синего шариков уйдет пять желтых и четыре синих кристалла. Следовательно, необходимо приобрести один желтый и один синий кристалл.

A. Возведение в степень по модулю

математика реализация *900

Хорошо известна следующая задача: по заданным целым числам n и m вычислить значение следующего выражения:

,

где 2n = 2·2·...·2 (n множителей), а  — операция взятия остатка от деления x на y.

Вам предлагается решить «обратную» задачу. По заданным целым числам n и m вычислите значение следующего выражения:

.
Входные данные

Первая строка содержит целое число n (1 ≤ n ≤ 108).

Вторая строка содержит целое число m (1 ≤ m ≤ 108).

Выходные данные

Выведите единственное число — значение выражения .

Примечание

В первом примере остаток от деления 42 на 24 = 16 равен 10.

Во втором примере 58 делится на 21 = 2 без остатка, поэтому ответ 0.

B. Новогодняя елка

Деревья реализация *1200

Рассмотрим корневое дерево. В корневом дереве есть одна выделенная вершина — корень. Все ребра ориентированы по направлению от корня. Вершина u является ребенком вершины v, а вершина v является родителем вершины u, если существует ориентированное ребро из v в u. Листом корневого дерева называется вершина, у которой нет детей, и есть родитель.

Назовем корневое дерево елкой, если у каждой вершины, не являющейся листом, хотя бы 3 ребенка являются листами. Вам дано корневое дерево, проверьте, является ли оно елкой.

Определение корневого дерева можно прочитать по ссылке.

Входные данные

В первой строке дано одно целое число n — количество вершин в дереве (3 ≤ n ≤ 1 000). В следующих n - 1 строках даны целые числа pi (1 ≤ i ≤ n - 1) — номер вершины, являющейся родителем i + 1-й вершины (1 ≤ pi ≤ i).

Вершина с номером 1 является корнем дерева. Гарантируется, что у корня как минимум 2 ребенка.

Выходные данные

Выведите «Yes», если дерево является елкой, и «No» иначе.

Примечание

Первый пример:

Второй пример:

Это не елка, потому что у вершины 1, которая не является листом, только 2 ребенка являются листьями.

Третий пример:

A. Точные квадраты

математика Перебор реализация *900

Дан массив a1, a2, ..., an, состоящий из n целых чисел, найдите наибольшее число в нём, которое не является точным квадратом.

Число x называется точным квадратом, если существует целое число y такое, что x = y2.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 1000) — количество элементов в массиве.

Во второй строке содержатся n целых чисел a1, a2, ..., an ( - 106 ≤ ai ≤ 106) — элементы массива.

Гарантируется, что хотя бы один элемент массива не является точным квадратом.

Выходные данные

Выведите максимальное число, содержащееся в массиве, такое, что оно не является точным квадратом. Гарантируется, что ответ существует.

Примечание

В первом тестовом примере 4 является точным квадратом, поэтому наибольшее число, которое не является точным квадратом — это 2.

B. Конан и Агаса играют в карточную игру

жадные алгоритмы игры реализация *1200

Эдогава Конан устал разбираться со своими делами и пригласил своего друга, профессора Агасу, в гости. Они решили сыграть в карточную игру. У Конана есть n карт, на i-й из которых записано число ai.

Игроки ходят по очереди, первым ходит Конан. На каждом ходу игрок выбирает карту и выбрасывает её. Кроме того, он выбрасывает все карты, на которых число меньше, чем на выбранной. Формально, если игрок выбирает карту с номером i, он выбрасывает эту карту, а также все карты с номерами j для всех j таких, что aj < ai.

Игрок проигрывает, если он не может сделать ход, то есть если не осталось карт. Определите победителя, если игроки играют оптимально.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 105) — количество карт Конана.

Во второй строке содержатся n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 105), где ai обозначает число, записанное на карте с номером i.

Выходные данные

Если победит Конан, выведите "Conan" (без кавычек), иначе выведите "Agasa" (без кавычек).

Примечание

В первом тестовом примере Конан может выбрать карту с числом 7 и тем самым выкинуть все карты. После этого Агаса проиграет.

Во втором тестовом примере вне зависимости от хода Конана останется одна карта, которую выбросит Агава, после чего карт не останется и Конан проиграет.

A. Сад

реализация *900

Люба задумалась о поливке своего сада. Сад — это отрезок длины k. У Любы есть n вёдер, i-е ведро позволяет поливать за один час непрерывный отрезок сада длины ровно ai. Любе нельзя поливать уже политые части сада, также как и нельзя поливать части земли, находящиеся за пределами сада.

Люба хочет выбрать одно ведро так, чтобы как можно быстрее полить сад. Помогите ей узнать минимальное количество часов, за которое она сможет это сделать (как уже сказано, если она выберет ведро i, она каждый час будет поливать непрерывный отрезок длины ai). Гарантируется, что Люба всегда сможет полить весь сад.

Посмотрите в примеры для лучшего понимания.

Входные данные

В первой строке задано два целых числа n и k (1 ≤ n, k ≤ 100) — количество вёдер и длина сада.

В следующей строке задано n целых чисел ai (1 ≤ ai ≤ 100) — длина отрезка, который за час можно полить i-м ведром.

Гарантируется, что найдётся хотя бы одно такое ведро, при помощи которого можно полить весь сад за целое число часов.

Выходные данные

Выведите единственное число — минимальное количество часов, за которое Люба сможет полить весь сад.

Примечание

В первом тесте выгоднее всего использовать ведро, которое позволяет поливать отрезок длины 3 каждый час. Ведро, которым можно каждый час поливать отрезок длины 5, мы использовать не можем, потому что тогда из-за ограничений мы не сможем полить весь сад.

Во втором тесте единственное ведро, которое можно использовать — ведро, при помощи которого поливается отрезок длины 1.

B. Браузер

реализация *1300

Люба только что закончила просматривать известные ей новостные сайты, и сейчас ей нужно закрыть все вкладки браузера, не необходимые ей для выполнения дел. Сейчас в браузере n открытых вкладок, пронумерованных от 1 до n слева направо. Курсор мыши находится на вкладке с номером pos. Вкладки с номерами с l по r (включительно) являются необходимыми для выполнения дел Любы. Она хочет закрыть все остальные вкладки как можно быстрее так, чтобы открытыми остались только вкладки с номерами из заданного отрезка.

За одну секунду Люба может либо попытаться сдвинуть курсор влево или вправо (если курсор сейчас на вкладке i, то можно его переместить на вкладку max(i - 1, a) или на вкладку min(i + 1, b)), либо попытаться закрыть все вкладки слева или справа от курсора (если сейчас курсор на вкладке i, можно закрыть либо все вкладки из отрезка [a, i - 1], либо все вкладки из [i + 1, b]). В этом абзаце a обозначает минимальный номер ещё не закрытой вкладки, b — максимальный. Например, если изначально было 7 вкладок, а вкладки 1, 2 и 7 уже закрыты, то a = 3, b = 6.

Какое минимальное количество секунд Любе требуется, чтобы оставить открытыми только вкладки с номерами с l по r включительно?

Входные данные

В единственной строке задано 4 целых числа n, pos, l, r (1 ≤ n ≤ 100, 1 ≤ pos ≤ n, 1 ≤ l ≤ r ≤ n) — количество вкладок, позиция указателя и нужный Любе отрезок.

Выходные данные

Выведите минимальное количество секунд, необходимое, чтобы оставить открытыми только вкладки из отрезка [l, r].

Примечание

В первом тесте Люба может добиться следующим образом — сдвинуть указатель мыши влево на вкладку 2, закрыть все вкладки слева, два раза сдвинуть указатель вправо (на 3 и на 4) и закрыть все вкладки справа.

Во втором тесте Любе достаточно закрыть все вкладки справа.

В третьем тесте все открытые вкладки уже образуют нужный Любе отрезок, следовательно, ей ничего делать не нужно.

E. Занятия физкультуры

реализация сортировки Структуры данных *2300

В этом году Алексей окончил школу, и теперь он первокурсник Берляндского Государственного Университета. Для него стало неожиданностью, что, несмотря на специализацию программиста, ему все равно надо было посещать физкультуру! Конец семестра уже не за горами, а Алексей не посетил еще ни одной пары!

Разумеется Алексей не хочет вылететь, поэтому ему интересно узнать, сколько рабочих дней осталось до конца семестра, ведь только тогда он может посещать физкультуру. Но в БГУ подсчет количества рабочих дней — задача не из легких:

До конца семестра осталось n дней (пронумерованных от 1 до n), и все они изначально рабочие. Затем публикуются q приказов один за другим. Каждый приказ определяется тремя числами l, r и k:

  • Если k = 1, то все дни с l по r (включительно) становятся выходными. Если некоторые дни до этого были объявлены рабочими, то они все равно становятся выходными;
  • Если k = 2, то все дни с l по r (включительно) становятся рабочими. Если некоторые дни до этого были объявлены выходными, то они все равно становятся рабочими.

Помогите Алексею посчитать количество рабочих дней до конца семестра после каждого приказа!

Входные данные

В первой строке записано целое число n, а во второй — целое число q (1 ≤ n ≤ 109, 1 ≤ q ≤ 3·105) — количество дней до окончания семестра и количество приказов, соответственно.

Затем идут q строк, в i записаны три целых числа li, ri и ki, описывающие i-й запрос (1 ≤ li ≤ ri ≤ n, 1 ≤ ki ≤ 2).

Выходные данные

Выведите q целых чисел. i-е должно равняться количеству рабочих дней, оставшихся до конца семестра, после того, как опубликованы первые i приказов.

A. Джейми и откладывание будильника

математика Перебор реализация *900

Джейми очень любит спать. Однажды он решил, что хочет проснуться ровно в hh: mm. Однако он ненавидит просыпаться, поэтому он решил сделать своё пробуждение менее неприятным, установив будильник в счастливое время. Затем он будет нажимать на кнопку будильника каждые x минут, пока не настанет hh: mm и только затем встанет с кровати. Джейми интересно, какое минимальное количество раз ему придётся нажимать на кнопку будильника.

Время называется счастливым, если оно содержит цифру '7'. Например, времена 13: 07 и 17: 27 являются счастливыми, а 00: 48 и 21: 34 не являются.

Учтите, что момент звонка будильника и момент, когда Джейми встанет с кровати, могут быть в разные дни. Гарантируется, что существует счастливое время, на которое Джейми может поставить будильник, чтобы проснуться в hh: mm.

Формально, Вам требуется найти такое минимальное неотрицательное целое число y, что в записи момента времени на x·y минут более раннего, чем hh: mm, присутствует цифра '7'.

Джейми использует 24-часовой формат времени времени, поэтому после 23: 59 наступает 00: 00.

Входные данные

В первой строке содержится целое число x (1 ≤ x ≤ 60).

Во второй строке содержатся два целых числа hh и mm (00 ≤ hh ≤ 23, 00 ≤ mm ≤ 59). В записи каждого из этих чисел содержатся ровно две цифры.

Выходные данные

Выведите минимальное возможное количество нажатий на кнопку.

Примечание

В первом тестовом примере Джейми хочет проснуться в 11:23. Поэтому он может поставить свой будильник на 11:17. Затем ему придётся нажать кнопку в 11:17 и в 11:20.

Во втором тестовом примере Джейми может поставить будильник ровно на 01:07, так как это счастливое время.

A. Монстр

дп жадные алгоритмы математика реализация *1800

Уилл застрял в Обратной стороне, но он все еще может общаться со своей мамой, Джойс, используя гирлянду (он может включать и выключать ее силой мысли). Он не может напрямую сказать маме, где он, потому что монстр, который унес его на Обратную сторону, узнает и спрячет его в другое место.

Поэтому он придумал задачу, чтобы сообщить маме свои координаты. Его координаты будут ответом на эту задачу.

Строка, состоящая только из скобок ('(' и ')'), называется скобочной последовательностью. Некоторые скобочные последовательности называются правильными скобочными последовательностями. Более формально:

  • Пустая строка является правильной скобочной последовательностью.
  • Если s является правильной скобочной последовательностью, то (s) тоже является правильной скобочной последовательностью.
  • Если s и t являются правильной скобочной последовательностью, то st (конкатенация s и t) тоже является правильной скобочной последовательностью.

Строка, состоящая из скобок и знаков вопроса ('?') называется красивой, если и только если есть способ заменить каждый из знаков вопроса на '(' или ')' так, чтобы получившаяся строка была непустой правильной скобочной последовательностью.

Уилл сообщил маме строку s, состоящую из скобок и знаков вопроса (используя код Морзе и гирлянду), его координаты равны числу пар чисел (l, r) таких, что 1 ≤ l ≤ r ≤ |s|, а строка slsl + 1... sr является красивой, где si — i-й символ строки s.

Джойс ничего не знает о скобочных последовательностях, поэтому она просит у вас помощи.

Входные данные

Первая и единственная строка содержит строку s, состоящую из символов '(', ')' и '?' (2 ≤ |s| ≤ 5000).

Выходные данные

Выведите ответ на задачу в единственной строке.

Примечание

В первом примере следующие подстроки s являются красивыми:

  1. «(?», которая может быть преобразована в «()».
  2. «?)», которая может быть преобразована в «()».
  3. «((?)», которая может быть преобразована в «(())».
  4. «(?))», которая может быть преобразована в «(())».

Во втором примере следующие подстроки s являются красивыми:

  1. «??», которая может быть преобразована в «()».
  2. «()».
  3. «??()», которая может быть преобразована в «()()».
  4. «?()?», которая может быть преобразована в «(())».
  5. «??», которая может быть преобразована в «()».
  6. «()??», которая может быть преобразована в «()()».
  7. «??()??», которая может быть преобразована в «()()()».

A. Одиннадцать

Перебор реализация *800

Одиннадцать хочет выбрать себе новое имя. Так как ее друзья — гики, они предложили ей алгоритм для выбора имени. Одиннадцать хочет, чтобы в имени было ровно n букв.

Ее друг предложил имя, состоящее только из заглавных и строчных букв латинского алфавита «O». А именно, i-я буква должна быть «O» (заглавная), если число i встречается в последовательности Фибоначчи, и «o» (строчная) в остальных случаях. Буквы в имени нумеруются от 1 до n. Последовательность Фибоначчи — это последовательность f, где

  • f1 = 1,
  • f2 = 1,
  • fn = fn - 2 + fn - 1 (n > 2).

Друзья Одиннадцать еще слишком маленькие, чтобы знать, что такое последовательность Фибоначчи, поэтому они просят вас определить новое имя Одиннадцать.

Входные данные

Первая и единственная строка содержит одно целое число n (1 ≤ n ≤ 1000).

Выходные данные

Выведите новое имя Одиннадцать на единственной строке.

B. Радиостанция

реализация Строки *900

После того, как друзья спалили оборудование радиостанции, школьное управление дало им задания в качестве наказания. Задачей Дастина было добавлять комментарии к файлам конфигурации nginx на школьном сайте.

В школе n серверов. Каждый сервер имеет имя и ip-адрес (имена не обязательно различны, ip-адреса обязательно различны). Дастин знает ip-адрес и имя каждого сервера. Для простоты, предположим, что все команды nginx имеют вид «command ip;», где command — строка из строчных букв латинского алфавита, а ip — адрес одного из школьных серверов.

Каждый ip-адрес имеет вид «a.b.c.d», где a, b, c и d являются неотрицательными целыми числами, не превосходящими 255 (без лидирующих нулей). Конфигурационный файл nginx, к которому Дастин должен добавить комментарии, имеет m команд. Никто никогда не помнит, какие ip-адреса у каких серверов, поэтому, чтобы конфигурационный файл было удобнее читать, Дастин должен после каждой команды дописать имя сервера, которому принадлежит данный ip-адрес. Формально, если строчка имела вид «command ip;», то Дастин должен заменить ее на «command ip; #name», где name — имя сервера, ip-адрес которого равняется ip.

Дастин ничего не знает о nginx, поэтому он запаниковал, и его друзья попросили вас выполнить задачу.

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 1000).

Следующие n строк содержат имена и ip-адреса серверов. Каждая строка содержит строку name (имя сервера) и строку ip (ip-адрес сервера), разделенные пробелом (1 ≤ |name| ≤ 10, name состоит только из строчных латинских букв). Гарантируется, что все ip-адреса различны.

Следующие m строк содержат команды в конфигурационном файле. Каждая строка имеет вид «command ip;» (1 ≤ |command| ≤ 10, command состоит только из строчных латинских букв). Гарантируется, что ip-адрес принадлежит одному из n серверов.

Выходные данные

Выведите m строк — команды в конфигурационном файле после того, как Дастин выполнит свою задачу.

A. Супермаркет

жадные алгоритмы Перебор реализация *800

Зачастую, придя в магазин, на ценнике фруктов или овощей вы увидите цену за килограмм. Однако в некоторых магазинах, если вы спросите о цене, вам ответят, что она составляет \(a\) юаней за \(b\) килограмм (вам не нужно знать, что такое «юань»), или, что то же самое, \(a/b\) юаней за килограмм.

Вы хотите купить \(m\) килограмм яблок. Вы узнали цены в \(n\) магазинах. Найдите минимальную стоимость, по которой вы можете купить эти яблоки.

Вы можете считать, что в любом магазине достаточно яблок для вас.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \leq n \leq 5\,000\), \(1 \leq m \leq 100\)), означающие, что вы узнали цены в \(n\) магазинах и хотите купить \(m\) килограмм яблок.

Следующие \(n\) строк описывают цены в магазинах. Каждая строка содержит два целых числа \(a, b\) (\(1 \leq a, b \leq 100\)), означающие, что в этом супермаркете вы должны заплатить \(a\) юаней за \(b\) килограмм яблок.

Выходные данные

В единственной строке выведите минимальную стоимость \(m\) килограмм яблок. Ваш ответ будет считаться правильным, если абсолютная или относительная его ошибка не превосходит \(10^{-6}\).

Формально, пусть ваш ответ равен \(x\), а ответ жюри равен \(y\). Ваш ответ будет считаться правильным, если \(\frac{|x - y|}{\max{(1, |y|)}} \le 10^{-6}\).

Примечание

В первом примере необходимо купить \(5\) килограмм яблок в магазине \(3\). Стоимость равна \(5/3\) юаней.

Во втором примере необходимо купить \(1\) килограмм яблок в магазине \(2\). Стоимость равна \(98/99\) юаней.

B. Прекрасное число

Бинарный поиск дп Перебор реализация теория чисел *1100

Будем называть положительное целое число прекрасным, если и только если сумма его цифр равна \(10\). Вам дано целое число \(k\), найдите \(k\)-е по величине прекрасное положительное целое число.

Входные данные

Единственная строка содержит одно целое число \(k\) (\(1 \leq k \leq 10\,000\)).

Выходные данные

Выведите \(k\)-е по величине прекрасное число.

Примечание

Первое прекрасное число равно \(19\), а второе — \(28\).

C. Рассадка

Перебор реализация *1300

Предположим, вы ходите каждый день на занятия. Каждый раз вы приходите в последний момент, и некоторые места в классе уже заняты. Например, сегодня вы с друзьями пришли в класс и обнаружили, что некоторые места уже заняты.

В класс \(n\) рядов по \(m\) мест в каждом ряду. Таким образом, класс можно представить как матрицу \(n \times m\). Символ «.» означает свободное место, а символ «*» означает занятое место. Вам необходимо найти \(k\) соседних свободных мест в одном ряду или в одном столбце. Посчитайте количество способов выбрать места. Два способа считаются различными, если различны множества мест, которые вы выберете.

Входные данные

Первая строка содержит три различных целых числа \(n,m,k\) (\(1 \leq n, m, k \leq 2\,000\)), где \(n,m\) описывают размеры класса, а \(k\) — число соседних мест, которые вы должны найти.

Каждая из следующих \(n\) строк содержит \(m\) символов «.» или «*». Они образуют матрицу, описывающую класс, «.» обозначает свободное место, а «*» — занятое.

Выходные данные

Выведите одно число — число способов выбрать \(k\) свободных мест в одном ряду или столбце.

Примечание

В первом примере есть три способа выбрать места. Они перечислены ниже.

  • \((1,3)\), \((2,3)\)
  • \((2,2)\), \((2,3)\)
  • \((2,1)\), \((2,2)\)

A. Фишки

математика реализация *800

В кругу сидят n моржей. Все моржи пронумерованы по часовой стрелке: слева от моржа с номером 1 сидит морж с номером 2, слева от моржа с номера 2 сидит морж с номером 3, ..., слева от моржа с номером n сидит морж с номером 1.

У ведущего есть m фишек. Ведущий встает в центр круга и начинает раздавать фишки моржам начиная с моржа с номером 1, двигаясь по часовой стрелке. Морж с номером i получает i фишек. Если ведущий не может выдать текущему моржу положенное количество фишек, то оставшиеся фишки ведущий забирает себе, и процесс заканчивается. По заданным n и m определите, сколько фишек достанется ведущему.

Входные данные

В первой строке содержатся два целых числа n и m (1 ≤ n ≤ 50, 1 ≤ m ≤ 104) — количество моржей и количество фишек соответственно.

Выходные данные

Выведите количество фишек, которые забрал себе ведущий.

Примечание

В первом примере: ведущий выдает моржу с номером 1 одну фишку, моржу с номером 2 — две фишки, моржу с номером 3 — три фишки, моржу с номером 4 — четыре фишки, затем снова моржу с номером 1 выдает одну фишку. После этого у ведущего кончаются фишки, он не может ничего дать моржу с номером 2, и процесс заканчивается.

В третьем примере: ведущий выдает моржу с номером 1 одну фишку, моржу с номером 2 — две фишки, моржу с номером 3 — три фишки, затем снова моржу с номером 1 выдает одну фишку. У ведущего остается одна фишка и он не может выдать моржу с номером 2 две фишки, поэтому он забирает одну фишку себе.

A. Полив

реализация *1000

Зимой Максим решил наконец-то заняться тем, про что постоянно напоминала ему мама — поливкой огорода.

Огород представляет собой n грядок, пронумерованных от 1 до n. На k грядках огорода расположены краны (i-й кран — на грядке xi), которые при включении начинают распространять воду на соседние грядки. Если кран на грядке xi включён, то через одну секунду будет полита грядка xi, через две — грядки с отрезка [xi - 1, xi + 1] (если они существуют), через j (j — целое число) — с отрезка [xi - (j - 1), xi + (j - 1)] (если они существуют). В течение секунды ничего не меняется, то есть нельзя сказать, что отрезок [xi - 2.5, xi + 2.5] будет полит через 2.5 секунды; в этот момент будет полит только отрезок [xi - 2, xi + 2].

Огород из 1 теста. Белый цвет обозначает грядку без крана, красный — грядку с краном.
Огород из 1 теста через 2 секунды после включения крана. Белый цвет обозначает грядку, которая не полита, голубой — политую грядку.

Максим хочет узнать, за какое минимальное количество времени, если он одновременно включит все краны, весь огород будет полит. Помогите ему с этим!

Входные данные

В первой строке входных данных задано одно число t (1 ≤ t ≤ 200) — количество наборов тестовых данных, для которых нужно решить задачу.

Затем следуют t наборов. Первая строка набора содержит два целых числа n и k (1 ≤ n ≤ 200, 1 ≤ k ≤ n) — количество грядок и кранов, соответственно.

Следующая строка набора содержит k целых чисел xi (1 ≤ xi ≤ n) — грядка, в которой установлен i-й кран. Гарантируется, что для любого выполняется xi - 1 < xi.

Гарантируется, что сумма n по всем наборам не превосходит 200.

Обратите внимание, во взломах можно использовать только t = 1.

Выходные данные

Для каждого набора выведите единственное целое число — через какое минимальное время Максим сможет полить весь огород.

Примечание

Разбор примера из условия. В нём 3 набора тестовых данных:

  1. Огород из 5 грядок, в грядке под номером 3 кран. Если его включить, через 1 секунду грядка 3 будет полита; через 2 секунды грядки [1, 3] будет политы, и через 3 секунды всё будет полито.
  2. 3 грядки, кран в каждой из них. Если включить все краны, то всё будет полито через 1 секунду.
  3. 4 грядки, и один кран в грядке 1. Потребуется 4 секунды, чтобы полить, к примеру, грядку 4.

B. Очередь за чаем

реализация *1200

Недавно студенты из города С. поехали на сборы в город П. Всего на сборы отправилось n студентов.

Вечером в поезде возникла очередь за чаем. Студент с номером i приходит в очередь к чайнику в начале секунды li. Студенты приходят в очередь в порядке увеличения их номеров (то есть если два студента придут в очередь в одно и то же время, первым будет тот, у кого меньше номер). Если очередь пуста — он за одну секунду наливает себе чай и уходит. Иначе же он ждёт, пока все студенты перед ним нальют себе чай и уйдут. Если в начале секунды ri i-й студент до сих пор не может налить себе чай (кто-то до сих пор перед ним в очереди), он просто уходит из очереди.

Помогите определить для каждого студента, в какой момент времени он нальёт себе чай, или же определите, что он не дождётся этого момента и покинет очередь.

Входные данные

В первой строке входных данных задано одно число t (1 ≤ t ≤ 1000) — количество наборов тестовых данных, для которых нужно решить задачу.

Затем следуют t наборов. Первая строка набора содержит единственное целое число n (1 ≤ n ≤ 1000) — количество студентов.

В следующих n строках набора задано по два целых числа li, ri (1 ≤ li ≤ ri ≤ 5000) — момент времени, в который студент с номером i приходит в очередь, и момент времени, после которого студент уйдёт, если не успеет налить себе чай.

Гарантируется, что для любого выполняется li - 1 ≤ li.

Гарантируется, что сумма n по всем наборам не превосходит 1000.

Обратите внимание, во взломах можно использовать только t = 1.

Выходные данные

Для каждого набора выведите n чисел. i-е число — момент времени, в который студент i нальёт себе чай, или же 0, если студент не сможет этого сделать.

Примечание

Пример содержит 2 набора:

  1. В 1-ю секунду студенты 1 и 2 встают в очередь, и студент 1 наливает себе чай. Студент 2 наливает себе чай во 2-ю секунду.
  2. В 1-ю секунду студенты 1 и 2 встают в очередь, студент 1 наливает себе чай, и студент 2 уходит без чая. Во 2-ю секунду приходит студент 3 и наливает себе чай.

D. Емкости

дп жадные алгоритмы реализация *2400

Чтобы содержать свое поле в идеальном состоянии, Пете необходимо иногда поливать его. Чтобы полить поле, Пете необходимо ровно V мл воды.

Также у Пети есть N емкостей, i-я первоначально заполнена на ai мл. Емкости достаточно большие и любая из них позволяет хранить в себе любой объем воды.

Чтобы переливать воду между емкостями, у Пети имеется ковш объемом K мл. Данным ковшом можно зачерпывать воду из одной емкости и выливать в какую-то емкость (нельзя зачерпнуть воду одновременно из нескольких емкостей, и выливать ее необходимо полностью). При этом зачерпнуть можно min(v, K), где v — текущий объем воды в выбранной емкости.

Можно ли с помощью данного ковша получить в одной из емкостей объем, строго равный V? Если возможно, выведите необходимую последовательность операций. Если способов получить искомый объем несколько — выведите любой.

Входные данные

В первой строке заданы 3 целых числа: N (2 ≤ N ≤ 5000), K (1 ≤ K ≤ 5000) и V (0 ≤ V ≤ 109) — количество емкостей, объем ковша и требуемый объем воды в емкости, соответственно.

В следующей строке задано N целых чисел ai (0 ≤ ai ≤ 105), где ai — первоначальный объем воды в i-й емкости.

Выходные данные

Если невозможно получить объем V, выведите NO.

В противном случае выведите в первой строке YES, а далее со следующей строки операции в следующем формате:

В каждой строке по 3 числа — описание очередной сжатой операции: «cnt x y» (1 ≤ cnt ≤ 109, 1 ≤ x, y ≤ N), где x — номер емкости, откуда надо черпать, y — номер емкости, куда выливать, а cnt — количество операций «перелить воду из емкости x в емкость y».

Количество строк со сжатыми операциями не должно превышать N + 5.

A. Клонирование игрушек

реализация *1300

Имп очень любит свою плюшевую игрушку.

Недавно он обнаружил аппарат, предназначенный для клонирования плюшевых игрушек. После нескольких тестов выяснилось, что при применении аппарата к оригинальной игрушке порождается одна дополнительная копия и один дополнительный оригинал, а при применении к копии — две дополнительные копии.

Изначально у Импа есть лишь только его игрушка, которую он считает оригинальной. Ему стало интересно, можно ли путем последовательных применений клонирующего аппарата получить ровно x копий и y оригиналов? Избавляться от полученных игрушек запрещается; также запрещается применять операцию клонирования к копиям, если у Импа в данный момент их нет.

Входные данные

В единственной строке заданы два числа x и y (0 ≤ x, y ≤ 109) — количество копий и оригиналов, которое необходимо получить (включая начальную).

Выходные данные

Выведите «Yes», если искомая конфигурация возможна, и «No» в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере достаточно дважды применить операцию клонирования к оригинальной игрушке и еще дважды — к копиям.

D. Выбор строк

Конструктив реализация Строки *2500

У Алисы есть строка, состоящая из букв «A», «B» и «C». Боб может использовать следующие замены для любых подстрок данной строки в любом порядке любое число раз:

  • A BC
  • B AC
  • C AB
  • AAA пустая строка

Обратите внимание, что подстрокой называется одна или более соседняя буква. Для данных запросов определите, можно ли получить конечную строку из начальной.

Входные данные

Первая строка содержит строку S (1 ≤ |S| ≤ 105). Вторая строка содержит строку T (1 ≤ |T| ≤ 105), каждая из этих строк содержит только заглавные латинские буквы «A», «B» и «C».

Третья строка содержит число запросов Q (1 ≤ Q ≤ 105).

Следующие Q строк описывают запросы. i-я из этих строк содержит четыре целых числа ai, bi, ci, di. Они описывают i-й запрос: возможно ли получить строку T[ci..di] из строки S[ai..bi] применением вышеописанных операций конечное число раз?

Здесь U[x..y] обозначает подстроку U, которая начинается в позиции x (нумерация с 1) и заканчивается в позиции y. В частности, U[1..|U|] — строка U целиком.

Гарантируется, что 1 ≤ a ≤ b ≤ |S| и 1 ≤ c ≤ d ≤ |T|.

Выходные данные

Выведите строку из Q символов, где i-й символ равен «1», если ответ на i-й запрос «Да», и «0» иначе.

Примечание

В первом запросе мы можем получить нужную строку, например, используя следующие шаги: .

В третьем запросе просят получить из строки AAB строку A, но в этом случае невозможно избавиться от буквы «B».

A. Мистическая мозаика

жадные алгоритмы реализация *1300

У Аркадия была прямоугольная таблица из n строк и m столбцов, при этом каждая клетка изначально была покрашена в белый.

Аркадий выполнил несколько (возможно, ноль) операций на ней. На i-й операции он выбрал непустое подмножество строк Ri и непустое подмножество столбцов Ci. Для каждой строки r в Ri и каждого столбца c в Ci он закрасил пересечение строки r и столбца c в черный цвет.

Кроме того, есть дополнительное ограничение: строка или столбец могут выбраны в течение всех операций не более раза. Другими словами, не существует пары (i, j) (i < j) такой, что или , где обозначает пересечение множеств, а  — пустое множество.

Вам дана некоторая таблица. Определите, могла ли она получиться после применения таких операций.

Входные данные

Первая строка содержит два целых числа n и m (1 ≤ n, m ≤ 50) — количество строк и столбцов в таблице, соответственно.

Каждая из следующих n строк содержит строку из m символов, каждый из которых либо «.» (обозначает белую клетку), либо «#» (обозначает черную клетку). Эти строки описывают финальную таблицу.

Выходные данные

Если данная таблица может быть получена некоторой корректной последовательностью операций, выведите «Yes»; в противном случае выведите «No» (без кавычек).

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере таблицу можно получить за 3 операции, как показано на рисунке ниже.

Во втором примере невозможно получить заданную таблицу, так как для того, чтобы закрасить центральную строку, нужно выбрать третью строку и все столбцы в одной операции, но после этого невозможно будет выбрать ни один столбец еще раз, поэтому нельзя будет покрасить оставшиеся клетки в центральном столбце.

B. Распределение ресурсов

Бинарный поиск реализация сортировки *1700

В распоряжении одного отдела одной софтверной компании есть \(n\) серверов разной мощности. Пронумеруем сервера целыми числами от \(1\) до \(n\). Будем считать, что технические характеристики \(j\)-го сервера в компании полностью определяются целочисленным количеством \(c_j\) условных единиц ресурса.

Для решения текущих рабочих задач необходимо развернуть на данных серверах два сервиса — \(S_1\) и \(S_2\), которые будут обрабатывать входящие запросы. Обработка входящих запросов сервиса \(S_i\) требует \(x_i\) единиц ресурса сервера.

Действие происходит в довольно продвинутой компании, поэтому каждый сервис может быть развёрнут не на одном сервере, а одновременно на нескольких. Если сервис \(S_i\) развёрнут на \(k_i\) серверах, то нагрузка равномерно распределяется между этими серверами, и на каждом сервере используется только \(x_i / k_i\) (возможно, нецелое число) единиц ресурса.

Каждый сервер в компании может быть либо не быть использован вообще, либо под какой-то один из сервисов (но не под оба одновременно). Сервис не должен использовать больше ресурсов, чем доступно на сервере.

Определите, возможно ли развернуть оба сервиса, используя данный набор серверов, и если да, то определите, какие серверы следует отвести под какой сервис.

Входные данные

В первой строке входных данных находятся три целых числа \(n\), \(x_1\), \(x_2\) (\(2 \leq n \leq 300\,000\), \(1 \leq x_1, x_2 \leq 10^9\)) — количество серверов в распоряжении у отдела и требуемое количество ресурсов, необходимое для каждого из сервисов.

Во второй строке находятся \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \leq c_i \leq 10^9\)), разделённых пробелами — мощности серверов.

Выходные данные

Если развернуть оба сервиса на данном наборе серверов невозможно, выведите единственное слово «No» (без кавычек).

В противном случае в первой строке выведите слово «Yes» (без кавычек).

Во второй строке выведите два целых числа \(k_1\) и \(k_2\) (\(1 \leq k_1, k_2 \leq n\)) — количества серверов, отведённых под каждый из сервисов.

В третьей строке выведите \(k_1\) целых чисел — номера серверов, которые следует отвести под первый сервис.

В четвёртой строке выведите \(k_2\) целых чисел — номера серверов, которые следует отвести под второй сервис.

Ни один номер сервера не должен встречаться среди выведенных вами номеров дважды. Если возможных ответов несколько, разрешается вывести любой из них.

Примечание

В первом тесте из условия на каждом из серверов 1, 2 и 6 будет использовано по \(8 / 3 = 2.(6)\) единиц ресурса, а на каждом из серверов 5 и 4 — по \(16 / 2 = 8\) единиц ресурса.

Во втором тесте из условия на первом сервере будет использовано \(20\) единиц ресурса, а на оставшихся серверах — по \(32 / 3 = 10.(6)\) единиц ресурса.

A. 2-3-числа

математика реализация *1300

Целое положительное число называется 2-3-числом, если имеет вид 2x·3y для некоторых неотрицательных целых x и y. Иными словами, это такие числа, среди простых делителей которых встречаются только числа 2 и 3. Например, числа 1, 6, 9, 16 и 108 — 2-3 числа, а 5, 10, 21 и 120 — нет.

Выведите количество 2-3-чисел на заданном отрезке [l, r], то есть количество таких 2-3-чисел t, что l ≤ t ≤ r.

Входные данные

В первой строке записаны два целых положительных числа l и r (1 ≤ l ≤ r ≤ 2·109).

Выходные данные

Выведите одно целое число — количество 2-3-чисел на отрезке [l, r].

Примечание

В первом примере 2-3-числами являются числа 1, 2, 3, 4, 6, 8 и 9.

Во втором примере 2-3-числами являются числа 108, 128, 144, 162 и 192.

C. Это зебра?

реализация *1700

Камера, случайно оставленная вами в пустыне, сделала загадочный снимок. Снимок имеет разрешение в n пикселей по ширине, при этом в каждом столбце либо все пиксели черные, либо все белые. Таким образом, снимок можно представить в виде последовательности из n нулей и единиц, где 0 означает, что в соответствующем столбце все пиксели черные, а 1 — что все пиксели белые.

Вы считаете, что на снимок могла попасть зебра. В таком случае снимок целиком состоит из нескольких (возможно, одной) чередующихся черных и белых полос некоторой равной ширины. Например, на снимке [0, 0, 0, 1, 1, 1, 0, 0, 0] может быть изображена зебра, а на снимке [0, 0, 0, 1, 1, 1, 1] — нет, так как ширина черной полосы равна 3, а ширина белой — 4. Ответьте на вопрос, может ли на снимке быть изображена зебра?

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 100 000) — ширина снимка.

Во второй строке следует последовательность целых чисел a1, a2, ..., an (0 ≤ ai ≤ 1) — описание снимка. Если ai равно нулю, то i-й столбец снимка состоит из черных пикселей. Если ai равно единице, то i-й столбец снимка состоит из белых пикселей.

Выходные данные

Если на снимок могла попасть зебра, выведите «YES» (без кавычек). В противном случае выведите «NO».

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

Первые два примера разобраны в условии.

В третьем примере все столбцы пикселей белого цвета, поэтому зебра могла попасть на снимок.

В четвертом примере ширина первой полосы равна трем (она имеет белый цвет), ширина второй полосы равна трем (она имеет черный цвет), а ширина третьей полосы равна двум (она имеет белый цвет). Таким образом, не все полосы имеют одинаковую длину, поэтому зебра не могла попасть на снимок.

C. Управление зависимостями

*особая задача графы реализация *1900

Поликарп разрабатывает проект на языке Vaja и использует популярную систему управления зависимостями Vamen. С точки зрения Vamen и проекты, и библиотеки на Vaja называются просто проектами.

В Vamen каждый проект имеет уникальное название из строчных латинских букв длины от 1 до 10 и версию — положительное целое число от 1 до 106. Каждый проект (помните, что в этот термин включается не только название, но и конкретная версия) может зависеть от других проектов. Конечно, все зависимости ациклические.

Вам задан набор описаний проектов. Первый из заданных проектов — это тот, который в настоящий момент разрабатывается Поликарпом. Помогите Поликарпу определить все проекты, от которых прямо или по цепочке зависит проект Поликарпа.

Возможно, что проект Поликарпа зависит от одного и того же проекта разных версий (то есть имя проекта одинаково, а версии разные). В этом случае происходит разрешение коллизий, которое для разрабатываемого проекта выбирает такую версию зависимости, длина цепочки зависимостей до которой минимальна. Если таких версий несколько, выбирается максимальная версия из них.

Таким образом, если проект Поликарпа зависит (прямо или по цепочке) от нескольких проектов с одинаковыми названиями, но разными версиями, то необходимо выбрать такую версию, длина цепочки зависимостей до которой от проекта Поликарпа минимальна (если таких версий несколько — максимальную из них). Именно эта версия для заданного названия проекта используется как действительная зависимость, остальные версии и их зависимости игнорируются.

Формально, необходимо выбрать такой набор проектов минимального размера, чтобы выполнялись следующие условия:

  • выбран проект Поликарпа;
  • проект Поликарпа прямо или косвенно зависит от каждого из выбранных проектов;
  • нет двух выбранных проектов с одинаковыми названиями;
  • для каждого проекта x, от которого напрямую зависит некоторый выбранный проект или проект Поликарпа, верно, что либо этот проект x тоже выбран, либо выбран проект y с таким же названием, но другой версией, причем либо цепочка зависимостей от проекта Поликарпа до проекта y короче, чем до проекта x, либо цепочки имеют равную длину, и версия проекта y больше, чем версия проекта x.

Выведите все зависимости (прямые или по цепочке) проекта Поликарпа. Сам проект Поликарпа выводить не нужно. Выводите зависимости в порядке лексикографического порядка увеличения названий.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 1 000) — количество проектов языка Vaja.

Далее следует описание всех n проектов. Каждый проект задается строкой, состоящей из имени (непустая строка, состоящая из строчных букв латинского алфавита; длина не превосходит 10) и версии (целое число от 1 до 106), которые записаны через одиночный пробел. Затем следует строка с количеством непосредственных зависимостей (целое число от 0 до n - 1), затем сами зависимости по одной в строке в произвольном порядке. Каждая зависимость задается как название и версия (записаны через одиночный пробел). Проекты заданы в произвольном порядке, но первый из них — проект Поликарпа. Описание проектов разделяется пустой строкой.

Гарантируется, что циклических зависимостей нет. Проекты разделены одиночными пустыми строками. Считайте, что проект может зависеть от проекта, имеющего такое же название, но отличную версию.

Ознакомьтесь с примерами для лучшего понимания условия.

Выходные данные

Выведите все зависимости (прямые или по цепочке) проекта Поликарпа. Выводите зависимости в порядке лексикографического порядка увеличения названий.

Примечание

Первый пример изображён на рисунке ниже. Стрелка из проекта A в проект B означает, что проект B напрямую зависит от проекта A. Закрашены проекты, от которых зависит проект Поликарпа «a» с версией 3.

Второй пример изображён на рисунке ниже. Стрелка из проекта A в проект B означает, что проект B напрямую зависит от проекта A. Закрашены проекты, от которых зависит проект Поликарпа «codehorces» с версией 5. Обратите внимание, взят проект «extra 1», а не «extra 3», так как проект «mashadb 1» и все его зависимости отброшены из-за проекта «mashadb 2».

A. Прокат велосипедов

*особая задача жадные алгоритмы реализация *1400

Как известно, в теплую погоду многие жители крупных городов пользуются сервисами городского велопроката. Вот и Аркадий сегодня будет добираться от школы до дома, используя городские велосипеды.

Школа и дом находятся на одной прямой улице, кроме того, на той же улице есть n точек, где можно взять велосипед в прокат или сдать его. Первый велопрокат находится в точке x1 километров вдоль улицы, второй — в точке x2 и так далее, n-й велопрокат находится в точке xn. Школа Аркадия находится в точке x1 (то есть там же, где и первый велопрокат), а дом — в точке xn (то есть там же, где и n-й велопрокат). Известно, что xi < xi + 1 для всех 1 ≤ i < n.

Согласно правилам пользования велопроката, Аркадий может брать велосипед в прокат только на ограниченное время, после этого он должен обязательно вернуть его в одной из точек велопроката, однако, он тут же может взять новый велосипед, и отсчет времени пойдет заново. Аркадий может брать не более одного велосипеда в прокат одновременно. Если Аркадий решает взять велосипед в какой-то точке проката, то он сдаёт тот велосипед, на котором он до него доехал, берёт ровно один новый велосипед и продолжает на нём своё движение.

За отведенное время, независимо от выбранного велосипеда, Аркадий успевает проехать не больше k километров вдоль улицы.

Определите, сможет ли Аркадий доехать на велосипедах от школы до дома, и если да, то какое минимальное число раз ему необходимо будет взять велосипед в прокат, включая первый велосипед? Учтите, что Аркадий не намерен сегодня ходить пешком.

Входные данные

В первой строке следуют два целых числа n и k (2 ≤ n ≤ 1 000, 1 ≤ k ≤ 100 000) — количество велопрокатов и максимальное расстояние, которое Аркадий может проехать на одном велосипеде.

В следующей строке следует последовательность целых чисел x1, x2, ..., xn (0 ≤ x1 < x2 < ... < xn ≤ 100 000) — координаты точек, в которых находятся велопрокаты. Гарантируется, что координаты велопрокатов заданы в порядке возрастания.

Выходные данные

Если Аркадий не сможет добраться от школы до дома только на велосипедах, выведите -1. В противном случае, выведите минимальное количество велосипедов, которые Аркадию нужно взять в точках проката.

Примечание

В первом примере Аркадий должен взять первый велосипед в первом велопрокате и доехать на нём до второго велопроката. Во втором велопрокате он должен взять новый велосипед, на котором он сможет добраться до четвертого велопроката, рядом с которым и находится его дом. Поэтому Аркадию нужно всего два велосипеда, чтобы добраться от школы до дома.

Во втором примере всего два велопроката, расстояние между которыми 10. Но максимальное расстояние, которое можно проехать на одном велосипеде, равно 9. Поэтому Аркадий не сможет добраться от школы до дома только на велосипедах.

B. Места в самолёте

*особая задача реализация *1300

В самолёте есть n рядов мест. Если смотреть на ряды сверху, то в каждом ряду есть 3 места слева, затем проход между рядами, затем 4 центральных места, затем ещё один проход между рядами, а затем ещё 3 места справа.

Известно, что некоторые места уже заняты пассажирами. Всего есть два вида пассажиров — статусные (те, которые часто летают) и обычные.

Перед вами стоит задача рассадить ещё k обычных пассажиров так, чтобы суммарное число соседей у статусных пассажиров было минимально возможным. Два пассажира считаются соседями, если они сидят в одном ряду и между ними нет других мест и прохода между рядами. Если пассажир является соседним пассажиром для двух статусных пассажиров, то его следует учитывать в сумме соседей дважды.

Входные данные

В первой строке следуют два целых числа n и k (1 ≤ n ≤ 100, 1 ≤ k ≤ 10·n) — количество рядов мест в самолёте и количество пассажиров, которых нужно рассадить.

Далее следует описание рядов мест самолёта по одному ряду в строке. Если очередной символ равен '-', то это проход между рядами. Если очередной символ равен '.', то это свободное место. Если очередной символ равен 'S', то на текущем месте будет сидеть статусный пассажир. Если очередной символ равен 'P', то на текущем месте будет сидеть обычный пассажир.

Гарантируется, что количество свободных мест не меньше k. Гарантируется, что все ряды удовлетворяют описанному в условии формату.

Выходные данные

В первую строку выведите минимальное суммарное число соседей у статусных пассажиров.

Далее выведите план рассадки пассажиров, который минимизирует суммарное количество соседей у статусных пассажиров, в том же формате, что и во входных данных. Если в свободное место нужно посадить одного из k пассажиров, выведите строчную букву 'x' вместо символа '.'.

Примечание

В первом примере нужно посадить ещё двух обычных пассажиров. Для минимизации соседей у статусных пассажиров, нужно посадить первого из них на третье слева место, а второго на любое из оставшихся двух мест, так как независимо от выбора места он станет соседом двух статусных пассажиров.

Изначально, у статусного пассажира, который сидит на самом левом месте уже есть сосед. Также на четвёртом и пятом местах слева сидят статусные пассажиры, являющиеся соседями друг для друга (что добавляет к сумме 2).

Таким образом, после посадки ещё двух обычных пассажиров, итоговое суммарное количество соседей у статусных пассажиров станет равно пяти.

A. Рамочки

реализация *1700

В жизни Игоря К. было много заслуживающих внимания ситуаций. Мы помним историю с вирусом, историю его математической карьеры и, разумеется, его знаменитые программные разработки. Но не всегда увлечения появляются, иногда они и исчезают.

На сей раз Игорь К. разочаровался в еще одном своем увлечении: монтаже и озвучке видеороликов. Причем настолько, что захотел навсегда уничтожить свой секретный архив.

Операционная система Pindows XR, которую использует Игорь К., представляет файлы и папки в виде маленьких иконок, причем в любое окно по горизонтали умещается m иконок.

В корневом каталоге диска D: на компьютере Игоря К. содержится n папок, пронумерованных от 1 до n в порядке слева направо сверху вниз (см. рисунки). При этом папки с секретными видеороликами имеют номера от a до b включительно. Игорь К. хочет безвозвратно удалить их, при этом произведя как можно меньше выделений рамочкой, а затем ровно один раз нажав Shift+Delete. Помогите ему посчитать, сколько раз придется выделять папки. Заметим, что если какая-то папка, будучи уже выделенной, выделяется второй раз, ее выделение сбрасывается. Каждое выделение имеет форму некоторого прямоугольника со сторонами, параллельными границам экрана.

Входные данные

В единственной строке содержатся четыре целых числа n, m, a, b (1 ≤ n, m ≤ 109, 1 ≤ a ≤ b ≤ n) — количество папок на компьютере Игоря К., ширина окна и номера первой и последней подлежащих удалению папок.

Выходные данные

Выведите единственное целое число: наименьшее количество выделений папок рамочкой, чтобы выделенными оказались исключительно папки с номерами от a до b.

Примечание

На рисунках ниже показаны тесты из условия.

Первый тест:

В этом тесте первым выделением можно выбрать папки 3 и 4, вторым — папки 5, 6, 7, 8, и последним, третьим выделением — папку с номером 9.

Второй тест:

В этом тесте можно сначала выделить все папки в первой строке (2, 3, 4, 5), а потом — все остальные.

C. Аземблер

Перебор реализация *2500

После провала программы Search Ultimate, искавшей строки в тексте за квадрат, Игорь К. задумался: "Отчего же, отчего моя программа работает так медленно?" Перепроверив еще раз свой код, он сказал: "В моем коде ошибок нет, однако я знаю, как мы будем улучшать Search Ultimate!" и достал с полки толстую книжку, на которой было написано "Аземблер. Принципиально новый подход".

Внимательно полистав эту книгу, Игорь К. понял, что, оказывается, умножение чисел можно проводить в десятки раз быстрее. "Search Ultimate будет быстра, как никогда!" — радостно прокричал он и приступил к работе.

Поясним теперь, в чем заключалась идея Игоря К. Дело в том, что код, генерируемый компилятором, далеко не оптимален — стандартное умножение чисел действительно работает медленнее, чем тот трюк, о котором рассказывалось в книжке.

В языке Azembler есть 26 регистров (eax, ebx, ..., ezx) и две команды:

  • [x] — возвращает значение, записанное по адресу x. Например, [eax] возвращает значение, которое записано по адресу, равному значению в регистре eax.
  • lea x, y — загружает в регистр x, указанный в качестве первого операнда, адрес второго операнда. Так, например, команда lea ebx, [eax] запишет в регистр ebx содержимое регистра eax: сначала выполнится операция [eax], результатом которой будет являться некоторое значение, лежащее по адресу, записанному в eax. Но нам не нужно это значение — следующей операцией будет lea — которая возьмет адрес [eax], т.е. значение в самом регистре eax, и запишет его в ebx.

На первый взгляд вторая операция кажется бессмысленной, но, оказывается, допустимо записывать эту операцию как

lea ecx, [eax + ebx],

lea ecx, [k*eax]

или даже

lea ecx, [ebx + k*eax],

где k = 1, 2, 4 или 8.

В результате в регистр ecx будут записаны соответственно числа eax + ebx, k*eax и ebx + k*eax. Но такая операция выполняется намного, в десятки раз, быстрее, чем обычное умножение чисел. А с помощью нескольких таких операций можно очень быстро умножить какое-либо число на другое. Конечно, вместо eax, ebx и ecx разрешено использовать любые регистры.

Например, пусть в регистре eax записано некоторое число, и требуется умножить его на 41. Это можно сделать в 2 cтрочки:

lea ebx, [eax + 4*eax] // теперь ebx = 5*eax

lea eax, [eax + 8*ebx] // теперь eax = eax + 8*ebx = 41*eax

Игорь К. заинтересовался, а каким минимальным числом операций lea можно умножить число на некоторое заданное число n и как это сделать. Ваша задача — помочь ему.

Считайте, что в начальный момент регистр eax содержит число, которое Игорь К. собрался умножать на n, а регистры от ebx до ezx содержат число 0. В конечный момент времени ответ может находиться в любом регистре.

Входные данные

В входных данных записано единственное целое число n (1 ≤ n ≤ 255), умножение на которое предстоит реализовать Игорю К.

Выходные данные

В первой строке выведите число p — минимальное число операций lea, необходимое для этого. Затем выведите программу из p команд, выполняющую эти операции. Гарантируется, что такая программа существует для любого n от 1 до 255.

Используйте в точности следующий формат команд (здесь k равно 1, 2, 4 или 8, а x, y и z — это любые, возможно совпадающие, регистры):

lea x, [y]

lea x, [y + z]

lea x, [k*y]

lea x, [y + k*z]

Обратите внимание на то, что в конце каждой команды недопустимы лишние пробелы.

B. Игра со строкой

реализация Строки Теория вероятностей *1600

Вася и Коля играют в игру со строкой по следующим правилам. Сначала Коля загадывает строку s, состоящую из строчных латинских букв, и равновероятно выбирает из отрезка [0, len(s) - 1] целое число k. Он сообщает строку s Васе, а затем циклически сдвигает её на k символов влево, то есть получает новую строку t = sk + 1sk + 2... sns1s2... sk. Вася не знает ни числа k, ни итоговой строки t, но хочет угадать число k. Для этого он может попросить Колю открыть первую букву получившейся строки, а затем, увидев её, еще одну букву на некоторой позиции, которую Вася может выбрать.

Вася уже понял, что не может гарантировать себе победу, однако, он хочет узнать вероятность своего выигрыша при оптимальной игре. Вам необходимо помочь ему в этом.

Заметим, что целью Васи является однозначное определение числа k, значит, если после открытия второй буквы остается не менее двух циклических сдвигов исходной строки s, удовлетворяющих известной информации, Вася считается проигравшим. Конечно же, в каждый момент игры Вася пытается максимизировать вероятность своего выигрыша, насколько это возможно.

Входные данные

Единственна строка содержит строку s длины l (3 ≤ l ≤ 5000), состоящую из строчных латинских букв.

Выходные данные

Выведите одно вещественное число — ответ на задачу. Ответ будет считаться верным, если его абсолютная или относительная ошибка не будет превосходить 10 - 6.

Формально, пусть ваш ответ равен a, а ответ жюри — b. Ваш ответ считается правильным, если .

Примечание

В первом примере после открытия первой буквы Вася может попросить открыть вторую букву, и после этого циклический сдвиг определяется однозначно.

Во втором примере если первой буквой в циклическом сдвиге t будет «t» или «c», то у Васи не получится угадать сдвиг, открыв лишь одну другую букву. В то же время, если первой буквой будет «i» или «a», то, открыв четвертую букву, можно однозначно определить циклический сдвиг.

D. Игра с фишками

игры реализация Структуры данных *2500

Рассмотрим следующую игру для двух игроков. Есть одна белая фишка и ненулевое количество черных фишек. Каждая фишка расположена на координатной плоскости в точке с целыми координатами x и y.

Игроки по очереди, начиная с белых, передвигают все фишки своего цвета на 1 вверх, вниз, влево или вправо. Черные могут выбирать направление для каждой фишки независимо.

После хода белых белая фишка не может находиться в одной точке с черной фишкой. Других ограничений на расположение фишек нет: нескольким черным фишкам разрешено располагаться в одной точке, после хода черных и изначально белая фишка может находится в одной точке с черной. Если в какой-то момент у белых нет хода, то выиграли черные. Если белые сделали хотя бы 10100500 ходов, то они выиграли.

Вам нужно решить следующую задачу. Даны начальные положения всех черных фишек. Гарантируется, что в начале игры все эти положения различны. В скольких местах может находиться белая фишка, чтобы при оптимальной игре выигрывали черные?

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 105) — количество черных фишек.

В (i + 1)-й строке находятся два целых числа xi, yi ( - 105 ≤ xi, yi,  ≤ 105) — координаты точки, в которой стоит i-я черная фишка изначально.

Гарантируется, что все начальные позиции черных фишек различны.

Выходные данные

Выведите количество точек, в которых может стоять белая фишка в начале игры, чтобы при оптимальной игре обоих игроков выигрывали черные.

Примечание

В первом и втором тесте черными кругами обозначены положения черных фишек, белыми кругами — возможные положения белых фишек, при которых выигрывают черные.

Первый тест:

Второй тест:

В третьем тесте белые фишки должны располагаться во внутреннем квадрате 2 × 2, чтобы выиграли черные.

A. Встреча друзей

жадные алгоритмы математика Перебор реализация *800

Два друга находятся на координатной прямой Ox в целочисленных точках. Один из них находится в точке x1 = a, а другой — в точке x2 = b.

Каждый из друзей может перемещаться на единицу влево и на единицу вправо неограниченное количество раз. При перемещении усталость мальчика увеличивается по следующим правилам: после первого перемещения усталость увеличивается на 1, после второго перемещения — на 2, после третьего — на 3 и так далее. Например, если мальчик сначала пойдёт влево на единицу, затем вправо на единицу (то есть вернётся в исходную точку) и после этого влево на единицу, его усталость будет равна 1 + 2 + 3 = 6.

Друзья хотят встретиться в одной точке. Определите минимальную суммарную усталость друзей при условии, что они должны оказаться в одной точке.

Входные данные

В первой строке следует целое число a (1 ≤ a ≤ 1000) — начальная позиция первого из друзей.

Во второй строке следует целое число b (1 ≤ b ≤ 1000) — начальная позиция второго из друзей.

Гарантируется, что a ≠ b.

Выходные данные

Выведите минимальную суммарную усталость обоих друзей при условии, что они должны оказаться в одной точке.

Примечание

В первом примере либо первый друг должен переместиться на единицу вправо (тогда встреча произойдёт в точке 4), либо второй друг должен переместиться на единицу влево (тогда встреча друзей произойдет в точке 3). В обоих случаях суммарная усталость равна 1.

Во втором примере первый друг должен переместиться на единицу влево, а второй друг — на единицу вправо. Тогда они встретятся в точке 100, при этом суммарная усталость будет равна 1 + 1 = 2.

В третьем примере один из оптимальных способов перемещения следующий. Первый друг должен три раза переместиться на единицу вправо, а второй друг — два раза на единицу влево. Таким образом, друзья встретятся в точке 8, и суммарная усталость будет равна 1 + 2 + 3 + 1 + 2 = 9.

B. Чемпионат мира

Конструктив реализация *1200

Заключительная часть чемпионата мира по футболу проводится по олимпийской системе, также называемой плей-офф.

Всего в этой части турнира принимает участие n команд, пронумерованных от 1 до n. Проводится несколько раундов, в каждом раунде оставшиеся команды располагаются в порядке увеличения номеров, затем первая играет со второй, третья — с четвёртой, пятая — с шестой и так далее. Гарантируется, что в каждом раунде участвует четное число команд. Команда-победитель в каждой игре проходит в следующий раунд, проигравшая команда выбывает из турнира, ничьих не бывает. В последнем раунде принимают участие две команды, этот раунд называется финалом, а команда-победитель объявляется чемпионом мира, на этом турнир заканчивается.

Аркадий хочет, чтобы в финале сыграли две определенные команды. К сожалению, номера команд уже определены, и может получиться так, что эти команды не могут выйти в финал одновременно, так как в лучшем случае встретятся на каком-то раунде до финала. Определите, в каком раунде возможна встреча команд с номерами a и b.

Входные данные

Единственная строка содержит три целых числа n, a и b (2 ≤ n ≤ 256, 1 ≤ a, b ≤ n) — общее число команд и номера команд, которыми интересуется Аркадий.

Гарантируется, что n таково, что в каждый раунд проходит четное число команд, а a и b — различные числа.

Выходные данные

Выведите в единственной строке «Final!» (без кавычек), если команды a и b могут встретиться в финале.

Иначе выведите одно целое число — номер раунда, в котором могут встретиться команды a и b. Раунды нумеруются с 1.

Примечание

В первом примере команды с номерами 1 и 2 встретятся между собой в первом же раунде.

Во втором примере команды 2 и 6 могут встретиться между собой только в третьем раунде (который будет финальным), в том случае, если они победят своих оппонентов в первом и втором раундах.

В третьем примере команды с номерами 7 и 5 могут встретиться во втором раунде, если обыграют своих оппонентов в первом раунде.

C. Лабораторная работа

математика реализация *1700

Аня и Кирилл делают лабораторную работу по физике. В одном из заданий необходимо n раз измерить некоторую величину, чтобы уменьшить ошибку, и вычислить среднее значение.

Кирилл выполнил необходимые измерения, получив целочисленные значения x1, x2, ..., xn. Важно отметить, что разброс измеренных значений не очень большой, а именно, максимальное измеренное значение не более чем на 2 превосходит минимально измеренное значение.

Ане лень делать измерения, но просто так списать все измерения у Кирилла она не может, ведь величина ошибки — случайная величина, и если все измерения совпадут, преподаватель заподозрит неладное. Аня хочет написать в своей работе такие целочисленные величины измерений y1, y2, ..., yn, что выполняются следующие условия:

  • среднее значение среди величин x1, x2, ..., xn точно равно среднему значению y1, y2, ..., yn;
  • все измерения в работе Ани лежат в тех же пределах, что и измерения Кирилла, то есть максимальное значение среди измерений Ани не превосходит максимальное значение среди измерений Кирилла, а минимальное значение среди измерений в работе Ани не меньше, чем минимальное значение среди измерений Кирилла;
  • количество совпадающих измерений у Ани и Кирилла — минимально возможное при выполнении предыдущих условий. Формально, учитель смотрит на все измерения Ани по очереди, если такое же измерение есть у Кирилла и оно еще не зачеркнуто, он вычеркивает одно это измерение у Ани и одно из таких измерений у Кирилла. Количеством совпадающих измерений называется количество зачеркнутых измерений у Ани.

Помогите Ане написать такой набор измерений, чтобы выполнялись условия, перечисленные выше.

Входные данные

В первой строке следует целое число n (1 ≤ n ≤ 100 000) — количество измерений, которые сделал Кирилл.

Во второй строке следует последовательность x1, x2, ..., xn ( - 100 000 ≤ xi ≤ 100 000) — результаты измерений Кирилла. Гарантируется, что разность между максимальным и минимальным значением среди чисел x1, x2, ..., xn не превосходит 2.

Выходные данные

В первую строку выведите минимальное количество совпадающих измерений.

Во вторую строку выведите n целых чисел y1, y2, ..., yn — результаты измерений Ани. Числа могут быть выведены в любом порядке. Помните, что минимальное из измерений Ани должно быть не меньше, чем минимум из измерений Кирилла, а максимальное из измерений Ани должно быть не больше, чем максимум из измерений Кирилла.

Если существует несколько решений, выведите любое.

Примечание

В первом примере Аня может записать нули в качестве каждого из результатов измерений. Тогда средняя величина её измерений будет равна средней величине измерений Кирилла, а совпадающих измерений будет всего два.

Во втором примере Аня должна записать два результата измерений, равные 100, и одно 101 (сами измерения она может записать в любом порядке), потому что только в этом случае средняя величина её измерений будет равна средней величине измерений Кирилла. Таким образом, все три измерения будут совпадать.

В третьем примере количество совпадающих измерений равно 5.

B. Большая ставка

Конструктив реализация *1200

Кроме Ниана существует также демон, чье имя Суи, его настолько боятся дети, что даже болеют от этого. Родители кладут под подушки детей деньги в красных конвертах, и когда Суи приближается, феи отталкивают его.

Большой Банбан не уверен, сколько денег отдать детям. Он считает, что петли в числах приносят удачу, так как символизируют единство и гармонию.

Он хочет найти положительное целое число n, не превосходящее 1018 такое, что в десятичной записи числа n ровно k петель, или определить, что такого n не существует.

Петлей называется плоский участок бумаги, окруженный линиями в десятичной записи числа, записанного арабскими цифрами. Например, в цифре 4 ровно одна петля, в цифре 8 ровно две петли, а в цифре 5 — ни одной. Вы можете использовать рисунок ниже для определения точного вида цифр.

Входные данные

Единственная строка содержит одно целое число k (1 ≤ k ≤ 106) — необходимое число петель.

Выходные данные

Выведите одно целое число: если подходящего n не существует, выведите -1, иначе выведите любое подходящее n. В последнем случае вам нужно вывести положительное целое число в десятичной записи, не превосходящее 1018.

A. Фафа и его компания

Перебор реализация *800

Фафа руководит компанией, которая работает над большими проектами. Всего в компании Фафы n работников. Когда появляется новый проект, Фафа должен распределить задачи по проекту между всеми работниками.

Фафа недавно понял, что каждый раз делать это очень сложно. Поэтому он решил выбрать лучших l сотрудников из компании в руководители. Когда появляется новый проект, Фафа будет распределять задачи только между руководителями, а каждый руководитель будет отвечать за некоторое положительное число сотрудников и будет распределять задачи между ними. Чтобы все было честно, каждый руководитель должен получить одинаковое число сотрудников под свое руководство. Кроме того, каждый сотрудник, не являющийся руководителем, должен быть подчинен ровно одному руководителю, и никакой руководитель не должен быть подчинен никакому руководителю.

По данному числу сотрудников n найдите, сколькими способами Фафа может выбрать число руководителей l, чтобы можно было поровну разделить оставшихся сотрудников между ними.

Входные данные

В единственной строке содержится одно целое число n (2 ≤ n ≤ 105) — количество сотрудников в компании Фафы.

Выходные данные

Выведите одно целое число — ответ на задачу.

Примечание

Во втором примере у Фафы есть три способа:

  • выбрать только 1 руководителя и определить остальных 9 сотрудников под его руководство.
  • выбрать 2-х руководителей, каждый будет руководить 4 сотрудниками.
  • выбрать 5 руководителей, каждый будет руководить 1 сотрудником.

B. Фафа и ворота

реализация *900

Два соседних королевства решили построить на границе стену, но сделать в ней несколько ворот, чтобы жители могли проходить из одного королевства в другое. Как водится, каждый раз, когда житель проходит через ворота, он должен заплатить одну серебряную монету.

Мир может быть представлен как первый квадрант на плоскости, тогда стена построена на прямой x = y. Все точки ниже стены принадлежат одному королевству, все точки выше стены принадлежат другому королевству. В каждой точке стены с целочисленными координатами (т. е. в точках (0, 0), (1, 1), (2, 2), ...) есть ворота. Стена и ворота не принадлежат ни одному королевству.

Фафа находится у ворот в точке (0, 0) и планирует пройтись определенным маршрутом по плоскости. Он знает последовательность своих шагов S. Каждый символ в последовательности описывает одно перемещение. Каждое перемещение — это либо буква 'U' (перемещение вверх, из точки (x, y) в точку (x, y + 1)), либо 'R' (перемещение вправо, из точки (x, y) в точку (x + 1, y)).

Фафа хочет узнать, сколько серебряных монет он должен заплатить, чтобы пройтись по маршруту S. Обратите внимание, если Фафа посещает ворота, но не переходит в другое королевство, он не должен платить. Также, считайте, что он не платит у ворот в точке (0, 0), т. е. он изначально на нужной ему стороне.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 105) — количество перемещений в последовательности.

Во второй строке находится строка S длины n, состоящая из символов 'U' и 'R', описывающая перемещения. Фафа будет следовать этой последовательности S в порядке слева направо.

Выходные данные

В единственной строке выведите одно целое число — количество монет, которое должен заплатить Фафа, чтобы пройти по последовательности S.

Примечание

Рисунок ниже показывает третий пример. Красным показан путь Фафы, зеленые точки отмечают ворота, в которых Фафа должен заплатить монету.

A. Олимпиада

реализация сортировки *800

В недавно прошедшей Всеберляндской олимпиаде по информатике поучаствовали n человек. Каждый участник набрал некоторое количество баллов.

Вам, как председателю жюри, необходимо определить множество участников, которые получат дипломы. По правилам олимпиады множество участников, получающих дипломы, должно удовлетворять некоторым требованиям:

  • Хотя бы один участник получит диплом.
  • Участник, набравший 0 баллов, не получит диплом.
  • Если участник получает диплом, то все участники, получившие не меньше баллов, чем он, также получат дипломы.

Определите, сколько есть способов выбрать множество участников, которые получат дипломы.

Входные данные

В первой строке содержится целое число n (1 ≤ n ≤ 100) — количество участников олимпиады.

Во второй строке содержится последовательность из n целых чисел a1, a2, ..., an (0 ≤ ai ≤ 600) — баллы участников.

Гарантируется, что хотя бы один участник получил ненулевой балл.

Выходные данные

Выведите одно целое число — искомое количество способов.

Примечание

В первом тестовом примере есть три способа выбрать участников, которые получат дипломы:

  1. Только участники, набравшие 3 балла, получат дипломы.
  2. Участники, набравшие 2 или 3 балла, получат дипломы.
  3. Все участники получат дипломы.

Во втором тестовом примере единственный корректный способ выдачи дипломов — дать дипломы всем участникам.

Обратите внимание, что участники с нулевыми баллами не могут получить диплом, что иллюстрируется третьим примером.

A. Исправление слов

реализация *800

Виктор решил написать свой текстовый редактор с автоматическим исправлением ошибок.

Виктор считает, что если в слове есть две гласные, стоящие на соседних позициях, то это довольно странно, и подлежит замене. Замена происходит следующим образом: пока в слове есть две гласные на соседних позициях, он удаляет первую такую гласную, что сразу перед ней стоит гласная. Если в строке нет двух гласных на соседних позициях, то строка хорошая.

Задано слово s. Можете ли вы предсказать, каким оно станет после исправления?

В данной задаче гласными буквами считаются a, e, i, o, u и y.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100) — количество букв в слове s до исправления.

Вторая строка представляет строку s, содержащая ровно n строчных латинских букв — слово до исправления.

Выходные данные

Выведите слово s после исправления.

Примечание

Объяснение примеров:

  1. Происходит только одна замена: weird werd;
  2. Замен не требуется, так как нет двух гласных на соседних позициях;
  3. aaeaa aeaa aaa aa a.

B. Хомячковая ферма

реализация *1000

У мальчика Димы есть своя хомячковая ферма. Скоро на ней вырастут N хомячков, и Диме надо будет отвезти их на рынок продавать.

Хомячков надо перевозить в коробках. Если какая-то коробка будет заполнена не полностью, то хомячки в этой коробке загрустят, поэтому каждую коробку надо заполнять полностью.

Дима может покупать коробки на заводе. Завод производит K типов коробок, коробки i-го типа вмещают ai хомячков каждая. Дима может заказать на заводе сколько угодно коробок, но, чтобы получить оптовую скидку, он должен заказывать коробки только какого-то одного типа.

Естественно, Дима хочет заказать коробки так, чтобы можно было каждую коробку полностью заполнить хомячками и отвезти на рынок; если при этом какие-то хомячки не влезут, то Дима оставит этих хомячков на ферме.

Определите, сколько коробок и какого типа должен заказать Дима, чтобы увезти на рынок как можно больше хомячков.

Входные данные

Первая строка входных данных содержит два целых числа N и K (0 ≤ N ≤ 1018, 1 ≤ K ≤ 105) — количество хомячков, которые вырастут у Димы на ферме, и количество типов коробок, которые производит завод.

Во второй строке находятся K целых чисел a1, a2, ..., aK (1 ≤ ai ≤ 1018 для всех i) — вместимости каждого типа коробок.

Выходные данные

Выведите два числа — номер типа коробок, которые должен заказать Дима, и их количество. Типы коробок нумеруются от 1 до K в том порядке, как они описаны во входных данных.

Если верных ответов несколько, вы можете вывести любой из них.

A. Восстановление пароля

реализация Строки *900

Игорь К. всегда доверял своему любимому Антивирусу Кашпировского. Поэтому, когда ему пришло сообщение в QIP Infinium от одного из одногруппников, содержащее ссылку на "прикольную флэшку о свином гриппе", он, не особо задумываясь, скачал ее. Антивирус не ругался, поэтому "флэшка" была запущена. Тут же QIP Infinium выдал сообщение: "Неправильный логин/пароль".

Зайдя со своего запасного ISQ-аккаунта, Игорь К. посмотрел данные основного. Имя и фамилия заменились на соответственно "H1N1" и "Infected", а в разделе "Дополнительно" был странный двоичный код длиной 80 символов, состоящий из нулей и единичек. "Взломали", — подумал Игорь К. и, запустив браузер Internet Exploiter, быстро напечатал адрес своего любимого поисковика.

Вскоре он выяснил, что это действительно был вирус, меняющий пароли у пользователей ISQ. К счастью, он обнаружил, что тот двоичный код на самом деле был зашифрованным паролем, где каждая группа из 10 символов обозначала одну из десятичных цифр. Соответственно, настоящий пароль состоял из 8 десятичных цифр.

Помогите Игорю К. восстановить его ISQ-аккаунт.

Входные данные

Во входных данных содержатся 11 строк. Первая строка представляет собой двоичный код длиной 80 символов, записанный в информации ISQ-аккаунта Игоря К. В следующих 10 строках содержатся попарно различные двоичные коды длиной 10 символов, соответствующие цифрам 0, 1, ..., 9.

Выходные данные

Выведите одну строку из 8 символов — пароль от ISQ-аккаунта Игоря К. Гарантируется, что решение существует.

B. Друзья

графы математика реализация *1300

Однажды Игорь К. бросил программирование и стал заниматься математикой. Как-то раз поздним осенним вечером он сидел за своим столом, читал книгу и о чем-то думал.

Его внимание привлекло следующее утверждение: "Среди любых шести человек найдутся либо трое попарно знакомых, либо трое попарно незнакомых".

Игорь К. никак не мог понять, почему же необходимый минимум — 6 человек. "Ну ведь для пятерых то же самое!" — вертелось в его голове. — "Возьмем, например, Макса, Илью, Вову — ну вот же, они все друг друга знают! А теперь к Вове добавим Диму и Олега — и ни один из них не знаком друг с другом! Бред, да и только эта ваша математика!"

Игорь К. взял пятерых своих знакомых и записал, кто из них с кем дружит. Теперь он хочет проверить, верно ли для этих пятерых человек, что среди них есть или трое попарно знакомых, или трое попарно незнакомых.

Входные данные

В первой строке записано целое число m (0 ≤ m ≤ 10) — количество отношений знакомств между пятью друзьями Игоря К.

В каждой из следующих m строк записано два различных целых числа ai и bi (1 ≤ ai, bi ≤ 5) — номера пары людей, которые знакомы друг с другом. Гарантируется, что каждая пара знакомых людей записана ровно один раз. Отношение знакомства симметрично, то есть если x знаком с y, то и y знаком с x.

Выходные данные

Выведите "FAIL", если среди этих пяти человек нет ни троих попарно знакомых, ни троих попарно незнакомых. Иначе выведите "WIN".

C. Телефонные номера

Конструктив реализация Строки *1500

И где здесь телефонные номера?

Дана строка s из строчных букв английского алфавита и число k. Найдите лексикографически минимальную строку t, имеющую длину k, множество букв которой является подмножеством множества букв s и s лексикографически меньше t.

Гарантируется, что ответ существует.

Обратите внимание, что под множеством букв строки подразумевается множество, а не мультимножество. В частности, множество букв строки abadaba это {a, b, d}.

Строка p считается лексикографически меньше строки q, если p — префикс q, не равный q или существует i такое, что pi < qi и для всех j < i выполнено pj = qj. Например, abc лексикографически меньше abcd , abd лексикографически меньше abec, afa лексикографически не меньше ab и a лексикографически не меньше a.

Входные данные

В первой строке через пробел заданы два целых числа n и k (1 ≤ n, k ≤ 100 000) — длина строки s и необходимая длина строки t.

Во второй строке задана строка s, состоящая из n строчных букв английского алфавита.

Выходные данные

Выведите строку t, удовлетворяющую условиям, описанным выше.

Гарантируется, что ответ существует.

Примечание

В первом примере список строк t длины 3, подходящих под условие, что множество букв t — подмножество множества букв s, таков: aaa, aab, aac, aba, abb, abc, aca, acb, .... Из них лексикографически больше abc: aca, acb, .... Лексикографически минимальная из них — aca.

D. Алена и обогреватель

Бинарный поиск реализация *1600

"Мы пробовали одиночное заключение, утопление и прослушивание группы Just In Beaver, но безрезультатно. Нам нужно что-то экстремальное."

"Маленькой Алене подарили массив на день рождения..."

Пусть есть массив a длиной n и два числа l и r (l ≤ r). Тогда массив b имеет размер n и получается следующим образом:

b1 = b2 = b3 = b4 = 0.

Для всех 5 ≤ i ≤ n:

  • bi = 0 если ai, ai - 1, ai - 2, ai - 3, ai - 4 > r и bi - 1 = bi - 2 = bi - 3 = bi - 4 = 1
  • bi = 1 если ai, ai - 1, ai - 2, ai - 3, ai - 4 < l и bi - 1 = bi - 2 = bi - 3 = bi - 4 = 0
  • bi = bi - 1 иначе

Даны массивы a и b' одинакового размера. Найдите числа l и r (l ≤ r) такие, что применив описанный выше алгоритм, мы получим массив b, равный массиву b'.

Гарантируется, что ответ существует.

Входные данные

В первой строке задано целое число n (5 ≤ n ≤ 105) — размер массивов a и b'.

Во второй строке входных данных задаются n целых чисел a1, ..., an ( - 109 ≤ ai ≤ 109) — элементы массива a.

В третьей строке входных данных задается строка из n символов, состоящая из 0 и 1 — элементы массива b'. Обратите внимание, что они не разделены пробелами.

Выходные данные

В единственной строке выведите два целых числа l и r ( - 109 ≤ l ≤ r ≤ 109), удовлетворяющие условиям, описанным выше.

Если подходящих пар значений несколько, выведите любую из них.

Гарантируется, что ответ существует.

Примечание

В первом тестовом примере подходит любая пара l и r, где 6 ≤ l ≤ r ≤ 109, в таком случае b5 = 1, так как a1, ..., a5 < l.

E. Наибольшее красивое число

жадные алгоритмы реализация *2200

Ага, это очередная задача с определением «красивых» чисел.

Назовем положительное целое число x красивым, если его десятичное представление без лидирующих нулей содержит четное количество цифр, и существует перестановка этого представления, которая является палиндромом. Например, число 4242 красивое, так как оно содержит 4 цифры, и существует перестановка 2442, которая является палиндромом.

Для заданного положительного целого числа s, найдите наибольшее красивое число, которое строго меньше s.

Входные данные

В первой строке записано одно целое число t (1 ≤ t ≤ 105) — количество наборов входных данных, которые вам предстоит решить.

Затем следуют t строк, каждая содержит десятичное представление очередного числа s. Гарантируется, что это — строка четной длины, не содержащая лидирующих нулей, а также существует хотя бы одно красивое число строго меньше s.

Сумма длин s по всем наборам входных данных не превосходит 2·105.

Выходные данные

Для каждого набора входных данных выведите в отдельной строке наибольшее красивое число, которое строго меньше s (гарантируется, что ответ существует).

A. Защитить овец

графы Перебор поиск в глубину и подобное реализация *900

Боб — пастух. Он пасет своих овец на большом пастбище. Недавно волки утащили нескольких из его овец. Поэтому он решил обзавестись несколькими собаками-пастухами, которые будут защищать всех его овец.

Пастбище можно представить как прямоугольник из R × C клеток. Каждая клетка либо пустая, либо содержит овцу, волка или собаку. Овцы и собаки не могут двигаться, однако волки могут перемещаться по пастбищу свободно, каждый раз перемещаясь влево, вправо, вверх или вниз в соседнюю клетку. Если волк доберется до клетки с овцой, он съест ее. Однако волк не может зайти в клетку, где находится собака.

Изначально собак нет. Расположите собак на пастбище так, чтобы никакой волк не мог бы добраться до никакой овцы, или определите, что это невозможно. Обратите внимание на то, что у вас достаточно собак, поэтому вам не нужно минимизировать их количество.

Входные данные

Первая строка содержит два целых числа R (1 ≤ R ≤ 500) и C (1 ≤ C ≤ 500) — число строк и число столбцов на пастбище, соответственно.

Каждая из следующих R строк содержит строку, состоящую из ровно C символов и описывающую одну строку пастбища. Здесь «S» означает клетку с овцой, «W» означает клетку с волком, а «.» означает пустую клетку.

Выходные данные

Если невозможно защитить всех овец, выведите одну строчку со словом «No».

Иначе выведите одну строку со словом «Yes». Затем выведите R строк, описывающих пастбище после того, как вы расставили собак. Как и во входных файлах, «S» означает клетку с овцой, «W» означает клетку с волком, «D» — собаку, а «.» — пустую клетку. Вы не можете перемещать, добавлять или удалять волков или овец.

Если существует несколько решений, выведите любое из них. Вам не обязательно минимизировать число собак.

Примечание

В первом примере можно разбить пастбище собаками на две половины, в одной из которых находятся овцы, а в другой — волки. Обратите внимание на то, что овца в клетке (2,1) находится в безопасности, так как волки не могут двигаться по диагонали.

Во втором примере нет мест, куда можно было бы добавить собаку для защиты единственной овцы.

В третьем примере нет волков, поэтому задача очень проста. Мы посадили одну собаку в центр, чтобы она олицетворяла собой безопасность, однако решение без нее тоже верно.

A. Хоккей

реализация Строки *1600

Петя очень любит хоккей. Однажды, глядя хоккейный матч, он заснул. Ему приснился сон, в котором ему поручили переделать название хоккейной команды. Так, Пете дали исходное название команды w и набор запрещенных подстрок s1, s2, ..., sn. Все эти строки состоят из больших и маленьких букв латинского алфавита. Строка w имеет длину |w|, ее символы пронумерованы от 1 до |w|.

Сначала Петя должен найти в строке w все вхождения запрещенных подстрок, причем регистр букв при поиске вхождений не учитывается. То есть строки «aBC» и «ABc» считаются эквивалентными.

После этого Петя должен произвести замену всех букв, покрывающихся вхождениями. Более формально: букву в позиции i необходимо заменить на любую другую, если для позиции i в строке w найдется такая пара индексов l, r (1 ≤ l ≤ i ≤ r ≤ |w|), что подстрока w[l ... r] является элементом набора s1, s2, ..., sn, не учитывая регистр букв при сравнении строк. При замене регистр буквы должен сохраниться. Пете не разрешается заменять буквы, которые не покрывает ни одна запрещенная подстрока.

Буква letter (как большая, так и маленькая) у хоккеистов считается счастливой. Поэтому Петя должен так произвести замены, чтобы эта буква встречалась в итоговой строке как можно больше раз. Помогите ему — найдите лексикографически минимальную новую строку с максимальным возможным количеством счастливых букв.

Обратите внимание, что процесс замен не повторяется, а происходит лишь один раз. То есть если после Петиных замен в строке появились новые вхождения плохих подстрок, Петя не обращает на них внимание.

Входные данные

В первой строке задано одно целое число n (1 ≤ n ≤ 100) — количество запрещенных подстрок в наборе. В следующих n строках заданы сами элементы набора. В следующей строке задана строка w. Все эти n + 1 строк — непустые строки из больших и маленьких латинских букв длиной не более 100. В последней строке задана одна буква letter в нижнем регистре.

Выходные данные

В единственной строке выведите лексикографически минимальную строку с максимальным количеством букв letter, которую получит Петя.

Лексикографическое сравнение реализует оператор < в современных языках программирования. Строка a лексикографически меньше строки b, если a является префиксом b, или существует такое i (1 ≤ i ≤ |a|), что ai < bi, а для любого j (1 ≤ j < i) aj = bj. |a| обозначает длину строки a.

A. Левши, правши и амбидекстры

математика реализация *800

На тренировки по водному боулингу ходят l игроков, которые играют левой рукой, r игроков, которые играют правой рукой и a амбидекстров, которые умеют играть и левой и правой рукой.

Тренер решил составить команду, состоящую из четного числа игроков, при этом ровно половина игроков из команды должны играть левой рукой, а ровно половина — правой. Каждый игрок будет играть лишь одной рукой.

Амбидекстр — это человек, который одинаково хорошо владеет и левой и правой рукой. В команде амбидекстр может играть как левой так и правой рукой.

Найдите наибольший возможный размер команды, в которой одинаковое количество игроков играют левой и правой рукой.

Входные данные

В первой строке следует три целых числа l, r и a (0 ≤ l, r, a ≤ 100) — количество левшей, правшей и амбидекстров, которые ходят на тренировки.

Выходные данные

Выведите единственное четное число — максимальное количество игроков, из которых можно составить команду. Допустимо, что команда может состоять из нуля игроков.

Примечание

В первом примере можно составить команду из 6 человек. Для этого нужно взять единственного игрока, который играет только левой рукой, двух амбидекстров, которые должны будут играть левой рукой, а также трёх игроков, которые играют только правой рукой. Таким образом, останется всего один игрок, который играет только правой рукой, которого взять в команду не получится.

Во втором примере можно составить команду из 14 человек. Для этого нужно взять всех пятерых игроков, которые играют только левой рукой, всех пятерых игроков, которые играют только правой рукой, ещё двух амбидекстров, которые должны будут играть левой рукой, а также двух амбидекстров, которые будут играть правой рукой.

B. Перехваченное сообщение

жадные алгоритмы реализация *1100

Хакер Жорик пытается расшифровать два перехваченных им накануне секретных сообщения. Каждое секретное сообщения представляет из себя набор зашифрованных блоков, состоящих из некоторого количества байт информации.

Жорик знает, что каждое из этих сообщений является архивом, состоящим из одного или нескольких файлов. Также Жорик знает принцип, который использовался для передачи каждого из этих архивов по сети: если архив состоит из k файлов размерами l1, l2, ..., lk байт, то при передаче i-й файл разбивается на один или несколько блоков bi, 1, bi, 2, ..., bi, mi (при этом суммарная длина блоков bi, 1 + bi, 2 + ... + bi, mi совпадает с длиной исходного файла li), после чего по сети передаются все блоки каждого из файлов в порядке следования файлов в архиве.

Жорик подозревает, что два перехваченных сообщения на самом деле кодируют один и тот же архив, потому что размеры сообщений равны, однако, файлы могут быть разбиты на блоки разными способами.

Вам даны длины блоков каждого из сообщений, перехваченных Жориком в оригинальном порядке следования. Помогите Жорику определить, какое максимальное количество файлов может быть в перехваченном архиве, если предположение Жорика верно.

Входные данные

В первой строке находятся два целых числа n, m (1 ≤ n, m ≤ 105) — количество блоков в первом и втором сообщениях соответственно.

Во второй строке находятся n целых чисел x1, x2, ..., xn (1 ≤ xi ≤ 106) — длины блоков, составляющих первое сообщение.

В третьей строке находятся m целых чисел y1, y2, ..., ym (1 ≤ yi ≤ 106) — длины блоков, составляющих второе сообщение.

Гарантируется, что x1 + ... + xn = y1 + ... + ym. Кроме того, гарантируется, что x1 + ... + xn ≤ 106.

Выходные данные

Выведите максимальное количество файлов, из которого может состоять перехваченный архив.

Примечание

В первом тесте из условия максимальное возможное число файлов в архиве — 3. Например, возможно, что в архиве находилось три файла размеров 2 + 5 = 7, 15 = 3 + 1 + 11 = 8 + 2 + 4 + 1 и 4 + 4 = 8.

Во втором тесте из условия возможно, что архив состоит из двух файлов размеров 1 и 110 = 10 + 100 = 100 + 10. Обратите внимание, что при передаче по сети файлы внутри архивов не переставляются, поэтому нельзя считать, что бы передан архив из трёх файлов размерами 1, 10 и 100.

В третьем тесте из условия оказывается, что сообщение состоит из единственного файла размером 4.

C. Равиоли-сортировка

реализация *1600

Все знают спагетти-сортировку. Вы решили реализовать аналоговый алгоритм сортировки, но обнаружили, что у вас закончились спагетти! Единственные макаронные изделия, которые у вас есть - равиоли, но это вас не остановит...

Вы придумали следующий алгоритм. Для каждого числа в массиве ai постройте стопку из ai равиоли. На картинке показана стопка для ai = 4.

Расположите стопки в ряд в том же порядке, в котором числа находились в заданном массиве. Найдите самую высокую стопку (если стопок максимальной высоты несколько, выберите самую левую). Удалите ее из ряда и добавьте ее высоту в конец массива-результата. Сдвиньте стопки так, чтобы между ними не было промежутка на месте удаленной стопки. Повторяйте процесс, пока в ряду остается хотя бы одна стопка.

Вы в восторге от придуманного алгоритма, но, попробовав его на нескольких наборах входных данных, понимаете, что он не всегда сортирует входной массив правильно. Если на любом этапе рядом оказываются две стопки равиоли, чья высота отличается на два или больше, верхний равиоль из более высокой стопки соскальзывает на более низкую стопку.

Вам дан входной массив. Определите, правильно ли отсортирует его описанный алгоритм.

Входные данные

Первая строка входных данных содержит число n (1 ≤ n ≤ 10) — размер массива.

Вторая строка входных данных содержит n целых чисел, разделенных пробелами, ai (1 ≤ ai ≤ 100) — элементы массива.

Выходные данные

Выведите "YES", если описанный алгоритм отсортирует его правильно, и "NO" в противном случае.

Примечание

Во втором примере массив изменится еще до того, как будет выбрана самая высокая стопка: равиоль из стопки высоты 3 сползет на стопку высоты 1, и результатом работы алгоритма будет массив {2, 2, 2}.

A. Ходьба по диагонали

реализация *800

Михаил ходит по 2D плоскости. Он может двигаться вправо или вверх. Вам задана последовательность ходов Михаила. Он думает, что эта последовательность слишком длинная, и хочет сделать её настолько короткой, насколько можно.

В заданной последовательности ход вверх обозначается символом U, а ход вправо — символом R. Михаил может заменять пары подряд идущих ходов RU и UR на ходы по диагонали. Это означает, что он может заменять два хода (вверх и вправо) на один (по диагонали). После этого он может сделать ещё замену, пока из последовательности не пропадут подстроки RU и UR.

Ваша задача вывести минимально возможную длину короткой последовательности ходов после всех замен.

Входные данные

Первая строка входных данных содержит одно целое число n (1 ≤ n ≤ 100) — длину последовательности. Вторая строка содержит саму последовательность, состоящую из n символов U и R.

Выходные данные

Выведите минимально возможную длину короткой последовательности ходов после всех замен.

Примечание

В первом тесте короткая последовательность ходов может быть DUD (её длина равна 3).

Во втором тесте короткая последовательность ходов может быть UUDRRRDUDDUUU (её длина равна 13).

B. Набор строки

реализация Строки *1400

Задана строка s, состоящая из n строчных латинских букв. Вам необходимо набрать эту строку на вашей клавиатуре.

Изначально у вас есть пустая строка. Пока вы не набрали необходимую строку, вы можете применять следующую операцию:

  • дописать символ в конец строки.

Кроме того, не более одного раза вы можете применить дополнительную операцию: cкопировать строку и приписать её к самой себе.

Например, если вы хотите набрать строку abcabca, вы можете набрать её за 7 операций, если будете выписывать символы один за другим. Или вы можете набрать её за 5 операций, если вы сначала наберёте строку abc, затем скопируете её и допишете последний символ.

Если вам нужно набрать строку aaaaaaaaa, наилучший вариант — набрать 4 символа первой операцией, потом скопировать и приписать строку, и затем дописать последний символ.

Выведите минимальное количество операций, которое необходимо, чтобы набрать заданную строку.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 100) — длину строки. Вторая строка содержит строку s, состоящую из n строчных букв английского алфавита.

Выходные данные

Выведите единственное целое число — минимальное количество ходов, которое необходимо, чтобы набрать заданную строку.

Примечание

Первый тест описан в условии задачи.

Во втором тесте вы можете только выписывать символы один за другим.

C. Прогулка по матрице

реализация *1700

Есть матрица A размера x × y, состоящая из целых чисел. Для каждого , Ai, j = y(i - 1) + j. Очевидно, каждое целое число из [1..xy] встречается в матрице ровно один раз.

Вы прошли по какому-то пути в этой матрице. Путь может быть описан последовательностью посещенных ячеек a1, a2, ..., an, обозначающей, что вы начали в ячейке, содержащей число a1, затем перешли в ячейку с числом a2 и так далее.

Из клетки в i-й строке и j-м столбце (определим ее как (i, j)) можно перейти в следующие ячейки:

  1. (i + 1, j) — если i < x;
  2. (i, j + 1) — если j < y;
  3. (i - 1, j) — если i > 1;
  4. (i, j - 1) — если j > 1.

Заметьте, что один шаг требует перехода в соседнюю ячейку. Остаться в той же ячейке не разрешается.

Значения x и y не известны заранее, вам необходимо найти любые из возможных значений этих чисел такие, что можно начать в клетке, содержащей a1, потом перейти в клетку, содержащую a2 (за один ход), потом в ячейку с a3 (также за один ход) и так далее. Можно ли выбрать значения x и y так, чтобы последовательность шагов была корректной.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 200000) — количество клеток, которые вы посетили на пути (если какая-то клетка посещена дважды, то она и записана дважды).

Во второй строке записаны n чисел a1, a2, ..., an (1 ≤ ai ≤ 109) — числа на ячейках на вашем пути.

Выходные данные

Если не существует значений x и y таких, что 1 ≤ x, y ≤ 109 и информация о пути корректна, то выведите NO.

В противном случае выведите YES в первой строке, а во второй — значения x и y такие, что путь корректен с данным числом строк и столбцов в матрице. Помните, что это должны быть целые положительные числа, не превышающие 109.

Примечание

Матрица и путь в ней в первом примере выглядит так:

Существует несколько правильных ответов для первого и третьего примеров.

B. Не просто красивые строки

реализация *1400

Назовем строку няшной, если ее буквы можно переупорядочить так, чтобы они образовывали ровно две подряд идущие непустые группы из одинаковых символов (при этом разным группам соответствуют разные буквы). Так, например, ababa является няшной (можно превратить ее в aaabb, где первые три буквы образуют одну группу из a, а оставшиеся — вторую группу из b), а cccc — нет, так как при любом разбиении на две последовательные группы буквы в разных группах будут совпадать. Для лучшего понимания условия ознакомьтесь с примерами.

Вам дана строка s. Проверьте, можно ли разбить ее на две непустые непересекающиеся подпоследовательности, так что строки, соответствующие этим подпоследовательностям, будут няшными. Здесь под подпоследовательностью понимается произвольный набор индексов строки.

Входные данные

В единственной строке задана строка s (1 ≤ |s| ≤ 105). Гарантируется, что она состоит только из маленьких латинских букв.

Выходные данные

Выведите «Yes», если строку можно разбить на две няшные строки (в контексте подпоследовательностей), и «No» в противном случае.

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

Во втором примере можно разбить zzcxx на подпоследовательности zc и zxx, каждая из которых является няшной.

В третьем примере ни одного подходящего разбиения не существует.

A. Тройная красота

реализация *1300

Мечтая о красотах весны, художник Аркадий подготовил очень длинный холст.

У Аркадия много красок трех цветов: цианового, пурпурного и желтого. Одномерный холст разбит на n отрезков, следующих один за другим, и каждый отрезок надо покрасить в один из этих трех цветов.

Аркадий уже раскрасил несколько (возможно, ни одного) отрезков и отдал кисть вам. Вы хотите определить, существуют ли хотя бы два различных способа раскрасить еще не покрашенные отрезки так, чтобы не было двух соседних отрезков одного цвета. Два способа считаются различными, если и только если существует отрезок, покрашенный в этих двух способах в разные цвета.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 100) — длину холста.

Вторая строка содержит строку s из n символов, где i-й символ равен «C» (обозначает отрезок, покрашенный в циановый цвет), «M» (отрезок, покрашенный в пурпурный цвет), «Y» (в желтый) или «?» (еще не покрашенный отрезок).

Выходные данные

Если существуют два различных способа покрасить оставшиеся участки холста, удовлетворяя условию, выведите «Yes», иначе выведите «No» (без кавычек).

Вы можете выводить каждую букву в любом регистре (строчную или заглавную).

Примечание

В первом примере есть ровно два различных способа раскрасить холст: CYCMY и CYMCY.

Во втором примере тоже есть ровно два способа: CMCMY и CYCMY.

В третьем примере есть четыре способа: MCYCM, MCYCY, YCYCM и YCYCY.

В четвертом примере независимо от того, как покрасить не покрашенные отрезки, существующие отрезки пурпурного цвета не дадут холсту удовлетворять условию. То же верно для пятого примера.

A1. Death Stars (easy)

реализация *1400

The stardate is 1977 and the science and art of detecting Death Stars is in its infancy. Princess Heidi has received information about the stars in the nearby solar system from the Rebel spies and now, to help her identify the exact location of the Death Star, she needs to know whether this information is correct.

Two rebel spies have provided her with the maps of the solar system. Each map is an N × N grid, where each cell is either occupied by a star or empty. To see whether the information is correct, Heidi needs to know whether the two maps are of the same solar system, or if possibly one of the spies is actually an Empire double agent, feeding her false information.

Unfortunately, spies may have accidentally rotated a map by 90, 180, or 270 degrees, or flipped it along the vertical or the horizontal axis, before delivering it to Heidi. If Heidi can rotate or flip the maps so that two of them become identical, then those maps are of the same solar system. Otherwise, there are traitors in the Rebel ranks! Help Heidi find out.

Input

The first line of the input contains one number N (1 ≤ N ≤ 10) – the dimension of each map. Next N lines each contain N characters, depicting the first map: 'X' indicates a star, while 'O' indicates an empty quadrant of space. Next N lines each contain N characters, depicting the second map in the same format.

Output

The only line of output should contain the word Yes if the maps are identical, or No if it is impossible to match them by performing rotations and translations.

Note

In the first test, you can match the first map to the second map by first flipping the first map along the vertical axis, and then by rotating it 90 degrees clockwise.

B1. Maximum Control (easy)

реализация *1000

The Resistance is trying to take control over all planets in a particular solar system. This solar system is shaped like a tree. More precisely, some planets are connected by bidirectional hyperspace tunnels in such a way that there is a path between every pair of the planets, but removing any tunnel would disconnect some of them.

The Resistance already has measures in place that will, when the time is right, enable them to control every planet that is not remote. A planet is considered to be remote if it is connected to the rest of the planets only via a single hyperspace tunnel.

How much work is there left to be done: that is, how many remote planets are there?

Input

The first line of the input contains an integer N (2 ≤ N ≤ 1000) – the number of planets in the galaxy.

The next N - 1 lines describe the hyperspace tunnels between the planets. Each of the N - 1 lines contains two space-separated integers u and v (1 ≤ u, v ≤ N) indicating that there is a bidirectional hyperspace tunnel between the planets u and v. It is guaranteed that every two planets are connected by a path of tunnels, and that each tunnel connects a different pair of planets.

Output

A single integer denoting the number of remote planets.

Note

In the first example, only planets 2, 3 and 5 are connected by a single tunnel.

In the second example, the remote planets are 2 and 3.

Note that this problem has only two versions – easy and medium.

F1. Lightsabers (easy)

реализация *1500

There is unrest in the Galactic Senate. Several thousand solar systems have declared their intentions to leave the Republic. Master Heidi needs to select the Jedi Knights who will go on peacekeeping missions throughout the galaxy. It is well-known that the success of any peacekeeping mission depends on the colors of the lightsabers of the Jedi who will go on that mission.

Heidi has n Jedi Knights standing in front of her, each one with a lightsaber of one of m possible colors. She knows that for the mission to be the most effective, she needs to select some contiguous interval of knights such that there are exactly k1 knights with lightsabers of the first color, k2 knights with lightsabers of the second color, ..., km knights with lightsabers of the m-th color. Help her find out if this is possible.

Input

The first line of the input contains n (1 ≤ n ≤ 100) and m (1 ≤ m ≤ n). The second line contains n integers in the range {1, 2, ..., m} representing colors of the lightsabers of the subsequent Jedi Knights. The third line contains m integers k1, k2, ..., km (with ) – the desired counts of lightsabers of each color from 1 to m.

Output

Output YES if an interval with prescribed color counts exists, or output NO if there is none.

B. Махмуд, Эхаб и сообщение

жадные алгоритмы реализация снм *1200

Махмуд хочет послать сообщение своему другу Эхабу. Их язык состоит из n слов, пронумерованных с 1 по n. У некоторых слов совпадают значения, поэтому существует k групп слов таких, что у всех слов в одной группе значение одинаковое.

Махмуд знает, что стоимость посылки i-го слова равна ai. Каждое слово в сообщении Махмуд может оставить неизменным или заменить его другим словом с тем же значением. Можете ли вы помочь Махмуду определить минимальную стоимость посылки сообщения?

Стоимость посылки сообщения равна сумме стоимостей отправки всех слов в сообщении.

Входные данные

В первой строке ввода содержатся три целых числа n, k и m (1 ≤ k ≤ n ≤ 105, 1 ≤ m ≤ 105) — число слов в языке, число групп слов с одинаковым значением и число слов в сообщении Махмуда соответственно.

Во второй строке содержится n строк, разделённых пробелами, состоящих из строчных (маленьких) английских букв, длиной не более 20 символов — слова языка Махмуда. Гарантируется, что слова различны.

В третьей строке содержится n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 109), где ai — стоимость посылки i-го слова.

Далее следуют k строк, описывающих группы слов, одинаковых по значению. Каждая из следующих k строк начинается с целого числа x (1 ≤ x ≤ n), что означает, что в данной группе синонимов x слов, после чего следует x целых чисел — номера слов, имеющих одинаковое значение в языке Махмуда. Гарантируется, что каждое слово встречается ровно в одной группе.

Следующая строка содержит m слов, разделённых пробелами — сообщение, которое хочет послать Махмуд. Каждое из этих слов встречается в списке слов языка.

Выходные данные

Единственная строка вывода должна содержать минимальную стоимость посылки сообщения после замены нескольких (возможно, ни одного) слова другими словами с таким же значением.

Примечание

В первом примере Махмуд должен заменить слово «second» на слово «loser», поскольку оно стоит меньше, и тогда стоимость посылки будет равна 100+1+5+1=107.

Во втором примере Махмуд не должен совершать никаких замен, поэтому стоимость будет равна 100+1+5+10=116.

E. Махмуд, Эхаб, исключащее ИЛИ и минимальное остовное дерево

битмаски графы дп математика реализация *1900

Эхаб интересуется побитовым исключающим ИЛИ и особыми графами, поэтому Махмуд предложил ему задачу про оба его интереса сразу. У Махмуда есть полный граф, состоящий из n вершин, пронумерованных с 0 до n - 1. Для любых 0 ≤ u < v < n, вес ненаправленного ребра между вершинами u и v равен (где  — операция побитового исключающего ИЛИ). Можете ли вы найти вес минимального остовного дерева данного графа?

Прочитать про полные графы можно в https://ru.wikipedia.org/wiki/Полный_граф.

Прочитать про минимальное остовное дерево можно в https://ru.wikipedia.org/wiki/Минимальное_остовное_дерево.

Вес минимального остовного дерева равен весу всех рёбер, включённых в него.

Входные данные

В единственной строке содержится одно целое число n (2 ≤ n ≤ 1012) — число вершин в графе.

Выходные данные

В единственной строке содержится одно целое число x — вес минимального остовного дерева данного графа.

Примечание

В первом примере: Вес минимального остовного дерева равен 1+2+1=4.

A. Футбол

реализация Строки *900

Петя очень любит футбол. Однажды, глядя футбольный матч, он записывал на листе бумаги текущее положение игроков. Для простоты он изобразил ситуацию в виде строки из нулей и единиц. Ноль соответствует игрокам одной команды, единица — игрокам другой команды. Если есть как минимум 7 игроков некоторой команды, стоящих подряд, то эта ситуация считается опасной. Например, ситуация 00100110111111101 — опасная, а 11110111011101 — нет. Вам задана текущая ситуация. Определите, является ли она опасной.

Входные данные

В первой строке ввода задана непустая строка из символов «0» и «1», обозначающих игроков. Длина строки не превышает 100 символов. От каждой команды на поле присутствует хотя бы один игрок.

Выходные данные

Выведите «YES» если ситуация опасная. В противном случае выведите «NO».

A. Проверка строки

реализация *1200

У A есть строка, изначально состоящая из некоторого количество букв «a». Он дал свою строку другу B, который добавил некоторое количество букв «b» в конец этой строки. Так как A и B любят буквы «a» и «b», то после этих операций в строке есть хотя бы по одной букве «a» и «b».

Затем B передал эту строку C, который добавил некоторое количество букв «c» в конец строки. Так как C хороший друг A и B, количество букв «c», которые он добавил к строке, равно количеству букв «a» или количеству букв «b», имеющихся в строке. Возможно такое, что количество букв «c» одновременно равно количеству букв «a» и количеству букв «b».

Вам дана строка и вы должны определить могла ли эта строка быть получена в результате описанных выше действий. Если это возможно, выведите «YES», иначе, выведите «NO» (без кавычек).

Входные данные

В единственной строке входных данных задана строка \(S\) (\( 1 \le |S| \le 5\,000 \)). Гарантируется, что строка состоит только из строчных латинских букв «a», «b», «c».

Выходные данные

Выведите «YES» или «NO» в соответствии с условием.

Примечание

Рассмотрим первый пример: количество букв «c» равно количеству букв «a».

Рассмотрим второй пример: несмотря на то, что количество букв «c» равно количеству букв «b», порядок букв неправильный.

Рассмотрим третий пример: количество букв «c» равно количеству букв «b».

C. Подсчет подпоследовательностей

битмаски жадные алгоритмы Конструктив реализация *1700

У Пикачу есть массив. Он выписал все непустые подпоследовательности своего массива на бумажный лист. Обратите внимание, что у массива длины n есть 2n - 1 непустых подпоследовательностей.

Пикачу всегда был озорным, поэтому он удалил все подпоследовательности, в которых Максимальный_элемент_подпоследовательности  -  Минимальный_элемент_подпоследовательности  ≥ d

В итоге, у Пикачу осталось X подпоследовательностей.

Но Пикачу случайно потерял свой массив и сейчас у Пикачу из-за этого серьезные проблемы. Он до сих пор помнит числа X и d и хочет построить любой массив, который удовлетворяет описанным условиям. Все числа в его новом массиве должны быть целыми, положительными и должны быть меньше, чем 1018.

Обратите внимание, что количество элементов в выведенном массиве не должно превышать 104. Если невозможно построить ни одного такого массива, выведите  - 1.

Входные данные

В единственной строке следуют два целых числа X и d (1 ≤ X, d ≤ 109).

Выходные данные

Выведите две строки.

В первой строке должно содержаться целое число n (1 ≤ n ≤ 10 000)— количество элементов в новом массиве Пикачу.

Во второй строке должно содержаться n целых чисел через пробел — a1, a2, ... , an (1 ≤ ai < 1018).

Если ответа не существует, выведите одно число -1. Если существуют несколько ответов, выведите любой.

Примечание

В первом тестовом примере, подпоследовательности, оставшиеся при удалении всех подпоследовательностей, в которых Максимальный_элемент_подпоследовательности  -  Минимальный_элемент_подпоследовательности  ≥ 5 это [5], [5, 7], [5, 6], [5, 7, 6], [50], [7], [7, 6], [15], [6], [100]. Этих подпоследовательностей ровно 10. Таким образом, массив [5, 50, 7, 15, 6, 100] подходит.

Похожим образом, во втором тестовом примере, подпоследовательности, оставшиеся при удалении всех подпоследовательностей, в которых Максимальный_элемент_подпоследовательности  -  Минимальный_элемент_подпоследовательности  ≥ 2 это [10], [100], [1000], [10000]. Этих подпоследовательностей ровно 4. Таким образом, массив [10, 100, 1000, 10000] подходит.

D. Запросы для полного бинарного дерева

Деревья Перебор реализация *2100

У вас есть полное бинарное дерево с бесконечным количеством уровней.

В каждой вершине записано значение. Если в вершине записано значение x, то в ее левом потомке записано значение x, а в правом потомке — значение x + 1.

Значение, записанное в корне, равно 1.

Вам нужно обработать Q запросов.

Всего есть 3 типа запросов:

  1. Циклически сдвинуть на K значения, записанные во всех вершинах, которые находятся на одном уровне с вершиной, в которой записано значение X. (Вершины и значения, записанные в вершинах, на других уровнях остаются без изменений).
  2. Циклически сдвинуть на K вершины, которые находятся на одном уровне с вершиной, в которой записано значение X. (Поддеревья сдвигаемых вершин двигаются вместе с ними).
  3. Вывести значения, записанные в каждой из вершин, которые встречаются на простом пути из вершины, в которой записано значение X, до корня.

Положительное K означает циклический сдвиг вправо, а отрицательное K означает циклический сдвиг влево.

Гарантируется, что среди запросов есть хотя бы один, который имеет тип 3.

Входные данные

В первой строке следует целое число Q (1 ≤ Q ≤ 105).

Далее следуют Q запросов по одному в строке:

  • Запросы типа 1 и 2 имеют следующий формат: T X K (1 ≤ T ≤ 2; 1 ≤ X ≤ 1018; 0 ≤ |K| ≤ 1018), где T обозначает тип запроса.
  • Запросы типа 3 имеют следующий формат: 3 X (1 ≤ X ≤ 1018).
Выходные данные

Для каждого запроса типа 3 выведите в порядке убывания значения, записанные во всех вершинах, встречающихся на пути.

Примечание

На картинках ниже изображены первые 4 уровня дерева для первого примера:

Изначальное дерево:

Дерево после запроса 1 2 1:

Дерево после запроса 2 4 -1:

A. Тетрис

реализация *900

Происходит следующий процесс.

Есть платформа, состоящая из \(n\) колонок. Квадраты размера \(1 \times 1\) появляются один за другим в некоторых колонках на платформе. Если в колонке нет квадратов, то квадрат появляется в нижнем ряду. Иначе же квадрат появляется сверху от самого высокого квадрата в этой колонке.

Когда в каждой из \(n\) колонок есть хотя бы один квадрат, нижний ряд удаляется. За это вы получаете \(1\) очко, а все остальные квадраты падают на один ряд вниз.

Ваша задача — посчитать количество очков, которое вы получите.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 1000\)) — количество колонок на платформе и количество квадратов.

В следующей строке содержится \(m\) целых чисел \(c_1, c_2, \dots, c_m\) (\(1 \le c_i \le n\)) — колонка, в которой появляется \(i\)-й квадрат.

Выходные данные

Выведите единственное целое число — количество очков, которое вы получите.

Примечание

В примере ответ будет равен \(2\), потому что после появления \(6\)-го квадрата будет удален один ряд (количество квадратов на платформе будет выглядеть как \([2~ 3~ 1]\), и после удаления одного ряда как \([1~ 2~ 0]\)).

После появления \(9\)-го квадрата количества будут выглядеть как \([2~ 3~ 1]\), и после удаления одного ряда как \([1~ 2~ 0]\).

Следовательно, ответ будет равен \(2\).

B. Сон на лекции

дп реализация Структуры данных *1200

Вы со своим другом Мишкой сидите на лекции по математическому анализу. Лекция длится n минут. Лектор рассказывает ai теорем в течение i-й минуты.

Хотя Мишке очень нравится математический анализ, иногда очень трудно не засыпать во время лекции. Вам задан массив t поведения Мишки. Если он спит в течение i-й минуты лекции, то ti равняется 0, иначе оно равняется 1. Когда Мишка не спит, он записывает все теоремы, которые слышит — ai теорем в течение i-й минуты. Иначе он не записывает ничего.

Вы знаете некоторую секретную технику, при помощи которой можно заставить не спать Мишку в течение k минут подряд. Но вы можете использовать её только один раз. Вы можете начать использовать её в любую минуту с 1 по n - k + 1. Если вы используете её в минуту i, Мишка не будет спать во все такие минуты j, что , и будет записывать все лекции, которые расскажет лектор.

Ваша задача состоит в том, чтобы посчитать, какое максимальное количество теорем Мишка сможет записать, если вы используете секретную технику, чтобы заставить его не спать, только один раз.

Входные данные

Первая строка входных данных содержит два целых числа n и k (1 ≤ k ≤ n ≤ 105) — длительность лекции в минутах и количество минут, на которое вы можете заставить Мишку не спать.

Вторая строка входных данных содержит n целых чисел a1, a2, ... an (1 ≤ ai ≤ 104) — количество теорем, которые лектор рассказывает в течение i-й минуты.

Третья строка входных данных содержит n целых чисел t1, t2, ... tn (0 ≤ ti ≤ 1) — тип поведения Мишки во время i-й минуты лекции.

Выходные данные

Выведите единственное целое число — максимальное количество теорем, которое Мишка сможет записать, если вы используете секретную технику, чтобы заставить его не спать, только один раз.

Примечание

В примере лучше всего использовать секретную технику в начале третьей минуты. Тогда количество теорем, которое Мишка сможет записать, будет равно 16.

C. Шахматная доска

битмаски Перебор реализация *1400

Однажды Магнус решил разыграть одну классическую шахматную партию. Но открыв чулан, Магнус пришел в ужас! Его любимая доска была разломлена на 4 части, каждая размера n на n, причем n обязательно нечетно. Хуже того, некоторые клетки имели неправильный цвет. j-я клетка i-й строки k-й части доски имеет цвет ak, i, j; 1 соответствует черному цвету, а 0 — белому.

Магнусу стало интересно, какое минимальное количество клеток нужно перекрасить, чтобы из частей доски можно было составить правильную доску. В правильной доске любая пара соседних по стороне клеток должна иметь различный цвет, и размер правильной доски должен быть 2n на 2n. Части доски разрешено переставлять, но нельзя поворачивать или переворачивать.

Входные данные

Первая строка содержит нечетное число n (1 ≤ n ≤ 100) — размер частей доски.

Далее следуют 4 блока, каждый из которых описывает часть доски. Каждый блок состоит из n строк по n символов; j-й символ i-й строки равен 1, если соответствующая клетка изначально покрашена в чёрный цвет, и 0, если клетка изначально белая. Блоки разделяются пустыми строками.

Выходные данные

Выведите одно число — минимальное количество клеток, которые необходимо перекрасить, чтобы из них можно было составить правильную доску.

A. Экватор

реализация *1300

Поликарп сформулировал для себя тренировочный план по подготовке к олимпиаде. Он будет тренироваться \(n\) дней, все дни пронумерованы от \(1\) до \(n\), начиная с единицы.

В \(i\)-й день Поликарп обязательно решит \(a_i\) задач. В один из вечеров Поликарп планирует отметить экватор — это он сделает в первый вечер такого дня, что от начала тренировок и по этот день включительно он решит половину или более всех задач.

Определите номер дня, вечером которого Поликарп отметит экватор.

Входные данные

В первой строке следует целое число \(n\) (\(1 \le n \le 200\,000\)) — количество дней подготовки к олимпиаде.

Во второй строке следует последовательность \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10\,000\)), где \(a_i\) равно количеству задач, которые Поликарп запланировал решить в день номер \(i\).

Выходные данные

Выведите номер дня, вечером которого Поликарп отметит экватор.

Примечание

В первом примере Поликарп отметит экватор вечером второго дня, так как к этому моменту он решит \(4\) из \(7\) запланированных задач на четыре дня.

Во втором примере Поликарп отметит экватор вечером третьего дня, так как к этому моменту он решит \(6\) из \(12\) запланированных задач на шесть дней.

B. Студенты в вагоне

жадные алгоритмы Конструктив реализация *1300

В вагоне есть \(n\) последовательных мест. Каждое место либо пустое, либо занято пассажиром.

Университетская команда на олимпиаду состоит из \(a\) студентов-программистов и \(b\) студентов-спортсменов. Определите наибольшее количество студентов из всех \(a+b\), которых можно посадить в вагон так, чтобы никакой студент-программист не сидел рядом со студентом-программистом и никакой студент-спортсмен не сидел рядом со студентом-спортсменом. Иными словами, не должно быть двух подряд идущих мест, на которых сидят два студента-спортсмена или два студента-программиста.

Считайте, что изначально занятые пассажирами места заняты членами жюри (которые, очевидно, вообще не являются студентами).

Входные данные

В первой строке следует три целых числа \(n\), \(a\) и \(b\) (\(1 \le n \le 2\cdot10^{5}\), \(0 \le a, b \le 2\cdot10^{5}\), \(a + b > 0\)) — общее количество мест в вагоне, количество студентов-программистов и количество студентов-спортсменов.

Во второй строке следует строка длины \(n\), состоящая из символов «.» и «*». Точка означает, что соответствующее место свободно. Звездочка означает, что соответствующее место занято членом жюри.

Выходные данные

Выведите наибольшее количество студентов, которых можно посадить в вагон так, чтобы никакой студент-программист не сидел рядом со студентом-программистом и никакой студент-спортсмен не сидел рядом со студентом-спортсменом.

Примечание

В первом примере можно посадить всех студентов, например, следующим образом: *.AB*

Во втором примере можно посадить четырех студентов, например, следующим образом: *BAB*B

В третьем примере можно посадить семерых студентов, например, следующим образом: B*ABAB**A*B

Буквой A обозначены студенты-программисты, а буквой B — студенты-спортсмены.

C. Сделай квадрат

математика Перебор реализация *1400

Задано целое положительное число \(n\), запись которого не содержит лидирующих нулей (например, запись 04 недопустима).

За один ход вы можете удалить любую его цифру так, чтобы результат остался положительным числом без лидирующих нулей.

Определите минимальное количество операций, которые можно последовательно применить, чтобы сделать заданное число \(n\) квадратом некоторого целого положительного числа, либо сообщите, что это невозможно.

Целое число \(x\) является квадратом некоторого целого положительного числа, если \(x=y^2\) для некоторого целого положительного \(y\).

Входные данные

В первой строке следует целое положительное число \(n\) (\(1 \le n \le 2 \cdot 10^{9}\)). Число задано без лидирующих нулей.

Выходные данные

Если невозможно сделать из числа \(n\) с помощью описанных операций квадрат некоторого целого положительного числа, выведите -1. В противном случае, выведите минимальное количество операций, которые необходимы для этого.

Примечание

В первом примере из числа \(8314\) нужно удалить цифру \(3\) и цифру \(4\). После этого \(8314\) станет равно числу \(81\), которое является квадратом числа \(9\).

Во втором примере число \(625\) изначально является квадратом числа \(25\), поэтому ничего удалять не нужно.

В третьем примере невозможно получить из числа \(333\) квадрат целого числа, поэтому ответ на этот примере -1.

D. Сляние равных

реализация Структуры данных *1600

Задан массив положительных целых чисел. Пока в нем есть хотя бы два одинаковых элемента, будем выполнять следующую операцию. Выберем \(x\) — наименьшее значение, которое встречается в нем \(2\) или более раз. Возьмём два первых вхождения \(x\) в этот массив (два самых левых). Удалим левое из этих двух вхождений, а правое заменим на сумму двух значений (то есть на \(2 \cdot x\)).

Определите, как будет выглядеть массив после выполнения описанных операций.

Например, массив изначально был равен \([3, 4, 1, 2, 2, 1, 1]\). Он будет изменяться следующим образом: \([3, 4, 1, 2, 2, 1, 1]~\rightarrow~[3, 4, 2, 2, 2, 1]~\rightarrow~[3, 4, 4, 2, 1]~\rightarrow~[3, 8, 2, 1]\).

Если же массив изначально был равен \([1, 1, 3, 1, 1]\), то он будет изменяться следующим образом: \([1, 1, 3, 1, 1]~\rightarrow~[2, 3, 1, 1]~\rightarrow~[2, 3, 2]~\rightarrow~[3, 4]\).

Входные данные

В первой строке следует целое число \(n\) (\(2 \le n \le 150\,000\)) — количество элементов в массиве.

Во второй строке следует последовательность из \(n\) элементов \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^{9}\)) — описание массива.

Выходные данные

В первую строку выведите целое число \(k\) — количество элементов в массиве после выполнения операций. Во вторую строку выведите \(k\) целых чисел — описание массива после выполнения операций.

Примечание

Первые два примера разобраны в условии.

В третьем примере все числа в массиве различные, поэтому он не изменится.

B. Морской бой

реализация *1300

Аркадий играет в «Морской бой». Несмотря на это, большую часть правил этой игры вам знать необязательно.

Вам дано поле, состоящее из \(n \times n\) клеток. На поле должен находиться ровно один \(k\)-палубник, т. е. корабль длиной \(k\) клеток, ориентированный горизонтально или вертикально. Но Аркадий не знает, где этот корабль находится. Для каждой клетки Аркадий знает, точно ли она пустая или же она может содержать часть корабля.

Рассмотрим все возможные расположения корабля. Найдите такую клетку, которая принадлежит максимально возможному числу разных расположений корабля.

Входные данные

В первой строке содержится два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 100\)) — размер поля и размер корабля.

Следующие \(n\) строк содержат поле. В каждой строке содержится \(n\) символов, каждый из которых либо «#» (обозначает определённо пустую клетку) или «.» (обозначает клетку, которая может принадлежать кораблю).

Выходные данные

Выведите два целых числа — номер строки и номер столбца клетки, которая принадлежит максимальному числу возможных разных расположений корабля.

Если есть несколько возможных вариантов ответа, выведите любой из них. В частности, если корабль не может располагаться на поле, вы можете вывести любую клетку.

Примечание

Рисунок ниже показывает три возможных различных положения корабля, содержащих клетку \((3, 2)\) в первом примере.

A. Интервал безопасности

реализация *1100

Недавно Аркадий перешел на работу диспетчером в крупный аэропорт. Он контролирует взлетно-посадочную полосу, которая обычно используется только для посадок. Поэтому у него есть расписание посадок на ближайшее время, каждая посадка продолжается \(1\) минуту.

Аркадия попросили вставить в расписание один взлет. Взлет также занимает \(1\) минуту, но по соображениям безопасности требуется, чтобы между взлетом и любой посадкой было хотя бы \(s\) минут паузы с обеих сторон.

Найдите ближайшее время, в которое Аркадий может вставить взлет.

Входные данные

Первая строка содержит два целых числа \(n\) и \(s\) (\(1 \le n \le 100\), \(1 \le s \le 60\)) — количество посадок в расписании и минимальный допустимый интервал между посадкой и взлетом.

Каждая из следующих \(n\) строк содержит два целых числа \(h\) и \(m\) (\(0 \le h \le 23\), \(0 \le m \le 59\)) — время, в часах и минутах от текущего времени, когда будет садиться очередной самолет (таким образом текущее время \(0\) \(0\)). Все времена даны в порядке возрастания.

Выходные данные

Выведите два целых числа \(h\) и \(m\) — час и минуту от текущего времени, когда Аркадий может вставить взлет.

Примечание

В первом примере обратите внимание, что между временами 1:20 и 3:21 недостаточно времени, так как и взлет, и посадка занимают одну минуту.

Во втором примере в расписании нет свободных мест, поэтому Аркадий вынужден запланировать взлет после всех посадок. Обратите внимание, возможно, что ему придется запланировать взлет на более, чем \(24\) часа от текущего времени.

В третьем примере Аркадий может вставить взлет даже до первой посадки.

A. Домино

Перебор реализация *2400

Мальчику Гене на день рождения подарили домино. Домино состоит из 28 различных костей 2 × 1 — на обеих клетках написано по цифре от 0 до 6.

0-0 0-1 0-2 0-3 0-4 0-5 0-6
1-1 1-2 1-3 1-4 1-5 1-6
2-2 2-3 2-4 2-5 2-6
3-3 3-4 3-5 3-6
4-4 4-5 4-6
5-5 5-6
6-6

Фигура, состоящая из всех 28 доминошек, называется волшебной, если ее можно целиком покрыть 14 непересекающимися квадратами 2 × 2 так, чтобы каждый квадрат содержал четыре одинаковые цифры. Каждый раз, когда Гена собирает волшебную фигуру, проявляются волшебные свойства набора — именинник выигрывает следующий контест. Геннадий заметил, что собирать уже когда-то собранную фигуру нельзя, иначе контест выигрывает кто-нибудь другой.

Гена выбрал клетчатое поле размером n × m и расположил на нем прямоугольные фишки размером 1 × 2 и 2 × 1. Каждая фишка занимает целиком ровно две соседние клетки поля. Эти фишки не перекрываются, но могут касаться. Всего фишек на поле ровно 28 — по числу доминошек в наборе. Теперь Гена хочет заменить каждую фишку на доминошку так, чтобы в результате получилась волшебная фигура. Различные фишки должны быть заменены на различные доминошки. Определите, в скольки контестах Геннадий может одержать победу при заданном расположении фишек? Также требуется найти один из возможных способов заменить фишки на доминошки, чтобы выиграть следующий раунд Codeforces.

Входные данные

В первой строке заданы два целых положительных числа n и m (1 ≤ n, m ≤ 30). В каждой из следующих n строк содержится по m символов — расположение фишек на поле. Точки обозначают пустые места, латинские буквы от «a» до «z» и «A», «B» — расположение фишек. Всего на поле ровно 28 фишек. Клетки, покрытые одной и той же фишкой, обозначены одной и той же буквой, разные фишки обозначены разными буквами. Гарантируется, что описание поля корректно.

Также гарантируется, что хотя бы одно решение существует.

Выходные данные

В первой строке выведите количество способов заменить фишки на доминошки, чтобы получилась волшебная фигура — общее число контестов, которые можно выиграть, используя это расположение фишек. Следующие n строк по m символов должны содержать поле из точек и цифр от 0 до 6 — любое из возможных решений. Все доминошки должны быть различны.

D. Робот в подвале

битмаски Перебор реализация *2700

Профессор опять потерял своего домашнего робота. После некоторых раздумий профессор понял, что робота он оставил в подвале.

Подвал в доме профессора представляет собой прямоугольник n × m, разбитый на квадратные клетки 1 × 1. Некоторые клетки — стены, которые непроходимы, остальные клетки проходимы. Из любой проходимой клетки можно попасть в любую другую проходимую клетку, двигаясь через смежные по ребрам проходимые клетки. Одна из проходимых клеток является выходом из подвала. Робот находится ровно в одной из проходимых клеток, в том числе, он может находиться в клетке выхода.

Профессору страшно идти ночью в темный подвал искать робота. Но у него есть план подвала, а также пульт дистанционного управления роботом. Профессор с помощью пульта может посылать сигналы роботу, чтобы он сдвигался на одну клетку влево, вправо, вверх или вниз. Получив сигнал, робот сдвигается в нужном направлении, если соседняя с ним клетка в данном направлении проходима. Иначе робот стоит на месте.

Профессор выписал на листочек последовательность из k команд, которая, по его мнению, приведет робота к выходу из подвала, где бы он ни находился изначально. Он запрограммировал другого робота, чтобы тот нажимал на пульте нужные кнопки в соответствии с записью на листочке. Профессор уже было хотел запустить программу на выполнение и пойти спать, но тут его осенило.

На выполнение каждой команды тратится электроэнергия, а профессор не хочет получить в конце месяца большой счет за электричество. Поэтому он хочет найти наименьший префикс в выписанной им последовательности, который гарантированно приведет робота к выходу после его выполнения. Именно с этой просьбой профессор тревожит вас в столь поздний час.

Входные данные

В первой строке находятся три целых числа n, m и k (3 ≤ n, m ≤ 150, 1 ≤ k ≤ 105). В последующих n строках содержится по m символов — описание подвала профессора: «#» означает стену, «.» — проходимую клетку, а «E» — выход из подвала (эта клетка тоже проходима). Гарантируется, что до выхода можно добраться из любой проходимой клетки, а все клетки по периметру прямоугольника n × m — стены. Ровно одна клетка является выходом из подвала. В последней строке находится k символов — описание последовательности команд, что профессор выписал на листочек. «L», «R», «U», «D» означают команды влево, вправо, вверх и вниз соответственно.

Выходные данные

В выходной файл выведите длину наименьшего префикса, который гарантированно приводит робота к клетке выхода. Другими словами, робот должен оказаться в клетке выхода после выполнения всех команд из префикса (в процессе выполнения команд робот мог приходить в клетку выхода, а затем уходить из нее, но нас интересует положение робота только в самом конце), где бы он ни находился в подвале изначально. Если профессор ошибся и никакой префикс (включая всю последовательность) не приводит робота к выходу, выведите «-1» (без кавычек). Если единственная проходимая клетка поля — выход, то выведите «0» (без кавычек).

A. Арамейский манускрипт

реализация Строки *900

В арамейском языке слова могут обозначать только обьекты.

У слов в арамейском языке есть несколько особых свойств:

  • Слово является корнем, если оно в нём нет двух одинаковых букв.
  • Корень и все его перестановки обозначают один и тот же самый объект.
  • Корнем \(x\) слова \(y\) является любое слово, которое содержит все различные буквы, встречающиеся в \(y\), ровно по одному разу каждая. Например, «a» является корнем слов «aaaa», «aa», «aaa»; корнем слов «aabb», «bab», «baabb», «ab» является «ab».
  • Все слова в арамейском языке обозначают тот же самый объект, что и его корень.

Вам в руки попал древний манускрипт на арамейском. Определите, сколько различных объектов упомянуто в нём.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \leq n \leq 10^3\)) — число слов в манускрипте.

Вторая строка содержит \(n\) слов \(s_1, s_2, \ldots, s_n\) — содержание манускрипта. Длина каждого слова не превосходит \(10^3\).

Гарантируется, что все символы в словах являются строчными (маленькими) латинскими буквами.

Выходные данные

Выведите одно целое число — число различных объектов, упомянутых в древнем арамейском манускрипте.

Примечание

В первом примере упомянуты два объекта. Соответствующие им корни — «a»,«ab».

Во втором примере упомянут лишь один объект с корнем «amer». Остальные слова являются перестановками слова «amer».

B. Манкала

Перебор реализация *1100

Манкала — игра, известная на Ближнем Востоке. В неё играют на доске с 14 лунками.

Изначально в каждой лунке находится \(a_i\) камней. Когда игрок совершает ход, он выбирает лунку с положительным числом камней. Он берёт из неё все камни, после чего раскладывает эти камни по одному в следующие лунки против часовой стрелки.

Заметьте, что разложение камней против часовой стрелки означает, что если игрок берёт камни из лунки \(i\), он положит один камень в \((i+1)\)-ю лунку, после чего в \((i+2)\)-ю, и так далее. Если он положит камень в \(14\)-ю лунку, следующий должен быть положен в первую лунку.

После хода игрок забирает себе все камни из лунок, в которых находится чётное число камней. Число камней, собранных игроком — это его счёт, согласно Ресли.

Ресли — известный игрок в манкалу. Он хочет узнать, какой максимальный счёт он может получить после одного хода.

Входные данные

В единственной строке содержится 14 целых чисел \(a_1, a_2, \ldots, a_{14}\) (\(0 \leq a_i \leq 10^9\)) — число камней внутри каждой из лунок.

Гарантируется, что для любого \(i\) (\(1\leq i \leq 14\)) \(a_i\) либо нечётно, либо равно нулю, и что на доске есть хотя бы один камень.

Выходные данные

Выведите одно целое число — максимальный возможный счёт игрока после одного хода.

Примечание

В первом примере после хода из лунки с \(7\) камнями доска будет выглядеть как 1 2 2 0 0 0 0 0 0 0 1 1 1 1. После этого игрок собирает камни из всех лунок с чётным числом камней и получает счёт, равный \(4\).

A. Минимальное двоичное число

реализация *800

Строка называется правильной тогда и только тогда, когда она состоит из символов "0" и "1", а также в ней отсутствуют избыточные лидирующие нули. Вот несколько примеров: «0», «10», «1001».

Задана правильная строка s.

Над этой строкой можно проводить два типа операций:

  1. поменять местами два соседних символа (например, «101» «110»);
  2. заменить «11» на «1» (например, «110» «10»).

Определим val(s), как такое число, что s является его двоичным представлением.

Правильная строка a меньше другой правильной строки b тогда и только тогда, когда val(a) < val(b).

Ваша задача — найти минимальную правильную строку, которую можно получить из заданной, применив некоторую последовательность выше описанных операций. Операции можно использовать в любом порядке любое количество раз (или не использовать совсем).

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 100) — длина строки s.

Вторая строка содержит строку s из символов "0" и "1". Гарантируется, что строка s правильная.

Выходные данные

Выведите одну строку — минимальную правильную строку, которую можно получить из заданной.

Примечание

В первом примере можно получить ответ следующей последовательностью операций:

«1001» «1010» «1100» «100».

Во втором примере невозможно получить меньший ответ никакой последовательностью операций.

B. Лара Крофт и новая игра

математика реализация *1300

Возможно, вы слышали про следующую игру в серии Лара Крофт, которая выходит в этом году. Возможно, вы даже смотрели ее трейлер. Однако вы совершенно точно упустили главную ветку ее сюжета, так что давайте я вам приоткрою завесу тайны.

Лара собирается исследовать еще одно страшно опасное подземелье. Разработчики решили в этот раз сделать 2D графику. Подземелье можно представить, как прямоугольную матрицу из n строк и m столбцов. Ячейка (x, y) — это ячейка в x-й строке и y-м столбце. Лара может передвигаться между соседними по стороне ячейками во всех четырех направлениях.

Более того, она уже даже выбрала себе путь, чтобы обойти все ловушки. Она заходит в подземелье в ячейке (1, 1) — это левый верхний угол матрицы. Далее она спускается до конца вниз до ячейки (n, 1) — левый нижний угол. Потом она двигается змейкой — до конца вправо, на один вверх, влево до 2-го столбца, на один вверх, и так далее. Лара продолжает идти, пока не закончатся непосещенные клетки. n и m заданы такими, что она всегда закончит в клетке (1, 2).

Лара уже k раз перешла в соседнюю клетку. Можете ли вы определить ее текущую позицию?

Входные данные

В единственной строке записаны три целых числа n, m и k (2 ≤ n, m ≤ 109, n всегда четно, 0 ≤ k < n·m). Обратите внимание, что k не помещается в 32-битный тип данных.

Выходные данные

Выведите ячейку (номер строки и столбца, в которых находится эта ячейка), в которой Лара окажется после того, как k раз перейдёт в соседнюю клетку.

Примечание

Такой ее путь будет на матрице 4 на 3:

C. Вложенные отрезки

жадные алгоритмы реализация сортировки *1500

Задана последовательность a1, a2, ..., an одномерных отрезков, пронумерованных от 1 до n. Ваша задача — найти два различных индекса i и j таких, что отрезок ai лежит внутри отрезка aj.

Отрезок [l1, r1] лежит внутри отрезка [l2, r2] тогда и только тогда, когда l1 ≥ l2 и r1 ≤ r2.

Выведите позиции i и j. Если существует несколько возможных ответов, выведите любой из них. Если ответа не существует, то выведите -1 -1.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 3·105) — количество отрезков.

В каждой из следующих n строк записаны по два целых числа li и ri (1 ≤ li ≤ ri ≤ 109) — i-й отрезок.

Выходные данные

Выведите две различные позиции i и j такие, что отрезок ai лежит внутри отрезка aj. Если существует несколько возможных ответов, выведите любой из них. Если ответа не существует, то выведите -1 -1.

Примечание

В первом примере следующие пары считаются валидными:

  • (2, 1), (3, 1), (4, 1), (5, 1) — не касаются даже границами;
  • (3, 2), (4, 2), (3, 5), (4, 5) — касаются только в одной границе;
  • (5, 2), (2, 5) — полностью совпадают.

D. Множество степеней

графы Конструктив реализация *2500

Задана последовательность из n целых чисел d1, d2, ..., dn (d1 < d2 < ... < dn). Требуется построить такой неориентированный граф, что:

  • в нем ровно dn + 1 вершин;
  • в нем нет петель;
  • в нем нет кратных ребер;
  • в нем не более 106 ребер;
  • его множество степеней равно d.

Вершины должны быть пронумерованы от 1 до (dn + 1).

Последовательностью степеней называется массив a длины, равной количеству вершин графа, такой, что ai — это количество вершин, смежных с i-й.

Множеством степеней называется отсортированная по возрастанию последовательность из всех различных значений из последовательности степеней.

Гарантируется, что существует такой граф, что все условия выполняются, и он содержит не более 106 ребер.

Выведите полученный граф.

Входные данные

В первой строке записано одно целое число n (1 ≤ n ≤ 300) — размер множества степеней.

Во второй строке записаны n целых чисел d1, d2, ..., dn (1 ≤ di ≤ 1000, d1 < d2 < ... < dn) — множество степеней.

Выходные данные

В первой строке выведите одно целое число m (1 ≤ m ≤ 106) — количество ребер в полученном графе. Гарантируется, что существует такой граф, что все условия выполняются, и он содержит не более 106 ребер.

В каждой из следующих m строк должны быть записаны два целых числа vi и ui (1 ≤ vi, ui ≤ dn + 1) — описание i-го ребра.

C. Письма

Бинарный поиск реализация *1000

В Берляндском государственном университете всего \(n\) общежитий, пронумерованных целыми числами от \(1\) до \(n\). Каждое общежитие состоит из квартир, в \(i\)-м общежитии \(a_i\) квартир. Квартиры в \(i\)-м общежитии нумеруются с \(1\) до \(a_i\).

При получении почты на адрес одной из квартир какого-то общежития иногда не указывается номер квартиры в конкретном общежитии, но указывается номер квартиры среди всех квартир \(n\) общежитий. В таком случае, считается что в нумерации сначала идут квартиры первого общежития, затем квартиры второго общежития и так далее. Таким образом, в этой нумерации присутствуют числа от \(1\) до \(a_1 + a_2 + \dots + a_n\). Квартиры каждого общежития в этой нумерации идут подряд в порядке возрастания номеров.

Например, в случае \(n=2\), \(a_1=3\) и \(a_2=5\) на конверте может быть написано произвольное целое число от \(1\) до \(8\). Если на конверте написано число \(7\), то это письмо следует доставить в квартиру номер \(4\) второго общежития.

Для каждого из \(m\) писем по номеру квартиры среди всех \(n\) общежитий найдите конкретное общежитие и номер квартиры в нём, куда следует доставить это письмо.

Входные данные

В первой строке следуют два целых числа \(n\) и \(m\) \((1 \le n, m \le 2 \cdot 10^{5})\) — количество общежитий и количество писем.

Во второй строке следует последовательность \(a_1, a_2, \dots, a_n\) \((1 \le a_i \le 10^{10})\), где \(a_i\) равно количеству квартир в общежитии \(i\). В третьей строке следует последовательность \(b_1, b_2, \dots, b_m\) \((1 \le b_j \le a_1 + a_2 + \dots + a_n)\), где \(b_j\) равно номеру квартиры для письма \(j\). Все \(b_j\) заданы в порядке возрастания.

Выходные данные

Выведите \(m\) строк. В каждую строку выведите по два числа \(f\) и \(k\) — номер общежития \(f\) \((1 \le f \le n)\) и номер квартиры в нём \(k\) \((1 \le k \le a_f)\) для очередного письма.

Примечание

В первом примере письма должны быть доставлены следующим образом:

  • первое письмо в квартиру номер \(1\) в первом общежитии
  • второе письмо в квартиру номер \(9\) в первом общежитии
  • третье письмо в квартиру номер \(2\) во втором общежитии
  • четвёртое письмо в квартиру номер \(13\) во втором общежитии
  • пятое письмо в квартиру номер \(1\) в третьем общежитии
  • шестое письмо в квартиру номер \(12\) в третьем общежитии

D. Почти арифметическая прогрессия

математика Перебор реализация *1500

Поликарп обожает арифметические прогрессии. Последовательность \([a_1, a_2, \dots, a_n]\) называется арифметической прогрессией, если для любого \(i\) (\(1 \le i < n\)) значение выражения \(a_{i+1} - a_i\) одинаково. Например, последовательности \([42]\), \([5, 5, 5]\), \([2, 11, 20, 29]\) и \([3, 2, 1, 0]\) — арифметические прогрессии, а \([1, 0, 1]\), \([1, 3, 9]\) и \([2, 3, 1]\) — нет.

Из определения следует, что любая последовательность из одного элемента или двух элементов — арифметическая прогрессия.

Поликарп нашел на улице некоторую последовательность положительных целых чисел \([b_1, b_2, \dots, b_n]\). Он согласен изменить каждый из элементов не более чем на единицу. Иными словами, каждый элемент последовательности может быть уменьшен на \(1\), оставлен без изменений или увеличен на \(1\).

Определите минимальное количество элементов последовательности \(b\), которые нужно изменить Поликарпу на единицу таким образом, чтобы последовательность \(b\) стала арифметической прогрессией, либо сообщите, что это невозможно.

Допустимо, что после изменений последовательность содержит \(0\).

Входные данные

В первой строке следует целое число \(n\) \((1 \le n \le 100\,000)\) — количество элементов в последовательности \(b\).

Во второй строке следует последовательность \(b_1, b_2, \dots, b_n\) \((1 \le b_i \le 10^{9})\).

Выходные данные

Если невозможно получить арифметическую прогрессию с помощью описанных операций, выведите -1. В противном случае, выведите неотрицательное целое число — минимальное количество элементов последовательности, которые нужно изменить на единицу таким образом, чтобы последовательность стала арифметической прогрессией.

Примечание

В первом примере нужно увеличить первое число на \(1\), уменьшить второе число на \(1\), увеличить третье число на \(1\), а четвертое число оставить без изменений. Таким образом, после изменения на единицу трех элементов, получим последовательность \([25, 20, 15, 10]\), которая является арифметической прогрессией.

Во втором примере не нужно изменять ни одного элемента, так как данная последовательность является арифметической прогрессией.

В третьем примере невозможно получить арифметическую прогрессию.

В четвертом примере нужно изменить только первый элемент, уменьшив его на единицу. После этого получим последовательность \([0, 3, 6, 9, 12]\), которая является арифметической прогрессией.

G. Сессия Пети

жадные алгоритмы реализация сортировки *1700

Сессия Пети продлится \(n\) дней и за это время ему нужно сдать \(m\) экзаменов. Дни сессии пронумерованы от \(1\) до \(n\).

Про каждый экзамен известно три величины:

  • \(s_i\) — день, когда выдадут билеты для \(i\)-го экзамена.
  • \(d_i\) — день, когда состоится \(i\)-й экзамен (\(s_i < d_i\)).
  • \(c_i\) — сколько дней нужно Пете, чтобы подготовиться к \(i\)-му экзамену. К \(i\)-му экзамену Петя может готовиться только в дни с номерами от \(s_i\) до \(d_i-1\), включительно.

В каждый из дней сессии Петя будет либо весь день отдыхать, либо весь день сдавать один экзамен, либо весь день готовится к одному из экзаменов, для которого уже выданы билеты. Смешивать виды активностей в один день Петя не может. Если в день \(j\) Петя готовится к экзамену \(i\), то \(s_i \le j < d_i\).

Петя может иметь перерывы между днями подготовки к одному экзамену, он может чередовать по дням подготовку к разным экзаменам. Таким образом, подготовка к одному экзамену не обязательно должна осуществляться в последовательные дни.

Определите расписание подготовки Пети, в соответствии с которым, он успешно сможет подготовиться ко всем экзаменам и сдать их, либо сообщите, что это невозможно.

Входные данные

В первой строке следуют два целых числа \(n\) и \(m\) \((2 \le n \le 100, 1 \le m \le n)\) — количество дней сессии и количество экзаменов.

В следующих \(m\) строках следуют по три целых числа \(s_i\), \(d_i\), \(c_i\) \((1 \le s_i < d_i \le n, 1 \le c_i \le n)\) — день, когда будут выданы билеты для \(i\)-го экзамена, день, когда состоится \(i\)-й экзамен, а также количество дней, которые нужны Пете, чтобы подготовиться к \(i\)-му экзамену.

Гарантируется, что все экзамены состоятся в разные дни. Билеты для разных экзаменов могут быть выданы в один и тот же день. В день экзамена могут быть выданы билеты для одного или нескольких других экзаменов, которые Петя сможет узнать, но начать готовиться он сможет начать только в следующий день, так как в текущий сдаёт экзамен.

Выходные данные

Если Петя не сможет подготовиться и сдать все экзамены, выведите -1.

В случае положительного ответа выведите \(n\) целых чисел, где \(j\)-е число равно:

  • \((m + 1)\), если в \(j\)-й день проводится экзамен (напомним, что в каждый день сессии проводится не более одного экзамена),
  • нулю, если в \(j\)-й день Петя будет отдыхать,
  • равно \(i\) (\(1 \le i \le m\)), если в \(j\)-й день Петя будет готовиться к \(i\)-му экзамену (суммарное количество дней подготовки к каждому экзамену согласно расписанию должно быть в точности равно количеству дней, необходимых для подготовки к нему).

Экзамены нумеруются в том же порядке, в котором встречаются во входных данных, начиная с \(1\).

Если возможных ответов (расписаний) несколько, то выведите любой из них.

Примечание

В первом примере Петя может, например, готовиться к экзамену \(1\) в первый день, готовиться к экзамену \(2\) во второй день, в третий день сдать экзамен \(1\), в четвертый день отдыхать, а в пятый день сдать экзамен \(2\). Таким образом, он сумеет подготовиться и сдать все экзамены.

Во втором примере сессия длится три дня и состоится два экзамена. Таким образом, на подготовку остаётся всего один день (так как два других дня заняты сдачей экзаменов). Поэтому Петя не сможет сдать все экзамены.

A. Помогите Василисе Премудрой

Перебор реализация *1700

Василисе Премудрой из Тридевятого царства, Тридесятого государства ее подруга Хелависа Премудрая из Тридесятого царства, Тридевятого государства прислала чудесный ларчик с секретом. Однако в чем секрет ларчика Василиса Премудрая пока не знает, потому что не может его открыть. Она надеется, что вы поможете ей в этом.

Замок ларчика устроен следующим образом. Сам ларчик представляет собой абсолютно идеальный черный куб с одинаковым углублением в каждой из граней (заморские нанотехнологии, пока еще не освоенные в Осколково). К ларчику прилагаются шесть самоцветов той же формы, что и углубления в его гранях. Открыть ларчик можно только после того, как его правильно инкрустировать самоцветами — то есть вставить в углубление каждой грани ровно по одному самоцвету. Две инкрустации считаются одинаковыми, если они могут быть получены одна из другой произвольными вращениями ларчика (вспомните, ларчик представляет собой идеальный нанотехнологический куб).

Теперь Василиса Премудрая хочет по набору цветов самоцветов определить, сколько различных инкрустаций куба ей придется сделать в худшем случае для открытия ларчика. Для ответа на этот вопрос полезно знать, что два самоцвета одного цвета являются неразличимыми. Помогите Василисе решить эту нелегкую задачу.

Входные данные

В первой строке без пробелов записано ровно 6 символов из множества {R, O, Y, G, B, V} — цвета самоцветов, которыми нужно инкрустировать грани ларчика.

Выходные данные

Выведите искомое количество различных инкрустаций.

B. Помогите Царю

Деревья реализация Теория вероятностей *2200

Это модификация задачи, использованной на официальном раунде. К сожалению, авторское решение к оригинальной формулировке оказалось неверным, поэтому задача была изменена специально для архива.

Жил да был в Тридевятом царстве Царь, и была у него прекрасная дочь Василиса. Жили они не тужили, пока не случилась беда лихая: налетел на Тридевятое царство злобный Змей Горыныч и украл Василису. Закручинился Царь, однако собрал своих храбрых молодцев, и пообещал полцарства и руку дочери тому, кто спасет его дочь от супостата иноземного.

Долго ли, коротко ли, нашли молодцы логово Змея Горыныча, и завалились в него спасать Василису Прекрасную всей толпой. Каждый из них плюнул в супостата один раз, и, будучи очень нежным и легкоранимым существом, бедный Змей Горыныч умер от разрыва сердца. Храбры же молодцы доставили Василису Прекрасную Царю и передрались из-за того, кому же достанется ее рука.

Поскольку все храбры молодцы были одинаково храбры и одинаково красивы, а Василиса все равно не хотела выходить замуж ни за кого из них, то Царь, будучи очень мудрым, дабы не обидеть никого, решил определить, кому достанется его дочь, случайным образом — бросанием монетки. Однако оказалось, что добрых молодцев целых n человек, а у монетки — только две стороны, но зато каждая выпадает при подбрасывании с равной вероятностью. Царю стало интересно, как можно выбрать одного добра молодца с помощью этой монетки таким образом, чтобы у всех добрых молодцев вероятность быть выбранным совпадала (и равнялась, соответственно, 1 / n). Перво-наперво Царь хочет узнать матожидание количества раз, которое потребуется бросить монетку, чтобы определить победителя, следуя оптимальной стратегии подбрасывания (то есть такой, которая это матожидание минимизирует). Помогите Царю в его непростой задаче.

Входные данные

В первой строке задано одно целое число n из условия задачи (1 ≤ n ≤ 10000).

Выходные данные

Выведите искомое матожидание количества подбрасываний в виде несократимой дроби вида «a/b» (без кавычек) без лидирующих нулей.

A. Нити и бусинки

математика реализация *900

Ожерелье можно описать как строку, состоящую из нитей («-») и бусинок («o»), причём последняя нить или бусинка в этой строке связана с первой.

Вы можете убрать нить или бусинку из ожерелья и вставить её между двумя другими элементами ожерелья (между двумя нитями, между двумя бусинками или между нитью и бусинкой). Этот процесс можно повторить какое угодно количество раз, но при этом из ожерелья нельзя выбрасывать никаких элементов.

Можно ли подобными операциями сделать так, что число нитей между любыми двумя соседними бусинками в ожерелье станет равным? Две бусинки являются соседними, если между ними в ожерелье нет другой бусинки.

Учтите, что после всех операций ожерелье не должно распасться на несколько частей и должно сохранить изначальную длину.

Входные данные

В единственной строке ввода содержится одна строка \(s\) (\(3 \leq |s| \leq 100\)) — описание ожерелья, в котором знак «-» обозначает нить и маленькая (строчная) английская буква «o» обозначает бусинку.

Выходные данные

Выведите «YES», если ожерелье можно разрешённым операциями перевести в такое, в котором число нитей между любыми двумя соседними бусинками равно, и «NO» в противном случае.

Вы можете выводить каждую из букв в любом регистре (большой или маленькой).

A. Антипалиндром

Перебор реализация Строки *900

Строка называется палиндромом, если она одинаково читается слева направо и справа налево. Например, строки «kek», «abacaba», «r» и «papicipap» — палиндромы, а строки «abb» и «iq» — нет.

Подстрокой \(s[l \ldots r]\) (\(1 \leq l \leq r \leq |s|\)) строки \(s = s_{1}s_{2} \ldots s_{|s|}\) называется строка \(s_{l}s_{l + 1} \ldots s_{r}\).

Девушка Анна очень боится палиндромов, поэтому она предпочитает, чтобы ее называли Анн. Таким же образом в своем воображении она меняет слова-палиндромы на другие слова. А именно, она меняет слово \(s\) на самую длинную подстроку, которая не является палиндромом. Если же все совсем плохо и все подстроки слова \(s\) являются палиндромами, она и вовсе пропускает это слово из виду.

Не так давно во время чтения книги Анн увидела слово \(s\). Скажите, в слово какой длины оно превратилось в ее воображении?

Входные данные

В первой строке расположена непустая строка \(s\) длиной не более \(50\) символов, состоящая из строчных латинских букв.

Выходные данные

Если существует подстрока строки \(s\), которая не является палиндромом, выведите длину самой длинной такой подстроки. Иначе выведите \(0\).

Обратите внимание, самых длинных подстрок, не являющихся палиндромами, может быть несколько, однако их длина определяется однозначно.

Примечание

«mew» не является палиндромом, поэтому подстрока максимальной длины строки «mew», не являющаяся палиндромом, это вся строка. Таким образом, ответ на первый тест из примера это \(3\).

Строка «uffuw», не являющаяся палиндромом, является подстрокой длины \(5\) строки «wuffuw», таким образом ответ на второй тест из примера это \(5\).

Все подстроки строки «qqqqqqqq» состоят из одинаковых букв, поэтому являются палиндромами, таким образом, у этой строки не существует подстроки, не являющейся палиндромом, и ответ на третий тест из примера это \(0\).

C. Полезная декомпозиция

Деревья реализация *1400

Рамзес — мастер решения задач про деревья (неориентированные связные графы без циклов)!

Он придумал новую, очень полезную декомпозицию дерева, но, так как обычно он решает задачи только в уме, он не знает, как её найти, и просит вашей помощи!

Его декомпозиция заключается в разбиении ребер дерева на простые пути так, что любая пара путей в декомпозиции будет иметь хотя бы одну общую вершину. Каждое ребро дерева должно войти в ровно один путь.

Помогите Рамзесу, найдите такую декомпозицию данного дерева, или сообщите, что её не существует.

Входные данные

В первой строке дано одно целое число \(n\) (\(2 \leq n \leq 10^{5}\)) — количество вершин в дереве.

В каждой из следующих \(n - 1\) строк через пробел записаны два целых числа \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq n\), \(a_i \neq b_i\)) — ребра дерева. Гарантируется, что заданные ребра задают дерево.

Выходные данные

Если необходимой декомпозиции не существует, в единственной строке выведите «No».

В противном случае в первой строке выведите «Yes», а во второй целое число \(m\) — число путей в декомпозиции.

Следующие \(m\) строк должны содержать по два целых числа \(u_i\), \(v_i\) (\(1 \leq u_i, v_i \leq n\), \(u_i \neq v_i\)), разделенных пробелом, обозначающие, что очередной путь декомпозиции — путь между вершинами \(u_i\) и \(v_i\).

Любая пара путей в декомпозиции должна иметь хотя бы одну общую вершину, а каждое ребро дерева должно присутствовать ровно в одном пути. Пути и концы каждого пути можно выводить в любом порядке.

Если существует несколько подходящих декомпозиций, выведите любую.

Примечание

Дерево из первого примера изображено на картинке ниже: Рядом с каждым ребром указан номер, к которому принадлежит это ребро в декомпозиции, несложно видеть, что данная декомпозиция удовлетворяет условиям задачи.

Дерево из второго примера изображено на картинке ниже: Можно доказать, что для данного дерева не существует искомой декомпозиции.

Дерево из третьего примера изображено на картинке ниже: Рядом с каждым ребром указан номер, к которому принадлежит это ребро в декомпозиции, несложно видеть, что данная декомпозиция удовлетворяет условиям задачи.

B. Автобус характеров

жадные алгоритмы реализация Структуры данных *1300

В автобусе характеров есть \(n\) рядов сидений, в каждом по \(2\) места. В \(i\)-м ряду ширина обоих сидений равна \(w_i\) сантиметров. Все числа \(w_i\) различны.

Изначально автобус пустой. На каждой из \(2n\) остановок в автобус садится ровно один человек одного из двух характеров:

  • интроверт всегда выбирает ряд, где оба места свободны, при этом из таких рядов он выбирает ряд с самыми узкими сидениями, и занимает одно место;
  • экстраверт всегда выбирает ряд, где уже сидит один человек (интроверт), при этом из таких рядов он выбирает ряд с самыми широкими сидениями, и занимает оставшееся в выбранном ряду место.

Вам дана ширина сидений в каждом ряду, а также порядок, в котором входили пассажиры. Определите, на какой ряд сядет каждый из пассажиров.

Входные данные

В первой строке следует целое число \(n\) (\(1 \le n \le 200\,000\)) — количество рядов сидений в автобусе.

Во второй строке следует последовательность целых чисел \(w_1, w_2, \dots, w_n\) (\(1 \le w_i \le 10^{9}\)), где \(w_i\) равно ширине каждого из двух сидений в \(i\)-м ряду. Гарантируется, что все \(w_i\) различны.

В третьей строке следует строка длины \(2n\), состоящая из символов «0» и «1» — описание порядка, в котором пассажиры заходят в автобус. Если \(j\)-й символ строки равен «0», то на \(j\)-й остановке в автобус зашел интроверт. Если \(j\)-й символ строки равен «1», то на \(j\)-й остановке в автобус зашел экстраверт. Гарантируется, что интровертов и экстравертов, которые зашли в автобус, поровну (то есть по \(n\)), и для каждого экстраверта всегда найдется подходящий ряд.

Выходные данные

Выведите \(2n\) целых чисел — номера рядов, в которые сели пассажиры. Номера рядов для пассажиров должны быть выведены в том же порядке, в котором пассажиры заданы во входных данных.

Примечание

В первом примере первый пассажир (интроверт) выберет ряд номер \(2\), так как в нем самые узкие сиденья. Второй пассажир (интроверт) выберет ряд номер \(1\), так как это единственный оставшийся пустой ряд. Третий пассажир (экстраверт) выберет ряд номер \(1\), так как в нем уже сидит один пассажир и этот ряд самый широкий. Четвертый пассажир (экстраверт) выберет ряд номер \(2\), так как это единственный ряд, в котором осталось свободное место.

A. Конечна или нет?

математика реализация *1700

Вам дано несколько запросов. Каждый запрос описывается тремя числами \(p\), \(q\) и \(b\). Необходимо ответить, является ли результат выражения \(p/q\) в системе счисления по основанию \(b\) конечной дробью.

Дробь в системе счисления по основанию \(b\) является конечной, если содержит конечное число цифр после запятой, в том числе дробь может и не содержать цифр после запятой.

Входные данные

В первой строке дано целое число \(n\) (\(1 \le n \le 10^5\)) — количество запросов.

Далее следуют \(n\) строк, описывающих запросы, по одному в строке. Каждый запрос — три целых числа \(p\), \(q\) и \(b\) (\(0 \le p \le 10^{18}\), \(1 \le q \le 10^{18}\), \(2 \le b \le 10^{18}\)). Все числа даны в системе счисления по основанию \(10\).

Выходные данные

Для каждого запроса выведите в отдельной строке Finite, если дробь конечна, и Infinite — в противном случае.

Примечание

\(\frac{6}{12} = \frac{1}{2} = 0,5_{10}\)

\(\frac{4}{3} = 1,(3)_{10}\)

\(\frac{9}{36} = \frac{1}{4} = 0,01_2\)

\(\frac{4}{12} = \frac{1}{3} = 0,1_3\)

B. Сапёр

реализация *1100

Однажды Лёша решил вспомнить детство, когда компьютеры были не такими мощными, и многие играли только в стандартные игры. Лёша тогда любил играть в «Сапёра», представляя что спасает мир от бомб, заложенных террористами, но у него нечасто получалось выигрывать.

Но Лёша вырос, и поэтому сейчас с легкостью проходил самые сложные уровни. Это быстро ему наскучило, и он задумался: а что если в детстве компьютер подсовывал ему некорректные поля с бомбами, и поэтому Лёша не мог выиграть?

Чтобы проверить это, ему требуется ваша помощь.

Поле игры в «Сапер» представляет из себя прямоугольник \(n \times m\), каждая клетка в котором либо пустая, либо содержит бомбу, либо содержит цифру от \(1\) до \(8\). Поле является корректным, если для всех клеток выполняется следующее:

  • если в клетке записано число \(k\), то среди соседей данной клетки ровно \(k\) клеток с бомбами,
  • если клетка пустая, то среди ее соседей нет клеток с бомбами.

Соседними считаются клетки, имеющие общую вершину или сторону (т. е. у клетки может быть максимум \(8\) соседей).

Входные данные

В первой строке даны два целых числа \(n\) и \(m\) (\(1 \le n, m \le 100\)) — размеры поля.

В последующих \(n\) строках содержится описание поля. В каждой строке содержится по \(m\) символов, каждый из которых может быть либо «.» (пустая клетка), либо «*» (бомба), либо цифрой от \(1\) до \(8\) включительно.

Выходные данные

Выведите «YES», если поле корректно, иначе выведите «NO».

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

Во втором примере ответ «NO», потому что, если оставить позиции бомб такими же, то первая строка поля должны быть *2*1.

Подробнее про Сапёр можно прочитать в статье Википедии.

A. Расстановка шахмат

реализация *1100

У вас есть шахматная доска размера 1 × n. Гарантируется, что n четно. Доска раскрашена следующим образом: «BWBW...BW».

В некоторых клетках доски расположены шахматные фигуры. В каждой клетке расположено не более одной фигуры. Также известно, что общее количество фигур на доске равняется .

За один ход вы можете передвинуть любую фигуру на одну клетку от ее текущей позиции влево или вправо. Запрещено передвигать фигуры за границы доски. Также запрещено передвигать фигуры в клетки, в которых уже есть другие фигуры.

Ваша задача — за минимальное количество ходов расставить фигуры таким образом, чтобы все они располагались в клетках одинакового цвета (то есть после всех сделанных ходов все фигуры должны быть расположены либо только в черных клетках, либо только в белых клетках).

Входные данные

Первая строка входных данных содержит целое число n (2 ≤ n ≤ 100, n четно) — размер шахматной доски.

Вторая строка входных данных содержит целых чисел (1 ≤ pi ≤ n) — изначальные позиции шахматных фигур. Гарантируется, что все позиции различны.

Выходные данные

Выведите одно целое число — минимальное количество ходов, за которое вы можете расставить все фигуры в клетках одного цвета.

Примечание

В первом примере единственная возможная стратегия — передвинуть фигуру с позиции 6 на позицию 5 и передвинуть фигуру с позиции 2 на позицию 3. Заметьте, что если вы будете расставлять фигуры в клетки белого цвета, минимальное количество ходов будет равно 3.

Во втором примере возможна следующая стратегия: передвинуть за 4 хода, затем за 3 хода, за 2 хода и за 1 ход.

B. Переключатели и лампы

реализация *1200

Заданы n переключателей и m ламп. i-й переключатель включает некоторый поднабор ламп. Информация о них задана в виде матрицы a, состоящей из n строк и m столбцов, где ai, j = 1, если i-й переключатель включает j-ю лампу, и ai, j = 0, если i-й переключатель не подсоединен к j-й лампе.

В начале все m ламп выключены.

Переключатели изменяют состояние лампы только с «выключена» на «включена». Это значит, что если два или более переключателей подсоединены к одной лампе, то эта лампа включится, когда будет нажат любой из этих переключателей, и сохранит свое состояние даже если любой переключатель, подсоединенный к этой лампе, будет нажат позднее.

Гарантируется, что если нажать все n переключателей, то все m ламп окажутся включены.

Вы считаете, что у вас чересчур много переключателей, и хотели бы избавиться от одного из них.

Требуется сказать, существует ли такой переключатель, что если его не использовать, но нажать все остальные n - 1 переключателей, то все m ламп окажутся включены.

Входные данные

В первой строке записаны два целых числа n и m (1 ≤ n, m ≤ 2000) — количество переключателей и количество ламп.

В следующих n строках содержится по m символов. ai, j равно '1', если i-й переключатель включает j-ю лампу и '0' в противном случае.

Гарантируется, что если нажать все n переключателей, то все m ламп окажутся включены.

Выходные данные

Выведите «YES», если существует такой переключатель, что если его не использовать, но нажать все остальные n - 1 переключателей, то все m ламп окажутся включены. Выведите «NO», если нет такого переключателя.

A. Перчатка бесконечности

реализация *800

Вы мельком увидели Таноса с Перчаткой бесконечности на руке. В перчатке есть места для шести камней бесконечности:

  • камня силы (Power) пурпурного (purple) цвета,
  • камня времени (Time) зеленого (green) цвета,
  • камня пространства (Space) синего (blue) цвета,
  • камня души (Soul) оранжевого (orange) цвета,
  • камня реальности (Reality) красного (red) цвета,
  • камня разума (Mind) желтого (yellow) цвета.

По цветам камней, присутствующим в перчатке, определите названия недостающих камней.

Входные данные

Первая строка содержит одно целое число \(n\) (\(0 \le n \le 6\)) — число камней в перчатке у Таноса.

Следующие \(n\) строк содержат цвета камней в перчатке по одному в строке. Цвета обозначаются английскими словами из строчных букв: purple — фиолетовый, green — зеленый, blue — синий, orange — оранжевый, red — красный, yellow — желтый. Гарантируется, что все цвета различны.

Выходные данные

Выведите в первой строке одно целое число \(m\) (\(0 \le m \le 6\)) — число недостающих камней.

Далее выведите \(m\) строк с названиями недостающих камней по одному в строке. Названия следует выводить английскими словами, первая буква — заглавная, остальные строчные: камень силы — Power, камень времени — Time, камень пространства — Space, камень души — Soul, камень реальности — Reality, камень разума — Mind. Названия могут быть выведены в любом порядке.

Примечание

В первом примере у Таноса в перчатке уже есть камни Reality, Power, Mind и Soul, поэтому ему недостает двух камней Time и Space.

Во втором примере у Таноса в перчатке нет ни одного камня, поэтому ему недостает камней всех шести имеющихся видов.

C. Три табло

дп Перебор реализация *1400

Середина 2018-го года и на границе Краснокаменска, что в Забайкальском крае, Мария Степановна хочет арендовать три электронных табло для обращения внимания жителей на важную проблему.

Вдоль дороги в один ряд стоят \(n\) электронных табло, причем на \(i\)-м табло текст может отображаться только со шрифтом размера \(s_i\). Мария Степановна хочет арендовать три таких табло с индексами \(i < j < k\), что размер шрифта строго увеличиваются при проезде в определенную сторону, а именно, должно выполняться \(s_i < s_j < s_k\).

Стоимость аренды \(i\)-го табло равна \(c_i\). Определите, какую минимальную стоимость должна заплатить Мария Степановна.

Входные данные

В первой строке находится одно целое число \(n\) (\(3 \le n \le 3\,000\)) — число электронных табло.

Во второй строке находятся \(n\) целых чисел \(s_1, s_2, \ldots, s_n\) (\(1 \le s_i \le 10^9\)) — размеры шрифтов на табло при движении вдоль дороги.

В третьей строке находятся \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \le c_i \le 10^8\)) — стоимости аренды табло.

Выходные данные

Если не существует трех подходящих табло, выведите -1. В противном случае, выведите одно целое число — минимальную стоимость аренды трех табло с индексами \(i < j < k\) таких, что \(s_i < s_j < s_k\).

Примечание

В первом примере можно, например, выбрать табло \(1\), \(4\) и \(5\), так как \(s_1 < s_4 < s_5\) (\(2 < 4 < 10\)), а суммарная стоимость равна \(40 + 10 + 40 = 90\).

Во втором примере невозможно выбрать подходящую тройку табло, поэтому ответ -1.

A. Разнообразная команда

Перебор реализация *800

В классе учится \(n\) школьников, рейтинг \(i\)-го из них на сайте Codehorses равен \(a_i\). Требуется выбрать команду из \(k\) школьников (\(1 \le k \le n\)) такую, что рейтинги всех членов этой команды различны.

Если невозможно выбрать требуемую команду, выведите «NO» (без кавычек). Иначе же выведите «YES» и \(k\) различных чисел — номера школьников, которые могут составить требуемую команду. Если ответов несколько, то выведите любой из них.

Входные данные

В первой строке входных данных записано два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 100\)) — количество школьников и размер команды.

В следующей строке записано \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)), где \(a_i\) — рейтинг \(i\)-го школьника.

Выходные данные

Если невозможно выбрать требуемую команду, выведите «NO» (без кавычек). Иначе в первую стороку выведите «YES». Во вторую строку выведите \(k\) различных целых чисел от \(1\) до \(n\) — номера школьников, которые могут составить требуемую команду. Все рейтинги членов выбранной команды должны быть различны. Номера можно выводить в любом порядке. Если ответов несколько, то выведите любой из них.

Считайте, что школьники пронумерованы от \(1\) до \(n\).

Примечание

Все возможные ответы для первого тестового примера:

  • {1 2 5}
  • {2 3 5}
  • {2 4 5}

Заметьте, что порядок не важен.

C. Одинаковые суммы

реализация сортировки *1400

Заданы \(k\) последовательностей целых чисел. Длина \(i\)-й последовательности равна \(n_i\).

Выберите ровно две такие последовательности \(i\) и \(j\) (\(i \ne j\)), что в каждой из этих двух последовательностей возможно удалить ровно один элемент так, что сумма элементов измененной последовательности \(i\) (теперь ее длина равна \(n_i - 1\)) равна сумме элементов измененной последовательности \(j\) (теперь ее длина \(n_j - 1\)).

Заметим, что в каждой из двух выбранных последовательностей надо обязательно удалить ровно один элемент.

Следует считать, что сумма пустой (то есть длины \(0\)) последовательности равна \(0\).

Входные данные

В первой строке входных данных записано целое число \(k\) (\(2 \le k \le 2 \cdot 10^5\)) — количество последовательностей.

Далее записаны \(k\) заданных последовательностей, каждая последовательность занимает две строки входных данных.

Первая из двух строк, описывающих \(i\)-ю последовательность, содержит целое число \(n_i\) (\(1 \le n_i < 2 \cdot 10^5\)) — длину \(i\)-й последовательности. Вторая из двух строк, описывающих \(i\)-ю последовательность, содержит последовательность из \(n_i\) целых чисел \(a_{i, 1}, a_{i, 2}, \dots, a_{i, n_i}\).

Элементы всех последовательностей являются целыми числами от \(-10^4\) до \(10^4\) включительно.

Сумма длин всех последовательностей не превосходит \(2 \cdot 10^5\), то есть \(n_1 + n_2 + \dots + n_k \le 2 \cdot 10^5\).

Выходные данные

Если выбрать пару последовательность требуемым образом невозможно, выведите «NO» (без кавычек). Иначе в первую строку выведите «YES» (без кавычек), во вторую — пару целых чисел \(i\), \(x\) (\(1 \le i \le k, 1 \le x \le n_i\)), в третью — пару целых чисел \(j\), \(y\) (\(1 \le j \le k, 1 \le y \le n_j\)). Вывод означает, что сумма всех элементов \(i\)-й последовательности без элемента с индексом \(x\) равна сумме всех элементов \(j\)-й последовательности без элемента с индексом \(y\).

Пара найденных последовательностей должна иметь различные номера, то есть \(i \ne j\). Их можно выводить в любом порядке.

Если решений несколько, выведите любое из них.

Примечание

В первом примере заданы только две последовательности \([2, 3, 1, 3, 2]\) и \([1, 1, 2, 2, 2, 1]\). Вы можете удалить второй элемент из первой из них, чтобы получить \([2, 1, 3, 2]\) и можете удалить шестой элемент из второй, чтобы получить \([1, 1, 2, 2, 2]\). Суммы полученных последовательностей будут равны \(8\), то есть будут иметь одинаковое значение.

A. Весенний микс

реализация Строки *900

Откройте шторы, и вы увидите прекрасный вид. Канно наслаждается видом около реки, наполненным светлыми оттенками. Это не мандарины, а цветы.

— Как жаль, что уже поздняя весна, — с сожалением вздыхает Мино, — еще одна прохладная ночь, и они исчезнут.

— Но ведь сейчас эти краски выглядят лучше всего? — впечатленный пейзажем Канно оптимистичен.

Поле может быть представлено как ряд из клеток, каждая из которых либо содержит цветок аврорового, ванильного или солнечно-желтого цвета, либо пустая.

Когда цветок увядает, он пропадает из своей клетки и раскидывает лепестки своего цвета в две соседние клетки (или за границу поля, если эта клетка крайняя). Лепестки, падающие за границу поля, сразу становятся не видны.

Помогите Канно определить, возможно ли такое, что после того, как некоторые (возможно, все или ни одного) цветки увянут, как минимум в одной клетке будут находится все три цвета, если учитывать опавшие лепестки и еще не увядшие цветы. Обратите внимание, цветы могут увядать в любом порядке.

Входные данные

Первая и единственная строка содержит непустую строку \(s\), состоящую из заглавных латинских букв «A», «B», «C» и символов «.» (точек) (\(\lvert s \rvert \leq 100\)), где символы обозначают цветки аврорового, ванильного и солнечно-желтого цвета и пустую клетку, соответственно.

Выходные данные

Выведите «Yes», если возможно, что все три цвета появятся в какой-то клетке, и «No» в противном случае.

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

В первом примере если цветки ванильного и солнечно-желтого цвета увянут, то они оставят свои лепестки в центральной клетке, где в таком случае будут находиться все три цвета.

Во втором примере все три цвета не могут находиться в одной клетке, поскольку этого нельзя добиться, например, для аврорового и ванильного цветов.

B. Помогите Повару Герасиму

реализация сортировки *1300

В Тридевятом царстве, Тридесятом государстве накрывать на царский стол дворцовой кухне помогают юные пажи. Поскольку они ужасные шалуны, за ними нужно следить, контролируя, правильно ли они накрыли на царский стол. На этот раз царскому повару Герасиму опять показалось, что пажи устроили шалость: перелили компот из одного кубка в другой. Теперь Герасим хочет проверить свою гипотезу. Благо, во все кубки во дворцовой кухне всегда наливают одинаковое количество миллилитров компота. После проведения тщательных измерений компота в каждом кубке, Герасим обратился к вам за программой, которая определит, из какого в какой кубок был перелит компот, или установит, что на этот раз в столовой работали примерные пажи.

Для облегчения вашей задачи будем предполагать, что все кубки бездонные, и компот из них не выливается при любом его объеме. Кроме того, по странному стечению обстоятельств в Тридевятом царстве налить в кубок или перелить из кубка можно только целое число миллилитров компота.

Входные данные

В первой строке записано целое число n — количество кубков на царском столе (1 ≤ n ≤ 1000). В следующих n строках записаны объемы компота, налитого в каждый кубок — целые неотрицательные числа, не превышающие 104.

Выходные данные

Если пажи не переливали компот, выведите сообщение «Exemplary pages.» (без кавычек). Если можно установить объем перелитого в результате одного переливания компота, выведите сообщение «v ml. from cup #a to cup #b.» (без кавычек), где вместо v выведите объем перелитого компота, вместо a — номер кубка, из которого переливался компот (нумерация кубков ведется последовательными натуральными числами начиная с 1 в порядке описания кубков во входных данных), вместо b — номер кубка, в который переливался компот. Наконец, если исходные объемы компота не могли быть получены при помощи не более чем одного переливания (например, переливания происходили не один раз, или работники дворцовой кухни ошиблись при наливании компота в кубки), выведите сообщение «Unrecoverable configuration.» (без кавычек).

A. Комментаторские кабинки

математика реализация *1000

Чемпионат по футболу в Берляндии начнется уже скоро! На него съедутся комментаторы со всего мира.

Организаторы уже построили \(n\) комментаторских кабинок. Всего на Чемпионат приедут \(m\) различных делегаций. С одной стороны, каждая делегация должна получить одинаковое количество кабинок. С другой стороны, если останется хотя бы одна незанятая кабинка, все делегации сильно расстроятся. Поэтому, каждая кабинка должна быть занята ровно одной делегацией.

Если \(n\) не делится на \(m\), то в данный момент невозможно распределить комментаторские кабинки по делегациям.

У организаторов все еще есть время, поэтому они могут строить кабинки, затрачивая \(a\) бурлей за каждую, и (или) сносить кабинки, затрачивая на это \(b\) бурлей за каждую. Они могут как строить, так и сносить произвольное количество кабинок (затрачивая на каждую соответствующее количество бурлей). Они могут позволить себе даже снести все существующие кабинки.

Какое минимальное количество бурлей организаторы должны потратить, чтобы выполнить требования делегаций (другими словами, сделать количество кабинок кратным \(m\))?

Входные данные

В единственной строке заданы четыре целых числа через пробел \(n\), \(m\), \(a\) и \(b\) (\(1 \le n, m \le 10^{12}\), \(1 \le a, b \le 100\)), где \(n\) — начальное количество кабинок, \(m\) — количество приезжающих делегаций, \(a\) — стоимость постройки новой кабинки и \(b\) — стоимость сноса некоторой кабинки.

Выходные данные

Выведите минимальное количество бурлей, необходимых для выполнения требований делегаций (другими словами, чтобы сделать количество кабинок кратным \(m\)). Итоговое количество кабинок может равняться \(0\).

Примечание

В первом примере организаторы могут построить \(5\) кабинок, заплатив по \(3\) бурля за каждую. Всего кабинок станет \(14\).

Во втором примере организаторы могут снести все \(2\) кабинки, заплатив по \(7\) бурлей за каждую. Всего кабинок станет \(0\).

В третьем примере организаторы уже могут распределить кабинки по делегациям, каждая делегация получит в пользование по \(5\) кабинок.

C. Конкатенация скобочных последовательностей

реализация *1500

Скобочной последовательностью называется строка, состоящая только из символов «(» и «)».

Правильной скобочной последовательностью называется скобочная последовательность, которую можно преобразовать в корректное арифметическое выражение путем вставок между ее символами символов «1» и «+». Например, скобочные последовательности «()()», «(())» — правильные (полученные выражения: «(1)+(1)», «((1+1)+1)»), а «)(» и «(» — нет.

Вам задано \(n\) скобочных последовательностей \(s_1, s_2, \dots , s_n\). Найдите количество пар \(i, j \, (1 \le i, j \le n)\), таких что скобочная последовательность \(s_i + s_j\) является правильной скобочной последовательностью. Операция \(+\) означает конкатенацию, т. е. "()(" + ")()" = "()()()".

Если \(s_i + s_j\) и \(s_j + s_i\) являются правильными скобочными последовательностями и \(i \ne j\), в ответе должны учитываться обе пары \((i, j)\) и \((j, i)\). Также если строка \(s_i + s_i\) является правильной скобочной последовательностью, пара \((i, i)\) должна учитываться в ответе.

Входные данные

В первой строке задано число \(n \, (1 \le n \le 3 \cdot 10^5)\) — количество скобочных последовательностей. В следующих \(n\) строках содержатся скобочные последовательности — непустые строки, состоящие только из символов «(» и «)». Сумма длин всех скобочных последовательностей не превосходит \(3 \cdot 10^5\).

Выходные данные

В единственной строке выведите целое число — количество пар \(i, j \, (1 \le i, j \le n)\), таких, что скобочная последовательность \(s_i + s_j\) является правильной скобочной последовательностью.

Примечание

В первом тестовом примере подходящие пары \((3, 1)\) и \((2, 2)\).

Во втором тестовом примере любая пара подходит, а именно \((1, 1), (1, 2), (2, 1), (2, 2)\).

D. Граф и его дополнение

графы Конструктив реализация *1700

Заданы три числа \(n, a, b\). Вам нужно найти матрицу смежности такого неориентированного графа, что количество компонент связанности в нем равно \(a\), а количество компонент связанности в его дополнении равно \(b\). Найденная матрица обязательно должна быть симметричной, а также на главной диагонали обязательно должны быть нули.

В неориентированном графе недопустимы петли (ребра из вершины в себя же), между каждой парой вершин может быть не более одного ребра.

Матрица смежности неориентированного графа — это квадратная матрица размера \(n\), состоящая только из «0» и «1», где \(n\) — количество вершин графа, а \(i\)-я строка и \(i\)-й столбец соответствуют \(i\)-й вершине графа. Ячейка \((i,j)\) матрицы смежности содержит \(1\) тогда и только тогда, когда \(i\)-я и \(j\)-я вершины в графе соединены ребром.

Компонента связанности — это такой набор вершин \(X\), что для любой пары вершин в компоненте существует хотя бы один путь, соединяющий их, и добавление любой новой вершины в \(X\) нарушает это правило.

Дополнением графа \(G\) называется граф \(H\) с теми же вершинами, такой, что две вершины графа \(H\) соединены ребром тогда и только тогда, когда эти вершины не соединены ребром в графе \(G\).

Входные данные

В единственной строке заданы три числа \(n, a, b \,(1 \le n \le 1000, 1 \le a, b \le n)\) — количество вершин графа, необходимое количество компонент связанности в нем и необходимое количество компонент связанности в его дополнении.

Выходные данные

Если не существует графа, удовлетворяющего данным ограничениям в единственную строку выведите «NO»(без кавычек).

Иначе в первой строке выведите «YES»(без кавычек). В следующих \(n\) строках выведите по \(n\) цифр в каждой — матрицу смежности данного графа, т. е. \(i\)-е цифра в \(j\)-й строке должна быть равна \(1\), если в \(G\) существует ребро между вершинами \(i\) и \(j\) (иначе эта цифра должна быть равна \(0\)).

Обратите внимание, что выведенная матрица обязательно должна быть симметричной, а также на главной диагонали обязательно должны быть нули.

Если существует несколько матриц, удовлетворяющих условиям — выведите любую из них.

A. Пересдача

реализация *1000

Успешная сдача экзамена — праздник для любого студента. Вот и Вася готов был отправиться отмечать это знаменательное событие, но экзамен он не сдал. Однако, многие одногруппники Васи были более успешны и пошли праздновать.

Часть из них отмечала успех в ресторане BugDonalds, часть — в ресторане BeaverKing, наиболее успешные студенты успели на праздник в обоих ресторанах. Не сдавшие экзамен не пошли праздновать. Подготовка к экзамену быстро надоела Васе и он занялся привычным делом — просмотром фотографий в сети Kilogramm. Он посчитал, что BugDonalds всего посетило \(A\) студентов, а BeaverKing — \(B\) студентов, при этом \(C\) студентов посетили оба ресторана. Наконец, Вася знает, что всего в группе \(N\) студентов.

Основываясь на этой информации, Вася хочет определить, сколько же студентов его группы не сдали экзамен? А может быть, его данные противоречивы? Помогите Васе разобраться с этой задачей, чтобы он мог вернуться к подготовке к экзамену как можно скорее.

Входные данные

В первой строке содержатся четыре целых неотрицательных числа — \(A\), \(B\), \(C\) и \(N\) (\(0 \leq A, B, C, N \leq 100\)).

Выходные данные

Если существует такое распределение, что из \(N\) студентов \(A\) посетили BugDonalds, \(B\) — BeaverKing, \(C\) — оба ресторана, и при этом хотя бы один студент остался дома (известно, что хотя бы Вася не сдал экзамен и не пошел праздновать), то следует вывести единственное число — количество студентов (включая Васю), которые не сдали экзамен.

Если же Вася ошибся в определении чисел (\(A\), \(B\), \(C\) или даже \(N\)) и описанная ситуация невозможна (см. примеры 2 и 3), то следует вывести \(-1\).

Примечание

В первом примере описана такая ситуация: \(5\) студентов посетили только BugDonalds, \(5\) студентов — только BeaverKing, \(5\) — оба ресторана и \(5\) студентов (включая Васю) не сдали экзамен.

Во втором примере \(2\) человека посетили BugDonalds, \(2\) — BeaverKing, тогда получается, что все \(4\) студента группы экзамен сдали, однако, известно, что Вася экзамен не сдал, значит, такой ситуации быть не может.

В третьем примере описана явно противоречивая ситуация: \(2\) студента посетили BugDonalds, но при этом в группе всего \(1\) студент. Такого быть не может.

C. Эклеры

Бинарный поиск реализация *1500

После успешной сдачи всех зачетов Вася купил себе в подарок коробку, содержащую \(n\) сладких эклеров. Вася решил каждое утро есть некоторое одинаковое число эклеров, пока они все не закончатся. Однако сосед Васи, Петя, заметил принесенную Васей коробку и тоже решил насладиться вкусом эклеров.

Теперь процесс поедания эклеров выглядит следующим образом: сначала Вася выбирает число \(k\), одинаковое для всех дней. Затем утром он съедает \(k\) эклеров из коробки (или доедает все эклеры, если их осталось меньше \(k\)), после этого Петя вечером съедает \(10\%\) оставшихся эклеров. Если эклеры еще не закончились, то на следующий день Вася опять съедает \(k\) эклеров, а Петя — \(10\%\) от оставшихся и так далее.

Если число эклеров не делится на \(10\), то Петя округляет «свою» долю в меньшую сторону, например, если в коробке было \(97\) эклеров, то Петя съест только \(9\) из них. В частности, если в коробке уже меньше \(10\) эклеров, то Петя не будет их есть вообще.

Определите, какое наименьшее число \(k\) может выбрать Вася такое, что он съест не менее половины от всех \(n\) эклеров, которые были в коробке изначально. Заметьте, что число \(k\) должно быть натуральным.

Входные данные

В первой строке содержится натуральное число \(n\) (\(1 \leq n \leq 10^{18}\)) — изначальное количество эклеров.

Выходные данные

Вывести единственное число — наименьшее значение \(k\), удовлетворяющее Васю.

Примечание

В примере количество эклеров при \(k=3\) будет изменяться следующим образом (первым ест Вася):

\(68 \to 65 \to 59 \to 56 \to 51 \to 48 \to 44 \to 41 \\ \to 37 \to 34 \to 31 \to 28 \to 26 \to 23 \to 21 \to 18 \to 17 \to 14 \\ \to 13 \to 10 \to 9 \to 6 \to 6 \to 3 \to 3 \to 0\).

Итого, Вася съест \(39\) эклеров, а Петя — \(29\).

F. Отобразить число

жадные алгоритмы математика Перебор реализация *2700

Вася регулярно участвует в соревнованиях по программированию. Он уже привык к достаточно длинным условиям задач и научился быстро выделять важные предложения среди множества слов. Разумеется, ограничения на входные данные и другие числа в описании задачи — очень важная часть условий, например, разложить на простые множители число до 1000000 проще, чем число до 1000000000. Однако, Вася заметил, что зачастую запись числа получается очень длинной и сложной для восприятия. Может, авторы задачи могли ее сократить? Например, вместо 1000000 можно написать \(10^{6}\), вместо 1000000000\(10^{9}\), а вместо 1000000007\(10^{9}+7\).

Вася решил, что запись числа для удобства восприятия должна подчиняться следующим правилам:

  • запись должна содержать только числа, операции сложения («+»), умножения («*») и возведения в степень («^»), в частности, использование скобок не допускается;
  • нельзя использовать несколько операций возведения в степень подряд, например, запись «2^3^4» недопустима;
  • значение записанного выражения должно равняться исходному числу;
  • запись должна содержать наименьшее возможное количество символов.

По заданному числу \(n\) найдите для него эквивалентную запись, удобную для восприятия.

Входные данные

Единственная строка содержит натуральное число \(n\) (\(1 \leq n \leq 10\,000\,000\,000\)).

Выходные данные

Вывести удобную для восприятия запись числа \(n\). Если существует несколько таких записей, выведите любую из них.

Примечание

В третьем примере так же допустим ответ 10^10, тоже имеющий длину \(5\).

A. Настя и массив

реализация сортировки *800

Последнее время у Насти стало слишком много массивов, поэтому она решила удалить самый ненужный из них. Неожиданно самый ненужный массив оказался волшебным! Настя выяснила, что он обладает следующими свойствами:

  • За одну секунду можно прибавить любое (возможно, отрицательное) число ко всем элементам массива, не равным нулю.
  • В тот момент, когда все элементы массива становятся равны нулю, массив взрывается.

Настя, будучи очень занятой особой, хочет как можно быстрее взорвать массив. Найдите минимальное время, необходимое для взрыва массива.

Входные данные

Первая строка содержит одно целое число n (1 ≤ n ≤ 105) — размер массива.

Вторая строка содержит n целых чисел a1, a2, ..., an ( - 105 ≤ ai ≤ 105) — элементы массива.

Выходные данные

Выведите одно число — минимальное количество секунд, требуемое для того, чтобы сделать все элементы массива равными нулю.

Примечание

В первом тесте можно сделать все элементы равными нулю за одну секунду — добавить ко всем элементам  - 1.

Во втором тесте на первой секунде можно добавить  - 2. Таким образом, массив примет вид [0, 0,  - 3]. На второй секунде добавим 3 к третьему (единственному ненулевому) элементу.

D. Настя и игра

математика Перебор реализация *2100

На день рождения Насте подарили еще один массив, на котором можно играть в широко известную в Байтландии национальную игру. Однако, для этой игры нужно сначала выбрать такой подотрезок массива, что , где p — произведение всех чисел на этом отрезке, s — их сумма, а k — константа, одинаковая для всего массива.

Насте стало интересно, а сколько подотрезков массива удовлетворяют вышеописанным условиям? Подотрезком называется несколько подряд идущих элементов массива.

Входные данные

В первой строке входных данных записаны два целых числа n и k (1 ≤ n ≤ 2·105, 1 ≤ k ≤ 105), где n — длина массива, а k — константа, описанная выше.

Вторая строка содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 108) — элементы массива.

Выходные данные

В единственной строке требуется вывести количество подотрезков массива, на которых отношение произведения к сумме элементов равно k.

Примечание

В первом примере единственный подотрезок в массиве — [1]. В нем сумма равна 1, произведение равно 1, значит, он подходит под условие, так как .

Во втором примере есть два подходящих подотрезка — [6, 3] и [3, 8, 1]. Подотрезок [6, 3] имеет сумму 9, а произведение 18, следовательно, подходит, так как . Подотрезок [3, 8, 1] имеет сумму 12, а произведение 24, следовательно, подходит, так как . Все остальные подотрезки массива не подходят.

A. Два квадрата

геометрия реализация *1600

Вам даны два квадрата: один со сторонами параллельными осям координат, и один со сторонами под углом 45 градусов к осям координат. Определите, пересекаются ли квадраты.

Внутренность квадрата считается его частью, иными словами, если один квадрат находится целиком внутри другого квадрата, они пересекаются. Если у квадратов одна общая точка, они также пересекаются.

Входные данные

Входные данные состоят из двух строк, по одной на квадрат, в каждой по четыре пары целых чисел. Каждая пара чисел задает координаты одной вершины квадрата. Координаты для каждого квадрата даны в порядке обхода по или против часовой стрелки.

Первая строка содержит координаты вершин квадрата, у которого стороны параллельны осям координат, вторая строка — у которого стороны образуют с осями координат угол 45 градусов.

Все числа во входных данных целые и лежат в интервале между \(-100\) и \(100\).

Выходные данные

Выведите «Yes», если квадраты пересекаются, иначе выведите «No».

Вы можете выводить каждую из букв в любом регистре (строчную или заглавную).

Примечание

В первом примере второй квадрат лежит целиком внутри первого, что по условию является пересечением.

Во втором примере два квадрата не имеют общих точек.

Картинки, иллюстрирующие примеры:

A. Отпечатки пальцев

реализация *800

Вы заперты в комнате, на двери которой висит цифровой замок с 10 кнопками, соответствующими цифрам от 0 до 9. Чтобы открыть дверь, надо ввести правильный код на замке. У вас также есть некоторая последовательность цифр.

На некоторых кнопках цифрового замка есть отпечатки пальцев. Вы верите, что правильный код от замка — это самая длинная подпоследовательность (возможно, с пропусками) последовательности, которую вы знаете, в которой каждая цифра имеет отпечатки пальцев на соответствующей ей кнопке. Найдите такой код.

Входные данные

Первая строка содержит два целых числа \(n\) и \(m\) (\(1 \le n, m \le 10\)) — количество цифр в известной вам последовательности, и количество кнопок на замке, на которых есть отпечатки.

Следующая строка содержит \(n\) разделенных пробелом различных целых чисел \(x_1, x_2, \ldots, x_n\) (\(0 \le x_i \le 9\)) — известная вам последовательность.

Следующая строка содержит \(m\) разделенных пробелом различных целых чисел \(y_1, y_2, \ldots, y_m\) (\(0 \le y_i \le 9\)) – кнопки, на которых есть отпечатки.

Выходные данные

В единственной строке выведите через пробел цифры кода. Если код пустой, то можно как оставить вывод пустым, так и вывести один перевод строки.

Примечание

В первом тесте три кнопки имеют отпечатки: \(1\), \(2\) и \(7\). Все три встречаются в последовательности: сначала \(7\), затем \(1\) и затем \(2\). Таким образом, правильный вывод — 7 1 2. Обратите внимание, что порядок важен, и должен быть таким же, как порядок в данной последовательности.

Во втором примере на кнопках с \(0\), \(1\), \(7\) и \(9\) есть отпечатки, но только \(0\) и \(1\) встречаются в данной последовательности. \(1\) встречается раньше, поэтому правильный вывод — 1 0. Порядок важен.

B. Рыцари многоугольного стола

жадные алгоритмы реализация сортировки *1400

В отличие от Рыцарей Круглого Стола, Рыцари Многоугольного Стола обделены благородством и с радостью убьют друг друга. Однако каждый рыцарь обладает своей силой, и один рыцарь может убить другого только если его сила больше, чем сила жертвы. Однако даже такого рыцаря будет мучить совесть, поэтому рыцарь может убить максимум \(k\) других рыцарей.

Также у каждого рыцаря есть некоторое количество монет. При убийстве рыцарь может забрать все монеты своей жертвы.

Сейчас каждый рыцарь задумался: а какое наибольшее количество монет у него может оказаться, если убивать других рыцарей будет только он?

Вам предстоит ответить на этот вопрос для каждого рыцаря.

Входные данные

В первой строке даны два числа \(n\) и \(k\) \((1 \le n \le 10^5, 0 \le k \le \min(n-1,10))\) — количество рыцарей и число \(k\), описанное в условии.

Во второй строке записаны \(n\) чисел \(p_1, p_2 ,\ldots,p_n\) \((1 \le p_i \le 10^9)\) — силы рыцарей. Все \(p_i\) различны.

В третьей строке записаны \(n\) чисел \(c_1, c_2 ,\ldots,c_n\) \((0 \le c_i \le 10^9)\) — количества монет у рыцарей.

Выходные данные

Выведите \(n\) чисел — наибольшее количество монет у каждого рыцаря.

Примечание

Рассмотрим первый пример.

  • Первый рыцарь самый слабый, он не может никого убить, поэтому у него максимум может быть только одна монета.
  • Второй рыцарь может убить первого и забрать его монету в дополнение к двум своим.
  • Третий рыцарь сильнее всех, но так как он максимум может убить \(k = 2\) рыцарей, то выгоднее всего забрать монеты у второго и четвертого рыцаря: \(2+11+33 = 46\).
  • Четвертый рыцарь должен забрать монеты у первого и второго: \(33+1+2 = 36\).

Во втором примере первый рыцарь не может никого убить, а все остальные должны убить одного рыцаря, имеющего номер, на один меньший.

В третьем примере всего один рыцарь, он не может никого убить, хотя очень хочет.

A. Тесла

Конструктив реализация *2100

Аллен мечтает, что когда-нибудь у него будет большой парк электрокаров — машин будущего. Как только Аллен задумался о том, какие у него будут машины и как он будет их расставлять, он столкнулся с проблемой.

Будущая парковка Аллена может быть представлена как таблица из \(4\) строк и \(n\) (\(n \le 50\)) столбцов, каждая клетка которой может вместить в любой момент времени ровно одну машину. У Аллена будет \(k\) (\(k \le 2n\)) машин на парковке, все машины изначально расположены во второй и третьей строках. У каждой машины есть предназначенное для нее место в первом или четвертом ряду. Аллену нужно переместить каждую машину на соответствующее ей парковочное место.

Иллюстрация к первому примеру.

Сложность состоит в том, что Аллен не может никому доверить машины, поэтому одновременно может двигаться только одна машина. За один шаг он может переместить любую машину в любом из четырех направлений на соседнее пустое место. Однако, машину можно передвигать в первый и четвертый ряд, только если это — соответствующее машине парковочное место.

Аллен будет очень занятым, поэтому у него будет время только на \(20000\) передвижений машин. Помогите Аллену найти способ расставить машины на соответствующие парковочные места, или определите, что это невозможно.

Входные данные

Первая строка содержит два целых числа \(n\) и \(k\) (\(1 \le n \le 50\), \(1 \le k \le 2n\)), обозначающие число столбцов в таблице и число машин, соответственно.

Следующие четыре строки содержат по \(n\) целых чисел, каждов от \(0\) до \(k\) включительно, они описывают начальное состояние парковки. Строки пронумерованы от \(1\) до \(4\) сверху вниз, а столбцы пронумерованы от \(1\) до \(n\) слева направо.

В первой и последней строке целое число \(1 \le x \le k\) обозначает парковочное место машины \(x\) (сюда может заезжать только эта машина), а число \(0\) означает пустое место (сюда не может заехать ни одна машина).

Во второй и третьей строках целое число \(1 \le x \le k\) обозначает начальную позицию машины \(x\), а число \(0\) обозначает пустое место (на него могут заезжать все машины).

Каждое число \(x\) между \(1\) и \(k\) встречается ровно один раз во второй и третьей строках, и ровно один раз в первой и четвертой строках.

Выходные данные

Если есть последовательность передвижений машин такая, что все машины окажутся на своих местах за не более чем \(20000\) шагов, выведите \(m\), число шагов, на первой строке. В следующих \(m\) строках выведите шаги по одному в строке в формате \(i\) \(r\) \(c\), что означает, что Аллен должен подвинуть машину \(i\) на соседнее место в строке \(r\) и столбце \(c\).

Если невозможно передвинуть все машины на правильные места за \(20000\) шагов, выведите \(-1\) в единственной строке.

Примечание

В первом примере все машины уже располагаются перед соответствующими парковочными местами, кроме машины \(5\), которая находится напротив соседнего места. Пример показывает кратчайшее решение, но будет зачтено любое длины не более \(20000\).

Во втором примере есть только один столбец, и машины находятся в неправильном порядке, поэтому они не могут двигаться и расставить их правильным образом невозможно.

B. Костюм с галстуком

жадные алгоритмы математика реализация *1400

Аллен собрал вечеринку в формальном стиле. Пришло \(2n\) человек, образующих \(n\) пар. После веселья Аллен хочет выстроить всех в ряд, чтобы сделать общую фотографию. \(2n\) гостей встали в ряд, но Аллену не нравится порядок. Аллен хочет, чтобы каждая пара располагалась рядом, это сделает фотографию более эстетичной.

Определите для Аллена минимальное число обмена мест людей на соседних позициях, необходимое для того, чтобы каждая пара занимала соседние места в ряду.

Входные данные

Первая строка содержит одно целое число \(n\) (\(1 \le n \le 100\)) — количество пар людей.

Вторая строка содержит \(2n\) целых чисел \(a_1, a_2, \dots, a_{2n}\). Для каждого \(i\), удовлетворяющего \(1 \le i \le n\), \(i\) встречается в этом списке ровно два раза. Если \(a_j = a_k = i\), то люди на \(j\)-м и на \(k\)-м местах образуют пару.

Выходные данные

Выведите одно целое число — минимальное число обменов местами соседних людей для того, чтобы каждая пара занимала соседние позиции.

Примечание

В первом примере можно добиться результата следующим образом: \(1 1 2 3 3 2 4 4 \rightarrow 1 1 2 3 2 3 4 4 \rightarrow 1 1 2 2 3 3 4 4\) за два шага. Обратите внимание, что последовательность \(1 1 2 3 3 2 4 4 \rightarrow 1 1 3 2 3 2 4 4 \rightarrow 1 1 3 3 2 2 4 4\) тоже подходит.

Во втором примере все пары уже стоят рядом, поэтому ответ \(0\).

A. Превратить в единицы

жадные алгоритмы математика Перебор реализация *1500

Вам дана строка \(a_1, a_2, \dots, a_n\), состоящая из нулей и единиц.

Назовем последовательность подряд идущих элементов \(a_i, a_{i + 1}, \ldots, a_j\) (\(1\leq i\leq j\leq n\)) подстрокой строки \(a\).

К строке можно неограниченное количество раз последовательно применять следующие операции:

  • выбрать любую подстроку (в частности, допустимо выбрать всю строку) строки \(a\) и развернуть ее, заплатив за это \(x\) монет (например, «0101101» \(\to\) «0111001»);
  • выбрать любую подстроку (в частности, допустимо выбрать всю строку или один символ) строки \(a\) и заменить каждый символ на противоположный ему (то есть нули заменяются на единицы, а единицы — на нули), заплатив за это \(y\) монет (например, «0101101» \(\to\) «0110001»).

Вы можете применять операции в любом порядке. Допустимо к одной и той же подстроке применять любую или обе операции неоднократно.

Какое минимальное количество монет потребуется потратить, чтобы получить строку, состоящую только из единиц?

Входные данные

В первой строке записаны целые числа \(n\), \(x\) и \(y\) (\(1 \leq n \leq 300\,000, 0 \leq x, y \leq 10^9\)) — длина строки, стоимость первой операции (разворота подотрезка) и стоимость второй операции (инвертирования всех элементов некоторого подотрезка) соответственно.

Во второй строке записана строка \(a\) длины \(n\), состоящая из нулей и единиц.

Выходные данные

Выведите единственное целое число — минимальную суммарную стоимость изменений, необходимых для получения строки, состоящей только из единиц. Выведите \(0\), если не требуется совершать никаких изменений.

Примечание

В первом примере нужно сначала перевернуть подстроку \([1 \dots 2]\), а затем инвертировать подстроку \([2 \dots 5]\).

Тогда строка изменялась так:

«01000» \(\to\) «10000» \(\to\) «11111».

И затраченная стоимость соответственно равна \(1 + 10 = 11\).

Во втором примере нужно сначала инвертировать подстроку \([1 \dots 1]\), а затем инвертировать подстроку \([3 \dots 5]\).

Тогда строка изменялась так:

«01000» \(\to\) «11000» \(\to\) «11111».

И затраченная стоимость соответственно равна \(1 + 1 = 2\).

В третьем примере строка уже состоит только из единиц, поэтому ответ \(0\).

A. Шарики

Конструктив реализация *1000

Существует достаточно много способов повеселиться, используя надувные шарики. К примеру, их можно наполнять водой и смотреть что будет.

Гриша и Андрей придерживаются того же мнения. Поэтому однажды они пошли в магазин и купили \(n\) пакетов с надувными шариками, где \(i\)-й из них содержит \(a_i\) шариков.

Они хотят разделить шарики между собой так, чтобы были выполнены следующие условия:

  • Не разрывать пакеты (каждый должен получить несколько цельных пакетов);
  • Раздать все пакеты (нельзя выкидывать «лишние» пакеты);
  • Выдать и Грише, и Андрею хотя бы по одному пакету;
  • Для пущего веселья, суммарное количество шариков во всех пакетах Гриши не должно совпадать с суммарным количеством шариков во всех пакетах Андрея.

Помогите им разделить пакеты с шариками между собой или скажите, что так сделать нельзя.

Входные данные

В первой строке дано единственное число \(n\) (\(1 \le n \le 10\)) — количество пакетов с шариками.

Вторая строка содержит \(n\) чисел: \(a_1\), \(a_2\), \(\ldots\), \(a_n\) (\(1 \le a_i \le 1000\)) — количество шариков внутри соответствующего пакета.

Выходные данные

Если поделить пакеты с шариками, соблюдая все ограничения, не удастся, выведите \(-1\).

Иначе выведите число \(k\) — количество пакетов, которые надо отдать Грише, а затем \(k\) различных чисел от \(1\) до \(n\) — номера соответствующих пакетов.

Если существует несколько способов раздать пакеты с шариками, выведите любой.

Примечание

В первом примере Гриша получит суммарно \(3\) шарика, а Андрей \(1\).

Во втором примере единственный способ разделить пакеты так, чтобы каждый получил хотя бы один из них, приведёт к тому, что суммарное количество шариков у Гриши и Андрея совпадёт.

В третьем примере нельзя разделить пакеты так, чтобы каждый получил хотя бы один.

A. Мишка и контест

Перебор реализация *800

Мишка сел писать очередной контест. Всего в контесте \(n\) задач. Умение Мишки решать задачи равно \(k\).

Мишка выписал задачи в список от первой до последней. Из-за понятных только ему принципов Мишка может решать задачи только с концов списка. Каждый раз он выбирает, с какого конца решить очередную задачу — слева или справа. Таким образом, очередная задача, которую решит Мишка, — это либо крайняя левая, либо крайняя правая задача из списка.

Мишка не может решать задачи, сложность которых строго больше \(k\). Когда Мишка решит задачу, она пропадет из списка, тем самым уменьшая его длину на \(1\). Мишка остановится, когда не сможет решить больше ни одну задачу.

Какое количество задач решит Мишка?

Входные данные

В первой строке входных данных задано два целых числа \(n\) и \(k\) (\(1 \le n, k \le 100\)) — количество задач в контесте и умение Мишки решать задачи.

Во второй строке входных данных задано \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 100\)), где \(a_i\) равняется сложности задачи с номером \(i\). Задачи заданы в порядке их расположения в списке слева направо.

Выходные данные

Выведите одно целое число — максимальное количество задач, которое сможет решить Мишка.

Примечание

В первом тестовом примере Мишка может решать задачи в следующем порядке: \([4, 2, 3, 1, 5, 1, 6, 4] \rightarrow [2, 3, 1, 5, 1, 6, 4] \rightarrow [2, 3, 1, 5, 1, 6] \rightarrow [3, 1, 5, 1, 6] \rightarrow [1, 5, 1, 6] \rightarrow [5, 1, 6]\). Таким образом, количество решенных им задач будет равно \(5\).

Во втором тестовом примере Мишка не может решить ни одной задачи, так как задачи как с левого, так и с правого концов списка имеют сложность, превышающую \(k\).

В третьем тестовом примере Мишка умеет очень хорошо решать задачи и сможет решить их все.

B. Переворотное шифрование

реализация *900

Строка \(s\) длины \(n\) может быть зашифрована следующим алгоритмом:

  • переберём все делители числа \(n\) в порядке убывания (то есть от \(n\) до \(1\)),
  • для каждого делителя \(d\) перевернём подстроку \(s[1 \dots d]\) (то есть такую подстроку, которая начинается в позиции \(1\) и заканчивается в позиции \(d\)).

Например, если алгоритм применяется к строке \(s\)codeforces», то строка будет изменяться следующим образом: «codeforces» \(\to\) «secrofedoс» \(\to\) «orcesfedoс» \(\to\) «rocesfedoс» \(\to\) «rocesfedoс» (очевидно, последний переворот не изменяет строку, так как \(d=1\)).

Вам дана зашифрованная строка \(t\). Требуется произвести расшифровку, то есть найти такую строку \(s\), в результате шифровки которой получится строка \(t\). Можно доказать, что такая строка \(s\) всегда существует (и при этом единственная).

Входные данные

В первой строке задано одно целое число \(n\) (\(1 \le n \le 100\)) — длина строки \(t\). Во второй строке задана строка \(t\). Длина строки \(t\) равна \(n\), строка состоит только из строчных букв латинского алфавита.

Выходные данные

Выведите такую строку \(s\), что если зашифровать ее описанным выше алгоритмом, то получится строка \(t\).

Примечание

Первый пример разобран в условии задачи.

C. Алфавитное удаление

реализация *1200

Задана строка \(s\), состоящая из \(n\) строчных букв латинского алфавита. Поликарпу стало интересно, какой станет строка, если он удалит из \(s\) ровно \(k\) букв (\(k \le n\)). Для выполнения задуманного Поликарп применяет следующий алгоритм \(k\) раз:

  • если есть хотя бы одна буква 'a', удалить самое левое ее вхождение и завершить алгоритм, иначе перейти к следующему пункту;
  • если есть хотя бы одна буква 'b', удалить самое левое ее вхождение и завершить алгоритм, иначе перейти к следующему пункту;
  • ...
  • удалить самое левое вхождение буквы 'z' и завершить алгоритм.

Таким образом, Поликарп \(k\) раз удалит ровно одну букву из строки. Следовательно, он удалит ровно \(k\) букв из строки. Каждый раз для определения удаляемой буквы он использует пункты описанного выше алгоритма.

Помогите Поликарпу найти получившуюся строку.

Входные данные

В первой строке задано два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 4 \cdot 10^5\)) — длина строки и количество букв, которые Поликарп удалит.

Во второй строке содержится строка \(s\), состоящая из \(n\) строчных букв латинского алфавита.

Выходные данные

Выведите строку, которая получится из \(s\) после удаления из строки ровно \(k\) букв при помощи \(k\) применений описанного выше алгоритма.

Если строка получается пустой, то ничего выводить не нужно. Допустимо как оставить вывод пустым, так и вывести одну пустую строку (перевод строки).

D. Уравняй остатки

жадные алгоритмы реализация Структуры данных *1900

Задан массив, состоящий из \(n\) целых чисел \(a_1, a_2, \dots, a_n\), и натуральное число \(m\). Гарантируется, что \(m\) делит \(n\) без остатка.

За один ход можно выбрать произвольный индекс \(i\) от \(1\) до \(n\) и увеличить элемент \(a_i\) на \(1\).

Пусть \(c_r\) (\(0 \le r \le m-1)\) — количество элементов, которые имеют остаток \(r\) при делении на \(m\). Иными словами, подсчитаем количество элементов массива \(a\) для каждого остатка.

Ваша задача — изменить массив так, чтобы \(c_0 = c_1 = \dots = c_{m-1} = \frac{n}{m}\).

Выведите минимальное количество ходов, которое необходимо чтобы удовлетворить требование выше.

Входные данные

В первой строке задано два целых числа \(n\) и \(m\) (\(1 \le n \le 2 \cdot 10^5, 1 \le m \le n\)). Гарантируется, что \(m\) делит \(n\) без остатка.

Во второй строке задано \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(0 \le a_i \le 10^9\)) — элементы массива.

Выходные данные

В первую строку выведите одно целое число — минимальное количество ходов, необходимое, чтобы для каждого остатка от \(0\) до \(m - 1\) количество элементов с таким остатком было равно \(\frac{n}{m}\).

Во вторую строку выведите любой удовлетворяющий условию массив, получаемый из заданного минимальным количеством ходов. Значения элементов полученного массива не должны превышать \(10^{18}\).

Набор в космическую академию

матрицы ЕГЭ_информатика ЕГЭ-26. Обработка массива целых чисел. Сортировка реализация Задача на реализацию Массивы ЕГЭ - вычислительные задачи

Космическая Академия «Звёздный Путь» проводит ежегодный набор курсантов. Отбор кандидатов происходит по сумме баллов трёх вступительных испытаний (физическая подготовка, математика, астронавигация) и собеседования с приёмной комиссией.

На заранее известное количество мест отбираются кандидаты, набравшие наибольшую сумму баллов по результатам трёх испытаний. Все кандидаты, набравшие определённую сумму баллов или больше, зачисляются на имеющиеся места. Такой балл называется проходным.

Если после заполнения имеющихся мест кандидатами с проходным баллом остаются незаполненные места, но кандидатов, набравших следующую сумму баллов, больше, чем вакантных мест, набранная этими кандидатами сумма баллов называется полупроходным баллом.

Из числа кандидатов, набравших полупроходной балл, на имеющиеся места принимаются кандидаты, имеющие более высокий балл за собеседование. Если два кандидата с полупроходным баллом имеют одинаковый балл за собеседование, то проходит тот кандидат, значение ID которого выше.

Для данного множества кандидатов определите полупроходной балл, а также ID кандидата с полупроходным баллом, который будет зачислен последним (займёт последнее свободное место).

Формат входных данных

В первой строке находятся два числа:

- N — количество кандидатов (натуральное число, не превышающее 10000)

- S — количество имеющихся мест (натуральное число, S ≤ N)

Каждая из следующих N строк содержит пять чисел:

- ID кандидата (натуральное число, не превышающее 10 000 000)

- три оценки по испытаниям (целые неотрицательные числа, не превышающие 100)

- балл за собеседование (целое неотрицательное число, не превышающее 10)

Гарантируется, что в исходных данных существует полупроходной балл.

 

Формат выходных данных

Два целых числа через пробел: полупроходной балл и ID кандидата с полупроходным баллом, занявшего последнее место.
 

Примечание

В первом тестовом примере

- ID=1001: сумма экзаменов = 270, собеседование = 10 → проходит (проходной балл)

- ID=1002: сумма = 240, собеседование = 8 → полупроходной балл, проходит

- ID=1003: сумма = 240, собеседование = 5 → не проходит (собеседование меньше)

- ID=1004: сумма = 210, собеседование = 10

Мест: 2. Кандидат с ID=1001 проходит автоматически. Осталось 1 место, но с суммой 240 — два кандидата. Это полупроходной балл. Между ними выбираем по собеседованию: ID=1002 (собес 8) > ID=1003 (собес 5).

Во втором тестовом примере
Все кандидаты имеют одинаковую сумму баллов (240) и одинаковый балл за собеседование (5). Мест: 2. Выбираем по ID в порядке убывания: сначала 503, затем 502. Последний зачисленный — кандидат с ID=502.

 

Подводная станция

матрицы ЕГЭ_информатика ЕГЭ - вычислительные задачи ЕГЭ-26. Обработка массива целых чисел. Сортировка реализация Задача на реализацию Массивы

На подводной исследовательской станции «Нептун-7» требуется установить новый научный модуль. Станция состоит из M уровней (пронумерованных от 1 до M сверху вниз, где уровень 1 ближе всего к поверхности) и K отсеков на каждом уровне.

Некоторые отсеки уже заняты оборудованием. По требованиям безопасности, новый модуль нужно разместить так, чтобы над ним (на уровнях с меньшими номерами) было как можно больше подряд идущих свободных отсеков с тем же номером — это обеспечивает путь аварийной эвакуации к поверхности.

Если несколько отсеков имеют одинаковое максимальное количество свободных отсеков над ними, выбирается отсек на уровне ближе к поверхности (с меньшим номером уровня).

Гарантируется, что хотя бы один свободный отсек на станции существует.


Формат входных данных

В первой строке находятся три числа:

  • N — количество занятых отсеков (1 ≤ N ≤ 10 000)
  • M — количество уровней (1 ≤ M ≤ 100 000)
  • K — количество отсеков на каждом уровне (1 ≤ K ≤ 100 000)

В следующих N строках находятся пары натуральных чисел: номер уровня и номер отсека занятого места соответственно.


Формат выходных данных

Два целых числа через пробел:

  1. Номер уровня выбранного отсека
  2. Количество свободных отсеков над ним (подряд, с тем же номером)

Космический техосмотр

матрицы ЕГЭ_информатика ЕГЭ - вычислительные задачи ЕГЭ-26. Обработка массива целых чисел. Сортировка реализация Задача на реализацию Массивы

На орбитальной станции «Галактика-7» завершился ежегодный технический осмотр космических кораблей. По его результатам каждый корабль получил:

  • Оценки трёх бортовых систем: двигательной, навигационной и системы жизнеобеспечения (по шкале от 2 до 5, где 2 — критическая неисправность, 5 — отличное состояние)
  • Статус лицензии пилота: действующая или просроченная

Корабль допускается к полётам, если выполнены оба условия:

  1. Все три бортовые системы имеют оценку 3 или выше
  2. Лицензия пилота действующая

Корабль не допущен к полётам, если хотя бы одно из условий не выполнено.

Руководство станции решило предоставить возможность экстренного ремонта одной системы одному из кораблей. Корабль может претендовать на ремонт, если:

  1. Лицензия пилота действующая
  2. Ровно одна система имеет критическую неисправность (оценка 2), а две другие системы исправны (оценка 3 или выше)

Если таких кораблей несколько, выбирается тот, у которого наибольшая сумма оценок всех трёх систем (такой корабль ближе всего к допуску).

Гарантируется, что ровно один корабль удовлетворяет всем критериям отбора.
 

Формат входных данных

В первой строке находится число N — количество кораблей (1 ≤ N ≤ 1000).

Каждая из следующих N строк содержит пять целых чисел через пробел:

  • ID — бортовой номер корабля (натуральное число, не превышающее 108)
  • S1, S2, S3 — оценки трёх бортовых систем (каждая от 2 до 5)
  • L — статус лицензии пилота (1 — действующая, 0 — просроченная)
 

Формат выходных данных

Выведите два числа через пробел:

  1. Количество кораблей, не допущенных к полётам
  2. Бортовой номер корабля, который получит возможность экстренного ремонта

Серверные стойки

матрицы ЕГЭ_информатика реализация Задача на реализацию

В новом датацентре «Кибер-Облако» серверы размещаются в стойках, которые расположены рядами. Ряды пронумерованы натуральными числами. Слоты в каждом ряду также пронумерованы натуральными числами начиная с единицы.

По данным инвентаризации известно, в каких рядах и в каких слотах уже установлены серверы. Администратору нужно разместить новое оборудование: кластер из ровно 25 серверов, которые должны располагаться в соседних слотах одного ряда.

Для надёжной работы кластера требуется, чтобы непосредственно слева и справа от него в том же ряду уже были установлены работающие серверы (они будут выполнять роль шлюзов).

Найдите ряд с наибольшим номером, в котором есть ровно 25 свободных слотов подряд, ограниченных занятыми слотами с обеих сторон.

Гарантируется, что существует хотя бы один ряд, удовлетворяющий условию.

Формат входных данных
В первой строке находится число N — количество установленных серверов (натуральное число, не превышающее 20000).

Каждая из следующих N строк содержит два натуральных числа, не превышающих 10000:
- номер ряда
- номер слота в этом ряду

Формат выходных данных

Два целых числа через пробел: наибольший номер ряда и наименьший номер слота в выбранной последовательности из 25 свободных мест.

 

Сигналы со спутника

матрицы реализация Задача на реализацию сортировки

Космическая станция «Орион» принимает сигналы от спутников-разведчиков. Приёмная матрица станции имеет размер 640 строк на 480 позиций. При получении каждого сигнала в журнал записываются координаты активированного элемента матрицы: номер строки и номер позиции в строке.

Элемент матрицы, который принял хотя бы один сигнал, считается активным. Элемент, который не принял ни одного сигнала, считается неактивным.

Для анализа качества связи нужно найти наибольшую непрерывную цепочку активных элементов в одной строке.

Определите наибольшую длину цепочки активных элементов, расположенных подряд в одной строке, и номер этой строки. Если таких строк несколько, укажите максимальный из их номеров.


Формат входных данных

В первой строке записано целое число N — количество принятых сигналов (1 ≤ N ≤ 10000).

В каждой из следующих N строк записаны по два числа через пробел:
- номер строки (целое число от 1 до 640)
- номер позиции в строке (целое число от 1 до 480)

Один и тот же элемент матрицы может получить несколько сигналов (координаты могут повторяться).

Формат выходных данных

Два целых числа через пробел: наибольшая длина цепочки активных элементов и номер строки, в которой она находится.
 

Зелье от морской болезни

Бинарный поиск реализация дп *1100

Шкипер Баг ужасно страдает от морской болезни. Единственное спасение — зелье «Штиль», которое продаётся в лавках на островах архипелага. На n островах цены разные: в i-м порту бутылка стоит xi дублонов.

Каждый раз, когда «Нулевой указатель» заходит в порт, у Шкипера Бага с собой разная сумма — зависит от того, не украл ли корабельный кот монеты из кармана. Всего таких заходов будет q. Для каждого захода Шкипер Баг хочет заранее знать: в скольких портах архипелага он смог бы купить зелье, имея столько дублонов?

Формат входных данных
Первая строка: n (1≤n≤100 000) — количество портов.
Вторая строка: n чисел  xi​ (1≤xi≤100 000) — цены на зелье.
Третья строка: q (1≤q≤100 000) — количество заходов в порт.
Следующие q строк: число mi​ (1≤mi≤109) — дублоны Шкипера Бага при i-м заходе.

Формат выходных данных
q чисел — для каждого захода количество портов, где хватит денег.


Примечание: 
При 1 дублоне ни одна лавка недоступна. При 8 — можно купить в 4 лавках (цены 2, 3, 4, 7). При 3 — только одна лавка (цена 2). При 100 дублонах — все пять.

Корабельный архив

математика *1000 реализация

В трюме «Нулевого указателя» хранится стопка из n секретных свитков с морскими картами, пронумерованных от 1 до n. Сверху лежит свиток a1, под ним a2, и так далее. Все номера различны.

Капитан Архипов, не отрываясь от чая, выкрикивает номера нужных свитков. На i-м шаге он требует свиток bi. Если свиток ещё в стопке — Шкипер Баг снимает его вместе со всеми свитками выше (вытащить из середины нельзя — свитки слиплись от сырости). Если нужного свитка в стопке уже нет — Шкипер Баг делает умное лицо и ждёт следующей команды.

Посчитайте, сколько свитков Шкипер Баг достанет на каждом шаге.

Формат входных данных
Первая строка: n (1 ≤ n ≤ 200 000).

Вторая строка: n чисел ai — начальный порядок стопки (все различны).

Третья строка: n чисел bi — порядок требований капитана (все различны).

Формат выходных данных
n чисел — количество свитков, снятых на каждом шаге.


Примечание: 
В тестовом примере капитан потребовал свиток №2 — Шкипер Баг снял №1 и №2 сверху (2 штуки). Затем потребовал №1 — но его уже нет, ничего не происходит. Затем №3 — снял один.

Сундук с секретом

математика *1000 реализация

На борту «Нулевого указателя» обнаружили старинный сундук с n рычагами. Чтобы открыть его, рычаги нужно нажимать в правильном порядке — но Шкипер Баг этого порядка не знает.

Когда Шкипер Баг нажимает рычаг: если этот рычаг действительно следующий в правильной последовательности — он остаётся нажатым. Если рычаг неправильный — он сбрасывается вместе со всеми уже нажатыми рычагами, и придётся начинать заново с нужного места.

Когда все n рычагов окажутся нажаты одновременно — сундук откроется. Шкипер Баг действует оптимально. Найдите количество нажатий в худшем случае.

Формат входных данных

Единственная строка: целое число n (1 ≤ n ≤ 2000) — количество рычагов.


Формат выходных данных

Одно число — количество нажатий в худшем случае.

 

Примечание (n = 3). Пусть правильная последовательность — {2, 3, 1}.

Шкипер Баг ищет первый рычаг. Нажимает рычаг 1 — сброс (1 нажатие). Нажимает рычаг 3 — сброс (2 нажатия). Нажимает рычаг 2 — остаётся нажатым (3 нажатия).

Теперь ищет второй рычаг. Нажимает рычаг 1 — сброс, рычаг 2 тоже сбросился (4 нажатия). Повторно нажимает рычаг 2 (5 нажатий), затем рычаг 3 — остаётся нажатым (6 нажатий).

Ищет третий рычаг. Единственный оставшийся — рычаг 1, нажимает (7 нажатий). Сундук открыт!

Итого в худшем случае: 7 нажатий.

Безлюдный отель

Строки реализация Задача на реализацию

Закончился туристический сезон, и почти все отдыхающие разъехались. Теперь у Портье почти не осталось работы, и он уже успел заскучать. Поначалу он пытался скоротать время, снова и снова убирая номера, решая судоку и раскладывая пасьянсы. Но все это ему быстро надоело.

Однажды он заметил, что один из гостей оставил на столе книгу. Портье придумал следующую игру: он открывает книгу на случайной странице, выбирает какое-то слово и выписывает его большими буквами на отдельном листе бумаги.

После этого он берёт монетку и кладёт её на первую букву слова. Затем много раз (возможно, бесконечное число) он делает следующую операцию: если выбранном слове есть еще одна такая же буква, как и та, на которой лежит монетка, то портье перекладывает эту монетку на любую такую же букву. Если же буква, на которой лежит монетка встречается ровно один раз, то портье сдвигает монетку на следующую букву, а если следующей буквы в слове нет, то игра завершается.

Например, если изначальное слово было <<letovo>>, то монетка будет перемещаться следующим образом (положение монетки в отражено жирным подчёркнутым шрифтом):

  1. letovo

  2. letovo

  3. letovo

  4. letovo

  5. letovo

  6. letovo

  7. letovo

  8. \(\dots\)

Обратите внимание, что в примере выше игра никогда не завершится: монетка будет бесконечно долго перемещаться между двумя буквами <<o>>.

Помогите Портье: по данному вам слову длины \(n\), состоящему только из строчных букв латинского алфавита, узнать завершается ли на этом слове придуманная им игра.

В первой строке дано число \(n\) (\(1 \le n \le 100\,000\)) — длина строки.

Во второй строке дана строка \(s\), строка состоит только из строчных букв латинского алфавита.

Выведите <<YES>>, если игра завершается, и <<NO>> — в противоположном случае.

Пингвины на льдине

Структуры данных реализация *1900

На льдине в ряд стоят n пингвинов. У каждого пингвина свой вес — уникальное целое число от 1 до n.
На каждом ходе каждый пингвин, чей вес больше, чем у соседа справа, сталкивает соседа справа в воду. Обратите внимание, что пингвин может столкнуть соседа и сам быть столкнут на одном и том же ходе.
Вам дано исходное расположение пингвинов на льдине. Подсчитайте, сколько ходов пройдёт до момента, после которого на льдине наступит покой и больше никто никого не столкнёт.

Формат входных данных
В первой строке записано целое число n — количество пингвинов (1 ≤ n ≤ 105). Во второй строке записан список из n различных целых чисел от 1 до n, включительно — веса пингвинов на льдине слева направо. Числа разделяются пробелами.

Формат выходных данных
Выведите одно число — количество ходов, после которых на льдине наступит покой.

 
Примечание

В первом примере ряд пингвинов меняется так: [10 9 7 8 6 5 3 4 2 1]  →  [10 8 4]  →  [10]. Итого, есть два хода.

Пирожки не должны остыть

реализация жадные алгоритмы сортировки *1300

В пекарне «У Матроны» работает один пекарь, и за утро он должен испечь n заказов пирожков. Для каждого заказа известно время ti — сколько минут займёт его приготовление.

Пирожки нельзя долго держать на прилавке: клиент заберёт свой заказ горячим, только если время ожидания не превысило времени его приготовления. Иначе пирожки остынут — и клиент уйдёт расстроенным.

Временем ожидания клиента считается суммарное время приготовления всех заказов, которые пекарь взял в работу до его заказа. Клиент остаётся доволен, если это время не больше времени приготовления его собственного пирожка.

Матрона может сама решать, в каком порядке брать заказы в работу. Помогите ей выбрать такой порядок, чтобы максимальное число клиентов ушло довольными.

 

Формат входных данных

В первой строке — целое число n (1 ≤ n ≤ 105) — количество заказов.

Во второй строке — n целых чисел ti (1 ≤ ti ≤ 109), разделённых пробелами, — время приготовления каждого заказа.

 

Формат выходных данных

Одно целое число — максимальное количество довольных клиентов.

Какое правило сильнее - 5

реализация

Из нижеприведенных правил выберите правило с наибольшим приоритетом:

1) footer .social-links a[target="_blank"]
2) #footer a
3) a:hover
4) a

ООП-3

реализация

 Каким термином из ООП можно охарактеризовать универсальность интерфейса доступа к разным типам данных?

Censoring (Bronze)

Поиск подстроки в строке Стек реализация

Фермер Джон купил подписку журнала Good Hooveskeeping для своих коров, теперь им есть что почитать. К несчастью, последний номер содержит довольно неподходящую статью, как приготовить совершенный бифштекс. ФД хочет чтобы его коровы не увидели эту статью.

ФД взял текст из журнала и создал строку S длиной не более чем 10^6 символов. Из неё он хочет удалить все вхождения подстроки T длиной <= 100 символов неподходящего содержания. Чтобы сделать это, ФД ищет первое вхождение T в S и удаляет его. Затем он повторяет процесс опять, снова удаляя первое вхождение T, продолжая так до тех пор, пока больше не станет вхождений T в S. Заметим, что удаление одного вхождения может создать другое вхождение, которое не существовало раньше.

Пожалуйста, помогите ФД определить конечное содержание строки S после завершения всех удалений.

Формат входных данных

Первая строка содержит S. Вторая строка будет содержать T. Длина T не более чем длина S, и все символы S и T - маленькие латинские буквы (a..z).

Формат выходных данных

Строка S после завершения всех удалений. Гарантируется, что S не станет пустой после завершения процесса всех удалений.

Lights Out

реализация

Фермер Джон установил новый доильный аппарат, но он берёт так много энергии, что иногда отключается свет в амбаре. Это случается так часто, что Беси запомнила план амбара, чтобы было проще добираться до выхода в темноте.

Амбар описан простым (несамопересекающимся прямоугольником) с вершинами в целочисленных координатах \((x_1, y_1) \ldots (x_n, y_n)\) перечисленных по часовой стрелке. Его рёбра чередуются между горизонтальными (параллельными оси Х и вертикальными - параллельными оси Y). Первое ребро может быть как вертикальным, так и горизонтальным. Выход расположен в точке \((x_1, y_1)\). Беси начинает внутри амбара, в одной из некоторых вершин \((x_i, y_i)\) для \(i > 1\). Она может двигаться только по периметру амбара, по часовой стрелке либо против часовой стрелки. Её цель - пройти минимальное расстояние до выхода. Это относительно легко, когда свет включён. Поскольку она просто должна выбрать какой путь короче от текущего положения до выхода - по часовой стрелке или против часовой стрелки.

Когда свет выключается, Беси паникует и забывает вершину, в которой она находится. К счастью, она всё ещё помнит точную карту амбара, поэтому она может вычислить свою позицию, двигаясь по периметру и используя свои ощущения. Когда она стоит в вершине (включая свою начальную вершину), она может ощутить внутренний угол при этой вершине. и также она может сказать является ли эта вершина выходом. Когда она движется вдоль амбара, она может определить точную длину ребра, по которому прошла. Беси двигается в соответствии со следующей стратегией: она движется по часовой стрелке по периметру амбара, до тех пор, пока она не ощутит достаточное количество углов и рёбер, чтобы определить, в какой вершине она сейчас находится. В этой точке она легко может вычислить, как ей быстрее добраться до выхода - продолжив движение по часовой стрелке или переключившись на движение против часовой стрелки.

Помогите Беси определить наибольшую величину, на которую возрастёт её путь к выходу в темноте, по сравнению с путём при свете (рассмотрев все возможные положения стартовой вершины).

ФОРМАТ ВВОДА (файл lightsout.in):

Первая строка ввода содержит \(N\) (\(4 \leq N \leq 200\)). Каждая из последующих \(N\) строк содержит два целых числа, описывающих точки \((x_i, y_i)\) в порядке обхода амбара по часовой стрелке. Эти целые числа в диапазоне \(-100,000 \ldots 100,000\).

ФОРМАТ ВВОДА (файл lightsout.out):

Выведите наибольшее число, на которое возрастёт расстояние при наихудшей стартовой позиции.

Cow Routing II

графы кратчайшие пути реализация

Устав от холодной зимы Беси хочет на каникулах слетать туда, где потеплее.
Билеты коровам продаёт только Air Bovinia.

Air Bovinia имеет N самолётов (1 <= N <= 500), каждый из которых летит
по специфическому маршруту, состоящему из двух или более городов.
Например, самолёт может стартовать в городе 1, затем лететь в город 5,
затем лететь в город 2, затем лететь в город 8 (конечную точку маршрута).
Никакой город не появляется в маршруте два или более раз. Если Беси
выбрала маршрут, она может сесть на него в любом городе этого маршрута
и выйти из него в любом из последующих городов этого маршрута. Она не
обязана садиться в первом городе, а выходить в последнем городе этого
маршрута. Каждый маршрут имеет определённую цену, которую Беси должна
заплатить, если она использует любую часть маршрута, не зависящую от
количества городов, которые она посетит вдоль маршрута. Также Беси
имеет право использовать один маршрут только один раз, это означает,
что она не может использовать маршрут, а затем позже использовать другую
часть этого же маршрута.

Беси хочет найти самый дешёвый способ добраться от своей фермы (город A)
до своего "тёплого местечка" (город B). Она хочет использовать не более
чем два маршрута. Помогите ей определить минимальную цену путешествия.

Заметим, что единственное отличие этой задачи от предыдущей в том, что Беси
может использовать до двух маршрутов, в отличие от ровно одного маршрута
в предыдущей задаче.

Формат входных данных

Первая строка ввода содержит A, B, N разделённые одиночными пробелами.
Следующие 2N строк описывают доступные маршруты, по две строки на маршрут.
Первая строка содержит стоимость маршрута (целое число в интервале от 1 до 1000)
и количество городов в этом маршруте (целое число от 1 до 500). Вторая
строка содержит список городов в порядке следования в этом маршруте.
Каждый город идентифицируется целым числом в диапазоне от 1 до 10,000.

Формат выходных данных

Выведите минимальную цену путешествия из A в B, использующего не более
чем два маршрута. Если такого решения нет, выведите -1.

Примечание

Используя маршрут 2 добираемся от города 1 до города 3, а затем с помошью
маршрута 1 путешествуем из города 3 в город 2.

Cow Routing

реализация Задачи на моделирование

Устав от холодной зимы Беси планирует слетать куда потеплее на каникулах.
К несчастью, только одна кампания Air Bovinia продаёт билеты коровам.

Air Bovinia имеет N самолётов (1 <= N <= 500), каждый из которых
летает по собственному маршруту, состоящему из
двух или более городов. Например, такому: маршрут
начинается в городе 1, затем самолёт летит в город 5,
затем в город 2, затем в город 8. Никакой город не появляется
в этом маршруте дважды и более раз. Если Беси
выбрала маршрут, то она может сесть на него в любом городе
этого маршрута и сойти также в любом городе этого маршрута.
Она не обязана садиться в самолёт в первом городе маршрута
и выходить в последнем. Каждый маршрут имеет определённую цену,
которую Беси должна заплатить, если она использует
любую часть маршрута, не зависящую от количества городов,
которые она посетит во время маршрута.

Беси хочет найти самый дешёвый способ пропутешествовать от её фермы
(город A) до её "тёплого местечка" (город B).
При этом она хочет использовать только один маршрут,
чтобы не мучиться с пересадками.
Помогите ей определить минимальную цену, которую ей придётся заплатить.

Формат входных данных

Первая строка содержит числа A,B,N разделённые одиночными пробелами.

Следующие 2N строк описывают доступные маршруты - по две строки на маршрут.

Первая строка содержит цену этого маршрута (целое число от 1 до 1000)
и количество городов, вдоль этого маршрута (целое число от 1 до 500).

Вторая строка содержит список городов в порядке посещения вдоль этого
маршрута. Каждый город идентифицируется целым числом от 1 до 10,000.

Формат выходных данных

Выведите минимальную стоимость одного маршрута, который Беси
может использовать для перемещения из города A в город B.
Если такого маршрута нет, выведите -1.

Примечание

Хотя имеется более дешёвый решение из двух маршрутов (маршрут 2
из города 1 в город 3, затем маршрут 1 из города 3 в город 2),
Беси выбирает только прямой маршрут
- маршрут 3, цена которого равна 8.

Cities and States

Хеш реализация

Фермер Джон повесил большую карту США на стене своей фермы. Разглядывая её подолгу, коровы начали замечать курьезы. Например города Flint, MI и Miami, FL: первые две буквы первого города (Flint) дают код штата FL для второго города и наоборот, первые две буквы второго города (Miami) дают код штата первого города - MI.

Давайте назовём два города "специальной парой", если они удовлетворяют этому свойству и принадлежат разным штатам. Коровам интересно сколько всего существует "специальных пар". Помогите им!

ФОРМАТ ВВОДА (файл citystate.in):

Первая строка ввода содержит \(N\) (\(1 \leq N \leq 200,000\)), количество городов на карте.

Каждая из следующих \(N\) строк содержит две строки: имя города (от 2 до 10 маленьких латинских букв) и двухсимвольный код штата (из больших латинских букв). Заметим, что код штата может быть например ZQ, хотя в действительности в США нет такого штата. Могут существовать города с одинаковыми названиями, но они будут в различных штатах.

ФОРМАТ ВЫВОДА (файл citystate.out):

Выведите количество специальных пар городов.

Sequence Construction

реализация

Вам даны целые числа \(M\) и \(K\) \((1 \leq M \leq 10 ^ 9, 1 \leq K \leq 31)\). Выберите положительное целое \(N\) и сконструируйте последовательность \(a\) из \(N\) неотрицательных целых чисел так, чтобы выполнялись следующие условия:

  • \(1 \le N \le 100\)
  • \(a_1 + a_2 + \dots + a_N = M\)
  • \(\text{popcount}(a_1) \oplus \text{ popcount}(a_2) \oplus \dots \oplus \text{ popcount}(a_N) = K\)

Если такой последовательности не существует, выведите \(-1\).

\(\dagger \text{ popcount}(x)\) это количество \(1\) в двоичном представлении числа \(x\). Например, popcount от \(11\) это \(3\), а popcount от \(16\) это \(1\).

\(\dagger \oplus\) это оператор побитового XOR.

Ввод содержит \(T\) (\(1 \le T \le 5 \cdot 10^3\)) независимых подтестов.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(T\).

Первая и единственная строка каждого подтеста содержит \(M\) и \(K\).

Гарантируется, что все тесты уникальны.

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите решения для всех \(T\) подтестов таким образом:

Если ответ не существует выведите \(-1\).

Иначе, первая строка для подтеста должна содержать \(N\), длина последовательности -- (\(1 \le N \le 100\)).

Вторая строка для этого подтеста должна содержать \(N\) разделённых пробелом целых чисел, которые удовлетворяют условиям -- (\(0 \le a_i \le M\)).

DFS Order

графы реализация

У Беси есть простой неориентированный граф с вершинами, помеченными \(1\dots N\) (\(2\le N\le 750\)). Она генерирует поиск в глубину графа вызывая функцию \(\texttt{dfs}(1)\), описанную следующим C++ кодом. Каждый список соседних вершин (\(\texttt{adj}[i]\) для всех \(1\le i\le N\)) может быть переставлен произвольно перед началом поиска в глубину, поэтому граф может иметь множество возможных DFS-порядков.

vector<bool> vis(N + 1);
vector<vector<int>> adj(N + 1);  // adjacency list
vector<int> dfs_order;

void dfs(int x) {
    if (vis[x]) return;
    vis[x] = true;
    dfs_order.push_back(x);
    for (int y : adj[x]) dfs(y);
}

Вам дано начальное состояние графа, а также стоимость изменения состояния каждого ребра. А именно, для каждой пары вершин \((i,j)\) удовлетворяющей \(1\le i<j\le N\), Вам дано целое число \(a_{i,j}\) (\(0<|a_{i,j}|\le 1000\)) такое, что

  • Если \(a_{i,j}>0\), ребро \((i,j)\) сейчас отсутствует в графе, оно может быть добавлено за стоимость \(a_{i,j}\).
  • Если \(a_{i,j}<0\), ребро \((i,j)\) сейчас в графе, оно может быть удалено за стоимость \(-a_{i,j}\).

Определите минимальную суммарную стоимость изменить граф так, чтобы \([1,2\dots,N]\) стало возможным DFS-обходом.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\).

Далее следует \(N-1\) строка. \(j-1\)-ая строка содержит \(a_{1,j}, a_{2,j}, \dots, a_{j-1,j}\) разделённые одиночными пробелами.

ФОРМАТ ВЫВОДА (на экран / stdout):

Минимальная стоимость изменить граф так, чтобы \([1,2,\dots, N]\) стал возможным DFS-обходом.

Cow Checkups

дп реализация

**Замечание: мы не рекомендуем использовать для решения этой задачи язык программирования Питон, чтобы получить полный балл по этой задаче. **

\(N\) (\(1 \leq N \leq 7500\)) коров Фермера Джона стоят в ряд. Корова \(1\) стоит в начале этого ряда, а корова \(N\) - в конце. \(i\)-ая корова имеет разновидность \(a_i\) (\(1 \leq a_i \leq N\)).

ФД везет своих коров на осмотр в местную больницу для крупного рогатого скота. Однако ветеринар, специализирующийся на коровах, очень придирчив и хочет провести осмотр \(i\)-ой коровы в очереди, только если она относится к виду \(b_i\) (\(1 \leq b_i \leq N\)).

ФД ленивый и не хочет полностью переупорядочивать его коров. Он выполняет следующую операцию ровно один раз.

  • Выбирает два числа \(l\) и \(r\) такие, что \(1 \leq l \le r \leq N\). Реверсирует порядок коров между \(l\)-ой и \(r\)-ой коровами включительно.

ФД хочет измерить насколько эффективен его подход. Для каждого \(c=0 \ldots N\), помогите ФД помогите ФД определить количество различных операций (\(l,r\)) таких, что ровно \(c\) коров будут проверены ветеринаром. Две операции (\(l_1,r_1\)) и (\(l_2,r_2\)) считаются различными, если \(l_1 \neq l_2\) или \(r_1 \neq r_2\).

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит целое число \(N\).

Вторая строка содержит \(a_1, a_2, \ldots, a_N\).

Третья строка содержит \(b_1, b_2, \ldots, b_N\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(N+1\) строку, где \(i\)-ая строка содержит количество различных операций (\(l,r\)), которые обеспечат, что ровно \(i-1\) корова будет проверена.

Vocabulary Quiz

Деревья графы реализация

Беси помогает Эльзе играть со словами. Слова берутся из банка, содержащего \(M\) различных слов, ни одно слово не является префиксом другого.

Пока банк не пустой, Беси выбирает слово из банка, удаляет его из банка, читает его Эльзе по одному символу за раз слева направо. Задача Эльзы сказать Беси, как только она уникально определит слово, после чего Беси прекращает чтение.

Беси уже решила читать слова из словаря в порядке \(w_1,w_2,\dots,w_M\). Если Эльза ответит так быстро, как это возможно, сколько символов из каждого слова прочитает Беси?

Слова заданы в сжатом формате. Сначала мы определяем \(N+1\) (\(1\le N\le 10^6\)) различных слов и затем банк слов состоит из всех этих слов, ни одно из которых не является префиксом другого. Слова определяются следующим образом:

  • Изначально, 0-ое слово - пустая строка.
  • Затем для каждого each \(1\le i\le N\), \(i\)-ое слово будет равно \(p_i\)-ому слову плюс дополнительный символ в конце (\(0\le p_i<i\)). Символы выбираются так, что все \(N+1\) слов различны.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\), где \(N+1\) количество слов, представленных в сжатом формате.

Следующая строка содержит числа \(p_1,p_2,\dots,p_N\) где \(p_i\) представляет, что \(i\)-ое слово формируется взятием \(p_i\)-го слова и добавлением одного символа в конец.

\(M\) - количество слов, которые не являются префиксом некоторого другого слова. Следующие \(M\) строк содержат \(w_1,w_2,\dots,w_M\), означающие что \(w_i\)-ое слово будет \(i\)-ым прочитанным. Гарантируется, что слова к чтению формируют перестановку слов из банка.

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(M\) строк, где \(i\)-ая строка содержит количество символов \(i\)-го слова, которое прочиает Беси.

True or False Test

Жадный алгоритм жадные алгоритмы реализация

**Замечание: Время на тест для этой задачи 3сек, в 1.5 большее чем по умолчанию. Память на тест для этой задачи 512MB, в два раза больше чем по умолчанию.**

Беси проходит тест вида да/нет из \(N\) вопросов (\(1\le N\le 2\cdot 10^5\)). За \(i\)-ый вопрос она может добавить \(a_i\) баллов если ответит правильно, и отнять \(b_i\) баллов, если ответит неправильно или не изменить сумму, если не ответит вообще на вопрос (\(0<a_i,b_i\le 10^9\)).

Беси знает ответы на все вопросы, но боится, что администратор теста Эльза подменит до \(k\) вопросов так, чтоб получилось, что Беси ответила неправильно.

Заданы \(Q\) (\(1\le Q\le N+1\)) кандидатов величин \(k\) (\(0\le k\le N\)), определите количество баллов, которые Беси гарантированы для каждого \(k\), зная, что она должна ответить не менее чем на \(k\) вопросов.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\) и \(Q\).

Каждая из следующих \(N\) строк содержит \(a_i\) и \(b_i\).

Каждая из следующих \(Q\) строк содержит значение \(k\). Ни одно из значений \(k\) не появится более одного раза.

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите ответ для каждого \(k\) на отдельной строке.

Logical Moos

реализация

У Фермера Джона есть булевское выражение длиной в \(N\) слов (\(1 \leq N < 2 \cdot 10^5\), \(N\) нечётное). Только \(\texttt{true}\) or \(\texttt{false}\) появляются на нечётных позициях, и только \(\texttt{and}\) и \(\texttt{or}\) появляются на чётных позициях.

Фраза вида \(x\text{ OPERATOR }y\), где \(x\) и \(y\) или \(\texttt{true}\) или \(\texttt{false}\), а \(\text{OPERATOR}\) есть \(\texttt{and}\) или \(\texttt{or}\), вычисляется следующим образом:

  • \(x\texttt{ and }y\): Это вычисляется в true если оба \(x\) и \(y\) true, иначе в false.
  • \(x\texttt{ or }y\): Это вычисляется в true если или \(x\) или \(y\) true, иначе в false.

При вычислении выражения ФД действует так: Аналогично C++, \(\texttt{and}\) имеет более высокий приоритет чем \(\texttt{or}\). Более подробно: для вычисления выражения повторяется следующий шаг пока в выражении не останется ровно одно слово.

  1. Если выражение содержит \(\texttt{and}\), выбирается любой из них и фраза, окружающая его, заменяется её вычислением.
  2. Иначе, выражение содержит \(\texttt{or}\). Выбирается любой из них и фраза, окружающая его, заменяется её вычислением.

Можно доказать, что порядок вычислений не важен, выражение всегда будет вычислено к одному и тому же результату.

У ФД есть \(Q\) \((1 \leq Q \leq 2 \cdot 10^5)\) запросов. В каждом запросе она даёт Вам два целых числа \(l\) и \(r\) (\(1 \leq l \leq r \leq N\), \(l\) и \(r\) оба нечётные), и удаляет сегмент от ключевого слова \(l\) до ключевого слова \(r\) включительно. Он хочет заменить удалённый сегмент одним \(\texttt{true}\) или \(\texttt{false}\) так, чтобы оставшееся выражение вычислялось к определённому булевскому значению. Помогите ФД определить, возможно ли это.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\) и \(Q\).

Следующая строка содержит \(N\) слов, корректное булевское выражение.

Последующие \(Q\) строк содержат два целых числа \(l\) и \(r\), и строку \(\texttt{true}\) или \(\texttt{false}\), обозначающую, что он хочет, чтобы оставшееся после удаления выражение вычислилось к этому значению.

ФОРМАТ ВЫВОДА (на экран / stdout):

Выедите строку длины \(Q\), где \(i\)-ый символ есть Y если i-ый запрос возможно выполнить и N в противном случае.

Farmer John's Favorite Permutation

реализация

У Фермера Джона есть перестановка \(p\) длины \(N\) (\(2 \leq N \leq 10^5)\), содержащая каждое положительное целое от \(1\) до \(N\) ровно один раз. Однако Фермер Нхой прокрался в амбар ФД и испортил \(p\). Чтобы не быть совсем плохим, ФН написал несколько советов, которые помогут ФД восстановить \(p\). Пока в \(p\) было более одного элемента, ФН делал следующее:

Пусть оставшиеся элементы \(p\) есть \(p'_1, p'_2, \dots , p'_n\),

  • Если \(p'_1 > p'_n\), он записывал \(p'_2\) и удалял \(p'_1\) из перестановки.
  • Иначе, он выписывал \(p'_{n-1}\) и удалял \(p'_n\) из перестановки.

В конце у ФН получились выписанные \(N - 1\) целых чисел \(h_1, h_2, \dots, h_{N-1}\), в указанном порядке. По заданным числам \(h\) ФД просит у Вас помощи реконструировать лексикографически минимальную перестановку \(p\), соответствующую алгоритму ФН или определить, что ФН сделал ошибку. Напомним, что если Вам даны две перестановки \(p\) и \(p'\), то \(p\) лексикографически меньше чем \(p'\), если \(p_i < p'_i\) в первой позиции, \(i\), где они различаются.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Каждый ввод состоит из \(T\) независимых подтестов (\(1\le T\le 10\)). Каждый подтест описывается следующим образом:

Первая строка содержит число \(N\).

Вторая строка содержит \(N - 1\) целых чисел \(h_1, h_2, \dots, h_{N-1}\) (\(1\le h_i\le N\)).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(T\) строк, по одной на каждый подтест.

Если существует такая перестановка \(p\) из чисел \(1\dots N\), соответствующая \(h\), выведите лексикографически минимальную такую перестановку \(p\). Если такой перестановки \(p\) не существует, выведите \(-1\).

Majority Opinion

Жадный алгоритм реализация Задачи на моделирование

У Фермера Джона важная задача - решить какой тип сена купить для своих коров.

У Фермера Джона есть \(N\) коров (\(2 \le N \le 10^5\)) пронумерованных от \(1\) до \(N\). Каждая корова любит ровно один тип сена \(h_i\) (\(1 \le h_i \le N\)). ФД хочет, чтобы все его коровы любили один тип сена.

Чтобы это случилось, ФД может сформировать фокус-группы. Фокус-группа состоит из всех коров в непрерывном интервале от \(i\) до \(j\), включительно. Если в фокус-группе более половины коров любит один и тот же некоторый тип сена, то все коровы начинают любить этот тип сена, иначе ни у одной коровы не изменяется любимый тип сена. Например, если фокус группа состоит из 16 коров, 9 или более из которых любят один и тот же тип сена, то и остальные 7 коров теперь будут любить этот же тип сена.

ФД хочет узнать, какие типы сена могут стать любимыми всем коровами. В один момент времени он может создать только одну фокус группу, но он может последовательно создавать сколько угодно фокус-групп, чтобы все коровы полюбили один и тот же тип сена.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Сначала идёт одно целое число \(T\), которое обозначает количество независимых тестов \((1 \leq T \leq 10)\).

Первая строка каждого теста содержит число \(N\).

Вторая строка каждого теста состоит из \(N\) целых чисел, любимых типов сена \(h_i\), в порядке номеров коров.

Гарантируется, что сумма \(N\) во всех тестах не превысит \(2\cdot 10^5\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(T\) строк, по одной для каждого теста.

Если возможно сделать, чтобы все коровы полюбили один и тот же тип сена, выведите все такие возможные типы сена в порядке возрастания. Иначе, выведите \(-1\). Когда выводите список чисел, выводите соседние числа через один пробел, и в конце этой строки не должно быть пробелов.

Milk Sum

Использование сортировки Префиксные суммы(минимумы, ...) реализация

**Примечание. Ограничение по времени для этой задачи – 4 секунды, что в 2 раза больше, чем по умолчанию.**

\(N\) коров фермера Джона (\(1\le N\le 1,5\cdot 10^5\)) имеют целую продуктивность \(a_1,\dots,a_N\). То есть \(i\)я корова производит \(a_i\) единиц молока за минуту ( \(0 \leq a_i \leq 10^8\)).

Каждое утро фермер Джон начинает с того, что все \(N\) коров подключены к его дойке. От него требуется отцеплять их по одной, отправляя прочь для их ежедневных упражнений. Первая корова, которую он отправляет, снимается с крючка после всего 1 минуты дойки, вторая корова, которую он отправляет, отцепляется после двух минут дойки и так далее. Поскольку первая корова (скажем, корова \(x\)) тратит только одну минуту на доильном аппарате она вносит только \(a_x\) единиц общего количества молока. Вторая корова (скажем, корова \(y\)) тратит на доение всего две минуты и, таким образом, дает \(2a_y\) единиц общего количества молока. Третья корова (скажем, корова \(z\)) приносит всего \(3a_z\) единиц и так далее. Пусть \(T\) представляет собой максимально возможное количество молока, которое может собрать фермер Джон, если он отцепляет своих коров в оптимальном порядке.

Фермеру Джону интересно, как повлияет на \(T\), если часть производительностей молока в его стаде были другими. Для каждого из запросов \(Q\) (\(1\le Q\le 1.5\cdot 10^5\)) каждое из которых задано двумя целыми числами \(i\) и \(j\), пожалуйста, рассчитайте, какой будет новое значение \(T\), если \(a_i\) было установлено в \(j\) (\(0 \leq j \leq 10^8\)). Обратите внимание, что каждый запрос рассматривает временное потенциальное изменение независимо от всех других запросов; то есть \(a_i\) возвращается к исходному значению перед следующим запросом.

ФОРМАТ ВВОДА (ввод поступает с терминала/стандартного ввода):

Первая строка содержит \(N\).

Вторая строка содержит \(a_1\dots a_N\).

Третья строка содержит \(Q\).

Следующие \(Q\) строк содержат по два целых числа \(i\) и \(j\), разделенных пробелом.

ФОРМАТ ВЫВОДА (вывод на терминал / стандартный вывод):

Пожалуйста, выведите значение \(T\) для каждого из запросов \(Q\) в отдельных строках.

Pareidolia

дп Дерево отрезков, RSQ, RMQ реализация

**Примечание. Ограничение по времени для этой задачи составляет 4 секунды, что в два раза больше, чем по умолчанию. Ограничение по памяти для этой задачи составляет 512 МБ, вдвое больше, чем по умолчанию.**

Парейдолия – это явление, при котором ваши глаза склонны видеть в изображениях знакомые узоры, которых на самом деле не существует — например, видение лица в облаке. Поскольку фермер Джон постоянно находится рядом с коровами, он часто видит коровьи узоры в повседневных предметах. Например, если он смотрит на строка "bqessiyexbesszieb", глаза фермера Джона игнорируют некоторые буквы и все, что он видит, это «bessiebessie».

Дана строка \(s\), пусть \(B(s)\) представляет собой максимальное количество повторяющихся копий. из «bessie» можно получить, удалив ноль или более символов из \(s\). В приведенном выше примере \(B(\)"bqessiyexbesszieb"\() = 2\). Кроме того, учитывая строка \(t\), пусть \(A(t)\) представляет собой сумму \(B(s)\) по всем непрерывным подстроки \(s\) строки \(t\).

У фермера Джона есть строка \(t\) длины не более \(2\cdot 10^5\), состоящая только из символов a-z. Пожалуйста, рассчитайте \(A(t)\) и как \(A(t)\) изменится после \(U\) (\(1\le U\le 2\cdot 10^5\)) обновлений, каждое из которых изменяет символ \(t\). Обновления являются кумулятивными.

ФОРМАТ ВВОДА (ввод поступает с терминала/стандартного ввода):

Первая строка ввода содержит \(t\).

Следующая строка содержит \(U\), за которыми следуют строки по \(U\), каждая из которых содержит позицию \(p\) (\(1\le p\le N\)) и символ \(c\) в диапазоне от a до z, что означает, что \(p\)-й символ \(t\) заменяется на \(c\).

ФОРМАТ ВЫВОДА (вывод на терминал / стандартный вывод):

Выведите \(U+1\) строк — общее количество «bessie», которое можно сделать во всех подстроках \(t\) перед любыми обновлениями и после каждого обновления.

Tractor Paths

графы кратчайшие пути реализация

**Замечание: Время на тест в этой задаче 4s, в два раза больше чем по умолчанию. Ограничение по памяти для этой задачи 512MB, в два раза больше чем по умолчанию.**

У Фермера Джона \(N\) (\(2\le N\le 2\cdot 10^5\)) тракторов, где -ый трактор может использоваться только в интервале \([l_i,r_i]\) включительно. Интервалы для тракторов имеют левые конечные точки \(\ell_1<\ell_2<\dots<\ell_N\) и правые конечные точки \(r_1<r_2<\dots<r_N\). Некоторые из тракторов специальные.

Два трактора \(i\) и \(j\) называются соседними если \([\ell_i,r_i]\) и \([\ell_j,r_j]\) пересекаются. ФД может перебраться (выполнить трансфер) с одного трактора на любой соседний трактор. Путь между двумя тракторами \(a\) и \(b\) состоит трансферов таких, что первый трактор в последовательности есть \(a\), последний трактор в последовательности есть \(b\) и каждые два трактора в последовательности соседние. Гарантируется ,что имеется путь из трактора \(1\) в трактор \(N\). Длина пути - количество трансферов (или эквивалентно, количество тракторов минус один).

Вам даётся \(Q\) (\(1\le Q\le 2\cdot 10^5\)) запросов, каждый указывает пару тракторов \(a\) и \(b\) (\(1\le a<b\le N\)). Для каждого запроса выведите два целых числа:

  • Длину любого кратчайшего пути между тракторами \(a\) и \(b\).
  • Количество специальных тракторов, таких, что существует как минимум один кратчайший путь из трактора \(a\) в трактор \(b\), содержащий его.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\) и \(Q\).

Следующая строка содержит строку длины \(2N\), содержащую символы L и R, представляющие левые и правые конечные точки в отсортированном порядке. Гарантируется, что для каждого префикса этой строки количество символов L превышает количество символов R.

Следующая строка содержит битовую строку длины \(N\), представляющую для каждого трактора, является он специальным или нет.

Каждая из следующих \(Q\) строк содержит два целых числа \(a\) и \(b\), описывающих запрос.

ФОРМАТ ВЫВОДА (на экран / stdout):

Для каждого запроса выведите два числа, разделённых пробелом.

Air Cownditioning II

Перебор битмаски реализация

Очень жаркое лето. Фермер Дон решил купить некоторое количество кондиционеров.

У ФД имеется \(N\) коров (\(1 \leq N \leq 20\)), которые живут в амбаре, содержащем последовательность стойл, пронумерованные \(1 \ldots 100\). Корова \(i\) занимает диапазон стойл, начиная с \(s_i\) и заканчивая в \(t_i\). Диапазоны стойл, занимаемые коровами, не пересекаются. У коров различные требования к охлаждению. Корова \(i\) должна быть охлаждена на количество \(c_i\). Это значает, что для всех стойл, занимаемых коровой \(i\) температура должна быть уменьшена на \(c_i\) единиц.

Амбар содержит \(M\) кондиционеров, помеченных \(1 \ldots M\) (\(1 \leq M \leq 10\)). \(i\)-ый кондиционер стоит \(m_i\) единиц денег, если работает и охлаждает воздух (уменьшает температуру) в стойлах начиная в \(a_i\) и заканчивая в \(b_i\). Если работает, \(i\)-ый кондиционер уменьшает температуру во всех стойлах этого диапазона на величину \(p_i\) (\(1 \leq p_i \leq 10^6\)). Диапазоны стойл кондиционеров могут перекрываться.

Определите минимальное количество денег, которое ФД должен потратить, чтобы сделать температуру комфортабельной для всех коров во всех стойлах. Гарантируется, что это возможно сделать.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка ввода содержит \(N\) и \(M\).

Последующие \(N\) строк описывают коров. \(i\)-ая из этих строк содержит \(s_i\), \(t_i\), \(c_i\).

Последующие \(M\) строк описывают кондиционеры. \(i\)-ая из этих строк содержит \(a_i\), \(b_i\), \(p_i\), \(m_i\).

Для всех тестов, кроме тех, что в примере, можете полагать, что \(M = 10\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите одно целое число - минимальное количество денег, которое ФД должен потратить чтобы сделать комфортабельной температуру для всех коров.

Minimum Longest Trip

графы поиск в глубину и подобное реализация

Беси собирается в путешествие по Cowland, которая имеет \(N\) (\(2\le N\le 2\cdot 10^5\)) городов, пронумерованных от \(1\) до \(N\) и \(M\) (\(1\le M\le 4\cdot 10^5\)) односторонних дорог. \(i\)-ая дорога ведёт из города \(a_i\) в город \(b_i\) и имеет метку \(l_i\) (\(1\le a_i,b_i\le N\), \(1\le l_i\le 10^9\)).

Путешествие длины \(k\) начинается в городе \(x_0\) - это последовательность городов \(x_0, x_1, \ldots, x_k\), таких, что что существует дорога из города \(x_i\) в город \(x_{i+1}\) для всех \(0\le i < k\). Гарантируется, что не существует путешествий бесконечной длины, и что никакие две дороги не соединяют одну и ту же пару городов.

Для каждого города Беси хочет узнать наидлиннейшее путешествие, начинающееся в этом городе. Для некоторых стартовых городов может существовать несколько наидлиннейших путешествий - из них Беси предпочитает путешествие с лексикографически минимальной последовательностью меток дорог. Последовательность лексикографически меньше другой последовательности такой же длины, если на первой позиции, где они различаются, первая последовательность имеет меньший элемент, чем вторая последовательность.

Выведите длину и сумму меток дорог, предпочитаемого Беси путешествия, начинающегося из каждого города.

ФОРМАТ ВВОДА (с клавиатуры):

Первая строка содержит \(N\) и \(M\).

Каждая из следующих \(M\) строк содержит три целых числа \(a_i\), \(b_i\), \(l_i\), обозначающих дорогу из \(a_i\) в \(b_i\) с меткой \(l_i\).

ФОРМАТ ВЫВОДА (на экран):

Выведите \(N\) строк. \(i\)-ая строка должна содержать два разделённых одиночным пробелом целых числа длину и сумму меток дорог предпочитаемого Бесси путешествия, начинающегося в городе \(i\).

Candy Cane Feast

Жадный алгоритм Задачи на моделирование реализация

Коровы Фермера Джона любят конфетные трости. У ФД \(N\) коров с определённой начальной высотой. Он хочет скормить им \(M\) конфетных тростей, различной высоты (\(1\le N,M\le 2\cdot 10^5\)).

ФД планирует кормить коров конфетными тростями одну за одной в порядке, в котором они заданы на вводе. Чтобы кормить коров ФД вывешивает конфетные трости так, чтобы изначально они касались земли. Коровы выстраиваются одна за одной в порядке, как они заданы на входе. Каждая ест до своей высоты (потому что выше не достаёт). Трость остаётся на месте где она изначально была подвешена и не опускается к земле, даже после того как её нижняя часть съедена. Возможно, что когда подойдёт очередь некоторой коровы она ничего не сможет съест, если нижняя часть трости уже выше высоты этой коровы. После того как пройдёт очередь всех коров, они подрастают на высоту равную количеству единиц трости, которую съела корова, а ФД вывешивает новую конфетную трость и коровы повторяют процесс опять (корова 1 всегда начинает есть первой).

ФОРМАТ ВВОДА (с клавиатуры):

Первая строка содержит \(N\) и \(M\).

Следующая строка содержит начальные высоты \(N\) коров, каждая в интервале \([1,10^9]\).

Следующая строка содержит высоты \(M\) конфетных тростей, каждая в интервале \([1,10^9]\).

ФОРМАТ ВЫВОДА (на экран):

Финальные высоты каждой из \(N\) коров на отдельной строке.

Заметим, что значения, заданные в тестах могут потребовать использования 64-битного целого типа (например, "long long" в C/C++).

Balancing a Tree

Деревья Динамическое программирование: один параметр реализация

Фермер Джон изучает эволюцию пород коров. Результат - корневое дерево с \(N\) (\(2\le N\le 10^5\)) вершинами, помеченными \(1\ldots N\), каждая вершина соответствует одной породе коров. Для каждого \(i\in [2,N]\), родитель вершины \(i\) есть вершина \(p_i\) (\(1\le p_i<i\)), это означает, что порода \(i\) эволюционировала из породы \(p_i\). Вершина \(j\) называется предком вершины \(i\), если \(j=p_i\) или \(j\) предок вершины \(p_i\).

Каждая вершина \(i\) в этом дереве ассоциируется с породой, имеющей целое число пятен \(s_i\). Дисбалансом такого дерева называется максимум \(|s_i-s_j|\) по всем парам \((i,j)\) таким, что \(j\) есть предок \(i\).

Фермер Джон не знает точное значение \(s_i\) для каждой породы, но он знает нижнюю и верхнюю границу этих величин. Ваша задача - назначить значения \(s_i \in [l_i,r_i]\) (\(0\le l_i\le r_i\le 10^9\)) каждой вершине так, чтобы минимизировать дисбаланс этого дерева.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(T\) (\(1\le T\le 10\)), количество независимых подтестов в тесте. и целое число \(B\in \{0,1\}\).

Каждый подтест начинается со строки, содержащей \(N\), за которым следуют \(N-1\) целых чисел \(p_2,p_3,\ldots,p_N\).

Каждая из последующих \(N\) строк содержит целые числа \(l_i\) и \(r_i\).

Гарантируется, что сумма \(N\) по всем подтестам не превысит \(10^5\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Для каждого подтеста выведите одну или две строки в зависимости от значения \(B\).

Первая строка должна содержать минимальный дисбаланс.

Если \(B=1,\) выведите дополнительную строку с разделёнными одиночными пробелами целыми числами \(s_1,s_2,\ldots, s_N\) содержащими назначения количеств пятен для достижения вышеуказанного дисбаланса. Любое правильное назначение будет принято.

Phone Numbers

дп битмаски реализация

Беси купила новый телефон. Кнопки на нём расположены так:

123
456
789

Беси может нажимать одну клавишу, две клавиши одновременно (имеющие общую сторону, всего 12 комбинаций), 4 клавиши одновременно, которые формируют квадрат (1245, 2356, 4578, or 5689).

Например, если телефонный номер 123659874, она может сэкономить время следующим образом:

  1. Нажать 1 и 2 одновременно.
  2. Нажать 3.
  3. Нажать 6, 5, 9, 8 одноврменно.
  4. Нажать 7 и 4 одновременно.

Однако при нажатии нескольких клавиш одновременно, цифры могут могут записаться в произвольном порядке. Например, после последнего нажатия (7 и 4 одновременно) может получиться 123596847 или 213659874

По заданной последовательности цифр, вычислите количество телефонных номеров, которые она может набрать, по модулю \(10^9+7\).

**Замечание: Время на тест для этой задачи 4s, в два раза больше чем обычно..**

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(T\) (\(1\le T\le 10\)), количество независимых тестов.

Каждая из последующих \(T\) строк содержит непустую строку цифр от 1 до 9. Гарантируется, что длина этой строки не превысит \(10^5\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Для каждого теста выведите количество телефонных номеров, которые Беси может набрать по модулю \(10^9+7\).

Connecting Two Barns

графы Поиск компонент связности реализация

Ферма Джона состоит из множества \(N\) полей \((1 \leq N \leq 10^5)\), последовательно пронумерованных \(1 \ldots N\). Между этими полями имеется \(M\) двунаправленных дорожек \((0 \leq M \leq 10^5)\), соединяющих пары полей.

На этой ферме имеется два амбара - один в поле \(1\), другой в поле \(N\). ФД хочет быть уверен, что имеется путь между двумя амбарами последовательностью дорожек. Оно готов построить до двух новых дорожек, чтобы добиться своей цели. Стоимость построения дорожки между полями \(i\) и \(j\) есть \((i-j)^2\).

Помогите ФД определить минимальную стоимость сделать так, чтобы амбары \(1\) и \(N\) стали достижимы друг для друга.

ФОРМКАТ ВВОДА (с клавиатуры / stdin):

Каждый входной тест содержит \(T\) под тестов (\(1\le T\le 20\)), все из которых должны быть решены правильно, чтобы пройти этот тест.

Первая строка ввода содержит \(T\), за которым следуют \(T\) подтестов.

Каждый подтест начинается с двух целых чисел \(N\) и \(M\). Каждая из последующих \(M\) строк содержит два целых числа \(i\) и \(j\), означающих путь между двумя различными полями \(i\) и \(j\). Гарантируется, что имеется не более одного пути между любыми двумя полями. и что сумма \(N+M\) для всех подтестов не более \(5 \cdot 10^5\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(T\) строк. \(i\)-ая строка должна содержать одно целое число, минимальную стоимость для \(i\)-го подтеста.

Delegation

графы Деревья реализация

Ферма Фермера Джона состоит из \(N\) пастбищ (\(1 \leq N \leq 10^5\)) соединённых \(N-1\) дорогами, так, что любое пастбище достижимо из любого пастбища. То есть ферма представляет собой дерево.

ФД планирует разделить множество дорог на несколько путей и делегировать ответственность за каждый путь специальному человеку. Чтобы избежать раздора, он хочет, чтобы все пути имели одинаковую длину. Он хочет узнать для каких длин существуют такие разбиения.

Более точно для каждого \(1 \leq K \leq N-1\), помогите ФД определить, могут ли дороги быть распределены на пути длиной ровно \(K\).

ОЦЕНИВАНИЕ:

  • В тестах 2-4 дерево образовывает звезду; не более одной вершины имеет степень более двух.
  • В тестах 5-8 \(N\le 10^3\).
  • В тестах 9-15 нет дополнительных ограничений.

ФОРМАТ ВВОДА (файл deleg.in):

Первая строка содержит целое число \(N\).

Каждая из следующих \(N-1\) строк содержит целые числа \(a\) и \(b\), описывающие ребро между вершинами \(a\) и \(b\). Все \(a\) и \(b\) в интервале \(1 \ldots N\).

ФОРМАТ ВЫВОДА (файл deleg.out):

Выведите битовую строку длины \(N-1.\) Для каждого \(1\le K\le N-1,\) \(K\)-ый бит строки слева равный 1 означает, что возможно разбиение ребер на пути длины ровно \(K\) и равный \(0\) в противном случае.

Stuck in a Rut

графы реализация Разбор случаев

Недавно Фермер Джон увеличил размер своей фермы, теперь с точки зрения коров, она бесконечная по размеру. Коровы представляют пастбище фермы как бесконечную 2D решётку квадратных ячеек, каждая из которых заполнена вкуснейшей травой. (Думайте о каждой ячейке как о клетке на шахматной доске). Каждая из \(N\) коров (\(1\le N\le 1000\)) ФД начинает в различной ячейке. Некоторые начинают, глядя на север, а некоторые - на восток.

Каждый час корова или

  • Останавливается, если трава в текущей ячейке уже съедена другой коровой.
  • Съедает всю траву в текущей ячейке и перемещается на одну ячейку вперёд в своём исходном направлении.

Через некоторое время каждая корова оставит за собой колею пустых ячеек.

Если две коровы попадут одновременно на одну и ту же ячейку с травой, они поедят вместе и продолжат движение в своих направлениях в следующий час.

ФД не любит, когда корова прекращает пастись, и он хочет узнать, кто виноват в его остановленных коровах. Если корова \(b\) остановилась в ячейке, которую съела корова \(a\), тогда он считает, что корова \(a\) остановила корову \(b\). Более того, если корова \(a\) остановила корову \(b\), а корова \(b\) остановила корову \(c\), он считает, что корова \(a\) также остановила корову \(c\) (то есть отношение "остановила" транзитивно). Каждая корова "виновата" в количестве коров, которые она остановила. Для каждой коровы вычислите количество остановленных ею коров.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит целое число \(N\). Каждая из последующих \(N\) строк описывает стартовую позицию коровы в терминах: символ (N или E, смотри на север или на восток) и и два неотрицательных целых числа \(x\) and \(y\) (\(0\le x\le 10^9\), \(0\le y\le 10^9\)) - координаты ячейки. Все \(x\)-координаты различны. Все \(y\)-координаты различны.

Чтобы было понятнее относительно направлений и координат, если корова в ячейке \((x,y)\) и двигается на север, то она попадёт в ячейку \((x,y+1)\), а если на восток - то в ячейку \((x+1, y)\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(N\) строк. Строка \(i\) должна описывать количество коров, которые остановила \(i\)-ая по вводу корова.

Sleepy Cow Sorting

Жадный алгоритм Использование сортировки реализация

Фермер Джон пытается отсортировать свои \(N\) коров (\(1 \leq N \leq 100\)), последовательно пронумерованных \(1 \dots N\).

В настоящий момент коровы выстроились в линию в порядке \(p_1, p_2, p_3, \dots, p_N\), и ФД стоит перед коровой \(p_1\). Он хочет переупорядочить коров так, чтобы они стали в порядке \(1, 2, 3, \dots, N\), с коровой \(1\) перед ФД.

Фермера Джона слышит только корова, которая стоит перед ним. В этот момент ФД может сказать ей перейти на \(k\) позиций назад (\(k\) в интервале \(1 \ldots N-1\).). \(k\) коров, которых она проходит, двигаются вперёд, освобождая место для неё, в которое она и становится.

Например, пусть \(N=4\) и коровы стоят в таком порядке

 ФД: 4, 3, 2, 1 

Единственная корова, которая слышит ФД, это корова \(4\). Если он скажет ей сдвинуться на 2 позиции, порядок станет таким:

 ФД: 3, 2, 4, 1 

Теперь ФД слышит только корова \(3\). Теперь ей можно давать инструкцию и т.д.

Определите последовательность инструкций (с минимальным их количеством), которые должен дать ФД, чтобы отсортировать всех коров.

ФОРМАТ ВВОДА (файл sleepy.in):

Первая строка содержит \(N\). Вторая строка содержит \(N\) целых чисел, разделённых одиночными пробелами : \(p_1, p_2, p_3, \dots, p_N\), указывающих стартовый порядок коров.

ФОРМАТ ВЫВОДА (файл sleepy.out):

Первая строка должна содержать одно целое число \(K\), задающее минимальное количество инструкций, которое требуется, чтобы отсортировать всех коров.

Вторая строка должна содержать \(K\) разделённых одиночными пробелами целых чисел \(c_1, c_2, \dots, c_K\), каждое в интервале \(1 \ldots N-1\), задающих последовательность инструкций, которая отсортирует исходную последовательность коров.

Если имеется несколько оптимальных последовательностей инструкций, выведите любую.

Shortcut

кратчайшие пути графы реализация

Каждый день фермер Джон звонит в гигантский колокол, созывая своих коров в амбар на обед. Все коровы идут кратчайшим путём.

Ферма описывается как \(N\) полей (\(1 \leq N \leq 10,000\)), последовательно пронумерованных \(1 \ldots N\), амбар находится в поле 1. Поля соединены \(M\) двунаправленными тропинками (\(N-1 \leq M \leq 50,000\)). С каждой тропинкой ассоциировано время её прохождения, и от любого поля имеется путь к амбару, состоящий из некоторого множества тропинок.

Поле \(i\) содержит \(c_i\) коров. Услышав колокол, все коровы двигаются к амбару так, чтобы потратить минимальное количество времени. Если имеется несколько путей с минимальным временем, коровы выбирают "лексикографически минимальный" путь. Например, путь через поля 7,3,6,1 лексикографически минимальнее, чем путь 7,5,1.

ФД хочет сократить общее время движения (сумму времён движения всех коров) как можно больше добавлением одной сокращающей тропинки, которая имеет время прохождения \(T\) (\(1 \leq T \leq 10,000\)), от амбара (поле 1) до другого поля, которое он выберет. Если корова встретится с этой сокращающей тропинкой на своём обычном пути, тогда корова пойдёт по этой тропинке, если в результате уменьшится время её прихода в амбар. Иначе, корова пойдёт по своему обычному маршруту, даже если бы она могла уменьшить своё время в пути, используя сокращающую тропинку.

Помогите ФД определить наибольшую величину уменьшения суммарного времени движения, которое он может достичь добавлением сокращающей тропинки.

ФОРМАТ ВВОДА (файл shortcut.in):

Первая строка ввода содержит \(N\), \(M\), \(T\). Каждая из \(N\) последующих строк содержит \(c_1 \ldots c_N\) - целое число в интервале \(0 \ldots 10,000\). Каждая из последующих \(M\) строк описывает тропинку тремя целыми числами \(a\), \(b\), \(t\), обозначающими, что поля \(a\) и \(b\) соединены тропинкой время прохождения которой равно \(t\). Все времена в интервале \(1 \ldots 25,000\).

ФОРМАТИ ВВОДА (файл shortcut.out):

Выведите наибольшее возможное сокращение суммарного времени движения, которое может добиться ФД.

Out of Sorts

Использование сортировки реализация

Беси сделала гибрид из двух любимых алгоритмов пузырьковой сортировки и быстрой сортировки:

Назовём позицию между элементами \(i\) и \(i+1\) массива \(A\) точкой разбиения если максимум из \(A[...i]\) не больше чем минимум \(A[i+1 \ldots]\). Беси помнит, что быстрая сортировка реорганизует массив так, чтобы у него появилась точка разбиения, а затем рекурсивно сортирует две стороны \(A[...i]\) и \(A[i+1 \ldots]\). Однако хотя она помнит, что все точки разбиения можно найти за линейное время, она забыла как в быстрой сортировке реорганизуется массив, чтобы быстро создать точку разбиения. Она решила использовать пузырьковую сортировку для решения этой задачи

Ниже приведен алгоритм Беси Сначала она написала простую функцию, которая делает один проход пузырьковой сортировки:

bubble_sort_pass (A) {
   for i = 0 to length(A)-2
      if A[i] > A[i+1], swap A[i] and A[i+1]
}

Рекурсивный код Беси для "быстрой" сортировки такой:

quickish_sort (A) {
   if length(A) = 1, return
   do { // Main loop
      work_counter = work_counter + length(A)
      bubble_sort_pass(A)
   } while (no partition points exist in A) 
   divide A at all partition points; recursively quickish_sort each piece
}

Теперь Беси интересно, насколько быстро работает её код. Для простоты она считает, что её итерация работает линейно и поэтому она просто инкрементирует глобальную переменную work_counter внутри цикла текущим размером массива так, чтобы оценивать общую работу, выполненную алгоритмом.

По заданному входному массиву, предскажите финальное значение величины work_counter после завершения алгоритма quickish_sort.

ФОРМАТ ВВОДА (файл sort.in):

Первая строка ввода содержит \(N\) (\(1 \leq N \leq 100,000\)). Следующие \(N\) строк описывают \(A[0] \ldots A[N-1]\), каждый из которых является целым числом в интервале \(0 \ldots 10^9\). Не гарантируется, что все элементы различны.

ФОРМАТ ВЫВОДА (файл sort.out):

Выведите конечное значение величины work_counter

Milking Order

Топологическая сортировка графы реализация

\(N\) коров (\(2 \leq N \leq 100\)) Фермера Джона, последовательно пронумерованных \(1 \ldots N\) разработали структуру утреннего доения. Она основывается на двух ключевых свойствах:

1. Некоторые коровы настаивают чтобы их доили раньше - в соответствии с их социальным статусом. Например, корова 3 имеет наивысший статус, корова 3 имеет средний статус, а корова 5 имеет низкий статус, то корову 3 нужно доить первой, затем корову 2 и затем корову 5.

2. Некоторые коровы могут настаивать, чтобы их доили в определённой позиции внутри порядка. Например, корова 4 может настаивать, чтобы её доили второй среди всех коров.

По счастью, ФД всегда может подоить своих коров в порядке, удовлетворяющем всем условиям.

К несчастью, корова 1 заболела, поэтому ФД хочет подоить эту корову как можно раньше, чтобы раньше отпустить её в амбар отдыхать и выздоравливать. Помогите ФД определить самую раннюю позицию, в которой можно будет подоить корову 1.

ФОРМАТ ВВОДА (файл milkorder.in):

Первая строка содержит \(N\), \(M\) (\(1 \leq M < N\)), \(K\) (\(1 \leq K < N\)), указывающая, что у ФД \(N\) коров, \(M\) из которых организованы в социальную иерархию, \(K\) из которых требуют, чтобы их подоили в определённой позиции порядка. Следующая строка содержит \(M\) различных целых чисел \(m_i\) (\(1 \leq m_i \leq N\)). Коровы, представленные в этой строке должны доиться в порядке, в котором они появились в этой строке. Следующие \(K\) строк содержат по по два целых числа \(c_i\) (\(1 \leq c_i \leq N\)) и \(p_i\) (\(1 \leq p_i \leq N\)), указывающих, что корова \(c_i\) должна быть подоена на позиции \(p_i\).

Гарантируется, что ФД может сконструировать порядок доения, удовлетворяющий всем условиям.

ФОРМАТ ВЫВОД (файл milkorder.out):

Выведите самую раннюю позицию, на которой можно подоить корову 1.

Mooyo Mooyo

Поиск компонент связности Задачи на моделирование реализация

Имея много свободного времени, коровы Фермера Джона часто играют в видеоигры. Одна из их любимых игр похожа на Puyo Puyo. Коровья версия этой игры называется Му-Му.

Игра Му-Му происходит на высокой узкой решётке из \(N\) ячеек в высоту и (\(1 \leq N \leq 100\)) и 10 ячеек в ширину. Вот пример для \(N = 6\):

0000000000
0000000300
0054000300
1054502230
2211122220
1111111223

Каждая ячейка или пустая (обозначена 0) или содержит стог сена одного из 9 различных цветов (обозначенных символами 1..9). Гравитация вынуждает стоги сена падать вниз, поэтому никогда 0 не будет ниже, чем стог сена.

Две ячейки принадлежат одному и тому же связному региону, если они имеют общую вертикальную или горизонтальную сторону и один и тот же цвет, отличный от 0. Каждый раз, когда регион начинает содержать \(K\) или более ячеек, все его стоги сена исчезают - превращаются в 0. Если в один момент времени существует несколько таких регионов они исчезают все одновременно. Затем, гравитация может вынудить стоги сена заполнить некоторые из ячеек, которые стали нулевыми. В получившейся конфигурации могут снова образоваться региона размера не менее \(K\) ячеек. В этом случае они также исчезают (одновременно, если есть несколько таких регионов). Затем гравитация вновь двигает вниз стоги сена и процесс повторяется, пока есть хоть один регион, в котором не менее \(K\) стогов.

По заданной конфигурации доски для Му-Му вычислите финальную картинку доски после выполнения всех операций.

ФОРМАТ ВВОДА (файл mooyomooyo.in):

Первая строка ввода содержит \(N\) и \(K\) (\(1 \leq K \leq 10N\)). Оставшиеся \(N\) строк задают начальное состояние доски.

ФОРМАТ ВЫВОДА (файл mooyomooyo.out):

Выведите \(N\) строк, описывающих финальное состояние поля.

Sort It Out

Жадный алгоритм реализация разделяй и властвуй

\(N\) (\(1 \leq N \leq 10^5\)) Є®а®ў ”Ґа¬Ґа  „¦®­  (а §«Ёз­® Ё¤Ґ­вЁдЁжЁа®ў ­­ле \(1 \ldots N\)), ўлбв஥­л ў ап¤. ”„ «оЎЁв, Є®Ј¤  ҐЈ® Є®а®ўл ўлбв஥­л Ї® ў®§а бв ­Ёо, ­® ᥩз б нв® ­Ґ в Є. ”„ ўл§лў Ґв Є®а®ўл Ї® ®¤­®©. Љ®Ј¤  Є®а®ў  ўл§ў ­ , ®­  Їа®ўҐапҐв, Ґб«Ё Є®а®ў  ­ҐЇ®б।б⢥­­® бЇа ў  ®в ­Ґс Ё¬ҐҐв ¬Ґ­миЁ© ID, в®Ј¤  ®­Ё ¬Ґ­повбп ¬Ґбв ¬Ё. ‡ вҐ¬, Ґб«Ё Є®а®ў  ­ҐЇ®б।б⢥­­® б«Ґў  ®в ­Ґс Ё¬ҐҐв Ў®«миЁ© ID, ®­Ё ¬Ґ­повбп ¬Ґбв ¬Ё. Љ®а®ў  ®бв ­ ў«Ёў Ґвбп ў в®зЄҐ, Є®Ј¤  Є®а®ў  б«Ґў  ®в ­Ґс Ё¬ҐҐв ¬Ґ­миЁ© ­®¬Ґа,   Є®а®ў  бЇа ў  ®в ­Ґс Ё¬ҐҐв Ў®«миЁ© ­®¬Ґа.

”„ е®зҐв ўлЎа вм Ї®¤¬­®¦Ґбвў® Є®а®ў, Ё § вҐ¬ Їа®ЁвҐаЁа®ў вмбп Ї® н⮬㠯®¤¬­®¦Ґбвўг, ўл§лў п Є ¦¤го Ё§ нвЁе Є®а®ў Ї® ®зҐаҐ¤Ё (ў Ї®ап¤ЄҐ ў®§а бв ­Ёп Ёе ID), ®Їпвм Ё ®Їпвм ¤® вҐе Ї®а, Ї®Є  ўбҐ Є®а®ўл ­Ґ бв ­гв ®вб®авЁа®ў ­л. Ќ ЇаЁ¬Ґа, Ґб«Ё ®­ ўлЎҐаҐв Ї®¤¬­®¦Ґбвў® Є®а®ў б ID \(\{2, 4, 5\}\), в® ®­ б­ з «  ўл§®ўҐв Є®а®ўг \(2\), § вҐ¬ Є®а®ўг \(4\), § вҐ¬ Є®а®ўг \(5\). …б«Ё ўбҐ \(N\) Є®а®ў Ґйс ­Ґ ®вб®авЁа®ў ­л, ®­ Ўг¤Ґв ўл§лў вм нвЁе Є®а®ў ®Їпвм Ё ®Їпвм, бЄ®«мЄ® ­г¦­® а §.

”„ е®зҐв ¬Ё­Ё¬Ё§Ёа®ў вм а §¬Ґа нв®Ј® ¬­®¦Ґбвў . Ѓ®«ҐҐ в®Ј®, Ї®бЄ®«мЄг ®­ бзЁв Ґв зЁб«® \(K\) бз бв«Ёўл¬, Ї®¬®ЈЁвҐ Ґ¬г ®ЇаҐ¤Ґ«Ёвм \(K\)-®Ґ «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬Ё­Ё¬ «м­®Ґ Ї®¤¬­®¦Ґбвў® ¬Ё­Ё¬ «м­®Ј® а §¬Ґа  в Є®Ґ, зв® ўл§лў п Ї®б«Ґ¤®ў вҐ«м­® Є®а®ў нв®Ј® Ї®¤¬­®¦Ґбвў  ­г¦­®Ґ Є®«ЁзҐбвў® а § ¬®¦­® ®вб®авЁа®ў вм ўбҐе Є®а®ў.

Џ®¤¬­®¦Ґбвў® \(S\) Ё§ \(\{1,\dots,N\}\) ­ §лў Ґвбп «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬Ґ­миҐ, 祬 Ї®¤¬­®¦Ґбвў® \(T\) Ґб«Ё бЇЁб®Є н«Ґ¬Ґ­в®ў ў \(S\) (ў Ї®ап¤ЄҐ ў®§а бв ­Ёп) «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬Ґ­миҐ, зҐ бЇЁб®Є н«Ґ¬Ґ­в®ў Ё§ \(T\) (ў Ї®ап¤ЄҐ ў®§а бв ­Ёп). Ќ ЇаЁ¬Ґа, \(\{1, 3, 6\}\) «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬Ґ­миҐ, 祬 \(\{1, 4, 5\}\).

ЋжҐ­Ёў ­ЁҐ: ‚ вҐбв е ­  \(3/16\) Ў ««®ў \(N \leq 6\) and \(K = 1\). ‚ ¤®Ї®«­ЁвҐ«м­ле вҐбв е ­  \(5/16\) Ў ««®ў, \(K = 1\). ‚ ¤®Ї®«­ЁвҐ«м­ле вҐбв е ­  \(8/16\) Ў ««®ў, ­Ґв ¤агЈЁе ®Ја ­ЁзҐ­Ё©.

”ЋђЊЂ’ ‚‚Ћ„Ђ (д ©« itout.in):

ЏҐаў п бва®Є  ᮤҐа¦Ёв ®¤­® 楫®Ґ зЁб«®, \(N\). ‚в®а п бва®Є  ᮤҐа¦Ёв ®¤­® 楫®Ґ зЁб«®, \(K\) (\(1 \leq K \leq 10^{18}\)). ’аҐвмп бва®Є  ᮤҐа¦Ёв \(N\) а §¤Ґ«с­­ле ®¤Ё­®з­л¬Ё Їа®ЎҐ« ¬Ё 楫ле зЁбҐ«, ЇаҐ¤бв ў«пойЁе ID Є®а®ў б«Ґў  ­ Їа ў®.

ѓ а ­вЁагҐвбп, Ўг¤Ґв Є Є ¬Ё­Ё¬г¬ \(K\) Є®а४в­ле Ї®¤¬­®¦Ґбвў.

”ЋђЊЂ’ ‚›‚Ћ„Ђ (д ©« itout.out):

ЏҐаў п бва®Є  ўлў®¤  ᮤҐа¦Ёв а §¬Ґа ¬Ё­Ё¬ «м­®Ј® Ї®¤¬­®¦Ґбвў . Ћбв ўиЁҐбп бва®ЄЁ ¤®«¦­л ᮤҐа¦ вм ID Є®а®ў ў \(K\)-®¬ «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬Ё­Ё¬ «м­®¬ Ї®¤¬­®¦Ґб⢥ ¬Ё­Ё¬ «м­®Ј® а §¬Ґа ,Ї® ®¤­®¬г ID ў бва®ЄҐ, ў Ї®ап¤ЄҐ ў®§а бв ­Ёп.

Џђ€Њ…ђ ‚‚Ћ„Ђ:

4 1
4 2 1 3

Џђ€Њ…ђ ‚›‚Ћ„Ђ:

2
1
4

Њл ­ зЁ­ Ґ¬ б ¬ ббЁў  \(\mathtt{\:4\:\; 2\:\; 1\:\; 3\:}\). Џ®в®¬ ”„ ўл§лў Ґв Є®а®ўг б ID 1Ў Ї®«гзЁвбп ¬ ббЁў \(\mathtt{\:1\:\; 4\:\; 2\:\; 3\:}\). Џ®в®¬ ”„ ўл§лў Ґв Є®а®ўг б ID 4 Ї®«гзЁвбп ¬ ббЁў \(\mathtt{\:1\:\; 2\:\; 3\:\; 4\:}\). ‚ нв®© в®зЄҐ ¬ ббЁў ®вб®авЁа®ў ­.

Problem credits: Spencer Compton

Field Reduction

реализация

\(N\) коров (\(3 \leq N \leq 50,000\)) фермера Джона размещены в различных позициях его двумерного поля. ФД хочет огородить всех коров прямоугольным забором, стороны которого параллельны осям координат x и y. ФД хочет, чтобы забор был как можно меньше, и содержал всех коров (допускается размещение коров на границе забора).

К несчастью бюджет ФД ограничен, поэтому он решил построить ещё меньший забор, продав до трёх коров.

Помогите ФД вычислить наименьшую возможную площадь, которую он может огородить, забором после удаления не более трёх коров из стада и огораживания оставшихся коров.

Для этой задачи рассматриваем коровы как точки, а забор как коллекцию из четырёх отрезков прямых. (То есть не думайте о корове как единичном квадрате). Заметим, что ответ может быть равным 0, например, если оставшиеся коровы все стоят на одной вертикальной или горизонтальной прямой.

ФОРМАТ ВВОДА (файл reduce.in):

Первая строка ввода содержит \(N\). Каждая их следующих \(N\) строк содержит два целых числа, указывающих координаты коровы. Координаты - положительные целые числа в интервале \(1 \ldots 40,000\).

ФОРМАТ ВЫВОДА (файл reduce.out):

Выведите целое число, указывающее минимальную площадь, которую огородит своим забором ФД после удаления до трёх правильно выбранных коров.

Bull in a China Shop

Перебор реализация

Фермер Джон решил украсить свой дом. Посетив китайский магазинчик, он нашёл стеклянную фигурку коровы и решил её купить.

Форма коровы описывается решёткой из \(N \times M\) (\(3 \leq N, M \leq 500\)) символов (на рисунке ниже приведён пример). Различные символы (маленькие латинские) обозначают различные цвета, а символ '.' - отсутствие фигуры.

 


...............
...............
x..x...........
xxxx...........
xxxxaaaaaaa....
.xx.aaaaaaaaa..
....aaaaaaa.aa.
....ll...ll....
....vv...vv....
...............

К несчастью до покупки в магазинчик ворвался бык, всё разгромил и сломал фигурку ФД на три части, которые затерялись на полу среди \(K\) (\(4 \leq K \leq 100\)) других кусков на полу. Каждый из \(K\) кусков на полу описывается аналогично тому как это сделано выше.

Помогите ФД определить сколько наборов из 3 кусков (из \(K\) валяющихся на полу) могут составить сломанную фигуру.

Куски на полу могут перемещаться горизонтально и вертикально, переворачиваться горизонтально и вертикально, а также поворачиваться на количество градусов, кратное 90. Они должны составить точно исходную фигурку — каждая позиция должна быть представлена ровно одним куском.

 

ФОРМАТ ВВОДА:

Первая строка содержит одно целое число \(K\). Далее идут \(K + 1\) описаний. Первое описывает оригинальную фигурку, остальные \(K\) - описание кусков на полу.

Каждое описание начинается со строки, содержащей два целых числа \(R\) и \(C\) (\(1 \le R, C \le 100\)). Последующие \(R\) строк содержат по \(C\) маленьких латинских символов, описывающих цвет каждой ячейки. Каждый кусок соединяется горизонтально или вертикально и имеет хотя бы одну не-пустую ячейку.

 

ФОРМАТ ВЫВОДА:

Выведите количество триплетов \(i, j, k\) (\(i < j < k\)) таких, что куски \(i\), \(j\), и \(k\) могут составить исходную фигурку коровы.

 

ПРИМЕР ВВОДА:


5
5 5
aaaaa
..a..
bbabb
..a..
aaaaa
3 5
..abb
..a..
aaaaa
5 2
a.
a.
aa
a.
a.
1 2
bb
1 5
bbabb
2 5
aaaaa
..a..

ПРИМЕР ВЫВОДА:


3

Эти три решения используют куски \((0, 1, 2)\), \((0, 2, 4)\), \((1, 3, 4)\). Заметим, что эта задача имеет 6 секунд на тест (а для Питона и Java - 12)

 

Field Reduction

реализация

\(N\) коров (\(3 \leq N \leq 50,000\)) фермера Джона размещены в различных позициях его двумерного поля. ФД хочет огородить всех коров прямоугольным забором, стороны которого параллельны осям координат x и y. ФД хочет, чтобы забор был как можно меньше, и содержал всех коров (допускается размещение коров на границе забора).

К несчастью бюджет ФД ограничен, поэтому он решил построить ещё меньший забор, продав одну корову.

Помогите ФД вычислить наименьшую возможную площадь, которую он может огородить, забором после удаления одной коровы из стада и огораживания оставшихся \(N-1\) коров.

Для этой задачи рассматриваем коровы как точки, а забор как коллекцию из четырёх отрезков прямых. (То есть не думайте о корове как единичном квадрате). Заметим, что ответ может быть равным 0, например, если оставшиеся коровы все стоят на одной вертикальной или горизонтальной прямой. Наконец, поскольку \(N\) может быть довольно большим, Вы должны написать программу, которая будет работать достаточно быстро.

ФОРМАТ ВВОДА (файл reduce.in):

Первая строка ввода содержит \(N\). Каждая их следующих \(N\) строк содержит два целых числа, указывающих координаты коровы. Координаты - положительные целые числа в интервале \(1 \ldots 40,000\).

ФОРМАТ ВЫВОДА (файл reduce.out):

Выведите целое число, указывающее минимальную площадь, которую огородит своим забором ФД после удаления правильно выбранной коровы.

Bull in a China Shop

Перебор реализация Задачи на моделирование

Фермер Джон решил украсить свой дом. Посетив местный китайский магазинчик, увидел стеклянную фигурку коровы и решил её купить.

Форма этой коровы описывается решёткой из \(N \times N\) символов (\(3 \leq N \leq 8\)), пример показан ниже, где символы '#' представляют часть коровы, а символы '.' не части коровы.

...............
...............
...............
#..#...........
####...........
############...
.##.#########..
....#######.##.
....##...##....
....##...##....
...............
...............
...............
...............
...............

К несчастью, ФД ещё не спел купить корову, как в магазинчик ворвался бык, который поломал всё вокруг, включая корову ФД. Корова разломалась на две части, которые затерялись среди других \(K\) (\(3 \leq K \leq 10\)) кусков стекла на полу. Каждый из этих \(K\) кусков описывается решёткой \(N \times N\) символов, как и исходная фигурка.

Помогите ФД определить, какие из этих \(K\) кусков являются двумя частями фигурки ФД. При падении на землю куски ФД не поворачивались и не переворачивались, поэтому для их сборки ФД должен только сдвигать куски горизонтально или вертикально. Куски не могут наезжать друг на друга и должны сформировать точно исходную фигуру.

ФД может двигать оба куска горизонтально и/или вертикально на любое количество позиций, но так, чтобы все символы '#' оставались внутри решётки \(N \times N\). Форма каждого из кусков необязательно состоит из связного региона символов '#'. Но при сдвиге все они сдвигаются на одинаковое количество позиций.

ФОРМАТ ВВОДА (файл bcs.in):

Первая строка ввода содержит \(N\) и \(K\). Следующие \(N\) строк описывают исходную фигурку ФД. Следующие \(KN\) строк задают \(K\) решёток символов, описывающих \(K\) кусков, которые ФД нашёл на полу.

ФОРМАТ ВЫВОДА (файл bcs.out):

Выведите одну строку, содержащую два разделённых пробелом целых числа, каждое в интервале \(1 \ldots K\), указывающих индексы двух кусков коровы ФД. Решение всегда существует и уникально. Числа, которые Вы выведете, должны быть в порядке возрастания.

Trapped in the Haybales (Silver)

Жадный алгоритм Отрезки реализация

Фермер Джон получил груз из \(N\) больших стогов сена (\(1 \le N \le 100,000\)), и разместил стога в различных позициях вдоль дороги, соединяющей амбар с его домом. Каждый стог с номером \(j\) имеет размер \(S_j\) и находится в уникальной позиции \(P_j\) определяющей его положение вдоль одномерной дороги. Корова Беси расположена в настоящий момент в позиции \(B\),где нет стога сена. Беси может передвигаться вдоль дороги вплоть до позиции, где расположен стог сена, но она не может проходить эту позицию. Как исключение, если она движется в некотором направлении \(D\) единиц расстояния, то она набирает скорость достаточную чтобы уничтожить любой стог сена с размером строго меньше, чем \(D\). Конечно после того как она сделает это, она может бежать дальше к другим стогам и уничтожать их аналогичным способом.

ФД перекрасил дои и амбар и хочет быть уверенным, что Беси не доберётся ни туда, ни туда (Корова и свежая краска не есть хорошая комбинация!). Соответственно, ФД хочет быть уверенным, что Беси никогда не выйдет ни за самый левый, ни за самый правый стог. ФД может добавить сена в один стог по своему выбору, так чтобы гарантировать, что Беси не выберется. Пожалуйста, помогите ему определить минимальное количество дополнительного размера, который он должен добавить к некоторому стогу сена, чтобы гарантировать, что Беси останется в ловушке.

ФОРМАТ ВВОДА (файл trapped.in):

Первая строка ввода содержит \(N\) и начальную позицию Беси \(B\). Каждая из последующих \(N\) строк описывает стог и содержит два целых числа, определяющих его размер и местоположение. Все размеры и положения находятся в диапазоне \(1\ldots 10^9\).

ФОРМАТ ВЫВОДА (файл trapped.out):

Выведите одно целое число, определяющее минимальное количество сена, которое должен добавить ФД чтобы Беси не выбралась из ловушки. Выведите -1, если это сделать невозможно.

Roadblock

кратчайшие пути графы реализация

Problem 2: Roadblock [Brian Dean]
Каждое утро Фермер Джон по ферме от своего дома к амбару. Ферма это коллекция из N полей (1<=N<=250), соединённых M двунаправленными дорожками (1<=M<=25,000) определённой длины. Дом фермера находится на поле 1, а амбар – на поле N. Никакие два поля не соединены более чем одной дорожкой. И существует путь (как последовательность дорожек) из любого поля к любому. Перемещаясь от поля к полю, ФД всегда выбирает маршрут, состоящий из последовательности дорожек, имеющих наименьшую общую длину. Коровы «вредничают». Они планируют построить стог сена ровно на одной из M дорожек, тем самым увеличив вдвое её длину. Коровы хотят выбрать такую дорожку, чтобы максимизировать увеличение маршрута ФД от дома к амбару. Помогите коровам определить, насколько они могут удлинить маршрут ФД.
PROBLEM NAME: rblock
Формат входных данных
* Строка 1: Два разделённых пробелом целых числа, N и M.
* Строки 2..1+M: Строка j+1 описывает j-ую двунаправленную дорожку тремя разделёнными пробелами числами Aj Bj Lj, где Aj и Bj это числа в диапазоне1..N, указывающие поля, соединённые этой дорожкой, а L – длина этой дорожки (в диапазоне 1...1,000,000).
Формат выходных данных
* Строка 1: Максимально возможное увеличение длины кратчайшего маршрута ФД, которого можно достичь удвоением длины одной дорожки.
Примечание
Если коровы удвоят длину дорожки из поля 3 в поле 3 (от 3 до 6), тогда кратчайший маршрут ФД станет 1-3-5 с длиной 1+7=8, что увеличивает на 2 первый кратчайший путь.

Hill Walk

геометрия реализация графы


Имется N (1 <= N <= 100,000) холмов. Каждый холм имеет форму отрезка из точки (x1, y1) в точку (x2, y2) где x1 < x2 и y1 < y2. Никакие из этих отрезков не пересекаются и не касаются даже в конечных точках. Кроме того, для первого холма справедливо (x1,y1) = (0,0).
Беси начинает свой путь в точке (0,0) на первом холме. Когда Беси попадает на холм, она карабкается вверх пока не достигнет конца холма. Затем она прыгает вниз. Если она приземлится на другой холм, она продолжит карабкание уже на этом холме, иначе она падает в бездну (где y=-бесконечности). Каждый холм (x1, y1) -> (x2, y2) необходимо рассматривать как содержащий точку (x1, y1), но не содержащий точку (x2, y2), поэтому Бэси приземляется на холм, если она падает на него сверху с позиции x = x1, но не приземлится на него, если она падает сверху с позиции x = x2.
Посчитайте общее количество холмов, которых Беси коснется в некоторой точке во время своего путешествия.
PROBLEM NAME: hillwalk
Формат входных данных
* Строка 1: Количество холмов, N.
* Строки 2..1+N: Строка i+1 содержит четыре целых числа (x1,y1,x2,y2) описывающих холм i. Каждое целое число находится в диапазоне 0..1,000,000,000.
Формат выходных данных
* Строка 1: Количество холмов, которых коснется Беси за время своего путешествия.
Примечание
Беси пройдется по холмам #1, #4, #3.

Video Game

Динамическое программирование Конечные автоматы реализация


Беси играет в видеоигру. В этой игре 3 буквы 'A', 'B', 'C' - все управление. Эти буквы можно нажимать в любом порядке, однако возможны только N (1<=N<=20) различных комбинаций. Комбинация I представлена строкой Si с длиной от 1 до 15 символов, содержащей только символы 'A', 'B', 'C'.
Когда Беси нажимает комбинацию букв, соответствующую какой-то из введенных строк, она получает один балл. Комбинации могут перекрываться и даже заканчиваться одновременно. Например, если N=3 и три возможные комбинации есть "ABA", "CB" и "ABACB", а Беси набрала ABACB, она получит 3 балла. Беси может получать очко за каждую комбинацию более чем один раз.
Беси конечно хочет заработать как можно больше баллов. Если она нажмет ровно K (1<=K<=1000) клавиш, какое максимальное количество баллов она может заработать?
PROBLEM NAME: combos
Формат входных данных
* Строка 1:Два разделенных пробелом целых числа: N и K.
* Строки 2..N+1: Строка i+1 содержит только одну строку Si, представляющую комбинацию i.
Формат выходных данных
* Строка 1: Одно целое число, максимальное количество баллов, которое может набрать Беси


Примечание
Оптимальная последовательность клавиш есть ABACBCB, которая дает 4 балла 1 от ABA, 1 от ABACB, и 2 от CB.

Roadblock

кратчайшие пути графы реализация


Каждое утро Фермер Джон идет от дома к амбару. Ферма представляет собой множество из N полей (1 <= N <= 100) (дом на поле 1, амбар на поле N), соединенных M (1 <= M <= 10,000) двунаправленными дорогами, с каждой из которых ассоциирована длина.
Никакие два поля не соединены более чем одной дорогой, и существует маршрут дорог от любого поля к любому. Когда ФД идет от одного поля к другому, он всегда выбирает маршрут, состоящий из последовательности дорог, которые дают минимальную суммарную длину.
Коровы решили сделать ФД маленькую неприятность, выложив сено на одной из M дорог, тем самым удваивая ее длину.
Коровы хотят выбрать такую дорожку, чтобы максимально увеличить расстояние, которое ФД пройдет от дома до амбара. Помогите коровам определить, насколько они удлинят маршрут ФД.
PROBLEM NAME: rblock
Формат входных данных
* Строка 1: Два разделенных пробелом целых числа, N (1 <= N <= 100) и M (1 <= M <= 10,000).
* Строки 2..1+M: Строка j+1 описывает j-ую двунаправленную дорожку тремя разделенными пробелами целыми числами Aj Bj Lj, где Aj и Bj это числа от 1 до N, указывающие поля, соединенные этой Дорогой, а Lj - длина этой дороги (в диапазоне 1...1,000,000).
Формат выходных данных
* Строка 1: Максимально возможное увеличение общей длины кратчайшего маршрута, которого можно добиться удвоением длины одной дороги.
Примечание
Если коровы удвоят длину дороги от поля 3 к полю 4 (от 3 до 6), тогда кратчайшим маршрутом станет путь 1-3-5, с общей длиной 1+7= 8. Что на 2 больше, чем исходный кратчайший маршрут.

Цветочек

Цикл for Линейные алгоритмы реализация

Нарисуйте цветочек из шести окружностей

  1. Начало в (0, 0), перо опущено.
  2. Нарисуйте окружность радиусом 100.
  3. Поверните Черепашку на 60 градусов влево
  4. Повторите пункты 2-3 шесть раз

B. Три матрицы

матрицы Вывод формулы реализация

Прямо сейчас Вася изучает линейные уравнения. Он придумал неплохую задачу. В этой задаче вам дана матрица W размера n × n, состоящая из целых чисел, ваша задача — найти две матрицы A и B размера n × n, при этом должны выполняться все следующие условия:

  • Aij = Aji, для всех i, j (1 ≤ i, j ≤ n);
  • Bij =  - Bji, для всех i, j (1 ≤ i, j ≤ n);
  • Wij = Aij + Bij, для всех i, j (1 ≤ i, j ≤ n).

А вам по силам эта задачка?

Входные данные

В первой строке записано целое число n (1 ≤ n ≤ 170). Каждая из следующих n строк содержит n целых чисел: j-ое число в i-ой строке равняется Wij (0 ≤ |Wij| < 1717).

Выходные данные

В первых n строках должна быть записана матрица A. В следующих n строках должна быть записана матрица B. Выведите матрицы в формате, равном формату матрицы W во входных данных. Гарантируется, что ответ существует. Если правильных ответов несколько, можете вывести любой из них.

Ответ будет считаться корректным, если его абсолютная или относительная погрешность не превосходит 10 - 4.

Реверс строки

Строки реализация

Напишите программу, которая делает реверс строки. То есть переставляет символы строки в обратном порядке. Программу реализуйте с использованием указателей.

Формат входных данных
Строка, содержащая алфаитно-цифровые символы (кроме пробела). Длина строки не более 100 символов.

Формат выходных данных
Выведите строку, получившуюся после реверса

66153

Задача на реализацию Задачи на моделирование реализация

Иван Фёдорович сыщик с очень большим стажем. Однажды в городе произошла серия больших ограблений. На местах ограбления не было обнаружено ни улик, ни зацепок. Однажды грабителей практически застали врасплох, но они смогли скрыться. На месте преступления Иван Фёдорович заметил, что грабители обронили папку с листком и набором картонных карточек, с вырезанными окошками на этих картах. Придя в офис и рассмотрев улики подробнее, было замечено, что на листке напечатана прямоугольная матрица, состоящая из цифр, а карточки все были размером с матрицу, притом отверстия, вырезанные в карточках, отображали какие-то случайные цифры из матрицы.
Иван Фёдорович вспомнил, что когда-то сталкивался с подобной схемой обозначения мест ограбления, что карточки помогали определить координаты следующего места ограбления. Потому Иван Фёдорович решил выписать координаты всех мест преступлений в виде долготы и широты, а далее найти карточки, которые соответствуют координатам следующих мест преступлений.
Помогите ему быстрее найти преступников, определив координаты следующих мест преступлений.
Координаты преступления собираются при помощи карточки следующим образом:

  • на матрицу накладывается карточка;
  • далее двигаясь по каждой строке по порядку слева-направо, выписываются цифры, которые попали в прорези;
  • цифр всегда 18, притом координаты всегда состоят из 8цифр (две целой части, шесть вещественной), значит два символа игнорируются и обозначают точку в вещественном числе в соответствующем порядке.
Пример матрицы и карточки (где белые участки – это вырезы (отверстия)).

Таким образом начинаем выписывать цифры по строкам слева-направо: 554755831378617673. Знаем, что цифр обозначающих координату 8, а две лишние – обозначающие запятые, получим координаты 55.755831 37.617673.
Также на каждой карточке Иван Фёдорович заметил на углу пометку, которая, как позднее он понял, определяет, как должна быть развёрнута карточка, так как метка должна при наложении всегда находиться в левом верхнем углу при взгляде на неё:
  • 1 – метка в левом верхнем углу карточки;
  • 2 – метка в правом верхнем углу карточки;
  • 3 – метка в правом нижнем углу карточки;
  • 4 – метка в левом нижнем углу карточки.
Входные данные
на первой строке подаётся целое число K (2 <= K <= 100) – количество преступлений, которые совершили грабители;
далее на K строках подаются координаты предыдущих мест преступлений в виде вещественных чисел с точкой, разделённых пробелом (например, 55.755831 37.617673)
на следующей строке подаются размеры матрицы и карточек в виде целых чисел N, M (5 <= N,M <= 1000), где N – количество строк матрицы, а M – количество столбцов;
далее на N строках подаются по M цифр матрицы;
после подаётся на новой строке целое число – количество карточек L (K < L <= 100); 
далее подаётся на одной строке L цифр от 1 до 4 через пробел, которые отображаются метки карточка в соответствии с порядком их появления;
затем L раз по N строк и M цифр подаются карточки по порядку их появления, которые содержат либо цифру 1 – обозначающую наличие прорези на ней, либо 0 – если прорези в этом месте на карточке нет.
Выходные данные
выведите все координаты будущих мест преступлений (каждую с новой строки), отсортировав их по возрастанию (если две координаты одинаковые по первой координате, то сортировать по возрастанию по второй), координаты одного места выводить через пробел.
Примечание:
·при выводе дробной части координат выводить всегда 6 знаков, если знаков меньше, то дополнять их незначащими нулями;
·если матрица прямоугольная, то гарантируется, что при совмещении метки на карточке с левым верхним углом матрицы, карточка совпадёт с размером матрицы;
·данные на карточках нельзя отзеркаливать (переворачиватькарточки не в плоскости OXY);
·гарантируется, что если даны метки на карточках, то при повороте карточка совпадёт с размером матрицы, не будет такого, что карточка будет иного размера, чем матрица.

65997

Клеточная геометрия Задачи на моделирование реализация

Город имеет форму прямоугольника с вершинами в точках (-W,-H), (-W,H), (W,H),(W,-H).
Плоскость разбита на кварталы. Квартал — это единичная клетка, вершины которой имеют целочисленные координаты. Назовем квартал городским, если все вершины квартала находятся внутри города (считается, что точка на границе принадлежит городу). Всего в городе будет 4·W·H кварталов.
Дорожная сеть состоит из N дорог (часть дорог или все проходят через город).
Дорога — это прямая линия, не параллельная осям координат.
Дорога задается двумя различными точками на ней (точки могут находиться вне города).
Для каждого квартала определим "значимость". Значимость квартала равна количеству дорог, проходящих через этот квартал. Считается, что дорога проходит через квартал, если имеет с кварталом не менее двух общих точек.
Найдите значение "значимости" для каждого квартала. Для каждой полученной "значимости" определите количество кварталов, имеющих эту значимость.

Формат входных данных
В первой строке заданы значения W, H, N (9<W,H<201, 0<N<1001)
В следующих N строках задано по четыре числа (координаты двух точек прямой, определяющих дорогу).

Формат выходных данных
В первой строке выведите число K - количество различных ненулевых значений "значимости".
В следующих K строках выведите по два числа - значение "значимости" и количество кварталов, имеющих такое значение "значимости".


Примечание к примеру

Город расположен в прямоугольнике со сторонами 8 и 6 клеток (всего 48 кварталов)
Через город проходят 4 дороги AB, CD, EF, GH
Значимость 1 будет у 24 кварталов (коричневый цвет на рисунке)
Значимость 2 будет у 5 кварталов (зеленый цвет на рисунке)
Значимость 4 будет у 1 кварталов (красный цвет на рисунке)
18 кварталов будут иметь значимость равную 0 (на печать не выводиться)

65961

Алгоритмы обработки Словари реализация

Агрохолдинг «Дикое Поле» анализирует результаты сбора урожая. Известно, сколько тонн зерна убрали на каждом из N полей, находящихся в распоряжении холдинга. Так как несколько огромных полей сильно влияют на среднее, в агрохолдинге решили ввести другую метрику. Опорными называются поля, урожай с которых превышает пороговое значение, но меньше среднего. Определите наиболее часто встречающийся урожай с опорного поля.
Формат ввода
На вход программе в первой строке подаётся натуральное число N (N ≤ 1000) – количество полей. Во второй строке подаётся натуральное число M (M≤ 100 т) – пороговое значение урожая с поля. Далее в N строках идёт по одному натуральному числу mi – масса урожая с поля номер i (1≤ mi ≤1000 т).
Формат вывода
Вывести одно целое число – наиболее часто встречающийся урожай с опорного поля. Если таких значений несколько, выведите наибольшее. Если таких значений нет, выведите 0.

Рамазан и капуста

Отрезки Сжатие координат реализация

Рамазан решил заняться серьезным бизнесом — выращиванием капусты.

Поле для выращивания капусты представляет собой бесконечное клетчатое поле. В каждой клетке поля может быть посажен один кочан капусты.

Рамазан засадил только часть поля. Он запланировал использовать несколько прямоугольных участков поля, причём оказалось, что некоторые из них могут пересекаться. Клетка поля принадлежит посадкам, если она лежит хотя бы в одном из прямоугольников.


Формально, Рамазан выбрал \(n\) прямоугольных участков \((x_i^{L}, y_i^{L}, x_i^{R}, y_i^{R})\) (\(x_i^{L} \leq x_i^{R}\), \(y_i^{L} \leq y_i^{R}\), \(1 \leq i \leq n\)). Клетка \((x, y)\) содержит капусту, если существует хотя бы один выбранный прямоугольник \(i\) (\(1 \leq i \leq n\)), такой что \(x_i^{L} \leq x \leq x_i^{R}\) и \(y_i^{L} \leq y \leq y_i^{R}\).

В прошлом Рамазан был программистом (и победителем), поэтому он решил использовать роботов с искусственным интеллектом для периодической обработки посадок. Один робот может обслуживать произвольный горизонтальный участок клеток \((x_1^{robot}, x_2^{robot}, y^{robot})\), то есть все клетки \((x, y)\), такие что \(x_1^{robot} \leq x \leq x_2^{robot}\) и \(y = y^{robot}\).

Важно, чтобы роботы ездили только по участкам с посадками. Он понял, что для минимизации количества роботов важно использовать горизонтальные участки, которые нельзя расширить. Рамазан будет использовать робота на участке клеток \((x_1^{robot}, x_2^{robot}, y^{robot})\), если:

  • Все клетки \((x, y)\), такие что \(x_1^{robot} \leq x \leq x_2^{robot}\) и \(y = y^{robot}\) принадлежат посадкам;

  • Клетка \((x_1^{robot} - 1, y^{robot})\) не принадлежит посадкам;

  • Клетка \((x_2^{robot} + 1, y^{robot})\) не принадлежит посадкам.

Ваша задача собрать важную статистику о роботах, которые будут работать на плантации. Будем говорить, что пара \((x_1, x_2)\) обслуживается в ряду \(y\), если существует робот, работающий ровно на участке \((x_1, x_2, y)\).

  • Найдите все пары \((x_1, x_2)\), которые обслуживаются в каком-нибудь ряду.

  • Для каждой такой пары \((x_1, x_2)\) найдите количество рядов, в которых она обслуживается.

  • Для каждой такой пары \((x_1, x_2)\) найдите максимальное количество подряд идущих рядов, в которых она обслуживается. Другими словами, найдите максимальное число \(k\), такое что существует отрезок \(k\) подряд идущих рядов \([y_1, y_2]\) (\(y_2 - y_1 + 1 = k\)), такой что для любого ряда \(y_1 \leq y \leq y_2\), пара \((x_1, x_2)\) обслуживается в ряду \(y\).


Формат входных данных
Каждый тест состоит из нескольких наборов входных данных. В первой строке дано одно целое число \(t\) (\(1 \leq t \leq 200\,000\)) — количество наборов входных данных. Далее следуют описания наборов входных данных.

В первой строке каждого набора входных данных дано единственное целое число \(n\) (\(1 \leq n \leq 200\,000\))  — количество выбранных прямоугольных участков.

В следующих \(n\) строках дано по четыре целых числа \(x_i^{L}\), \(y_i^{L}\), \(x_i^{R}\), \(y_i^{R}\) (\(1 \leq x_i^{L} \leq x_i^{R} \leq 10^9\), \(1 \leq y_i^{L} \leq y_i^{R} \leq 10^9\)) — описания выбранных прямоугольных участков.

Обозначим за \(N\) сумму \(n\) по всем наборам входных данных в одном тесте. Гарантируется, что \(N \leq 200\,000\).

Формат выходных данных
Для каждого набора входных данных сначала выведите единственное целое число \(p\) (\(p \geq 1\)) — количество пар \((x_1, x_2)\), которые обслуживаются в каком-нибудь ряду.

В следующих \(p\) строках выведите по четыре целых числа \(x_1\), \(x_2\), \(cnt\), \(k\) (\(1 \leq x_1 \leq x_2 \leq 10^9\), \(0 \leq cnt, k \leq 10^9\)). Число \(cnt\) должно быть равно количеству рядов, в которых обслуживается пара \((x_1, x_2)\). Число \(k\) должно быть равно максимальному количеству подряд идущих рядов, в которых обслуживается пара \((x_1, x_2)\).

Все пары \((x_1, x_2)\) должны быть различны. Каждая пара, которая обслуживается в каком-нибудь ряду, должна быть выведена ровно один раз. Можно вывести пары в произвольном порядке.


Система оценки
Для набора входных данных обозначим за \(w\) ширину поля, то есть \(w = \max\limits_{i=1}^{n} x_i^{R}\), за \(h\) высоту поля, то есть \(h = \max\limits_{i=1}^{n} y_i^{R}\).

3-5 [0cm][0cm]Подз. [0cm][0cm]Баллы \(n\), \(N\) \(w, h\) дополнительно

[0cm][0cm]

Необх. подзадачи

 
1 4 \(n = 1\)        
2 8   \(h = 1\)      
3 8 \(n \leq 30\), \(N \leq 3000\) \(w, h \leq 10\) \(t \leq 100\) У  
4 4   \(w, h \leq 5000\), \(\sum wh \leq 25 \cdot 10^6\)   У, 3  
5 8 \(N \leq 3000\)     У, 3  
6 4 \(N \leq 10\,000\)     У, 3, 5  
7 8     все \([x_i^{L}, x_i^{R}]\) пересекаются 1  
8 8     \(y_i^{L} = 1\) 2  
9 8     прямоугольники не пересекаются 1  
10 8     \(\forall 1 \leq i, j \leq n\) \(\forall y \in [y_i^{L}, y_i^{R}] \cap [y_j^{L}, y_j^{R}]\) выполнено \([x_i^{L}, x_i^{R}] \nsubseteq [x_j^{L}, x_j^{R}]\) 1, 9  
11 8     все отрезки \([x_i^{L}, x_i^{R}+1]\) либо вложены, либо не пересекаются 1  
12 8 \(N \leq 50\,000\)     У, 3, 5 – 6  
13 8 \(N \leq 100\,000\)     У, 3, 5 – 6, 12  
14 8 \(N \leq 200\,000\)     У, 1 – 13  
  • Если для теста ваше решение неправильно находит множество пар \((x_1, x_2)\), которые обслуживаются в каком-нибудь ряду, решение получает вердикт <<Неправильный ответ>>.

  • Если во всех тестах подзадачи и необходимых подзадач решение

    • правильно находит множество, но не все \(cnt\) верны, оно получает \(50\%\) баллов за подзадачу.

    • правильно находит множество и все \(cnt\), но не все \(k\) верны, оно получает \(75\%\) баллов за подзадачу.

    • правильно находит множество, все \(cnt\) и все \(k\), оно получает \(100\%\) баллов за подзадачу.

Обратите внимание, что для получения частичных баллов за подзадачу, все равно необходимо вывести какие-нибудь значения \(cnt\) и \(k\) для каждой пары \((x_1, x_2)\), но не обязательно верные.

Пояснения к примерам

Первый и второй наборы входных данных для теста из условия

В первом наборе входных данных будут использоваться роботы на участках \((2, 3, 2)\), \((2, 4, 3)\), \((3, 4, 4)\). Таким образом, пары \((2, 3)\), \((2, 4)\), \((3, 4)\) обслуживаются в каком-нибудь ряду, причем каждая из них обслуживается ровно в одном ряду.

Во втором наборе входных данных будут использоваться роботы на участках \((2, 2, 1)\), \((2, 4, 2)\), \((2, 2, 3)\). Таким образом, пары \((2, 2)\), \((2, 4)\) обслуживаются в каком-нибудь ряду. Пара \((2, 2)\) обслуживается в рядах \(1, 3\), пара \((2, 4)\) обслуживается ряду \(2\).

Третий и четвертый наборы входных данных для теста из условия

Кейс на рейс

кратчайшие пути реализация

Авиакомпания <<Флагманский Флот Татарстана>> предлагает в своих самолётах новый вид бизнес-класса. Салон самолёта состоит из \(n\) мест, расположенных в один ряд вдоль прохода. Введём координатную прямую вдоль салона так, что расстояние между креслами будет равно \(1\), и места будут иметь координаты от \(1\) до \(n\).

Во время полёта стюарду нужно пройти по самолету и раздать всем пассажирам напитки. Напитки бывают \(k\) разных видов, пронумерованных числами от \(1\) до \(k\). Каждый пассажир получает одну порцию одного напитка, пассажир заказывает предпочитаемый вид напитков при бронировании билета, поэтому все предпочтения пассажиров известны заранее.

Напитки разлиты по бутылкам, каждая бутылка вмещает \(p\) порций одного напитка. В тележку для напитков можно загрузить не более \(m\) бутылок с любыми видами напитков, гарантируется, что \(m\ge k\).

Пассажиры обслуживаются в порядке возрастания номеров их мест. Первоначально тележка находится в начале салона в точке \(0\), и её можно заполнить любыми видами напитков перед обслуживанием. После завершения обслуживания тележка должна приехать в точку \(n+1\). При этом в точках \(0\) и \(n+1\) могут находиться кладовые: или одна кладовая в одном из концов салона или две кладовые в двух концах, в которых имеется достаточный запас напитков каждого вида. В этих кладовых можно выгрузить из тележки пустые бутылки и погрузить полные бутылки.

По ходу обслуживания напитки будут расходоваться, поэтому время от времени возникает необходимость пополнить запас напитков на тележке в одной из кладовых. Если в текущий момент тележка находится напротив кресла номер \(i\), то для того, чтобы доехать до кладовой в точке \(0\) необходимо проехать расстояние \(i\), а для того, чтобы доехать до кладовой в точке \(n + 1\) необходимо проехать расстояние \(n+1-i\). В кладовых можно выгрузить пустые бутылки из тележки и загрузить на свободные места бутылки с напитками любых видов. Выгружаемые бутылки должны быть пустыми, нельзя выгружать бутылки, в которых остались напитки, или выливать напитки. Нельзя переливать остатки напитков между разными бутылками. Можно загружать на тележку более одной бутылки одного вида. После этого тележка должна проехать расстояние от кладовой до кресла первого необслуженного пассажира, чтобы продолжить обслуживание.

Определите, какое минимальное расстояние должна проехать тележка, чтобы переместиться из точки \(0\) в точку \(n+1\) и обслужить всех пассажиров.

Формат входных данных
Первая строка входных данных содержит четыре целых числа \(n\), \(m\), \(k\), \(p\) (\(3 \leq n \leq 10^6\), \(1 \leq p \leq 10^6\), \(1 \leq k \leq m \leq 10^6\)) — количество мест в салоне, вместимость тележки, количество типов напитков и вместимость каждой бутылки соответственно.

В следующей строке содержится целое число \(c\) (\(1 \leq c \leq 3\)) — параметр, описывающий наличие кладовых в салоне. Если \(c=1\), то кладовая находится только в точке \(n+1\). Если \(c=2\), то кладовая находится только в точке \(0\). Если \(c=3\), то кладовые находятся в обоих концах салона.

В следующей строке содержатся \(n\) целых чисел \(a_i\) (\(1 \leq a_i \leq k\)) — типы напитков, которые заказали пассажиры.

Формат выходных данных
Программа должна вывести одно целое число — минимальное расстояние, которое должна проехать тележка.

Пояснения к примерам
В первом примере в тележку вмещается \(m=2\) бутылки по \(p=1\) порции в каждой. Кладовая находится в конце салона. Первоначально тележку нужно загрузить бутылками с напитками вида \(1\) и \(2\), которые будут налиты пассажирам на местах \(1\) и \(2\), тележка проедет расстояние \(2\) от точки \(0\) до точки \(2\). После этого тележке нужно будет проехать до кладовой в конце салона (расстояние \(4\)), загрузить тележку бутылками вида \(1\) и \(2\) и вернуться к креслу номер \(3\) (тележка проедет расстояние \(3\)). Пассажирам на местах \(3\) и \(4\) выдаются напитки вида \(1\) и \(2\) (тележка проезжает расстояние \(1\) от места \(3\) до места \(4\)). После этого тележке понадобится ещё раз съездить в кладовую (от кресла \(4\) до кладовой расстояние \(2\)), вернуться из кладовой до кресла \(5\) (расстояние \(1\)), и проехать ещё \(1\) до конца салона. Общее расстояние равно \(2+4+3+1+2+1+1=14\).

Во втором примере в тележку вмещаются \(m=3\) бутылки по \(p=2\) порции в каждой. Кладовая находится в начале салона. Необходимо загрузить тележку тремя бутылками вида \(1\), обслужить пассажиров на местах с номерами от \(1\) до \(4\). После этого опустошатся две бутылки вида \(1\), нужно будет сразу съездить в кладовую, чтобы загрузить две бутылки вида \(2\), затем обслужить пассажиров на местах с номерами от \(5\) до \(8\).

В третьем примере в тележку вмещаются \(m=3\) бутылки по \(p=2\) порции в каждой, кладовые находятся в обоих концах салона. Для обслуживания пассажиров нужны две бутылки вида \(2\) и по одной бутылке видов \(1\) и \(3\), поэтому понадобится один раз съездить в кладовую для того, чтобы заменить пустую бутылку вида \(2\) на полную. Это лучше сделать после обслуживания пассажира на месте \(3\), тележка должна съездить в кладовую в начале салона.

В четвёртом примере в тележку нужно загрузить по одной бутылке каждого вида, и поскольку каждая бутылка вмещает по две порции напитков, это позволит обслужить всех пассажиров без дополнительного пополнения тележки.

В пятом примере понадобится два пополнения тележки, один раз тележке придётся вернуться в кладовую в начало салона после обслуживания пассажира \(3\), второй раз — в конец салона после обслуживания пассажира \(6\).

2026

Задачи на моделирование реализация

Новая татарская игра <<2026>> ведется на прямоугольной клетчатой доске, состоящей из \(m\) строк и \(n\) столбцов. Доска разбита на \(m \times n\) единичных клеток размером \(1 \times 1\). На некоторых клетках стоят квадратные фишки размером \(1 \times 1\), на каждой фишке написана одна из \(26\) английских букв.

С фишками производятся \(q\) операций. Каждая операция состоит в перемещении всех фишек до упора в одном из четырех направлений. Таким образом, последовательность операций задается строкой \(s\) длины \(q\), состоящей из символов, соответствующих направлениям: <<L>> — влево, <<R>> — вправо, <<U>> — вверх и <<D>> — вниз.

Операция выполняется следующим образом: пока на доске есть хотя бы одна фишка, для которой соседняя с ней в заданном направлении клетка является свободной, эта фишка передвигается на эту соседнюю клетку.

Определите, как будет выглядеть доска после выполнения всех операций.

Формат входных данных

Каждый тест состоит из нескольких наборов входных данных. В первой строке теста задано целое число \(t\) — количество наборов входных данных в тесте (\(1 \le t \le 200\,000\)). Далее следуют описания наборов входных данных. Каждый набор входных данных описывается следующим образом:

В первой строке набора заданы целые числа \(m\) и \(n\) — размеры доски (\(1 \le m, n \le 10^6\), \(1 \le m\times n \le 10^6\)).

В следующих \(m\) строках задано изначальное расположение фишек на доске.

В \(i\)-й строке (\(1 \le i \le m\)) находится строка \(a_{i1}a_{i2}\ldots a_{in}\) длины \(n\), задающая \(i\)-ю строку доски. Каждый символ \(a_{ij}\) является либо строчной буквой английского алфавита от <<a>> до <<z>>, либо точкой <<.>>. Если \(a_{ij}=\mbox{<<.>>}\), то клетка в \(i\)-й строке и \(j\)-м столбце является пустой, иначе в ней находится фишка, на которой написана буква \(a_{ij}\).

В последней строке заданы \(q\) символов \(s_1s_2\ldots s_q\) без пробелов, задающие последовательность операций (\(1 \le q \le 10^6\)). Каждый символ \(s_i\) является одним из символов <<L>>, <<R>>, <<U>> или <<D>>.

Сумма значений \(m \times n\) по всем наборам входных данных не превышает \(2\cdot 10^6\). Сумма значений \(q\) по всем наборам входных данных не превышает \(2\cdot 10^6\).

Формат выходных данных
Для каждого набора входных данных выведите итоговое расположение фишек на доске после выполнения всех операций в том же формате, что и во входных данных.

Обозначим через \(\sum mnq\) сумму \(mnq\) по всем наборам входных данных.

Обозначим через \(\sum mq\) сумму \(mq\) по всем наборам входных данных.

Назовем расположение фишек лестницей, если \(m=n\), \(a_{ij}={<<\texttt{.}>>}\) для всех \(1 \le i \le j \le n\) и \(a_{ij}\ne{<<\texttt{.}>>}\) для всех \(1 \le j < i \le n\). Иными словами, все фишки находятся на клетках ниже главной диагонали доски, и на каждой клетке ниже главной диагонали есть фишка.

Пояснения к примерам
В первом наборе входных данных из примера доска изначально выглядит так:

image

Первая операция сдвигает все фишки влево, так как \(s_1={<<\texttt{L}>>}\). После ее выполнения доска будет выглядеть следующим образом:

image

Вторая операция сдвигает все фишки вправо, так как \(s_2={<<\texttt{R}>>}\). После ее выполнения доска будет выглядеть следующим образом:

image

Третья и последняя операция сдвигает все фишки наверх, так как \(s_3={<<\texttt{U}>>}\). После ее выполнения доска будет выглядеть следующим образом:

image

Гармония

Префиксные суммы(минимумы, ...) реализация

Совсем недавно Васе на день рождения подарили строку, состоящую только из символов «0» и «1». Обрадованный этим подарком, он тут же начал эту строку изучать — искать в ней гармоничные части. Для начала Васю интересует только количество различных непустых гармоничных подстрок. А поскольку подарок оказался слишком большим, мальчик решил обратиться за помощью к вам. Помогите Васе!
В понимании Васи, строка является гармоничной, если и символов 0, и символов 1 в ней чётное количество.
Подстрокой строки s называется строка, полученная из s выкидыванием нескольких символов с начала и с конца (возможно, нуля или всех). Так, строка «12» является подстрокой строки «123», а строка «13» — нет. Подстроки считаются одинаковыми, если у них совпадает количество удалённых символов с начала и с конца.

Формат входных данных
В первой строке дано одно число n — длина подарка (1 ≤ n ≤ 2 · 105 ). Во второй строке дана строка s длины n — Васин подарок. Гарантируется, что s состоит только из нулей и единиц.
Формат выходных данных
Выведите единственное число — количество различных гармоничных подстрок в s.
Обратите внимание, что значение ответа в этой задаче может превышать возможное значение 32-битной целочисленной переменной, поэтому необходимо использовать 64- битные целочисленные типы данных (тип int64 в языке Pascal, тип long long в C++, тип long в Java и C#).

Замечание

В первом примере из условия подходят следующие подстроки (выделены жирным): 001100, 001100, 001100, 001100, 001100, 001100, 001100.

Решение систем уравнений

Задача на реализацию реализация

Напишите программу на Python, которая:

  1. Считывает уравнения из строки, разделенных запятой.

  2. Преобразует строку в символьное уравнение с помощью SymPy.

  3. Решает уравнение.

  4. Выводит корни уравнения.

Вывод балла наилучшего выравнивания

Задача на реализацию реализация

Напишите программу, которая выполняет глобальное выравнивание двух ДНК-последовательностей, и выводит все выравнивания и их score (балл).

Формат входных данных
Две строки содержит две последовательности ДНК, далее вводятся настройки параметров:
  • Балл за совпадение
  • Балл за несовпадение
  • Балл за открытие гэпа
  • Балл за продолжение гэпа
Формат выходных данных
Выведите все выравнивания и их score (балл).

Поиск сокровищ

Динамическое программирование: один параметр битмаски реализация

Для поиска полезных ископаемых ученые разработали специальный сканер.

Представим область для поисков как таблицу из \(k\) строк и \(n\) столбцов. Нумерация строк идет от \(1\) до \(k\) сверху вниз, нумерация столбцов от \(1\) до \(n\) слева направо. В каждой клетке таблицы могут находиться полезные ископаемые.

Сканер работает следующим образом: он может быть запущен в столбце \(p\) и возвращает количество клеток в зоне сканирования, которые содержат полезные ископаемые. Зона сканирования включает все клетки столбца \(p\), верхние \(k-1\) клетку столбца \(p-1\), верхние \(k-2\) клетки столбца \(p-2\), и так далее. На рисунке показана зона сканирования для поля с \(k = 3\), \(n=5\) и всех значений \(p\).


Вам даны значения, которые вернул сканер для всех \(p\), обозначим за \(b_p\) значение в столбце \(p\). Будем называть таблицу, где для каждой клетки определено, находятся ли в ней полезные ископаемые, корректной, если для нее сканер возвращает верные значения. Например, если в примере выше сканер вернул значения \([2, 1, 2, 3, 2]\), то одна из корректных таблиц может выглядеть следующим образом (клетки, содержащие ископаемые, обозначены черным треугольником):


По заданным значениям, которые вернул сканер, определите количество корректных таблиц и выведите остаток от деления этого количества на число \(10^9+7\). Обратите внимание, что, возможно, сканер неисправен, и корректных таблиц вообще нет, тогда необходимо вывести \(0\).

Формат входных данных
В первой строке даны два числа \(n\), \(k\) — количество столбцов и строк, соответственно (\(1 \le n \le 200\), \(1 \le k \le 7\)).

Во второй строке даны \(n\) чисел \(b_1, b_2, \ldots, b_n\) — значения, которые вернул сканер (\(0 \le b_i \le k^2\)).

Формат выходных данных
Выведите единственное число — остаток от деления количества различных корректных таблиц на \(10^9 + 7\).

Все на съезд!

Перебор битмаски реализация

В 2025 году в Берляндии впервые будет проводиться трёхдневный межпланетный съезд по вопросам проведения олимпиад по информатике. Доклады съезда разбиты на 12 секций, и теперь организаторам необходимо распределить секции по дням: в каждый день будут проводиться 4 секции.

Известно, что в съезде примут участие \(n\) человек. Каждый участник съезда выбрал 3 секции, которые он хочет посетить. Но поскольку в один день секции будут проводиться одновременно, каждый участник в один день может присутствовать не более чем на одной секции. Поэтому если в один день будут идти две или три секции, выбранные каким-то участником, то он всё равно сможет посетить только одну из них. Если же выбранные секции будут проходить в разные дни, участник сможет посетить их все.

Для того чтобы съезд принёс как можно больше пользы, необходимо составить расписание съезда таким образом, чтобы суммарное число секций, посещённых всеми участниками, было как можно больше. Помогите оргкомитету составить такое расписание.

Формат входных данных
Первая строка входных данных содержит целое число \(n\) (\(1 \leq n \leq 10\,000\)) — количество участников съезда.

В каждой из следующих \(n\) строк даны \(3\) попарно различных натуральных числа, не превосходящие \(12\), — номера секций, которые хочет посетить один из участников.

Формат выходных данных
Программа должна вывести \(3\) строки, в каждой из которых должны быть \(4\) числа через пробел — номера секций, проводимых в первый, второй и третий день съезда соответственно. Каждое из чисел от 1 до 12 должно встречаться в выводе ровно один раз. Если возможных оптимальных расписаний несколько, можно вывести любое из них.

Примечание
В примере из условия расписание составлено так, что второй и третий участник посетят все желаемые секции, а первый — две секции (\(5\) и одну из секций \(1\), \(6\)). Таким образом, суммарно будут посещены 8 секций. Можно показать, что этот результат улучшить нельзя.

Вывод всех выравниваний - 2

Задача на реализацию реализация

Напишите программу, которая выполняет глобальное выравнивание двух ДНК-последовательностей, и выводит все выравнивания и их score (балл).

Формат входных данных
Две строки содержит две последовательности ДНК, далее вводятся настройки параметров:
  • Балл за совпадение
  • Балл за несовпадение
  • Балл за открытие гэпа
  • Балл за продолжение гэпа
Формат выходных данных
Выведите все выравнивания.

Вывод всех выравниваний

Задача на реализацию реализация

Напишите программу, которая выполняет глобальное выравнивание двух ДНК-последовательностей, и выводит все выравнивания и их score (балл).

Формат входных данных
Две строки содержит две последовательности ДНК.
Формат выходных данных
Выведите все выравнивания и их score (балл).

Задача №1

реализация

Нарисуйте из символов или напишите что-нибудь красивое и выведите это. Вы получите ОК, если проверяющая система согласится, что это красиво, и WA, если не согласится.
 

3

реализация Строки

Дано дерево

Деревья Задачи на моделирование реализация

Дано бесконечное бинарное дерево. У дерева есть корень и бесконечное число вершин, у каждой вершины есть левый и правый сын, у всех вершин кроме корня есть отец.

Каждая вершина может быть покрашена в один из \(c\) цветов или быть бесцветной. Изначально все вершины бесцветные.

Вам необходимо обрабатывать два типа запросов:

  1. color(\(u\), \(x\)) Дана вершина \(u\), покрасить вершину \(u\) в цвет \(x\), а затем вызвать color(\(L\), \((x + 1) \bmod c\)) для ее левого сына \(L\) и color(\(R\), \((x - 1 + c) \bmod c\)) для её правого сына \(R\). Заметим, что эта операция перекрашивает все (бесконечное) множество вершин в поддереве вершины \(u\). Здесь \(\bmod\) — операция взятия числа по модулю. Если вершина уже была покрашена, то её цвет меняется на новый.

  2. Дана вершина, вывести её текущий цвет.

Формат входных данных
В первой строке вводятся два числа \(q\), \(c\) — количество запросов и цветов, соответственно (\(1 \leq q \leq 5 \cdot 10^5\), \(1 \leq c \leq 10^9\)). Затем следует \(q\) запросов, каждый из которых начинается с целого числа \(t_i\) — типа \(i\)-го запроса.

Если \(t_i\) = 1, то далее в строке даётся целое число \(x\) (\(0 \leq x \leq c - 1\)) цвет, в который надо покрасить вершину запроса \(u\). В следующей строке описан путь до вершины \(u\) в виде непустой строки \(s_i\), состоящей из символов <<L>> и <<R>>. Данная строка задаёт путь от корня дерева до вершины \(u\), где <<L>> обозначает переход к левому сыну, а <<R>> "— к правому.

Если \(t_i\) = 2, то в следующей строке задаётся путь до вершины, цвет которой необходимо вывести, заданный аналогично предыдущему запросу.

Гарантируется, что сумма длин путей до всех вершин запросов не превосходит \(5 \cdot 10^5\).

Формат выходных данных
Для каждого запроса второго типа в новой строке необходимо вывести ответ на него. Если вершина бесцветная, необходимо вывести число \(-1\).

Опечатки

Хеш реализация Пересечение множеств

При наборе текста довольно часто возникают опечатки из-за неправильного нажатия на клавиши. Например, некоторые буквы оказываются заменены на другие, появляются лишние буквы, некоторые буквы исчезают из слов. В большинстве случаев эти опечатки можно исправить автоматически. В частности, существует метод проверки орфографии, основанный на поиске в словаре слов, похожих на проверяемые.

Два слова называются похожими, если можно удалить из каждого слова не более одной буквы так, чтобы слова стали одинаковыми, возможно пустыми. Например, слова "spot" и "sport" похожи, так как одно и то же слово "spot" можно получить из первого слова без удаления букв, а из второго - удалением буквы "r".

Требуется написать программу, которая для каждого слова проверяемого текста определяет количество похожих на него слов в словаре.

Входные данные
В первой строке входного файла через пробел записаны натуральные числа N ≥ 1 - общее количество слов в словаре и M ≥ 1 - количество слов в проверяемом тексте (N+M ≤ 20000) В последующих N строках записаны слова, входящие в словарь, по одному на строке. Все слова словаря различны. Далее следуют M строк, в которых записаны слова проверяемого текста, по одному слову в строке.

Слова состоят из строчных и прописных букв латинского алфавита (прописные и строчные буквы считаются различными). Любое слово состоит не менее чем из одной и не более чем из 12 букв.

Выходные данные
Для каждого слова из текста выведите в выходной файл строку, содержащую это слово, далее через пробел количество слов из словаря, на которые оно похоже. Если в словаре имеется единственное похожее слово, то также выведите в этой строке это слово (через пробел).

Сигнализация

Центроиды графы реализация

Подземный бункер состоит из \(n\) комнат, соединённых \(n - 1\) коридорами. Каждый коридор соединяет две различные комнаты и имеет определённую длину. Бункер устроен таким образом, что из любой комнаты \(i\) можно дойти в любую другую комнату \(j\). Заметим, что существует единственный такой путь, не проходящий по одному и тому же коридору дважды. Сумма длин коридоров, составляющих этот путь, называется расстоянием между комнатами \(i\) и \(j\) и обозначается \(\rho(i, j)\).

Каждая комната бункера оборудована звуковой сигнализацией, состоящей из сирены и датчика звука, который её включает. Сирена, включённая в комнате \(i\), активирует датчик звука в каждой комнате, расстояние до которой не превосходит расстояние \(d_i\), определяемое мощностью этой сирены. Другими словами, включение сирены в комнате \(i\) автоматически включает сирену во всех комнатах \(j\), таких что \(\rho(i, j) \leq d_i\). Эта сирена, в свою очередь, может вызвать автоматическое включение других сирен и так далее.

В случае возникновения чрезвычайной ситуации некоторые сирены необходимо включить вручную, после чего звук от них автоматически включит сирены в других комнатах. Правила безопасности предписывают выбор такого набора сирен для ручного включения, который в конце концов приведёт к автоматическому включению сирен во всех комнатах.

Требуется написать программу, которая определяет минимальное количество сирен в наборе, удовлетворяющем правилам безопасности.

Входные данные

Первая строка входных данных содержит единственное число \(n\) — количество комнат.

Вторая строка содержит последовательность из \(n\) целых чисел \(d_i\), \(i\)-е из них равно максимальному расстоянию, на котором расположенная в комнате \(i\) сирена активирует датчики (\(0 \leq d_i \leq 10^9\)).

Последующие \(n - 1\) строк описывают коридоры бункера. В \(i\)-й из них находятся три целых числа: \(u_i\), \(v_i\), \(l_i\), где \(u_i\), \(v_i\) — номера различных комнат, соединённых коридором \(i\), а \(l_i\) — длина этого коридора (\(1 \leq u_i, v_i \leq n\); \(1 \leq l_i \leq 10^9\)).

Выходные данные
Выходные данные должны состоять из единственного числа — минимального количества сирен, которые необходимо включить вручную.

Замечание
В тесте из примера сирена в комнате 4 включает сирену в комнате 5, которая, в свою очередь, включает сирены в комнатах 6 и 7. Сирена в комнате 2 включает сирену в комнате 3. Сирена в комнате 8 включает сирены в комнатах 1, 9 и 10.

Подводная лодка

Префиксные суммы(минимумы, ...) реализация

Подводная лодка легла на грунт на мелководье. Для её обнаружения используются данные спутника, который с высокой точностью измеряет отклонение высоты поверхности воды от среднего уровня моря. Снимок, получаемый со спутника, представляет собой массив из \(h\) строк по \(w\) элементов в каждой строке.

Введём на снимке систему координат с осью абсцисс, направленной вдоль строк снимка слева направо, и осью ординат, направленной вдоль столбцов снимка снизу вверх. Потенциальное изображение подводной лодки представляет собой любое множество элементов массива, состоящее из следующих частей:

  • <<корпус>> — полоса из элементов с координатами от \((x_1, y_1)\) до \((x_2, y_1)\), где \(x_1 < x_2\);
  • <<рубка>> — полоса из элементов с координатами от \((x_3, y_1)\) до \((x_3, y_2)\), где \(x_1 \leq x_3 < x_2\); \(y_1 \leq y_2\);
  • <<хвост>> — полоса из элементов с координатами от \((x_4, y_3)\) до \((x_4, y_4)\), где \(x_3 < x_4 \leq x_2\); \(y_3 \leq y_1 \leq y_4\).

Поскольку подводная лодка находится вблизи поверхности в районе с сильным течением, уровень воды над ней немного повышается. Поэтому изображением подводной лодки на снимке будем считать потенциальное изображение с максимально возможной суммой входящих в него элементов массива.

Требуется написать программу, которая находит на снимке изображение подводной лодки и выводит сумму его элементов.

Входные данные
Для сжатия передаваемых со спутника данных каждый элемент снимка кодируется строчной буквой английского алфавита. Первая строка входных данных содержит число \(k\) — количество использованных для кодирования букв (\(k \le 26\)). Вторая строка входных данных содержит \(k\) целых чисел \(c_i\) — значения отклонений соответствующих каждому кодовому символу по порядку букв в английском алфавите от 1 до \(k\)-й.

Третья строка входных данных содержит числа \(h\) и \(w\) — размеры снимка. Последующие \(h\) строк содержат по \(w\) символов — кодовые значения элементов снимка.

Выходные данные
Выходные данные должны содержать единственное целое число — сумму элементов массива, соответствющих изображению подводной лодки.

 

Примеры
 
Входные данные Выходные данные Изображение
1 2
-10 1
6 11
aaaaaaaaaaa
aaabaaaaaaa
aaabaaaabaa
abbbbbbbbba
aaaaaaaabaa
aaaaaaaaaaa
13
...........
...b.......
...b....b..
.bbbbbbbbb.
........b..
...........

			 
2 3
-4 -3 4
5 5
bbabc
ccaac
accba
baccb
baaaa
16
.....
.c...
.cc..
..c..
.....

			 
3 3
-2 4 0
5 5
abccb
cccac
cbcba
cccbb
accba
24
.b...
.c...
.b.b.
cccbb
...b.

			 
4 4
-1 -5 -3 0
5 5
bbabc
ccaac
acdba
baccb
baaaa
-2
.....
..aa.
.....
.....
.....

			 


Пояснение

Для примера ниже приведены несколько потенциальных изображений подводной лодки.

Ниже приведены несколько множеств элементов снимка, которые не являются потенциальными изображениями подводной лодки:

Вышивка жемчугом

графы поиск в глубину и подобное реализация

Со стародавних времён в поморских деревнях рукодельницы вышивали жемчугом на прямоугольных полотенцах, состоящих из одинаковых клеток. Вышивка начиналась с пришивания жемчужины к полотенцу в центре одной из клеток. Чтобы пришить новую жемчужину, рукодельница делала стежок из клетки, уже содержащей жемчужину, в соседнюю с ней по горизонтали или вертикали свободную клетку. Новая жемчужина пришивалась в центре клетки на конце стежка. Этот процесс повторялся, пока не заканчивались жемчужины.

Одно из таких праздничных полотенец находится в музее. К сожалению, некоторые части узора были утеряны, но описание полотенца сохранилось. Дирекция музея планирует восстановить один из прямоугольных фрагментов полотенца, но не ещё не решила какой именно. Затраты на восстановление фрагмента зависят от количества связных частей узора, попавших на этот фрагмент. Часть узора считается связной, если от любой её жемчужины можно по стежкам перейти к любой другой её жемчужине, не выходя за границы фрагмента. Дирекция всегда относит любые две жемчужины, между которыми можно перейти по стежкам, к одной и той же связной части узора.

Требуется написать программу, вычисляющую количество связных частей узора для каждого из заданных фрагментов.

Входные данные
Первая строка входных данных содержит два целых числа \(a\) и \(b\) — размеры полотенца в клетках по горизонтали и вертикали.

Вторая строка содержит два числа \(n\) и \(q\) — количество жемчужин в узоре и количество фрагментов соответственно.

Следующие \((n - 1)\) строк содержат описания стежков. Каждый стежок имеет один из следующих видов:

  • h \(x~y\) означает, что клетки с координатами \((x, y)\) и \((x + 1, y)\) содержат жемчужины, соединённые горизонтальным стежком (\(1 \leq x \leq a - 1\); \(1 \leq y \leq b\));
  • v \(x~y\) означает, что клетки с координатами \((x, y)\) и \((x, y + 1)\) содержат жемчужины, соединённые вертикальным стежком (\(1 \leq x \leq a\); \(1 \leq y \leq b - 1\)).

Так как неизвестно в каком порядке рукодельница наносила стежки, их описания следуют в произвольном порядке. При этом гарантируется, что узор был получен в результате процесса, описанного в условии задачи.

Следующие \(q\) строк описывают фрагменты. Каждое описание содержит четыре целых числа \(x_1\), \(y_1\), \(x_2\) и \(y_2\) — координаты левой нижней и правой верхней клетки фрагмента (\(1 \leq x_1 \leq x_2 \leq a\); \(1 \leq y_1 \leq y_2 \leq b\)).

Выходные данные
Выходные данные должны содержать \(q\) строк, где \(i\)-я строка содержит количество связных частей узора в \(i\)-м фрагменте.

Замечание
Пояснение к тесту из условия.

Памятник

Отрезки реализация Задачи на моделирование

Одна из центральных площадей Архангельска замощена прямоугольными плитками размера \(1 \times k\). Если ввести систему координат, так что левый нижний угол одной из плиток будет иметь координаты \((0, 0)\), то левые нижние углы плиток будут иметь координаты \((i \cdot k+j,j)\) для всех целых \(i\) и \(j\).

На площади было решено установить памятник известному архангельскому писателю и художнику Писахову. Для установки памятника необходимо удалить все плитки, полностью или частично попадающие под его основание. Основание памятника имеет форму многоугольника с целочисленными координатами вершин, все стороны которого параллельны осям координат. Известно, что любая прямая, пересекающая основание памятника и параллельная одной из осей координат, в пересечении с основанием образует один отрезок.

Для установки памятника необходимо выбрать место на площади таким образом, чтобы количество удалённых плиток было минимальным. При выборе места основание разрешается только передвигать параллельно осям координат.

Требуется написать программу, вычисляющую минимальное количество плиток, которые придётся .

Входные данные
Первая строка входных данных содержит два числа \(n\) и \(k\) — количество вершин в основании памятника и размер плитки.

Каждая из последующих \(n\) строк содержит два целых числа \(x_i\), \(y_i\) — координаты \(i\)-й вершины основания. Координаты перечислены в порядке обхода против часовой стрелки.

Выходные данные
Единственная строка выходных данных должна содержать минимально возможное количество плиток, которые необходимо удалить для размещения памятника на площади.

Замечание

Разноцветные треугольники

реализация Конструктив

Выпуклый N-угольник разбит непересекающимися диагоналями на треугольники. (Многоугольник называется выпуклым, если любая его диагональ лежит внутри него.) Требуется покрасить каждую сторону и каждую проведенную диагональ в красный или синий цвет так, чтобы у каждого треугольника были стороны как красного, так и синего цвета.

Требуется привести любую из допустимых раскрасок.

Входные данные
В первой строке записано одно число N (4≤N≤100) - количество вершин многоугольника.

Далее следуют N–3 строки, в каждой из которых записана пара натуральных чисел — номера вершин, которые соединяет диагональ. Считается, что все вершины занумерованы последовательно натуральными числами от 1 до N.

Выходные данные
В выходном файле должны быть 2N–3 строки. Каждая строка содержит 3 числа: номера вершин, которые соединяет данная сторона или диагональ и цвет (1 - синий, 2 - красный), в который Вы красите данную сторону или диагональ.

Злой лифт

кратчайшие пути теория чисел реализация

Дизайн-студия Артемия Индюкова получила заказ на разработку очень пафосного лифта для нового небоскреба. За работу взялся сам Артемий, отличающейся, кстати, редкой неадекватностью. У него есть идея-фикс: для управления лифтом достаточно четырех кнопок. Кнопки должны быть следующие:

  • - Поднятся на A этажей вверх
  • - Поднятся на B этажей вверх
  • - Поднятся на C этажей вверх
  • - Спустится на первый этаж
Изначально лифт находится на первом этаже. Пассажир лифта использует первые три кнопки чтобы попасть на тот этаж, на который он хочет. Если пассажир пытается подняться вверх на A, B или C этажей, а такого этажа в здании не существует (т.е. пассажир хочет подняться выше N-го, последнего этажа), то лифт никуда не едет.
Заказчики проекта оказались с юмором и вместе с отказом от футуристичного дизайна решили оценить адекватность Артемия по шкале от 1 до N. Оценка адеватности равна количеству этажей, на которые можно попасть с первого с помощью такого лифта. Помогите им в этом.

Входные данные
Первая строка содержит число N – высоту небоскреба (1 <= N <= 1018).

Вторая строка содержит три числа A, B и C, задающие параметры кнопок (1 <= A, B, C <= 100 000).

Выходные данные
Выведите единственное число — оценку адекватности Артемия Индюкова.

Кеннинги

Задачи на моделирование реализация Задача на реализацию

Кеннинг – это форма поэтической метафоры в древности, когда одно слово заменяется словосочетанием (двумя или более словами). Например, “giver of the gold” – это кеннинг для слова “warrior”. Причем нет разницы в использовании слова и его кеннинга: “poor giver of the gold” и “poor warrior” – это одно и то же. Кеннинги могут быть вложенными. Так, “serpent’s lair” означает “gold”, поэтому “giver of the serpent’s lair” означает “warrior”.

Для зачета вам надо создать достаточно длинный текст. Это можно сделать быстро, имея план текста и список кеннингов. Будем использовать следующий алгоритм. Если текст уже достаточно длинный, то задание выполнено. В противном случае одновременно заменяем все слова в тексте, имеющие кеннинги на соответствующие кеннинги, затем алгоритм повторяется снова.

Входные данные
В первой строке входных данных содержатся 3 числа: ширина результирующего текста w (1≤w≤255), минимальное число непробельных символов в тексте l (1≤l≤3000) и число кеннингов в списке n (1≤n≤380). Далее следует список кеннингов, по одному в строке. Каждая строка сначала содержит заменяемое слово, а за ним следует соответствующее словосочетание. В конце входных данных в одной или нескольких строках содержится план текста.

Каждый кеннинг содержит по крайней мере 2 слова (т.е. одна строка содержит не менее трех слов). Кеннинги могут быть рекурсивными. Например, кеннинг для слова “GNU” может быть таким “GNU is Not UNIX”. Кеннинги чувствительны к грамматическим формам и даже к регистру букв, так слова “warrior”, “Warrior” и “warriors” различны и могут иметь разные кеннинги.

Входной файл не превосходит 3 000 байт и содержит только английские буквы, подчеркивания, пробелы, переводы строки и, в первой строке, цифры. Одно слово имеет только один кеннинг. Все слова состоят не более чем из w
 символов.

Соседние слова разделены в точности одним пробелом или переводом строки. Ни в одной из строк нет ведущих или хвостовых пробелов.

Выходные данные
Если алгоритм не даст результата, то выведите слова “No result” в единственной строке.

В противном случае выведите полученный текст, размещая не более w символов (включая пробелы) в строке. Все переводы строки из первоначального плана должны быть сохранены. Перед очередным словом надо вставить перевод строки, если оно не уместиться в текущей строке. Соседние слова должны быть разделены ровно одним пробелом. В строках не должно быть ведущих и хвостовых пробелов. В корректном тексте не будет больше 10 000 байт.

Дерево Фенвика

Дерево Фенвика реализация

Дерево Фенвика − это структура данных, эффективно поддерживающая запросы о сумме префикса числового массива. Для числа t обозначим h(t) максимальное значение k, такое что t делится на 2k. Например, h(24)=3, h(5)=0. Обозначим l(t)=2h(t), например, l(24)=8, l(5)=1.

Рассмотрим массив a[1], a[2], … , a[n] целых чисел. Дерево Фенвика для этого массива — это массив b[1], b[2], …, b[n], такой что  \( \sum\limits_{j=i-l(i)+1}^{i}a[j] \) Таким образом: b[1]=a[l], b[2]=a[l]+a[2], b[3]=a[3], b[4]=a[l]+a[2]+a[3]+a[4], b[5]=a[5], b[6]=a[5]+a[6], Например, дерево Фенвика для массива a=(3,−1,4,1,−5,9) есть массив b=(3,2,4,7,−5,4).

Назовем массив само-фенвиковским, если он совпадает со своим деровом Фенвика. Напрмер, массив a=(0,−1,1,1,0,9) таковым является.

Вам дан массив а. Вам разрешается заменять в нем некоторые элементы, не меняя их порядка, чтобы сделать из исходного массива само-фенвиковский. Количество изменений при этом должно быть минимально возможным.

Входные данные
В первой строке входных данных содержится количество чисел в массиве n (1 ≤ n ≤ 100000). Во второй строке находятся сами n целых чисел. Все числа по модулю не превосходят 109.

Выходные данные
Выведите n чисел − элементы видоизмененного массива. Если решений несколько − выведите любое из них.

Цветной прямоугольник

реализация

Дан прямоугольник m×n, клетки которого раскрашены в три цвета. Можно выбрать квадрат 2×2 и, если в нем какой-то цвет преобладает,перекрасить весь этот квадрат 2×2 в этот цвет.Если в нем по две клетки двух цветов, то все его клетки можно перекрасить в третий цвет. Требуется такими операциями перекрасить весь прямоугольник в один цвет.

Входные данные
Числа m, n (3≤m,n≤100) и раскрашенный прямоугольник. Прямоугольник задается набором из m строк, в каждой из которых n символов (R, G или B).

Выходные данные
Последовательность перекрашиваемых квадратов (не более 10mn
 операций),
по одному перекрашиванию в строке. Каждое перекрашивание задается
парой чисел~--- номером строки и столбца левого верхнего
квадрата в перекрашиваемом прямоугольнике.

Сортировка ожерелья

реализация Задачи на моделирование

Ожерелье представляет собой нитку, на которую надето N различных бусинок. У нитки два конца: левый и правый. С бусинками на нитке можно делать следующие операции:

ML (move left) – снять крайнюю левую бусинку и надеть ее на правый конец нитки. По сути, при этом происходит циклический сдвиг ожерелья.
MR (move right) – снять правую бусинку и надеть ее на левый конец.
RL (remove left) – снять крайнюю левую бусинку и положить ее на стол (не одевать на нитку).
RR (remove right) – снять крайнюю правую бусинку и положить ее на стол.
PL (put left) – взять со стола бусинку и надеть ее на левый конец нитки.
PR (put right) – взять со стола бусинку и надеть ее на правый конец нитки.

На столе может лежать не более одной снятой бусинки, то есть после операции RL или RR нельзя использовать другую операцию RL или RR, пока не будет выполнена операция PL или PR.

Ваша задача: используя только перечисленные операции, отсортировать исходное ожерелье.

Входные данные
Программа получает на вход количество бусинок в ожерелье N ≤ 500. Далее идет некоторая перестановка чисел 1, . . . , N, задающая номера бусинок, расположенных на нитке. Номера перечислены слева направо.

Выходные данные
Программа должна вывести последовательность команд ML, MR, RL, RR, PL, PR, которая переводит исходную перестановку бусинок к перестановке 1, . . . , N.

Оладьи

Использование сортировки реализация

Имеется стопка оладий. Необходимо сделать из них правильную стопку: каждая оладья должна быть не больше всех оладий, находящихся под нею. Все оладьи круглые, поэтому размер оладьи определяется ее диаметром.

Сортировка стопки осуществляется серией “переворотов” оладий. Переворот заключается в том, что вы помещаете лопатку между двумя оладьями и переворачиваете всю стопку, оказавшуюся на лопатке, то есть меняете порядок следования оладий над лопаткой на обратный.

Стопка определяется заданием диаметра каждой оладьи в стопке в порядке следования (сверху вниз). Переворачивание определяется количеством оладий, которое переворачивается. Например, из стопки 7 3 9 1 5 переворачиванием трех оладий получится стопка 9 3 7 1 5.

Вам дана стопка оладий, выведите последовательность переворачиваний (то есть количество оладий, которое нужно переворачивать за один раз), сортирующую данную стопку.

Входные данные
Первая строка входных данных содержит натуральное число N (1 ≤ N ≤ 1000)  – количество оладий в стопке. Далее идет N натуральных чисел, не превосходящих 109  – размеры оладий в стопке (сверху вниз). 

Выходные данные
Ваша программа должна вывести последовательность натуральных чисел, не превосходящих N, соответствующую количеству оладий, которое необходимо переворачивать для правильной сортировки стопки.

Д-44

Задачи на моделирование реализация

При решении задач баллистики следует учитывать сопротивление воздуха. Пусть сила сопротивления воздуха пропорциональна квадрату модуля скорости движения снаряда и направлена противоположно скорости. Считая коэффициент пропорциональности силы сопротивления воздуха квадрату скорости постоянной величиной, рассчитать дальность полёта снаряда (с точностью до 10 м) при стрельбе из 85-миллиметровой пушки Д-44 под заданным углом к горизонту, если масса снаряда равна 9.6 кг, а начальная скорость - 800 м/с. Известно также, что при стрельбе под углом 45 градусов дальность стрельбы составляет 15 650 м. Ускорение свободного падения считать равным 9.8 м/с2.

Ограничения: угол от 5 до 85 градусов.

Входные данные
В первой строке находится единственное вещественное число - угол в градусах.

Выходные данные
Вывести одно целое число - дальность в метрах.

Марковский цикл

Задачи на моделирование реализация

Ограниченный алгоритм Маркова состоит из последовательности предложений

s1s2...sN -> d1d2...dN,
где si и di - символы из алфавита A, B, C. Подстрока s1s2...sN называется левой частью, а d1d2...dN - правой частью предложения.

Алгоритм выполняется над исходной текстовой строкой, состоящей из прописных латинских букв A, B, C, следующим образом: перебираются все предложения, начиная с первого. Если левая часть предложения входит в текстовую строку, то самое левое вхождение заменяется правой частью этого предложения, и поиск вновь начинается с первого предложения. Если ни одно предложение не может быть применено, алгоритм останавливается.

При выполнении алгоритма возможны два результата: либо остановка, либо бесконечный цикл с определенным периодом. По данной строке и набору предложений алгоритма Маркова определить количество "ациклических" (выполненных до начала цикла) шагов и длину самого цикла. Если алгоритм останавливается, то длина цикла считается нулевой, а все выполненные шаги - ациклическими.

Входные данные
В первой строке находится исходная текстовая строка, а в следующих строках - предложения, по одному в строке. Строки могут содержать произвольное количество незначащих пробелов.

Ограничения: длина исходной текстовой строки и левых частей предложений - от 1 до 12 букв, количество предложений - от 1 до 50.

Выходные данные
Вывести два целых числа, разделённых пробелом - количество ациклических шагов и длину цикла.

Дробная арифметика

НОД и алгоритм Евклида реализация "Длинная" арифметика

Напишите программу, реализующую сложение, вычитание, умножение и деление дробей. Формат дробей во входных и выходных данных:

  • знак числа (пишется только в случае, когда его отсутствие изменяет число);
  • целая часть числа (нулевая целая часть не пишется, если есть числитель и знаменатель);
  • пробел (не пишется, если отсутствует целая или дробная часть);
  • числитель (если он не равен нулю);
  • знак / (если есть числитель);
  • знаменатель (если есть числитель).

Примеры представления дробных чисел: -7 3/4, 8 1/2, -7/11, 0, 11.

Ограничения (как на входные, так и на выходные данные): целая часть может принимать значения из диапазона 0...30 000, числитель и знаменатель могут принимать значения от 1 до 30 000, при делении второй операнд не равен нулю.

Входные данные
В первой строке вводится дробь (первый операнд), во второй - знак операции ("+" - сложение, "-" - вычитание, "*" - умножение, "/" - деление), в третьей строке - дробь (второй операнд). Обе дроби могут быть сократимы.

Выходные данные
В единственной строке выводится несократимая правильная дробь (результат) в описанном формате.

Игра "черный ящик"

Задачи на моделирование реализация

В игру «черный ящик» играют с помощью квадратного черного ящика, который располагается на плоском столе. На каждой из сторон ящика есть n отверстий (всего 4n отверстий), в которые можно вбрасывать шар. Вброшенный шар через некоторое время вылетит наружу через одно из 4n отверстий, возможно, через то же отверстие, в которое он был вброшен.



Содержимое черного ящика можно рассматривать в виде сетки размером n x n. Отверстия в сторонах ящика – это начала и концы строк и столбцов сетки. Каждая клетка сетки либо пустая, либо занята отражателем. Отражатель – это устройство, которое изменяет направление движения шара на 90 градусов. Рассмотрим пример ящика размером 5x 5.

Вброшенный шар движется по прямой, пока не попадает в отражатель или не вылетит наружу. Когда шар попадает в отражатель, шар меняет направление своего движения, а отражатель меняет свое положение (под словом «меняет» подразумевается поворот на 90 градусов). На примере показаны действия отражателя.



a) Первый шар вброшен через отверстие. Он попал в отражатель и изменил направление движения.

b) После попадания первого шара отражатель изменил свое положение. Новый шар вбросили в то же отверстие, он попал в тот же отражатель, и отразился в направлении, противоположном направлению первого шара после отражения.

c) Отражатель изменил свое положение. После каждого попадания положение отражателя изменяется.


Когда шар попадает в отражатель, раздается звуковой сигнал. Количество отражений шара можно узнать, посчитав количество сигналов. Можно доказать, что шар всегда вылетает из ящика. У ящика есть одна кнопка, которая приводит его в исходное положение, и другая кнопка, которая меняет положение всех отражателей на противоположное.

ЗАДАНИЕ
Вам будет предоставлен интерфейс к 15 черным ящикам с помощью библиотеки функций Pascal или C/C++. Вы должны определить содержимое каждого из ящиков как можно точнее и отправить на проверку файлы, описывающие каждый ящик. Интерфейс также предоставляет возможность создания собственных ящиков для тестирования.

ОГРАНИЧЕНИЯ
1 ≤ ≤ 30

 

ВЫВОД

Вы должны предоставить на проверку файлы, содержащие следующие данные для каждого из 15 черных ящиков:
blackboxK.out ОПИСАНИЕ
#FILE blackbox K
.....
.../.
....
.../.
.?.?.
СТРОКА 1: Заголовок файла, который должен иметь вид
#FILE blackbox K
где K (число в диапазоне 1..15) соответствует ящику, для которого найдено решение.
n СТРОК: Каждая строка описывает строку ящика, начиная с верхней и заканчивая нижней. Каждая строка должна содержать ровно n символов, соответствующих клеткам, находящимся на пересечении этой строки и столбцов (слева направо).
·Символ ‘.’ обозначает, что клетка пуста.
·Символ ‘/’ обозначает, что в клетке находится отражатель с исходным положением ‘/’
·Символ ‘’ обозначает, что в клетке находится отражатель с исходным положением ‘’
·Символ ‘?’ обозначает, что Вы не смогли определить исходное содержимое клетки

 

БИБЛИОТЕКА

Вам будет предоставлена библиотека, которая содержит следующие функции:
ФУНКЦИЯ Описание
PASCAL
function Initialize(box: integer): integer;
C/C++
int Initialize(int box);
Инициализирует библиотеку. Эта функция должна вызываться один раз в начале программы. Она возвращает значение n – количество отверстий на каждой стороне ящика.
Параметр box должен содержать целое число в пределах от 1 до 15, указывающее номер ящика, который Вы хотите использовать, или 0, если Вы хотите использовать ящик, созданный Вами.
PASCAL
function throwBall(holeIn, sideIn: integer;
var holeOut, sideOut: integer): longint;
C
int throwBall(int holeIn, int sideIn,
int *holeOut, int *sideOut);
C++
int throwBall(int holeIn, int sideIn,
int &holeOut, int &sideOut);
Вбрасывает шар в ящик через отверстие с номером holeIn на стороне sideIn. Стороны пронумерованы следующим образом: 1 – Верхняя, 2 – Правая, 3 – Нижняя и 4 – Левая. Отверстия пронумерованы слева направо и сверху вниз, начиная с номера 1 на каждой стороне. В параметрах holeOut и sideOut функция возвращает номер отверстия и номер стороны – место, где шар вылетел наружу. В качестве своего значения функция throwBall возвращает количество звуковых сигналов, вызванных попаданиями шара в отражатели.
PASCAL
procedure ResetBox;
C/C++
Void ResetBox();
Возвращает все отражатели в исходное положение.
PASCAL
procedure ToggleDeflectors;
C/C++
Void ToggleDeflectors();
Меняет положения всех отражателей в ящике на противоположные.
PASCAL
procedure Finalize;
C/C++
Void Finalize();
Корректно заканчивает взаимодействие с ящиком. Эта функция должна вызываться в конце Вашей программы.
Чтобы использовать библиотеку в Вашей программе, необходимо выполнить следующее:
·FreePascalВ каталоге задачи есть файлы pbblib .o и pbblib. ppu. Чтобы их использовать, необходимо добавить следующую строку в Вашу программу
uses pbblib;
В файле pblackbox.pas представлен пример использования библиотеки.

·C: В каталоге задачи есть файлы cbblib.o и cbblib.h. Чтобы их использовать, необходимо добавить следующую директиву в Вашу программу
#include “cbblib.h”
В файле cblackbox.c представлен пример использования библиотеки. Чтобы скомпилировать код, используйте следующую команду
gcc –o yourprogram cbblib.o yourprogram.c

·C++: В каталоге задачи есть файлы cppbblib.o и cppbblib.h. Чтобы их использовать, необходимо добавить следующую директиву в Вашу программу
#include “cppbblib.h”
В файле cppblackbox .cpp представлен пример использования библиотеки. Чтобы скомпилировать код, используйте следующую команду
g++ –o yourprogram cppbblib.o yourprogram.cpp

 

ЗАМЕЧАНИЕ: В любой момент времени может быть запущено не более одной программы, работающей с библиотекой.
 

ПРИМЕР ВЗАИМОДЕЙСТВИЯ

Ниже представлен пример взаимодействия с ящиком, изображенным ранее на рисунке:
ВЫЗОВ ФУНКЦИИ ВОЗВРАЩЕННОЕ ЗНАЧЕНИЕ
Initialize(0); Пусть программа взаимодействует с ящиком, изображенным на рисунке. Тогда функция возвращает значение 5, означая, что n = 5.
PASCAL
throwBall(3,4,holeOut,sideOut );
C
throwBall(3,4,&holeOut,&sideOut);
C++
throwBall(3,4,holeOut,sideOut);
Шар вбрасывается в отверстие с номером 3 (третье сверху) на левой стороне. Возвращается значение 1 – это означает, что шар отразился один раз. После возврата из функции, переменная holeOut содержит значение 2, а переменная sideOut содержит значение 3, то есть шар вылетел через отверстие с номером 2 (второе слева) нижней стороны ящика.

ЭКСПЕРИМЕНТИРОВАНИЕ
Если Вы передадите значение 0 в функцию Initialize, библиотека прочитает содержимое ящика из файла blackbox.in. Так Вы сможете экспериментировать с библиотекой. Формат файла blackbox.in описан ниже.
blackbox.in ОПИСАНИЕ
5
3
2 3
4 2 /
4 4 /
СТРОКА 1: Содержит целое число nкоторое задает количество отверстий на каждой стороне.
СТРОКА 2: Содержит целое число d , которое задает количество отражателей в ящике.
СЛЕДУЮЩИЕ d СТРОК: Каждый отражатель описывается одной строкой. Каждая строка содержит два целых числа, разделенных пробелом, которые задают номер столбца и строки, где расположен отражатель. После второго числа через один пробел записан символ, который может быть ‘/’ или ‘’ и определяет исходное положение отражателя.
ЗАМЕЧАНИЕ: Файл blackbox. in из примера описывает ящик, изображенный вверху страницы 1.
 

СООБЩЕНИЯ ОБ ОШИБКАХ

В случае любых проблем библиотека выведет сообщение об ошибке в стандартный поток вывода ошибок. Возможные сообщения об ошибке и их значения приведены в нижеследующей таблице.
 
СООБЩЕНИЕ ЗНАЧЕНИЕ
ERR 1 More than one app Только одна программа может одновременно работать с черными ящиками, перезапустите все программы и запускайте их строго по одной.
ERR 2 Invalid box Переданный вами номер ящика не лежит в пределах от 0 до 15.
ERR 3 Invalid deflector В файле blackbox.in находится отражатель в некорректной клетке.
ERR 4 Invalid symbol В файле blackbox.in обнаружен недопустимый символ.
ERR 5 Invalid size Размер ящика в файле blackbox. in задан неверно.
ERR 6 Invalid input hole Либо сторона, либо отверстие вбрасывания шара заданы неверно.
ERR 7 ALARM Пожалуйста, обратитесь к техническому персоналу.

 

Соединение точек

Вычислительная геометрия Конструктив реализация

«Соединение точек» – это игра для одного игрока. Игровое поле строится следующим образом. Выбираются два целых числа, каждое из которых больше 2, которые обозначаются g и r. Затем на плоскости рисуются четыре точки в вершинах квадрата, две верхние из них становятся зелеными точками, а две нижние – красными. Далее внутри квадрата рисуются зеленые и красные точки таким образом, что никакие три точки, включая вершины квадрата, не лежат на одной прямой. Процесс продолжается до тех пор, пока общее количество зеленых точек не станет равным g, а количество красных точек – равным r.

После того, как игровое поле нарисовано, игрок начинает соединять точки. Две точки можно соединять отрезком, соблюдая следующие условия:
*соединяются только две точки одного цвета;
*отрезок, соединяющий точки, не пересекает никакой из ранее нарисованных отрезков (кроме как по концам отрезков).

Будем считать, что две точки u и v принадлежат одной компоненте, если от u до v можно дойти по нарисованным отрезкам.

Цель игры – соединить все зеленые точки в одну компоненту с помощью (g – 1) отрезков, а все красные точки – в другую компоненту с помощью (r – 1) отрезков. Можно доказать, что при вышеописанном способе расположения точек всегда существует способ выиграть игру.

Вам будет задано квадратное игровое поле со стороной s, а также g зелеными и r красными точками. Координаты точек задаются парами целых чисел (xi, yi). Зеленые точки пронумерованы числами от 1 до g так, что верхняя левая точка (0, s) имеет номер 1, верхняя правая точка (s, s) – номер 2, а остальные точки – номера от 3 до g (в произвольном порядке). Красные точки пронумерованы числами от 1 до r так, что нижняя левая точка (0, 0) имеет номер 1, нижняя правая точка (s, 0) – номер 2, а остальные точки – номера от 3 до r (в произвольном порядке).



На рисунке показан пример игры, где зеленые точки соединены в одну компоненту, а красные точки – в другую.

Легко видеть, что никакие три точки на рисунке не лежат на одной прямой, и никакие два отрезка не пересекаются, кроме как по концам.
Задание
Напишите программу, которая по заданным координатам g зеленых точек и координатам r красных точек находит способ, как нарисовать (g – 1) зеленых отрезков и (r – 1) красных отрезков таким образом, чтобы все зеленые точки принадлежали одной компоненте, а все красные точки – другой, и никакие два отрезка не пересекались.

Ограничения
3≤g≤50000,g – количество зеленых точек 
3≤r≤50000
0<s≤200000000,r – количество красных точек

Входные данные
На вход Вашей программы поступают данные в следующем формате:

СТРОКА 1: Содержит целое число g.

СЛЕДУЮЩИЕ g
СТРОК: Каждая строка содержит два целых числа – координаты xi и yi каждой из g зеленых точек, начиная с точки с номером 1 и заканчивая точкой с номером g. Эти два числа разделены пробелами.

СТРОКА g + 2: Содержит целое число r.

СЛЕДУЮЩИЕ r СТРОК: Каждая строка содержит два целых числа – координаты xi и yi каждой из r красных точек, начиная с точки с номером 1 и заканчивая точкой с номером r. Эти два числа разделены пробелами.

Выходные данные
Ваша программа должна вывести (g – 1) + (r – 1) строк, каждая из которых описывает один отрезок, соединяющий две точки.

Каждая строка должна содержать два целых числа и один символ, разделенные пробелом. Числа представляют собой номера точек, соединенных этим отрезком. Если точки зеленые, то последним символом в строке должен быть g, если точки красные, то последним символом в строке должен быть r.

Ни порядок, в котором выводятся отрезки, ни порядок точек в строке не имеют значения.

Замечание
Если существует несколько маршрутов товароперевозок, удовлетворяющих всем указанным требованиям, выведите любой из них.

Запрещенный подграф

Обход в глубину графы жадные алгоритмы реализация

Два неориентированных графа G и H называются изоморфными , если:

  • они имеют одинаковое количество вершин;
  • существует такое однозначное соответствие между их вершинами, что любые две различные вершины графа G соединены ребром тогда и только тогда, когда соединены ребром соответствующие вершины графа H.
Например, следующие два графа изоморфны, хотя выглядят по-разному:


 

Возможным однозначным соответствием, показывающим, что эти два графа изоморфны, является {a-1, b-6, c-8, d-3, g-5, h-2, i-4, j-7}, хотя существуют и другие подобные соответствия.

Подграфом графа называется граф, множества вершин и ребер которого являются подмножествами множеств вершин и ребер графа G. Заметьте, что граф является также и своим подграфом. На рисунке показаны граф и один из его подграфов:



Говорят, что граф G содержит другой граф H , если существует хотя бы один подграф H ’ графа G , который изоморфен H . Следующий рисунок показывает граф G , который содержит граф H .



ЗАДАНИЕ

По двум заданным неориентированным графам G и H постройте подграф G’ графа G такой, что:

количество вершин в графах G и G’ одинаково;
H не содержится в G’ .
Естественно, может быть много подграфов графа G’ с перечисленными свойствами. Постройте подграф с как можно большим количеством ребер.

БАЗОВЫЙ АЛГОРИТМ

Возможно, наиболее простой стратегией при решении этой задачи будет следующая: рассматривать ребра графа G в порядке, в котором они представлены во входных данных, после чего пытаться добавлять ребра одно за другим в граф G’, проверяя на каждом шаге, входит ли граф H в граф G’ или нет. Правильная реализация этого жадного алгоритма наберет некоторое количество очков, хотя существуют гораздо лучшие стратегии.

ОГРАНИЧЕНИЯ

3 ≤ m ≤ 4    m – количество вершин в H.
3 ≤ n ≤ 1000    n – количество вершин в G .

ВВОД

Вы получите 10 тестов каждый со следующими данными:
 

Пример ввода

ОПИСАНИЕ

3 5
0 1 0
1 0 1
0 1 0
0 1 0 0 0
1 0 1 0 0
0 1 0 1 0
0 0 1 0 1
0 0 0 1 0

СТРОКА 1: Содержит два целых числа, разделенных пробелом, соответственно и n.

СЛЕДУЮЩИЕ СТРОККаждая строка содержит целых чисел, разделенных пробелами, и представляет одну вершину из в порядке 1, ..., -ый элемент -ой строки в этой секции равняется 1, если вершины и соединены ребром в , и равняется 0 в противном случае.

СЛЕДУЮЩИЕ СТРОК Каждая строка содержит целых чисел, разделенных пробелами, и представляет одну вершину из в порядке 1, ..., -ый элемент -ой строки в этой секции равняется 1, если вершины и соединены ребром в и равняется 0 в противном случае.

 

Заметьте, что за исключением строки 1, приведенные входные данные представляют собой матрицы смежности графов и .

ВЫВОД

Вы должны создать 10 выводов по одному на каждый входной. Каждый тест должен содержать следующие данные:

Пример вывода

ОПИСАНИЕ

#FILE forbidden K
5
0 1 0 0 0
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

СТРОКА 1: Заголовок файла. Заголовок файла должен содержать

#FILE forbidden K

где K – это число между 1 и 10, которое соответствует решенному входному файлу.

СТРОКА 2: Содержит одно целое число : .

СЛЕДУЮЩИЕ СТРОК Каждая строка содержит целых чисел, разделенных пробелом, и представляет одну вершину из G’ в порядке 1, ..., -ый элемент -ой строки в этой секции равняется 1, если вершины и соединены ребром в G’ , и равняется 0 в противном случае.

Заметьте, что за исключением строк 1 и 2, приведенные входные данные представляют собой матрицу смежности графа G’. Обратите внимание, что есть много вариантов ответа, и приведенный вариант является корректным, но не оптимальным.

Восстановление программы

реализация Конструктив

Выполняя очередное задание Министерства образования и сельского хозяйства, программисты Флатландского государственного университета информационных технологий, удобрений и ядохимикатов создали специального робота по прокладке оросительных каналов.

Программа для робота представляет собой последовательность команд. Команды робота приведены в следующей таблице:

Команда Обозначение Действия робота
Перемещение (X) Переместиться вперед на X километров, прокладывая за собой оросительный канал
Поворот налево L Повернуть налево на 90o
Поворот направо R Повернуть направо на 90o

Любая программа начинается и заканчивается командами перемещения и не содержит двух команд перемещения или двух команд поворота подряд.

Исходно робот размещается в некоторой точке поля, на котором требуется создать оросительную систему. После запуска робот последовательно выполняет команды своей программы. Программа считается корректной, если полученный в результате ее выполнения канал не имеет самопересечений или самокасаний.

Программисты университета написали программу и собрались отправить ее по электронной почте в министерство. Однако, в результате поражения сети университета вирусом программа оказалась испорчена. А именно, из нее исчезли все команды перемещения. Теперь программистам требуется восстановить программу. Поскольку времени очень мало, решено было оставить сохранившиеся команды поворота, вставив между ними команды перемещения так, чтобы получившаяся программа была корректной.

Входные данные
Входные данные содержат команды поворота исходной программы в том порядке, в котором они в ней следовали. Каждая команда представляет собой символ «L» либо «R», команды друг от друга не отделяются. Количество команд не превышает 30 000.

Выходные данные
Выведите  любую корректную программу, последовательность команд поворота в которой совпадает с последовательностью, заданной во входных данных. Параметр X каждой команды перемещения должен быть положительным целым числом и не должен превышать 109. Все команды выведите в одной строке и друг от друга не отделяйте.

""

Сокращение одночленов

реализация Алгоритмы обработки

Одночлен - это выражение, состоящее из однобуквенных переменных с операциями умножения и возведения в целочисленную степень. Именами переменных являются малые латинские буквы. Умножение обозначается символом '*' (ASCII 42), возведение в степень - символом '^' (ASCII 94). Показатель степени состоит из одной десятичной цифры от 1 до 9. Примеры одночленов: t, a*b*c^2, y*d^1*y^9.

Требуется по данным N + M одночленам построить дробь, равную произведению первых N одночленов, делённому на произведение оставшихся M одночленов. При этом:

1) Числитель и знаменатель дроби должны быть одночленами.

2) Переменная не должна встречаться в дроби более одного раза (т. е. дробь необходимо сократить).

3) Степени переменных должны быть целыми числами большими или равными 2.

4) В числителе и знаменателе переменные должны быть отсортированы по алфавиту.

Входные данные
В первой строке входного файла содержатся числа N и M (1 <= N, M <= 999), разделённые пробелами.

Следующие N + M строк содержат по одному одночлену каждая. Длина каждой строки не превосходит 100 символов.

Выходные данные
В выходном файле должны быть две строки, содержащие соответственно числитель и знаменатель результата. Если после сокращения в числителе и/или в знаменателе не остаётся ни одной переменной, вместо одночлена следует вывести число 1.

Последовательность

дп Динамическое программирование реализация

Последовательность чисел монотонно убывающая если для любого i элемента (кроме последнего )выполняется Ai > Ai+1. Последовательность чисел монотонно возрастающая если для любого i элемента (кроме последнего )выполняется Ai < Ai+1. Последовательность монотонная если она или монотонно убывающая или монотонно возрастающая. Дана последовательность Ai из n чисел. Каждый элемент последовательности можно увеличивать или уменьшать. Требуется изменить последовательность так что бы в ней содержалось K монотонных непересекающихся последовательностей. (один элемент тоже последовательность). Т.к. преобразований бесконечно много то нужно найти такое преобразование чтобы сумма разностей по модулю конечного значения Ai и начального значения Ai была минимальна.

Входные данные
В первой строчке n,k n- количество элементов в последовательности, k сколько должно быть монотонных последовательностей. Во второй строчке n чисел через пробел - сама последовательность(каждое число по модулю меньше 20,000,000)

Выходные данные
Одно число, ответ на задачу.

Съезд кинозвёзд

реализация

На съезд лауреатов конкурсов Киноакадемии приглашены \(n\) кинозвёзд, которые очень трепетно относятся к различным слухам о себе. Необходимо, чтобы среди \(\frac{n(n-1)}{2}\) возможных пар кинозвёзд оказалось ровно \(a\) пар, в которых обе кинозвезды ни в какой момент времени не будут присутствовать в зале съезда вместе, и ровно \(b\) пар, в которых одна из кинозвёзд будет присутствовать в зале только вместе с другой: войдет в зал позже нее, а выйдет раньше.

Чтобы обеспечить эти условия, на входе в зал поставили швейцара. В каждый момент времени он либо впускает одного человека в зал, либо выпускает одного человека из зала. Кинозвёздам, покинувшим зал, запрещено вновь туда возвращаться.

Требуется для каждого из \(q\) заданных съездов по \(n\), \(a\) и \(b\) определить подходящую последовательность входа и выхода кинозвёзд в зал.

Формат входных данных
Первая строка входного файла содержит целое число \(q\) — количество съездов. Каждая из последующих \(q\) строк содержит описание съезда: три целых числа \(n\), \(a\) и \(b\).

Формат выходных данных
Выходной файл должен содержать \(q\) строк — по одной на каждый съезд. Каждая строка должна содержать число \(n\), после которого следуют \(2n\) целых чисел, описывающих порядок входа и выхода кинозвёзд в зал. Каждое число в диапазоне от \(1\) до \(n\) должно встречаться дважды: в первый раз число \(i\) обозначает вход \(i\)-й кинозвёзды в зал, во второй раз — её выход.

Гарантируется, что для каждого из заданных съездов существует хотя бы одно решение. Если существует несколько решений, можно вывести любое из них.

Если решение для конкретного съезда вами не найдено, в соответствующей строке необходимо вывести единственное число \(0\).

Требуется решить задачу для 7 тестов, которые находятся на вашем компьютере в каталоге <<c:work6-tests>> в файлах с именами 01, 02, 03, 04, 05, 06 и 07. На проверку требуется сдавать только файлы с ответами. Сдавать программу не требуется.

За каждый тест, ответ на который отправляется в проверяющую систему, начисляется \(k\) баллов, где \(k\) — число съездов, для которых было найдено правильное решение.

Если присланный файл не соответствует требованиям к формату выходных данных, то он не будет принят на окончательную проверку с сообщением <<PE 1>>.

В течение тура можно не более 10 раз по каждому тесту запросить информацию о результатах оценивания ответа. Запрос по каждому тесту можно делать не чаще одного раза в 5 минут. В качестве результата проверки сообщается количество полученных баллов и комментарий проверяющей программы, который содержит информацию о правильности решений для съездов в порядке их перечисления во входном файле в следующем формате:

  • <<+>> — решение правильное, за него начислен 1 балл;

  • <<->> — решение неправильное;

  • <<0>> — присланный файл содержит 0 для этого съезда.

 

В приведённом в примере ответе на тест, решение для второго съезда не найдено, а решение для четвертого теста неправильное. Если бы это был один из тестов жюри, такой ответ был бы оценен в 2 балла из 4.

Здоровое питание

дп Дерево отрезков, RSQ, RMQ реализация

План студенческого городка некоторого университета представляет собой квадрат \(n \times n\), в каждой клетке которого расположено здание. Здания соединены переходами, если они расположены в клетках, имеющих общую сторону. В левом верхнем углу квадрата расположено студенческое общежитие. В правом нижнем углу расположен учебный корпус.

В каждом из зданий, включая общежитие и учебный корпус, расположен автомат, торгующий ровно одним продуктом, например, только кофе или только пирожками с мясом. Студенты каждый день ходят из общежития в учебный корпус по переходам, выбирая один из кратчайших путей.

Руководство университета заинтересовалось разнообразием питания студентов, покупающих продукты в автоматах по ходу движения. Для каждого автомата \(A_{i,j}\) планируется найти кратчайший путь из общежития в учебный корпус, проходящий через этот автомат и содержащий как можно больше автоматов, торгующих тем же самым продуктом, что и автомат \(A_{i,j}\). Количество таких автоматов на этом пути называется избыточностью автомата \(A_{i,j}\). При этом автомат \(A_{1,1}\) находится в общежитии, а автомат \(A_{n,n}\) — в учебном корпусе.

Требуется написать программу, которая по информации о продуктах, продаваемых автоматами, для каждого из чисел в диапазоне от \(1\) до \(2n - 1\) определяет число автоматов с таким значением избыточности.

Формат входных данных
Первая строка содержит целое число \(n\) (\(2 \leqslant n \leqslant 1500\)). Следующие \(n\) строк содержат по \(n\) чисел в каждой. В \(i\)-й из этих строк \(j\)-е число соответствует номеру продукта, продающегося в автомате \(A_{i,j}\). Номера продуктов находятся в диапазоне от \(1\) до \(n^2\).

Формат выходных данных
Строка должна содержать \((2n-1)\) целых чисел — количество автоматов с избыточностями \(1, 2, \ldots, 2n - 1\) соответственно.

Установка Козырька - 2

Префиксные суммы(минимумы, ...) реализация

Вадим работает в ЖКХ и сегодня он крайне озабочен вопросов сосулек. А именно он наблюдает за домом по адресу — проспект Программистов, дом 404. В доме \(n\) этажей, на каждом этаже по \(m\) окон, включая первый. Окна на каждом этаже пронумерованы слева направо от \(1\) до \(m\). \(i\)-e окно \(j\)-го этажа находится ровно под \(i\)-м окном \(j + 1\)-го этажа. Под некоторыми окнами свисают сосульки.

Вадим руководит установкой на дом козырька, который будет установлен ниже первого этажа и проходить под \(d\) окнами. То есть, если начало козырька находится под окном с номером \(i\), то он проходит под всеми окнами с номерами от \(i\) до \(i + d - 1\). Вадим хочет выбрать такую позицию для козырька, чтобы над ним находилось наименьшее возможное количество сосулек и из всех подходящих вариантов выбрать такой, что начало козырька будет находиться как можно левее.

Помогите Вадиму выбрать нужное окно.

Формат входных данных
В первой строке содержатся числа \(n\), \(m\), \(d\), \(k\) — количество этажей, количество окон на каждом этаже, длина козырька и количество окон, под которыми есть сосульки, соответственно (\(1 \le n, m \le 100\),\(1 \le d \le m\), \(0 \le k \le n \cdot m\)).

В следующих \(k\) строках заданы тройки чисел \(x\), \(y\), \(z\) — номер этажа, номер окна на этаже и количество сосулек под ним (\(1 \le x \le n\), \(1 \le y \le m\), \(1 \le z \le 10\)).

Гарантируется, что каждая пара \(x\), \(y\) встречается не более одного раза.

Формат входных данных
В единственной строке выведите одно число — номер окна, под которым следует разместить начало козырька.


Замечание

В первом примере длина козырька равна количеству окон на этаже, поэтому существует всего одна позиция, куда его можно поставить.

Во втором примере козырек имеет длину один и если его поставить под окнами с номерами \(1\), \(2\) или \(3\), над ним будет соответственно \(1\), \(0\) или \(2\) сосульки.

В третьем примере возможны две позиции для козырька, но так как под окнами с \(1\)-м и \(3\)-м номерами одинаковое число сосулек, а окна с номерами \(2\) будут над козырьком в любом случае, выбираем наиболее левый вариант расположения.

Поиск числа - 2

Алгоритмы обработки реализация

Однажды, девочка Аня записала несколько целых чисел лежащих в диапазоне от \(-1000\) до \(1000\) в некоторую изначально пустую строку \(S\), разделив каждые два пробелом. Но стоило ей отвернуться, как злой хулиган Гриша заменил все пробелы в строке на подстроки из строчных латинских букв. Тем не менее и этого ему показалось мало, поэтому он мог дописать латинских строчных букв еще и в начало и конец строки \(S\).

Аня очень расстроилась, увидев это безобразие, но времени на расшифровку у нее нет. Однако, ей срочно понадобилось узнать, какое число было наименьшим. Ваша задача — помочь ей.

Формат входных данных
В первой строке содержится одно натуральное число \(n\) — количество символов в строке \(S\) (\(1 \le n \le 100\)).

Во второй строке содержится строка \(S\), состоящая из латинских строчных букв, цифр и знаков <<->>.

Гарантируется:

  • В данной строке содержится хотя бы одна цифра

  • В следующей позиции после каждого знака <<->> находится цифра

  • В числах, изначально записанных в строку не было ведущих нулей, а также каждое из них не превосходило \(1000\) по модулю.

Формат выходных данных
В единственной строке выведите наименьшее число, которое было у Ани в строке.

Обратите внимание, что \(0\) следует выводить без знака <<->>.

Глеб и медиана

Дерево отрезков, RSQ, RMQ реализация

Глеб устал от побитового исключающего <<или>> и решил, что пора найти новую интересную функцию. Его выбор пал на медиану. Напомним, медианой массива называется число, которое окажется посередине, если массив упорядочить по возрастанию. В рамках этой задачи для массивов чётной длины положим медиану равной левому из двух центральных в отсортированном порядке элементов.

Для некоторого числа \(m\) назовём \(m\)-разбиением массива такое его разбиение на непересекающиеся отрезки, что на каждом из этих отрезков медиана больше либо равна \(m\). Вам дан массив \(a\) длины \(n\) и \(q\) запросов двух видов:

  1. присвоить элементу с индексом \(i\) значение \(x\);

  2. найти наибольшее число \(k\) такое, что для подотрезка массива с индексами от \(l\) до \(r\) существует \(m\)-разбиение на \(k\) отрезков.

Формат входных данных
В первой строке дается число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) - размер массива. В следующей строке вводятся \(n\) чисел \(a_{i}\) (\(1 \le a_{i} \le 10^9\)) - элементы массива, на следующей строке вводится число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) - количество запросов. В следующих \(q\) строках даются запросы, каждый в одном из следующих форматов:

  • \(1\) \(i\) \(x\) —  запрос 1 типа (\(1 \le i \le n, 1 \le x \le 10^9\));

  • \(2\) \(m\) \(l\) \(r\) —  запрос 2 типа (\(1 \le m \le 10^9, 1 \le l \le r \le n\)).

Формат выходных данных
Для каждого запроса второго типа в отдельной строке выведите ответ на запрос. В случае если для отрезка не существует никакого \(m\)-разбиения, выведите \(0\).

В задаче присутствуют 6 групп:

  1. \(n \le 5, q \le 5\), такие решения будут набирать не менее 10% баллов

  2. \(n \le 100, q \le 100\), такие решения будут набирать не менее 20% баллов

  3. \(n \le 10000, q \le 10000\), такие решения будут набирать не менее 30% баллов

  4. \(m\) - одно и тоже для всех запросов, такие решения будут набирать не менее 25% баллов

  5. нет запросов изменения, такие решения будут набирать не менее 35% баллов

  6. Ограничения, как и в задаче

 

Очередь за комплексом

Жадный алгоритм Использование сортировки реализация

Федок очень хочет купить себе комплексный обед в столовой, но сделать это не так просто. В столовой работает всего одна касса, и то очень медленно. На данный момент в очереди находится \(n\) \((2 \leq n \leq 100\,000)\) людей, а сам Федок находится на \(k-\)ой \((1 \leq k \leq n)\) позиции в ней. И вот, чтобы занять себя в этой очереди, Федок стал обдумывать коварный план как побыстрее оплатить комплексный обед и начать есть.

В чем состоит коварный план? Федок хочет крикнуть, что открылась новая касса. Тогда, по его мнению, многие уйдут из очереди в поисках этой кассы, а он приблизится к заветной еде. Но вот в чем проблема: не все люди так нетерпеливы как наш герой. Проще говоря, у каждого человека есть свой параметр \(P_i\) — терпеливость. Если человек стоит на позиции \(x\) и его терпеливость равна \(y\), то он уйдет искать новую кассу только в том случае, если \(y < x\)

Казалось бы, эта задача трудна, но и Федок не глуп. Он своим метким взором определил терпеливости всех людей, стоящих в очереди кроме него. Увы, так как людей очень много, в его голове все перепуталось, и некоторые числа поменялись местами. Таким образом наш герой получил некоторую перестановку множества терпеливости всех людей в очереди \(P_1, P_2, \ldots, P_{n-1}\)

Федок не знает точно, кто насколько терпелив и боится, что не сдвинется в очереди после реализации своей задумки. Поэтому он просит вас помочь ему узнать, какую минимальную и максимальную позицию от начала очереди он может занимать после того как крикнет: <<Свободная касса!>>

Формат входных данных
В первой строке входных данных находится число людей в очереди \(n\) (\(2 \leq n \leq 100\,000\))

Во второй строке находится число \(k\) (\(1 \leq k \leq n\)) — текущая позиция Федка в очереди

В следующей строке содержатся \(n-1\) число — перестановка множества терпеливостей людей в очереди \((0 \leq P_i \leq n)\)

Формат выходных данных
В первой строке выведите минимальное место, которое может стать у Федка после применения его плана

Во второй строке выведите максимальное место, которое может стать у Федка после применения его плана

  • Решения, работающие для \(n \leq 10\) будут набирать не менее 5 баллов

  • Решения, работающие для \(n \leq 1000\) будут набирать не менее 10 баллов


Замечание

Пояснение к первому тесту:

Алексей стоит на второй позиции. Перед ним один человек.

Если его терпеливость будет равна нулю, то он уйдет, и Федок станет первым

Если же его терпеливость равна трем, то он не уйдет, и Федок останется второй

Миша и математика

Остатки реализация

Миша сидел на занятиях математики в Высшей школе экономики и решал следующую задачу: дано \(n\) целых чисел и нужно расставить между ними знаки \(+\) и \(\times\) так, чтобы результат полученного арифметического выражения был нечётным (например, между числами \(5\), \(7\), \(2\), можно расставить арифметические знаки следующим образом: \(5 \times 7 + 2 = 37\)). Так как примеры становились все больше и больше, а Миша срочно убегает в гости, от вас требуется написать программу решающую данную задачу.

Формат входных данных
В первой строке содержится единственное число \(n\) (\(2 \leq n \leq 10^5\)). Во второй строке содержится \(n\) целых чисел \(a_i\), разделённых пробелами (\(-10^9 \leq a_i \leq 10^9\)). Гарантируется, что решение существует.

Формат выходных данных
В одной строке выведите \(n - 1\) символ \(+\) или \(\times\), в результате применения которых получается нечётный результат. (Для вывода используйте соответственно знаки <<+>> (ASCII код—43) и <<x>> (ASCII код—120), без кавычек).

 

Жребий Крижановского

Словари Алгоритмы обработки реализация

Одиночество есть жребий всех выдающихся умов.

Артур Шопенгауэр

Однажды в летнем лагере после ужина осталась лишняя булочка. Выяснить, кому она достанется, дети решили с помощью жребия Крижановского. Правила этой игры такие: каждый участник называет ведущему натуральное число. Среди этих чисел выбираются те, которые были названы ровно один раз, а назвавший минимальное из этих чисел объявляется победителем. Обратите внимание, что победителя может не быть, если среди названных чисел каждое встречается несколько раз.

Вас назначили ведущим. Помогите установить победителя или определить, что такого нет.

Формат входных данных
В первой строке дано одно число \(n\) (\(1 \le n \le 10^5\)) — количество участников игры. Далее в \(n\) строках вводятся названные участниками натуральные числа, не превосходящие \(10^9\).

Формат выходных данных
Программа должна вывести число, написанное победителем. Если победителя нет, то нужно вывести число \(-1\).


Замечание

В первом примере из условия участвовали \(7\) игроков и они назвали числа \(5\), \(1\), \(1\), \(3\), \(4\), \(3\), \(1\). Сначала оставим только те числа, которые встречаются ровно один раз: \(5\) и \(4\). Минимальное из этих чисел равно \(4\).

Во втором примере победителя нет, т.к. каждое из названных чисел встречается несколько раз.

Массивы-палиндромы

Хеш Бинарный поиск реализация

Кай работает в лаборатории изучения массивов, он экспериментирует с двумя массивами натуральных чисел: \(A = [a_1, a_2, \ldots, a_n]\) длины \(n\) и \(B = [b_1, b_2, \ldots, b_m]\) длины \(m\).

Эксперимент, который проводит Кай, устроен следующим образом. У каждого из массивов отбрасывается произвольный, возможно пустой, префикс, а также произвольный, возможно пустой, суффикс, таким образом, чтобы оставшиеся части массивов имели равную длину. Обозначим получившиеся массивы как \(A'\) и \(B'\), а их длину как \(k\). Затем Кай суммирует поэлементно получившиеся массивы, итоговый массив Кай обозначает как \(C = [c_1, c_2, \ldots, c_k]\).

Пусть, например, \(n = 5\), \(A = [4, 3, 3, 2, 1]\), \(m = 6\), \(B = [4, 1, 5, 1, 3, 2]\), от массива \(A\) отбрасывается первый и последний элемент, от массива \(B\) три первых. После этого массивы имеют вид \(A' = [3, 3, 2]\), \(B' = [1, 3, 2]\), результат их поэлементного суммирования \(C = [4, 6, 4]\).

Задача Кая заключается в том, чтобы получать такие \(C\), которые являются массивами-палиндромами, то есть если числа на первой и последней позиции совпадают, числа на второй и предпоследней позиции совпадают, и так далее, для всех \(i\) числа на позициях \(i\) и \(k - i + 1\) совпадают.

Помогите Каю понять, какой максимальный по длине массив-палиндром он может получить в результате эксперимента.

Формат входных данных
В первой строке ввода даны два целых числа \(n\) и \(m\) — количество элементов в первом и во втором массиве, соответственно (\(1 \leqslant n, m \leqslant 100\,000\)).

Во второй строке ввода даны \(n\) целых чисел \(a_{i}\) — массив \(A\) (\(1 \leqslant a_i \leqslant 100\)).

В третьей строке ввода даны \(m\) целых чисел \(b_{j}\) — массив \(B\) (\(1 \leqslant b_j \leqslant 100\)).

Формат выходных данных
Выведите единственное целое число — максимальное \(k\), что Кай в результате эксперимента может получить массив-палиндром длины \(k\).

 

Треугольная головоломка

геометрия Перебор реализация

Головоломка состоит из \(n\) треугольников. Чтобы решить головоломку, необходимо выбрать из них четыре треугольника и собрать из них большой треугольник по следующей схеме:

Треугольники не должны пересекаться, в объединении они должны давать треугольник. Ровно по одному из выбранных треугольников должны находиться в углах, а один треугольник должен располагаться в центре.

Треугольники лежат на столе, их можно свободно вращать и двигать, но нельзя зеркально отражать.

Требуется найти все различные наборы из четырех треугольников, из которых можно собрать большой треугольник по указанной схеме. Два набора считаются разными, если существует треугольник, входящий в один, но не входящий в другой.

Формат входных данных
В первой строке дано одно целое число \(t\) — номер теста.

В второй строке дано одно целое число \(n\) — количество треугольников в головоломке (\(4 \le n \le 30\)).

В следующих \(n\) строках дано описание треугольников. Один треугольник описывается координатами трех своих углов, данных в порядке обхода треугольника против часовой стрелки. Все координаты целые и по модулю не превышают \(10^5\). Гарантируется, что треугольники не являются вырожденными. В исходном расположении треугольники могут пересекаться.

Формат выходных данных
В первой строке выведите одно целое число — количество наборов из четырех треугольников, из которых можно собрать большой треугольник по указанной схеме.

В следующих строках выведите наборы. Каждый набор задается номерами треугольников, которые в него входят. Треугольники внутри набора можно выводить в любом порядке. Наборы можно выводить в любом порядке.

Замечание
В первом примере из данных четырех треугольников можно собрать один. При этом треугольники не требуется вращать.

Во втором примере все треугольники имеют одинаковую форму прямоугольного треугольника с длинами катетов равными \(1\). Из любых четырех треугольников можно собрать один.

Прыгающий робот

реализация Префиксные суммы(минимумы, ...)

Компания <<Flatland Dynamics>> разрабатывает прыгающего робота. Для испытания робота используется полигон, на котором организован круговой маршрут из \(n\) специальных платформ, пронумерованных от \(1\) до \(n\). Расстояние между \(i\)-й и \(i+1\)-й платформой равно \(d_i\), аналогично расстояние между \(n\)-й и \(1\)-й платформой равно \(d_n\).

Робот оснащен искусственным интеллектом и в процессе испытания учится прыгать все дальше. В любой момент времени робот характеризуется своей ловкостью — целым числом \(a\). Робот может перепрыгнуть с платформы \(i\) на платформу \(i+1\), если \(a \ge d_i\). Аналогично, прыжок с \(n\)-й платформы на \(1\)-ю возможен, если \(a \ge d_n\). При этом после каждого прыжка ловкость робота увеличивается на \(1\).

Разработчики робота выбирают одну из платформ в качестве стартовой. Они считают эксперимент удачным, если робот может, совершив \(n\) прыжков от текущей платформы к следующей, завершить полный круг и вернуться на ту же платформу. Разработчикам необходимо выяснить, для какого минимального значения начальной ловкости робота им удастся провести эксперимент и с какой платформы роботу следует начать прыжки.

Формат входных данных
На первой строке ввода находится число \(n\) (\(3 \le n \le 10^7\)).

Вторая строка содержит одно целое число \(f\), которое описывает формат, в котором задан массив расстояний между платформами.

Если \(f = 1\), то на третьей строке находятся \(n\) целых чисел \(d_1, d_2, \ldots, d_n\) (\(1 \le d_i \le 10^{9}\)).

Если \(f = 2\), то на третьей строке находится число \(m\) \(\left(2 \le m \le \min(n, 10^5)\right)\) и три целых числа \(x\), \(y\) и \(z\) (\(0 \le x, y, z \le 10^9\)). На четвертой строке находятся \(m\) целых чисел \(c_1, c_2, \ldots, c_m\) (\(1 \le c_i \le 10^9\)). Значения \(d_i\) вычисляются по следующим формулам.

Если \(1 \le i \le m\), то \(d_i = c_i\).

Если \(m + 1 \le i \le n\), то \(d_i = \left((x\cdot d_{i-2} + y\cdot d_{i-1} + z)\bmod 10^9\right) + 1\).

Здесь \(\bmod\) означает остаток от целочисленного деления, в языках C++, Java и Python он обозначается символом <<%>>.

Формат выходных данных
Требуется вывести два целых числа: минимальную допустимую начальную ловкость \(a\) и номер стартовой платформы, на которую можно разместить робота, чтобы успешно провести эксперимент.

Если возможных стартовых платформ для минимальной начальной ловкости несколько, можно вывести любую из них.

Замечание
Во втором примере массив расстояний между платформами равен \([1, 2, 3, 4, 5, 18, 45, 112, 273, 662]\). Значения от \(d_6\) до \(d_{10}\) вычисляются по формулам:

\(d_6 = \left((1\cdot d_4+2\cdot d_5 + 3) \bmod 10^9\right)+1 = \left((1\cdot 4+2\cdot 5+3)\bmod 10^9\right)+1=18\)

\(d_7 = \left((1\cdot d_5+2\cdot d_6 + 3) \bmod 10^9\right)+1 = \left((1\cdot 5+2\cdot 18+3)\bmod 10^9\right)+1=45\)

\(d_8 = \left((1\cdot d_6+2\cdot d_7 + 3) \bmod 10^9\right)+1 = \left((1\cdot 18+2\cdot 45+3)\bmod 10^9\right)+1=112\)

\(d_9 = \left((1\cdot d_7+2\cdot d_8 + 3) \bmod 10^9\right)+1 = \left((1\cdot 45+2\cdot 112+3)\bmod 10^9\right)+1=273\)

\(d_{10} = \left((1\cdot d_8+2\cdot d_9 + 3) \bmod 10^9\right)+1 = \left((1\cdot 112+2\cdot 273+3)\bmod 10^9\right)+1=662\)

Контрольное значение - 3

Алгоритмы обработки реализация

Профессор Селезнев передает Алисе зашифрованную информацию, которая представляет собой последовательность целых чисел. Все числа данной последовательности не превышают 107. Каждое число передается в течении одной секунды. Чтобы понять, что данные переданы правильно, Алисе необходимо определить контрольное значение, которое вычисляется по следующему правилу,
- берутся три переданных значения из последовательности таким образом, чтобы между между какими-либо двумя моментами передачи прошло ровно K секунд;
- вычисляется сумма выбранных чисел, которая должна быть максимальной. Данная сумма является контрольным значением.
Помогите Алисе определить контрольное значение.


Формат входных данных
В первой строке записано количество чисел N (1 ≤ N ≤ 2·105) и целое число K (1 ≤ K < 105, K < N). Каждая из следующих N строк содержит одно целое число, по модулю не превышающее 107.


Формат выходных данных
Выведите одно число - контрольное значение.
 

Красивые числа

теория чисел реализация

Саша считает красивыми числа, десятичная запись которых не содержит других цифр, кроме 0 и k (1 ≤ k ≤ 9). Например, если k = 2, то такими числами будут 2, 20, 22, 2002 и т.п. Остальные числа Саше не нравятся, поэтому он представляет их в виде суммы красивых чисел. Например, если k = 3, то число 69 можно представить так: 69 = 33 + 30 + 3 + 3.
Однако, не любое натуральное число можно разложить в сумму красивых целых чисел. Например, при k = 5 число 6 нельзя представить в таком виде. Но если использовать красивые десятичные дроби, то это можно сделать: 6 = 5.5 + 0.5.
Недавно Саша изучил периодические десятичные дроби и начал использовать и их в качестве слагаемых. Например, если k = 3, то число 43 можно разложить так: 43 = 33.(3) + 3.(3) + 3 + 3.(3).
Оказывается, любое натуральное число можно представить в виде суммы положительных красивых чисел. Но такое разложение не единственно — например, число 69 можно также представить и как 69 = 33 + 33 + 3. Сашу заинтересовало, какое минимальное количество слагаемых требуется для представления числа n в виде суммы красивых чисел.
Требуется написать программу, которая для заданных чисел n и k находит разложение числа n в сумму положительных красивых чисел с минимальным количеством слагаемых. Формат входных данных На вход программы поступают два натуральных числа n и k (1 ≤ n ≤ 109; 1≤ k ≤ 9).

Формат входных данных
На вход программы поступают два натуральных числа n и k (1 ≤ n ≤ 109; 1≤ k ≤ 9).

Формат выходных данных
Выведите разложение числа n в сумму положительных чисел, содержащих только цифры 0 и k, количество слагаемых в котором минимально. Разложение должно быть представлено в виде:

n=a1+a2+...+am
Слагаемые a1, a2, ..., am должны быть выведены без ведущих нулей, без лишних нулей в конце дробной части. Запись каждого слагаемого должна быть такой, что длины периода и предпериода дробной части имеют минимально возможную длину. Например, неправильно выведены числа: 07.7; 2.20; 55.5(5); 0.(66); 7.(0); 7. ; .5; 0.33(03). Их следует выводить так: 7.7; 2.2; 55.(5); 0.(6); 7; 7; 0.5; 0.3(30). Предпериод и период каждого из выведенных чисел должны состоять не более чем из 100 цифр. Гарантируется, что хотя бы одно такое решение существует. Если искомых решений несколько, выведите любое. Порядок слагаемых может быть произвольным. Выходные данные не должны содержать пробелов.

Примечание
Ответ программы для первого примера: 10=10 Ответ программы для второго примера: 42=6+6+6+6+6+6+6 Ответ программы для третьего примера: 57=11+11+11+11+11+1+1 Выводить нужно именно так. Ниже содержится служебная информация в качестве ответа

Робот-курьер

Обход в глубину Интерактивные задачи Задачи на моделирование реализация

Это интерактивная задача. Ваше решение должно взаимодействовать с программой-интерактором по описанному ниже протоколу.

На вас возложили ответственную задачу по управлением роботом-курьером. Карта, по которой перемещается робот, представляет из себя поле размера \(n \times m\) (\(n\) строк и \(m\) столбцов). Каждая клетка поля может быть либо тротуаром (‘.’), либо проезжей частью дороги (‘+’).

Ровно \(k\) клеток проезжей части содержат регулируемые пешеходные переходы. Гарантируется, что для любого пешеходного перехода ровно две противоположные относительно него соседние с ним по стороне клетки (то есть верхняя и нижняя или левая и правая) являются клетками тротуара. Соответственно, с обоих концов каждого пешеходного перехода расположен светофор.

Робот может перемещаться только по тротуарам и пешеходным переходам. Для определения цвета светофора робот обладает камерой с разрешением \(h \times w\) (где \(w\) четно). Для управления роботом вы можете передавать ему следующие команды:

  • <<turn \(c\)>>, где \(c \in \{\text{`{L}'}, \text{`{U}'}, \text{`{R}'}, \text{`{D}'}\}\), означает поворот в соответствующую сторону (влево, вверх, вправо или вниз);

  • <<move>> означает перемещение на одну клетку вперед относительно текущего направления;

  • <<camera>> означает получение изображения с камеры; в ответ на эту команду вы получаете таблицу из \(h \times w\) символов, каждый из которых описывает преобладающий цвет (‘r’, ‘g’ или ‘b’ — красный, зеленый или синий) в соответствующей области пространства перед роботом;

  • <<wait \(t\)>> означает ожидание в течение \(t\) секунд.

На поворот или перемещение требуется ровно одна секунда. Получение изображения с камеры времени не требует. Каждый светофор горит одним цветом в течение фиксированного периода времени, после чего моментально переключается и горит другим цветом то же время (и так далее). Этот период времени вам неизвестен и может быть разным у разных светофоров, однако гарантируется, что он не превышает \(10^6\).

Светофоры могут находиться на разной высоте и на разном расстоянии сбоку от соответствующего перехода. Если робот находится около перехода с \(i\)-м светофором и смотрит в его направлении, на изображении с камеры светофор будет занимать две клетки в \(a_i\)-й и \((a_i + 1)\)-й снизу строках в столбце на расстоянии \(b_i\) от центра (слева от центра, если \(b_i < 0\), и справа, если \(b_i > 0\)). Для светофора, горящего красным, нижняя из этих двух клеток равна ‘b’, а верхняя равна ‘r’. Для зеленого светофора нижняя клетка равна ‘g’, а верхняя — ‘b’. Остальные клетки на изображении могут любого из трех цветов.

Требуется переместить робота из клетки \((i_1, j_1)\) (\(i_1\)-я сверху строка, \(j_1\)-й слева столбец) в клетку \((i_2, j_2)\). Начинать пересекать пешеходные переходы можно только если на соответствующем светофоре горит зеленый сигнал. Если движение по переходу начато, когда на светофоре горит зеленый сигнал, можно считать, что как минимум в течение еще двух секунд находиться на переходе безопасно, то есть можно гарантированно переместиться на тротуар на противоположной стороне дороги.

Напишите программу, сообщающую роботу команды, безопасно приводящие его из стартовой клетки в конечную. Минимизировать затраченное в пути время не требуется. В изначальной клетке робот находится в направлении <<вверх>> (‘U’).

Каждый тест состоит из нескольких наборов входных данных. В первой строке ввода дано единственное целое число \(t\) — количество наборов входных данных в тесте (\(1 \le t \le 50\)).

Наборы входных данных поступают вам на ввод последовательно: для каждого набора сначала вводится информация о карте и роботе, а затем сразу запускается протокол взаимодействия с интерактором (см. ниже).

В первой строке описания карты даны два целых числа \(n\) и \(m\) — размеры карты (\(1 \le n, m \le 50\)). Следующие \(n\) строк содержат по \(m\) символов каждая и описывают карту. Символ на \(j\)-й позиции \(i\)-й строки описывает клетку с координатами \((i, j)\) и равен ‘.’, если это клетка тротуара, и ‘+’, если это клетка проезжей части.

В следующей строке даны три целых числа \(k\), \(h\) и \(w\) — количество переходов со светофорами и разрешение камеры, соответственно (\(k \le n \cdot m\); \(2 \le h, w \le 8\); \(w\) четно).

Следующие \(3k\) строк описывают светофоры: по три на каждый из \(k\) переходов. В первой строке для \(i\)-го светофора дано положение соответствующего ему перехода \((r_i, c_i)\) (\(1 \le r_i \le n\); \(1 \le c_i \le m\)). Во второй строке дано описание светофора с одного из двух концов перехода в формате <<\(d_{i,1}\) \(a_{i,1}\) \(b_{i,2}\)>>, где \(d_1\) указывает на направление перехода, соответствующее этому светофору, а \(a_{i,1}\) и \(b_{i,1}\) — его высота и расстояние от центра перехода, соответственно (\(d_{i,1} \in \{\text{`{L}'}, \text{`{U}'}, \text{`{R}'}, \text{`{D}'}\}\); \(1 \le a_{i,1} < h\); \(1 \le |b_{i,1}| \le \frac{w}{2}\)). В третьей строке в том же формате описывается светофор с противоположной стороны перехода.

Наконец, в последней строке набора входных данных даны четыре целых числа \(i_1\), \(j_1\), \(i_2\) и \(j_2\) — координаты стартовой и конечной клеток, соответственно (\(1 \le i_1, i_2 \le n\); \(1 \le j_1, j_2 \le m\)).

Гарантируется, что все \((r_i, c_i)\) различны, а описания светофоров корректны: направления \(d_{i,1}\) и \(d_{i,2}\), указанные во вводе, противоположны и соответствуют направлениям, в которых от этого перехода расположен тротуар. Также гарантируется, что конечная клетка достижима из стартовой.

После прочтения вашей программой входных данных для очередного набора запускается протокол взаимодействия с интерактором.

Взаимодействие с интерактором заключается в сообщении вашей программой интерактору очередного действия робота, после чего интерактор будет выводить результат выполнения этого действия. Для большего понимания обратите внимание на пример теста в условии.

  • Чтобы повернуть робота, выведите <<turn \(c\)>>, где \(c \in \{\text{`{L}'}, \text{`{U}'}, \text{`{R}'}, \text{`{D}'}\}\). В результате выполнения этого действия робот повернется <<лицом>> в соответствующем направлении, и интерактор выведет <<OK>> на отдельной строке.

  • Чтобы переместить робота, выведите <<move>>. В таком случае робот переместится на одну клетку вперед в том направлении, в котором он повернут. Если это действие успешно, интерактор выведет <<OK>> на отдельной строке. Если при этом робот достиг конечной клетки \((i_2, j_2)\), интерактор перейдет к рассмотрению следующего набора входных данных и подаст соответствующие входные данные на ввод вашей программе (либо завершится и засчитает ваше решение, если это был последний набор входных данных).

    Если же робот при таком перемещении попадает в непроходимую клетку, выходит за пределы карты или выезжает на пешеходный переход на красный свет, интерактор выведет <<FAIL>> и завершится с вердиктом Wrong Answer. Во избежание получения некорректного вердикта, считав <<FAIL>>, ваше решение также должно завершиться.

  • Чтобы сделать снимок, выведите <<camera>>. В ответ интерактор выведет \(h\) строк по \(w\) символов каждая. Каждый символ равен ‘r’, ‘g’ или ‘b’ и задает цвет соответствующего <<пикселя>>. Если непосредственно перед роботом не находится пешеходный переход, все символы будут случайными. Если же робот стоит у перехода, то два символа, соответствующие положению на <<изображении>> светофора напротив, будут отражать цвет этого светофора как описано в условии.

  • Чтобы подождать \(t\) секунд (\(1 \le t \le 2 \cdot 10^6\)), выведите <<wait \(t\)>>. В ответ интерактор выведет <<OK>> на отдельной строке и обновит состояние всех светофоров, цвет которых за это время поменяется.

    Запрещается делать более \(25\) команд ожидания в одной и той же клетке поля. Если ваше решение совершает хотя бы \(26\) запросов ожидания из одной и той же клетки, интерактор в ответ выведет <<FAIL>> и завершится с вердиктом Wrong Answer.

 

Вывод каждой команды ваша программа должна завершать выводом символа перевода строки (endl, ‘\n’) и сбросом буфера вывода. Сбросить буфер можно с помощью

  • <<fflush(stdout)>> в C и C++, или <<cout.flush()>> только в C++,

  • <<System.out.flush()>> в Java,

  • <<sys.stdout.flush()>> в Python,

  • и <<Console.Out.Flush()>> в C#.

  • В Pascal и Delphi сброс буфера при выводе в стандартный поток вывода происходит автоматически.

Решение, не выполняющее эти действия, может получить произвольный вердикт (скорее всего, Time Limit Exceeded или Idleness Limit Exceeded).

В примере из условия добавлены лишние пустые строки, чтобы проиллюстрировать взаимодействие с интерактором и порядок ввода-вывода при этом взаимодействии. В решении выводить эти пустые строки не надо.

Пояснение к примеру

Во втором наборе входных данных в примере:

  1. В клетке \((3, 2)\) нет перехода, поэтому по ней нельзя перемещаться;

  2. При пересечении перехода в \((1, 2)\) в направлении ‘R’ светофор находится на высоте \(2\) и на расстоянии \(-2\) от центра: соответственно, его клетки на изображении располагаются в первом столбце во второй и третьей снизу строках. Для данного снимка они равны ‘b’ в верхней строке и ‘g’ во второй, поэтому его сразу можно пересекать.

  3. При пересечении перехода в \((2, 3)\) в направлении ‘D’ светофор находится на высоте \(1\) и на расстоянии \(2\) от центра, то есть в четвертом столбце в двух нижних строках. На первом изображении он горит красным, а после ожидания (<<wait 10>>) — зеленым.

Профессор Хаос

Задачи на моделирование реализация

В секретной лаборатории профессора Хаоса проходит эксперимент по выращиванию особо опасных бактерий. В начале первого дня эксперимента у Хаоса имеется \(a\) особо опасных бактерий.

Каждый день эксперимента устроен следующим образом. Рано утром профессор достает из контейнера все свои бактерии и помещает их в инкубатор, где бактерии начинают делиться. Вместо каждой бактерии образуется \(b\) новых бактерий.

После извлечения бактерий из инкубатора \(c\) из них используются для проведения различных опытов и затем уничтожаются. Если после извлечения из инкубатора имеется менее \(c\) бактерий, для проведения опытов используются все имеющиеся бактерии, и эксперимент заканчивается.

Оставшиеся бактерии в конце дня необходимо поместить в контейнер и продолжить использовать в эксперименте. Однако в контейнер можно поместить не более \(d\) бактерий, поэтому если число оставшихся бактерий больше \(d\), то в контейнер помещаются \(d\) бактерий, а остальные уничтожаются.

Теперь профессор Хаос хочет выяснить, сколько особо опасных бактерий будет у него в контейнере после \(k\)-го дня эксперимента. Помогите ему найти ответ на этот вопрос.

Формат входных данных
В единственной строке входного файла содержится пять целых чисел \(a\), \(b\), \(c\), \(d\) и \(k\) (\(1 \le a, b \le 1000\), \(0 \le c \le 1000\), \(1 \le d \le 1000\), \(a \le d\), \(1 \le k \le 10^{18}\)).

Формат выходных данных
Выведите одно число — количество бактерий у Хаоса к концу \(k\)-го дня. Если эксперимент завершится в \(k\)-й день или ранее, выведите число 0.

 

Необычный массив

Дерево отрезков, RSQ, RMQ Использование сортировки реализация

У Васи есть массив, состоящий из \(n\) чисел \(a_1, a_2, \ldots, a_n\). Для каждой позиции \(i\) и для каждого подотрезка массива \([l, r]\), который содержит позицию \(i\) (то есть, \(1 \le l \le i \le r \le n\)), Вася вычисляет значение \(c_{i, l, r}\) следующим образом. Вася выписывает на листочек числа из массива с позиции \(l\) до позицию \(r\), всего \(len=r-l+1\) чисел (среди которых обязательно есть \(a_i\)), и сортирует выписанные числа по возрастанию. После чего Вася находит, на какой позиции \(j\) в полученном отсортированном массиве стоит число \(a_i\). Если таких позиций несколько, то среди них он выбирает ту, которая максимизирует расстояние от середины массива — позиции \(mid = \lceil (len+1) / 2 \rceil\) (\(len / 2 + 1\) в случае четного \(len\) и \((len+1)/2\) в случае нечетного \(len\)). Полученное расстояние \(|j - mid|\) и есть искомая величина \(c_{i,l,r}\).

Например, если у Васи был массив \(a=\{5,1,3,2,1,7\}\), а \(i=2\), \(l=2\), \(r=5\), то Вася выпишет на листочек числа \(\{1,3,2,1\}\), отсортирует их и получит массив \(\{1,1,2,3\}\), длина которого равна 4. Середина этого массива находится на позиции \(4/2+1=3\), а искомое число \(a_i=1\) стоит в этом массиве на позициях 1 и 2. Среди этих двух позиций Вася выбирает ту, которая дальше от середины, то есть, позицию 1. Искомая разность между позициями равна 2, и это и есть значение \(c_{2,2,5}\).

Для каждой позиции \(i\) Вася вычисляет величину \(b_i\), которая равна максимуму среди значений \(c_{i,l,r}\) среди всех подотрезков, содержащих позицию \(i\).

Как вы видите, определение числа \(b_i\) достаточно сложное. Помогите Васе вычислить значения \(b_i\) для всех позиций массива.

Формат входных данных
В первой строке входных данных находится одно целое число \(n\) (\(1 \le n \le 200\,000\)) — размер массива Васи.

Во второй строке находится \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — элементы массива.

Формат выходных данных
В единственной строке выведите \(n\) чисел, \(i\)-е из них должно быть равно \(b_i\).


Примечание

Разберем подробнее первый пример.

  1. Для первой позиции Вася рассмотрит все подотрезки, содержащие эту позицию, в частности, подотрезок \([1,5]\), где \(l=1\) и \(r=5\). Для вычисления \(c_{i,l,r}=c_{1,1,5}\) Вася выпишет числа \(\{5, 4, 3, 2, 1\}\) и после сортировки получит \(\{1, 2, 3, 4, 5\}\). Середина этого массива находится на позиции 3, а искомое число \(a_1=5\) — на позиции 5. Таким образом, \(c_{1,1,5}=2\). Нетрудно заметить, что это число — максимальное среди всех подотрезков, содержащих позицию 1, а значит, \(b_1=2\).

  2. \(b_2=c_{2,2,4}\).

  3. \(b_3=c_{3,3,5}\).

  4. \(b_4=c_{4,1,4}\). Действительно, если выписать числа на подотрезке \([1,4]\), то получится массив \(\{5,4,3,2\}\), который после сортировки превратится в \(\{2,3,4,5\}\). Середина этого массива находится на позиции \(3\), а искомый элемент \(a_4=2\) — на позиции 1. Таким образом, \(c_{4,1,4}=2\).

  5. \(b_5=c_{5,1,5}\).

 

Викторина

Бинарный поиск по ответу Префиксные суммы(минимумы, ...) реализация

Правила новой телевизионной викторины следующие. В ряд расположены \(n\) ячеек, пронумерованных от \(1\) до \(n\), в \(i\)-й ячейке находится \(a_i\) монет.

Игрок может выбрать целое число \(b\) и заплатить \(b\) монет. Тогда ведущий забирает монеты из всех ячеек, где лежит не более \(b\) монет, соответствующие ячейки становятся пустыми. После этого среди любых \(k\) подряд идущих ячеек должно быть не менее \(m\) пустых. После этого игрок забирает все оставшиеся на поле монеты, если он забрал \(a\) монет, его выигрыш составит \(a-b\) монет.

Помогите игроку понять, какое максимальный выигрыш он может гарантировать.

Формат входных данных
На первой строке ввода находятся целые числа \(n\), \(k\) и \(m\) (\(1 \le m < k \le n \le 200\,000\)).

На второй строке находятся \(n\) целых чисел \(a_i\) (\(1 \le a_i \le 10^9\)).

Формат выходных данных
Выведите одно число: какой максимальной выигрыш может гарантировать себе игрок.

Примечание
В первом примере игрок выбирет \(b = 5\). После удаления монет из ячеек, в которых лежит не более чем по \(5\) монет, количество монет в ячейках оказывается равно \([0, 7, 0, 0, 0, 9, 0, 6]\), суммарно он забирает из ячеек \(22\) монеты, с учетом ранее отданных \(5\) монет выигрыш игрока составляет \(17\) монет.

Во втором примере, чтобы добиться, чтобы среди любых двух подряд идущих ячеек была хотя бы одна пустая, игроку приходится выбрать \(b = 2\). После этого монет в ячейках нет, и выигрыш игрока оказывается отрицательным: \(-2\).

Соседние цвета

реализация Алгоритмы обработки

Этнограф изучает народ крайнего севера. Его заинтересовала структура бусов, которые составляются из бусин трех цветов: синего, зеленого и красного. Этнографу кажется, что частота, с которой определенные цвета встречаются у соседних бусин, позволяет сделать выводы о культуре народа.

Бусы можно задать в виде строки из заглавных английских букв: <<R>> для красной бусины, <<G>> для зеленой бусины и <<B>> для синей бусины. Соседние буквы в строке соответствуют соседним бусинам. Бусы находятся на круглой нитке, поэтому первая и последняя бусины также являются соседними.

Например, в ожерелье <<RGRGRGRG>> 8 раз рядом встречаются зеленая и красная бусины, а в ожерелье <<RRRR>> 4 раза рядом встречаются две красные бусины.

Помогите этнографу по образцам бусов выяснить, какая пара цветов встречается рядом чаще всего. Порядок цветов в паре не имеет значения.

Формат входных данных
На первой строке ввода находится чиcло \(n\) — количество бус в распоряжении этнографа (\(1 \le n \le 100\)).

На каждой из следующих строк находится строка из букв <<R>>, <<G>> и <<B>>. Длина каждой строки не меньше \(3\) и не больше \(1000\).

Формат выходных данных
Выведите одну или более строк по два символа: бусины каких двух цветов наибольшее число раз встречаются рядом. Если несколько пар бусин встречаются рядом одинаково часто, необходимо вывести все такие пары, по одной на строке, в любом порядке. Цвета в паре можно выводить в любом порядке.

Нетривиальные разложения

дп теория чисел реализация

Рома, Саша и Алиса решили модернизировать знаменитый алгоритм шифрования RSA. Они считают, что ограничение на модуль \(n\), используемый в RSA, должно быть произведением двух различных простых чисел, избыточно. Вместо этого они планируют использовать \(n\), которое представляет собой произведение степеней \(k\) двух различных простых чисел: \(n = p^kq^k\).

Будем называть нетривиальным разложение числа \(n\) на множители, такое, что множителей хотя бы два, и каждый из них строго больше \(1\). Оказалось, что в случае \(n = p^kq^k\) у числа \(n\) может быть несколько различных нетривиальных разложений на множители. Например, \(100 = 2^2 5^2\) имеет восемь нетривиальных разложений: \(100 = 2\cdot 50\), \(100 = 2\cdot2\cdot25\), \(100 = 2\cdot2\cdot5\cdot5\), \(100=2\cdot5\cdot10\), \(100 = 4\cdot25\), \(100=4\cdot5\cdot5\), \(100=5\cdot20\) и \(100=10\cdot10\).

Теперь ребята задаются вопросом: пусть \(n = p^kq^k\), сколько существует различных нетривиальных разложений \(n\) на множители?

Формат входных данных
На вход подается одно целое число \(n\) (\(6 \le n \le 10^{18}\), гарантируется, что \(n=p^kq^k\) для двух различных \(p\) и \(q\) для целого \(k > 0\)).

Формат выходных данных
Выведите одно число "— количество нетривиальных разложений \(n\) на множители.

Веревочки

Задачи на моделирование реализация

У Кати есть веревочка длиной \(n\) сантиметров.

Катя \(k\) раз выполняет следующую операцию: выбирает самую длинную веревочку из тех, что у неё есть, и разрезает ее на две веревочки. Катя каждый раз разрезает веревочку на две веревочки примерно равной длины, длина каждой из получившихся веревочек измеряется целым числом сантиметров. А именно: если длина веревочки, которую разрезает Катя, четная и равна \(2u\), то после разрезания получается две веревочки длины \(u\), а если она нечетная и равна \(2v+1\), то после разрезания получаются веревочки длиной \(v\) и \(v+1\).

Когда Катя закончила разрезать веревочку, она разложила получившиеся веревочки в порядке невозрастания длины и хочет ответить на \(q\) запросов: какая длина \(t_i\)-й веревочки в получившемся порядке.

Например, пусть \(n=100\) и \(k=5\). Тогда у Кати последовательно есть наборы веревочек следующей длины: \([100]\), \([50, 50]\), \([50, 25, 25]\), \([25, 25, 25, 25]\), \([25, 25, 25, 13, 12]\), \([25, 25, 13, 13, 12, 12]\).

Формат входных данных
На первой строке ввода дано целое число \(n\) (\(2 \le n \le 10^{18}\)).

На второй строке дано целое число \(k\) (\(1 \le k \le n-1\)).

На третьей строке дано целое число \(q\) (\(1 \le q \le k + 1\), \(1 \le q \le 5000\)).

На четвертой строке даны \(q\) целых чисел \(t_1, t_2, \ldots, t_q\) (\(1 \le t_1 < t_2 < \ldots < t_q \le k + 1\)).

Формат выходных данных
Выведите \(q\) чисел, \(i\)-е из выведенных чисел должно быть равно длине \(t_i\)-й по невозрастанию длине веревочки, которая в итоге есть у Кати.

50111

кратчайшие пути реализация

В реальных компьютерных сетях также используется понятие максимальной единицы передачи (MTU, maximum transmission unit) - размер блока данных, который может быть передан на отрезке сети между двумя устройствами. Этот размер зависит от ограничений используемой технологии
передачи данных на нижнем уровне.
В данной задаче требуется составить оптимальный план передачи пакетов с учётом MTU между разными маршрутизаторами и вычислить минимальное время передачи на его основе.
Нужно иметь в виду, что окно передачи работает по "скользящему" принципу, то есть после получения подтверждения доставки первых байтов окна оно сдвигается вправо на размер доставленной информации.

Входные данные
В первой строке записано натуральное число N, не превышающее 100 - количество маршрутизаторов. Далее записано N таблиц маршрутизации в следующем формате: в первой строке число N1 - количество маршрутов в таблице, далее N1 строк, где через пробел указаны адрес сети, маска (целое число от 1 до 32), номер маршрутизатора, куда будет отправлен пакет (номера считаются с 1 по порядку описания), время передачи до следующего маршрутизатора в миллисекундах и MTU в байтах.
После описания таблиц маршрутизации в следующей строке записаны через пробел адрес узла-отправителя, номер маршрутизатора, к которому он подключён, адрес узла-получателя, номер маршрутизатора, к которому подключён получатель, и объём данных (в байтах), который требуется передать.

Выходные данные
Минимальное время передачи в миллисекундах.
Примечание: считать, что между получением каждого пакета и отправкой подтверждения с конечного устройства всегда проходит 1 мс.
Примечание 2: считать, если объём данных, который требуется отправить с одного маршрутизатора на другой, превышает MTU, то данные делятся на пакеты, равные максимальной единице передачи или меньше, и отправляются с задержкой в 1 мс.
В рамках данной задачи считать, что потери отсутствуют и все отправленные пакеты достигают получателя, а также что размер окна фиксированный и составляет 10240 байт. Также следует пренебречь временем передачи данных между конечными узлами и ближайшими
маршрутизаторами и размером пакета ACK (считать, что он меньше любого MTU).

Примеры
Входные данные Выходные данные
1 5
3
10.0.0.0 8 2 10 100
20.0.0.0 8 3 10 100
10.0.0.0 8 5 10 10240
1
10.0.0.0 8 4 10 100
1
30.0.0.0 8 4 10 100
1
40.0.0.0 8 1 10 100
1
10.0.0.0 8 4 20 10240
40.1.1.1 1 10.1.1.1 4 102400
410


Примечание
Если отправлять пакеты с 1-го маршрутизатора на 5-й, то время передачи каждых 10240 байт с учётом подтверждения займёт 41 мс. Если же отправлять с 1-го через 2-й, то 10240 байт окна передачи будут делиться на 103 блока и суммарное время доставки для первого окна
увеличится до 133 мс, а для всего объёма данных - более 1000 мс.

50105

кратчайшие пути реализация

Для передачи пакетов в глобальной компьютерной сети используются специальные устройства - маршрутизаторы. Они подключены к нескольким линиям связи и на основе содержащихся в их памяти таблиц маршрутизации определяют, по какому из направлений передавать приходящие пакеты.
IPv4 - 4-я и первая, получившая широкое распространение, версия протокола IP (Internet Protocol).
Адреса в этой версии представляют собой 4 октета - блока по 8 бит. В человекочитаемом представлении адреса принято записывать в форме 4-х десятичных чисел от 0 до 255, разделённых точками.
Поскольку маршрутизатор имеет несколько интерфейсов (физических разъёмов, куда подключены кабели связи), в таблице маршрутизации задано соответствие каждого интерфейса той или иной сети. Сеть определяется парой из IP-адреса и битовой маски (в которой N старших бит заполнены единицами, а 32-N младших заполнены нулями). Для проверки того, можно ли маршрутизировать
пакет в какую-либо сеть, битовая маска применяется к адресу сети и адресу узла назначения из пакета с помощью побитового И. Если получившийся результат совпадает, то пакет можно отправить на соответствующий интерфейс.
Протокол управления передачей TCP (transmission control protocol) - протокол более высокого уровня по сравнению с IP, предназначенный для доставки данных в неизменном виде. Для решения этой задачи в нём применяется ряд принципов, один из которых - подтверждение
получения данных. Для подтверждения от получателя к отправителю направляется специальный пакет с признаком ACK, в котором указан диапазон полученных байтов.
При этом для исключения перегрузок сети при передаче больших объёмов данных применяются "окна" передачи. Окном называется максимальный объём данных, который может быть отправлен от отправителя получателю без подтверждения получения. По мере подтверждения получения данных окно смещается вправо и отправляются новые данные.

Входные данные
В первой строке записано натуральное число N, не превышающее 100 - количество маршрутизаторов. Далее записано N таблиц маршрутизации в следующем формате: в первой строке число N1 - количество маршрутов в таблице, далее N1 строк, где через пробел
указаны адрес сети, маска (целое число от 1 до 32), номер маршрутизатора, куда будет отправлен пакет (номера считаются с 1 по порядку описания), и время передачи до следующего маршрутизатора в миллисекундах.
После описания таблиц маршрутизации в следующей строке записаны через пробел адрес узла-отправителя, номер маршрутизатора, к которому он подключён, адрес узла-получателя, номер маршрутизатора, к которому подключён получатель, и объём данных (в байтах), который требуется передать.

Выходные данные
Минимальное время передачи в миллисекундах.
Примечание: считать, что между получением каждого пакета и отправкой подтверждения с конечного устройства всегда проходит 1 мс.
В рамках данной задачи считать, что потери отсутствуют и все отправленные пакеты достигают получателя, а также что размер окна фиксированный и составляет 10240 байт. Также следует пренебречь временем передачи данных между конечными узлами и ближайшими
маршрутизаторами.

Примечание
102400 = 10240*10, значит, для передачи данных потребуется 10 итераций (сдвигов окна передачи). Каждые 10 Кбайт будут проходить следующую цепочку: отправка с первого маршрутизатора на второй - 10мс, затем со 2-го на 4-й ещё 10 мс, затем 1 мс задержки на
отправку подтверждения и сама передача подтверждения напрямую с 4-го маршрутизатора на 1-й - ещё 10 мс. Таким образом, на передачу каждых 10 Кбайт будет уходить 31 мс.
 

Устный счет

реализация Вывод формулы

Отвлечемся от задач про программистов и перенесемся в совершенно обыкновенные ясли, где мальчик Вова (3 годика) практикуется в устном счете, а если точнее — в вычислении арифметических выражений по модулю \(10^9 + 7\).

Совсем недавно Вова придумал длинное и очень красивое арифметическое выражение. Выражение состяло из \(n\) целых неотрицательных чисел, меньших \(10^9 + 7\), и знаков сложения и умножения между ними. Первым же делом он вычислил это выражение по модулю \(10^9 + 7\), после чего выписал само выражение и результат на лист бумаги. Все числа он выписал без ведущих нулей.

Пока шел тихий час, Вова спал, а хулиганы стерли несколько цифр в выражении и заменили их на другие. Менять знаки или результат вычисления выражения хулиганы не решились, даже для них это слишком низко. Когда Вова проснулся, он обнаружил рядом с его листочком ластик и карандаш. У Вовы есть принципы — если хулиганы изменили не более двух цифр, то он их простит, иначе они будут наказаны по всей строгости ясельных законов.

К сожалению, чтобы понять, сколько цифр изменили хулиганы, Вове явно понадобится ваша помощь. Определите, могло ли данное выражение быть получено из верного равенства заменой не более двух цифр, и если да, то в каких числах и какие цифры были изменены.

Формат входных данных
Единственная строка входного файла содержит выражение, которое обнаружил Вова у себя на листке. Выражение состоит из двух частей, разеделенных знаком ‘=’.

Первая часть содержит \(n\) целых неотрицательных чисел, разделенных знаками сложения (‘+’) и умножения (‘*’) (\(1 \le n \le 10^5\)). Вторая часть — целое неотрицательное число, означающее результат вычисления выражения.

Числа и все знаки разделяются одним пробелом. Гарантируется, что все числа строго меньше \(10^9 + 7\) и записаны без ведущих нулей.

Формат выходных данных
В случае, если данное выражение не может быть получено из верного равенства заменой не более двух цифр, выведите <<NO>>.

В противном случае в первой строке выведите <<YES>>. На следующей строке выведите целое число \(k \leq 2\) — количество чисел, которые были изменены.

В следующих \(k\) строках выведите по два числа — позицию измененнного числа в выражении (от \(1\) до \(n\)) и его исходное значение.

Суммарно должно быть изменено не более двух цифр. В процессе замены в числах не должны появиться ведущие нули и числа должны остаться меньше \(10^9 + 7\). Если существует несколько вариантов ответа, выведите любой из них.

 

Быстрый исполнитель

Задачи на моделирование реализация

Студент первого курса ИТМО Миша изучает новый примитивный язык программирования. В этом языке все операции производятся над массивами целых неотрицательных чисел длины \(n\).

Миша успел создать массив \(a\) и равный ему массив \(b\). Также он успел реализовать четыре функции:

  1. shift — делает циклический сдвиг массива \(a\) влево на \(d\), то есть при \(a = [a_0, a_1, \ldots, a_{n-1}]\) выполняет присваивание \[a \gets [a_d, \ldots, a_{n-1}, a_0, \ldots, a_{d-1}] \text{;}\]

  2. xor — присваивает в массив \(b\) его поэлементный xor (побитовое исключающее <<или>>) с массивом \(a\), то есть \[b \gets [a_0 \oplus b_0, a_1 \oplus b_1, \ldots, a_{n-1} \oplus b_{n-1}] \text{;}\]

  3. and — присваивает в массив \(b\) его поэлементный and (побитовое <<и>>) с массивом \(a\);

  4. or — присваивает в массив \(b\) его поэлементный or (побитовое <<или>>) с массивом \(a\).

Используя эти функции, Миша написал программу, задаваемую последовательностью операций xor, and и or длины \(m\). Программа в цикле \(p\) раз выполняет следующие действия: для каждой операции из последовательности сначала вызывается shift, а затем соответствующая этой операции функция. Так, для последовательности операций \([\mathtt{or}, \mathtt{xor}, \mathtt{and}]\) и \(p = 5\) программа будет выглядеть как

b = a = [...]
repeat 5 times {
    shift
    or
    shift
    xor
    shift
    and
}

К сожалению, язык еще новый, и его интерпретатор не справляется с выполнением такой программы. Помогите Мише определить, чему будет равно конечное состояние массива \(b\) после выполнения заданной программы.

Формат входных данных
В первой строке ввода перечислены четыре целых числа \(n\), \(m\), \(d\) и \(p\) — длина массива, количество операций в последовательности, величина сдвига и количество повторений (\(0 \le d < n \le 2 \cdot 10^5\); \(1 \le m \le 10\); \(1 \le p \le 10^9\)).

Во второй строке перечислены \(n\) целых чисел \(a_i\) — элементы массива \(a\), они же — изначальные значения элементов массива \(b\) (\(0 \le a_i \le 10^9\)).

В третьей строке через пробел перечисены \(m\) слов, каждое из которых равно <<xor>>, <<and>> или <<or>> — последовательность применяемых на каждой итерации цикла операций.

Формат выходных данных
Выведите \(n\) целых чисел — элементы массива \(b\) после выполнения описанной программы.

Трансформация массива

реализация жадные алгоритмы

Вам дано \(t\) пар массивов \(a_i\) и \(b_i\) равной длины.

За одну операцию модификации можно:

  • Поменять местами любые два элемента массива \(a_i\), но каждый элемент массива может участвовать не более чем в одном обмене.

  • Вычесть из любого элемента массива \(a_i\) единицу. Данную операцию можно применять неограниченное число раз к любому элементу массива.

Для каждой пары массивов найдите минимальное число операций, которые необходимо применить к массиву \(a_i\), чтобы получить массив \(b_i\), или определите, что это невозможно.

Входные данные
В первой строке дано число \(t\) — число пар массивов (\(1 \le t \le 40\)).

В следующих \(3t\) строках содержатся описания пар массивов. Каждая пара описывается тремя строками.

В первой из них дано число \(n_i\) — количество элементов в каждом массиве \(i\)-й пары(\(1 \le n_i \le 10\)). Во второй строке заданы \(n_i\) чисел \(a_{i,j}\) — элементы массива \(a_i\) (\(1 \le a_{i,j} \le 1000\)). В третьей строке заданы \(n_i\) чисел \(b_{i,j}\) — элементы массива \(b_i\) (\(1 \le b_{i,j} \le 1000\)).

Гарантируется, что сумма \(n_i\) по всем тестовым наборам не превосходит \(150\).

Выходные данные
Для каждого пары массивов выведите одно число — минимальное число операций, которые необходимо применить к массиву \(a_i\), чтобы получить массив \(b_i\), или \(-1\), если для данной пары это невозможно.

 

Разделяй и властвуй

разделяй и властвуй реализация

В тридесятом государстве ради сбора мытных денег (таможенных пошлин) с торговых людей царь Салтан указал сделать зáсеки – заградительный полосы, которые тянутся с севера на юг или с запада на восток и преграждают путь всякому пешему и конному.

Тридесятое государство имеет форму прямоугольника, стороны которого тянутся с запада на восток и с севера на юг. Картограф изобразил карту государства в виде прямоугольника на системе координат с центром O, совпадающим с юго-западным углом страны и осями, параллельными осям координат. Засеки на карте изображены в виде отрезков различной длины, параллельных осям координат. При этом оказалось, что никакие два отрезка не пересекаются и не лежат на одной прямой.


Для удобства управления своей страной царь Салтан повелел разделить ее на непересекающиеся прямоугольные области с соблюдением следующих условий: 

1)    каждая засека входит полностью в границы областей
2)    число областей должно быть наименьшим, дабы уменьшить расходы на приказный люд.

Напишите программу, помогающую картографическому приказу построить искомое разбиение.

Входные данные
В первой строке находятся координаты северо-восточного угла страны, Во второй строке указано количество засек N (N≤1000). Каждая из следующих N строк содержит описание одной из засек в виде четверки числе x1, y1, x2, y2, что соответствует отрезку с концевыми точками (x1, y1)  и (x2, y2). Все координаты являются неотрицательными целыми и не превосходят 10000.

Выходные данные
В первую строку  выведите количество областей M в найденном разбиении. В последующих M строках должны находиться целочисленные координаты юго-западного и северо-восточного углов для каждой из областей разбиения. Числа внутри строки разделять пробелами.
 

ХЕШ-ФУНКЦИЯ

Хеш реализация

Для быстрого распознавания идентификаторов в современных трансляторах  используются хеш-функции. Хеш-функция сопоставляет строке целое число из некоторого промежутка. Критерием оценки хеш-функции является количество коллизий, то есть ситуаций, когда различным встретившимся строкам сопоставляется одно и то же число.

Вы должны построить хеш-функцию для заданного множества слов русского языка и реализовать ее в программе, которая будет вычислять хеш-значения из интервала от 1 до 255 для всех слов из входного файла. Ваша функция будет оцениваться в зависимости от максимального количества слов, хеш-значения которых оказались одинаковыми: чем это количество меньше, тем лучше функция.

На время тура вам предоставляется файл words.txt, содержащий перечисленные в алфавитном порядке 10 000 слов. Слова из этого файла будут использоваться при тестировании вашего решения. Это означает, что во всех тестах слова будут выбираться только из этого множества. Во время тестирования файл words.txt будет вашей программе недоступен.

Для одного и того же слова хеш-значение, формируемое вашей программой, должно быть одинаковым для всех тесто. В противном случае задача считается нерешенной.



Входные данные
Входные данные содержат список неповторяющихся слов по одному в строке, выбранных. Регистр букв в словах будет тем же, что и в файле words.txt.

Выходные данные
Для каждого слова из заданного списка требуется вывести соответствующее хеш-значение. Числа должны быть записаны по одному в строке.
 

Ханойская фабрика

Жадный алгоритм Использование сортировки реализация

Наверняка вы слышали об известной задаче про Ханойские башни, но мало кто знает, что существует целая фабрика, производящая кольца для этой замечательной игры. Однажды на эту фабрику пришел срочный заказ от властителя Египта — Солнцеликого. Солнцеликий требует немедленно прислать ему для игры как можно более высокую башню. Работники фабрики не были готовы к такому необычному заказу, поэтому им придётся собрать какую-то башню из уже произведённых колец.

На складах фабрики находятся \(n\) колец, \(i\)-е кольцо имеет внутренний радиус \(a_i\), внешний радиус \(b_i\) и высоту \(h_i\). Требуется выбрать некоторые из этих колец и упорядочить их таким образом, чтобы выполнялись следующие условия:

  • Внешние радиусы колец образовывали невозрастающую последовательность, то есть кольцо \(j\) можно поставить на кольцо \(i\) только если \(b_j \leq b_i\).

  • Кольца не должны проваливаться друг в друга, то есть кольцо \(j\) можно поставить на кольцо \(i\) только если \(b_j > a_i\).

  • Суммарная высота всех использованных колец должна быть максимальна.

Формат входных данных
В первой строке входных данных записано целое число \(n\) (\(1 \leq n \leqslant 100\,000\)) — количество колец на складах фабрики.

В \(i\)-й из последующих \(n\) строк записаны три числа \(a_i\), \(b_i\) и \(h_i\) (\(1 \leq a_i, b_i, h_i \leq 10^9\), \(b_i > a_i\)) — внутренний радиус, внешний радиус и высота \(i\)-го кольца соответственно.

Формат выходных данных
Выведите максимальную высоту башни, которую смогут получить работники фабрики.


Замечание

В первом примере выгодно поставить друг на друга все имеющиеся кольца в порядке \(3\), \(2\), \(1\).

Во втором примере можно либо поставить кольцо \(3\) на кольцо \(4\) и получить башню высоты \(3\), либо поставить кольцо \(1\) на кольцо \(2\) и получить башню высоты \(4\).

В данной задаче 50 тестов, помимо тестов из условия, каждый из них оценивается в 2 балла. Результаты работы ваших решений на первых 30 тестах будут доступны во время соревнования. Результаты работы на остальных 20 будут доступны после окончания соревнования.

Решение, корректно работающие при \(1 \leq n \leq 9\), наберут не менее \(10\) баллов.

Решение, корректно работающие при \(1 \leq n \leq 15\), наберут не менее \(20\) баллов.

Решение, корректно работающие при \(1 \leq n \leq 1000\), наберут не менее \(60\) баллов.

Устранение массива - 2

реализация

Дан массив \(a\) длины \(n\). Каждый элемент массива — \(-1\), \(0\) или \(1\). Известно, что \(-1\) находятся только строго в правой половине массива, то есть на индесах от \(\left\lfloor\frac{n + 1}{2}\right\rfloor + 1\) до \(n\). Все оставшиеся элементы могут быть равны только \(0\) или \(1\).

С массивом разрешается выполнять следующие два вида действий:

  1. Заплатить две монеты и удалить из массива любое число \(a_i\). После такого действия массив \([a_1, a_2, \ldots, a_k]\) превращается в \([a_1, \ldots, a_{i-1}, a_{i+1}, \ldots, a_k]\).

  2. Заплатить одну монету и заменить два стоящих рядом числа \(a_i\) и \(a_{i+1}\) на \(a_{i+1} + 1\) копию числа \(a_i\). То есть, возможны следующие преобразования:

Иными словами, \(-1\) можно удалить вместе с предыдущим числом, \(0\) можно удалить сам по себе, если он стоит не в начале массива, а \(1\) можно заменить на предшествующее ей число.

Определите, какое минимальное число монет требуется заплатить, чтобы превратить данный массив в пустой. Обратите внимание, что ответ всегда существует, потому что можно просто \(n\) раз применить первую операцию.

Формат входных данных
В первой строке дано единственное целое число \(T\) — количество наборов входных данных (\(1 \le T \le 100\)). Далее следуют \(T\) наборов входных данных.

Каждый набор входных данных начинается со строки, содержащей единственное число \(n\) — изначальную длину массива. В следующей строке через пробел перечислены целые числа \(a_1\), …, \(a_n\) — элементы массива (\(-1 \le a_i \le 1\)).

Гарантируется, что сумма длин массивов по всем наборам входных данных не превосходит \(10^6\).

Формат выходных данных
Выведите \(T\) целых чисел, каждое в своей строке — ответы на задачу для каждого набора входных данных в том порядке, в котором оны даны во вводе.

 

Тестирование мессенджера

реализация Хеш Сортировка событий

Перед выпуском VK Messenger’а разработчики из компании IT-компании <<VK>>, как и положено, убеждаются в корректности работы приложения. Проверкой корректности работы систем занимаются тестировщики и QA-инженеры.

Часть функциональных тестов для тестирования смены ников выглядит следующим образом:

  1. генерируется случайный сценарий взаимодействия пользователей с приложением;

  2. в приложении симулируется выполнение этого сценария;

  3. проверяется корректность итогового состояния приложения.

Вам предлагается почувствовать себя в роли тестировщика и реализовать решение, обрабатывающее сценарий без взаимодействия с приложением. Результат обработки сценария затем будет сравниваться с итоговым состоянием приложения.

Каждый сценарий состоит из трех наборов событий.

  1. Первый набор состоит из событий вида <<в момент времени \(t_i\) поступил запрос регистрации нового пользователя с ID \(\mathtt{id}_i\) и ником \(\mathtt{handle}_i\)>>.

    Гарантируется, что ID уникальны для всех пользователей приложения. Если выбранный ник никем не занят, регистрация проходит успешно, иначе запрос на регистрацию отклоняется. Во втором случае пользователь с тем же ID может попробовать зарегистрироваться еще раз.

  2. Второй набор описывает события вида <<в момент времени \(t_i\) пользователь с ником \(\mathtt{handle}_{i,1}\) отправляет запрос на смену ника на \(\mathtt{handle}_{i,2}\)>>.

    Гарантируется, что для каждого такого запроса ник \(\mathtt{handle}_{i,1}\) кому-то принадлежит. Если \(\mathtt{handle}_{i,2}\) уже занят каким-либо пользователем, запрос отклоняется, иначе пользователь успешно меняет ник. При успешной смене ника старый ник перестает ассоциироваться с каким-либо пользователем, пока кто-то снова его не займет.

  3. Третий набор описывает события вида <<в момент времени \(t_i\) пользователь с ником \(\mathtt{handle}_{i,1}\) отправляет сообщение пользователю с ником \(\mathtt{handle}_{i,2}\).

    Гарантируется, что и \(\mathtt{handle}_{i,1}\) и \(\mathtt{handle}_{i,2}\) на момент времени \(t_i\) соответствуют каким-то зарегистрированным пользователям.

Также гарантируется, что никакие два события не происоходят в одно и то же время, то есть все \(t_i\) уникальны.

Вам даны описания всех трех наборов событий. Определите для каждого пользователя, сколько он всего отправил сообщений, и какому пользователю он отправил больше всего сообщений за весь сценарий.

Формат входных данных

В первой строке ввода дано единственное целое число \(T\) — количество сценариев, которое вам необходимо обработать (\(1 \le T \le 100\)).

Далее следуют \(T\) описаний сценариев. Описание каждого сценария начинается с пустой строки, после чего следуют три набора событий. В первой строке описания \(q\)-го набора (\(q\) от \(1\) до \(3\)) дано единственное целое число \(n_q\) — количество событий в наборе, после чего следуют \(n_q\) строк в указанном ниже формате (\(1 \le n_1 + n_2 + n_3 \le 1000\); \(0 \le n_q\)).

  1. События первого набора задаются в формате <<\(t_i\): REG \(\mathtt{id}_i\) \(\mathtt{handle}_i\)>>.

  2. События второго набора задаются в формате <<\(t_i\): CHANGE \(\mathtt{handle}_{i,1}\) \(\mathtt{handle}_{i,2}\)>>.

  3. События третьего набора задаются в формате <<\(t_i\): SEND \(\mathtt{handle}_{i,1}\) \(\mathtt{handle}_{i,2}\)>>.

Моменты событий \(t_i\) — целые числа от \(1\) до \(10^9\). Также все \(\mathtt{id}_i\) — целые числа от \(1\) до \(10^9\), а \(\mathtt{handle}_i\) — строки из маленьких латинских букв длины не более \(10\).

Гарантируется, что в каждом наборе входных данных все \(t_i\) различны. Гарантируется, что успешно зарегистрированный пользователь не предпринимает попытки зарегистрироваться еще раз.

Формат выходных данных
Для каждого сценария выведите требуемую статистику для каждого пользователя.

В первой строке статистики выведите целое число \(q\) — количество зарегистрированных пользователей. В следующих \(q\) строках выведите статистику для каждого пользователя в порядке возрастания их ID в формате <<<\(\mathtt{id}\)> SENT <\(\mathtt{total}\)> TOP <\(\mathtt{count}_\mathrm{top}\)> TO <\(\mathtt{id}_\mathrm{top}\)>>>, где \(\mathrm{total}\) — суммарное количество отправленных пользователем сообщений, \(\mathtt{id}_\mathrm{top}\) — ID пользователя, получившего от него больше всего сообщений, а \(\mathtt{count}_\mathrm{top}\) — само количество сообщений, отправленных пользователю \(\mathtt{id}_\mathrm{top}\).

Если у некоторого пользователя есть несколько собеседников, получивших от него максимальное число сообщений, выведите в качестве \(\mathtt{id}_\mathrm{top}\) минимальный из их ID. Если пользователь не отправлял сообщения, считайте \(\mathtt{count}_\mathrm{top}\) равным \(0\).

 

Устранение массива

реализация Задачи на моделирование

Дан массив \(a\) длины \(n\). Каждый элемент массива — \(0\), \(1\) или \(2\). Известно, что нули находятся только строго в левой половине массива, то есть на индесах от \(1\) до \(\left\lfloor\frac{n}{2}\right\rfloor\). Все оставшиеся элементы могут быть равны только \(1\) или \(2\).

С массивом разрешается выполнять следующие два вида действий:

  1. Заплатить две монеты и удалить из массива любое число \(a_i\). После такого действия массив \([a_1, a_2, \ldots, a_k]\) превращается в \([a_1, \ldots, a_{i-1}, a_{i+1}, \ldots, a_k]\).

  2. Заплатить одну монету и заменить два стоящих рядом числа \(a_i\) и \(a_{i+1}\) на \(a_i\) копий числа \(a_{i+1}\). То есть, возможны следующие преобразования:

Иными словами, \(0\) можно удалить вместе со следующим числом, \(1\) можно удалить саму по себе, если она стоит не в конце массива, а \(2\) можно заменить на следующее за ней число.

Определите, какое минимальное число монет требуется заплатить, чтобы превратить данный массив в пустой. Обратите внимание, что ответ всегда существует, потому что можно просто \(n\) раз применить первую операцию.

Формат входных данных
В первой строке дано единственное целое число \(T\) — количество наборов входных данных (\(1 \le T \le 100\)). Далее следуют \(T\) наборов входных данных.

Каждый набор входных данных начинается со строки, содержащей единственное число \(n\) — изначальную длину массива. В следующей строке через пробел перечислены целые числа \(a_1\), …, \(a_n\) — элементы массива (\(0 \le a_i \le 2\)).

Гарантируется, что сумма длин массивов по всем наборам входных данных не превосходит \(10^6\).

Формат выходных данных
Выведите \(T\) целых чисел, каждое в своей строке — ответы на задачу для каждого набора входных данных в том порядке, в котором оны даны во вводе.

 

Система контроля версий - 2

графы реализация

IT-компания <<VK>> имеет огромную инфраструктуру проектов, и чтобы разработчики могли гармонично работать вместе и структурировать вносимые в код изменения, им необходима система контроля версий (VCS).

Полноценные системы контроля версий устроены достаточно сложно, и некоторые компании даже разрабатывают свои собственные VCS, заточенные под конкретные нужды или особенности рабочего процесса. Разумеется, разработчики из <<VK>> могут справиться с задачей реализовать свою VCS, но сегодня эта задача предлагается вам.

Ваша примитивная система контроля версий должна иметь вид дерева изменений состояния проекта.

  • Корень дерева — стартовая вершина, соответствующая изначальному состоянию проекта. Это единственная вершина, в которую не входят ребра.

  • Каждая вершина, кроме корня, соответствует определенному коммиту. Коммит — блок из одного или более изменений.

  • Версия проекта, задаваемая вершиной — набор всех изменений на путях между стартовой вершиной и данной.

  • Есть несколько выделенных веток, каждая имеет уникальное имя и задается указателем на определенную вершину дерева. С веткой ассоциируется версия проекта, соответствующая вершине, на которую она указывает.

  • Из всех веток выделяется текущая ветка — версия проекта, с которой сейчас работает пользователь. Вершину, на которую указывает текущая ветка, будем обозначать как HEAD.

Пример дерева можно видеть ниже. Рядом с каждым коммитом указаны соответствующие ему изменения. Вершины номер \(8\) и \(9\) появляются после команды rebase между ветками <<main>> и <<new_config>> (описание команд см. ниже). Набор команд, позволяющий получить приведенную структуру графа версий, приведен в первом тесте. Пошаговые иллюстрации изменения графа версий можно видеть в прикрепленном к условию архиве.

Изначально дерево состоит из единственной вершины с номером \(1\), на которую указывает текущая ветка <<main>>. Требуется поддерживать следующие команды:

  1. <<add <файл> <хеш изменений>>> — запомнить изменения, внесенные в данный файл. Хеш однозначно описывает набор изменений в файле. Иными словами, хеши двух независимых изменений совпадают тогда и только тогда, когда в файл были внесены одинаковые изменения.

    Иными словами, если в пустой файл добавляется строчка <<print(something)>>, и в непустой файл добавляется та же строчка, хеши этих двух изменений будут различными.

  2. <<commit>> — подвесить к HEAD новую вершину, состоящую из всех изменений (add), сделанных с момента предыдущего успешного коммита. Новой вершине присваивается первый неиспользованный натуральный номер, после чего HEAD перемещается на нее.

    Операция возможна только тогда, когда множество сделанных изменений непустое. В противном случае требуется выдать ошибку <<FAILURE: no changes>>, при этом новая вершина не создается.

  3. <<reset <номер>>> — переместить HEAD на вершину с данным номером.

    Гарантируется, что вершина с данным номером существует. Если присутствуют несохраненные (commit) изменения (add), операция отклоняется с ошибкой <<FAILURE: uncommitted changes>>.

  4. <<checkout <имя ветки>>> — поменять текущую ветку на ветку с указанным именем (и, соответственно, переместить HEAD на версию, соответствующую выбранной ветке). Если ветки с таким именем не существует, создать новую ветку с таким именем, которая будет указывать на HEAD, после чего сделать ее текущей.

    Если присутствуют несохраненные изменения, операция отклоняется с ошибкой <<FAILURE: uncommitted changes>>, аналолгично операции reset.

  5. <<rebase <имя ветки>>> — перенести изменения из ветки с указанным именем в текущую ветку. При этом находится ближайший общий предок двух веток и все коммиты в укзанной ветке после общего предка (то есть все вершины, которых нет в текущей ветке) копируются и вставляются в текущую ветку после HEAD в исходном порядке. HEAD при этом перемещается на последнюю из скопированных вершин, а указатель второй ветки не двигается. Гарантируется, что имя второй ветки не совпадает с текущей.

    Если есть незакоммиченные изменения, операция отклоняется с ошибкой <<FAILURE: uncommitted changes>>.

    Если несохраненных изменений нет, проверяется отсутствие конфликтов при объединении. Конфликтом считается ситуация, когда в состояниях проекта, соответствующим данным веткам, с одним и тем же файлом сделаны различные изменения. Иными словами, если обозначить множество изменений определенного файла в текущей ветке как \(D_1\), а во второй — как \(D_2\), то конфликт возникает, когда оба множества \(D_1 \setminus D_2\) и \(D_2 \setminus D_1\) непустые. В таком случае операция отклоняется с ошибкой <<FAILURE: conflicts detected>>.

    Обратите внимание, что множества коммитов в двух версиях сравниваются как математические множества. Стоит считать, что ситуаций, когда в разных ветках одни и те же изменения одного файла располагаются в разном порядке, не существует.

    Если какое-то изменение содержится в версиях разное ненулевое количество раз (например, изменение может присутствовать дважды после rebase двух веток, в которые оно входило), конфликт не возникает. Конфликт возникает только если в каждой версии есть измененение одного и того же файла, которого нет в другой версии.

    Ниже можно найти иллюстрации к успешным и конфликтным вызовам операции rebase.

    image image

Вам дается последовательность команд, которые требуется обработать. Для каждой команды выведите через пробел слово <<SUCCESS>> и номер вершины, на которую указывает HEAD, если команда выполнена успешно, или же соответствующую ошибку, если команда отклонена.

Формат входных данных
В первой строке дано единственное целое число \(T\) — количество наборов входных данных, которые вам предстоит обработать (\(1 \le T \le 20\)). Далее следуют описания наборов входных данных.

Каждый набор входных данных начинается со строки, содержащей единственное целое число \(n\) — количество команд в наборе (\(0 \le n \le 400\)). В \(i\)-й из следующих \(n\) строк задается \(i\)-я команда.

Гарантируется, что имена веток состоят только из маленьких латинских букв (‘a’ – ‘z’) и нижних подчеркиваний (‘_’), а хеши изменений — уникальные шестнадцатеричные строки длины ровно \(6\) (состоят из цифр и маленьких латинских букв от ‘a’ до ‘f’). Имена файлов в команде add состоят из маленьких латинских букв, точек и слешей (‘/’).

Также гарантируется, что команде reset всегда передается существующая вершина, а команде merge — существующая ветка, не совпадающая с текущей.

Формат выходных данных
Для каждого набора входных данных в порядке их следования во вводе сначала выведите строку <<Test case <номер>>> (наборы нумеруются от \(1\) до \(T\)), а затем \(n\) результатов выполнения команд, каждый в своей строке.

Результат выполнения каждой команды должен соответствовать либо формату <<SUCCESS <HEAD>>>, либо формату <<FAILURE: <сообщение об ошибке>>>.

 

Пустая строка в выводе в примере добавлена специально, чтобы результаты выполнения команд находились ровно напротив команд, которым они соответствуют. Ваше решение не должно выводить пустую первую строку.

Генераторы квадратов

Перебор Вывод формулы реализация

Множество \(A = \{a_1, a_2, \ldots, a_k\}\) различных натуральных чисел с суммой \(a_1+a_2+\ldots+a_k=n\) называется генератором квадратов, если сумма любых \(k-1\) элементов этого множества является полным квадратом целого числа.

Например, множество \(\{1, 22, 41, 58\}\) является генератором квадратов, так как \(1 + 22 + 41 = 64 = 8^2\), \(1 + 22 + 58 = 81 = 9^2\), \(1 + 41 + 58 = 100 = 10^2\), \(22 + 41 + 58 = 121 = 11^2\).

По заданным \(n\) и \(k\) постройте множество из \(k\) различных натуральных чисел с суммой \(n\), которое является генератором квадратов, либо выясните, что такого нет.

Формат входных данных
На ввод подаются два целых числа \(n\) и \(k\) (\(2 \le n \le 200\,000\), \(2 \le k \le 30\)).

Формат выходных данных
Если искомый генератор квадратов существует, выведите <<YES>> на первой строке, а на второй строке выведите \(k\) натуральных чисел "— искомое множество.

Если генератора квадратов с заданными параметрами не существует, выведите <<NO>>.

 

Следующий больший элемент

Стек реализация

Следующий больший элемент некоторого элемента x в массиве - это первый больший элемент, который находится справа от x в том же массиве.

Вам даны два различных целочисленных массива nums1 и nums2 с индексами 0, где nums1 является подмножеством nums2.

Для каждого 0 <= i < nums1.length найдите индекс j такой, что nums1[i] == nums2[j] и определите следующий больший элемент nums2[j] в nums2. Если следующего большего элемента нет, то ответом на этот запрос будет -1.

Выведите n чисел таких, что каждое из них будет являться следующим большим элементом, как описано выше.

Входные данные
В первой строке записано натуральное число n - размер массива nums1. Вторая строка содержит n чисел - элементы массива nums1. В третьей строке записано натуральное число m - размер массива nums2. Четвертая строка содержит m чисел - элементы массива nums2.

Ограничения на входные данные

  • 1 <= nums1.length <= nums2.length <= 50000
  • 0 <= nums1[i], nums2[i] <= 109
  • Все числа в массивах nums1 и nums2 уникальны.
  • Все числа массива nums1 содержатся в nums2.

a.length - размер массива a

Выходные данные
Выведите ответ на задачу.
 

Примеры
Входные данные Выходные данные
1
3
4 1 2
4
1 3 4 2
-1 3 -1
2
2
2 4 
4
1 2 3 4
3 -1

Максимальная ширина

Алгоритмы на строках реализация

У вашего одноклассника, которого вы не очень любите за его занудство, но уважаете за его ум, были обнаружены две строки: строка t длины m и строка s длины n. Последовательность индексов p1p2, ..., pm, где 1<=p1<p2<…<pm<=n, называется хорошей , если spi=ti для всех i от 1 до mШириной последовательности называется величина \(\max_{i = 1}^{m - 1} \left(p_{i + 1} - p_i\right)\), то есть максимальная разность между соседними элементами последовательности p.

Помогите однокласснику найти хорошую последовательность индексов с максимальной шириной. Одноклассник обещал вам, что строки s и t таковы, что хотя бы одна хорошая последовательность точно существует.

 

Входные данные

Первая строка входных данных содержит два числа n и (2<=m<=n<=200000) - длины строк s и t соответственно.

Во второй строке входных данных задана строка s, состоящая из строчных букв английского алфавита, а в третьей строке задана строка t, состоящая из строчных букв английского алфавита.

Гарантируется, что существует хотя бы одна хорошая последовательность индексов.

 

Выходные данные

Выведите одно число - максимальную ширину хорошей последовательности.

 

Примечание

В первом примере из условия существуют две хорошие последовательности с шириной 3: это {1,2,5} и {1,4,5}.

Во втором примере из условия хорошая последовательность максимальной ширины — это {1,5}.

В третьем примере из условия есть лишь одна хорошая последовательность — это {1,2,3,4,5}.

В четвёртом примере из условия есть лишь одна хорошая последовательность — это {1,2}.

 
Примеры
Входные данные Выходные данные
1
5 3
abbbc
abc
3
2
5 2
aaaaa
aa
4
3
5 5
abcdf
abcdf
1
4
2 2
ab
ab
1

2022 - 2

реализация

Эвелине на Новый год подарили массив a из n неотрицательных целых чисел, каждое из которых не превосходит 2022. Её заинтересовал вопрос, сколько в этом массиве существует различных четверок индексов (индексы внутри одной четверки могут совпадать) таких, что сумма соответствующих элементов массива равна 2022. Формально, она хочет понять, сколько существует четверок 1 <= i,j,k,<= n, для которых выполняется ai+aj+ak+ah=2022.

Уже наступил февраль, а Эвелина все еще не успела посчитать ответ на вопрос, потому что массив слишком большой. Но она смогла запомнить его и рассказала о своем массиве вам, чтобы получить помощь с поиском ответа.



Входные данные
В первой строке содержится одно целое число n (1 <= <= 100000) - количество элементов массива. Во второй строке заданы n целых чисел a1, a2, ..., an (0 <= a<= 2022) - элементы массива Эвелины.

Выходные данные
Так как ответ может быть слишком большим, вам необходимо вывести остаток от деления количества подходящих четверок на 1000000007 (109+7).

Примечание

В первом примере не существует четверок с суммой 2022.

Во втором подходят четверки (1,1,2,2), (1,2,1,2), (1,2,2,1), (2,1,1,2), (2, 1, 2, 1), (2,2,1,1).

В третьем примере подходят все 24 четверки попарно различных индексов. Например, (1,2,3,4) или (4,1,3,2).

 
Примеры
Входные данные Выходные данные
1
4
1 1 1 1
0
2
2
500 511
6
3
4
129 45 1000 848
24

Морской бой

Жадный алгоритм Задачи на моделирование реализация

В старом игровом автомате «Морской бой» игрок сбивает торпедами корабли, двигающиеся по игровому полю слева направо или справа налево.
В нашем варианте игры на поле может находиться одновременно несколько кораблей. Все корабли движутся с одинаковыми скоростями налево или направо. За одну секунду каждый корабль передвигается на единицу длины системы координат. Это означает, что через одну секунду после начала игры корабль, который находился в точке 20 и двигался направо, будет находиться в точке 21, а корабль, который находился в точке 30 и двигался налево, окажется в точке 29.
Вы можете выпускать торпеды, которые будут подбивать корабли. Торпеда, выпущенная в точке с какой-то координатой, уничтожает корабль, находящийся в этот момент в этой точке. При этом если в этой точке в этот момент времени окажется несколько кораблей, то торпеда подобьёт все эти корабли. Вы даже можете одновременно выпускать несколько торпед!
Подбейте все корабли, используя минимальное число торпед.

Входные данные
В первой строке содержится целое число N — количество кораблей, движущихся влево (с уменьшением координаты). Во второй строке содержится целое число M — количество кораблей, движущихся вправо (с увеличением координаты). Гарантируется, что 1 ≤ N + M ≤ 105, N > 0 и M > 0.
Следующие N строк содержат по одному целому числу li — начальные координаты кораблей,двигающихся влево. Следующие M строк содержат по одному целому числу ri — начальные координаты кораблей, двигающихся вправо. Координаты li идут в порядке возрастания, координаты ri также заданы в порядке возрастания. Гарантируется, что все начальные координаты li и ri чётные, различные и не превосходят по модулю 109.
Выходные данные
Программа должна вывести столько строк, сколько торпед необходимо для уничтожения всех кораблей, при этом i-я строка должна содержать два целых числа ti — время нанесения удара i-й торпедой и xi — координату удара i-й торпедой. Все ti и xi должны быть целыми, 0 ≤ ti ≤ 1018 , −1018 ≤ xi ≤ 1018. В один момент времени можно выпускать несколько торпед, в одну точку можно выпускать несколько торпед в разные моменты времени.

Примеры
Входные данные Выходные данные
1 2
1
10
30
20
0 10
5 25

Замечание
В примере из условия два корабля движутся влево и один корабль движется вправо. Начальные координаты кораблей, двигающихся влево, равны l1 = 10 и l2 = 30, а начальная координата корабля, двигающегося вправо, равна r1 = 20. В момент времени t1 = 5 в одной точке x1 = 25 окажутся два корабля — двигающийся влево из точки 20 и двигающийся вправо из точки 30. Их можно подбить одной торпедой. Оставшийся корабль, двигающийся влево, можно подбить, например, в момент времени t2 = 2 в точке x2 = 8.

Минимальное максимальное

математика реализация

Алексей Юрьевич и Михаил Леонидович отправились на поезде в Троицк. По дороге к ним подсели вахтовик и дембель. После знакомства и небольших историй о себе вахтовик и дембель решили устроить Алексею Юрьевичу и Михаилу Леонидовичу тест «на мужика»: нужно решить непростую задачку по программированию.
Помогите Алексею Юрьевичу и Михаилу Леонидовичу пройти тест «на мужика».
Задан массив целых чисел a1,a2,...,an.
Стоимостью подотрезка массива 1 <= l <= r <= n назовем величину f(l,r) = sum(l,r) − xor(l,r), где sum(l,r) = al +al+1+...+ar, а xor(l,r) = al ⊕al+1 ⊕...⊕ar (⊕ здесь обозначает операцию XOR, побитовое исключающее «ИЛИ» чисел, подробнее в разделе «Замечание»).
Требуется найти подотрезок заданного массива с максимальным значением f(l,r). Если ответов несколько, то среди них нужно найти подотрезок с минимальной длиной, то есть минимальным значением r − l +1.
Входные данные
Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число t (1 <= t <= 104) — количество наборов входных данных. Далее следует описание наборов входных данных.
Первая строка каждого набора входных данных содержит единственное целое число n (1 <= n <= 105) — длину массива.
Вторая строка каждого набора входных данных содержит n целых чисел a1,a2,...,an (0 <= ai <= 109) — элементы массива.
Гарантируется, что сумма n по всем наборам входных данных не превосходит 2 · 105.
Выходные данные
Для каждого набора входных данных выведите два числа 1 <= l <= r <= n таких, что значение f(l,r) максимально по всем подотрезкам массива a, а длина r −l +1 минимальна. Если существует несколько правильных ответов, выведите любой из них.
 

Примеры
Входные данные Выходные данные
1 6
1
0
2
5 10
3
0 2 4
4
0 12 8 3
5
21 32 32 32 10
7
0 1 0 1 0 1 0
1 1
2 2
3 3
2 3
3 4
4 6

Замечание
Операция XOR двух чисел a и b — это битовая операция, которая применяется независимо к каждой паре соответствующих битов a и b. Эта операция представляет собой сложение по модулю 2. Вот её таблица истинности для пары битов:
a b a⊕b
0 0 0
0 1 1
1 0 1
1 1 0

В первом наборе входных данных f(1,1) = 1 − 1 = 0.
Во    втором    наборе    входных    данных    f(2,2)    =    10 − 10    =    0.    Заметим,    что f(1,2) = (10 + 5) − (10 ⊕ 5) = 0, но нам среди максимальных значений f(l,r) нужно найти подотрезок с минимальной длиной.
В четвертом наборе входных данных f(2,3) = (12+8) − (12 ⊕ 8) = 16.
В пятом наборе входных данных есть два правильных ответа, так как f(2,3) = f(3,4) и их длины равны.

 

K-mex

реализация Хеш

Вы думали, что сможете спокойно выехать из Озёрска, погостив у друга? Конечно же, нет. Полицейский опять остановил вас и снова просит решить задачу, чтобы удостовериться, что вы можете выехать из города. Придётся вам решить очередную задачу.
Изначально у вас множество, в котором есть единственный элемент — это 0. Вам нужно будет поддерживать q запросов следующего вида:
•    + x — добавить число x в множество. Гарантируется, что раньше его там не было,
•    - x — удалить число x из множества. Гарантируется, что это число там есть,
•    ? k — найти k − mex множества.
В нашей задаче мы считаем, что k − mex множества — это наименьшее целое неотрицательное число x, которое делится на k и которого нет в множестве.
Входные данные
В первой строке находится целое число q (1 <= q <= 2 · 105) — количество запросов.
В следующих q строках находятся описания запросов. Если это запрос добавления, то в формате
+ x (1 <= x <= 1018), если запрос удаления, то - x (1 <= x <= 1018), если же запрос поиска, то ? k (1 <= k <= 1018). Гарантируется, что будет хотя бы один запрос типа ?.

Выходные данные
Для каждого запроса типа ? выведите k − mex множества.
 

Примеры
Входные данные Выходные данные
1 18
+ 1
+ 2
? 1
+ 4
? 2
+ 6
? 3
+ 7
+ 8
? 1
? 2
+ 5
? 1
+ 100000000
? 100000000
- 4
? 1
? 2
3
6
3
3
10
3
200000000
3
4

Замечание
После первого и второго запроса во множестве будут элементы 0,1,2. Наименьшее неотрицательное число, которое не делится на 1 и которого нет в множества, равно 3.
После четвертого запроса во множестве будут элементы 0,1,2,4. Наименьшее неотрицательное число, которое не делится на 2 и которого нет в множества, равно 6
 

Копейский рок

математика реализация

Мало кто знает, но у Данилы Багрова и Татарина есть ещё один брат, неизвестный широкой публике. Проживает он тихо, мирно в Копейске, вдали от столичной суеты и назойливых папарацци.
Однажды Данила Багров и Татарин решили навестить своего брата. Приехав к нему домой в Копейск, Данила обнаружил в шкафу обширную коллекцию дисков различных рок-групп. На полках лежали диски «Nautilus Pompilius», «Би-2», «АукцЫона», «Смысловых галлюцинаций», «Агаты Кристи» и многих других. Однако Даниле не понравилось, как эти диски были разложены на полках.
Шкаф с полками можно представить в виде прямоугольника n×m, где в каждой клетке лежит один диск. Каждый диск описывается одним числом — некоторым номером группы, которая записала этот диск. Будем считать, что если два диска имеют одинаковое число, то их записала одна и та же группа, а если разные — то их записали разные группы.
Данила хочет добиться того, чтобы в каждом столбце все диски были записаны разными группами. Для этого он может сколько угодно раз переставлять диски произвольным образом на любой полке (то есть внутри любой строки), однако, запрещено менять местами диски с разных полок.
Помогите Даниле и скажите, можно ли такими действиями добиться того, чтобы в каждом столбце все диски были записаны разными группами.
Входных данные
В первой строке через пробел заданы два целых числа n и m — размеры шкафа (1 <= n,m <= 100).
В следующих n строках через пробел записаны m целых чисел ai,j — номер группы, которая записала диск, лежащий на i-й полке в j-м столбце (1<= ai,j <=109).
Выходные данные
В первой строке выведите Impossible, если Данила не может расставить всё так, чтобы в каждом столбце диски были записаны разными группами, и Possible, если такая расстановка возможна.
В случае, если Данила может добиться желаемого, выведите финальную расстановку дисков в шкафу. Если таких расстановок несколько, выведите любую из них.
 

Примеры
Входные данные Выходные данные
1 3 4
1 2 2 3
3 2 1 4
2 4 1 3
Possible
3 2 1 2
1 3 2 4
2 1 4 3
2 3 3
1 1 1
1 1 1
1 1 1
Impossible

Лес

Задачи на моделирование реализация

Миша заблудился в лесу и пытается выйти из него. Он проходит A шагов на север, затем B шагов на восток, затем C шагов на юг, D шагов на запад, после чего повторяет свои действия (снова A шагов на север, B шагов на восток, C шагов на юг, D шагов на запад и т.д.).
Оказалось, что для того, чтобы выйти из леса из его первоначальной точки, ему нужно было пройти ровно K шагов в любом из четырёх направлений, то есть первоначально Миша находится в центре квадрата со стороной 2K шагов. Определите, сколько шагов Миша сделает, прежде чем выйдет из леса (впервые окажется на границе леса).

Входные данные
Первые четыре строки входных данных содержат по одному целому положительному числу A, B, C, D — количество шагов, которое Миша делает на север, восток, юг, запад. Пятая строка входных данных содержит целое число K — расстояние от начального расположения Миши до четырёх сторон квадрата (границ леса). Все входные числа не превосходят 109.

Выходные данные
Программа должна вывести одно целое число — количество шагов, которое Миша сделает до выхода из леса. Гарантируется, что входные данные таковы, что Миша когда-нибудь выйдет из леса. 
Обратите внимание, что значение ответа может быть больше, чем возможное значение 32-битной целочисленной переменной, поэтому необходимо использовать 64-битные целочисленные типы данных (тип int64 в языке Pascal, тип long long в C и C++, тип long в Java и C#).
 

Примеры
Входные данные Выходные данные
1 1
1
2
3
3
13


Замечание
На рисунке изображён пример из условия. Миша делает 1 шаг на север (вверх), 1 шаг на восток (вправо), 2 шага на юг (вниз), 3 шага на запад (влево). От начального расположения Миши до стороны квадрата — 3 шага. Первоначальное расположение Миши и точка выхода из леса обозначены синими кругами. Путь Миши обозначен жёлтой линией. Миша пройдёт 13 шагов, прежде чем впервые окажется на границе леса.

Количество чисел на диапазоне

Префиксные суммы(минимумы, ...) Бинарный поиск Префиксные суммы(минимумы, ...) реализация

Вам даны N целых чисел A1, ..., AN.
На каждый из Q запросов, заданных в формате L R X, выведите количество элементов среди AL, ..., AR, значения которых равны X.

Входные данные
В первой строке задано целое число N (1 <= N <= 2·105). 
Вторая строка содержит целых чисел Ai (1 <= Ai <= N, 1 <= i <= N). 
В третьей строке задано одно целое число (1 <= Q <= 2·105).
Каждая из следующих строк содержит три целых числа L, R, (1 <= L <= R <= N, 1 <= X <= N).

Выходные данные
Выведите на экран строк, i-я строка содержит ответ на i-й запрос.
 

Примеры
Входные данные Выходные данные
1
5
3 1 4 1 5
4
1 5 1
2 4 3
1 5 2
1 3 3
2
0
0
1

Космолёт

графы кратчайшие пути реализация

Миссия космолёта “Юрий Гагарин” определена - посещение трех звёздных систем в глубоком космосе. Эти звёзды находятся на Земном небосводе в созвездии Орион:

  •  звезда Беллатрикс (250 световых лет от Земли)
  •  звезда Бетельгейзе (643 световых года от Земли)
  •  парная звёздная система Ригель (773 световых года от Земли)
Маршрут путешествия должен предусматривать посещение их в порядке удаления от Земли. Однако гиперсветовой прыжок не может пока быть выполнен с приемлемой точностью на расстояние 20 и более световых лет. Спланированная трасса полёта должна состоять из серии
прыжков, каждый прыжок менее безопасного расстояния. Вторым ограничением является то, что промежуточные точки трассы должны находиться в окрестности массивного тела, т.е. звезды. Такие звёзды в навигации называются контрольными пунктами.
Необходимо учитывать, что управление выходом из гиперпространства невозможно без существенного искривления его в точке назначения гравитационным воздействием звезды контрольного пункта. Эта особенность налагает дополнительное ограничение на каждый
выполняемый гиперпрыжок: траектория прыжка не должна проходить меньше одного светового года от звёздной системы, не являющейся контрольным пунктом.
Задача : построить трассу в трёхмерном пространстве с минимально возможным количеством гиперпрыжков, при соблюдении указанных выше ограничений. Если таких трасс несколько, то следует выбрать ту, в которой суммарная длина трассы меньше.

Входные данные
Первая строка : натуральное число N - количество звезд, внесённых в лоцию (от 3 до 100).
Далее N строк, каждая содержит три целых числа, записанных через пробел: координаты X Y Z, заданные в световых годах. Все значения координат не превышают 10000. Точка старта (0 0 0) - звезда Солнце - не указана в лоции.
Три посещаемые звёздные системы находятся в лоции в порядке ожидаемого посещения, в строках с номерами 1, 2 и 3.

Выходные данные
Первая строка: через пробел должны быть указаны количество прыжков и длина трассы с точностью до третьего знака после запятой.
Вторая строка: номера звёзд-”контрольных пунктов” и звёзд-”целей миссии” в порядке следования звездолёта, записанные через пробел.
Примечание: для отработки алгоритма построения маршрута космолёта в лоцию (комплект навигационной информации для судовождения) могут включаться различные произвольные координаты, не соответствующие известным звёздам.
В рамках задачи считать, что движение космолёта между контрольными точками происходит прямолинейно.

 
Примеры
Входные данные Выходные данные
1 3
10 10 10
20 20 20
30 30 30
3 51.962
1 2 3
2 5
20 0 0
10 0 0
40 0 0
30 0 0
50 0 0
4 40.000
2 1 4 3

Сын маминой подруги

жадные алгоритмы реализация

Вася уже в десятом классе. После месяца ежедневных заруб в доту со своими товарищами, он начал замечать, что его оценки начали проседать. Исправлять их он, конечно же не собирается, но есть один нюанс...
Вместе с Васей в классе учится сын маминой подруги — Петя. Вася очень не любит его, потому что мама Васи дружит с мамой Пети и знает про него почти всё. В конце триместра у васиной мамы есть традиция садиться и сравнивать оценки Васи с оценками Пети. За каждый случай, когда у Васи оценка ниже, чем у Пети, мама выдаёт ему наряд вне очереди! — мыть весь день посуду, пропылесосить во всём доме, помыть окна или отвести/забрать младшую сестру из детского сада.
Конечно же, эта ситуация Васе не очень нравится, потому что в среднем Вася умнее Пети. Вася хочет минимизировать количество штрафных нарядов, поэтому он собирается перемешать оценки.
Помимо оценок в журнале встречается метка n. Она означает, что ученика на уроке не было. Если кого-то из учеников не было на уроке, то мама Васи не может сравнить успехи своего сына и сына своей подруги, поэтому штрафной наряд выписан быть не может
Помогите Васе перемешать свои оценки и n-ки так, чтобы получить как можно меньше штрафных нарядов. Если существует несколько решений, выведите любое.
В школе N различных предметов, и по каждому из них Вася должен перемешать оценки.
В каждом тесте первое число N — это количество предметов, за которые получены оценки в этом триместре. В следующих 2N строках находятся N блоков по 2 строки. В каждом блоке в первой строке находятся оценки Васи, а во второй — оценки Пети. Для каждого блока в новой строчке нужно вывести такую перестановку номеров оценок и меток n, что ai означает, что Васина оценка под номером i должна занять позицию ai.
В первом тесте N = 30. Оценка за этот тест: 30 баллов. За каждый предмет, за который получено больше штрафных нарядов, чем могло бы быть, снимается 1 балл. Проверка осуществляется в режиме online (результат виден сразу).
Во втором тесте N = 35. Оценка за этот тест: 70 баллов. За каждый предмет, за который получено больше штрафных нарядов, чем могло бы быть, снимается 2 балла. Во время тура проверяется, что по каждому предмету сдана корректная перестановка. Проверка правильности ответа осуществляется в режиме offline (результат виден после окончания тура).

Примеры
Входные данные Выходные данные
1 3
5
4 4 3 4 4
5 5 4 5 5
4
n 3 4 n
4 n 4 n
4
1 3 2 4
3 2 1 5
5 1 2 4 3
1 2 3 4
3 4 2 1

В первом примере Вася получит 4 наряда вне очереди. Во втором примере ничего никуда переставлять не надо, потому что на единственном уроке, на котором присутствовали оба ученика, они получили по 4 балла. В третьем примере Вася переставит оценки вот так: 4, 2, 1, 3 и получит один наряд вне очереди

 

Пирамида

реализация

Великий фараон Флатландии недавно взошёл на престол и озаботился вопросом строительства пирамиды для себя.
Флатландия — двумерная страна, у неё есть только длина и высота. Для строительства пирамиды был выделен участок длиной в N стандартных блоков. Каждый единичный отрезок был обследована геологами, которые выяснили количество стандартных блоков 1 на 1, которые могут быть уложены в столбик на эту клетку без угрозы проседания грунта.
Пирамидой называется фигура, состоящая из блоков 1 на 1, такая, что каждый горизонтальный слой представляет собой непрерывный отрезок. Под каждым блоком должен находится блок предыдущего слоя или земля (в нижнем слое). Количество блоков в каждом столбце не должно превосходить грузоподъёмности клетки, на которой находится этот столбец.
Фараон хочет, чтобы его пирамида состояла из как можно большего числа блоков. Помогите ему определить это число.

Формат входных данных
В первой строке входных данных задано целое число N (1 ≤ N ≤ 300000) — длина участка,
выделенного для строительства пирамиды.
Во второй строке задано N целых чисел Wi (0 ≤ Wi ≤ 109) — грузоподъемности отрезков
единичной длины.

Формат выходных данных
Выведите максимальное количество блоков, из которого может быть построена пирамида.
 

Примеры
Входные данные Выходные данные
1 6
7 0 1 3 2 3
8

Страны мира

Словари реализация

У вас есть географический словарь, который содержит название стран и городов в этих странах. Напишите программу, которая определяет в какой стране находится город. 


Входные данные
Программа получает на вход количество стран N. Далее идет N строк словаря: каждая строка начинается с названия страны, затем идут названия городов этой страны. В следующей строке записано число M, далее идут M слов - названия M городов. Гарантируертся, что такой город есть в словаре.

Выходные данные
Для каждого города выведите название страны, в которой он находится.
 
Пример
Входные данные Выходные данные
1
2
Russia Moscow Petersburg Novgorod Kaluga
Ukraine Kiev Donetsk Odessa
3
Odessa
Moscow
Novgorod
Ukraine
Russia
Russia

Джерримендеринг

реализация Префиксные суммы(минимумы, ...)

Джерримендеринг — разделение территории на избирательные округа неестественным образом с целью искусственного изменения соотношения политических сил в них и, как следствие, в целом на территории проведения выборов. Например, при необходимости обеспечить победу на территории партии X (если от одного избирательного округа избирается один кандидат или один выборщик), нужно всех противников X сосредоточить по округам, где X не сможет выиграть, а всех сторонников X распределить так, чтобы они обеспечивали уверенную победу с небольшим перевесом в нужных округах. Например, в тесте из условия всего за X голосует 10 человек, а против X голосует 15 человек, но, благодаря специальному разделению по округам, X выигрывает в двух избирательных округах из трёх.
В этой задаче избирательная территория представляет собой улицу, на которой в ряд расположены N домов. В i-м доме проживает ai человек, и все они голосуют одинаково: либо за партию X, либо за другую партию. Улицу необходимо разбить на три избирательных округа, от каждого избирательного округа будет избираться один кандидат, и необходимо произвести такую нарезку улицы на три избирательных округа, чтобы минимум в двух округах из трёх выиграл кандидат от партии X. Кандидат от партии X выигрывает, если за него голосует более половины избирателей, проживающих в домах данного избирательного округа. Но чтобы вас не заподозрили в джерримендеринге, необходимо, чтобы каждый избирательный округ представлял собой непрерывный отрезок из номеров домов, то есть сначала вдоль по улице идут дома первого избирательного округа, затем — второго, затем — третьего. Каждый избирательный округ должен содержать как минимум один дом.

Входные данные
Первая строка входных данных содержит целое число N (3 <= N <= 105 ) — количество домов на улице. Следующие N строк содержат по одному целому числу ai (0 < |ai | <= 104 ). Если ai > 0, то в i-м доме проживает ai избирателей, голосующих за кандидата от партии X. Если ai < 0, то в i-м доме проживает |ai | избирателей, голосующих против кандидата от партии X.

Выходные данные
Если возможно разделить N домов на три округа так, что минимум в двух округах выигрывает кандидат от партии X, программа должна вывести в одной строке три целых положительных числа N1, N2, N3, N1 + N2 + N3 = N, соответствующих количеству домов в первом, втором и третьем избирательном округе от начала улицы. При таком разбиении минимум в двух округах из трёх должен выигрывать кандидат от партии X. Если возможно несколько таких разбиений, необходимо вывести любое из них.
Если искомое разбиение не существует, программа должна вывести одно число 0
 

Примеры
Входные данные Выходные данные Пояснение
1 7
-3
-5
3
-4
2
5
-3
4 1 2 На улице расположены 7 домов, избиратели в них распределены так: (−3, −5, 3, −4, 2, 5, −3). Правильный ответ: 4, 1, 2. При таком разбиении в первом округе оказываются 4 дома: (−3, −5, 3, −4). В этом округе за X голосует 3 избирателя, против — 12 избирателей и X разгромно проигрывает. В следующем округе один дом, в котором 2 избирателя голосуют за X, в этом округе X выиграет. В третьем округе два дома: (5, −3), и в этом округе X тоже выиграет. Итого X выигрывает в двух округах.

Кольцевые гонки

Алгоритмы обработки реализация

Участники кольцевых гонок на одноколесных велосипедах нумеруются числами от 1 до N. Им предстоит проехать K кругов и победителем является тот, кто проехал их раньше всех. Участники стартуют одновременно с некоторой линии, которая называется конец круга. Каждый раз, когда участник пересекает эту линию, его номер фиксируется автоматической системой с высокой точностью (то есть два участника не могут пересечь эту линию одновременно). После прохождения K кругов эта же линия является финишной прямой. К сожалению, некоторые участники сходят с дистанции и проезжают меньшее количество кругов.
Организаторы соревнования забыли число K и стесняются спросить его у участников. Помогите организаторам определить победителя соревнования, используя только записи с системы фиксации. Гарантируется, что хотя бы один из участников преодолел необходимые K кругов и никто из участников не проехал более K кругов. Первая фиксация номера участника происходит после
прохождения первого круга.

Формат входных данных
В первой строке задаются целые числа N и M (1 ≤ N ≤ 100, 1 ≤ M ≤ 10000) — количество участников соревнования и записей с системы фиксации соответственно. Во второй строке задается M целых чисел от 1 до N – номера участников в том порядке, как
они фиксировались системой.

Формат выходных данных
Выведите одно число — номер победителя
 
 

Примеры
Входные данные Выходные данные
1 3 4
1 3 3 1
3
2 3 5
1 1 2 3 1
1

Раскраска Тюбика

реализация Задачи на моделирование

Художник Тюбик учит Незнайку рисовать. Он дал ему сетку с H строками и W столбцами. Все клетки сетки изначально выкрашены в белый цвет. Тюбик попросил Незнайку закрасить N из этих ячеек в черный цвет. I-я (1<=i<=N) ячейка, которую закрасил Незнайка, является ячейкой в ai-й строке и bi -м столбце. Для каждого целого числа j (0<=j<=9), определите сколько в сетке подпрямоугольников размером 3×3 содержит ровно j черных ячеек после того, как Незнайка закрасил N ячеек?

Входные данные
В первой строке заданы 3 целых числа: H, W (3<=H,W<=109) и N (0<=N<=min(105,H×W)). Далее идут N строк по 2 числа в каждом ai (1<=ai<=H) и bi (1<=bi<=W), 1<=i<=N, (ai,bi)≠(aj,bj), i ≠ j.

Выходные данные
Выведите 10 строк. В (j + 1)-й (0<=j<=9) строке должно быть указано количество подпрямоугольников размером 3 × 3 сетки, содержащей ровно j черных ячеек.
 

 

Примеры
Входные данные Выходные данные
1 4 5 8
1 1
1 4
1 5
2 3
3 1
3 2
3 4
4 4
0
0
0
2
4
0
0
0
0
0
2 10 10 20
1 1
1 4
1 9
2 5
3 10
4 2
4 7
5 9
6 4
6 6
6 7
7 1
7 3
7 7
8 1
8 5
8 10
9 2
10 4
10 9
4
26
22
10
2
0
0
0
0
0
3 1000000000 1000000000 0 999999996000000004
0
0
0
0
0
0
0
0
0

 

Дипломы в папках

Жадный алгоритм Вывод формулы реализация

В этом году Иван заканчивает школу и поступает в вуз. За время своей учебы он часто участвовал в олимпиадах по информатике и у него накопилось много дипломов. Иван раскладывал дипломы по папкам совершенно бессистемно, то есть любой диплом мог оказаться в любой из папок. К счастью, Иван помнит, сколько дипломов лежит в каждой из папок.

Иван хочет принести в приемную комиссию выбранного вуза папку, в которой находится диплом Московской олимпиады по программированию (такой диплом у Ивана ровно один). Для того чтобы понять, что в данной папке нужного диплома нет, Ивану нужно просмотреть все дипломы из этой папки. Чтобы открыть одну папку Ивану нужно потратить одну секунду, просмотр одного диплома занимает у него также одну секунду, и он может мгновенно переходить к следующей папке после окончания просмотра предыдущей. Порядок просмотра папок Иван может выбирать. То, что в пустых папках диплом можно не искать, Ивану очевидно.

По заданному количеству дипломов в каждой из папок требуется определить, за какое наименьшее время в худшем случае Иван поймет, в какой папке содержится нужный ему диплом.

Входные данные
В первой строке входного файла записано целое число N (1 ≤ N ≤ 105) - количество папок. Во второй строке записаны N целых чисел a1, a2, ..., aN (0 ≤ ai ≤ 105) - количество дипломов в каждой из папок.

Выходные данные
Выведите одно число - минимальное количество секунд, необходимое Ивану в худшем случае для определения того, в какой папке содержится диплом.

Примечание
В первом примере Иван может открыть и просмотреть папку 2 за 2 секунды и, не найдя там диплома, понять, что диплом находится в папке 1.

Во втором примере Иван за 2 секунды просмотрит папку 1, потом за 2 секунды просмотрит папку 4, а если ни в одной из них диплома не встретилось, он поймет, что диплом в папке 3.

Примеры
Входные данные Выходные данные
1 2
2 1
2
2 4
1 0 2 1
4

Кратное трём число

Остатки реализация

Дано число. В этом числе необходимо изменить одну цифру таким образом, чтобы новое число делилось на 3 и было бы максимально возможным. В исходном числе нужно
обязательно изменить одну цифру, даже если исходное число уже делилось на 3. Программа получает на вход одно длинное натуральное число. Длина числа может
достигать 100 цифр.
Программа должна вывести другое натуральное число, удовлетворяющее условиям:
1. Новое число должно отличаться от данного ровно одной цифрой.
2. Новое число должно делиться на 3.
3. Новое число должно быть максимально возможным из всех таких чисел.

Примеры
Входные данные Выходные данные
1 123 723

Звездные треугольники

Алгоритмы обработки реализация

Жомарт любит наблюдать за звездами и создавать из них различные геометрические фигуры. Небо предоставляется в виде декартовой системы координат, а звезды на ней точками. На этот раз Жомарта интересует вопрос, сколько различных прямоугольных треугольников, у которого катеты параллельны осям координат, можно составить с помощью звезд на небе.

Формат входного файла
В первой строке задается N — количество звезд на небе (3  ≤ N ≤ 300000). В каждой из следующих N строк заданы целые X, Y (|X, Y| ≤  109) — координаты соответствующей звезды.

Формат выходного файла
Выведите ответ к задаче.
 

Примеры
Входные данные Выходные данные
1 3
0 0
1 0
0 1
1
2 4
0 0
1 0
0 1
1 1
4

Межпланетные электрички

Сортировка событий реализация

На планете Кирнес есть железнодорожный вокзал, с которого проложен железнодорожный путь до Сириуса. Этот путь активно используется товарными поездами, ходящими по одному и тому же ежедневному расписанию с одинаковой скоростью. К началу туристического сезона было решено
запустить межпланетные электрички, следующие от вокзала до Сириуса. Электрички ходят по особому расписанию, которое надо согласовать с товарными поездами, поскольку железнодорожный путь является одноколейным.

Каждый день на планете Кирнес состоит из h часов. Каждый час состоит из m минут, причём m обязательно чётное. Известно, что на данный момент n товарных поездов отправляются с вокзала ежедневно по разу в день: i-й поезд отправляется в hi часов и mi минут.

Поскольку между Кирнесом и Сириусом активный пассажиропоток, то было решено пустить ровно по 2 электрички каждый час. Более того, по всем транспортным нормам необходимо, чтобы промежутки времени между отправлением электричек были равны \( {m \over 2}\)минутам. То есть для любой электрички предыдущая должна была отправиться ровно за \({m \over 2}\) минут до неё, а следующая должна отправиться ровно через \({m \over 2}\) минут после. Кроме этого, электричку надо подать на платформу за k минут до отправки. Пока электричка стоит на платформе, с неё не могут отправляться товарные поезда. При этом разрешается подавать электричку на платформу в ту же самую минуту, когда с неё отправляется предыдущий товарный поезд. А также поезда отправляются настолько быстро, что разрешено отправить электричку и следующий за ней товарный поезд в одну и ту же минуту.

Поскольку электрички отправляются каждый день с интервалом в \({m \over 2}\) минут, то первая электричка отправится с вокзала в 0 часов и t минут, причем t < \({m \over 2}\) . Обратите внимание, что если t < k, то платформа вокзала будет занята и последние k − t минут предыдущего дня.

Разумеется, не всегда можно составить корректное расписание электричек вместе со всеми товарными поездами. Тогда необходимо отменить некоторые товарные поезда, чтобы появилась возможность пустить электрички с соблюдением всех транспортных норм. При этом, чтобы грузоперевозчики не несли большие убытки, требуется отменить как можно меньше товарных поездов. 

Составление такого расписания оказалось трудной задачей для правительства планеты, поэтому это было поручено вам. Найдите такое время t для запуска первой электрички, чтобы количество товарных поездов, которые потребуется отменить, было минимальным.

Формат входных данных
Первая строка содержит четыре целых числа n, h, m, k (1 ≤ n ≤ 100 000, 1 ≤ h ≤ 109, 2 ≤ m ≤ 109, 1 ≤ k ≤ \({m \over 2}\)) — число товарных поездов, количество часов и минут на планете Кирнес, а также время, которое электричка стоит у платформы. Гарантируется, что число минут m четное.
В следующих n строках вводится по два целых числа hi и mi (0 ≤ hi < h, 0 ≤ mi < m) — время отправления i-го поезда, часы и минуты соответственно. Гарантируется, что все товарные поезда отправляются в разное время.

Формат выходных данных
Выведите два числа: минимальное количество отмененных товарных поездов и t — время запуска первой за день электрички в минутах.
Во второй строке через пробел выведите номера отменяемых товарных поездов.

Примеры
Входные данные Выходные данные
1 2 24 60 15
16 0
17 15
0 0
2 2 24 60 16
16 0
17 15
1 0
2

Замечание

В первом примере первую электричку надо отправить в 0:00. Тогда поезд в 16:00 отправится сразу после электрички, а электричку в 17:30 надо будет подать на платформу сразу после отправления товарного поезда в 17:15.
Во втором примере подать электричку на платформу надо за 16 минут до отправления. Сделать это без отмены какого-то товарного поезда не получится: если отправлять электричку в t ∈ [1, 15], то в 16:00 электричка уже должна быть на платформе, а с нее в это время отправляется первый товарный поезд. Если t ∈ {0, [16, 29]}, то второй товарный поезд в 17:15 не сможет уехать с платформы, потому что на ней уже будет стоять следующая электричка.
Если отменить второй поезд, то можно выбрать t = 0, тогда поезда будут отправляться в 0 и 30 минут каждый час, а столкновения с первым товарным поездом не будет. Также можно отменить только первый поезд и выбрать, например, t = 13.
 

Ирригация

математика Задача на реализацию реализация

Мальчика Мишу с юных лет волновали вопросы доставки воды. Когда Мише было четыре года, он приносил воду для полива растений в воздушных шариках вместо вёдер, так как воду в ведре было проще расплескать. Когда Мише исполнилось шесть лет, он построил в квартире водопровод из трубочек для сока, автоматизировав тем самым поливку цветов у себя в комнате. Все полученные в школе знания Миша сразу же использовал в своих смелых изобретениях: передача воды по проводам, насос из зубочисток, кран из маминого флакончика духов — вот далеко не полный список изобретений мальчика в школьные годы.

Как известно, любому таланту надо дать возможность реализоваться, поэтому мама Миши отправила сына на инновационную олимпиаду по ирригации (ИОИ). На этой олимпиаде школьники со всех концов Берляндии соревнуются в умении доставить воду для поливки растений самыми причудливыми способами. Зная список изобретений Миши, несложно догадаться, что проведение подобной олимпиады весьма затратно, поэтому спустя n первых проведений олимпиады было решено ввести правило, по которому будет определяться место проведения соревнования в следующий год. Город для проведения олимпиады выбирается следующим образом: всего в Берляндии есть m городов, пронумерованных от 1 до m, готовых принять соревнование. Каждый год олимпиада проводится в городе, в котором она проводилась наименьшее число раз. Если таких городов несколько, то олимпиада проводится в городе с наименьшим номером среди городов с минимальным числом проведений олимпиады.

Мишина мама очень волнуется за сына, поэтому её интересует, в каком городе будет проходить олимпиада в определённые годы. Единственная информация, которой располагает мама Миши, — места проведения олимпиады в первые n лет. Помогите маме Миши, и она попросит Мишу не залить вашу квартиру.

Входные данные
В первой строке заданы три целых числа n, m и q (1 ≤ n, m ≤ 500000 , 1 ≤ q ≤ 20) — количество проведений олимпиады до введения правила, количество городов в Берляндии, готовых провести олимпиаду, и число лет, про которые маму Миши интересует место проведения олимпиады, соответственно.

В следующей строке содержится n целых чисел ai (1 ≤ ai ≤ m) — номера городов, в которых проводилась олимпиада в год i. Обратите внимание, что до принятия правила место проведения олимпиады могло выбираться произвольным образом.

В следующих q строках заданы целые числа ki (n+1 ≤ ki ≤ 1018) — номера годов, для которых маму Миши интересует место проведения олимпиады.

Выходные данные
Выведите q целых чисел. В строке с номером i выведите одно целое число — место проведения олимпиады в год ki.

Примеры
Входные данные Выходные данные
1 6 4 10
3 1 1 1 2 2
7
8
9
10
11
12
13
14
15
16
4
3
4
2
3
4
1
2
3
4
2 4 5 4
4 4 5 1
15
9
13
6
5
3
3
3

Сложность

Хеш реализация битмаски

Федот — дизайнер, ему поручена ответственная работа по художественной укладке плитки черного и белого цвета. Его последнее задание — уложить черные и белые плитки в квадрате n × n.

Федот любит свою работу и всегда тщательно готовится к каждому проекту. Федот считает, что два квадрата похожи, если один из них можно получить из другого несколько раз заменив цвета в какой-то строке или столбце на противоположные.

Все эти квадраты являются похожими, и никакой другой не похож на них
Федот заметил, что клиенты никогда не смотрят на всю работу целиком, обычно поле их зрения ограничивается квадратом k × k. Для оценки эскизов он ввел специальную величину — сложность. Она равна числу пар не похожих друг на друга квадратов k × k, которые встречаются в картине.

Методом проб и ошибок Федот установил, что клиентам нравятся картины определенной сложности. Слишком большая сложность похожа на хаос, а слишком малая навевает скуку, считает Федот.

Прежде чем класть плитку, Федот подготовил несколько эскизов. Помогите Федоту вычислить их сложность.

Входные данные
Первая строка входного файла содержит два целых числа n и k (1 ≤ k ≤ n ≤ 500). Следуюшие n строк содержат описание эскиза. Каждая из них имеет длину n и состоит из символов b и w, которые соответствуют белому и черному цветам плиток.

Выходные данные
В первой строке выходного файла выведите одно целое число q — сложность картины.
Примеры
Входные данные Выходные данные
1 2 1
bw
wb
0
2 3 2
bwb
wbb
bbw
3

Треугольный ключ

реализация Задачи на моделирование

У Индианы Джонса есть ключ от двери, ведущей к тайным богатствам инков. Ключ имеет форму правильного треугольника, который, в свою очередь, разбит на n2 маленьких правильных треугольников, в каждом из которых написана одна десятичная цифра. Пример ключа приведен ниже на рисунке.


Джонс вставил треугольник в соответствующее треугольное отверстие в двери, и... она не открылась. Возможно, он вставил ключ неправильно, ведь его можно вставить тремя способами. Из-за того, что у Джонса осталась лишь одна попытка для того, чтоб открыть двери (в случае неудачи его убьют уже настигающие его кровожадные инки), он хочет знать как будет выглядеть ключ при его вставке в дверь другими двумя способами. После этого он сделает правильный выбор. Вас, как одного из двух своих помощников, он попросил показать ему только один из двух возможных вариантов. Внешний вид ключа, приведенного выше, при повороте против и по часовой стрелке изображен на рисунке ниже.


Поскольку вы не хотите смерти Индианы и хотите получить свою долю сокровищ, вам придется помочь ему!

Входные данные
В первой строке входного файла содержится одно целое число n (1 ≤ n ≤ 100). В следующих n строках описан сам треугольник. Строка входного файла, имеющая номер i + 1, содержит 2i - 1 цифру — содержание i-й строки ключа-треугольника.

Последняя строка содержит слово counterclockwise, если треугольник необходимо повернуть против часовой стрелки, и clockwise в противном случае.

Выходные данные
Выведите вид ключа при его повороте в требуемую сторону. Треугольник опишите в том же формате, в котором это сделано во входном файле.
 

Примеры
Входные данные Выходные данные
1 3
1
2 3 4
5 6 7 8 9
counterclockwise

4 8 7 
1 3 2 6 5 
2 3
1
2 3 4
5 6 7 8 9
clockwise

7 6 2 
9 8 4 3 1 

Самая опасная акула

Динамическое программирование: один параметр реализация

Как известно, не только люди любят принимать участие в различных соревнованиях. Среди рыб и моллюсков также проводится множество состязаний на дне океана. Акула Семён участвует в самом престижном соревновании Мирового океана на звание самой опасной акулы. Во время этого состязания акулы соревнуются в различных дисциплинах: плавание на скорость, маскировка, навигация по картам и многим другим. Сейчас Семён проходит испытание под названием «разрушение».

Во время этого испытания перед акулой ставят m доминошек. Все доминошки стоят на одной прямой, однако высоты доминошек могут различаться. Расстояние между соседними доминошками равно 1. Кроме того, у каждой доминошки есть своя стоимость, выраженная целым числом. Цель акулы — уронить все доминошки. Для этого акула может толкнуть любую доминошку влево или вправо, после чего она начнёт падать в этом направлении. Если во время падения доминошка задевает другие, они также начинают падать в ту же сторону, в которую падала исходная, таким образом начинается цепная реакция, в результате которой может упасть множество доминошек. Падающая доминошка задевает другую, если и только если расстояние между ними строго меньше высоты падающей доминошки, причем доминошки не обязательно должны быть соседними.

Разумеется, любая акула справится с тем, чтобы уронить все доминошки таким образом, поэтому оценивается не факт разрушения, а его стоимость. Стоимостью разрушения называется сумма стоимостей доминошек, которые акуле придётся толкнуть, чтобы все доминошки упали.

Семён уже победил в прошлых испытаниях, однако недостаточно умён, чтобы победить в этом. Помогите Семёну и определите, какая минимальная суммарная стоимость доминошек, которые ему придётся толкнуть, чтобы все доминошки упали.

Входные данные
Для уменьшения размера ввода высоты и стоимости доминошек задаются при помощи блоков.

В первой строке заданы два целых числа n и m (1 ≤ n≤ 250 000, 1 ≤ m ≤ 107 ) — количество блоков и суммарное количество доминошек, которые надо уронить Семёну, соответственно.

Затем следует описание n блоков. Описание каждого блока состоит из трёх строк.

В первой строке описания блока с номером i содержится целое число ki (1 ≤ ki ≤ 250000, \(\sum_{i=1}^n {k_i ? 250 000}\) ) — количество доминошек в блоке.

Во второй строке описания блока с номером i содержатся ki целых чисел ai,j (1 ≤ ai,j ≤ m) — высоты доминошек в блоке.

В третьей строке описания блока с номером i содержатся ki целых чисел ci,j (1 ≤ ci,j ≤ 100000) — стоимости доминошек в блоке.

Далее следует описание последовательности доминошек, которые надо уронить Семёну, в порядке слева направо.

В первой строке описания последовательности задано целое число q (n ≤ q ≤ 250000) — количество блоков в последовательности доминошек, которые надо уронить.

В следующих q строках содержатся пары целых чисел idi muli (1 ≤ idi ≤ n, 1 ≤ muli ≤ 100000), обозначающие, что очередные kidi в порядке слева направо доминошек — это доминошки блока idi, чьи стоимости были умножены на число muli.

Гарантируется, что \(\sum_{i=1} ^q k_{id_i} = m\) , а также, что каждый блок встречается хотя бы один раз в последовательности доминошек, которые требуется уронить, то есть для всех i от 1 до n найдется j такое, что idj=i.

Выходные данные
Выведите одно целое число — минимальную суммарную стоимость доминошек, которые надо толкнуть, чтобы все доминошки упали.

Примечание
В первом примере перед Семёном стоят 7 доминошек. Их высоты равны [3122122] , а стоимости равны [4363121] . Сначала Семёну следует уронить доминошку с номером 7 влево, она упадёт и заденет доминошку с номером 6. Доминошка 6, падая, заденет доминошку с номером 5, которая упадёт, но не заденет другие доминошки. Затем Семён должен уронить доминошку с номером 1 вправо, она, падая, заденет доминошки с номерами 2 и 3, а доминошка 3, падая, заденет доминошку 4, таким образом все доминошки упадут.

Во втором примере перед Семёном стоит одна доминошка стоимостью 10000000000.

Примеры
Входные данные Выходные данные Пояснения
1 2 7
3
1 2 2
1 2 1
1
3
2
3
2 2
1 3
1 1
5 Перед Семёном стоят 7 доминошек. Их высоты равны [3122122] , а стоимости равны [4363121] . Сначала Семёну следует уронить доминошку с номером 7 влево, она упадёт и заденет доминошку с номером 6. Доминошка 6, падая, заденет доминошку с номером 5, которая упадёт, но не заденет другие доминошки. Затем Семён должен уронить доминошку с номером 1 вправо, она, падая, заденет доминошки с номерами 2 и 3, а доминошка 3, падая, заденет доминошку 4, таким образом все доминошки упадут.
2 1 1
1
1
100000
1
1 100000
10000000000 Перед Семёном стоит одна доминошка стоимостью 10000000000

Том и Джерри

Задачи на моделирование реализация

В этой задаче мы снова возвращаемся в младшую группу детского сада «Телепузики». Чтобы окончательно успокоить детей, воспитательница решила включить им мультик про Тома и Джерри. Серия, которую сейчас смотрят дети, довольно-таки незамысловата — в ней Джерри развесил по потолку комнаты наковальни на веревках. Когда Том оказывается под очередной наковальней, Джерри перерезает веревку. Наковальня падает на Тома, Тому больно, всем остальным весело, дети смеются. В общем, вполне обычная серия.

А вам нужно по кадру из этой серии определить, упадет ли наковальня на Тома, если Джерри перережет веревку.

Входные данные
Вам дана ASCII-арт картинка, то есть картинка, нарисованная символами. На ней есть наковальня, привязанная веревкой к потолку, и кот Том. В первой строке даны числа N, M (4≤N≤100, 1≤M≤100 ). Следующие N строк состоят из M символов каждая, и представляют собой саму картинку. Картинка устроена следующим образом:

  • Первые K1 строк в одной и той же позиции X1 стоит символ «|», в остальных — пробел. Это веревка.
  • Следующие K2 строк в одних и тех же позициях с X2 по X3 стоит символ «#», в остальных — пробел. Это наковальня.
  • 2×X1=X2+X3, то есть наковальня подвешена за середину.
  • Следующие K3 строк содержат только пробелы. Это пустота между наковальней и котом.
  • Следующие N − K1 − K2 − K3 строк содержат произвольные символы. Любой символ, кроме пробела — часть кота. Существует хотя бы один непробельный символ.
Числа K1, K2, K3 и N − K1 − K2 − K3  ненулевые.
Выходные данные
Выведите «YES», если при падении наковальня заденет Тома, в противном случае выведите «NO».
 
Примеры
Входные данные Выходные данные
1 13 29
          |                  
          |                  
          |                  
    #############            
    #############            
    #############            
                             
                             
            /\_/\            
            >^.^<.---.       
           _'-`-'     )\     
          (6--\ |--\ (`.`-.  
              --'  --'  ``-' 
YES
2 16 30
    |                         
 #######                      
 #######                      
 #######                      
 #######                      
                              
            ,                 
           \)\_               
          /    '. .---._      
        =P ^     `      '.    
         `--.       /     \   
         .-'(       \      |  
        (.-'   )-..__>   , ;  
        (_.--``    (__.-/ /   
                .-.__.-'.'    
                 '-...-'      
NO

Улыбочку!

Жадный алгоритм реализация

Начались каникулы, и дядя Фёдор, изрядно соскучившись по своим школьным друзьям, пригласил их всех в гости к себе в Простоквашино. После некоторых раздумий n из них согласились приехать. Взяв с собой все необходимые для отдыха на природе вещи, они приехали на вокзал покупать билеты. Выяснилось, что в поездах, идущих до Простоквашино, есть только купейные вагоны. В каждом вагоне всего k4 четырехместных купе и k2 — новых двухместных купе. Кроме друзей дяди Фёдора, никто не хочет ехать в Простоквашино, поэтому все места в поезде пока свободны. Друзья решили, что они хотят поехать все в одном вагоне: вместе ведь веселее. Чтобы поездка запомнилась надолго, один из друзей дяди Фёдора, Женя, решил одолжить у папы фотоаппарат «Зенит» и сфотографировать всех участников поездки, сидящих каждый на своем месте в поезде, по одному снимку на купе. Но пленка дорогая, а проявка — это долго и нудно, поэтому Женя попросил купить билеты так, чтобы вся дружная компания занимала как можно меньше купе. Помогите Жене посчитать, сколько в лучшем случае ему понадобится кадров, чтобы сфотографировать всю компанию, то есть посчитайте, сколько минимально купе они должны занять.

Входные данные
В первой и единственной строке вводятся числа n, k4 и k2 — количество друзей дяди Фёдора, едущих в Простоквашино, количество четырехместных купе в вагоне и количество двухместных купе в вагоне соответственно (1≤n≤1018, 0≤k4≤1018, 0≤k2≤1018).

Выходные данные
Выведите одно целое число — минимальное количество купе, в которых можно разместить всех друзей дяди Фёдора. Если же разместить всех друзей в одном вагоне не получится, выведите −1.

Примеры
Входные данные Выходные данные
1 10 5 3 3

Надежный пароль

Алгоритмы обработки реализация

Восьмиклассник Вениамин использует в качестве паролей только слова, которые есть в словаре, лежащем у него дома. Еще Вениамин знает, что его пятилетний брат Денис мечтает взломать его страницу в одной популярной социальной сети. Каждый раз, когда Вениамин вводит пароль, Денис стоит рядом и пытается запомнить, какие же кнопки его брат нажимает на клавиатуре. К сожалению, у Дениса не очень хорошая память, поэтому запоминает он только первую букву пароля, а когда Вениамин уходит в школу, берет словарь, лежащий у них дома (Денис точно знает, что Вениамин в качестве пароля использует слово из этого словаря), и по очереди пробует в качестве пароля все слова, начинающиеся на эту букву, причем пробует их в алфавитном порядке.

По списку всех слов в словаре помогите Вениамину выбрать пароль. Он должен быть такой, чтобы Денису пришлось перебрать как можно больше вариантов, прежде чем он найдет нужный.

Входные данные
В первой строчке вводится N — количество слов в cловаре (1 ≤ N ≤ 103). В следующих N строчках вводятся слова — строки длиной не более 255 символов, состоящие только из маленьких латинских букв. Слова отсортированы в алфавитном порядке.

Выходные данные
Выведите искомый пароль. Если подходящих паролей несколько, выведите тот, который идёт в словаре позже всех остальных.

Примеры

Входные данные Выходные данные
1 7
arhimed
computer
contest
informatics
programming
python
team
python

Автомат по продаже билетов

Жадный алгоритм реализация

В Московском метрополитене вновь появляются автоматы для продажи билетов. Вас просят написать программу, которая будет рассчитывать, какую сдачу и какими купюрами и монетами требуется выдать пассажиру.

Входные данные
Вводится сначала стоимость билета, который хочет приобрести пассажир, затем общее количество купюр и монет, которые он опустил в автомат, а затем достоинства каждой из этих купюр и монет. Входные данные записаны в одной строке и разделены пробелами. Известно, что сумма всех купюр больше, чем стоимость билета. Во всех тестовых примерах стоимость билета – натуральное число, не превосходящее 1 000 рублей, количество купюр и монет не более 50, достоинство каждой не превосходит 500 рублей. Общая сумма денег, опущенных в автомат покупателем, превосходит стоимость билета.

Выходные данные
Программа должна вычислить, какими купюрами и монетами можно выдать сдачу, и вывести достоинство каждой из этих купюр или монет в произвольном порядке. Автомат может выдавать сдачу купюрами в 10, 50, 100 и 500 рублей, а также монетами в 1, 2 и 5 рублей. Если решений несколько, требуется выдать одно любое из них. Если решений нет, требуется выдать текст:

Sorry! Our monetary system is not perfect!
Please, choose another way to pay!
Thank you!

Примеры
Входные данные Выходные данные
1 100 1 500 50 100 100 100 50

Космические шахматы

реализация Задачи на моделирование

В космические шахматы играют на бесконечной доске, поэтому клетки нумеруют парой чисел (см. пример и рисунок к нему). Фигуры ходят по обычным правилам. Составьте маршрут шахматного коня из клетки (0; 0) в заданную клетку (x; y).
Напомним, что конь за один ход перемещается на одну клетку по одной оси и на две по другой, то есть, например, из клетки (0; 0) он за один ход может попасть в клетки (1; 2), (2; 1), (-1; 2), (2; -1), (1; -2), (-2; 1), (-1; -2) и (-2; -1).

В качестве ответа Вам нужно вывести любой (не обязательно кратчайший) маршрут с началом в (0; 0) и концом в (x; y), длина которого не больше 105 ходов.

Формат входных данных
Программа получает на вход два целых числа x и y, записанных в отдельных строках, - координаты конечной клетки маршрута коня. Клетка (x; y) не совпадает с началом координат. |x| <= 105, |y| <= 105.

Формат выходных данных
Программа должна вывести последовательность ходов, один ход в отдельной строке. В i-й строке должно быть выведено два числа xi и yi через пробел - координаты клетки, в которой окажется конь после i-го хода. Количество ходов не должно превышать 105. Последний ход должен вести в заданную клетку
 

Ввод Вывод
-2
2
-2 1
0 2
-1 0
-2 2

Рисунок к примеру

Tripleswap - 1

реализация жадные алгоритмы

Компания ADM представила новый квантовый процессор. Благодаря нему очень быстро можно применять функцию «tripleswap» к некоторому массиву a.

tripleswap(i, j, k, x, y, z) — переставляет элемент, который стоит на позиции i на позицию x, элемент с позиции j на позицию y и элемент с позиции k на позицию z. При этом i, j, k, x, y и z — корректные индексы массива, множество {i,j,k} совпадает с множеством {x,y,z}, а также выполняется условие, что i, j, k различны между собой и x, y, z различны между собой.

Таким, образом, пусть есть массив, содержащий первую перестановку из пяти элементов [1,2,3,4,5]. Если применить к нему tripleswap(1, 5, 4, 5, 1, 4) получится массив [5,2,3,4,1]. При этом, выполнить tripleswap(1, 5, 4, 5, 2, 4) или tripleswap(1, 5, 1, 5, 1, 1) нельзя, так как такие наборы аргументов считаются некорректными.

Вас пригласили протестировать возможности нового процессора. Для первого теста вам дана перестановка из n чисел, нужно отсортировать ее по возрастанию при помощи функции tripleswap, вызвав данную функцию не более, чем n/2 раз (деление целочисленное, 5/2=2).

Входные данные

В первой строке дано одно натуральное число n — размер перестановки (3≤n≤100).

Во второй строке заданы n чисел ai — элементы перестановки (1≤ai≤n). Гарантируется, что все ai попарно различны.

Выходные данные

В первой строке выведите одно число m — число вызов функции tripleswap, которые сортируют данную перестановку требуемым способом.

В каждой из следующих m строк выведите по шесть чисел — аргументы для каждого вызова функции.

Если есть несколько решений, разрешается вывести любое.
 

Ввод Вывод
5
1 2 3 4 5
0
5
5 4 3 2 1
2
2 4 5 4 5 2
1 2 5 5 1 2


Примечание
В первом тесте последовательность уже отсортирована, поэтому потребуется ноль вызовов данной функции. Во втором тесте изменение элементов массива будет выглядеть следующим образом: [5,4,3,2,1]⇒[5,1,3,4,2]⇒[1,2,3,4,5].

Пропуск в общежитие - 1

Алгоритмы обработки реализация

На входе в общежитие стоит турникет. Чтобы через него пройти, требуется приложить пропуск. Пропуск надо прикладывать и при входе в общежитие и при выходе из него. Для того, чтобы исключить несанкционированные проходы, пропуск не работает два раза подряд на вход и два раза подряд на выход.

Однако, хитрые студенты придумали, как обойти это ограничение. Чтобы войти или выйти вдвоем по одному пропуску, они прикладывают его с нужной стороны, потом с противоположной, но никто не проходит, а затем снова с нужной. 

Начальник охраны решил разобраться с данной проблемой и сделать выговоры всем нарушителям. По каждому событию входа/выхода есть запись в журнале событий. Он считает нарушителями тех владельцев пропусков, у которых произошло три события вида вход-выход-вход менее чем за dt минут.

Вам дан журнал событий турникета. Требуется вывести список тех студентов, кому будет сделан выговор

Входные данные
В первой строке задано два числа n и dt — число записей в журнале событий турникета и ограничение времени, выбранное начальником охраны, соответственно (1≤n≤1000, 3≤dt≤1440).
В следующих nn строках даны записи в журнале событий в хронологическом порядке. Запись в журнале состоит из трех частей, разделенных пробелом:

  •  Время события в формате hh:mm
  •  Фамилия студента, состоящая из не более чем 20 букв латинского алфавита, первая из которых заглавная.
  •  Тип события: in, если произошел вход и out, если произошел выход.

Гарантируется, что не существует двух событий, которые происходят одновременно. Также гарантируется, что у любых двух разных студентов разные фамилии и у одного студента не бывает двух событий одного типа подряд.


Выходные данные
В первой строке выведите число нарушителей. После чего выведите фамилии нарушителей в лексикографическом порядке.
 

Ввод Вывод
6 10
01:23 Petrov in
01:24 Ivanov out
01:25 Petrov out
01:27 Ivanov in
01:32 Petrov in
01:33 Ivanov out
1
Petrov
6 10
01:23 Petrov in
01:24 Ivanov out
01:25 Petrov out
01:27 Ivanov in
01:33 Petrov in
01:34 Ivanov out
0



 

Музыкальный плейлист

Жадный алгоритм реализация

Недавно Вася решил, что все существующие алгоритмы сортировки слишком сложны, и обязательно должен существовать более простой и эффективный алгоритм.
Для начала Вася решил рассмотреть следующий алгоритм: по данному массиву целых чисел a размером n, он создает пустой массив b, а дальше на каждой из n последующих итераций будет брать k-й элемент массива a (или последний, если такого нет), удалять его из a, а затем записывать в конец b. Таким образом, после n итераций Вася планирует в качестве массива b получить отсортированный по возрастанию массив a.
Однако, протестировав на нескольких примерах, Вася понял, что этот алгоритм работает не всегда. Так, например, если исходный массив a=[1,2,3,4] и k=2, то после 4 итераций массив b вовсе не будет отсортированным:
После первой итерации в b добавляется число 2, а массив a равен [1,3,4];
После второй итерации в конец b добавляется число 3, а массив a равен [1,4];
После третьей итерации в конец b добавляется число 4, а массив a равен [1];
На последней, четвертой итерации, в конец b добавляется число 1, а массив a становится пустым;
Таким образом, итоговый массив b будет выглядеть так: [2,3,4,1]. Нетрудно заметить, что он не является отсортированным по возрастанию. Однако, Вася решил так легко не сдаваться и по данному числу k научиться находить такой массив a, содержащий перестановку последовательности натуральных чисел от 1 до n, который будет сортироваться по возрастанию методом, описанным выше. Помогите ему - по данным числам n и k найдите хотя бы один подходящий массив a.

Формат входных данных
В единственной строке содержится два числа n и k - размер массива и номер элемента, берущегося на каждой итерации, соответственно (1≤k≤n≤1000).

Формат выходных данных
В единственной строке через пробел выведите n чисел - элементы массива, который отсортируется по возрастанию способом Васи. Если существует несколько ответов, выведите любой.
 

Ввод Вывод
5 1 1 2 3 4 5
5 5 5 4 3 2 1

Факультеты Хогвартса

Цикл for Ввод, вывод данных реализация

Обычно, прежде чем в 11 лет поступить в Хогвартс, дети-волшебники воспитываются дома, потому что нельзя быть уверенным, что они смогут скрыть свои волшебные способности от одноклассников-маглов. Например, детей Уизли учила миссис Уизли в Норе.
В Хогвартсе 4 факультета. Четыре факультета в Хогвартсе соответствуют четырем элементам: Гриффиндор – огонь, Когтевран – воздух, Пуффендуй — земля, Слизерин – вода.
У каждого факультета имеется свой флаг. 
Напишите программу, которая по данному числу n от 1 до 9 выводит на экран n флагов. Изображение одного флага имеет размер 4×4 символов, между двумя соседними флагами также имеется пустой (из пробелов) столбец.
Разрешается вывести пустой столбец после последнего флага. Внутри каждого флага должен быть записан его номер — число от 1 до n.

Входные данные
Вводится натуральное число.

Выходные данные 
Выведите ответ на задачу.

Примеры
Входные данные Выходные данные
1 3
+___ +___ +___ 
|1 / |2 / |3 / 
|__\ |__\ |__\ 
|    |    | 

Дом у озера

Задачи на моделирование реализация

Есть озеро, рядом с которым хотят построить дом. Архитектурный проект (форма дома) уже утверждён, можно только выбрать расположение дома так, чтобы он оказался рядом с озером. Желательно выбрать расположение дома рядом с озером так, чтобы у как можно большего числа жителей дома окна выходили на озеро, то есть чтобы длина общей границы дома и озера была максимальной.

План дома и озера задан в виде изображения на клетчатой бумаге, в котором отмечены клетки, принадлежащие дому и озеру. Первая строка входных данных содержит число N – количество строк в плане дома и озера. Вторая строка входных данных содержит число M – количество столбцов в плане дома и озера.

Следующие N строк содержат по M символов – план дома. Символ «.» в этих строках обозначает пустую клетку, символ «H» обозначает» обозначает клетку дома. План дома является связной областью и не содержит «дырок» внутри. В плане есть хотя бы одна клетка, принадлежащая дому. Следующие N строк по M символов в каждой содержат план озера, в этих строках символ «.» обозначает пустую клетку, символ «W» обозначает клетку, занятую озером. План» обозначает клетку, занятую озером. План озера является связной областью и не содержит «дырок» внутри. В плане есть хотя бы одна клетка, принадлежащая озеру.

Программа должна вывести одно число – максимальное значение длины общей границы дома и озера, измеряемую в сторонах клетки. При расположении дома рядом с озером его можно передвигать, но нельзя делать повороты и отражения. Вокруг озера есть неограниченное свободное пространство, дом может располагаться с любой стороны от озера.
Числа N и M являются целыми, положительными, не превосходят 15.
 

Ввод Вывод Примечание
5
6
......
.HHHH.
.HHHH.
.HHHH.
......
..WWW.
..WWW.
..WWW.
..WWW.
..WWW.
3       . . . . W W W
H H H H W W W
H H H H W W W
H H H H W W W
      . . . . W W W
5
7
...HHH.
.H...H.
.H.HHH.
.H.H...
.HHH...
.......
..WWWWW
WWW...W
W.W...W
..W....
11

Ёж

Жадный алгоритм реализация

Тем временем Ёж решил покатать шары из снега. В итоге у него получилось N шариков с диаметрами a1, a2, … an, все они различны. Из них он хочет собрать как можно больше НОРМАЛЬНЫХ снеговиков. Нормальный снеговик состоит из трёх шаров, диаметр которых снизу вверх строго уменьшается. Сколько максимум снеговиком он сможет собрать?

Ввод Вывод
6
2
3
4
5
6
7
2

(с) Манаев И., Кашукова М., 2018 г.

Лифт в бизнес-центре

Жадный алгоритм Задачи на моделирование реализация

Рабочий день закончился, и сотрудники бизнес-центра собрались по домам. Бизнесцентр представляет собой N-этажное здание, этажи пронумерованы от 1 до N снизу вверх. Все сотрудники хотят спуститься на парковку, которая расположена в подвальном помещении на один этаж ниже первого. Бизнес-центр оборудован лифтом, который может перевозить не более K человек одновременно. Лифт перемещается вверх или вниз на один этаж за одну секунду, посадка и высадка пассажиров происходят мгновенно. Изначально лифт расположен на уровне парковки. Известно, сколько людей хотят спуститься на парковку с каждого
из N этажей. Определите, какое минимальное время потребуется, чтобы перевезти на парковку всех сотрудников бизнес-центра.
 
Первая строка входных данных содержит наибольшее возможное число людей в лифте K, 1 ≤ K ≤ 109
Вторая строка содержит число этажей в бизнес-центре N, 1 ≤ N ≤ 105
 
Следующие N строк содержат целые неотрицательные числа – число людей, ожидающих лифт на 1, 2, … , N-м этаже соответственно, эти числа не превосходят 109  каждое. В здании находится хотя бы один человек. 

Программа должна вывести ровно одно целое число – наименьшее время в секундах, за которое всех людей можно перевезти на парковку.

Ввод Вывод Примечание
2
3
3
0
1
8 Лифт перевозит 2 человек, в здании 3 этажа. Лифт поднимается на первый этаж за 1 с, забирает 2 человек и за 1 с спускается на парковку, затем лифт поднимается на первый этаж, забирает 1 человека, вместе с ним поднимается на третий этаж, забирает 1 человека и спускается на парковку. Подъём на третий этаж занимает 3 с, спуск – ещё 3 с.

Плацкартный вагон

Алгоритмы обработки реализация

В плацкартном вагоне 54 места, пронумерованных числами от 1 до 54. Вагон разбит на 9 купе. Первые 36 мест расположены по левую сторону от прохода, места 1–4 находятся в первом купе, места 5–8 – во втором и т. д. В девятом купе находятся места с номерами 33– 36. По правую сторону от прохода находятся боковые места, их номера от 37 до 54, причём они нумеруются в противоположном направлении: места 37 и 38 находятся напротив девятого купе, а места 53 и 54 – напротив первого. Ниже приведена схема всех мест в вагоне.


Группа школьников едет на олимпиаду и будет всю дорогу крутить спиннеры. 
Поэтому им нужно купить места в нескольких подряд идущих купе вместе с прилегающими боковыми местами. Даны номера свободных мест в поезде. Определите, какое наибольшее число подряд идущих купе полностью свободны. 
 
Программа получает на вход число N – количество свободных мест в вагоне (0 ≤ N ≤ 54). Следующие N строк содержат номера свободных мест – различные числа от 1 до 54 в произвольном порядке, по одному числу в строке. 
Программа должна вывести одно целое число – максимальное число подряд идущих свободных купе (купе – 4 места слева от прохода и 2 боковых места) в этом вагоне.

Ввод Вывод Примечание
12
5
6
3
4
8
7
51
9
10
54
49
52
1 Свободно одно купе с местами 5, 6, 7, 8, 51, 52.
1
1
0
В вагоне только одно свободное место, поэтому
свободных купе нет совсем.

Битая кодировка

Простые числа и разложение на множители реализация

–Т—Л–≤–µ–і–Є—В–µ –і–≤–∞–і—Ж–∞—В—М –њ–µ—А–≤—Л—Е –њ—А–Њ—Б—В—Л—Е —З–Є—Б–µ–ї
 

Тяжелая, вариант-1

Задачи на моделирование Использование сортировки реализация

Гриша пишет дипломную работу на тему автостоянок в Берляндии. В ходе дипломной работы ему потребовалось решать следующую задачу.

Машины в Берляндии представляют собой отрезки длинной l. Автостоянка представляет отрезок на прямой [0;M]. В точке 0 и точке M находятся стены. В некоторых точках Xi этого отрезка могут стоять машины, то есть левая граница отрезка, образующего машину, находится в точке Xi. Уже стоящие на стоянке машины не пересекаются, но могут стоят вплотную друг к другу или к стене.

Требуется поставить на стоянку еще одну машину, которая приехала из другой страны. Причем машина не должна выходить за границы стоянки и пересекаться с другими машинами. Гриша хочет выяснить, какую наибольшую длину может иметь приехавшая машина, чтобы ее можно было поставить в некоторую точку, принадлежащую стоянке. Причем машину поставить на стоянку не так просто, поэтому слева и справа расстояние от границ приехавшей машины до ближайшего препятствия (другой машины или стены) должно быть не меньше некоторого b.

С учетом этих требований найдите наибольшую длину автомобиля, который можно поставить на стоянку.

Входные данные 

В первой строке записаны четыре целых неотрицательных числа n, M, l и b (0 ≤ n ≤ 100, 1 ≤ M ≤ 100000, 1 ≤ l ≤ 100000, 0 ≤ b ≤ 100000) — количество автомобилей на стоянке, длина стоянки, длина автомобиля в Берляндии и необходимое расстояние от границ приехавшего автомобиля до ближайшего препятствия.

В следующей строке находятся n неотрицательных чисел Xi (Xi < M) — точки, в которых располагаются левые границы машин.

Гарантируется, что машины не пересекаются между собой, а также со стенами, но возможно соприкасаются.

Выходные данные

Первая строка должна содержать число L — максимально возможную длину автомобиля, который можно поставить на стоянку с учетом вышеизложенных требований.

Если не существует машины, которую можно было бы поставить, удовлетворяя все условия, выведите 0.

Пример входных и выходных данных

Ввод Вывод
4 21 1 1
7 12 3 16
2
4 30 3 1
24 5 11 18
3
2 20 3 1
7 10
5

Сложные пароли

Комбинаторика Простые задачи на перебор реализация

Как известно, в интернете достаточно часто взламывают аккаунты. Вот и Аркадию снова пришло уведомление, что его пытались взломать. Он хочет придумать сложный пароль, но такой, чтобы его было легко запомнить. Он легко запоминает пароль, если он состоит из его любимых слов и комбинаций цифр, и считает его достаточно сложным, если все его любимые слова чередуются с любимыми наборами цифр. У него есть список таких слов и наборов цифр, помогите ему подобрать максимальное число таких комбинаций таких. 
 
Ввод:
в первой строке вводится n - количество слов и наборов цифр, в следующих n строках вводятся слова / наборы цифр. (n<20, длина строк не превышает 20). 
Вывод:
Необходимо вывести все возможные перестановки слов и наборов цифр, если это невозможно, вывести "unreal".

Ввод Вывод
3
cat
123
215
123cat215
215cat123


(с) Вероника Пеутина

Слажал - отжался

Использование сортировки реализация

Когда в очередной раз на уроке физкультуры дети не смогли сразу выстроиться по росту и это заняло 5 минут занятия, физрук придумал новое правило. Дети заходят все вместе и сразу встают в ряд. После этого могут меняться местами только два школьника, стоящих рядом. При этом они, конечно же, должны отжаться столько раз, какая у них оказалась разница в росте. Сколько раз в результате суммарно отожмутся школьники, прежде чем у них получится выстроиться по росту в порядке убывания?
 
Формат входных данных
В первой строке число содержится число N (2 <= N <= 1000)  количество детей в классе. В
следующей строке записана исходная расстановка школьников: N чисел через пробел, i-е число
обозначает рост i-го школьника ri (1 <= ri <= 109) в нанометрах.
 
Формат выходных данных
Одно число  суммарное количество отжиманий. Гарантируется, что школьники суммарно отожмутся не более 2 · 109 раз.

Ввод Вывод
3
1 2 3
8

Замечание
В примере школьники с ростом 1 и 2 поменяются местами и каждый отожмјтся по разу, затем школьники 1 и 3 (каждый отжимается 2 раза, суммарно плюс 4 отжимания), и последними школьники 2 и 3 (плюс 2 отжимания).

Очень Важный Объект

геометрия Задачи на моделирование реализация

Антон  сторож на очень важном объекте. Как и положено всем важным объектам, он обнесён забором. Правда, время не пощадило этот забор, и в нём есть дыры, через которые на объект могут попадать нарушители.
Известно, что изначально забор состоял из n столбов и n соединяющих их секций. Забор ограничивал территорию, являющуюся выпуклым многоугольником. Однако, со временем, некоторые секции забора развалились и теперь через эти дыры можно почти беспрепятственно пройти внутрь:  Антону сложно следить за всеми дырами в заборе. Известно, что в заборе нет двух отсутствующих секций подряд.

Поняв, что, если на объект будет попадать слишком много нарушителей, Антон решил взять инициативу в свои руки и заделать некоторые дыры. Для этого он попросил у начальства моток колючей проволоки. Полученный им моток из l метров колючей проволоки нужно будет потом вернуть в целости, поэтому Антону запрещено его резать. Антон может закрепить один из концов мотка с проволокой в любом месте на границе объекта.
 
После чего, он может пойти вдоль границы по или против часовой стрелки, разматывая моток, и закрепить второй конец там, где он остановился. Он хочет выбрать место, с которого ему нужно начинать так, чтобы оставшиеся в заборе дыры имели минимально возможную длину. Помогите ему определить эту длину.
 
Формат входных данных
В первой строке входного файла содержится три целых числа n (3 <= n <= 105)  количество столбов в заборе, l (0 <= l  <= 1018)  длина выданного Антону мотка проволоки и k (0 <= k   <=n/2) количество дыр в заборе.
Во второй строке по возрастанию заданы k чисел ai (1 < ai <= n). Числу ai соответствует отсутствие секции забора между столбами ai и ai+1 mod n. Гарантируется, что из двух соседних секций хотя бы одна не отсутствует.
В следующих n строках находится по два целых числа xi и yi (|xi| <= 1018, |yi| <= 1018)  координаты i-го столба забора. Многоугольник может быть задан в порядке обхода как по, так и против часовой стрелки.

Формат выходных данных
Выведите единственное число  минимальную суммарную длину дыр в заборе после установки колючей проволоки. Ответ будет считаться правильным, если если он отличается от правильного не более, чем на p · 10?6
, где p  периметр многоугольника.

Примеры
Ввод Вывод
6 4 3
1 3 5
0 0
3 0
4 1
3 2
0 2
-1 1
2.82842712474619

Тяжелая, вариант -2

реализация Использование сортировки

На уроке информатики учитель рассказал Васе про новый вид строк — максимально-символьные строки. Строка называется максимально-символьной, если символ, который встречается в ней максимальное количество раз, единственен. Например, строка "abacaba"максимально-символьная, потому что единственный символ, который встречается максимальное количество раз в ней — 'a'. В то же время строка "cabacbac" — не максимально-символьная, потому что символы 'a' и 'c' встречаются в ней максимальное количество раз, то есть не являются единственными.

После урока Вася сразу начал думать над следующей задачей: из данного набора символов составить как можно меньше максимально-символьных строк, используя все символы из набора ровно по одному разу в любом порядке. Вася не смог придумать решение этой задачи, поэтому обратился за помощью к вам. Помогите ему!

Входные данные

В единственной строке записана строка s, характеризующая набор символов. Ее длина не превосходит 100.

Выходные данные

В первой строке требуется вывести минимальное количество максимально-символьных строк k, которое можно составить из данного набора, использовав каждый символ ровно один раз.

В следующих k строках выходного файла требуется вывести максимально-символьные строки составленные из данного набора.

Если существует несколько правильных ответов, разрешается вывести любой из них.

Пример входных и выходных данных

Ввод Вывод
abacaba 1
abacaba
abcabc 2
aab
ccb
abc 3
a
b
c
cabacbac 2
bcb
acaca

Тяжелая, вариант-1

реализация Разбор случаев

На уроке информатики учитель рассказал Васе про новый вид строк — минимально-символьные строки. Строка называется минимально-символьной, если символ, который встречается в ней минимальное количество раз, единственен. Например, строка "abacaba"минимально-символьная, потому что единственный символ, который встречается минимальное количество раз в ней — 'c'. В то же время строка "cababac" — не минимально-символьная, потому что символы 'b' и 'c' встречаются в ней минимальное количество раз, то есть не являются единственными.

После урока Вася сразу начал думать над следующей задачей: из данного набора символов составить как можно меньше минимально-символьных строк, используя все символы из набора ровно по одному разу в любом порядке. Вася не смог придумать решение этой задачи, поэтому обратился за помощью к вам. Помогите ему!

Входные данные

В единственной строке входного файла input.txt записана строка s, характеризующая набор символов. Ее длина не превосходит 100.

Выходные данные

В первой строке выходного файла output.txt требуется вывести минимальное количество минимально-символьных строк k, которое можно составить из данного набора символов, использовав каждый символ ровно один раз.

В следующих k строках выходного файла требуется вывести минимально-символьные строки, составленные из данного набора символов.

Если существует несколько правильных ответов, разрешается вывести любой из них.

Пример входных и выходных данных

 
Ввод Вывод
abacaba 1
abacaba
abcabc 2
abb
acc
abc 3
a
b
c
cababac 2
bcb
acaa

Легкая, вариант -1

Задача на реализацию реализация

В Берляндии каждый автомобиль имеет регистрационный номер. Автомобильные номера в Берляндии имеют следующий вид: LDDLDDL, где символ L обозначает строчную латинскую букву, а D цифру.

Филипп устроился работать в службу регистрации автомобильных номеров. По своей неопытности в первый же день работы Филипп разлил на стопку номеров кофе. У некоторых номеров оказался залит первый блок цифр (цифры на позициях 2 и 3).

Филипп считает, что все номера в Берляндии уникальны, поэтому он хочет быстро подобрать все залитые цифры, так чтобы среди всех номеров не было двух одинаковых. Задача показалась ему нерешаемой, и он попросил вас помочь ему.

Формат входных данных

В первой строке входных данных записано натуральное число n, не превосходящее 1000 — количество номеров в стопке.

В следующих n строках находятся n регистрационных номеров, в i+1-й строке i-й номер, в описанном выше формате. На месте залитых цифр находятся знаки вопросов.

Гарантируется, что знаки вопроса могут находиться только на месте цифр из первого блока цифр, причем либо на позициях обеих цифр, либо ни на одной из позиций.

Формат выходных данных

Первая строка выходного данных должна содержать NO, если в стопке были одинаковые номера. Иначе первая строка должна содержать YES, а далее n строк должны содержать номера из стопки — по одному в каждой строке, причем i+1-я строка должна содержать i-й номер. Номера должны удовлетворять принятому в Берляндии формату в том же порядке, что и во входных данных.

Если ответов несколько — разрешается вывести любой.

Обратите внимание, что Филипп хочет восстановить только залитые цифры, то есть он должен заменить только знаки вопросов цифрами, другие символы в номерах измениться не должны. 
 

Ввод Вывод
4
a10a10c
a??b30c
a??b30c
x??r70r
YES
a10a10c
a10b30c
a22b30c
x37r70r
3
a10b00c
a10b00c
c03y02x
NO
2
a??a99b
a??a99b
YES
a11a99b
a22a99b


 

Легкая, вариант-2

Алгоритмы обработки реализация

Вы занимаетесь разработкой системы по продаже билетов на поезда. Несмотря на то, что поезда ходят по множеству различных маршрутов, вы будете работать только с одним из них. Маршрут рассматриваемого поезда состоит из n остановок: маршрут начинается в первой из них, а заканчивается в n-й, соответственно. Всего в поезде имеется m мест для пассажиров.

Эта система будет использоваться для продажи билетов пассажирам. При покупке билета пассажир указывает номер станции L, на которой он хочет сесть на поезд и номер станции R, на которой он хочет сойти с поезда. Если у одного пассажира есть билет до станции S, а другой хочет купить билет от станции S, то они друг другу не мешают: второй может занимать только что освободившееся место первого. Система должна сообщить пассажиру следующую информацию:

  • f, где f  число свободных мест мест между L-й и R-й станциями, если хотя бы одно такое место есть. В этом случае пассажир покупает один билет с L-й по R-ю станцию.
  • 0 если подходящих свободных мест нет. В этом случае пассажир билет не покупает.

Входные данные

В первой  находятся натуральные числа n (2 ≤ n ≤ 100), m (1 ≤ m ≤ 100) и k (1 ≤ k ≤ 100) — число станций в маршруте поезда, максимальное число пассажиров в поезде и число обращений обращений пассажиров к системе покупки билетов.

Следующие k строк содержат по два натуральных числа Li и Ri (1 ≤ Li < Ri ≤ n)  — начальная и конечная станции в i-м обращении к системе.

Выходные данные

Для каждого запроса на покупку билета в своей строке выведите ответ системы: число билетов, которые можно купить на данный маршрут, или 0, если ни одного билета купить нельзя.

Пример входных и выходных данных

Ввод Вывод
5 2 4
1 4
1 3
2 5
3 5
2
1
0
1

Тяжелая, вариант-1

Задачи на моделирование реализация

Мальчик Гриша прочитал в одном научном журнале, что не так давно астрономы открыли новую планету, на которой как и на Земле существует жизнь. Ученые уже установили связь с ее жителями и успели выяснить, что эта планета обращается вокруг своей оси за другое время, поэтому сутки здесь длятся не 24 часа. На ней, так же как и на Земле, время измеряется часами, минутами и секундами. Но количество минут в часе, и секунд в минуте не совпадает с привычными земными.

А именно: в одном часе A минут, в одной минуте B секунд. Также, в одних сутках на этой планете X часов, Y минут Z секунд. То есть когда часы должны показать момент времени X:Y:Z, они показывают 0:0:0, и с этого момента начинается отсчет новых суток

Электронные часы здесь выглядят так же, как и на Земле: на них есть дисплеи для отображения часов, минут и секунд. Каждый из дисплеев содержит минимальное количество десятичных разрядов, которое требуется, чтобы отобразить любое количество часов, минут и секунд в течении суток, соответственно. Когда на дисплее показывается число с меньшим количеством разрядов, то оно дополняется ведущими нулями. В остальном часы на этой планете работают аналогично земным электронным часам.

Гриша увлекается нумерологией, поэтому его интересует вопрос: сколько хороших моментов времени на часах этой планеты будет показано с момента времени H1:M1:S1 до момента времени H2:M2:S2 включительно. Гриша называет момент времени хорошим, если в нем содержится хотя бы одна цифра c, то хотя бы один из дисплеев содержит (с учетом вышеописанных правил) цифру c.

Входные данные

В первой строке находятся два натуральных числа A, B (1 ≤ A, B ≤ 50) — количество минут в часе и секунд в минуте.
В следующей строке находятся три целых числа X, Y, Z (0 ≤ X ≤ 50, 0 ≤ Y < A, 0 ≤ Z < B) — количество часов, минут и секунд в сутках. Гарантируется, что X, Y, Z одновременно не равны нулю.
В следующей строке находятся три целых числа H1, M1, S1— стартовое время. Гарантируется, что это время, которое часы могут отобразить в течении суток.
В следующей строке находятся три целых числа H2, M2, S2— конечное время время. Гарантируется, что это время, которое часы могут отобразить в течении суток.
Обратите внимание, что моменты времени могут находиться в разных сутках. Также обратите внимание, что моменты времени могут совпадать. В этом случае в интервале находится единственный момент времени.
В следующей строке находится цифра c (0 ≤ c < 10).

Выходные данные

Требуется вывести одно число — количество хороших моментов времени с H1:M1:S1 до H2:M2:S2 включительно. 

 

Ввод Вывод
3 2
5 0 0
0 0 0
1 0 0
3
0
4 2
3 1 1
1 0 0
0 0 0
14
50 50
24 0 0
3 0 0
18 15 0
7
11295

Легкая, вариант-1

реализация Разбор случаев

Пете подарили n гирь и чашечные весы. Каждая гиря весит ai грамм. Первым делом он разложил гири на чаши. При этом одна из чаш может быть пустой. Теперь он хочет выяснить, какой наименьшей разницы весов на чашах можно достичь, не более чем за два перекладывания гирь.

Одно перекладывание происходит следующим образом: Петя выбирает некоторую гирю, лежащую на одной чаше весов и перекладывает ее на другую чашу весов. Обратите внимание, что Петя не обязан сделать ровно два перекладывания, он может сделать меньшее количество.

Входные данные

В первой строке находится одно натуральное число n (1 ≤ n ≤ 50) — количество гирек.
В каждой из следующих n строк находятся два натуральных числа ai, bi (1 ≤ ai ≤ 1000, 1 ≤ bi ≤ 2) — масса гири и номер чаши весов, на которой она находится.

Выходные данные

Требуется вывести одно число — наименьшую разницу весов, которую можно достичь, сделав не более двух перекладываний гирь.

Пример входных и выходных данных

Ввод Вывод
5
4 2
1 1
8 1
5 2
2 1
0
6
20 2
3 2
2 1
5 1
1 1
3 2 
6
4
3 2
10 2
8 2
9 2 
4

Легкая, вариант-2

реализация Задачи на моделирование Очередь

На складе хранятся ящики разных цветов и размеров. Каждый цвет и каждый размер имеют свой порядковый номер в информационной системе.

Перед отправкой ящики упаковывают и сортируют. Упаковка и сортировка ящиков неэффективна и происходит следующим образом:

  • Ящик под номером i поступает на склад.
  • Ищется стопка, в которой хранятся ящики с размером, равным размеру i-го. Если такой стопки нет, формируется новая стопка.
  • Поступающий ящик помещается наверх найденной или сформированной стопки.
  • Если в какой-либо стопке оказывается два верхних ящика одного цвета, то они запаковываются и отправляются адресату.
Отправка продолжается до тех пор, пока не будут обработаны все поступающие на склад ящики.

 

Ваша задача написать программу, которая сможет оценить эффективность данной системы и посчитает сколько ящиков будут отправлены после окончания обработки поступающих ящиков.

Входные данные

В первой находятся три натуральных числа n, m, k (1 ≤ n, m, k ≤ 100) — количество ящиков, поступающих на склад, количество различных размеров и количество различных цветов соответственно.
В каждой из следующих n строк находятся по два натуральных числа xi и yi (1 ≤ xi ≤ m; 1 ≤ yi ≤ k)  — номер размера и номер цвета ящика, который поступит i-м на склад.

Выходные данные

Требуется вывести одно число — сколько ящиков будут отправлены.

Пример входных и выходных данных

 
Вывод Ввод
5 2 1
1 1
2 1
1 1
2 1
1 1
4
5 1 2
1 1
1 2
1 1
1 2
1 1
0

Легкая, вариант-1

реализация Очередь

На складе хранятся ящики разных цветов и размеров. Каждый цвет и каждый размер имеют свой порядковый номер в информационной системе.

Перед отправкой ящики упаковывают и сортируют. Упаковка и сортировка ящиков неэффективна и происходит следующим образом:

  • Ящик под номером i поступает на склад.
  • Ищется стопка, в которой хранятся ящики с размером, равным размеру i-го. Если такой стопки нет, формируется новая стопка.
  • Поступающий ящик помещается наверх найденной или сформированной стопки.
  • Если в какой-либо стопке оказывается два верхних ящика одного цвета, то они запаковываются и отправляются адресату.
Отправка продолжается до тех пор, пока не будут обработаны все поступающие на склад ящики.

 

Ваша задача написать программу, которая сможет оценить эффективность данной системы и посчитает сколько ящиков останутся на складе. 
 

Входные данные

В первой строке находятся три натуральных числа n, m, k (1 ≤ n, m, k ≤ 100) — количество ящиков, поступающих на склад, количество различных размеров и количество различных цветов соответственно.
В каждой из следующих n строк находятся по два натуральных числа xi и yi (1 ≤ xi ≤ m; 1 ≤ yi ≤ k)  — номер размера и номер цвета ящика, который поступит i-м на склад.

Выходные данные

Требуется вывести одно число — сколько ящиков останутся на складе, после выполнения отправки.

Пример входных и выходных данных

Ввод Вывод
5 2 1
1 1
2 1
1 1
2 1
1 1
1
5 1 2
1 1
1 2
1 1
1 2
1 1
5

Cipher

Z-функция. Префикс-функция Поиск подстроки в строке реализация

Корвину удалось перехватить n сообщений о перемещении войск Эрика. Правда, они оказались зашифрованными, но это не беда! Вы ведь поможете ему расшифровать эти сообщения? Это должно быть не сложно, ибо Корвин знает хотя бы одну подстроку в каждом исходном сообщении.

Известно, что для шифровки Эрик использует шифр Цезаря, то есть шифр, в котором буква с номером i заменяется на букву с номером i + k, где k - некоторое число.

Так как современные компиляторы не поддерживают амберский алфавит, мы будем заменять символы на их порядковый номер - число от 1 до q, где q - количество символов в алфавите.

Каждое сообщение имеет длину x, а каждая известная подстрока его расшифровки - y.

Ваша цель - восстановить все изначальные сообщения.

СДАВШИЙ С ПОМОЩЬЮ STD::STRING ОТПРАВИТСЯ ВО ДВОРЫ ХАОСА!!!
 
Входные данные
В первой строке считываются числа n (\(1 <= n <= 100\)) и q (\(1 <= k <= 100\))
В следующих 3 * n строках содержатся числа xi, yi (\(1 <= b_i <= a_i <= 100\)) и 2 массива с числами, являющиеся сообщением и его подстрокой его расшифровки.


Выходные данные
В строке номер i выведите расшифрованный вариант сообщения с номером i.
В конце этой строки пробела быть НЕ ДОЛЖНО


Примеры
Входные данные Выходные данные
1 1 11
10 4
11 7 1 1 2 6 7 1 1 8
2 7 7 8
6 2 7 7 8 1 2 7 7 3

Пепелац Деда Мороза

математика реализация Конструктив

Ни для кого не секрет, что Дед Мороз передвигается на особом транспортном средстве, принцип которого известен только самым приближенным зайцам Дедам Мороза. Однако, зайцы немного слабы в составлении маршрутов, и вам придется помочь им.

Принцип работы транспортного средства Деда Мороза(в дальнейшем ПепеЛАЦ(Пепе Летающий агрегат Цвайхандер)) такой:
на расстоянии одного километра друг от друга в точках (0, 0) и (1, 0) были построены две станции управления пепелацами A и B. С помощью них можно мгновенно переместить любой пепелац, повернув его на 90 градусов по или против часовой стрелки относительно точки A или B. Расстояние от пепелаца до соответствующей станции при этом не меняется. Следующее перемещение можно делать как относительно той же станции, так и относительно другой.

Например, если повернуть пепелац, находящийся в точке (3, 1) на 90 градусов против часовой стрелки относительно станции A, то он переместится в точку (−1, 3), если его затем повернуть на 90 градусов по часовой стрелке относительно станции B, то он переместится в точку (4, 2), если затем повернуть его вокруг станции B по часовой стрелке еще раз, он переместиться в точку (3, −3).
Деду Морозу необходимо добраться из точки (x1, y1) в точку (x2, y2). Помогите зайцам Деда Мороза составить маршрут, чтобы ему меньше пришлось ходить по заснеженному лесу.
Поскольку перемещения мгновенные и абсолютно бесплатные(магия же), то минимизировать количество перемещений не надо.

Формат входного файла
Входной файл содержит четыре целых числа — x1, y1, x2 и y2, они не превышают 104 по
абсолютной величине.

Формат выходного файла
Выведите в выходной файл последовательность перемещений с использованием станций управления, которая перемещает пепелац из точки (x1, y1) как можно ближе к точке (x2, y2).
Поворот по часовой стрелке относительно станции A обозначается как «+A», поворот против часовой стрелки относительно станции A обозначается как «-A», соответствующие повороты относительно станции B обозначаются как «+B» и «-B». Выводите по одному перемещению на строке. Выведенная последовательность не обязана быть минимальной по количеству перемещений, но должна содержать не более 106 действий.

Примеры

Ввод Вывод
3 1
3 -3
-A   
+B
+B
0 0
3 0
-B
+B

 (с) Павел Колодкин, 12И

Шифровка

Задача на реализацию реализация

На контрольной по алгебре логики Филипп К. и Алла П. по ходу решения задачи хотят обмениваться наборами из 0 и 1, которые у них получаются. Но злобный учитель информатики очень строго следит за тем, чтобы в ходе контрольной ученики решали задачи самостоятельно. Правда, школьникам удалось воззвать к его человеческим чувствам, и он разрешил им обмениваться записками, содержание которых никак не связано с алгеброй логики.
 
К счастью, Филипп и Алла успели договориться, что они будут шифровать наборы из 0 и 1 предложениями русского языка. Слово четной длины будет обозначать 0, нечетной длины - 1, знаки препинания при расшифровке не учитываются.
 
Таким образом, расшифровать такую шифровку очень просто, а вот чтобы зашифровать какую-либо последовательность, требуется незаурядный литературный талант. Помогите им! Напишите программу, которая по введенной последовательности  из 0 и 1, строит текст, соответствующий правилам русского языка, имеющий с точки зрения языка хоть какой-то (минимальный!) смысл, и который кодирует заданную последовательность.
 
Входные данные
В файле INPUT.TXT записано сначала число N (1<=N<=100) - длина последовательности, а затем последовательность из N чисел, каждое из которых является 0 или 1.
 
Выходные данные
В файл OUTPUT.TXT выведите текст на русском языке, который кодирует заданную последовательность. Обратите внимание! В тексте не должно быть одинаковых предложений (предложения считаются одинаковыми, если они совпадают с точностью до знаков препинания, если же они различаются хотя бы порядком следования слов, они уже считаются различными). А в одном предложении ни одно из слов не должно повторяться.
 

Пустоты в кубе

Динамическое программирование: один параметр реализация

Жюри составило отчет об учебно-тренировочных сборах по информатике и собирается распечатать его на стандартном листе бумаги. Весь отчет набран одним моноширинным шрифтом, т.е. все символы (включая пробелы) имеют одинаковую ширину. Длина строки при печати этим шрифтом на листе бумаги равна S.
 
Назовем пустотой последовательность пробелов между соседними словами в строке, а также от начала строки до первого слова в ней и от последнего слова в строке до конца строки. Проблема, стоящая перед жюри, состоит в том, что научный руководитель сборов Владимир Михайлович Кирюхин отказывается читать текст, если сумма кубов длин пустот по всем строкам не минимальна. Помогите жюри расположить отчет на листе бумаги так, чтобы В.М. Кирюхин согласился его прочесть и утвердить результаты сборов.
 
Для достижения требуемого расположения текста на бумаге разрешается заменять произвольную пробельную последовательность (т.е. непустую последовательность подряд идущих пробелов или символов перевода строки) любой другой пробельной последовательностью.
 
Входные данные
Первая строка входного файла содержит целое число S (1<=S<=80). 
В последующих строках записан отчет, содержащий не более 500 слов. 
Длина каждой строки отчета не превосходит 250 символов, а длина каждого слова не превос-ходит S.
 
Выходные данные
Вывести в первую строку выходного файла минимально возможную сумму 
кубов пустот по всем строкам. В последующие строки следует вывести 
искомое расположение текста на листе бумаги.
 
Пример входного файла
30
Победители летних учебно-тренировочных сборов по информатике 1997 г.:
Владимир Мартьянов,
Анатолий Пономарев,
Николай Дуров,
Андрей Лопатин.
 
Пример выходного файла
325
     Победители     летних    
учебно-тренировочных сборов по
 информатике 1997 г.: Владимир
Мартьянов, Анатолий Пономарев,
Николай Дуров, Андрей Лопатин.
 

Веселый Новый Год

реализация Задачи на моделирование

У нас было 2 набора юного химика, 75 мятных таблеток, 5 упаковок оберточной бумаги, полфунта детских драже и целое множество подарков всех сортов и расцветок, а также машинки, куклы,  мешок вкусного оленьего корма, пинта чистого сока и стадо быстрых оленей.
Не то что бы это был необходимый запас для поездки. Но если начал развозить подарки, становится трудно остановиться.
Единственное что вызывало у меня опасение - это олени. Нет ничего более непредсказуемого, чем стадо северных оленей, кто знает чего от них ожидать?  Я догадывался, что рано или поздно они дадут о себе знать.
Самое страшное, что домов, куда нужно доставить подарки, более 10^100000000 и ребенок сильно расстроится, узнав, что не получил подарка на Новый Год. Этого допускать нельзя, благо вы - не единственный Санта, и вам будет достаточно доставить подарки только в своем городе. Детишек в вашем городе не больше 10^4, но все они живут в разных домах. У вас есть список, в котором не больше 10^4 элементов, каждый элемент списка представляет собой 2 целых числа – координаты дома следующего ребеночка.  Доставив подарки в очередной дом, вы, как порядочный Санта, обязаны стирать координаты этого дома из своего списка. Но ваши олени не хотят спокойно доставлять подарки, они коллективно прокладывают на их взгляд более оптимальный и правильный маршрут, и выбирают номер следующего дома из вашего списка по своей очень логичной и тривиальной формуле:
Nnext  = |(K1  - K2  ) *R|% L,
где Nnext – номер следующего дома в вашем списке (Как делают настоящие ТРУ-программисты? Они считают элемент с  единицы нуля!)  K1  - количество еще не посещенных домов, K2 – количество уже посещенных домов, R – коэффициент рандомности стада и L – длина текущего списка. Заметим, что после посещения дома, количество элементов в вашем списке уменьшается, вы же порядочный Санта, верно? Вечером, после тяжелого трудового дня, вы, как и остальные труженики Новогоднего фронта,  выкладываете в свой блог количество  километров, которые сегодня преодолели. Изначально вы находитесь в доме с индексом 0 и считается, что подарок в этот дом уже доставлен.  Зная столь тривиальную, понятную и очевидную формулу расчета следующего дома, а также имея список домов и  хорошо зная свое стадо, вплоть до их коэффициента рандомности, скажите какое расстояние  вы пройдете за всю поездку? Ответ округлите вверх до целых, в таких вещах можно чуть-чуть  преувеличить.  
 
Входные данные:
В первой строке входного файла находятся целые положительные числа N, R (1<N<=10000,1< R <1000000) – количество детей в вашем списке и коэффициент рандомности вашего стада, соответственно.
В следующих N строках находятся по 2 целых числа X,Y (-100000<=X,Y<=100000) – координаты конкретного  дома.
Выходные  данные:
Выведете одно целое число – ответ на поставленную задачу.
 
Пример, как же без примера:
Входит:
4 2
1 1
0 0
2 0
2 1
Выходит:
6

(с) Ярослав Свиридов 10и

Ведьмак

реализация Задача о рюкзаке

По приезде Геральда в Каэр-Морхен уже наступила зима. Вокруг стояла тишина, а окна замка приветливо светились в темноте. Редкие факелы создавали теплую и согревающую атмосферу, освещая ровный белый ковер из снега. Среди этой красоты особенно порадовал Геральда отъезд Весемира, ведь теперь можно закатить грандиозную пьянку!
Для этого на кухонный стол достали n кружек. Геральд суетился и переставлял кружки с l по r в позицию i, Ламберт с упоением доливал Ривский эль в кружки с l по r по s литров в каждую, а вот Эскель , пока никто не видит, выпивал или доливал в каждую кружку с l по r столько, чтобы в них осталось ровно по k литров в каждой. Спустя почти час Йеннифер, которой порядком надоела брань Ламберта и Эскеля, спустилась вниз, чтобы узнать причину шума. После небольшой перепалки Йеннифер решила помочь отнести кружки в главную столовую, где бурное веселье ведьмаков не мешало бы ей спать. Но так как кружки очень тяжелые, то она может унести не более l литров. Естественно, она хочет пойти спать как можно быстрее, а значит собирается унести как можно больше эля, но общим весом не более l.

Помогите Йеннифер узнать, какой максимальный вес и количество кружек с таким весом она может унести?

Формат входных данных
Дано число n(1 <= n <= 10^4) количество кружек и q(1 <= q <= 10^4) – количество операция. Далее идет описание операций(1 <= l <= r <= 10^4)
G l r i - Геральд переставляет кружки с l по r в позицию I (1  <= I <=10^4+1)(вставка отрезка производится перед указанным индексом)
L l r s - Ламберт доливает в кружки с l по r по s литров (1 <= s <= 10^3)
E l r k – Эскель выпивает из кружек с l по r так, чтобы в каждой оказалось по k литров (1 <= k <= 10^3)
Затем на новой строке идет число l(1 <= l <= 10^5) – количество литров которые может унести Йеннифер. 
Изначально в кружках по 0 литров.

Формат выходных данных
На первой строке через пробел вывести последовательность кружек после проделанных операций, а на второй строке максимальное количество кружек, которые сможет унести Йеннифер и их общий вес. 
 
Пример входных данных Пример выходных данных
5 7
L 2 5 10
G 1 3 5
L 1 4 3
L 3 3 4
E 2 3 2
E 2 2 4
E 5 5 15
15
13 4 2 13 15
2 15
 
 
5 6
E 1 1 1
E 2 2 2
E 3 3 3
E 4 4 4
E 5 5 5
G 5 5 1
10
5 1 2 3 4
4 10
5 8
E 1 1 1
E 2 2 2
E 3 3 3
E 4 4 4
E 5 5 5
G 5 5 1
G 1 1 6
G 1 5 1
10
1 2 3 4 5
4 10

Пояснения к 1 примеру
1. 0 10 10 10 10
2. 10 0 10 10 10
3. 13 3 13 13 10
4. 13 3 17 13 10
5. 13 2 2 13 10
6. 13 4 2 13 10
7. 13 4 2 13 15
Йеннифер может унести 15 литров. Это значит что она может взять либо одну кружку (15 литров или 13 литров), либо две кружки(4 и 2 литра или 13 и 2 литра). Так как она хочет унести как можно больше кружек, то ответ 2.
Пояснения к 3 примеру
1. 1 0 0 0 0
2. 1 2 0 0 0
3. 1 2 3 0 0
4. 1 2 3 4 0
5. 1 2 3 4 5
6. 5 1 2 3 4
7. 1 2 3 4 5
8. 1 2 3 4 5
Йеннифер может унести 10 литров. Наилучший вариант будет 4 и 3 и 2 и 1 литр. Ответ 4.

(с) Аксенов Владимир 10и

The Cake is a Lie

интерактив реализация Задачи на моделирование

GLaDOS приготовила для Челл новое, последнее испытание! В его рамках ей предстоит найти торт. Но всё не так-то просто — у неё отобрали портальную пушку и завязали глаза. Единственное, что Челл известно, — что она находится в прямоугольной комнате, выложенной квадратной плиткой, и что где-то в этой комнате расположен торт. Всё что остаётся делать Челл, — слепо переходить с плитки на плитку в поисках торта.

Кроме того, так как действие происходит в Лаборатории Исследования Природы Порталов, на каждой стене комнаты расположен портал, связанный с противоположной стеной. Формально: рас- смотрим комнату как прямоугольную сетку размера W × H и введем систему координат так, чтобы левая нижняя ячейка сетки имела координаты (0, 0), а правая верхняя — (W − 1, H − 1). За один шаг Челл может перейти в одну из четырёх соседних ячеек, причём попытка пройти сквозь стену приводит к тому, что Челл появляется с противоположной стороны комнаты. Например, шаг вниз из ячейки (x, 0) приведёт в ячейку (x, H −1), а шаг влево из ячейки (0, y) приведёт в ячейку (W −1, y).

Чтобы сделать испытание сложнее, GLaDOS не сообщила Челл ни размеры комнаты, ни коорди- наты её изначального положения, ни координаты торта. Более того, так как у Челл завязаны глаза, а портальная технология достигла совершенства в своём развитии, Челл даже не может определить, прошла ли она очередным ходом через портал или нет.

Челл может найти торт, только оказавшись в одной клетке с ним. Помогите ей пройти последнее испытание! Формат взаимодействия с тестирующей системой Это интерактивная задача. Ваша программа будет общаться с тестирующей системой по протоколу, описанному ниже. Вам разрешается произвести не более 200 000 ходов. Чтобы переместиться в соседнюю ячейку, выведите строку, содержащую ровно один символ, задающий направление перемещения: «U» — вверх; «D» — вниз; «L» — влево; «R» — вправо. Затем вы должны считать строку, в которой будет находиться ровно один символ, обозначающий результат перемещения: • «Y» — после произведённого хода Челл оказалась в клетке с тортом; • «N» — после произведённого хода Челл оказалась в клетке, не содержащей торт; • «E» — служебный символ, обозначающий, что после произведённого хода Челл всё ещё не нашла торт, а ваша программа превысила ограничение на количество ходов. Обратите внимание, после считывания символа «Y» или «E» вы обязательно должны сразу завершить вашу программу. В противном случае, вердикт тестирующей системы может быть некор- ректным! Гарантируется, что в клетке, в которой исходно находится Челл, нет торта. В точности соблюдайте формат выходных данных. После вывода каждой строки сбрасы- вайте буфер вывода — для этого используйте команды flush(output) на языке Паскаль или Delphi, fflush(stdout) или cout.flush() в C/C++, sys.stdout.flush() на языке Python, System.out.flush() на языке Java.

Математическое выражение

Стек реализация

Напишите программу, которая проверяет правильность расстановки скобок в математическом выражении. Используются скобки одного типа: ( ). В выражении может быть несколько уровней вложенности.

Входные данные
На вход подается символьная строка, представляющая собой арифметическое выражение.

Выходные данные
Если скобки расставлены верно, то вывести на экран слово Yes, в противном случае - No и количество неправильно расставленных скобок (скобка считается неправильно расставленной, если у нее нет пары).

 
Примеры
Входные данные Выходные данные
1 7-((X*((X+Y)/(J-3))+Y)/(4-2.5)) Yes
2 (a-c/(d) No. Incorrect brackets = 1

Три числа

реализация Перестановки

Вам дано три числа a, b и c. Вы должны в таком порядке приписать эти числа друг к другу, чтобы в результате получилось минимальное число. Например, если a = 12, b = 5, c = 3, приписыванием можно получить числа 1253, 1235, 3125, 3512, 5123, 5312. Минимальным, среди этих чисел является 1235.

Входные данные

В первой строке через пробел записаны три целых числа a, b и c (1 ≤ a, b, c ≤ 100).

Выходные данные

Выведите минимальное число, которое можно получить, приписав a, b и c друг к другу в каком-нибудь порядке.

Примеры тестов

Входные данные

12 3 5
Выходные данные
1235
Входные данные
2 21 3
Выходные данные
2123

Числа

Разбор случаев реализация

У Артура есть два натуральных числа — x и y (x < y). Помогите ему найти натуральное число z такое, что:

  • z > x;
  • z > y;
  • z не делится на x;
  • z не делится на y;
  • z делится на y - x;
  • z минимально.

Формат входных данных

В первой строке находятся числа x и y (xy ≤ 106)

Формат выходных данных

Выведите число z или '0', если его не существует.

Ввод:
1 2

Вывод:
0

Мерлин

Использование сортировки реализация Отрезки

Однажды, вернувшись в свою башню, Мерлин обнаружил, что Моргана наложила проклятие на
все его сосуды с эликсиром мудрости.
Мерлин знает, как снять проклятие, но соответствующее заклинание требует, чтобы во всех
сосудах, к которым оно применяется, было равное количество эликсира.
Чтобы добиться этого, Мерлин решил действовать следующим образом. Он выбирает несколько
сосудов и переливает весь эликсир из выбранных сосудов в оставшиеся. Он может распределить
переливаемый эликсир между оставшимися сосудами произвольным образом. После того, как весь
эликсир из выбранных сосудов перелит, Мерлин разбивает опустошенные сосуды (с них проклятие
уже не снять), выбрасывает осколки и применяет заклинание снятия проклятия к оставшимся
сосудам.
Помогите волшебнику узнать, какое наименьшее количество сосудов ему придется разбить,
чтобы снять проклятие Морганы.
Формат входных данных
В первой строке входного файла находится число n (2 ≤ n ≤ 105) — количество сосудов. Во
второй строке содержатся n чисел a1, a2, . . . , an (1 ≤ ai ≤ 109) — количество литров эликсира
мудрости в каждом сосуде.
Формат выходных данных
Выведите в выходной файл минимальное количество сосудов, которые Мерлину придется
разбить.

Пример
Ввод
3
2 3 2
Вывод
1

Ввод:
4
4 4 4 4
Вывод
0

Ввод
5
1 2 3 4 5
Вывод
2

 
В первом примере можно, например, перелить 0.5 литра эликсира из первого сосуда во второй
и 1.5 литра в третий, после чего разбить первый сосуд.
Во втором сосуды исходно содержат равное количество эликсира, можно ничего не переливать.
В третьем примере можно, например, перелить 1 литр эликсира из первого сосуда во второй, по
2 литра из пятого во второй и третий, 1 литр из пятого в четвертый, после чего разбить первый и
пятый сосуды.

Шахматы

Отрезки реализация Разбор случаев

Кроме школы и математического кружка, Вася ходит на шахматный кружок. Но играть в шахматы на обычной доске 8 × 8 ему кажется не очень интересным. Недавно он придумал свою версию шахмат, в которой игра происходит на доске, имеющей другую форму. Васина доска состоит из n столбцов, i-й из которых содержит ai клеток. Нижние клетки всех столбцов образуют один  горизонтальный ряд, причем длины столбцов упорядочены слева направо по невозрастанию. На рисунке ниже приведен пример доски, в которой три столбца, содержащих 5, 2 и 1 клетку,  соответственно.

Сегодня на шахматном кружке занятие было посвящено ладейным окончаниям, и Васю заинтересовал вопрос: как расставить минимальное число ладей на его доске так, чтобы каждую клетку поля била хотя бы одна ладья. Ладья бьет те клетки, которые расположены с ней на одной вертикали или одной горизонтали. Помогите Васе расставить на его доске минимальное число ладей требуемым образом.

Формат входных данных
В первой строке входного файла задано целое число n — количество столбцов доски
(1 ≤ n ≤ 1000). Следущая строка содержит n чисел a1, a2, . . . , an — количество клеток в столбцах
(1 ≤ ai ≤ 1000, a1 ≥ a2 ≥ . . . ≥ an).

Формат выходных данных
В первой строке выведите число k — минимальное число ладей, которое можно расставить на доске так, чтобы каждую клетку доски била хотя бы одна ладья. Следующие k строк должны содержать описание позиций ладей, по одной на каждой строке. Позиция ладьи задается двумя числами: номером столбца, в котором стоит ладья, и номером клетки в столбце. Столбцы нумеруются, начиная с 1, слева направо, клетки в столбцах нумеруются снизу вверх, также начиная с 1.
Если подходящих расстановок несколько, можно вывести любую.

Примеры
Ввод
3
5 2 1

Вывод
2
1 5
2 1