hdu 2642 Stars 树状数组
Stars
1 /*
2 写于13年3月21日
3 单点更新,区间求和,二维树状数组
4 输入x1,x2,y1,y2时,输成了x1,y1,x2,y2。调试了两个小时,汗!
5
6 注意:i=0||j=0时,lowbit()返回0 ,add()函数会进入死循环
7 所以数据输入后进行自加操作
8 */
9 #include <iostream>
10 #include <stdio.h>
11 #include <string.h>
12 using namespace std;
13 const int maxn=1010;
14 int tree[maxn][maxn];
15 int marked[maxn][maxn];
16 int lowbit(int i)
17 {
18 return i&(-i);
19 }
20 void add(int x,int y,int num)
21 {
22 //i=0||j=0时,lowbit()返回0 ,死循环
23 for(int i=x;i<=maxn;i+=lowbit(i))
24 {
25 for(int j=y;j<=maxn;j+=lowbit(j))
26 {
27
28 tree[i][j]+=num;
29 }
30
31 }
32 }
33 int sum(int x,int y)
34 {
35 int ans=0;
36 for(int i=x;i>0;i-=lowbit(i))
37 {
38 for(int j=y;j>0;j-=lowbit(j))
39 {
40 ans+=tree[i][j];
41 }
42 }
43
44 return ans;
45 }
46 int main()
47 {
48 int n;
49 char c;
50 int x1,y1,x2,y2;
51 sum(0,0);
52 while(cin>>n)
53 {
54 memset(marked,0,sizeof(marked));//标记该点的亮灭,决定是否更新
55 while(n--)
56 {
57 //还有就是C中的输入字符操作真心不好操控啊!
58 cin>>c;
59 if(c=='B')
60 {
61 cin>>x1>>y1;
62 x1++,y1++;
63 if(!marked[x1][y1])
64 {
65 marked[x1][y1]=1;
66 add(x1,y1,1);
67 }
68 }
69 else if(c=='D')
70 {
71 cin>>x1>>y1;
72 x1++,y1++;
73 if(marked[x1][y1])
74 {
75 marked[x1][y1]=0;
76 add(x1,y1,-1);
77 }
78 }
79 else if(c=='Q')
80 {
81 cin>>x1>>x2>>y1>>y2;
82 x1++,y1++;
83 x2++,y2++;
84 if(x1<x2)swap(x1,x2);
85 if(y1<y2)swap(y1,y2);
86 //x2,y2处的点也要进入求和,故需要减1,容斥原理
87 int ans=sum(x1,y1)-sum(x1,y2-1)-sum(x2-1,y1)+sum(x2-1,y2-1);
88 cout<<ans<<endl;
89 }
90 }
91 }
92 return 0;
93 }