Всем привет! Сегодня раунд получился довольно интересным, поэтому я решил сделать разбор на задачи A–D1.
Полное решение:
Пусть f(x) — количество вхождений числа x в массив. При построении последовательности мы всегда ограничены минимальным f(x) среди выбранных элементов.
Если взять элемент с частотой f(x), то длина последовательности может увеличиться:
mx = max(mx, f(x) * cnt),
где cnt — количество уже добавленных элементов, включая текущий.
Так последовательно обновляем ответ и выводим mx.
Алгоритм:
- Посчитать частоты
f(x)для всех чисел. - Отсортировать или перебрать их по убыванию.
- На каждом шаге обновлять
mx. - Вывести максимальный результат.
Полное решение:
Ответ невозможен, если хотя бы один элемент от 1 до m отсутствует во всех множествах.
Теперь рассмотрим множества, где для каждого элемента количество вхождений ≥ 2 (включая учёт подмножеств). Пусть таких множеств cnt.
Если cnt ≥ 2, то мы всегда можем построить как минимум три разные конфигурации:
- взять всё множество +
sx, - взять всё множество +
sy, - взять всё множество +
sx + sy.
Значит, в этом случае решение существует.
Алгоритм:
- Проверить, что все элементы от
1доmвстречаются. - Посчитать
cnt— число множеств, удовлетворяющих условию. - Если
cnt ≥ 2, вывести "YES", иначе "NO".
Полное решение:
Разберём, как работает бинарный поиск:
- если
a[m] == i→ элемент найден; - если
a[m] > i→ двигаем правую границу; - если
a[m] < i→ двигаем левую границу.
Чтобы x был найден, элементы слева должны быть меньше него, а справа — больше.
Значит:
- если
s[i] == '1', можно поставитьans[i] = i; - если
s[i] == '0', то нужно поставитьans[i] ≠ i, сохранив корректность.
Простейшее решение — перестановка [2, 3, ..., n, 1]. Она гарантирует, что для всех позиций с 0 элемент отличается от индекса.
Особый случай: если встречается символ 0, окружённый единицами (...101...), то условие нарушается: элементу придётся соответствовать позиции, но это запрещено. Тогда ответ невозможен.
Алгоритм:
- Проверить строку на наличие "невозможного" шаблона.
- Если он найден → вывести "NO".
- Иначе построить перестановку
[2, 3, ..., n, 1]. - Вывести её как ответ.
Полное решение:
Нужно максимизировать
Σ (ai OR bi).
Пусть у нас есть перестановка p. Несложно заметить, что чтобы сделать сумму максимальной, выгодно каждому числу поставить его битовую инверсию.
Почему?
- Инверсия по битам гарантирует, что при
ORполучится максимальное количество единиц. - Это работает для любого числа в диапазоне.
Пример:
x = 9 (1001₂), инверсия = 6 (0110₂).
9 OR 6 = 1111₂ = 15.
Значит, при такой паре значение OR максимально возможное.
Алгоритм:
- Идём по всем числам от
nдо1. - Для каждого числа
xсчитаем его инверсию (по длине битовn). - Сохраняем в
mp[x]. - Формируем перестановку:
ans[i] = mp[i]
- Считаем итоговую сумму и выводим её вместе с перестановкой.



