TGViewer
Боря дорешивает Боря дорешивает @bminaiev_upsolving · 556 subscribers
Post #16 582
Grand Prix of EPS. H.

https://contest.ucup.ac/contest/4207/problem/21380

Если убрать все детали, то задача следующая. Есть n вершин, каждая характеризуется числами (x_i, A_i, B_i). Ребро между вершинами i и j стоит A_i * x_j + B_i. Формула получилась немного не симметричная, но на самом деле (A_i, B_i) такие, что расстояние в одну и другую сторону получаются одинаковые. Нужно на таком графе построить максимальное остовное дерево.

Если вы внимательно читали предыдущие посты, то знаете, что когда нам дают какой-то неявный полный граф, в котором нужно находить MST, то нам нужен алгоритм Борувки. Тогда за логарифм итераций "для каждой вершины найти самую далекую не из текущей компоненты" мы сможем решить задачу.

Задача несколько усложняется тем, что TL=1s, а сумма n может быть 5*10^5. Поэтому было бы неплохо делать каждую итерацию за линию, тогда суммарная сложность будет O(n log n). Оказывается так можно сделать!

Как решать задачу, если нет условия на "не из текущей компоненты"? Тогда нужно построить верхнюю огибающую всех прямых Ax+B. Отсортируем их по A, будем хранить стек, и добавлять их по одной. Потом посортируем все запросы по x и указателем будем искать нужную прямую. Все сортировки можно сделать заранее.

Но в данной задаче нам нужно находить прямые не текущего цвета. Как обычно, будем хранить два максимума. Что это значит для выпуклой оболочки? Посмотроим оболочку не обращая внимание на цвет. Теперь для каждого наибольшего подотрезка оболочки одинакого цвета выкинем его и построим "вторую максимальную оболочку" из линий не этого цвета, которые лежат на том же интервале. Можно показать, что суммарный размер "вторых оболочек" будет O(n).

В итоге решение получается такое и проходит за ~300мс. А были времена, когда такое можно было сдавать не в дорешку...
  • ❤ 7
More from @bminaiev_upsolving
  1. Oct 12, 2026Post #17
  2. Sep 30, 202647/100. Чтобы в предыдущей задаче посчитать ответ быстрее чем за квадрат надо сделать два…
  3. Sep 30, 2026Оказывается n-е число Каталана можно считать не только как C(2 * n, n) / (n + 1), но и как…
  4. Sep 30, 202646.5/100 https://codeforces.com/contest/2268/problem/E После скучной части про комбинатори…
  5. Sep 28, 2026Вообще прикольный скилл смотреть на perf report и уметь ускорять код в 10 раз чисто механи…
  6. Sep 28, 2026Grand Prix of EPS. A. https://contest.ucup.ac/contest/4207/problem/20715 Не будем вдаватьс…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →