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 }

 

posted on 2013-03-21 10:19  行者1992  阅读(167)  评论(0编辑  收藏  举报