正题


题目大意

一个n∗nn*nn∗n的矩阵,然后有些位置破损。求可以剪出多少个不破损的矩形。


解题思路

预处理upi,jup_{i,j}upi,j​表示从(i,j)(i,j)(i,j)向上多少格子都是非破损格子。

然后我们枚举下界LowLowLow,将图像变成一个下部平整的条形图,第iii个位置高度为uplow,iup_{low,i}uplow,i​。为了方便阐述我们统一用hih_ihi​代表upLow,iup_{Low,i}upLow,i​。

然后我们获得一个条形图后我们要求有多少个矩形经过底部。考虑像Largest Rectangle in a Histogram这一题一样进行计算。

现在栈中维护若干个单调递增的条形
每个条形有不同的宽度
如(现在的宽度暂时都为1)

现在若加入一条高度为666的条形则直接加入。

但若加入一条高度为444的块,我们需要弹出末尾的块并统计答案。
我们用WideWideWide表示目前弹出的块的宽度和(要包括现在弹出的那条)。然后我们发现在这个块的右边(已经弹出的部分)都比它要高,也就是在1∼hnow1\sim h_{now}1∼hnow​中任意取一个高度都可以也就是Wide∗hnowWide*h_{now}Wide∗hnow​种取法。

但是如果现在弹出的块宽度不为111呢?

我们会发现只需要经过蓝色的点的矩形都可以被统计到右边这一块弹出时的答案

那这种有多少个呢
首先是穿过这个点的也就是左边的个数乘上右边的格子数。
而从这个点出发的就是左边的格子数加上右边的格子数。
然后单独这个点就是111。

我们从新定义WideWideWide不计算上现在弹出的块的宽度,那每次累计的答案数为
(widenow∗Wide+widenode)∗hnow(wide_{now}*Wide+wide_{node})*h_{now}(widenow​∗Wide+widenode​)∗hnow​


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll N=1100;
ll n,f[N][N],ans,up[N][N],weigh,wigh[N];
stack<int> s;
char v[N][N];
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%s",v[i]+1);for(ll i=1;i<=n;i++){for(ll j=1;j<=n;j++){if(v[i][j]=='0') up[i][j]=up[i-1][j]+1;else up[i][j]=0;}}for(ll i=1;i<=n;i++){for(ll j=1;j<=n;j++){weigh=0;while(!s.empty()&&up[i][j]<up[i][s.top()]){ans+=(weigh*wigh[s.top()]+wigh[s.top()])*up[i][s.top()];weigh+=wigh[s.top()];s.pop();}s.push(j);wigh[j]=weigh+1;}weigh=0;while(!s.empty()){ans+=(weigh*wigh[s.top()]+wigh[s.top()])*up[i][s.top()];weigh+=wigh[s.top()];s.pop();}}printf("%lld",ans);
}

nssl1337-矩形统计【单调栈】相关推荐

  1. leetcode 1504. Count Submatrices With All Ones | 1504. 统计全 1 子矩形(单调栈)

    题目 https://leetcode.com/problems/count-submatrices-with-all-ones/ 题解 本题与 leetcode 84. Largest Rectan ...

  2. leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈)

    题目 https://leetcode.com/problems/maximal-rectangle/ 题解 本题与 leetcode 84. Largest Rectangle in Histogr ...

  3. LeetCode--85.最大矩形(单调栈)

    最大矩形(单调栈) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题目似曾相识啊,最大矩形面积的问题我们在LeetCode84.柱状图中最大的矩形也 ...

  4. [Leedcode][JAVA][第84题][柱状图中最大的矩形][暴力][单调栈]

    [问题描述][困难] 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 .求在该柱状图中,能够勾勒出来的矩形的最大面积.以上是柱状图的示例,其中每个柱子的宽度为 1 ...

  5. 直方图中最大的矩形(单调栈2)

    题目描述 直方图是由在公共基线处对齐的一系列矩形组成的多边形. 矩形具有相等的宽度,但可以具有不同的高度. 例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1: ...

  6. 【CSP201312-3】最大的矩形,单调栈

    problem 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ ...

  7. 最大矩形(单调栈 || 动态规划)

    文章目录 问题描述 Input Output Sample input Sample output 思考 解题思路--单调栈做法 单调栈介绍 单调栈在此题中的应用 完整代码--单调栈 解题思路--动态 ...

  8. POJ 2559 题解 最大矩形面积 单调栈

    [题目描述]: 地面上从左到右并排紧挨着摆放多个矩形,已知这此矩形的底边宽度都为1,高度不完全相等.求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积.所求矩形可以横跨多个矩形,但不能超出原 ...

  9. 最大矩形面积——单调栈

    问题描述 给一个直方图,求直方图中的最大矩形的面积.例如,下面这个图片中直方图的高度从左到右分别是2, 1, 4, 5, 1, 3, 3, 他们的宽都是1,其中最大的矩形是阴影部分. Input 输入 ...

  10. 131. 直方图中最大的矩形【单调栈】

    单调栈的经典应用.找到左边最近的比它小的,找到右边的最近的比它小的. #include<bits/stdc++.h> using namespace std; typedef long l ...

最新文章

  1. js 回车触发点击事件
  2. Python 列表与元组的速度比较
  3. Android提权漏洞CVE-2014-7920CVE-2014-7921分析
  4. c post请求网页_Python使用urllib2抓取网页
  5. java适合ubuntu吗_java – 哪个os更适合开发:Debian或Ubuntu?
  6. eclipse项目build时,提示错误.
  7. 黑莓z10 android,黑莓Z10成功刷机完成_黑莓 Z10_手机其它OS-中关村在线
  8. Qt实战案例(18)——Qt位置相关函数汇总实例
  9. 计算机辅助翻译实践总结,trados计算机辅助翻译实践报告材料
  10. python3中的@abstractmethod的用法
  11. element上传图片的时候额外参数
  12. 嵌入式软件开发之常用软件(六)
  13. 理工男的网红生意, 6000万月活50万条日更的背后, 内容链还能这样操作?
  14. 写商业计划书的十个要点
  15. QT QGraphicsItem 消除重影 移动重影
  16. 容联与腾讯云牵手!这一合作背后有何深意?
  17. 高级版的 jvisualvm :Spring Boot Admin 监控 Spring Boot 微服务项目
  18. AEJoy —— 表达式之无缝循环摆/扭动【JS】
  19. 使用Python画动态图像
  20. 【人工智能】农夫过河问题

热门文章

  1. 数字怎么横 竖排_从这些数字更深入了解打包箱房
  2. 面试避坑手册之 Java字节流和字符流总结IO流!
  3. eeprom 数据偶尔变成ff_关于水电站冗余配置下监控系统下发调节令偶尔不动作的案例分析...
  4. 10 邮件槽_员工主动发离职邮件,提出申请又反悔,法院判决让人懵了!
  5. 云南河道 kml文件_处理能力提升 4 倍 ,大疆智图 4 天完成 5 公里河道建模
  6. android loading封装_我们经常用的Loading动画居然还有这种姿势
  7. C++ 学习之旅(8)——一文搞懂指针、引用、函数参数的传值调用、指针调用和引用调用
  8. [Java基础]线程安全的类
  9. [蓝桥杯][基础练习VIP]完美的代价-贪心
  10. 服务器水冷系统仿真,水冷漫谈(三)——水冷散热器仿真方法