zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Building a flexiable renderer
    Indirect Illumination in mental ray
    我的心情
    Cellular Automata
    Subsurface Scattering in mental ray
    Shader Types in mental ray
    BSP Traversal
    我的渲染器终于达到了MR的速度
    How to handle displacement and motion blur
    说明
  • 原文地址:https://www.cnblogs.com/rax-/p/9588069.html
Copyright © 2011-2022 走看看