Пытаюсь сдать задачу http://www.e-olimp.com.ua/ru/problems/4483. Строю дерево отрезков: каждый узел дерева хранит два минимальных элемента соответствующего отрезка. Код: http://ideone.com/Kjk0BQ. Валится по памяти, видимо из-за строчки 110. Можно ли как-то оптимизировать создание массива каждый раз?
Нет, дело не в 110 строчке. Поменяйте местами размерности массива t, и да будет Вам счастье :). Вся проблема в том, что в жабе объект типа "массив" хранит некоторое количество дополнительной информации, а Вы создаете 106 массивов, когда можно обойтись всего двумя, поэтому и получаете MLE.
Да, спасибо, прошло :)
Instead of keeping 2 int variable, you can keep a boolean (b) and a integer (m). Boolean is the expected answer. The other variable contains the minimal element in its range. As K is fixed, so
Thus you can avoid that line :s
Я решил немного по-другому:в вершине дерева хранил минимум на отрезке и его индекс в массиве.Когда приходил запрос типа 1, я искал 1-ый минимум,на его месте поставил INF,искал 2-ой минимум ,и проверял,что сумма 1-ого и 2-ого минимумов меньше K.Затем я возвращал на место INF`а его настоящее значение.
извращенец
А мне кажется, трюк вполне оправданный и полезный. Например, примерно таким же способом сравнительно легко решается 1542. И вообще для поиска K минимальных элементов на отрезке самое то. Можешь предложить лучший способ, который потребляет О(n) памяти, а не O(nk), как если хранить в каждой вершине k минимумов?
nlogn памяти и klogn на запрос: мёржим массивы в соответсвующих отрезках, пока не наберём k штук.
Не уверен в том, что это лучше, но, как я понимаю, из такого способа можно ещё много чего интересного сделать... Постараюсь в ближайшее время разобраться с таким хранением ДО.
Кстати сказать, сумму k минимальных чисел на отрезке можно находить за асимптотику вплоть до на запрос. Решение идентично решению задачи о k-ой порядковой статистики на отрезке, прочитать можно здесь.