BZOJ 3132: 上帝造题的七分钟 树状数组+差分
这个思路很巧妙啊 ~
code:
#include <cstdio>
#include <algorithm>
#define N 2050
#define ll int
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
struct BIT {
ll C[N][N];
int lowbit(int t) {
return t&(-t);
}
void update(int x,int y,int d) {
for(int i=x;i<N;i+=lowbit(i)) {
for(int j=y;j<N;j+=lowbit(j)) {
C[i][j]+=d;
}
}
}
ll query(int x,int y) {
ll re=0;
for(int i=x;i;i-=lowbit(i)) {
for(int j=y;j;j-=lowbit(j)) {
re+=C[i][j];
}
}
return re;
}
}A,B,C,D;
void Add(int x,int y,int d) {
A.update(x,y,d);
B.update(x,y,x*d);
C.update(x,y,y*d);
D.update(x,y,x*y*d);
}
ll qu(int x,int y) {
ll qa=A.query(x,y)*(x*y+x+y+1);
ll qb=-B.query(x,y)*(y+1);
ll qc=-C.query(x,y)*(x+1);
ll qd=D.query(x,y);
return qa+qb+qc+qd;
}
int main() {
// setIO("input");
char sr[2];
int i,j;
int n;
int m;
scanf("%s",sr);
scanf("%d%d",&n,&m);
while(scanf("%s",sr)!=EOF) {
int a,b,c,d,e;
if(sr[0]=='L') {
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
Add(a,b,e);
Add(a,d+1,-e);
Add(c+1,b,-e);
Add(c+1,d+1,e);
}
else {
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("%d\n",qu(c,d)-qu(a-1,d)-qu(c,b-1)+qu(a-1,b-1));
}
}
return 0;
}

浙公网安备 33010602011771号