ACM训练日记—8月14日

来源:互联网 发布:如何保证数据的准确性 编辑:程序博客网 时间:2024/05/20 05:07

        今天算是艰难的一天,只A了两道题,几乎看了一天的单调队列博客,算是了解了单调队列解决的一类题型。

        第一道题是直方图中最大的矩形,这道题刚看到时感觉很懵,第一反应想到既然是由一个个宽一的矩形排列的直方图,从中找出一块最大矩形,那么这个矩形的高一定是这一排小直方图中其中一个的高,所以我就开始了一个个的找,不出所料超时,再看了许多博客后总算弄懂了,利用单调队列。找两个数组l[n],r[n],用来标记i位置的小矩形向左右两方向扩展可以到那个坐标,利用单调队列,如下一元素大于栈顶,压入,如果小于,扔出栈顶元素继续比较,直到发现栈顶元素小于该元素,记录栈顶元素坐标,如果该元素是最小的,那么标记为1。最后算出每一点左右之间个数乘高度就是了。

            while(!s.empty()) s.pop();
            for(j=1;j<=m;j++)//向左扩展,如果向右扩展要到这找
            {
                while(!s.empty()&&s.top().first>=h[j]) s.pop();
                if(s.empty()) l[j]=1;//可以直接到最左边
                else l[j]=s.top().second+1;//记录向左扩展停止的位置
                s.push(p(h[j],j));
            }

     第二道题全一的最大子矩阵,给一个只含有0与1的大矩阵,找出其中一个子矩阵只含有1,且最大,求1的数量,其实这道题就和上一道题是一道题了,只需用一个二维数组h[i][j]表示以[i][j]为底向上由扩展多少1(a[i][j]==1),由此将这道题转换成上面那道题,剩下的只要算出每一行就行了。

     感觉好像越做越慢了,还是对单调队列掌握不够好,不过感觉虽然今天A的题不多,但收获还是不小的。明天要加油了。

原创粉丝点击