http://acm.hdu.edu.cn/showproblem.php?pid=1892&&二维树状数组

二维树状数组,,,,今天长见识了。。。

这一题题意:对一个矩形框的书进行,插入,挪动,删除。。。。

#include<cstdio> #include<algorithm> #include<string.h> #include<iostream> using namespace std; #define N 1005 int s[N][N]; int lowbit(int x) {return x&(-x);} void update(int x,int y,int v) { for(int i=x;i<N;i+=lowbit(i)) for(int j=y;j<N;j+=lowbit(j)) s[i][j]+=v; } int Quary(int x,int y) { int sum=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) sum+=s[i][j]; return sum; } int main() { int T; scanf("%d",&T); for(int k=1;k<=T;++k) { printf("Case %d:\n",k); int n; scanf("%d",&n); char ch[10]; int a,b,c,d,e; memset(s,0,sizeof(s)); for(int i=1;i<N;++i) for(int j=1;j<N;++j) update(i,j,1); while(n--) { scanf("%s",ch); if(ch[0]=='A') { scanf("%d%d%d",&a,&b,&c); update(a+1,b+1,c); } else if(ch[0]=='D') { scanf("%d%d%d",&a,&b,&c); int v=Quary(a+1,b+1)-Quary(a+1,b)-Quary(a,b+1)+Quary(a,b); if(v<c) c=v; update(a+1,b+1,-c); } else if(ch[0]=='M') { scanf("%d%d%d%d%d",&a,&b,&c,&d,&e); int v=Quary(a+1,b+1)-Quary(a+1,b)-Quary(a,b+1)+Quary(a,b); if(v<e) e=v; update(a+1,b+1,-e); update(c+1,d+1,e); } else if(ch[0]=='S') { scanf("%d%d%d%d",&a,&b,&c,&d); if(a>c) swap(a,c); if(b>d) swap(b,d); int res=Quary(c+1,d+1)-Quary(a,d+1)-Quary(c+1,b)+Quary(a,b); printf("%d\n",res); } } }return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值