#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls(p) ch[p][0]
#define rs(p) ch[p][1]
const int MAXN = 100005;
int a[MAXN];
ll sum[MAXN], suf[MAXN];
int val[MAXN];
int ch[MAXN][2], siz[MAXN], tot, root;
inline void Init() {
root = 0, tot = 0;
}
inline int NewNode(int v) {
int p = ++tot;
ch[p][0] = ch[p][1] = 0;
val[p] = v;
siz[p] = 1;
return p;
}
inline void PushUp(int p) {
siz[p] = siz[ls(p)] + siz[rs(p)] + 1;
}
int st[MAXN], stop;
inline int Build(int n) {
stop = 0;
for(int i = 1; i <= n; ++i) {
int tmp = NewNode(a[i]), last = 0;
while(stop && val[st[stop]] < val[tmp]) {
last = st[stop];
PushUp(last);
st[stop--] = 0;
}
if(stop)
rs(st[stop]) = tmp;
ls(tmp) = last;
st[++stop] = tmp;
}
while(stop)
PushUp(st[stop--]);
return st[1];
}
int Query(int root,int L,int R){
while(root<L||root>R)
root=root<L?rs(root):ls(root);
return root;
}
ll CalcSum(int p) {
if(!p)
return 0;
return CalcSum(ls(p)) + CalcSum(rs(p)) + 1ll * val[p] * ((siz[ls(p)]+1)*(siz[rs(p)]+1)-1);
}
int n;
int top;
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif
while(~scanf("%d", &n)) {
Init();
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
root = Build(n);
printf("%lld\n", CalcSum(root));
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?