当前位置: 首页 > 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.zskr.cn/news/29658.html

相关文章:

  • 数字人企业:数字人公司排行榜深度解析
  • 数字人公司:数字人新趋势技术驱动与市场前景解析
  • WPF 深入系列.2.布局环境.布局控件.Grid
  • 冬日绘板 2026 珂朵莉计划 如何获取 Token
  • 数字人:怎么选择数字人实力公司
  • Asterix cat-062 ,航班号字段的编码解码
  • AI优化企业:GEO公司技术先驱
  • 题3
  • 吴恩达深度学习课程一:神经网络和深度学习 第四周:深度神经网络的关键概念
  • 第171-172天:代理通讯篇无外网或不可达SockS全协议规则配置C2正反向上线解决方案
  • SpringBoot整合缓存1-Ehcache
  • 如何在一台 Linux 机器上管理不同版本的 CMake
  • 90 天打造可持续交付:12 条 DevOps 实践要点与避坑
  • Linux基础——iptables常规操作
  • 题解:P8930 「TERRA-OI R1」神,不惧死亡
  • 大数据案例 -2025/10/24
  • 详细介绍:记一次达梦数据库的查询异常
  • 从价值直觉到价值理性:AI元人文演进路径解读
  • 2025年阳台壁挂太阳能厂家权威推荐榜单:分体式阳台太阳能/阳台壁挂太阳能热水器/分体式阳台太阳能源头厂家精选
  • 完整教程:Java开发者进阶之路
  • 国标GB28181平台EasyGBS视频调阅效果在跨域安防监控中的核心应用
  • 102302143郑泽雄第一次作业
  • 2025 年兰州凯文中学推荐:兰州凯文中学,二十载深耕民办教育 双师赋能全维育人 以低进高出成效书写成长答卷
  • github克隆别人的项目并创建环境安装子模块 - 教程
  • 用AI“抄底”双十一
  • 【C++】函数参数传递
  • C++ lambd表达式
  • 监督学习、无监督学习、半监督学习、强化学习、自监督学习
  • 【哲学思考】:规则
  • Java多线程梳理