Блог пользователя at1

Автор at1, 14 лет назад, По-русски

A. Треугольник

Из трех палочек с длинами a, b, c > 0 можно составить треугольник ненулевой площади тогда и только тогда, когда:
|a - b| < c < a + b (+)
При вырожденном случае в (+) одно из неравенств обращается в равенство. (Для обоснования можно построить окружности радиуса a и b с центрами в концах отрезка длины c, и проверить когда они пересекаются).

Таким образом, можно перебрать все тройки чисел из данных 4-х и проверить (+).

B. Кабинет президента

Достаточно перебрать все клетки, соседние с клетками цвета стола президента, помечая их цвета. То есть после процедуры мы будем знать для каждого цвета, является ли он соседним с данным нам. Ответ на задачу - количество помеченных цветов.

C. Алиса, Боб и шоколад

Необходимо промоделировать описанную в условии игру. Имеем два указателя на начало и конец массива длин шоколадок, каждый раз смещаясь по первому, второму или обоим (в зависимости от длин шоколадок). Сместившись только по одному указателю, нужно уменьшить длину недоеденной шоколадки.
Единственная техническая трудность - правильно обработать последнюю шоколадку, можно ошибиться или зациклиться, если участники перейдут к ней одновременно.

E. Экспозиция

Рассмотрим функцию f(l, r) = max(hi) - min(hj), l i, j r. (<максимум на отрезке> - <минимум на отрезке>). Эта функция как раз и отражает разницу между самой высокой и самой низкой книгами на взятом отрезке.
Если l возрастает при фиксированом r, то функция убывает, аналогично, по r функция растет. К монотонной по r функции f(l0, r) можно применить бинарный поиск и найти наибольшее r, для которого f(l0, r) ≤ k. Подходящая структура данных для поиска минимума (максимума) на отрезке - дерево отрезков.
Для каждого левого конца можно найти максимально удаленный правый за время O(n*log2(n)). (n - левых концов, O(log(n)) вычислений f с помощью дерева отрезков за O(log(n))). Из этого множества отрезков ответом являются те, длина которых максимальна.
Можно упростить это решение и по написанию кода и по времени "техникой двух указателей". pl указывает на начало отрезка, pr на конец, причем если f(pl, pr) < k, то увеличиваем pl, иначе pr. Из-за уже указанных свойствах монотонности f по l и r, можно утверждать, что [pl, pr] заметут все искомые отрезки.

Теперь можно увидеть, что мы используем всего три операции:
<добавить элемент pr>
<удалить элемент pl>
<взять максимум - минимум на текущем отрезке>

То есть можно просто кидать/удалять элементы вида (hi, i) в set (структура данных организующая множество, построенная на любом сбалансированном дереве, как правило есть стандартных библиотеках языка). Минимум - левый элемент в дереве, максимум - правый.

Сложность алгоритма с сетом O(n*log(n)). (≤ 2n смещений pl, pr, на каждом шаге обращение к сету за O(log(n))).
  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Can anybody give me hint about new text of task D?
Thanks :)

P.S. Understand Russian
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
    We can't kill first archer directly, so we must throw balls into second, until first is dead.
    Then, to kill second (if he is still alive), we may either throw ball into him ot into third. This leads to dp, with states (current archer's position, his hp, prev archer's hp, next archer's hp).

    P.S. Your comment is already marked as Russian, so nobody else would see it :)
»
11 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Напишите, пожалуйста, более подробный разбор D. Я придумал часть решения через рекурсию,но мне не понятно, как мы перебираем количество шаров, пущенных в a[i] ящерицу и в a[i+1] для того, чтобы убить ящерицу a[i]. UPD: уже разобрался , вот мой код:3648171

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

E можно решить за O(n), если вместо дерева использовать деку — 5913536

»
10 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

В С можно обойтись и без двух указателей. Можно сделать ещё проще: Построим два массива left и right. где left[i] — время съедания Алисой i-ой шоколадки, а right[i] — время съедания Бобом i-ой шоколадки. Тогда просто пройдясь по массиву, Алиса съест все шоколадки, где left[i] <= right[i]. Вот собственно и все)