洛谷 P1950 长方形(单调栈

P1950 长方形题意:在一组点中找出全部的矩形,输出他们的数量。测试数据:输入6 4….***.….**…*.***输出38Q1.要如何才能做到不漏不重呢?统计每一行,以其作为底边所能组成矩形的个数。总和为方案数。在测试数据中,每一行的矩形个数分别为:10264106总和为38。Q2.如何统计每一行,以其作为底边的矩形数?定义 hi 为当前行第 i 列可向上延伸多少(即有多少为图画的块,如果当前块被图画那么值为0)使用单调栈算出 li 和
摘要由CSDN通过智能技术生成

P1950 长方形
题意:
在一组点中找出全部的矩形,输出他们的数量。

测试数据:
输入

6 4

.***
.
.
**
…*
.***

输出

38

Q1.要如何才能做到不漏不重呢?
统计每一行,以其作为底边所能组成矩形的个数。
总和为方案数。

在测试数据中,每一行的矩形个数分别为:

10
2
6
4
10
6

总和为38。

Q2.如何统计每一行,以其作为底边的矩形数?

  1. 定义 hi 为当前行第 i 列可向上延伸多少(即有多少为图画的块,如果当前块被图画那么值为0)
  2. 使用单调栈算出 li 和 ri​ ,分别是 h 中左边第一个(从 hi​ 开始)不大于 hi 的数和右边第一个(从 hi 开始)小于 hi 的数
  3. (i-li)*(ri-i)*hi的值就是每一个点所能组成的矩形的个数。
    即:包含该点的矩形,点的高度为h,点右边的高度一定大于等于h,左边的高度一定大于h。

单调栈
顾名思义,栈内的元素都是单调的。
当一个元素准备入栈时,将所有大于/等于/小于它的元素全部pop(),
实现一些操作,
最后将该元素push进去。

计算ri:

void ddzr(){
   
    stack<int > sst;
    int i;
    h[m+1]=-1;//为了将栈内元素全部输出
    for(i=1;i<=m+1;i++){
   
        while(sst.empty()==0&&h[sst.top()]>h[i])
            r[sst.top
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值