246 字
1 分钟
前缀和
- 基本的代码
vector<int> pre(n + 1, 0); for (int i = 0; i < n; i++) { pre[i + 1] = pre[i] + o[i]; }- 主要是在O(1)用来算一段区间的和
二维前缀和
ll a[N][N], pre[N][N];void solve(){ ll n, m, c; cin >> n >> m >> c; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) cin >> a[i][j]; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) pre[i][j] = pre[i][j - 1] + pre[i - 1][j] - pre[i - 1][j - 1] + a[i][j]; ll ans = -INF; ll x = 0, y = 0; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { if(i + c - 1 > n || j + c - 1 > m) continue; if(ans < pre[i + c - 1][j + c - 1] - pre[i + c - 1][j - 1] - pre[i - 1][j +c - 1] + pre[i - 1][j - 1]) { ans = pre[i + c - 1][j + c - 1] - pre[i + c - 1][j - 1] - pre[i - 1][j+ c - 1] + pre[i - 1][j - 1]; x = i, y = j; } } } cout << x << " " << y << '\n';}部分信息可能已经过时