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

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

Такое возможно? Будет N2 вершин? А реверс подматрицы за logNlogM можно делать?

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

»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Что вы понимаете под реверсом подматрицы?

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

    Переворот строк, а потом столбцов.

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

      Берем массив из N декартовых деревьев по неявному ключу на М элементов. Допустим приходит запрос развернуть подматрицу по горизонтали — то есть по сути развернуть подстроку в каждой строке, которая попадает в запрос — тогда просто M раз запускаем разворот. Если надо развернуть по вертикали то меняем кусок дерева из первой строки запроса с куском дерева из последней строки запроса, кусок дерева из второй — с куском дерева из предпоследней и т.д. Оба запроса будут работать за O(NlogM). Сомневаюсь, что реально за LogN*logM.

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

Скорее всего, нельзя делать реверс подматрицы за log n log m. На Петрозаводских сборах была такая задача, и она решалась за O(N+M) на запрос, O(N log M) декартовыми деревьями не пролазило. За O(N+M) решается такой структурой: для каждой ячейки будем хранить 2 неупорядоченные пары ссылок на ее соседей: для ссылки мы будем знать, в соседа по какой оси она ведет, но не будем знать, в положительном или отрицательном направлении. Вокруг матрицы будем иметь рамку фиктивных ячеек. Начиная от них, мы можем пройти и восстановить целую строку или столбец. Чтобы реверснуть подматрицу, нужно перекинуть ссылки только вдоль периметра подматрицы (тем не менее, до этого периметра сначала надо дойти от границы).

»
14 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Наврал