本次使用splay ,代码如下
#include<bits/stdc++.h> using namespace std; const int N = 1000005; int root=1,k=1,same; struct node { int val,pa,son[2],cnt; }tree[N]; int ans; void insert(int root,int data) { if(data==tree[root].val) { tree[root].cnt++; same=root; return ; } if(data>tree[root].val&&tree[root].son[1]!=0) insert(tree[root].son[1],data); else if(data<tree[root].val&&tree[root].son[0]!=0) insert(tree[root].son[0],data); else if(data<tree[root].val&&tree[root].son[0]==0) { k++; tree[root].son[0]=k; tree[tree[root].son[0]].pa=root; tree[tree[root].son[0]].cnt=1; tree[tree[root].son[0]].val=data; same=tree[root].son[0]; } else if(data>tree[root].val&&tree[root].son[1]==0) { k++; tree[root].son[1]=k; tree[tree[root].son[1]].pa=root; tree[tree[root].son[1]].cnt=1; tree[tree[root].son[1]].val=data; same=tree[root].son[1]; } } void rotate(int now) { int fa=tree[now].pa; int gra=tree[fa].pa; bool flag=tree[fa].son[1]==now; root=fa==root?now:root; if(tree[gra].son[0]==fa) tree[gra].son[0]=now; else tree[gra].son[1]=now; tree[fa].son[flag]=tree[now].son[flag^1]; tree[tree[now].son[flag^1]].pa=fa; tree[now].son[flag^1]=fa; tree[fa].pa=now; tree[now].pa=gra; } void splay(int now) { while(now!=root) { int fa=tree[now].pa; int gra=tree[fa].pa; if(fa!=root) { if((tree[fa].son[0]==now) ^ (tree[gra].son[0]==fa) ) { rotate(now); } else rotate(fa); } rotate(now); } } int lysfind(int data) { int front ,behind; int now=tree[root].son[1]; if(now) { while(tree[now].son[0]) { now=tree[now].son[0]; } front=tree[now].val-data; } else front = 1e9; now=tree[root].son[0]; if(now) { while(tree[now].son[1]) { now=tree[now].son[1]; } behind=-(tree[now].val-data); } else behind=1e9; return min(front,behind); } int main() { int n,data; cin>>n>>tree[1].val;ans=tree[1].val; tree[1].cnt=1; for(int i=2;i<=n;i++) { scanf("%d",&data); insert(root,data); splay(same); if(tree[root].cnt>1) continue; ans+=lysfind(data); } //for(int i=1;i<=n;i++) //cout<<tree[i].son[0]<<" "<<tree[i].son[1]<<" "<<tree[i].val<<" "<<tree[i].pa<<endl; cout<<ans; return 0; }