Кошки и выпуклые фигуры

May 28, 2013 09:13


В воскресном раунде на codeforces.ru была такая задача - http://codeforces.ru/contest/311/problem/B

Несмотря на заковыристое описание, сводится она к следующему:
  • Дана последовательность S из m чисел в неубывающем порядке.
  • Требуется разбить последовательность на p непрерывных групп [Pis, Pie] с минимизацией суммы sum{i=0,p-1}(sum{j=P[i].s,P[i].e-1}(S[P[i].e]-S[j]))

Обычное DP-решение дало сложность O(p*m^2) и не уложилось в отведенное время.  Изучение вопроса показало, что есть интересный метод оптимизации такого рода проблем основанный в конечном счете на оптимизации запроса минимального значения семейства линейных функций (только порядка 1?) для заданной точки X.  Подробности здесь.  На досуге надо переписать решение, ибо техника выглядит good to know.  В комментариях народ говорит, что это не техника, а очевидная хрень для любого, кто делал sweep line segment intersection, но я его никогда лично не делал, так что для меня это техника :)

UPDATE: Поправил формулу, и вот еще проясняющий пример.  Дана неубывающая последовательность (3,5,6,6,7,8,10,11).  Требуется разбить на три группы с минимизацией суммы по формуле выше.  Графически это соответствует заштрихованной области на рисунке.  Разбиение приведено произвольное - я не думал сейчас, оптимальное ли оно для этого конкретного примера.



programming, algorithm

Previous post Next post
Up