SRM337 div1 medium
ALGORITHM NOTE ヒストグラム中の最大の長方形の面積
または
Amazon.co.jp: プログラミングコンテストチャレンジブック: 秋葉 拓哉, 岩田 陽一, 北川 宜稔: 本
の280ページ、スタックの利用を参照。
#include <vector> #include <stack> using namespace std; typedef long long LL; class BuildingAdvertise { public: int n; vector<int> building; vector<int> L,R; void makeR(vector<int> h) { building=vector<int>(n,0); int j=0; int m=h.size(); for(int i=0;i<n;i++) { building[i]=h[j]; int s=(j+1)%m; h[j]=((h[j]^h[s])+13)%835454957; j=s; } } LL getMaxArea(vector <int> h, int _n) { n=_n; makeR(h); L=vector<int>(n,0); R=vector<int>(n,0); stack<int> sta; for(int i=0;i<n;i++) { while(!sta.empty() && building[i]<=building[sta.top()]) sta.pop(); if(sta.empty()) L[i]=0; else L[i]=sta.top()+1; sta.push(i); } while(!sta.empty()) sta.pop(); for(int i=n-1;0<=i;i--) { while(!sta.empty() && building[i]<=building[sta.top()]) sta.pop(); if(sta.empty()) R[i]=n; else R[i]=sta.top(); sta.push(i); } LL ans=0; for(int i=0;i<n;i++) ans=max(ans,(LL)(R[i]-L[i])*(LL)building[i]); return ans; } };