题意:
思路:
#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;
}