一定从1开始
1 #include<iostream> 2 using namespace std; 3 int n,m; 4 const int N=1e5+10; 5 int a[N],s[N]; 6 int main(void){ 7 cin>>n>>m; 8 for(int i=1;i<=n;i++){ 9 cin>>a[i]; 10 } 11 for(int i=1;i<=n;i++){ 12 s[i]=s[i-1]+a[i]; 13 } 14 while(m--){ 15 int l,r; 16 cin>>l>>r; 17 printf("%d ",s[r]-s[l-1]); 18 } 19 return 0; 20 }
1 #include<iostream> 2 using namespace std; 3 const int N=1010; 4 int a[N][N],s[N][N]; 5 int n,m,q; 6 int main(void){ 7 cin>>n>>m>>q; 8 for(int i=1;i<=n;i++){ 9 for(int j=1;j<=m;j++){ 10 cin>>a[i][j]; 11 } 12 } 13 //用到了容斥原理 14 //s[i][j]表示所有x<=i&&y<=j的总和 15 for(int i=1;i<=n;i++){ 16 for(int j=1;j<=m;j++){ 17 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]; 18 } 19 }//构造前缀和数组 20 while(q--){ 21 int x1,y1,x2,y2; 22 cin>>x1>>y1>>x2>>y2; 23 printf("%d ",s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]); 24 } 25 return 0; 26 }