牛客网 【每日一题】7月24日题目精讲—小A的柱状图
生活随笔
收集整理的這篇文章主要介紹了
牛客网 【每日一题】7月24日题目精讲—小A的柱状图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:
文章目錄
- 題目描述
- 題解:
- 代碼:
小A的柱狀圖 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld
題目描述
柱狀圖是有一些寬度相等的矩形下端對齊以后橫向排列的圖形,但是小A的柱狀圖卻不是一個規范的柱狀圖,它的每個矩形下端的寬度可以是不相同的一些整數,分別為a[i]a[i],每個矩形的高度是h[i]h[i],現在小A只想知道,在這個圖形里面包含的最大矩形面積是多少。
輸入描述:
一行一個整數N,表示長方形的個數 接下來一行N個整數表示每個長方形的寬度 接下來一行N個整數表示每個長方形的高度
輸出描述:
一行一個整數,表示最大的矩形面積
示例1
輸入
復制
輸出
復制
說明
樣例如圖所示,包含的最大矩形面積是8
備注:
1≤n≤1e6,1≤a[i]≤100,1≤h[i]≤1e9
題解:
單調棧問題
我們可以用一個單調棧來維護每個矩陣的高度和寬度,
當前矩陣高于棧頂,進棧
當前矩陣a小于棧頂時,直到棧為空或者棧頂矩形的高度比當前矩形小。在出棧過程中,我們累計被彈出的矩形的寬度和。每彈出一個矩形,就用他的高度(他指被彈出的矩陣)乘上累計的寬度取更新答案,因為每次彈出的高度要比上次彈出的小,相當于依次求以從左往右以每個矩陣高的面積(如圖所示)。整個出棧過程結束后,我們把一個高度為當前矩陣高度,寬度為累計值的新矩陣入棧。
全部掃描過后,我們要將棧內剩余矩陣依次彈出,并利用相同的方法更新答案。
代碼:
#include<bits/stdc++.h> #include<stack> using namespace std; typedef long long ll; const int maxn=1e6+4; int a[maxn]; ll h[maxn]; stack<int> s; stack<int> w;//寬度 int main() {int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)cin>>h[i];h[n+1]=0;ll ans=0;s.push(0);//先放一個0 w.push(0); for(int i=1;i<=n;i++){if(h[i]>s.top()){s.push(h[i]);w.push(a[i]);}else {ll tot=0;while(!s.empty()&&s.top()>=h[i]){tot+=w.top();ans=max(ans,tot*s.top());w.pop();s.pop();}s.push(h[i]);w.push(tot+a[i]);}}cout<<ans;return 0; }總結
以上是生活随笔為你收集整理的牛客网 【每日一题】7月24日题目精讲—小A的柱状图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站怎么注册(怎么申请网站域名)
- 下一篇: 牛客网【每日一题】7月29日题目精讲—M