Size: a a a

2020 July 18

A(

Andrey (@AndrewB330) in pro.algorithms
Понять что именно, не сложно)
источник

A(

Andrey (@AndrewB330) in pro.algorithms
Если лежит на пути то 1)
источник

ПК

Паша Калугин... in pro.algorithms
Сумма количеств по всем k
источник

A(

Andrey (@AndrewB330) in pro.algorithms
Хм
источник

KK

Kirill Kaymakov in pro.algorithms
Паша Калугин
Формализую: есть n пар (a_i, b_i). Нужно для каждого ребра посчитать количество простых путей от a_k к b_k, проходящих через это ребро.
Берешь, подвешиваешь дерево за вершину, спускаешься, возвращаешь сеты пар
источник

KK

Kirill Kaymakov in pro.algorithms
Потом поднимаясь в вершину, меджишь сеты, проверяя, чтобы у тебя не было даблов
источник

KK

Kirill Kaymakov in pro.algorithms
Если дабл попадание - взаимное уничтожение
источник

KK

Kirill Kaymakov in pro.algorithms
Ответ по ребру - количество элементов, возвращенных в сете из поддерева
источник

KK

Kirill Kaymakov in pro.algorithms
За счет аккуратного мерджа (мерджим к самому большому сету), ассимптотика nlog^2
источник

KK

Kirill Kaymakov in pro.algorithms
А если будешь юзать unordered, то nlog
источник

ПК

Паша Калугин... in pro.algorithms
Понял, спасибо!
источник

VM

Vladik Milshin in pro.algorithms
Можно проще. Давай просто для каждой пары (ak, bk) прибавим 1 ко всем ребрам на пути, если мы научимся это делать быстро, то мы решим задачу. Подвесим граф. Чтобы прибавить 1 к пути от a до b давай найдем их общего предка (LCA) p и прибавим 1 на пути от a до p и на пути от b до p. Но тут уже просто, давай заведем массив, назовем его kek, чтобы обработать путь [a, p] мы сделаем kek[a]++, kek[p]--. Тогда как нетрудно понять для ребра (u, v) (u предок v) ответом будет что-то типа -kek[u] + ∑kek[s], где сумма берется по всем вершинам в поддереве v. Как-то так
источник

ПК

Паша Калугин... in pro.algorithms
Красиво, спасибо!
источник

ПК

Паша Калугин... in pro.algorithms
Vladik Milshin
Можно проще. Давай просто для каждой пары (ak, bk) прибавим 1 ко всем ребрам на пути, если мы научимся это делать быстро, то мы решим задачу. Подвесим граф. Чтобы прибавить 1 к пути от a до b давай найдем их общего предка (LCA) p и прибавим 1 на пути от a до p и на пути от b до p. Но тут уже просто, давай заведем массив, назовем его kek, чтобы обработать путь [a, p] мы сделаем kek[a]++, kek[p]--. Тогда как нетрудно понять для ребра (u, v) (u предок v) ответом будет что-то типа -kek[u] + ∑kek[s], где сумма берется по всем вершинам в поддереве v. Как-то так
Можно даже прибавить 1 на пути от a до корня, 1 на пути от b до корня и вычесть 2 на пути от a до p, так, мне кажется, будет удобнее
источник

VM

Vladik Milshin in pro.algorithms
да, так тоже можно
источник

VM

Vladik Milshin in pro.algorithms
на самом деле это и происходит
источник

ПК

Паша Калугин... in pro.algorithms
а, точно
источник

KK

Kirill Kaymakov in pro.algorithms
Vladik Milshin
Можно проще. Давай просто для каждой пары (ak, bk) прибавим 1 ко всем ребрам на пути, если мы научимся это делать быстро, то мы решим задачу. Подвесим граф. Чтобы прибавить 1 к пути от a до b давай найдем их общего предка (LCA) p и прибавим 1 на пути от a до p и на пути от b до p. Но тут уже просто, давай заведем массив, назовем его kek, чтобы обработать путь [a, p] мы сделаем kek[a]++, kek[p]--. Тогда как нетрудно понять для ребра (u, v) (u предок v) ответом будет что-то типа -kek[u] + ∑kek[s], где сумма берется по всем вершинам в поддереве v. Как-то так
Ага, найти lca проще, удачи)
источник

KK

Kirill Kaymakov in pro.algorithms
Сколько ты будешь писать lca с нуля и мердж сэтов?
источник

KK

Kirill Kaymakov in pro.algorithms
Думаю отношение порядка 10:1
источник