zoukankan      html  css  js  c++  java
  • HDU_2642_二维树状数组

    Stars

    Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others)
    Total Submission(s): 1628    Accepted Submission(s): 683


    Problem Description
    Yifenfei is a romantic guy and he likes to count the stars in the sky.
    To make the problem easier,we considerate the sky is a two-dimension plane.Sometimes the star will be bright and sometimes the star will be dim.At first,there is no bright star in the sky,then some information will be given as "B x y" where 'B' represent bright and x represent the X coordinate and y represent the Y coordinate means the star at (x,y) is bright,And the 'D' in "D x y" mean the star at(x,y) is dim.When get a query as "Q X1 X2 Y1 Y2",you should tell Yifenfei how many bright stars there are in the region correspond X1,X2,Y1,Y2.

    There is only one case.
     
    Input
    The first line contain a M(M <= 100000), then M line followed.
    each line start with a operational character.
    if the character is B or D,then two integer X,Y (0 <=X,Y<= 1000)followed.
    if the character is Q then four integer X1,X2,Y1,Y2(0 <=X1,X2,Y1,Y2<= 1000) followed.
     
    Output
    For each query,output the number of bright stars in one line.
     
    Sample Input
    5
    B 581 145
    B 581 145
    Q 0 600 0 200
    D 581 145
    Q 0 600 0 200
     
    Sample Output
    1
    0
     
    初学树状数组,看了一些文章,算是有了初步的认识。
    自己的理解:用二进制表示的方法来实现二分。一个二进制数c[k]表示的是从a[k]开始往前的lowbit(k)个数的和(lowbit(k)为k的最低位,也即将k的除最低位外的所有为置为0)。
    更新:
    void add(int k,int x)
    {
        for(int i=k;i<MAXN;i+=lowbit(i))
            c[i]+=x;   
    }

    lowbit():

    int lowbit(int x)   //取最低位
    {
        return x&(-x);
    }

    查询:

    int get_sum(int k)
    {
        int res=0;    
        for(int i=k;i>0;i-=lowbit(i))
            res+=c[i];
        return res;    
    }

    这道题是一道二维树状数组,原理其实也就是这样。

    注意:题目中坐标从0开始,可能对一颗star做两次同样的操作。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<stdlib.h>
    #include<stack>
    #include<vector>
    using namespace std;
    
    const int MAXN=1010;
    int a[MAXN][MAXN];
    bool b[MAXN][MAXN];
    
    int lowbit(int x)
    {
        return x&(-x);
    }
    
    void modify(int x,int y,int data)
    {
        for(int i=x; i<MAXN; i+=lowbit(i))
            for(int j=y; j<MAXN; j+=lowbit(j))
                a[i][j]+=data;
    }
    
    int getsum(int x,int y)
    {
        int res=0;
        for(int i=x; i>0; i-=lowbit(i))
            for(int j=y; j>0; j-=lowbit(j))
                res+=a[i][j];
        return res;
    }
    
    int main()
    {
        int n,x,y,x1,y1;
        char str[2];
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s",str);
            if(str[0]=='B')
            {
                scanf("%d%d",&x,&y);
                x++;
                y++;
                if(b[x][y]) continue;
                modify(x,y,1);
                b[x][y]=1;
            }
            else if(str[0]=='D')
            {
                scanf("%d%d",&x,&y);
                x++;
                y++;
                if(b[x][y]==0) continue;
                modify(x,y,-1);
                b[x][y]=0;
            }
            else
            {
                scanf("%d%d%d%d",&x,&x1,&y,&y1);
                x++;x1++;y++;y1++;
                if(x>x1) swap(x,x1);
                if(y>y1) swap(y,y1);
                int ans=getsum(x1,y1)-getsum(x-1,y1)-getsum(x1,y-1)+getsum(x-1,y-1);
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    day29 Pyhton 面向对象 继承进阶
    UX&UI的介绍区别
    APP设计中“登录”按钮的高度多少才好呢?经验总结!
    新人与三年经验的交互设计师有多大的差距?
    UI设计师是混哪一块?要做什么?图文结合详解
    是时候重新审视正在流行的卡片设计趋势了!
    图表设计的介绍及指导
    完整的交互设计流程应该是怎样的?
    设计师如何用产品思维提升用户体验?
    2015年最流行的渐变技巧!
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/5736166.html
Copyright © 2011-2022 走看看