洛谷 P3397 地毯(二位前缀和+差分)

题目链接: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("\n");
19     }
20     return 0;
21 }
AC代码

 

posted @ 2020-08-01 12:45  dfydn  阅读(199)  评论(0编辑  收藏  举报