hdu 2642 Stars 【二维树状数组】

题目

题目大意: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决定的矩形里。

  1. B x y:点(x,y)处的星星变亮

  2. D x y:点(x,y)处的星星变暗

  3. Q x1 x2 y1 y2:查询左下角(x1,y1)和右上角(x2,y2)的矩形

#include <iostream>
#include <cstdio>
using namespace std;

const int Max = 1010;
int c[Max][Max];
int vis[Max][Max];

int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int y,int val)
{
    int t;
    while(x<=Max){
         t = y;
        while(t<=Max){
         c[x][t]+=val;
         t+=lowbit(t);
        }
        x+=lowbit(x);
    }
}

int sum(int x,int y)
{
    int res=0;
    while(x>0){
        int t = y;
        while(t>0){
            res+=c[x][t];
            t-=lowbit(t);
        }
        x-=lowbit(x);
    }
    return res;
}
int main()
{
    int M,x,y;
    string str;
    scanf("%d",&M);
    while(M--)
    {
        cin>>str;
        if(str[0]=='B'){
            scanf("%d%d",&x,&y);
            x++,y++;
            if(!vis[x][y]){
                vis[x][y] = 1;
                update(x,y,1);
            }
        }else if(str[0]=='Q'){
            int x1,y1,x2,y2;
            scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
            x1++,x2++,y1++,y2++;
            int X,Y;
            X = max(x1,x2);
            x = min(x1,x2);
            Y = max(y1,y2);
            y = min(y1,y2);
            int ans = sum(X,Y)+sum(x-1,y-1)-sum(X,y-1)-sum(x-1,Y);
            printf("%d
",ans);
        }else{//D
            scanf("%d%d",&x,&y);
            x++,y++;
            if(vis[x][y]){
                vis[x][y]=0;
                update(x,y,-1);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/qie-wei/p/10160177.html