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

Автор Toastmaster, история, 8 лет назад, По-русски

Кто может объяснить как решать? Заранее спасибо.

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

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

Можно повернуть матрицу виртуальнона 45 градусов, то есть

11 12 13 14

21 22 23 24

31 32 33 34

41 42 43 44

повернётся в

__ __ __ 11 __ __ __

__ __ 21 __ 22 __ __

__ 31 __ 22 __ 13 __

41 __ 32 __ 23 __ 14

__ 42 __ 33 __ 24 __

__ __ 43 __ 34 __ __

__ __ __ 44 __ __ __

То есть получится матрица размерности не более, чем (2n + 1)x(2n + 1) Через __ тут обозначена пустая клетка, при вычислении сумм нужно поставить 0 Затем на этой матрице посчитать кумулятивную матрицу и тогда посчитать сумму на ромбе из исходной задаче ~ посчитать сумму на подматрице новой матрицы. Это можно делать за O(1). Тогда можно перебрать все возможные ромбы исходной матрицы (их O(n3)) и на каждом посчитать сумму за O(1), сохраняя максимальный

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

    А что значит "кумулятивная матрица"?

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

      Это значит, что в ячейке sum[r][c] должна храниться сумма всех элементов матрицы arr[i][j] таких, что i <= r и j <= c. Тогда сумму в произвольном прямоугольнике можно находить так:

      s(r1,c1,r2,c2)=sum[r2][c2]-sum[r2][c1-1]-sum[r1-1][c2]+sum[r1-1][c1-1]

      Саму матрицу частичных сумм построить с помощью динамического программирования, выражая интересующую ячейку через уже посчитанные:

      sum[r][c]=arr[r][c]+sum[r-1][c]+sum[r][c-1]-sum[r-1][c-1]

      Не знаю, где прочитать подробнее про частичные суммы на двумерном массиве, но лично я о них узнал из этого видео на youtube.com

      Можете посмотреть на примере кода, решающего указанную Вами задачу.

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

Есть ссылка, где можно попробовать сдать онлайн?

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

Ограничения достаточно свободные, можно перебрать без препроцессинга за O(N2 * M2).

Код
  • »
    »
    8 лет назад, скрыть # ^ |
    ← Rev. 6  
    Проголосовать: нравится +3 Проголосовать: не нравится

    В этой задаче ограничения на n и m до 500. Не совсем понятно, как Вы собираетесь порядка 5004 операций умещать в 2 секунды, даже с хорошим коэффициентов. Вот ваш код, запущенный на тесте 500 × 500 единичек, дающий TLE. Увы, даже при очень хорошей оптимизации, миллиард очень простых операций в секунду — потолок для C++.