题解 | #【模板】二维前缀和#
【模板】二维前缀和
https://www.nowcoder.com/practice/99eb8040d116414ea3296467ce81cbbc
//法1 // #include <iostream> // #include <vector> // using namespace std; // int main() { // int n,m,q; // cin >> n >> m >> q; // vector<long long> v(m+1); // vector<long long> dp(m+1); // vector<vector<long long>> ddp(n+1,v); // for(int i = 1; i <= n; i++) // { // for(int j = 1; j <= m; j++) // { // cin >> v[j]; // dp[j] = dp[j-1] + v[j];//构造一维前缀和 // ddp[i][j] = ddp[i-1][j] + dp[j];//通过一维前缀和构造二维前缀和 // } // } // //查询 // int x1,y1,x2,y2; // while(q--) // { // cin >> x1 >> y1 >> x2 >> y2; // cout << ddp[x2][y2] - ddp[x1-1][y2] - ddp[x2][y1 -1] + ddp[x1-1][y1-1] << endl; // } // return 0; // } //法2 #include <iostream> #include <vector> using namespace std; int main() { int n,m,q; cin >> n >> m >> q; vector<vector<int>> vv(n+1, vector<int>(m+1)); vector<vector<long long>> ddp(n+1,vector<long long>(m+1)); for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { cin >> vv[i][j]; ddp[i][j] = ddp[i][j-1]+ddp[i-1][j]+vv[i][j]-ddp[i-1][j-1]; } } //查询 int x1,y1,x2,y2; while(q--) { cin >> x1 >> y1 >> x2 >> y2; cout << ddp[x2][y2] - ddp[x1-1][y2] - ddp[x2][y1 -1] + ddp[x1-1][y1-1] << endl; } return 0; }