Splay的插入,找最大,最小值。。。。。
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn=1000010; const int INF=~0U>>2; #define key_valu (ch[ch[root][1]][0]) int ch[maxn][2],key[maxn],pre[maxn]; int tot1,root; ///debug************************** void ShowTree(int x) { if(x) { ShowTree(ch[x][0]); cout<<"key: "<<key[x]<<" 结点: "<<x<<" 左儿子: "<<ch[x][0]<<" 右儿子: "<<ch[x][1]<<" 父节点: "<<pre[x]<<endl; ShowTree(ch[x][1]); } } ///***************************** void NewNode(int& r,int father,int k) { r=++tot1; key[r]=k; ch[r][0]=ch[r][1]=0;pre[r]=father; } void init() { tot1=root=0; memset(ch,0,sizeof(ch)); memset(pre,0,sizeof(pre)); memset(key,0,sizeof(key)); } void rotate(int x,int d) { int y=pre[x]; ch[y][!d]=ch[x][d]; pre[ch[x][d]]=y; pre[x]=pre[y]; if(pre[x]) ch[pre[x]][ch[pre[y]][1]==y]=x; pre[y]=x; ch[x][d]=y; } void Splay(int r,int goal) { while(pre[r]!=goal) { if(pre[pre[r]]==goal) { rotate(r,ch[pre[r]][0]==r); } else { int y=pre[r]; int kind=(ch[pre[y]][0]==y); if(ch[y][kind]==r) rotate(r,!kind); else rotate(y,kind); rotate(r,kind); } } if(goal==0) root=r; } void Insert(int x) { int r=root; if(r==0) { NewNode(root,0,x); return ; } while(ch[r][key[r]<x]) { r=ch[r][key[r]<x]; } NewNode(ch[r][key[r]<x],r,x); Splay(ch[r][key[r]<x],0); } int Get_Min(int r) { while(ch[r][0]) r=ch[r][0]; return r; } int Get_Max(int r) { while(ch[r][1]) r=ch[r][1]; return r; } int main() { int n,a; while(scanf("%d",&n)!=EOF) { init(); int ans=0; for(int i=0;i<n;i++) { if(scanf("%d",&a)==EOF) a=0; Insert(a); if(!i) ans+=a; else { int temp=INF; if(ch[root][0]) temp=min(temp,a-key[Get_Max(ch[root][0])]); if(ch[root][1]) temp=min(temp,key[Get_Min(ch[root][1])]-a); ans+=temp; } } printf("%d\n",ans); } return 0; }