社区讨论

超雄 Gemini

学术版参与者 6已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mk9q2jkb
此快照首次捕获于
2026/01/11 20:40
上个月
此快照最后确认于
2026/01/11 23:58
上个月
查看原帖
事情是这样的。我试图用二维 ST 表磕玉蟾宫,然鹅失败了。然后我因为娱乐希望 Gemini 帮我生成一个代码,于是就有了如下代码:
CPP
#include <iostream>
#include <cstdio>
#include <bitset>
#include <algorithm>

using namespace std;

const int N = 1005;
int n, m;
// st[k][i] 表示从第 i 行开始,向上跨度为 2^k 行的“障碍物位图”
// 这是 4D ST 表的纵向压缩版,空间只有 2MB
bitset<N> st[11][N];
int lg[N];

int main() {
    // 1. 修正输入:使用 " %c" 过滤空格
    if (scanf("%d %d", &n, &m) != 2) return 0;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            char c;
            scanf(" %c", &c);
            if (c == 'R') {
                st[0][i].set(j); // 障碍物标记为 1
            }
        }
    }

    // 2. 预处理:纵向 ST 表 (一步到位合并行信息)
    lg[0] = -1;
    for (int i = 1; i < N; i++) lg[i] = lg[i >> 1] + 1;

    for (int k = 1; k <= 10; k++) {
        for (int i = 1; i + (1 << k) - 1 <= n; i++) {
            // 这一步就是 4D ST 表的纵向合并核心
            st[k][i] = st[k - 1][i] | st[k - 1][i + (1 << (k - 1))];
        }
    }

    int max_area = 0;

    // 3. 核心查询:枚举矩形的高度 h
    for (int h = 1; h <= n; h++) {
        int kh = lg[h];
        int di = h - (1 << kh);
        for (int i = 1; i + h - 1 <= n; i++) {
            // O(1) 得到高度为 h 的这一长条的障碍物分布图
            // 只要 bit j 为 0,说明这一列连续 h 个格子都是 'F'
            bitset<N> B = st[kh][i] | st[kh][i + di];
            
            // 4. 寻找 bitset 中最长的连续 0 长度 (即最大宽度 w)
            int current_w = 0;
            for (int j = 1; j <= m; j++) {
                if (!B.test(j)) { // 如果该列没障碍
                    current_w++;
                    // 实时更新最大面积
                    if (h * current_w > max_area) max_area = h * current_w;
                } else {
                    current_w = 0;
                }
            }
        }
    }

    // 5. 按照题目要求输出 *3
    printf("%d\n", max_area * 3);

    return 0;
}
而且是对的。
这个故事充分证明,ST 表已经被 AI 磨练为了听它指挥,能 A 绿题,码风优良的人民表。

回复

5 条回复,欢迎继续交流。

正在加载回复...