Розв'язок
Нехай pref_k — кількість рекордних позицій серед перших елементів початкового масиву, а — кількість рекордних позицій у всьому масиві.
Розглянемо операцію розвороту перших елементів.
Зауважимо, що рекордність позицій після не зміниться. Справді, для кожної такої позиції набір попередніх елементів залишається тим самим, а отже, не змінюється і їхній максимум.
Таким чином, достатньо визначити, скільки рекордних позицій буде серед перших елементів після розвороту.
Позначимо цю кількість через rev_k. Тоді відповідь після розвороту дорівнюватиме
Знайдемо всі значення rev_k за допомогою монотонного стека.
Після розвороту перших елементів рекордними будуть саме ті елементи початкового префікса, які строго більші за всі елементи праворуч від них у цьому префіксі.
Будемо перебирати елементи масиву зліва направо та підтримувати стек таких елементів. Значення у стеку зберігатимемо у строго спадному порядку.
При додаванні чергового елемента a_i видалимо з кінця стека всі значення, які не перевищують a_i, після чого додамо a_i.
Це коректно, оскільки a_i стоїть правіше за всі попередні елементи, тому жоден із видалених елементів більше не може бути рекордним після розвороту префікса. Сам a_i завжди буде рекордним, оскільки після розвороту він стане першим.
Отже, після обробки перших елементів розмір стека дорівнюватиме rev_k.
Кількість pref_k також легко підтримувати під час проходу масивом: черговий елемент утворює нову рекордну позицію тоді й лише тоді, коли він строго більший за максимум усіх попередніх елементів.
Тому для кожного можемо знайти значення
Оскільки дозволено виконати не більш ніж одну операцію, також врахуємо можливість нічого не змінювати.
Остаточна відповідь:
Асимптотична складність
Кожен елемент додається до стека рівно один раз і видаляється з нього не більш ніж один раз. Усі інші операції виконуються за для кожного елемента.
Отже, часова складність становить , а просторова — .
Реалізація
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
vector<int> a(n);
for (int &x : a) cin >> x;
vector<int> st;
int pref = 0, mx = 0, best = 0;
for (int i = 0; i < n; i++) {
if (a[i] > mx) {
mx = a[i];
pref++;
}
while (!st.empty() && st.back() <= a[i]) {
st.pop_back();
}
st.push_back(a[i]);
best = max(best, (int)st.size() - pref);
}
cout << pref + best << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
}