1 条题解

  • 1
    @ 2017-08-18 23:14:37

    二维树状数组,代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int n,m,q,opt,st,ed,x,y,ans;
    int t[1010][1010];
    
    inline int get_num()
    {
        int now=0;int fh=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){now=(now<<3)+(now<<1)+ch-'0';ch=getchar();}
        return now*fh;
    }
    
    inline int lowbit(int x){
        return x&(-x);
    }
    
    inline int getsum(int x,int y){
        int sum=0;
        for(int i=x;i>0;i-=lowbit(i)){
            for(int j=y;j>0;j-=lowbit(j)){
                sum+=t[i][j];
            }
        }
        return sum;
    }
    
    inline void add(int x,int y,int val)
    {
        for(int i=x;i<1010;i+=lowbit(i)){
            for(int j=y;j<1010;j+=lowbit(j)){
                t[i][j]+=val;
            }
        }
    }
    
    int main()
    {
        n=get_num();m=get_num();
        st=get_num();ed=get_num();
        q=get_num();
        for(int i=1;i<=q;i++){
            opt=get_num();
            x=get_num();y=get_num();
            if(opt==0)add(x,y,1);
            if(opt==1)st=x,ed=y;
            ans=getsum(st,ed);
            printf("%d\n",ans);
        }
        return 0;
    }
    
    
  • 1

信息

难度
8
分类
(无)
标签
(无)
递交数
18
已通过
6
通过率
33%
上传者