日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

poj 2559 Largest Rectangle in a Histogram 栈

發布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 2559 Largest Rectangle in a Histogram 栈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// poj 2559 Largest Rectangle in a Histogram 棧
// 
// n個矩形排在一塊,不同的高度,讓你求最大的矩形的面積(矩形緊挨在一起)
//
// 這道題用的是數據結構做。也能夠遞推做。眼下僅僅會數據結構的
//
// 對于每一個高度h,求一個左邊界L和右邊界R,分別表示的意義是
// L是下標為j的矩形的高度的hj小于當前h的最大的j的值。

則依據定義 // 我們能夠知道j到i之間的h都是大于當前的hi的。 // R是下標為k的矩形的高度的hk大于當前h的最小的k的值。則依據定義 // 我們能夠知道i到k之間的h都是大于當前的hi的。 // 則最后的結果就是max( ( R[i] - L[i] ) * h[i]). // // 詳細實現是用一個棧依次保存每一個矩形的高度。 // 設棧中的元素從上到下的值是x[i](x[i] > x[i+1] && h[x[i]] > h[x[i+1]]) // // 在計算L[i]的時候。當棧頂元素j滿足h[j]>=h[i]時。一直出棧。直到j=0或者 // h[j] < h[i] 的時候,我們就求出了最大的h[j]>=h[i]的j的最小值即j+1 // // 在計算R[i]的時候,當棧頂元素j滿足h[j]>=h[i]時,一直出棧。知道j=0或者 // h[j] < h[i] 的時候。我們就求除了最小的h[j]>=h[i]的j的最大值即j。 // // 所要注意的是 // // 計算L的時候要從左邊開始掃描,此時棧中須要的是1,2,...i的值 // 計算R的時候要從右邊開始掃描,此時棧中須要的是i+1...n的值 // // // 感悟: // // 從這道題中就能夠發現數據結構棧的魅力的所在,個人感覺數據結構非常奇妙, // 也更加篤定了我要學數據結構的決心。

// // 繼續練 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat> #include <climits> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iostream> #include <list> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <vector> #define ceil(a,b) (((a)+(b)-1)/(b)) #define endl '\n' #define gcd __gcd #define highBit(x) (1ULL<<(63-__builtin_clzll(x))) #define popCount __builtin_popcountll typedef long long ll; using namespace std; const int MOD = 1000000007; const long double PI = acos(-1.L); const int maxn = 1e5 + 8; int a[maxn]; int st[maxn]; int n; int L[maxn]; int R[maxn]; void init(){ for (int i=0;i<n;i++) scanf("%d",&a[i]); int t = 0; for (int i=0;i<n;i++){ while(t>0 && a[st[t-1]]>=a[i]) t--; L[i] = t==0 ? 0 : st[t-1] + 1; st[t++] = i; } t = 0; for (int i=n-1;i>=0;i--){ while(t>0 && a[st[t-1]] >= a[i]) t--; R[i] = t==0 ? n : st[t-1]; st[t++] = i; } long long res = 0; for (int i=0;i<n;i++){ res = max(res,( R[i] - L[i] ) * (long long)a[i]); } printf("%lld\n",res); } int main() { //freopen("G:\\Code\\1.txt","r",stdin); while(scanf("%d",&n)!=EOF&&n){ init(); } return 0; }


轉載于:https://www.cnblogs.com/jzssuanfa/p/6814535.html

總結

以上是生活随笔為你收集整理的poj 2559 Largest Rectangle in a Histogram 栈的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。