[模板]笛卡爾樹
阿新 • • 發佈:2021-08-29
壹、測試題目 ¶
使用 [HDU1506]Largest Rectangle in a Histogram 測試。
貳、參考程式碼 ¶
# include <cstdio> # include <algorithm> # include <cstring> # include <vector> using namespace std; namespace Elaina { # define rep(i, l, r) for(int i=(l), i##_end_=(r); i<=i##_end_; ++i) # define drep(i, l, r) for(int i=(l), i##_end_=(r); i>=i##_end_; --i) # define fi first # define se second # define mp(a, b) make_pair(a, b) # define Endl putchar('\n') # define mmset(a, b) memset(a, b, sizeof (a)) # define mmcpy(a, b) memcpy(a, b, sizeof (a)) typedef long long ll; typedef unsigned long long ull; typedef pair <int, int> pii; typedef pair <ll, ll> pll; template <class T> inline T fab(T x) { return x<0? -x: x; } template <class T> inline void getmin(T& x, const T rhs) { x=min(x, rhs); } template <class T> inline void getmax(T& x, const T rhs) { x=max(x, rhs); } template <class T> inline T readin(T x) { x=0; int f=0; char c; while((c=getchar())<'0' || '9'<c) if(c=='-') f=1; for(x=(c^48); '0'<=(c=getchar()) && c<='9'; x=(x<<1)+(x<<3)+(c^48)); return f? -x: x; } template <class T> inline void writc(T x, char s='\n') { static int fwri_sta[1005], fwri_ed=0; if(x<0) putchar('-'), x=-x; do fwri_sta[++fwri_ed]=x%10, x/=10; while(x); while(putchar(fwri_sta[fwri_ed--]^48), fwri_ed); putchar(s); } } using namespace Elaina; const int maxn=100000; int h[maxn+5], n; int ls[maxn+5], rs[maxn+5], rt; int stk[maxn+5], ed; inline void build() { ed=rt=0; int lst; rep(i, 1, n) ls[i]=rs[i]=0; rep(i, 1, n) { lst=0; while(ed && h[stk[ed]]>h[i]) lst=stk[ed--]; if(ed) rs[stk[ed]]=i; else rt=i; if(lst) ls[i]=lst; stk[++ed]=i; } } int siz[maxn+5]; void dfs(int u) { siz[u]=1; if(ls[u]) dfs(ls[u]); if(rs[u]) dfs(rs[u]); siz[u]+=siz[ls[u]]+siz[rs[u]]; } signed main() { while(~scanf("%d", &n)) { if(!n) break; rep(i, 1, n) h[i]=readin(1); build(); dfs(rt); ll ans=0; rep(i, 1, n) ans=max(ans, 1ll*h[i]*siz[i]); writc(ans); } return 0; }