單調棧學習筆記

?線性結構——單調棧

①定義:棧內的元素,按照某種方式排序(單調遞增或單調遞減)如果新入棧的元素破壞了單調性,就彈出棧內元素,直到滿足單調性

②優點:可以很方便地求出某個數左邊或者右邊第一個比他大或者小的元素,總時間復雜度為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.pswp.cn/news/281080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281080.shtml
英文地址,請注明出處:http://en.pswp.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;是虛擬機存…

js 控制超出字數顯示省略號

//多余顯示省略號 function wordlimit(cname, wordlength) {var cname document.getElementsByClassName(cname);for (var i 0; i < cname.length; i) {      var nowLength cname[i].innerHTML.length;if (nowLength > wordlength) {cname[i].innerHTML cname…

在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;大家提到元宇宙的企業級前景、數字藏品和數字人案例的親身體會。在會上盆盆分享了自己關于企業級…

設置狀態欄和標題欄的樣式

設置狀態欄和標題欄的樣式Android setSystemUiVisibility(visible)方法詳解這個方法可以詳細的設置各種標題欄的狀態欄的樣式.visible的值來決定1.SYSTEM_ UI_ FLAG_ LOW_ PROFILE: 影藏不重要的狀態欄圖標&#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…

解決Maven管理項目update Maven時,jre自動變為1.5

本文為博主原創&#xff0c;未經允許不得轉載&#xff1a; 在搭建一個maven web項目時&#xff0c;項目已經按步驟搭建完好&#xff0c;之后項目上就報了一個錯誤。 在控制臺看到錯誤提示如下&#xff1a;Dynamic Web Module 3.0 requires Java 1.6 or newer。。 已經改過項目中…

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…

Unbuntu 自動重啟MySQL

上個月&#xff0c;通過Unbuntu搭建了WordPress&#xff0c;一切運行良好。 UBUNTU搭建WORDPRESS-MYSQL-APACHE 但是&#xff0c;最近幾天&#xff0c;不知道啥情況&#xff0c;MySQL偶爾會出現Stop&#xff1b;影響了blog的使用&#xff0c;所以&#xff0c;我這里嘗試了自動調…

識別Win10系統兩種方法

最近寫寫一個工具&#xff0c;需要識別當前系統。 首先&#xff0c;找到GetVersionEx函數&#xff0c;能識別win7和win8。但win10需要修改manifested&#xff0c;才能識別&#xff0c;具體參考如下鏈接&#xff1a; http://blog.csdn.net/k1988/article/details/47614529 實…

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…

962-最大寬度坡

前言 Weekly Contest 116 的最大寬度坡&#xff1a; 給定一個整數數組 A&#xff0c;坡是元組 (i, j)&#xff0c;其中 i < j 且 A[i] < A[j]。這樣的坡的寬度為 j - i。 找出 A 中的坡的最大寬度&#xff0c;如果不存在&#xff0c;返回 0 。 示例1&#xff1a; 輸入&am…

C# 文件操作筆記

文件夾 1.存在&#xff1a; if(Directory.Exists(dirPath&#xff09; { } 2.獲取文件夾內文件信息&#xff1a; DirectoryInfo di new DirectoryInfo(dirPath); foreach (FileInfo fi in di.GetFiles()) { …

.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…

tornado 第一篇

一&#xff1a;異步和非阻塞IO 實時的web特性通常需要每個用戶一個大部分時間&#xff0c;在傳統的同步web服務器中&#xff0c;這意味著需要給每個用戶分配一個專用的線程&#xff0c;這樣的開銷是十分巨大 tornado使用啦一種單線程事件循環的方式&#xff0c;這意味著所有的應…