题意:
柱状图中已知每个矩形的宽和高,问矩形最大面积是多少?
思路:
单调栈的模板题,不过也能用单调队列来解决。
对于每个位置,我们可以用单调队列(deque)维护一个单调递增的序列,当遇到递减情况时,统计前面前面形成矩形方案的最大值,同时不断维护队列单调性。(矩形底边宽可以用前缀和预处理求出)
最后记得开 longlong ,应该没什么坑了
代码:
#include<iostream> #include<algorithm> #include<stdio.h> #include<cstring> #include<deque> #define mem(a, x) memset(a, x, sizeof(a)) void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); } typedef long long ll; using namespace std; int n,i,j; ll a[1000005],h[1000005],f[1000005]; ll ans = 0; int main() { deque<int>q; cin>>n; for(i=1;i<=n;i++){ cin>>a[i]; f[i] = f[i-1] + a[i]; } for(i=1;i<=n;i++){ cin>>h[i]; } q.push_back(0); for(i=1;i<=n;i++){ if(q.empty() || h[i] >= h[q.back()]){ q.push_back(i); } else{ while(!q.empty() && h[q.back()] > h[i]){ ll k = q.back(); q.pop_back(); ans = max((f[i-1]-f[q.back()])*h[k],ans); } q.push_back(i); } } cout<<ans<<endl; }