题目链接:https://www.luogu.com.cn/problem/P3397
画图理解:
二维前缀和:
s[x][y]=s[x-1][y]+s[x][y-1]-s[x-1][y-1]+a[x][y]
二维差分:(对(x1,y1)到(x2,y2)的a +1)
d[x1][y1]+=1; d[x1][y2+1]-=1; d[x1+1][y2]-=1; d[x2+1][y2+1]+=1;
这道题只需要构建出二维差分数组d,然后最后对d做前缀和即可。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m; 5 int d[1005][1005]; 6 int main(){ 7 scanf("%d%d",&n,&m); 8 for(int i=1;i<=m;i++){ 9 int x1,y1,x2,y2; 10 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 11 d[x1][y1]+=1; 12 d[x1][y2+1]-=1; 13 d[x2+1][y1]-=1; 14 d[x2+1][y2+1]+=1; 15 } 16 for(int i=1;i<=n;i++){ 17 for(int j=1;j<=n;j++) printf("%d ",d[i][j]+=d[i-1][j]+d[i][j-1]-d[i-1][j-1]); 18 printf(" "); 19 } 20 return 0; 21 }