• Binary Indexed Tree 2D 分类: ACM TYPE 2014-09-01 08:40 95人阅读 评论(0) 收藏


        #include <cstdio>
        #include <cstdlib>
        #include <climits>
        #include <cstring>
        #include <algorithm>
    
        using namespace std;
        int map[1015][1015];
    
        void update(int x,int y, int n)
        {
            for(int i=x;i<=1005;i+=(i&(-i)))
            {
                for(int j=y;j<=1005;j+=(j&(-j)))
                {
                    map[i][j]+=n;
                }
            }
        }
    
        int sum(int x,int y)
        {
            int s = 0;
            for(int i=x;i>=1;i-=(i&(-i)))
            {
                for(int j=y;j>=1;j-=(j&(-j)))
                {
                    s+=map[i][j];
                }
            }
            return s;
        }
    
        int main(){
    //        freopen("exp.in","r",stdin);
            int t, q;
            char s[3];
            int x1,x2,y1,y2,n1;
            scanf("%d",&t);
            for(int i=1;i<=t;i++)
            {
                printf("Case %d:
    ",i);
                memset(map,0,sizeof(map));
                for(int j=1;j<=1005;j++)
                    for(int k = 1;k<=1005;k++)
                        update(j,k,1);
    
                scanf("%d",&q);
                for(int j=1;j<=q;j++)
                {
    
                    scanf("%s",s);
                    if(s[0]=='S')
                    {
                            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                            if(x1>x2)   swap(x1,x2);
                            if(y1>y2)   swap(y1,y2);
                            printf("%d
    ",sum(x2+1,y2+1)+sum(x1,y1)-sum(x1,y2+1)-sum(x2+1,y1));
                    }
                    else if(s[0]=='A')
                    {
                            scanf("%d%d%d",&x1,&y1,&n1);
                            update(x1+1,y1+1,n1);
                    }
                    else if(s[0]=='D')
                    {
                            scanf("%d%d%d",&x1,&y1,&n1);
                            int v = sum(x1+1,y1+1)+sum(x1,y1)-sum(x1,y1+1)-sum(x1+1,y1);
                            n1=(n1-v>0)?v:n1;
                            update(x1+1,y1+1,-n1);
                    }
                    else if(s[0]=='M')
                    {
                            scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
                            int v = sum(x1+1,y1+1)+sum(x1,y1)-sum(x1,y1+1)-sum(x1+1,y1);
                            n1=(n1-v)>0?v:n1;
                            update(x1+1,y1+1,-n1);
                            update(x2+1,y2+1,n1);
                    }
                }
            }
    //        fclose(stdin);
            return 0;
        }
    


    Code From Hdu 1982

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    微服务2:微服务全景架构
    SystemVerilog语言简介
    Slip打包与解包及MATLAB程序
    恶性卷积码
    通信原理之调制解调(2)QPSK
    FPGA仿真只适合开发定制IP的设计师?
    用CCS开发DSP应用程序的代码结构、加电装载及在线编程
    符号能量问题
    该如何选择?
    无线通信距离的计算
  • 原文地址:https://www.cnblogs.com/you-well-day-fine/p/4671629.html
Copyright © 2020-2023  润新知