76

(3 ответов, оставленных в Feedback)

Может добавить алгоритм построения декартово дерева за O(N) оффлайн, используя этот материал?

Хм, мне казалось, что построение в оффлайн я уже добавлял (там же аж целых два способа существует smile ), а оказалось - нет ещё... Займусь этим, когда руки дойдут.

Что делает процедура Union(t1, t2)?

Сливает две декартовых дерева в одно, но, в отличие от Merge, никаких дополнительных предположений о деревьях не делается. Вообще эта операция полезна крайне редко (особенно учитывая её асимптотику), и стоит её вынести куда-нибудь в конец, как далеко не самый важный пункт.

77

(2 ответов, оставленных в News)

Наконец дошли руки обновить версию форума до новой (потому что текущей версии на тот момент исполнилось уже два года).


Кажется, форум теперь стал работать быстрее. И, ура, наконец решились проблемы с кодировкой на некоторых страницах. Надеемся, что спама теперь будет меньше.

Также они немного изменили дефолтную тему оформления, пока она слегка непривычная.


В общем, надеюсь, после обновления не вылезло никаких багов smile

Спасибо

На самом деле, если мы будем искать отрезок, у которого длина лежит в заданном диапазоне (иначе всегда выгодно отрезок длины 1 брать), то задачу за линейное время можно решать.

Мне просто очень хотелось продемонстрировать приём с двоичным поиском и вычитанием ответа smile

За линейное время - наверное, с помощью стека/очереди для минимума? Или есть вариант проще?

Мало того, если длина просто ограничена снизу, то можно добиться еще более крутого результата и в онлайне для запроса "найти подотрезок заданного отрезка с максимальным средним значением" находить ответ за O(log^3(N)).

Ух ты, выглядит очень круто smile А набросок идеи можно описать пожалуйста?

80

(1 ответов, оставленных в Algo)

(... почему-то пост остался без ответа?..)

Я не специалист по симплекс-методу, однако мне кажется, что разница по скорости работы должна быть весьма значительной.

По меньшей мере в теории, симплекс-метод не работает за полиномиальное время, в отличие от "классических" алгоритмов теории графов.


С другой стороны, надо учитывать, что алгоритмы теории графов умеют быстро решать только очень ограниченный круг задач, в отличие от весьма общей постановки задачи линейного программирования.

81

(2 ответов, оставленных в Feedback)

Спасибо, "len" вместо "bl" я исправил (извечная проблема, когда копируешь рабочий код, а потом переименовываешь в нём переменные, и в итоге что-нибудь где-нибудь забываешь smile ).

Насчёт count и len не совсем согласен, т.к. можно их обе присвоить этому числу, так сказать, "с запасом". Последний блок может быть неполным или вовсе пустым (а при n=1 вообще будет и то, и то), однако это ничего не меняет - т.к. к лишним блокам вообще не будет обращений, а неполные блоки тоже ничего не портят.

А реализацию такое соглашение, что количество равно размеру, как-никак упрощает.

82

(7 ответов, оставленных в Feedback)

Oracle, вы проделали просто фантастическую работу! Огромное спасибо за такой подробный отчёт. Такое ощущение, что вы дотошно прочитали буквально каждую статью smile

Пересечение окружности и прямой:
    возможно, лучше формулы переделать в TeX.

Да уж, эта статья писалась в те тёмные времена, когда я ещё не знал про TeX smile

Префикс-функция. Алгоритм Кнута-Морриса-Пратта:
    Сжатие строки - может просто вставить ссылку на соответствующую статью?

Ну я бы скорее удалил статью "сжатие строки", т.к. она не особо содержательна.

Может в книге сделать текст пошире?

Имеется в виду, что шрифт немного сплюснут с боков? Да, странный эффект, вероятно, потому что где-то есть широкая таблица или картинка.


KADR, а можно в паблик какие-нибудь подробности по поводу алгоритма Диница? Всё же десятикратное ускорение означает какое-то фундаментальное отличие, хотя моя реализация вроде бы написана в соответствии с теорией.

83

(2 ответов, оставленных в Feedback)

Да, в самом деле, так и есть.

84

(2 ответов, оставленных в Feedback)

Serega, steppenwolf, большое спасибо, исправил.

85

(1 ответов, оставленных в News)

По причине высокой нагрузки движка MediaWiki на хостинг, а также того, что википедия на сайте так и не набрала популярности - раздел "wiki" был закрыт.

Та немногая уникальная информация, которая там была - в ближайшее время будет перенесена в статьи раздела /algo/.

86

(2 ответов, оставленных в Algo)

Да, точно. Уже которая ошибка у меня в этом месте статьи smile

87

(2 ответов, оставленных в Feedback)

вероятно, вы не совсем правильно заполнили сеть?
ответ на этом тесте 2, но если считать рёбра неориентированными - будет 3, но для этого надо будет в матрице c[][] поставить ребро в обоих направлениях (или, во втором варианте, два раза вызвать add_edge)

88

(4 ответов, оставленных в Problems)

Да не, если идея правильная, то можно и за logN отвечать на запрос - двоичным подъёмом дойти до диаметра, а оказавшись в диаметре, уже просто взять k-ый элемент этого диаметра (диаметр сохранить заранее в отдельном списке).

89

(7 ответов, оставленных в Offtopic)

У меня появилась идея: вы делаете push_back в вектора, и при этом вектор может ресайзиться, в результате пойнтеры rev начинают указывать на не существующие уже структуры.

90

(4 ответов, оставленных в Problems)

Может, просто найти диаметр дерева, и затем искать ответ в виде "дойти от v_i до диаметра, дальше идти вдоль него" ?

91

(7 ответов, оставленных в Offtopic)

Программу не изучал, но обычно такие признаки означают, что всё же где-то происходит выход за пределы массивов - например, обращение к минус первому элементу, или что-то в этом роде.

92

(4 ответов, оставленных в Feedback)

Oleg, спасибо, исправил.

Astekinane
Да, так и есть - мы же не длину отрезка считаем, а число целых точек на отрезке.


Кстати, очень хотелось бы, чтобы кто-нибудь пострессил те решения, которые описаны в статье. У меня нет уверенности, что они абсолютно корректны на всяких вырожденных/отрицательных входных данных.

94

(8 ответов, оставленных в Algo)

ОК, а поделись пожалуйста тестом smile

95

(12 ответов, оставленных в Problems)

Ну видимо, да, только эти 6 штук.

96

(12 ответов, оставленных в Problems)

1-2: А зачем вызывать перебор от каждой точки заново? Погенерируем все области из точки (0;0), потом попробуем посдвигать каждую полученную область.

3: Очередь содержит лишь кандидатов, т.е. размер очереди - это не количество взятых точек. Перебор заключается в том, какие именно точки среди кандидатов мы берём, при этом когда мы решаем взять какого-либо кандидата, мы тут же докидываем в очередь всех его соседей. Поэтому изначально очередь состоит из одной точки (0;0), которую по предположению всегда надо брать, а затем, по мере того как мы выбираем ещё какие-то точки - очередь разрастается.

97

(12 ответов, оставленных в Problems)

Ну да, это я и имел в виду во фразе "меньшие (0;0)" - точки сравниваются как пары двух чисел.

if (y < 0 || y == 0 && x < 0) return

Наверное, более точно будет сказать, что не добавлять в очередь такие точки - ведь перебору передаётся _кандидат_ на добавление в текущую область (хотя, видимо, ты это же имел в виду)

98

(8 ответов, оставленных в Algo)

Да? Неожиданно:)
Хочешь сказать, рандомом без честных рангов вообще нельзя получить log* ?

99

(12 ответов, оставленных в Problems)

Можно, кстати, написать перебор связных областей так, чтобы он не генерировал повторяющиеся области.

Опишу свою реализацию (пишу по памяти, так что могут быть неточности).

У нас есть очередь кандидатов (изначально в неё добавляется точка (0;0)) - фактически, это точки-окружение текущей связной области в переборе.
Также есть глобальный массив used - в нём мы отмечаем, какие точки мы уже просматривали в текущей ветке перебора (изначально весь used заполнен false, кроме used[0][0] = true).
Перебору передаётся один аргумент - это индекс текущего элемента в очереди, и перебор пробует либо взять этот элемент в текущую область, либо не брать. А если он берёт текущий элемент, то в очередь он добавляет все 4 соседа этой точки, но, конечно, только такие, которые not used (ну и, разумеется, после рекурсивного вызова все добавленные точки надо обратно достать из очереди, сняв с них метку used).

Осталось ещё запретить перебору добавлять точки, меньшие (0;0) - и теперь он точно будет генерировать различные связные области, в которых левая нижняя точка - это точка (0;0).

100

(4 ответов, оставленных в Feedback)

Понял, туплю.

Спасибо, что протестил - я как-то эту статью с деревьями отрезков поленился всю тестировать