单调栈学习笔记

 线性结构——单调栈

①定义:栈内的元素,按照某种方式排序(单调递增或单调递减)如果新入栈的元素破坏了单调性,就弹出栈内元素,直到满足单调性

②优点:可以很方便地求出某个数左边或者右边第一个比他大或者小的元素,总时间复杂度为O(n)

③如何维护单调栈(以递增为例)

进栈操作:每次入栈前先检验栈顶元素和进栈元素x的大小,如果小于x,就让x
     直接入栈。如果栈顶元素大于等于x,那么出栈,直到栈空或者栈顶元素小于x。
     
【例1】最大矩形面积(poj2559)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=100002;
 4 int h[N],n;
 5 int line[N],L[N],R[N],top=0;
 6 int main(){
 7     scanf("%d",&n);
 8     for(int i=1;i<=n;i++)
 9         scanf("%d",&h[i]);
10     for(int i=1;i<=n;i++){
11         while(top&&h[line[top]]>=h[i]) top--;
12         L[i]=top?line[top]+1:1;
13         line[++top]=i;
14     }
15     top=0;
16     for(int i=n;i>=1;i--){
17         while(top&&h[line[top]]>=h[i]) top--;
18         R[i]=top?line[top]-1:n;
19         line[++top]=i;
20     }
21     int maxn=0;
22     for(int i=1;i<=n;i++){
23         int ans=h[i]*(R[i]-L[i]+1);
24         maxn=max(maxn,ans);
25     }
26     cout<<maxn<<endl;
27     return 0;
28 }
代码戳这里

 

【例2】玉蟾宫(luogu P4147)

题目传送门

讲一讲我自己的思路(其实是同学教的)吧,似乎不是很好的解?但我感觉比较好理解……

首先把输入的字符矩阵转移为数字,即s[i][j]代表第i行第j列这一格上面连续的F的个数(如果这一格是S的话就是0),所以预处理之后就把样例变成了这样:

0 1 1 1 1 1

1 2 2 2 2 2

0 0 0 3 3 3

1 1 1 4 4 4

2 2 2 5 5 5

代码实现:

for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){char ch;cin>>ch;if(ch=='F') s[i][j]=s[i-1][j]+1;}

然后就有点类似于上面那道题了,每一行分开分析,找到每一个位置可以向左右扩展的最长的长度,这是矩形的长,而组成的矩形的宽就是这一格中对应的数字,所以向左右两边扩展的条件就是要扩展的那一格中的数字一定大于等于当前扫描到的这一格的数字。(似乎没太讲清楚啊QAQ)每一行处理出一个可以组成的矩形的最大面积,用一个maxn取最大值就可以找到最后的答案了。

代码实现:

for(int i=1;i<=n;i++){int ans=0;//用于记录当前这一行的矩形最大面积for(int j=1;j<=m;j++){int l=j,r=j;//l代表左边能扩展到的最远位置,r代表右边能扩展到的最远位置while(l>=1&&s[i][l]>=s[i][j]) l--;l++;while(r<=m&&s[i][r]>=s[i][j]) r++;r--;ans=max(ans,s[i][j]*(r-l+1));//当前这一行的最大矩形面积
    }maxn=max(ans,maxn);//每一行的最大矩形面积比较取最大值
}

以下完整代码(没开O2的时候T了两个点QAQ)

 1 // luogu-judger-enable-o2
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 const int N=1002;
 7 int K,n,m;
 8 int s[N][N];
 9 int maxn=0;
10 int max(int x,int y){
11     return x>y?x:y;
12 }
13 int main(){
14     //scanf("%d",&K);
15     //while(K--){
16         memset(s,0,sizeof(s));
17         scanf("%d%d",&n,&m);
18         for(int i=1;i<=n;i++)
19             for(int j=1;j<=m;j++){
20                 char ch;
21                 cin>>ch;
22                 if(ch=='F') s[i][j]=s[i-1][j]+1;
23             }
24         for(int i=1;i<=n;i++){
25             int ans=0;//用于记录当前这一行的矩形最大面积
26             for(int j=1;j<=m;j++){
27                 int l=j,r=j;//l代表左边能扩展到的最远位置,r代表右边能扩展到的最远位置
28                 while(l>=1&&s[i][l]>=s[i][j]) l--;
29                 l++;
30                 while(r<=m&&s[i][r]>=s[i][j]) r++;
31                 r--;
32                 ans=max(ans,s[i][j]*(r-l+1));//当前这一行的最大矩形面积
33             }
34             maxn=max(ans,maxn);//每一行的最大矩形面积比较取最大值
35         }
36         printf("%d\n",maxn*3);//最后别忘了乘3
37     //}
38     return 0;
39 }
代码戳这里

 

转载于:https://www.cnblogs.com/THWZF/p/10161208.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《VMware Virtual SAN权威指南(原书第2版)》一1.5 什么是Virtual SAN

1.5 什么是Virtual SAN Virtual SAN是VMware推出的一种存储解决方案&#xff0c;它的beta版本在2013年发布&#xff0c;2014年3月正式开放给公众&#xff0c;并于2016年3月升级到6.2版。VSAN完全集成在vSphere中&#xff0c;它是一种基于对象的存储系统&#xff0c;是虚拟机存…

在Outlook 2007中查看您的Google日历

Google Calendar is a phenomenal web application for managing your calendars, but so many of us are still forced to use Outlook at work. The good thing is you can have the best of both worlds by subscribing to your Google Calendar from Outlook. Google日历是…

元宇宙、数字孪生和企业NFT

昨天参加了华为云上海开发者日活动&#xff0c;并客串主持了一场"元宇宙技术创新和商业实践之路"的闭门研讨会。研讨会上大家讨论热烈&#xff0c;干货多多&#xff0c;大家提到元宇宙的企业级前景、数字藏品和数字人案例的亲身体会。在会上盆盆分享了自己关于企业级…

CMD命令硬盘/光驱挂载

使用Mountvol命令挂载时&#xff0c;发现GUID不对啊&#xff0c;哪应该到哪找呢&#xff1f; 1.首先可以用Mountvol命令&#xff1a; Mountvol 创建、删除或列出卷的装入点。Mountvol 是一种不需要驱动器号而连接卷的方式。 语法&#xff1a; mountvol [Drive:]Path VolumeName…

纽约大街上的免费WiFi,终于铺起来了

纽约市的城市互联网项目终于开始动工了。 这个被称为 LinkNYC 的网络服务项目&#xff0c;是将现有的 1 万多个付费电话亭改造成提供 Wi-Fi 网络的“热点桩”&#xff0c;为纽约市民提供免费网络。从 12 月 28 日开始&#xff0c;工人们已经开始安装首批的 LinkNYC 热点桩了&am…

reddit_如何将多个子Reddit与多个Reddit合并

redditchrisdorney/Shutterstock.comchrisdorney / Shutterstock.comIf you’re subscribed to a lot of communities on Reddits, some of the content you want to see may get lost in the mix. For easier browsing, you can make your own “multireddit” that combines …

BeetleX之ServerBuilder对象使用

ServerBuilder是BeetleX新版本添加对象&#xff0c;用于进一步简化TCP服务的构建。ServerBuilder对象提供两个泛型版本&#xff1a;一个是针对网络数据流操作&#xff0c;另一个则针对协议解释器的对象处理操作。网络数据流当需要解释简单的网络数据流时使用ServerBuilder<A…

solidworks小金球_如何在没有电缆的情况下传送第77届年度金球奖

solidworks小金球Gil C / Shutterstock吉尔C / ShutterstockAs the 77th annual Golden Globes Awards approach, you may be wondering how to watch it without paying a cable bill. These streaming services are the best way to watch the awards show tonight if you cu…

2017年,这两个大数据岗位一定会火!

讨论哪个大数据岗位会火之前&#xff0c;我们先来简单的分析一下大数据领域的行情&#xff0c;这里重点说一下当前的情况。 2016年&#xff0c;互联网行业遇到了资本寒冬&#xff0c;抛开大公司不说&#xff0c;一些中小型的公司不断的缩减预算&#xff0c;因为很难融到钱。 但…

PHP7 学习笔记(十一)使用phpstudy快速配置一个虚拟主机

说明&#xff1a;为了windows本地开发php方便&#xff0c;这里推荐使用PHP集成环境phpstudy。 目的&#xff1a;使用域名访问项目&#xff08;tinywan.test&#xff09; 1、官网&#xff1a;http://www.phpstudy.net 2、虚拟主机的配置 3、站点域名管理 &#xff08;1&#xff…

.NET跨平台框架选择之一 - Avalonia UI

本文阅读目录1. Avalonia UI简介Avalonia UI文档教程&#xff1a;https://docs.avaloniaui.net/docs/getting-started随着跨平台越来越流行&#xff0c;.NET支持跨平台至今也有十几年的光景了(Mono[1]开始)。但是目前基于.NET[2]的跨平台&#xff0c;大多数还是在使用B/S架构的…

网络串流_串流NBA篮球的最便宜方式(无需电缆)

网络串流I love NBA basketball. Every year, I get really excited around the beginning of September because I know tip-off is approaching. This year, I also had to figure out how I’m going to watch the Bulls (lose almost every game) with a combination of st…

你认识的C# foreach语法糖,真的是全部吗?

本文的知识点其实由golang知名的for循环陷阱发散而来&#xff0c; 对应到我的主力语言C#&#xff0c; 其实牵涉到闭包、foreach。为了便于理解&#xff0c;我重新组织了语言&#xff0c;以倒叙结构行文。先给大家提炼出一个C#题&#xff1a;观察for、foreach闭包的差异左边输出…

C#对window 硬件类操作,ManagementObjectSearcher

原文转载&#xff1a;http://blog.csdn.net/da_keng/article/details/50589145 纯属转载&#xff0c;复制过来方便编程时寻找。感谢作者&#xff1a;I-Awakening复制前补充&#xff1a; 在刚学C#&#xff0c;用ManagementObjectSearcher 竟然不能解析到头文件&#xff0c;需要手…

twitter批量取消关注_如何在Twitter上取消阻止“潜在敏感内容”

twitter批量取消关注Twitter推特Twitter blocks some tweets with a “potentially sensitive content” warning. You can disable this warning—even on an iPhone or iPad, where the option isn’t normally available. You can also disable sensitive content warnings …

Semantic-UI的React实现(二):CSS类构造模块

更简单的类名标签 Semantic-UI使用了更简单的类名声明。用过Bootstrap的同学都会被其复杂的类名标签折磨过&#xff0c;例如一个简单的按键样式&#xff0c;不论颜色或是大小&#xff0c;都需要btn-前缀声明&#xff1a; <button type"button" class"btn btn…

skype自动回复_如何在Windows 10上阻止Skype自动启动

skype自动回复Microsoft微软The Skype app included with Windows 10 now has a notification area icon. That’s great, but what if you never use Skype and don’t want it starting every time you sign in? Here’s how to get rid of it. Windows 10随附的Skype应用程…

95后沪漂女孩深陷“狠”且“卷”职场,向上思维,永不过时!

hi&#xff0c;这里是桑小榆。最近和一个伙伴oncall了很久&#xff0c;对我的文章以及思想转变产生了很大的共鸣&#xff0c;她向我分享了一些职场经历还有成长经历等&#xff0c;她的这些经历也让我引发了一定的思考。光光&#xff0c;最近刚升任了部门主管&#xff0c;对于当…

PHP:6种GET和POST请求发送方法

在i94web博客中&#xff0c;我试过了畅言和多说两种社会化评论框&#xff0c;后来还是抛弃了畅言&#xff0c;不安全。 无论是畅言还是多说&#xff0c;我都需要从远程抓取文章的评论数&#xff0c;然后存入本地数据库。对于多说&#xff0c;请求的格式如下&#xff1a; // 获取…

3d镜头 适配_您是否应该将镜头适配器与无反光镜相机一起使用?

3d镜头 适配Canon佳能Mirrorless cameras aren’t the future, they’re the present. If you’re switching from an older DSLR, though, the obvious thing to do is just buy an adapter so you can keep using your old gear. 无反光镜相机不是未来&#xff0c;而是现在。…