hdu2642二维树状数组,单点修改+区间查询
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2642/
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define scan(n) scanf("%d",&n) 4 #define f(i,a,b) for(int i=a;i<=b;i++) 5 #define pf printf 6 #define maxn 1005 7 int c[maxn][maxn]; 8 int lowbit(int x) 9 { 10 return x&(-x); 11 } 12 void update(int x,int y,int C) 13 { 14 for(int i=x;i<maxn;i+=lowbit(i)) 15 { 16 for(int j=y;j<maxn;j+=lowbit(j)) 17 { 18 c[i][j]+=C; 19 } 20 } 21 } 22 int query(int x,int y) 23 { 24 int ans=0; 25 for(int i=x;i;i-=lowbit(i)) 26 { 27 for(int j=y;j;j-=lowbit(j)) 28 { 29 ans+=c[i][j]; 30 } 31 } 32 return ans; 33 } 34 int query(int x,int y,int xx,int yy) 35 { 36 return query(xx,yy)+query(x-1,y-1)-query(x-1,yy)-query(xx,y-1); 37 } 38 int main() 39 { 40 int n; 41 //freopen("input.txt","r",stdin); 42 //freopen("output.txt","w",stdout); 43 scan(n); 44 char s[4]; 45 int x,y,xx,yy; 46 while(n--) 47 { 48 scanf("%s",&s); 49 if(s[0]=='B') 50 { 51 scan(x); 52 scan(y); 53 x++;y++; 54 if(query(x,y,x,y))continue; 55 update(x,y,1); 56 } 57 else if(s[0]=='D') 58 { 59 scan(x); 60 scan(y); 61 x++,y++; 62 if(!query(x,y,x,y))continue; 63 update(x,y,-1); 64 } 65 else if(s[0]=='Q') 66 { 67 scanf("%d%d%d%d",&x,&xx,&y,&yy); 68 if(x>xx)swap(x,xx); 69 if(y>yy)swap(y,yy); 70 x++,y++,xx++,yy++; 71 pf("%d\n",query(x,y,xx,yy)); 72 } 73 } 74 }
每一个不曾起舞的日子,都是对生命的辜负。