An Array and Range Additions#224

An Array and Range Additions (Editorial)

Ключ до задачі — зрозуміти, що саме розрізняє елементи після операцій.

Виберемо для кожної операції довільне велике «загальне положення» . Тоді два елементи a_i та a_j стануть різними, якщо вони й так були різними, або якщо множини операцій, що їх накривають, не збігаються. Навпаки, якщо a_i = a_j і обидва накриті однаковим набором відрізків, вони назавжди залишаться рівними. Отже, задача формулюється так:

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

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

Скільки блоків дають операцій? Кінців усього , тому блоків щонайбільше 2m+1. Але найлівіший і найправіший блоки не накриті жодним відрізком — їхній підпис порожній, тобто спільний. Отже, різних підписів у «середині» щонайбільше 2m - 1, а префікс і суфікс мусять бути разом вільними від повторів.

Цю межу досяжно: наприклад, для m = 2 відрізки, що частково перекриваються, дають послідовність підписів

\{\},\; \{1\},\; \{1,2\},\; \{2\},\; \{\},

тобто рівно три різні блоки посередині.

Звідси алгоритм. Переберемо, де закінчується «зовнішня» частина: беремо префікс [0, p-1] і суфікс [\mathit{ptr}+1, n-1] так, щоб їхнє об'єднання не мало однакових значень. Оскільки зі зростанням суфікс може лише коротшати, усі такі пари перебираються двома вказівниками з лічильником входжень значень (перевірка «чи є повтор» — це максимум лічильника).

Для середини порахуємо — мінімальну кількість блоків, у кожному з яких значення різні. Це класична жадібність: блок тягнемо праворуч, доки не з'явиться повтор. Тоді потрібна кількість операцій дорівнює

\left\lfloor \frac{B}{2} \right\rfloor + 1,

що є розв'язком нерівності B \le 2m - 1. Якщо середина порожня, відповідь нульова — масив уже придатний.

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

Відповідь — мінімум по всіх допустимих . Загальна складність — \mathcal{O}(n \log n). Значення сягають 10^9, тому їх варто стиснути координатно, щоб лічильники поміщалися в масив.