当前位置: 首页 > news >正文

CSP/NOIP 复习:单调栈

最近模拟赛打的都不是太好,先随便复习复习吧,马上就要 CSPS 了,我可以考好的。

这里放一些单调栈的题目,笛卡尔树先不说,这个我已经忘了,后天复习一下。

本体

栈中维护有单调性的数据,入栈时维护这个单调性,这是计算结果。

是个人都会,不想多写。

直接进入 dlc 环节。

最大子矩形。

就是一个平面,有一些障碍不能选,要求我们选出来一个最大的,不包含障碍的子矩形,这个就可以使用单调栈来做。

我们先考虑一个弱化版的。

HISTOGRA - Largest Rectangle in a Histogram

这个是简单的,我们考虑尽可能使用每个位置的最高值,也就是算出来左边最近的比它矮的位置和右边最近比它矮的位置。

正确性显然,最大的矩形肯定尽可能用完了位置。

直接上单调栈,注意初始化左右要大一个。

代码↓

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MN=1e6+116;
bool ed=false;
int stk[MN], top, n, a[MN];
int l[MN], r[MN], ans=0;
void Getl(){top=0;for(int i=1; i<=n; ++i){while(top&&a[stk[top]]>a[i]){r[stk[top]]=i; --top;}stk[++top]=i;}
}
void Getr(){top=0;for(int i=n; i>=1; --i){while(top&&a[stk[top]]>a[i]){l[stk[top]]=i; --top;}stk[++top]=i;}
}
void Solve(){cin>>n; for(int i=1; i<=n; ++i) cin>>a[i];if(n==0){ed=true; return;}for(int i=1; i<=n; ++i) l[i]=0;for(int i=1; i<=n; ++i) r[i]=n+1;Getl(); Getr(); ans=0;for(int i=1; i<=n; ++i){ans=max(ans,(r[i]-l[i]-1)*a[i]);}cout<<ans<<'\n';
}
signed main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);while(!ed) Solve();return 0;
}

换到二维上就很简单了,对于每一个高度跑一遍就行了。

P4147 玉蟾宫

代码↓

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MN=3145;
char mp[MN][MN];
int n, m, h[MN][MN];
int stk[MN], top=0;
int l[MN], r[MN], ans=0;
void Read(){cin>>n>>m;for(int i=1; i<=n; ++i){for(int j=1; j<=m; ++j){cin>>mp[i][j];}}for(int i=1; i<=n; ++i){for(int j=m; j>=1; --j){h[i][j]=h[i][j+1]+1;if(mp[i][j]=='R') h[i][j]=0;}}
}
void Getr(int height){top=0;for(int i=1; i<=n; ++i) r[i]=n+1;for(int i=1; i<=n; ++i){while(top&&h[stk[top]][height]>h[i][height]){r[stk[top]]=i; --top;}stk[++top]=i;}
}
void Getl(int height){top=0;for(int i=1; i<=n; ++i) l[i]=0;for(int i=n; i>=1; --i){while(top&&h[stk[top]][height]>h[i][height]){l[stk[top]]=i; --top;}stk[++top]=i;}
}
void Solve(){Read();for(int height=1; height<=m; ++height){Getl(height); Getr(height);for(int i=1; i<=n; ++i){//cout<<l[i]<<" "<<r[i]<<" | ";ans=max(ans,(r[i]-l[i]-1)*(h[i][height]));}}cout<<ans*3<<'\n';
}
signed main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);Solve();return 0;
}
http://www.hskmm.com/?act=detail&tid=38328

相关文章:

  • 算法分析--生成排列
  • 三大安全认证授权协议深度对比:OAuth、OpenID Connect与SAML
  • 数字人公司:数字人新趋势技术驱动与市场前景解析
  • AI股票预测分析报告 - 2025年10月24日
  • 数据绑定相关概念理解
  • 数字人企业:数字人公司排行榜Top 3解析
  • (简记)(自用)线段树区间拆分时间复杂度证明
  • 数字人企业:数字人公司排行榜深度解析
  • 数字人:怎么选择数字人实力公司
  • 拉格朗日插值优化DP
  • 冬日绘板 2026 珂朵莉计划 如何获取 Token
  • 数字人企业:数字人公司技术驱动的三大标杆
  • Linux下的拼音输入法 (2)
  • 数字人平台:重点推荐优质数字人公司
  • SpringBoot整合缓存2-Redis
  • 数字人企业:推荐数字人TOP3公司
  • NOI25D2T2
  • 时钟同步
  • 深入解析:【Java系列课程Java学前须知】第3课 JDK,JVM,JRE的区别和优缺
  • 10.24 CSP-S 模拟37 改题记录
  • 数字人企业:数字人公司重点推荐与选择指南
  • C++实验二
  • 据说每邀请一位朋友加入Comet,您可以获得10刀乐奖励:D
  • 2025.10.24NOIP
  • 小程序 访问第三方网页
  • 王炸!OpenAI 发布 Atlas 浏览器!!
  • 国产开源数据库调研项目的LaTeX专业排版实践
  • Asterix cat-062 ,航班号字段的编码解码
  • AI优化企业:GEO公司技术先驱
  • 题3