• Xtreme9.0


    Block Art

    题目连接:

    https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/block-art

    Description

    The NeoCubist artistic movement has a very distinctive approach to art. It starts with a rectangle which is divided into a number of squares. Then multiple rounds of layering and scraping occur. In a layering round, a rectangular region of this canvas is selected and a layer of cubes, 1 cube deep, is added to the region. In a scraping round, a rectangular region of the canvas is selected, and a layer of cubes, again 1 cube deep, is removed.

    The famous artist I.M. Blockhead seeks your help during the creation of this artwork. As he is creating his art, he is curious to know how many blocks are in different regions of the canvas.

    Your task is to write a program that tracks the creation of a work of Pseudo-Cubist art, and answers I.M.’s periodic queries about the number of blocks that are on the canvas. Consider, for example, the following artwork created on a canvas with 5 rows and 15 columns or squares. The canvas starts without any blocks, like in the figure below. We label cells in the canvas based on the tuple (row,column), with the upper left corner being designated (1,1). The numbers in each cell represent the height of the blocks in that cell.

    fig1.jpg

    After adding a layer in blocks to the rectangle with upper left corner at (2,3) and a lower right corner of (4, 10), the canvas now looks like the following:

    fig2.jpg

    After adding a layer of blocks in the rectangle with upper left corner at (3,8) and a lower right corner of (5, 15), the canvas now looks like the following:

    fig3.jpg

    If Blockhead were to ask how many blocks are currently in the artwork in the rectangle with upper left corner (1,1) and lower right corner (5,15), you would tell him 48.

    Now, if we remove a layer of blocks from the rectangle with upper left corner at (3,6) and a lower right corner of (4, 12), the canvas now looks like the following:

    fig4.jpg

    If Blockhead were to ask how many blocks are now in the artwork in the rectangle with upper left corner (3,5) and lower right corner (4,13), you would tell him 10.

    “Beautiful!” exclaims Blockhead.

    Input

    The first line in each test case are two integers r and c, 1 <= r <= 12, 1 <= c <= 106, where r is the number of rows and c is the number of columns in the canvas.

    The next line of input contains an integer n, 1 <= n <= 104.

    The following n lines of input contain operations and queries done on the initially empty canvas. The operations will be in the following format:

    [operation] [top left row] [top left column] [bottom right row] [bottom right column]

    [operation] is a character, either “a” when a layer of blocks is being added, “r” when a layer of blocks is being removed, and “q” when Blockhead is asking you for the number of blocks in a region.

    The remaining values on the line correspond to the top left and bottom right corners of the rectangle.

    Note: You will never be asked to remove a block from a cell that has no blocks in it.

    Output

    For each “q” operation in the input, you should output, on a line by itself, the number of blocks in the region of interest.

    Sample Input

    5 15
    5
    a 2 3 4 10
    a 3 8 5 15
    q 1 1 5 15
    r 3 6 4 12
    q 3 5 4 13

    Sample Output

    48
    10

    Hint

    题意

    给你一个矩形,然后你需要维护三个操作

    使得一个矩形区域都加1,使得一个矩形区域减一,查询一个矩形区域的和

    题解

    仔细观察可以知道,这个矩形的宽才12,所以直接暴力一维线段树就好了。

    二维线段树会mle

    所以我们对于每一行都单独处理就好了,这样就能把空间省下来。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6+7;
    struct node{
        typedef int SgTreeDataType;
        struct treenode
        {
            int L , R  ;
            SgTreeDataType sum , lazy;
            void update(SgTreeDataType v)
            {
                sum += (R-L+1)*v;
                lazy += v;
            }
        };
    
        treenode tree[maxn*4];
    
        inline void push_down(int o)
        {
            SgTreeDataType lazyval = tree[o].lazy;
            tree[2*o].update(lazyval) ; tree[2*o+1].update(lazyval);
            tree[o].lazy = 0;
        }
    
        inline void push_up(int o)
        {
            tree[o].sum = tree[2*o].sum + tree[2*o+1].sum;
        }
    
        inline void build_tree(int L , int R , int o)
        {
            tree[o].L = L , tree[o].R = R,tree[o].sum = tree[o].lazy = 0;
            if (R > L)
            {
                int mid = (L+R) >> 1;
                build_tree(L,mid,o*2);
                build_tree(mid+1,R,o*2+1);
            }
        }
    
        inline void update(int QL,int QR,SgTreeDataType v,int o)
        {
            int L = tree[o].L , R = tree[o].R;
            if (QL <= L && R <= QR) tree[o].update(v);
            else
            {
                push_down(o);
                int mid = (L+R)>>1;
                if (QL <= mid) update(QL,QR,v,o*2);
                if (QR >  mid) update(QL,QR,v,o*2+1);
                push_up(o);
            }
        }
    
        inline SgTreeDataType query(int QL,int QR,int o)
        {
            int L = tree[o].L , R = tree[o].R;
            if (QL <= L && R <= QR) return tree[o].sum;
            else
            {
                push_down(o);
                int mid = (L+R)>>1;
                SgTreeDataType res = 0;
                if (QL <= mid) res += query(QL,QR,2*o);
                if (QR > mid) res += query(QL,QR,2*o+1);
                push_up(o);
                return res;
            }
        }
    }T;
    int r,c;
    int ans[10005];
    string op[10005];
    int x1[10005],Y1[10005],x2[10005],y2[10005];
    int main()
    {
        scanf("%d%d",&r,&c);
        int m;scanf("%d",&m);
        for(int i=1;i<=m;i++)
            cin>>op[i],scanf("%d%d%d%d",&x1[i],&Y1[i],&x2[i],&y2[i]);
        for(int i=1;i<=r;i++){
            T.build_tree(1,c,1);
            for(int j=1;j<=m;j++){
                if(x1[j]<=i&&i<=x2[j]){
                    if(op[j][0]=='q')ans[j]+=T.query(Y1[j],y2[j],1);
                    if(op[j][0]=='a')T.update(Y1[j],y2[j],1,1);
                    if(op[j][0]=='r')T.update(Y1[j],y2[j],-1,1);
                }
            }
        }
        for(int i=1;i<=m;i++)
            if(op[i][0]=='q')
                cout<<ans[i]<<endl;
    
    }
  • 相关阅读:
    CF 1114D(538,div2) Flood Fill
    UVA 1640 The Counting Problem
    UVA 11971 Polygon
    UVA 1639 Candy
    CCPC 2019 秦皇岛 Angle Beats
    UVA1153-Keep the Customer Satisfied(贪心)
    UVA1613-K-Graph Oddity(贪心)
    UVA11925-Generating Permutations(贪心)
    UVA11491-Erasing ans Winning(贪心)
    UVA12545-Bits Equalizer(思维)
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5958824.html
Copyright © 2020-2023  润新知