Сегодняшний пост посвящён задаче D из прошедшего Codeforces Round 1082 (Div. 1). Условие задачи не самое интуитивное, я не буду его повторять и просто попрошу прочитать оригинал
В этой задаче просят считать две величины — $$$k_{max}(a)$$$ и $$$f(a)$$$, причём второе значение зависит от первого, поэтому давайте сначала попробуем разобраться, как считается $$$k_{max}(a)$$$ хотя бы для изначального массива. То есть, перефразируя часть условия, которое относится к интересующему нас значению, нам нужно посчитать наибольшее такое $$$k$$$, что в массиве существуют два подотрезка, для которых мультимножества значений совпадают
Вопрос 1: как посчитать $$$k_{max}(a)$$$ для изначального массива?
Итак, мы умеем считать $$$k_{max}(a)$$$ для изначального массива за $$$O(n)$$$, теперь нам было бы неплохо научиться считать $$$f(a)$$$.
Вопрос 2: как посчитать $$$f(a)$$$ для изначального массива?
Чтож, теперь мы умеем решать за $$$O(n)$$$ задачу для исходного массива, но у нас есть $$$q$$$ запросов. Мы можем изменить значение элемента в любой позиции и должны пересчитать ответ. При этом, конечно же, у нас может измениться и число $$$k_{max}(a)$$$, поэтому действовать нужно умно. Но давайте сначала поймём, что меняется при пересчёте
Вопрос 3: как пересчитать $$$f(a)$$$ при изменении, если $$$k_{max}(a)$$$ остаётся прежним?
Мы на финишной прямой. Осталось только разобраться с тем фактом, что $$$k_{max}(a)$$$ может меняться
Вопрос 4: что делать, если $$$k_{max}(a)$$$ может меняться?
После ответа на вопрос 4 мы автоматически получили пересчёт $$$k_{max}(a)$$$ помимо пересчёта $$$f(a)$$$, который работает за $$$O(log(n))$$$ на запрос, то есть $$$q \cdot log(n))$$$ суммарно. Итого асимптотика решения вместе с построением Дерева Отрезков $$$O(n \cdot log(n) + q \cdot log(n))$$$
Замечание: Если Вам понравился это пост, то, возможно, Вам понравится контент из телеграм канала, в который я выкладываю свою подготовку к финалу ICPC 2026. Переходите по ссылке











