rt,疑似插入有问题,调试时中序遍历输出不递增
#include<iostream>
#include<set>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define int long long
struct ed {
int l,r,size;
int val;
int pr;
int cnt;
};
#define INF 1145141919
//#define P 100000005
struct treap {
ed a[1000005];
void upd(int u) {
a[u].size=a[a[u].l].size+a[a[u].r].size+a[u].cnt;
}
int root,tot;
void zig(int &u) {
int v=a[u].l;
a[u].l=a[v].r;
a[v].r=u;
u=v;
upd(a[u].r);
upd(u);
}
void zag(int &u) {
int v=a[u].r;
a[u].r=a[v].l;
a[v].l=u;
u=v;
upd(a[u].l);
upd(u);
}
void insert(int& u,int x) {
if(x == a[u].val){
upd(u);
return ;
}
if(u == 0) {
a[++tot].val=x;
a[tot].pr=rand();
a[tot].cnt=1;
a[tot].size=1;
u=tot;
return ;
}
if(x<a[u].val) {
insert(a[u].l,x);
if(a[u].pr<a[a[u].l].pr)zig(u);
}
if(x>a[u].val) {
insert(a[u].r,x);
if(a[u].pr<a[a[u].r].pr)zag(u);
}
upd(u);
}
void build() {
root=1,tot=1;
a[1].val=INF;
a[1].size=1;
a[1].cnt=1;
a[1].pr=rand();
insert(root,-INF);
}
int Find(int p,int x) {
if(p==0) return 0;
if(a[p].val==x) return p;
return a[p].val<x ? Find(a[p].r,x) : Find(a[p].l,x);
}
void erase(int& u,int x) {
if(u == 0) return ;
if(x == a[u].val) {
if(a[u].cnt>1) {
a[u].cnt--;
upd(u);
return ;
}
if(a[u].l!=0||a[u].r!=0) {
if(a[a[u].l].pr>a[a[u].r].pr) {
zig(u);
erase(a[u].r,x);
} else {
zag(u);
erase(a[u].l,x);
}
upd(u);
} else u=0;
return ;
}
if(x<a[u].val)erase(a[u].l,x);
if(x>a[u].val)erase(a[u].r,x);
upd(u);
}
int las(int num) {
int ans=-INF;
int u=root;
while(u) {
if(num == a[u].val) {
if(a[u].l) {
u=a[u].l;
while(a[u].r)u=a[u].r;
ans=a[u].val;
}
break;
}
if(a[u].val<num&&a[u].val>ans) {
ans=a[u].val;
}
if(a[u].val<num)u=a[u].r;
else u=a[u].l;
}
return ans;
}
int nxt(int num) {
int ans=INF;
int u=root;
while(u) {
if(num == a[u].val) {
if(a[u].r) {
u=a[u].r;
while(a[u].l)u=a[u].l;
ans=a[u].val;
}
break;
}
if(a[u].val>num&&a[u].val<ans) {
ans=a[u].val;
}
if(a[u].val<num)u=a[u].r;
else u=a[u].l;
}
return ans;
}
int ask_val(int u,int k) {
// cout<<u;
cout<<a[u].val;
if(a[a[u].l].size+1<=k&&k<=a[a[u].l].size+a[u].cnt) return a[u].val;
if(k<=a[a[u].l].size)return ask_val(a[u].l,k);
return ask_val(a[u].l,k-a[a[u].l].size-a[u].cnt);
}
int ask_rank(int u,int x) {
if(u==0) return 0;
if(x==a[u].val)
if(x<a[u].val)
return a[a[u].l].size+1;
return ask_rank(a[u].l,x);
return ask_rank(a[u].r,x)+a[a[u].l].size+a[u].cnt;
}
} s;
char c[5];
signed main() {
srand(time(0));
int n;
cin>>n;
s.build();
int sum;
cin>>sum;
s.insert(s.root,sum);
for(int i=2;i<=n;i++){
int x;
cin>>x;
if(s.Find(s.root,x))continue;
sum+=min(abs(x-s.las(x)),abs(x-s.nxt(x)));
s.insert(s.root,x);
}
cout<<sum;
}