Изменения

Перейти к: навигация, поиск

Convex hull trick

1536 байт убрано, 04:38, 15 января 2017
Наивное решение
Посмотрим на код наивного решения:
''for''' i = 1..n-1 {
'''while''' (front[pos] < xdp[i]) = +<font color=greentex>// метод 1 указателя (ищем первое pos, такое что x[i] покрывается "областью действия" st[pos]-той прямой \infty</font tex> ++pos j = st[pos] dp[i] = K[j] * a[i] + B[j] ''for'if''' (j = 0..i < n - 1) { <font color=green>// если у нас добавляется НЕ последняя прямая, то придется пересчитать выпуклую оболочку </font > K[i] = c[i] <font color=green>// наши переобозначения переменных </font > B[i] = dp[i] <font color=green>// наши переобозначения переменных </font > x = -<tex>\infty</tex> '''whileif''' (true) { j = st[sz - 1] x = divide(Bdp[j] - B+ a[i], K* c[ij] - K< dp[ji]) <font color=green>// x-координата пересечения с последней прямой оболочки, округленное в нужную сторону (*) </font > if (x > from dp[sz - 1i]) '''break''' <font color=green>// перестаем удалять последнюю прямую из множества, если новая прямая пересекает ее позже, чем начинается ее "область действия" </font > --sz <font color=green>// удаляем последнюю прямую, если она лишняя </font > } stdp[szj] = + a[i from] * c[sz++j] = x <font color=green>// добавили новую прямую </font >
}
}
==О-Оптимизация==
Анонимный участник

Навигация