Блог пользователя Vasya.V

Автор Vasya.V, 14 лет назад, По-русски
Расскажите, plz, как решаются задачи E и G
UPD. Спасибо за содержательные ответы.
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Моё решение задачи G:
Пусть bi - кол-во чисел из a, которые не меньше i (1 ≤ i ≤ n). Для того, чтобы перестановка существовала, должно выполняться: bn ≥ 1, bn - 1 ≥ 2, ... bi ≥ n + 1 - i, ... b1 ≥ n. Для проверки этого я хранил в дереве отрезков для минимума числа bi - (n + 1 - i). Теперь, если в данный момент минимум на всём массиве меньше 0, то ответ NIE, иначе ответ TAK. Когда приходит запрос изменения числа x на y, если x < y, то надо прибавить 1 ко всем числам отрезка [x + 1, y], если x > y, то надо отнять 1 от всех чисел отрезка [y + 1, x].

Но мне почему-то кажется, что существует решение проще.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится
    у меня примерно тоже самое было. По-моему и это достаточно просто :)

    Е:
    Решаем в оффлайне. Строим все дерево из работников. Для каждого уровня нужно упорядочить работников. Можно просто запустить DFS для каждого работника запоминаем время входа и выхода. И упорядочивасть согласно времени входа. Время выхода тоже понадобится :)
    Для каждого уровня строится свое дерево отрезков, которые умеет считать сумму на отрезке.
    Далее идем по запросам и обрабатываем их. Если добавление работника, то в дерево отрезков для данного уровня увеличиваем значение соответствующее данному работнику.
    Если нужно посчитать кол-во работников на некотором уровне ниже от работника i. То мы знаем что эти работники в дереве находятся на некотором уровне h. Для этого уровня h у нас есть дерево отрезков и в нем как раз нужно посчитать сумму. Но нужно не общее кол-во добавленных, а только в поддерево, т.е. на самом деле только те работники, у которых время входа больше, чем время входа работника i, и в то же время меньше времени выхода работника i. Т.е. можно для каждого уровня хранить времена входов всех работников, и там двумя бинарными поисками, найти отрезок для которого нам надо посчитать сумму в дерево отрезков :)
    Надеюсь более или менее понятно :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Интересно как решается задача I есть какие-нибудь идеи ?

A* ?

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Условие напомню, дано n <= 24 чисел a[i] <= 10^9
требуется их разбить на три множества A, B, C
так чтобы S(A) <= S(B) <= S(C) и S(C) - S(A) минимально.
вывести S(C) - S(A). S(x) - сумма элементов в множестве.