社区讨论
超雄 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 条回复,欢迎继续交流。
正在加载回复...