1 条题解
-
1
这道题和课上的OJ类似,只不过变成了长方形以及最后求的是差的最大值,注意下一下修改就可以了~,
参考代码
#include<iostream> using namespace std; int head = 1, tail, ans = -0x3f3f3f3f, HEAD, TAIL; int a[1003][1003], max1[1003][1003], max2[1003][1003], min1[1003][1003], min2[1003][1003], q[1003], Q[1003]; int x, m, n,y; int main() { cin >> n >> m >> x >> y; for ( int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) cin >> a[i][j]; } for (int i = 1; i <= n; i++) { head = tail = q[1] = 1; HEAD = TAIL = Q[1] = 1; for (int j = 2; j <= m; j++) { while (a[i][j] >= a[i][Q[TAIL]] && HEAD <= TAIL) TAIL--; Q[++TAIL] = j; if (j - Q[HEAD] >= y) HEAD++;
while (a[i][j] <= a[i][q[tail]] && head <= tail) tail--; q[++tail] = j; if (j - q[head] >= y) head++; if (j >= y) max1[i][j - y + 1] = a[i][Q[HEAD]], min1[i][j - y + 1] = a[i][q[head]]; } } for (int j = 1; j <= m - y + 1; j++) { head = tail = q[1] = 1; HEAD = TAIL = Q[1] = 1; for (int i = 2; i <= n; i++) { while (max1[i][j] >= max1[Q[TAIL]][j] && HEAD <= TAIL) TAIL--; Q[++TAIL] = i; if (i - Q[HEAD] >= x) HEAD++; while (min1[i][j] <= min1[q[tail]][j] && head <= tail) tail--; q[++tail] = i; if (i - q[head] >= x) head++; if (i >= x) max2[i - x + 1][j] = max1[Q[HEAD]][j], min2[i - x + 1][j] = min1[q[head]][j]; } } for (int i = 1; i <= n - x + 1; i++) { for (int j = 1; j <= m - y + 1; j++) ans = max(ans, max2[i][j] - min2[i][j]); } cout << ans; return 0;
}
- 1
信息
- ID
- 703
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 62
- 已通过
- 33
- 上传者