2 条题解
-
2
对于测试点 ,可以直接枚举行的范围,再全排列检查有多少个是符合条件的。
本题属于优化暴力类型,则我们需要一个高级数据结构优化全排列的过程,这个过程其实是在查询有多少个区间包含当前区间。
只需要用树状数组和离线查询就可以了,具体看代码。
#include <bits/stdc++.h> using namespace std; using uint = unsigned int; using ll = long long; using ull = unsigned long long; constexpr size_t N = 3005; int n, m; char grid[N][N]; array<int, 2> arr[N * N]; int tot; int tree[N]; void add(int i) { while (i <= m) { tree[i]++; i += i & -i; } } int query(int i) { int res = 0; while (i > 0) { res += tree[i]; i &= i - 1; } return res; } int query(int l, int r) { return query(r) - query(l - 1); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> grid[j][i]; } } swap(n, m); for (int i = 1; i <= n; i++) { for (int l = 1, r = 1; l <= m; l = ++r) { if (grid[i][r] == '1') { continue; } while (r < m && grid[i][l] == grid[i][r + 1]) { r++; } arr[++tot][0] = l; arr[tot][1] = r; } } sort(arr + 1, arr + tot + 1); int p = 1; int res = 0; for (int i = 1; i <= m; i++) { while (p <= tot && arr[p][0] <= i) { add(arr[p++][1]); } for (int j = i; j <= m; j++) { res = max(res, (j - i + 1) * query(j, m)); } } cout << res << '\n'; return 0; }
- 1
信息
- ID
- 2776
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 13
- 已通过
- 9
- 上传者