vijos 1512 SuperBrother打鼹鼠

背景

SuperBrother在机房里闲着没事干(再对比一下他的NOIP,真是讽刺啊......),于是便无聊地开始玩“打鼹鼠”......

描述

在这个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……)。洞口都在一个大小为n(n<=1024)的正方形中。这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1)。洞口所在的位置都是整点,就是横纵坐标都为整数的点。而SuperBrother也不时地会想知道某一个范围的鼹鼠总数。这就是你的任务。

格式

输入格式

每个输入文件有多行。

第一行,一个数n,表示鼹鼠的范围。

以后每一行开头都有一个数m,表示不同的操作:
m=1,那么后面跟着3个数x,y,k(0<=x,y<n),表示在点(x,y)处新出现了k只鼹鼠;
m=2,那么后面跟着4个数x1,y1,x2,y2(0<=x1<=x2<n,0<=y1<=y2<n),表示询问矩形(x1,y1)-(x2,y2)内的鼹鼠数量;
m=3,表示老师来了,不能玩了。保证这个数会在输入的最后一行。

询问数不会超过10000,鼹鼠数不会超过maxlongint。

输出格式

对于每个m=2,输出一行数,这行数只有一个数,即所询问的区域内鼹鼠的个数。

样例1

样例输入1

4
1 2 2 5
2 0 0 2 3
3

样例输出1

5

限制

各个测试点1s

提示

水题一道。

所有数据均为随机生成,包括样例……

来源

gnaggnoyil

 

****这道题是树状数组中的单点修改+区间查询。

*首先呢,每一个每一次都要把坐标加一,因为树状数组中的下标如果是0的话会陷入死循环。

**然后勒,就是二维数组求和的神奇问题啦

*这是(c,d)的前缀和。

*上面那层橙色是(c,b - 1)的前缀和

*黄色是(a-1,d)的前缀和,这时候可以明显的发现减去的部分有重叠的地方,这个地方就是(a-1,b-1)的前缀和,所以把这块加上就是要求的答案啦。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int i,j,m,n,x,y,k,a,b,c,d,tree[1030][1030] = {0};
 7 int lowbit(int p)
 8 {
 9     return p & (-p);
10 }
11 void add(int x,int y,int k)
12 {
13     int mey = y;
14     while(x <= n)
15     {
16         y = mey;
17         while(y <= n)
18         {
19             tree[x][y] += k;
20             y += lowbit(y);
21         }
22         x += lowbit(x);
23     }
24 }
25 int chaxun(int a,int b)
26 {
27     int res = 0;
28     int mey;
29     mey = b;
30     while(a >= 1)
31     {
32         b = mey;
33         while(b >= 1)
34         {
35             res += tree[a][b];
36             b -= lowbit(b);
37         }
38         a -= lowbit(a);
39     }
40     return res;
41 }
42 int daan(int a,int b,int c,int d)
43 {
44     return chaxun(c,d) - chaxun(c,b-1) - chaxun(a-1,d) + chaxun(a - 1,b - 1);
45 }
46 int main()
47 {
48     scanf("%d",&n);
49     scanf("%d",&m);
50     while(m != 3)
51     {
52         if(m == 1)
53         {
54             scanf("%d %d %d",&x,&y,&k);
55             x++;
56             y++;
57             add(x,y,k);
58         }
59         else
60         {
61             scanf("%d %d %d %d",&a,&b,&c,&d);
62             a++;
63             b++;
64             c++;
65             d++;
66             printf("%d
",daan(a,b,c,d));
67         }
68         scanf("%d",&m);
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/rax-/p/9588069.html