1 条题解

  • 0
    @ 2025-5-4 19:12:21

    高度预处理: 对于每个网格位置 (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
    上传者