hdu2642二维树状数组单点更新

碰到这种题一定要注意坐标是不是有序的,也要注意坐标是不是有0的,有的话需要+1处理

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
int bit[maxn][maxn],flag[maxn][maxn]; 
char op[5];
void add(int x,int y,int num){
    for(int i=x;i<=1002;i+=i&-i)
        for(int j=y;j<=1002;j+=j&-j)
            bit[i][j]+=num;
}    
int query(int x,int y){
    int res=0;
    for(int i=x;i;i-=i&-i)
        for(int j=y;j;j-=j&-j)
            res+=bit[i][j];
    return res;
}    
int main(){
    int m,x1,y1,x2,y2;
    while(scanf("%d",&m)==1){
        memset(bit,0,sizeof bit);
        memset(flag,0,sizeof flag);
        while(m--){
            scanf("%s",op);
            if(op[0]=='B'){
                scanf("%d%d",&x1,&y1);
                x1++,y1++;
                if(flag[x1][y1]) continue;
                add(x1,y1,1);
                flag[x1][y1]=1;
            }
            else if(op[0]=='D'){
                scanf("%d%d",&x1,&y1);    
                x1++,y1++;
                if(flag[x1][y1]==0) continue;
                add(x1,y1,-1);
                flag[x1][y1]=0;
            }
            else {
                scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
                x1++,y1++,x2++,y2++;
                if(x1>x2) swap(x1,x2);
                if(y1>y2) swap(y1,y2);
                printf("%d\n",query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1));
            }
        }
    }
    return 0;
}    

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10101419.html