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

来源:互联网 发布:折800软件怎么样 编辑:程序博客网 时间:2024/04/30 06:40

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

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

#include<cstdio>#include<algorithm>#include<string.h>#include<iostream>using namespace std;#define N 1005int 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;}


原创粉丝点击