Ответ
@ templatetypedef работает, но я думаю, что у меня есть более прямой подход.
Начните с вычисления максимального значения для следующих (закрытых) интервалов:
[k-1, k-1]
[k-2, k-1]
[k-3, k-1]
...
[0, k-1]
Обратите внимание, что каждый изони могут быть вычислены в постоянное время по сравнению с предыдущим.
Далее вычислите максимальное значение для этих интервалов:
[k, k]
[k, k+1]
[k, k+2]
...
[k, 2k-1]
Теперь эти интервалы:
[2k-1, 2k-1]
[2k-2, 2k-1]
[2k-3, 2k-1]
...
[k+1, 2k-1]
ДалееВы делаете интервалы от 2k до 3k-1 («прямые интервалы»), затем от 3k-1 до 2k + 1 («обратные интервалы»).И так до тех пор, пока вы не достигнете конца массива.
Поместите все это в большую таблицу.Обратите внимание, что каждая запись в этой таблице требует постоянного времени для вычисления.Обратите внимание, что в таблице не более 2 * n интервалов (поскольку каждый элемент появляется один раз с правой стороны от «интервала перемотки вперед» и один раз с левой стороны от «интервала перемотки назад»).
Теперь, если [a, b] - любой интервал ширины k, он должен содержать ровно один из 0, k, 2k, ...
Скажем, он содержит m * k.
Заметьте, чтоинтервалы [a, m * k-1] и [m * k, b] находятся где-то в нашей таблице.Таким образом, мы можем просто найти максимум для каждого, и максимум этих двух значений - это максимум интервала [a, b].
Так что для любого интервала ширины k мы можем использовать нашу таблицу дляполучить его максимум в постоянное время.Мы можем сгенерировать таблицу за O (n) раз.Результат следует.