HDU - 1506
分析
去专门学了笛卡尔树,找了一道模板题来做。由于我们建立的笛卡尔树满足小根堆性质,因此 的子树内的结点的高度都大于等于
。而我们又知道
子树内的下标是一段连续的区间。所以
。通过单调栈构建笛卡尔树,时间复杂度为
。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110000;
int lc[N],rc[N],st[N],top,n,a[N],si[N];
#define LL long long
LL ans;
void dfs(int x) {
if(lc[x]) dfs(lc[x]);
if(rc[x]) dfs(rc[x]);
si[x] = si[lc[x]] + si[rc[x]] + 1;
ans = max(ans,1LL * si[x] * a[x]);
}
int main() {
while(scanf("%d",&n) && n) {
for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
ans = top = 0;memset(lc,0,sizeof(lc));memset(rc,0,sizeof(rc));
for(int i = 1;i <= n;i++) {
int k = top;
while(k && a[i] <= a[st[k]]) k--;
if(k) rc[st[k]] = i;
if(k < top) lc[i] = st[k + 1];
st[++k] = i;top = k;
}
dfs(st[1]);
printf("%lld\n",ans);
}
}
科大讯飞公司氛围 437人发布