Фарбування камінців#250

Фарбування камінців (Розбір)

Зафіксуємо колір , у який ми хочемо перефарбувати все, і порахуємо, скільки операцій це коштує.

Камінці кольору ділять ряд на проміжки з камінців інших кольорів. Проміжки обробляються незалежно: операція зачіпає лише дві сусідні позиції, тому «переносити» роботу між проміжками сенсу немає.

Проміжок довжини вимагає рівно операцій. Справді, кожна операція фарбує щонайбільше дві потрібні позиції, тому менше ніж не буває; і цієї кількості вистачає: беремо позиції парами, а якщо непарне, останню одиночну позицію фарбуємо разом із сусіднім камінцем кольору (той свій колір не змінює).

Отже,

\mathrm{cost}(c) = \sum_{\text{проміжки}} \left\lceil \frac{L}{2} \right\rceil.

Тепер порахуємо це для всіх кольорів швидко. Згрупуємо позиції за кольором. Якщо колір трапляється на позиціях q_1 < q_2 < \ldots < q_m, то довжини проміжків дорівнюють q_1 - 1, потім q_{s+1} - q_s - 1, і насамкінець n - q_m. Для кожного кольору робота пропорційна кількості його входжень, тому сумарно по всіх кольорах виходить .

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

Не забудьте окремий випадок: якщо всі камінці вже однакові, відповідь дорівнює нулю (усі проміжки порожні, і формула дає це автоматично).