1 条题解
-
0
高度预处理: 对于每个网格位置 (i,j),计算从该位置向上连续 'F' 的数量 high[i][j]: 若 (i,j) 是 'F',则 high[i][j] = high[i-1][j] + 1(累加上方连续高度)。 若 (i,j) 是 'R',则 high[i][j] = 0(高度重置为 0)。 单调栈计算最大矩形面积: 对每一行 i,将 high[i][1...l] 视为柱状图的高度数组。 使用单调递增栈维护可能的矩形左边界,遍历每个高度时: 当遇到比栈顶高度小的高度时,弹出栈顶元素并计算以该高度为高的最大矩形面积。 面积计算公式:高度 × 宽度,其中宽度为连续可扩展的列数。 结果计算: 记录所有行中的最大矩形面积 msl,最终输出 3 × msl(题目特定要求)。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstdlib> #include<queue> #include<cstring> #include<vector> #define ll long long #define inf 0x3f3f3f3f using namespace std; //char space[1010][1010]; int high[1010][1010]; struct tang{ int hig; int len; }; vector<tang> work; int main() { int k; cin >> k; for (int z = 0; z < k; z++) { int l, h; cin >> h >> l; for (int i = 1; i <= h; i++) { for (int j = 1; j <= l; j++) { char c = getchar(); while (c != 'R' && c != 'F') c = getchar(); if (c == 'F') high[i][j] = high[i - 1][j] + 1; else high[i][j] = 0; } } int msl = 0; for (int i = 1; i <= h; i++) { int ms = 0; for (int j = 1; j <= l + 1; j++) { tang x = { high[i][j],1 }; int leni = 0; int m=0; while (work.size() && work.back().hig > x.hig) { leni += work.back().len; m = max(m, leni * work.back().hig); work.pop_back(); } leni += x.len; x.len = leni; work.push_back(x); ms = max(ms, m); } work.clear(); msl = max(msl, ms); } cout << 3 * msl << endl; } }
- 1
信息
- ID
- 965
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者