题解:
二维树状数组,再矩阵推一下
代码:
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=210; int n,m,q; LL T[4][N][N]; int TN,TM; void add(LL (*T)[N],int x,int y,LL v) { if (!x||!y)return; for (int i=x;i<=TN;i+=i&-i) for (int j=y;j<=TM;j+=j&-j)T[i][j]+=v; } LL sum(LL (*T)[N],int x,int y) { if (!x||!y)return 0LL; LL v=0; for (int i=x;i;i-=i&-i) for (int j=y;j;j-=j&-j)v+=T[i][j]; return v; } void add(int x,int y,LL v) { add(T[0],x,y,v); add(T[1],x,y,v*(-x)); add(T[2],x,y,v*(-y)); add(T[3],x,y,v*(-x)*(-y)); } LL sum(int x, int y) { return (x+1)*(y+1)*sum(T[0],x,y)+(y+1)*sum(T[1],x,y )+(x+1)*sum(T[2],x,y)+sum(T[3],x,y); } void add(int x1,int y1,int x2,int y2,LL v) { add(x1,y1,v); add(x2+1,y1,-v); add(x1,y2+1,-v); add(x2+1,y2+1,v); } LL sum(int x1, int y1, int x2, int y2) { return sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1); } int main() { scanf("%d%d%d",&n,&m,&q); TN=n;TM=m; for (int i=1;i<=m;i++) for (int j=1;j<=n;j++) { int x; scanf("%d",&x); add(j,i,j,i,x); } for (int i=0;i<q;i++) { int x1,y1,x2,y2,z,a; scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&z,&a); LL s = sum(x1, y1, x2, y2); if (s<(LL)z*(x2-x1+1)*(y2-y1+1))add(x1,y1,x2,y2,a); } for (int i=1;i<=m;i++) for (int j=1;j<=n;j++) printf("%lld%c",sum(j,i,j,i),j==n?‘\n‘:‘ ‘); }
时间: 2024-11-10 17:14:57