您的位置:首页 > 其它

【bzoj 3132】上帝造题的七分钟(二维树状数组)

2017-10-08 21:02 465 查看
传送门biu~



#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
using namespace std;
int n,m;
struct tree{
int a[2050][2050];
void add(int x,int y,int v){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=m;j+=lowbit(j))
a[i][j]+=v;
}
int search(int x,int y){
int re=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
re+=a[i][j];
return re;
}
}a,bi,bj,c;
inline void add(int x1,int yl,int x2,int y2,int val){
a.add(x1,yl,val);       a.add(x2+1,y2+1,val);               a.add(x1,y2+1,-val);            a.add(x2+1,yl,-val);
bi.add(x1,yl,val*x1);   bi.add(x2+1,y2+1,val*(x2+1));       bi.add(x1,y2+1,-val*x1);        bi.add(x2+1,yl,-val*(x2+1));
bj.add(x1,yl,val*yl);   bj.add(x2+1,y2+1,val*(y2+1));       bj.add(x1,y2+1,-val*(y2+1));    bj.add(x2+1,yl,-val*yl);
c.add(x1,yl,val*x1*yl); c.add(x2+1,y2+1,val*(x2+1)*(y2+1)); c.add(x1,y2+1,-val*x1*(y2+1));  c.add(x2+1,yl,-val*(x2+1)*yl);
}
inline int search(int x,int y){return a.search(x,y)*(x+1)*(y+1)+c.search(x,y)-bi.search(x,y)*(y+1)-bj.search(x,y)*(x+1);}
int main(){
char opt;
scanf("%s%d%d",&opt,&n,&m);
while(~scanf("%s",&opt)){
if(opt=='L'){
int x1,yl,x2,y2,val;
scanf("%d%d%d%d%d",&x1,&yl,&x2,&y2,&val);
add(x1,yl,x2,y2,val);
}
else{
int x1,yl,x2,y2;
scanf("%d%d%d%d",&x1,&yl,&x2,&y2);
int ans=search(x2,y2)+search(x1-1,yl-1)-search(x1-1,y2)-search(x2,yl-1);
printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: