или
«красная» зона.
Следует внимательно прочитать раздел «
На работе». Я вот прочитал и подумал: дисциплина — это хорошо. Но слишком хорошо — тоже не хорошо.
У
sim0nsays@lj нашёл задачку:
Итак, дана двустороняя очередь (deque), которая хранит бинарные данные, т.е. каждый элемент — 0 или 1. Единственные операции, которые дека поддерживает — push_front, push_back, pop_front, pop_back. Push значение принимает, pop — возвращает, все как обычно. Еще у деки есть функция isempty(), чтобы узнать пустая она или нет. Других функций у деки нет.
Задача стоит в том, чтобы узнать размер данной деки, да побыстрее и не испортив данных внутри. Более того, с константными затратами памяти с учетом того, что сама дека память не возвращает (т.е. если вытащить из нее все элементы через pop, она не освободит ни байта памяти).
В ответах предлагается запихать в начало деки маркер, прочитать данные ala push_front( pop_back() ), дойти до маркера, убить его, прочитать данные опять; если маркера нет — задача решена, если есть — вернуть всё назад и сделать маркер подлинн
ее…
Или:
Что-то типа половинного деления:
предполагаем что длина дека от n = 1 до m = 1
Меняем один элемент в начале, прокручиваем на m, считая сумму элементов по модулю 2, прокручиваем назад. Меняем элемент обратно, повторяем процедуру. Если суммы равны — то n = m; m *= 2 иначе мы имеем границы длины очереди. Когда границы есть — продолжаем в том же духе, только как следующее приближение берем середину интервала. В общем половинное деление получается, N*log(N).
Что-то здесь не так. Если дека не возвращает память, каждый push будет её увеличивать. Не проще ли завести вторую деку рядышком и всё сложить в неё? Никудышный я программист, наверно, раз ничего более умного в голову не приходит.