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

传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 \(h[i]\) 中左边第一个(从 \(h[i][j]\) 开始)不大于\(h[i][j]\)的数和右边第一个(从\(h[i][j]\)开始)小于\(h[i][j]\)的数 最终答案为\(ans +=\ (j - l[j]) * (r[j] - j) * h[i][j]\) 即在当前行i中,左边在…
--接上一篇题解,[洛谷][单调栈]P1823音乐会的等待 关于题目大意在上一篇题解里已经说清楚了,这里不再多阐述 想看题目->戳这里 [算法分析:] 在对元素a进行判断时,如果它与栈顶元素相等,累加答案pop栈顶元素,在最后再把pop掉的相同的栈顶元素push进来 这样一个一个操作好慢啊! 可以有一种比较显著的优化: 记录每一种元素的值的同时记录它们的个数,这样在有相同元素的时候就不必一个一个pop累加再push而是可以直接累加上所有相同的元素. 同时相同的元素不必再进栈而是只用把栈顶(用de…
一道单调栈的好题啊...... 思路是很奇妙的,对于每个点(i,j),我们可以算它对答案的贡献(即包含它的矩形数量),包含该点的矩形,点的高度为h[j],点右边的高度一定大于等于h[j],左边的高度一定大于h[j]. 高有h[j]种方案,底边有(j - lj) * (rj - j)种方案,相乘就是该点对答案的贡献. 具体步骤: 1.定义 h[j] 为当前行第 j 列可向上延伸多少(如果当前块被图画那么值为0)2.使用单调栈算出 li 和 ri​ ,分别是 j中左边第一个(从 j​ 开始)不大于…
P1950 长方形_NOI导刊2009提高(2) 题目描述 小明今天突发奇想,想从一张用过的纸中剪出一个长方形. 为了简化问题,小明做出如下规定: (1)这张纸的长宽分别为n,m.小明讲这张纸看成是由n*m个格子组成,在剪的时候,只能沿着格子的边缘剪. (2)这张纸有些地方小明以前在上面画过,剪出来的长方形不能含有以前画过的地方. (3)剪出来的长方形的大小没有限制. 小明看着这张纸,想了好多种剪的方法,可是到底有几种呢?小明数不过来,你能帮帮他吗? 输入格式 第一行两个正整数n,m,表示这张纸…
[题目描述:] N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. [输入格式:] 输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人. 接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米.这些高度分别表示队伍中人…
[题目描述:] 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接收. 显然,每个发射站发来的能量有可能被 0 或 1 或 2 个其他发射站所接受,特别是为了安 全,每个发射站接收到的能量总和是我们很关心的问题.由于数据很多,现只需要你帮忙计 算出接收最多能量的发射站接收的能量是多少. [输入格式:] 第 1 行:一个整数 N; 第 2 到 N+1 行:第…
题目:https://www.luogu.org/problemnew/show/P1155 这道题教会我们要多思考. 好好分析过后发现同一个栈里不能有升序.就用它写了一个30分. #include<iostream> #include<cstdio> #include<cstring> using namespace std; ; ][N],top[],nw,tot,ps[N]; ]; bool flag; int main() { scanf(; stack[][]…
U4792 Acheing 5通过 43提交 题目提供者Acheing 标签 难度尚无评定 提交 最新讨论 暂时没有讨论 题目背景 题目并没有什么含义,只是想宣传一下自己的博客,Acheing.com 题目描述 给你一个n*m的矩阵,请你求出其中边长为k的子矩形,使得这个矩形中最大值减最小值最小. 输入输出格式 输入格式: n,m,k 接下来一个n*m的子矩阵. 输出格式: 一个数,即最小值. 输入输出样例 输入样例#1: 5 4 2 1 2 5 6 0 17 16 0 16 17 2 1 2…
[题目描述:] 有一个 1 ∗ n 的矩阵,有 n 个正整数. 现在给你一个可以盖住连续的 k 的数的木板. 一开始木板盖住了矩阵的第 1 ∼ k 个数,每次将木板向右移动一个单位,直到右端与第 n 个数重合. 每次移动前输出被覆盖住的最大的数是多少. [输入格式:] 第一行两个数,n,k,表示共有 n 个数,木板可以盖住 k 个数. 第二行 n 个数,表示矩阵中的元素. [输出格式:] 共 n − k + 1 行,每行一个正整数. 第 i 行表示第 i ∼ i + k − 1 个数中最大值是多…
咕咕咕 单调队列板子题 一.基本 1.单调队列: 特殊的双端队列,内部元素.分为最大队列(单调递增)和最小队列(单调递减)两种 二.应用 本题中:大部分单调队列优化的动态规划问题都和定长连续子区间的最值问题 #include<bits/stdc++.h> using namespace std; inline int read() { ,p = ; char ch = getchar(); ') { if(ch == '-') p = -; ch = getchar(); } ') { (su…