1. 程式人生 > >hdu2642二維樹狀陣列單點更新

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; }