#P2865. 二维子网格最大值

    ID: 7727 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>数据结构单调队列双端队列二维滑动窗口

二维子网格最大值

题目描述

给出一个 nnmm 列的二维网格 a[1n][1m]a[1\dots n][1\dots m],从上往下行的编号从 11nn,从左往右列的编号从 11mm,第 ii 行第 jj 列的数是 a[i][j]a[i][j]

有一个高度为 rr,宽度为 ss 的长方形计算器。每次你可以选择二维网格的某个格子 (i,j)(i,j) 作为左上角,然后把计算器的左上角对准格子 (i,j)(i,j) 覆盖下去,计算器会自动计算出二维网格被覆盖区域的最大值。注意计算器的边要与二维网格的边平行,同时计算器不能超出二维网格。二维网格被计算器覆盖的部分,称为二维网格的“子网格”。

现在的任务是:把计算器从二维网格的第 11 行第 11 列开始,从上往下、从左往右滑动,每覆盖一次,就输出对应的“子网格”的最大值。

输入格式

第一行两个整数 nnmm,表示网格的行数和列数。

接下来 nn 行,每行 mm 个整数,表示二维网格的数值。

最后一行两个整数 rrss,表示计算器的高度和宽度。

输出格式

nr+1n-r+1 行,每行 ms+1m-s+1 个整数。其中第 ii 行第 jj 列的数表示把计算器左上角对准第 ii 行第 jj 列格子时,覆盖区域的最大值。

样例

3 3
1 1 2
2 3 4
4 3 2
2 1
2 3 4
4 3 4

数据范围与提示

  • 1n,m40001 \le n, m \le 4000
  • 10000a[i][j]10000-10000 \le a[i][j] \le 10000
  • 1rn1 \le r \le n1sm1 \le s \le m

来源

单调队列