|
发表于 2023-11-10 10:40:01
|
显示全部楼层
这段代码的问题在于数组越界访问。在函数 insert 中,使用 b[x2+1][y1] 和 b[x1][y2+1] 时,可能会访问到 b 数组的越界位置。这是因为数组 b 的大小是 N*N ,而在 insert 函数中传入的参数 x2 和 y2 的范围是 1 到 n ,当 x2+1 或 y2+1 超过 N 时,就会出现越界访问的问题。
解决这个问题的方法是,将数组 b 的大小改为 (N+1)*(N+1) ,并在循环中将 b 数组的下标从 1 到 n 的部分进行计算。这样就能够避免越界访问的问题。
修改后的代码如下:
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e5;
- int a[N][N], b[N + 1][N + 1];
- void insert(int x1, int y1, int x2, int y2, int c)
- {
- b[x1][y1] += c;
- b[x2 + 1][y1] -= c;
- b[x1][y2 + 1] -= c;
- b[x2 + 1][y2 + 1] += c;
- }
- int main()
- {
- int n, q;
- cin >> n >> q;
- for (int i = 1; i <= n; i++)
- {
- for (int j = 1; j <= n; j++)
- {
- a[ i][j] = 0;
- }
- }
- while (q--)
- {
- int x1, y1, x2, y2, c = 1;
- cin >> x1 >> y1 >> x2 >> y2;
- insert(x1, y1, x2, y2, c);
- }
- for (int i = 1; i <= n; i++)
- {
- for (int j = 1; j <= n; j++)
- {
- b[ i][j] += b[i - 1][j] + b[ i][j - 1] - b[i - 1][j - 1];
- cout << b[ i][j] << " ";
- }
- puts(" ");
- }
- }
复制代码
这样修改后,就能够避免越界访问的问题。 |
|