首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
单调栈用来解决什么问题
2024-09-06
LeetCode 84 | 单调栈解决最大矩形问题
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第52篇文章,我们一起来看LeetCode第84题,Largest Rectangle in Histogram(最大矩形面积). 这道题的官方难度是Hard,点赞3581,反对只有80,通过率在34.7%左右.从通过率上来看,难度其实还可以,并没有特别大,但是这道题的点赞比很高,说明题目的质量很好.实际上也的确如此,这题非常经典,我个人也非常推荐.建议大家有能力的都做一下本题,一定会很有收获. 题意 假设我们
BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分
传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带权深度,\(parent_x\)表示\(x\)的祖先节点集合,\(f_x\)表示点\(x\)的答案 那么 \(f_x = \min\limits_{i \in parent_x}\{f_i + V_x \times (dep_x - dep_i)\} + S_x = \min\limits_{i \
Gym 100971D Laying Cables 二分 || 单调栈
要求找出每个a[i],找到离他最近而且权值比它大的点,若距离相同,输出权利最大的那个 我的做法有点复杂,时间也要500+ms,因为只要时间花在了map上. 具体思路是模拟一颗树的建立过程,对于权值最大的那个,必须是-1,次大的那个,必须是pos_peo[mx]:就是最大人口的节点id. 然后维护一个单调的序列,记录当前有多少个位置加入了树.用个set保证单调性.小到大 把结构体按人口排序大到小,枚举没个城市,这样保证加入后,后面加入的直接找位置最短即可,人口最对的bigger than now的
bzoj1510: [POI2006]Kra-The Disks(单调栈)
这道题可以O(n)解决,用二分还更慢一点 维护一个单调栈,模拟掉盘子的过程就行了 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ; int n,m,h[maxn],st[maxn],top,x,now; int main(){ scanf("%d%d", &n, &m); top=; h[]=; ; i<=n; i++)
POJ2796 Feel Good 单调栈
题意:给定一个序列,需要找出某个子序列S使得Min(a[i])*Σa[i] (i属于S序列)最大 正解:单调栈 这题的暴力还是很好想的,只需3分钟的事就可以码完,以每个点拓展即可,但这样的复杂度是O(n^2)的,肯定会TLE 以暴力的思想作为基础,再进行深层次思考,考虑每个点往周围拓展的时候,都要走到最远的地方停下来,也就是说会有一个左上限,一个右上限(命名为:pre.next),不难发现再枚举5.4.3.2.1这个序列的时候,每次都要往左扫描到最左边,显然这是做了重复的事情,于是机智的我马上想
poj2796 维护区间栈//单调栈
http://poj.org/problem?id=2796 题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值...... 例如: 6 3 1 6 4 5 2 以4为最小值,向左右延伸,6 4 5 值为60....... 思路:解决完为这道题目,我才真正明白了单调栈的原理,它就是以某一个值为最小(最大)值,向这个值的两侧延伸,遇到大于它(小于它)的值,就将它延伸的范围扩大,当然,一般来说,要这样做的算法复杂度为o(n^2),但是借助栈这个玩意,维护其单调增
poj3415 Common Substrings(后缀数组,单调栈 | 后缀自动机)
[题目链接] http://poj.org/problem?id=3415 [题意] A与B长度至少为k的公共子串个数. [思路] 基本思想是将AB各个后缀的lcp-k+1的值求和.首先将两个字符串拼接起来中间用未出现的字符隔开,划分height数组,这首先保证了每一组中字符串之间的公共子串至少有k长度,组与组之间互不干扰. 问题变成了求一个组中一个A串与之前B串形成的LCP(lcp-k+1)和一个B串与之前A串形成的LCP,问题是对称的,这里先解决第一个.用一个单调栈,栈中存放两个元素分别he
数据结构录 之 单调队列&单调栈。
队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调队列和单调栈. 先来看一个问题,给一个长度为N的数列,a1,a2...aN,然后给一个k<=N,求输出b1,b2...bN这N个数,其中 bi=max( aj | j<=i && j>i-k && j>0 ). 比较朴素的想法是用一个Nk复杂度的循环来求
POJ3250(单调栈)
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17614 Accepted: 5937 Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants
【单调栈】最长不上升子序列变式,洛谷 P2757 导弹的召唤
题目背景 易琢然今天玩使命召唤,被敌军用空对地导弹轰炸,很不爽:众所周知,易琢然很不老实,他开了外挂: 外挂第一次可以打掉任意高度的导弹,之后每一次都不能打掉大于上一次高度的导弹: 但易琢然水平太差,敌军最多有300000颗导弹,导弹只能按顺序打,因为外挂有BUG,而且是超音速导弹,只有一秒导弹就到了,只能编程解决: 但易琢然上课不认真,平时帮他的sxy又不在,所以他只能求助于你 题目描述 有n颗导弹(n<=300000),求易琢然开一个外挂最多能拦截多少导弹,开几个外挂才能打掉所有导弹 mis
[luogu3246][bzoj4540][HNOI2016]序列【莫队+单调栈】
题目描述 给定长度为n的序列:a1,a2,...,an,记为a[1:n].类似地,a[l:r](1<=l<=r<=N)是指序列:al,al+1,...,ar-1,ar.若1<=l<=s<=t<=r<=n,则称a[s:t]是a[l:r]的子序列.现在有q个询问,每个询问给定两个数l和r,1<=l<=r<=n,求a[l:r]的子序列的最小值之和.例如,给定序列5,2,4,1,3,询问给定的两个数为1和3,那么a[1:3]有6个子序列a[1:1]
cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈
/* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数下标l,那么[l+1,i-1]的后继显然是i 那么[l+1,i-1]区间,和包括第i个数的LIS都可以+1,处理完所有点后求[1,n]区间的最大值即可 区间更新显然用线段树解决,线段树叶子结点维护第i个位置被加次数,即以第i个结点为起点的LIS长度 本题是枚举长为k的区间,求每个区间的LIS,那么只
BZOJ4237 稻草人 分治 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^5)$个整点(坐标范围在$[0,10^9]$之间). 第$i$个点$p_i$的坐标是$(x_i,y_i)$. 如果有一对点$p_i$和$p_j$,满足$x_i<x_j,y_i<y_j$,而且以这两个点为左下角和右上角所围城的矩形内不包含任何整点(边界上面不算),那么他们对答案的贡献为1. 求答案.
翻转长方形 (不知名oj中一道个人私题)--单调栈维护最大子矩形
怎么分析这道题呢? 首先 ,我们注意到一点: 不管怎么操作,任意一个2*2方格中的 "#"个数的奇偶性是不变的. 所以,如果一个2*2方格中有奇数个"#",这个方格里的格子永远不可能变成同一种颜色. 并且,如果一个矩形中,所有2*2方格中有偶数个"#",那么它一定可以能变成只有一种颜色的矩形. 为什么? 先把这个矩形的第一行和第一列都变成同一种颜色,这个操作任何矩形都能做到. 如果这个矩形中,所有2*2方格中有偶数个"#",那
DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
前缀和优化 当DP过程中需要反复从一个求和式转移的话,可以先把它预处理一下.运算一般都要满足可减性. 比较naive就不展开了. 题目 [Todo]洛谷P2513 [HAOI2009]逆序对数列 [Done]洛谷P2511 [HAOI2008]木棍分割 [Done]洛谷P4099 [HEOI2013]SAO [Done]NOIAC37 染色 单调队列优化 前置技能:单调队列(经典的问题模型:洛谷P1886 滑动窗口) 用于优化形如\(f_i=\min/\max_{j=l_i}^{i-1}\{g_
AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)
题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i)\) , 对于每个关键点他会选择进行下列操作的一个 : 将 \(x > X_i\) 的部分染成黑色. 将 \(x < X_i\) 的部分染成黑色. 将 \(y > Y_i\) 的部分染成黑色. 将 \(y < Y_i\) 的部分染成黑色. 现在让你 , 最大化所有操作结束之后白色部分
cdqz2017-test10-rehearsal(CDQ分治&可持久化线段树&单调栈)
题意: 给出n个三元组 e[i]=(si,ti,wi) 第i个三元组的价值为 Σ w[j] ,j 满足以下4个条件: 1.j<i 2.tj<ti 3.sj<si 4.不存在j<k<i,且sj<sk<si 把每个三元组看作二维平面上的一个点(i,si) 先不考虑t, 那么j若满足要求,必须满足以(j,sj)为左下角,以(i,si)为右上角的矩形内没有其他的三元组 可以用CDQ分治解决 设三元组e[i]的坐标为(x,y)=(i,si) 先将所有的三元组按s排序,然后按
【BZOJ4826】【HNOI2017】影魔(扫描线,单调栈)
[BZOJ4826][HNOI2017]影魔(扫描线,单调栈) 题面 BZOJ 洛谷 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠 这些战斗力提升自己的攻击.奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n. 第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻
小C的数学问题 【单调栈】
问题 J: 小C的数学问题 时间限制: 1 Sec 内存限制: 128 MB 提交: 565 解决: 141 [提交] [状态] [命题人:外部导入] 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n个数,每个数有权值. 数学老师定义了区间价值为区间和乘上区间内的最小值. 现在要你找出有最大区间价值的区间是什么,并输出区间价值. 输入 每个输入文件只包含单组
HDU5033 building 单调栈+计算几何
正解:单调栈 解题报告: 哇生气辽QAQ本来打了半天feel good都快调出来了然后说换题了QAQ(所以可能那题的代码会过一阵子再放上来了QAQ 不过还是大爆手速打了一通拿到首杀了嘻嘻 美滋滋辽 然后放个传送门先qwq 有一点点解题思想和oil是有点儿像的,就是先把询问和修改放一个结构体里排序,这样当到达某个询问的时候就可以直接解决不用进行其他修改了qwq 然后就是做两次单调栈一次算出往左能看到的角度一次算出往右能看到的角度 然后就欧克辽? ummm好像是没什么好说的了只要推出了角度计算公式然
热门专题
.net core 事务
vue为什么文件要formData
excel选定单元格所在行和列都变色
go 获取当前文件的目录
centos建立本地yum源并与阿里云同步
更新node和npm命令行
神经网络预测模型matlab代码
软路由如何实现一机一ip
vue滚动加载数据不替换老数据
qt qstring添加换行符
地面是六边形的回合制游戏
vue在父组件点击打开子组件页面
计算机积极拒绝10061
安卓实现数据库的增删改查知识点
支付宝小程序 flex布局兼容
sqlite 触发器 性能
dev c 终端 闪退
css html 实现从右弹出框的效果
discuz插件调用
Java 记录点名次数