Largest Rectangle in a Histogram(附上幾組測試資料)
阿新 • • 發佈:2018-11-29
Largest Rectangle in a Histogram
http://acm.hdu.edu.cn/showproblem.php?pid=1506
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 23458 Accepted Submission(s): 7362
Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.
Sample Input 7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
Sample Output 8 4000
Source University of Ulm Local Contest 2003
單調棧經典題
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<string> 6 #include<vector> 7 #include<cstdio> 8 #include<queue> 9 #include<stack> 10 using namespace std; 11 12 struct sair{ 13 long long v; 14 int pos; 15 }a[100005]; 16 17 int main(){ 18 std::ios::sync_with_stdio(false); 19 int n; 20 while(cin>>n){ 21 if(!n) break; 22 for(int i=1;i<=n;i++){ 23 cin>>a[i].v; 24 a[i].pos=i; 25 } 26 stack<sair>st; 27 long long ans=0; 28 long long cnt,pos; 29 for(int i=1;i<=n;i++){ 30 if(st.empty()){ 31 st.push(a[i]); 32 ans=max(ans,st.top().v); 33 } 34 else{ 35 while(!st.empty()&&st.top().v>=a[i].v){ 36 cnt=st.top().v; 37 pos=st.top().pos; 38 st.pop(); 39 if(st.empty()){ 40 ans=max(ans,cnt*(i-1)); 41 } 42 else{ 43 ans=max(ans,cnt*(i-1-st.top().pos)); 44 } 45 } 46 st.push(a[i]); 47 } 48 } 49 int Last; 50 if(!st.empty()){ 51 Last=st.top().pos; 52 } 53 while(!st.empty()){ 54 cnt=st.top().v; 55 pos=st.top().pos; 56 st.pop(); 57 if(st.empty()){ 58 ans=max(ans,cnt*n);; 59 } 60 else{ 61 ans=max(ans,cnt*(Last-st.top().pos)); 62 } 63 } 64 cout<<ans<<endl; 65 } 66 system("pause"); 67 } 68 /* 69 6 2 5 2 5 5 2 70 5 1 2 3 4 4 71 7 2 1 4 5 1 3 3 72 4 1000 1000 1000 1000 73 3 2 1 2 74 4 2 2 5 5 75 */View Code