HDU2642 Stars 二维树状数组

来源:互联网 发布:淘宝直播账号出售 编辑:程序博客网 时间:2024/05/16 19:03

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2642


题目大意:Yifenfei是一个浪漫的人,他喜欢数天上的星星。为了使问题变得更容易,我们假设天空是一个二维平面,上面的星星有时会亮,有时会发暗。最开始,没有明亮的星星在天空中,然后将给出一些信息,“B XY”,其中“B”代表明亮,x代表X坐标和Y代表Y坐标是指在(X,Y)的明星是光明的,而在“D XY”'D'的意思是灰暗的星星在(X , Y).当得到“Q X1 X2 Y1 Y2”的查询,你应该告诉Yifenfei在该地区有多少明亮的星星在X1,X2,Y1,Y2决定的矩形里。


实现代码如下:

/*二维树状数组B x y:点(x,y)处的星星变亮D x y:点(x,y)处的星星变暗Q x1 x2 y1 y2:查询左下角(x1,y1)和右上角(x2,y2)的矩形*/#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int M=1010;int a[M][M];bool vis[M][M];int lowbit(int i){    return i&(-i);}void update(int x,int y,int v){    for(int i=x;i<M;i+=lowbit(i))      for(int j=y;j<M;j+=lowbit(j))        a[i][j]+=v;}int query(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+=a[i][j];    return sum;}int main(){    int t,x,y;    char op[5];    memset(vis,0,sizeof(vis));    scanf("%d",&t);    while(t--)    {        scanf("%s",op);        if(op[0]=='B')        {            scanf("%d%d",&x,&y);            x++; y++;            if(!vis[x][y])            {                vis[x][y]=true;                update(x,y,1);            }        }        else if(op[0]=='D')        {            scanf("%d%d",&x,&y);            x++; y++;            if(vis[x][y])            {                vis[x][y]=false;                update(x,y,-1);            }        }        else        {            int x1,y1;            scanf("%d%d%d%d",&x,&x1,&y,&y1);            x++; y++; x1++; y1++;            if(x<x1) swap(x,x1);            if(y<y1) swap(y,y1);            printf("%d\n",query(x,y)-query(x,y1-1)-query(x1-1,y)+query(x1-1,y1-1));        }    }    return 0;}



0 0
原创粉丝点击