Prefixmaxxing#12421

Prefixmaxxing (Розбір)

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

De3b0o

Підготував:

De3b0o

Редактор:

Hasan Saleh (MathModel)

Розв’язок

Факт: якщо виконувати операцію в індексі , оптимально обирати x = \max(a_1,a_2,...,a_{i-1}).

Доведення:

Є два випадки:

Якщо спочатку a_i \le \max(a_1,a_2,...,a_{i-1}), тоді вибір x = \max(a_1,a_2,...,a_{i-1}) збільшує mog на .

Інакше, якщо a_i > \max(a_1,a_2,...,a_{i-1}), тоді вибір x = \max(a_1,a_2,...,a_{i-1}) не змінює mog для префікса , але може збільшити його для всього масиву, дозволяючи нові максимуми після .

Алгоритм:

  1. Пройти масив зліва направо, зберігаючи:

    • : поточний максимум.

    • : друге за величиною значення перед максимумом.

    • : поточне значення mog (кількість нових максимумів).

    • : індекс останнього максимуму.

  2. Для кожного :

    • Якщо mx1 \le a_i, це новий максимум:

      • Збільшити на .

      • Оновити mx2 = mx1, mx1 = a_i.

      • Оновити id = i.

    • Інакше, якщо mx2 \le a_i \le mx1:

      • Збільшити dp_{id} на .

      • Оновити mx2 = a_i.

  3. Після обробки:

    • ans = c + \max(dp_i)

Складність: на тест.