上帝造题的七分钟(树桩数组乱搞)
类比一维的树桩数组,进行二维的操作
需要差分数组,从别的博客应该可以找的比较好的图的啦
#include<bits/stdc++.h> #define lowbit(x) x&(-x) using namespace std; int n,m,num,x,y,xx,yy; char c[3]; const int N=2050; struct node { int tree[N][N]; int query(int x,int y) { int res=0; for (int i=x;i>=1;i-=lowbit(i)) for (int j=y;j>=1;j-=lowbit(j)) res+=tree[i][j]; return res; } void add(int x,int y,int num) { for (int i=x;i<=n;i+=lowbit(i)) for (int j=y;j<=n;j+=lowbit(j)) tree[i][j]+=num; } } A,Ai,Aj,Aij; void add(int x,int y,int num) { A.add(x,y,num); Ai.add(x,y,num*x); Aj.add(x,y,num*y); Aij.add(x,y,num*x*y); } int ans(int x,int y) { return A.query(x,y)*(x*y+x+y+1)- Ai.query(x,y)*(y+1)- Aj.query(x,y)*(x+1)+ Aij.query(x,y); } int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();} return x*f; } int main() { scanf("X "); n=read();m=read(); while (~scanf("%s",&c)) { x=read();y=read();xx=read();yy=read(); if (c[0]=='L') { num=read(); add(x,y,num); add(x,yy+1,-num); add(xx+1,y,-num); add(xx+1,yy+1,num); } else { printf("%d\n",ans(xx,yy)-ans(x-1,yy)-ans(xx,y-1)+ans(x-1,y-1)); } } return 0; }
慢即是快,细则是能,于小处铸迤逦