Типова задача на запити#235

Типова задача на запити (Розбір)

Спершу позбудемось ділення. Умова \mathrm{avg}(S) \le C для відрізка рівносильна

\sum_{i \in S} (a_i - C) \le 0.

Тому одразу замінимо масив на b_i = a_i - C: тепер треба з'ясувати, чи існує відрізок довжини щонайменше із недодатною сумою.

Через префіксні суми це формулюється так: чи існує r \ge L, для якого

P_r - \max_{0 \le t \le r-L} P_t \;\le\; 0.

Перевірка робиться одним проходом за : рухаємо і підтримуємо максимум префіксних сум із затримкою на позицій.

Тепер найважливіше спостереження цієї задачі. За умовою x \ge 0, тобто кожен запит лише зменшує елементи масиву. Отже, середнє значення будь-якого відрізка з часом лише спадає, і якщо гарний відрізок одного разу з'явився, він уже нікуди не подінеться. Іншими словами, послідовність відповідей має вигляд «кілька NO, а далі самі YES» — вона монотонна.

Це дозволяє не перераховувати відповідь після кожного запиту, а знайти двійковим пошуком перший запит, після якого відповідь стає YES.

Для фіксованого стан масиву після перших запитів будується за \mathcal{O}(n + t): усі віднімання на відрізках накопичуємо в різницевому масиві й один раз розгортаємо префіксною сумою. Далі виконуємо описану вище перевірку за .

Загальна складність — \mathcal{O}((n + q)\log q), що з запасом вкладається в обмеження.

Стежте за типами: сума сягає 2 \cdot 10^5 \cdot (10^9 + 2 \cdot 10^5 \cdot 10^7), тому обов'язково 64-бітний тип, а краще перевірити оцінку й за потреби взяти ширший.