笛卡尔树
https://zhuanlan.zhihu.com/p/635967921
看这个。
https://www.cnblogs.com/LiuRunky/p/Cartesian_Tree.html
模板题
P5596. 最大的矩形面积
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int N=100005;
int n;
int a[N];
int root;
int ls[N],rs[N];
vector<int> v;
void Build()
{
v.clear();
memset(ls,0,sizeof(ls));
memset(rs,0,sizeof(rs));
for(int i=1;i<=n;i++)
{
int j=0;
while(v.size() && a[v.back()]>a[i])
{
j=v.back();
v.pop_back();
}
if(!v.size())
root=i;
else
rs[v.back()]=i;
ls[i]=j;
v.push_back(i);
}
}
int l[N],r[N];
void dfs(int x)
{
l[x]=r[x]=x;
if(ls[x])
{
dfs(ls[x]);
l[x]=l[ls[x]];
}
if(rs[x])
{
dfs(rs[x]);
r[x]=r[rs[x]];
}
}
int main()
{
scanf("%d",&n);
while(n)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
Build();
dfs(root);
ll ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,ll(a[i])*(r[i]-l[i]+1));
printf("%lld\n",ans);
scanf("%d",&n);
}
return 0;
}

浙公网安备 33010602011771号