题意:
![](https://www.nowcoder.com/equation?tex=%E6%8C%89%E7%85%A7BST%E7%9A%84%E8%A7%84%E5%88%99%EF%BC%8C%E6%AF%8F%E6%AC%A1%E6%8F%92%E5%85%A5%E4%B8%80%E4%B8%AA%E8%8A%82%E7%82%B9%EF%BC%8C%E7%84%B6%E5%90%8E%E8%AF%A2%E9%97%AE%E6%AF%8F%E6%AC%A1%E6%8F%92%E5%85%A5%E5%90%8E%E8%8A%82%E7%82%B9%E6%B7%B1%E5%BA%A6%E4%B9%8B%E5%92%8C&preview=true)
思路:
![](https://www.nowcoder.com/equation?tex=%E6%8F%92%E5%85%A5%E5%88%86%E4%B8%BA%E5%9B%9B%E7%A7%8D%EF%BC%9A&preview=true)
![](https://www.nowcoder.com/equation?tex=%E5%BD%93%E4%B8%80%E4%B8%AA%E8%8A%82%E7%82%B9%E5%9C%A8%E5%B7%B2%E6%8F%92%E5%85%A5%E7%9A%84%E8%8A%82%E7%82%B9%E5%BD%93%E4%B8%AD%E6%97%A2%E6%9C%89%E6%AF%94%E5%AE%83%E5%A4%A7%E7%9A%84%E4%B9%9F%E6%9C%89%E6%AF%94%E5%AE%83%E5%B0%8F%E7%9A%84%EF%BC%8C%E6%9C%89%E5%8F%AF%E8%83%BD%E6%8F%92%E5%9C%A8%E5%AE%83%E7%9A%84%E5%89%8D%E9%A9%B1%E7%9A%84%E5%B7%A6%E8%BE%B9%EF%BC%8C&preview=true)
![](https://www.nowcoder.com/equation?tex=%E4%B9%9F%E6%9C%89%E5%8F%AF%E8%83%BD%E6%8F%92%E5%9C%A8%E5%AE%83%E7%9A%84%E5%90%8E%E7%BB%A7%E7%9A%84%E5%8F%B3%E8%BE%B9&preview=true)
![](https://www.nowcoder.com/equation?tex=%E5%BD%93%E6%8F%92%E5%85%A5%E7%9A%84%E6%98%AF%E5%BD%93%E5%89%8D%E7%9A%84%E6%9E%81%E5%A4%A7%E5%80%BC%E6%97%B6%EF%BC%8C%E4%BC%9A%E6%8F%92%E5%9C%A8%E5%8E%9F%E6%9C%ACBST%E5%BD%93%E4%B8%AD%E6%9C%80%E5%A4%A7%E5%80%BC%E7%9A%84%E5%B7%A6%E8%BE%B9&preview=true)
![](https://www.nowcoder.com/equation?tex=%E5%BD%93%E6%8F%92%E5%85%A5%E7%9A%84%E6%98%AF%E5%BD%93%E5%89%8D%E6%9E%81%E5%B0%8F%E5%80%BC%E6%97%B6%EF%BC%8C%E4%BC%9A%E6%8F%92%E5%9C%A8%E5%8E%9F%E6%9C%ACBST%E5%BD%93%E4%B8%AD%E6%9C%80%E5%B0%8F%E5%80%BC%E7%9A%84%E5%8F%B3%E8%BE%B9&preview=true)
![](https://www.nowcoder.com/equation?tex=%E5%9B%A0%E6%AD%A4%E7%BB%BC%E5%90%88%E4%B8%8A%E8%BF%B0%E5%9B%9B%E7%A7%8D%E6%83%85%E5%86%B5%EF%BC%8C%E6%96%B0%E5%8A%A0%E5%85%A5%E7%9A%84%E8%8A%82%E7%82%B9%E7%9A%84%E6%B7%B1%E5%BA%A6%E4%B8%BA%20max%7Bdep%5Bpre%5D%2Cdep%5Bsuf%5D%7D%EF%BC%8C%E5%88%9D%E5%A7%8B%E6%97%B6&preview=true)
![](https://www.nowcoder.com/equation?tex=%E5%85%88%E6%8F%92%E5%85%A5%E4%B8%80%E4%B8%AAinf%E5%92%8C-inf%EF%BC%8C%E4%BF%9D%E8%AF%81%E5%BE%80%E5%90%8E%E6%8F%92%E5%85%A5%E7%9A%84%E8%8A%82%E7%82%B9%E4%B8%80%E5%AE%9A%E6%97%A2%E5%AD%98%E5%9C%A8%E5%89%8D%E9%A9%B1%E4%BA%A6%E5%AD%98%E5%9C%A8%E5%90%8E%E7%BB%A7&preview=true)
![](https://www.nowcoder.com/equation?tex=%E7%94%A8%E5%B9%B3%E8%A1%A1%E6%A0%91%E7%BB%B4%E6%8A%A4%E6%96%B0%E6%8F%92%E5%85%A5%E8%8A%82%E7%82%B9%E7%9A%84%E5%89%8D%E9%A9%B1%E5%90%8E%E7%BB%A7&preview=true)
#include <cstdio>
#include <random>
#include <unordered_map>
#include <algorithm>
using namespace std;
const int N = 3e5 + 10;
const int inf = 0x3f3f3f3f;
struct Node{
int l,r;
int val,key;
int size;
}fhq[N];
int cnt,root;
std::mt19937 rnd(233);
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline int newnode(int val){
fhq[++cnt].val = val;
fhq[cnt].key = rnd();
fhq[cnt].size = 1;
return cnt;
}
void update(int now){
fhq[now].size = fhq[fhq[now].l].size + fhq[fhq[now].r].size + 1;
}
void split(int now,int val,int &x,int &y){
if(!now) { x = y = 0;return;}
if(fhq[now].val<=val){
x = now;
split(fhq[now].r,val,fhq[now].r,y);
}else {
y = now;
split(fhq[now].l,val,x,fhq[now].l);
}
update(now);
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(fhq[x].key>fhq[y].key) {
fhq[x].r = merge(fhq[x].r,y);
update(x);
return x;
}else{
fhq[y].l = merge(x,fhq[y].l);
update(y);
return y;
}
}
int x,y,z;
void insert(int val){
split(root,val,x,y);
root = merge(merge(x,newnode(val)),y);
}
void del(int val){
split(root,val,x,z);
split(x,val-1,x,y);
y = merge(fhq[y].l,fhq[y].r);
root = merge(merge(x,y),z);
}
int getrank(int val){
split(root,val-1,x,y);
int res = fhq[x].size+1;
root = merge(x,y);
return res;
}
int getnum(int rank){
int now = root;
while(now)
{
if(fhq[fhq[now].l].size+1==rank)
break;
else if(fhq[fhq[now].l].size>=rank)
now=fhq[now].l;
else
{
rank-=fhq[fhq[now].l].size+1;
now=fhq[now].r;
}
}
return fhq[now].val;
}
int pre(int val){
split(root,val-1,x,y);
int now = x;
while(fhq[now].r)
now = fhq[now].r;
int res = fhq[now].val;
root=merge(x,y);
return res;
}
int nex(int val){
split(root,val,x,y);
int now = y;
while(fhq[now].l)
now = fhq[now].l;
int res = fhq[now].val;
root=merge(x,y);
return res;
}
int n;
unordered_map<int,int> dep;
int main(){
insert(-inf),insert(inf);
dep[-inf] = -1,dep[inf] = -1;
long long ans = 0;
scanf("%d",&n);
for(int i = 1,x;i <= n;i++){
x = read();
insert(x);
dep[x] = max(dep[nex(x)],dep[pre(x)]) + 1;
ans += dep[x];
printf("%lld\n",ans);
}
return 0;
}