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

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

Добрый день!

Как решать такую задачу Сумма ? Я думал как-то при помощи DSU, но не придумал как пересчитывать сумму при объединении множеств.

P.S. 472D - Уроки дизайна задач: обратные задачи в этой задаче сказано, что посчитать расстояния между всеми парами вершин в дереве это очень просто. Можете рассказать как? Дейкстра(и другие аналоги) же от каждой вершины по времени не зайдет

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

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

Каждое ребро нужно посчитать столько раз, на скольких путях оно лежит. Дальше понятно?)

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

Для каждого ребра посчитаем количество путей проходящих через это ребро. Оно равно произведению количества вершин по разные стороны от этого ребра. Т.е. ответ сумма длин ребер на количество путей проходящих через него.

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

    А как быстро считать кол-во вершин по разные стороны ребра? Там 2<=n<=10^5, поэтому надо на каждое ребро тратить не более log(n)

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

      Для вершины с "нижней" стороны ребра посчитать k — число вершин в её поддереве. Тогда Число вершин с другой стороны равно n - k.

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

        так это же по времени не пройдет.

        Для каждого ребра DFS будет работать за О(k). Всего ребер n — 1, итого суммарное время будет O(n*k), где k будет порядка O(n). За квадрат на таких (n<=10^5) ограничениях не пройдет. Или я неправильно оценил k?

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

          дп по дереву нужно написать. тогда sz найдешь для всех за O(n)

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

      Надо dfs-ом посчитать размеры поддеревьев, и тогда если по одну сторону ребра sz[v] вершин, то по другую (n — sz[v]) вершин.

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

Рекомендую также решить такую смежную задачу:

Дано дерево, для каждой вершины определить сумму длин путей, выходящих из неё.

Задача