Хлопці та дівчата#11810

Хлопці та дівчата (Розбір)

Автор задачі:

Антон Тригуб

Задачу підготував:

Олександр Гроскопф

Розбір написав:

Павло Цікалишин

10pt

Блок 1

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

Блок 2

Розглянемо задачу як граф, де вершини відповідають дівчатам, а хлопці є ребрами, що з'єднують ці вершини. Нам потрібно, щоб усі ребра в множині мали хоча б одну спільну вершину. Такі структури можуть бути лише двох типів:

  1. Зірка — всі ребра виходять із однієї вершини.

  2. Трикутник — три вершини, кожна з яких з'єднана з двома іншими.

Щоб знайти відповідь для зірки, достатньо визначити її центр і підрахувати суму всіх ребер, що виходять із цієї вершини.

Для трикутника потрібно перебрати всі ребра і знайти вершину, разом із якою вони утворюють трикутник.

Блок 3

Оскільки кожна вершина може мати не більше двох вихідних ребер, ми можемо перебрати всі вершини, що мають рівно два сусіди, і перевірити, чи ці сусіди також з'єднані між собою. Якщо так, то знайдено трикутник.

Блок 4

У цій групі достатньо для кожної вершини перебрати всі пари її сусідів . Потім перевіряємо, чи існує ребро між вершинами і . Це працює за складністю \mathcal{O}(n^2), оскільки кожна вершина може мати до сусідів.

Блоки 5

Щоб швидко знайти всі трикутники, можна розділити вершини на важкі (з більш ніж \sqrt{n} сусідами) і легкі (з меншою кількістю сусідів).

Спочатку рахуємо всі трикутники, що містять хоча б одне легке ребро. Це можна зробити так само, як у попередньому підході, і це займе \mathcal{O}(n\sqrt{n}) часу. Потім знаходимо трикутники, що складаються тільки з важких вершин. Для цього видаляємо всі легкі вершини та повторюємо підрахунок. Це також виконується за \mathcal{O}(n\sqrt{n}).

Загальна складність алгоритму — \mathcal{O}(n\sqrt{n}).

Блок 6-7

Щоб знайти найкращий трикутник, потрібно для кожної вершини розглянути трикутник, утворений двома найбільшими ребрами, що виходять з (якщо такий існує). Таких трикутників є , тому отримаємо розв'язок за O(n \log n) або в залежності від способу пошуку третього ребра таких трикутників.

Доведемо, що якщо оптимальна відповідь є трикутником, то ми її розглянемо. Дійсно, нехай оптимальна відповідь є трикутником зі сторонами, що мають ваги l_1, l_2, l_3, l_1 \leqslant l_2 \leqslant l_3. Нехай з вершини, що знаходиться між ребрами l_2 та l_2 (позначимо її ) виходить ще якесь ребро r > b. Тоді зірка з центром в буде кращою відповіддю, ніж наш трикутник:

[ зірка l_2 + l_3 + r > l_2 + l_3 + l_1 = трикутник ].