zoukankan      html  css  js  c++  java
  • hdu 1892 树状数组

    思路:就是一个很普通的二维树状数组,注意的是x1,y1不一定在x2,y2的左下方

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #define Maxn 1105
    #define lowbit(x) (x&(-x))
    using namespace std;
    int C[Maxn][Maxn],n=1010,LIST[Maxn][Maxn];
    int Sum(int i,int j)
    {
        int sum=0;
        int y;
        y=j;
        while(i)
        {
            j=y;
            while(j)
            {
                sum+=C[i][j];
                j-=lowbit(j);
            }
            i-=lowbit(i);
        }
        return sum;
    }
    void update(int i,int j,int val)
    {
        int y,z;
        y=j;
        while(i<=n)
        {
            j=y;
            while(j<=n)
            {
                C[i][j]+=val;
                j+=lowbit(j);
            }
            i+=lowbit(i);
        }
    }
    int main()
    {
        int x1,x2,y1,y2,q,t,num,i,Case=0,j;
        char str[2];
        for(i=1;i<=1005;i++)
            for(j=1;j<=1005;j++)
                update(i,j,1);
        for(i=1;i<=1005;i++)
            for(j=1;j<=1005;j++)
            LIST[i][j]=C[i][j];
        scanf("%d",&t);
        Case=0;
        while(t--)
        {
            memcpy(C,LIST,sizeof(C));
            scanf("%d",&q);
            printf("Case %d:
    ",++Case);
            for(i=1;i<=q;i++)
            {
                scanf("%s",&str);
                if(str[0]=='S')
                {
                    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                    x1++,y1++,x2++,y2++;
                    int a1,b1,a2,b2;
                    a1=min(x1,x2);a2=max(x1,x2);b1=min(y1,y2);b2=max(y1,y2);
                    printf("%d
    ",Sum(a2,b2)-Sum(a1-1,b2)-Sum(a2,b1-1)+Sum(a1-1,b1-1));
                }
                if(str[0]=='A')
                {
                    scanf("%d%d%d",&x1,&y1,&num);
                    x1++,y1++;
                    update(x1,y1,num);
                    //printf("%d**
    ",Sum(x1,y1));
                }
                if(str[0]=='D')
                {
                    int temp;
                    scanf("%d%d%d",&x1,&y1,&num);
                    x1++,y1++;
                    temp=Sum(x1,y1)-Sum(x1-1,y1)-Sum(x1,y1-1)+Sum(x1-1,y1-1);
                    if(temp>=num)
                        update(x1,y1,-num);
                    else
                        update(x1,y1,-temp);
                }
                if(str[0]=='M')
                {
                    scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&num);
                    x1++,y1++,x2++,y2++;
                    int temp=Sum(x1,y1)-Sum(x1-1,y1)-Sum(x1,y1-1)+Sum(x1-1,y1-1);
                    if(temp>=num)
                    {
                        update(x1,y1,-num);
                        update(x2,y2,num);
                    }
                    else
                    {
                        update(x1,y1,-temp);
                        update(x2,y2,temp);
                    }
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    Tye exception
    DataSeeder
    angular
    认证Authentication
    MVC
    Ef Core
    工作单元
    VirtualFileSystem
    中间件
    日志
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3229248.html
Copyright © 2011-2022 走看看