一道单调栈的好题啊。。。。。。

思路是很奇妙的,对于每个点(i,j),我们可以算它对答案的贡献(即包含它的矩形数量),包含该点的矩形,点的高度为h[j],点右边的高度一定大于等于h[j],左边的高度一定大于h[j]。

高有h[j]种方案,底边有(j - lj) * (rj - j)种方案,相乘就是该点对答案的贡献。

具体步骤:

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

 1 #include<bits/stdc++.h>
2 using namespace std;
3 char ch;
4 long long l[1020],r[1020],h[1020],k[1020],n,m,top;
5 int d[1020][1020];
6 long long ans;
7
8 void ddzl(){//左
9 top=0;
10 for(int i=m;i>=1;i--){
11 while(top!=0 && h[i]<=h[k[top]]) l[k[top--]]=i;
12 k[++top]=i;
13 }
14 while(top) l[k[top--]]=0;
15 }
16
17 void ddzr(){//右
18 top=0;
19 for(int i=1;i<=m;i++){
20 while(top!=0 && h[i]<h[k[top]]) r[k[top--]]=i;
21 k[++top]=i;
22 }
23 while(top) r[k[top--]]=m+1;
24 }
25
26 void work(){
27 ddzl();//求左边第一个小等于的下标
28 ddzr();//求右边第一个小于的下标
29 for(int i=1;i<=m;i++)
30 ans+=(i-l[i])*(r[i]-i)*h[i];//累加结果
31 }
32
33 int main(){
34 cin>>n>>m;
35 for(int i=1;i<=n;i++)
36 for(int j=1;j<=m;j++){
37 cin>>ch;
38 if(ch=='*') d[i][j]=1;//标记
39 }
40 for(int i=1;i<=n;i++){
41 for(int j=1;j<=m;j++){
42 h[j]++;
43 if(d[i][j]) h[j]=0;//求该列从最上面到j的最大延伸高度
44 }
45 work();//对每一行累加结果
46 }
47 cout<<ans;
48 }

(单调栈其实不好想啊,难点在于推公式,公式的意义就是每个点对答案的贡献,公式想到了,自然也能想到用单调栈维护)。

洛谷P1950 长方形(单调栈)的更多相关文章

  1. 洛谷 P1950 长方形_NOI导刊2009提高(2)

    传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 ...

  2. 【洛谷】【单调栈】P4333 [COI2007] Patrik

    --接上一篇题解,[洛谷][单调栈]P1823音乐会的等待 关于题目大意在上一篇题解里已经说清楚了,这里不再多阐述 想看题目->戳这里 [算法分析:] 在对元素a进行判断时,如果它与栈顶元素相等 ...

  3. 洛谷 P1950 长方形_NOI导刊2009提高(2) 题解

    P1950 长方形_NOI导刊2009提高(2) 题目描述 小明今天突发奇想,想从一张用过的纸中剪出一个长方形. 为了简化问题,小明做出如下规定: (1)这张纸的长宽分别为n,m.小明讲这张纸看成是由 ...

  4. 【洛谷】【单调栈】P1823 音乐会的等待

    [题目描述:] N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见 ...

  5. 【洛谷】【单调栈】P1901 发射站

    [题目描述:] 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发 ...

  6. 洛谷 1155 (NOIp2008)双栈排序——仔细分析不合法的条件

    题目:https://www.luogu.org/problemnew/show/P1155 这道题教会我们要多思考. 好好分析过后发现同一个栈里不能有升序.就用它写了一个30分. #include& ...

  7. 洛谷 U4792 Acheing 单调队列

    U4792 Acheing 5通过 43提交 题目提供者Acheing 标签 难度尚无评定 提交 最新讨论 暂时没有讨论 题目背景 题目并没有什么含义,只是想宣传一下自己的博客,Acheing.com ...

  8. 【洛谷】【单调队列】P2032 扫描

    [题目描述:] 有一个 1 ∗ n 的矩阵,有 n 个正整数. 现在给你一个可以盖住连续的 k 的数的木板. 一开始木板盖住了矩阵的第 1 ∼ k 个数,每次将木板向右移动一个单位,直到右端与第 n ...

  9. 滑动窗口-洛谷T1866(单调队列)

    咕咕咕 单调队列板子题 一.基本 1.单调队列: 特殊的双端队列,内部元素.分为最大队列(单调递增)和最小队列(单调递减)两种 二.应用 本题中:大部分单调队列优化的动态规划问题都和定长连续子区间的最 ...

随机推荐

  1. 社区之光:我和 Apache DolphinScheduler 的这一年

    背景 没错,本文的主人翁就是那个在多个 DolphinScheduler 用户群超级活跃,"孜孜不倦" 地给用户各种答疑的小伙,如果你在群里问过问题,伯毅多半概率回答过,哈哈,今天 ...

  2. 如何在CDH5上部署Dolphin Scheduler 1.3.1

    点击蓝色字关注! 本篇文章大概8440字,阅读时间大约20分钟 本文记录了在CDH5.16.2集群上集成Dolphin Scheduler 1.3.1的详细流程,特别注意一下MySQL数据库的连接串! ...

  3. EMAS Serverless到底有多便利?

    EMAS Serverless 简介 EMAS Serverless 是阿里云提供的基于Serverless技术的一站式后端开发平台,为开发者提供高可用.弹性伸缩的云开发服务,包含云函数.云数据库.云 ...

  4. 定语从句"介词+which/whom"的用法

    介词+which [例句]My elder sister works in the famous university. She graduated from the famous universit ...

  5. 深入解析Flutter下一代渲染引擎Impeller

    作者 魏国梁:字节 Flutter Infra 工程师, Flutter Member,长期专注 Flutter 引擎技术 袁    欣:字节 Flutter Infra 工程师, 长期关注渲染技术发 ...

  6. flutter系列之:构建Widget的上下文环境BuildContext详解

    目录 简介 BuildContext的本质 BuildContext和InheritedWidget BuildContext的层级关系 总结 简介 我们知道Flutter中有两种Widget,分别是 ...

  7. BZOJ4212 神牛的养成计划 (字典树,bitset)

    题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...

  8. [CF1539F] Strange Array (线段树)

    题面 有一个长度为 n \tt n n 的序列 a \tt a a ,对于每一个位置 i ∈ [ 1 , n ] \tt i\in[1,n] i∈[1,n]: 选择一个区间 [ l , r ] \tt ...

  9. 解决QIcon引用qrc不显示图片

    引用Qrc 对于Qt来说,添加qrc之后,可以使用":"来直接访问qrc的文件,比如 QIcon icon(":/icon/red.png"); 绝对路径 当然 ...

  10. AtCoder Beginner Contest 264(D-E)

    D - "redocta".swap(i,i+1) 题意: 给一个字符串,每次交换相邻两个字符,问最少多少次变成"atcoder" 题解: 从左到右依次模拟 # ...