1 solutions
-
0
可以这样(实际一维做法)
#include <iostream> #include <cmath> #include <iomanip> #define int long long #define endl '\n' #define QAQ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int N=1e3+5; int a[N],sum[N][N]={0}; void solve() { int n,m,q; cin>>n>>m>>q; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { int x; cin>>x; sum[i][j]=sum[i][j-1]+x;//第i行的前j列的和//每一行求一维前缀和 } } while(q--) { int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; int summ=0; for(int i=x1;i<=x2;i++) { summ+=sum[i][y2]-sum[i][y1-1];//x1到x2每一行里面 y1到y2的和加起来得到总共的 } cout<<summ<<endl; } } signed main() { QAQ; int t=1; // cin>>t; while(t--) solve(); return 0; }
也可以(二维)
#include <iostream> #include <cmath> #include <iomanip> #define int long long #define endl '\n' #define QAQ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int N=1e3+5; int a[N],sum[N][N]={0}; void solve() { int n,m,q; cin>>n>>m>>q; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { int x; cin>>x; sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+x;//上面的矩阵加上左边的矩阵再减去他们重复部分,最后加上(i,j)位置的数就可以得到(1,1)到(i,j)的和 } } while(q--) { int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2;//求(x1,y1)到(x2,y2)之间的值 int summ=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]; //(x2,y2)的前缀和减去(x2,y1)的左边部分再减去(x1,y2)的上边部分+多减去的重复部分也就是(x1,y1)左上角部分 就得到了所求部分 cout<<summ<<endl; } } signed main() { QAQ; int t=1; // cin>>t; while(t--) solve(); return 0; }
看不懂可以画图理解一下
- 1
Information
- ID
- 6680
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 2
- Tags
- (None)
- # Submissions
- 67
- Accepted
- 39
- Uploaded By