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
",query(x,y,xx,yy));
72         }
73     }
74 }
原文地址:https://www.cnblogs.com/randy-lo/p/12438893.html