zoukankan      html  css  js  c++  java
  • HDU 1892 See you~ (二维树状数组)

    题目链接: 戳我

    题目大意:

    给你一个书架, 1000*1000的矩阵,即格子.每个格子初始化都是1, 有下面几种操作:

    S x1 y1 x2 y2  意思是你应该告诉我 以(X1,Y1),(X2,Y2)作为对角线,包括两点的矩形的总共有多少书。坑点: (x1, y1) 这个点不一定比 (x2, y2)这个点的小
    A x1 y1 n1  意思是在(x1, y1) 这个位置放 n1 本书

    D x1 y1 n1 意思是在 位置(X1,Y1)拿走 n1 本书,如果在那个位置上的书低于n1,则搬开所有的书。 反正不能出现负数
    M x1 y1 x2 y2 n1 把(x1, y1)这个位置的 n1 本书 移动到 (x2, y2) 这个位置.  如果在那个位置上的书低于n1,则移走所有的书

    注意: 0<=x1,y1,x2,y2<=1000,1<=n1<=100.

    简单的二维树状数组.

    //Author LJH
    //www.cnblogs.com/tenlee
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cctype>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #define clc(a, b) memset(a, b, sizeof(a))
    using namespace std;
    
    const int inf = 0x3f;
    const int INF = 0x3f3f3f3f;
    const int maxn = 1e3+5;
    
    int a[maxn][maxn];
    
    int lowbit(int x)
    {
        return x & -x;
    }
    
    void Add(int x, int y, int val)
    {
        int yy = y;
        while(x < maxn)
        {
            yy = y;
            while(yy < maxn)
            {
                a[x][yy] += val;
                yy += lowbit(yy);
            }
            x += lowbit(x);
        }
    }
    
    int Sum(int x, int y)
    {
        int yy = y, ans = 0;
        while(x)
        {
            yy = y;
            while(yy)
            {
                ans += a[x][yy];
                yy -= lowbit(yy);
            }
            x -= lowbit(x);
        }
        return ans;
    }
    
    void Init()
    {
        clc(a, 0);
        for(int i = 1; i < maxn; i++)
        {
            for(int j = 1; j < maxn; j++)
            {
                Add(i, j, 1);
            }
        }
    }
    
    int main()
    {
        int T, q, x1, y1, x2, y2, n1, sum;
        char op;
        scanf("%d", &T);
        for(int t = 1; t <= T; t++)
        {
            scanf("%d", &q);
            Init();
            printf("Case %d:
    ", t);
            while(q--)
            {
                scanf(" %c", &op);
                if(op == '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));
                }
                else if ( op == 'A' )
                {
                    scanf("%d %d %d", &x1, &y1, &n1);
                    Add(x1+1, y1+1, n1);
                }
                else if( op == 'D' )
                {
                    int temp;
                    scanf("%d %d %d", &x1, &y1, &n1);
                    x1++, y1++;
                    temp = Sum(x1,y1) - Sum(x1-1,y1) - Sum(x1,y1-1) + Sum(x1-1,y1-1);
                    if(temp >= n1)
                        Add(x1, y1, -n1);
                    else
                        Add(x1, y1, -temp);
                }
                else if(op == 'M')
                {
                    scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &n1);
                    x1++, y1++, x2++, y2++;
                    int temp = Sum(x1,y1) - Sum(x1-1,y1) - Sum(x1,y1-1) + Sum(x1-1,y1-1);
                    if(temp >= n1)
                    {
                        Add(x1, y1, -n1);
                        Add(x2, y2, n1);
                    }
                    else
                    {
                        Add(x1, y1, -temp);
                        Add(x2, y2, temp);
                    }
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    应用实例-最大子列和问题
    什么是算法
    什么是数据结构
    数据结构与算法-Python/C(目录)
    collections模块
    色彩缤纷的Python(改变字体颜色及样式)
    取数组中一段值的算法(转)
    开发者必备,超实用的PHP代码片段(转)
    php中数组自定义排序
    rand值出现负数的解决方案
  • 原文地址:https://www.cnblogs.com/tenlee/p/4554610.html
Copyright © 2011-2022 走看看