size用于维护树的深度,值为自己和孩子的总数;
#include<iostream>
#include<stdio.h>
using namespace std;
int abs(int a)
{
return a > 0 ? a : -a;
}
struct Tree_node
{
int key,size,left,right;
}SBT_Tree[40000];
int i,n,x,ans,total,root;
void Left_Rotate(int &x)
{
int y;
y = SBT_Tree[x].right;
SBT_Tree[x].right = SBT_Tree[y].left;
SBT_Tree[y].left = x;
SBT_Tree[y].size = SBT_Tree[x].size;
SBT_Tree[x].size = SBT_Tree[SBT_Tree[x].left].size + SBT_Tree[SBT_Tree[x].right].size + 1;
x = y;
}
void Right_Rotate(int &x)
{
int y;
y = SBT_Tree[x].left;
SBT_Tree[x].left = SBT_Tree[y].right;
SBT_Tree[y].right = x;
SBT_Tree[y].size = SBT_Tree[x].size;
SBT_Tree[x].size = SBT_Tree[SBT_Tree[x].left].size + SBT_Tree[SBT_Tree[x].right].size + 1;
x = y;
}
void maintain(int &x,bool flag)
{
if (flag){
if (SBT_Tree[SBT_Tree[SBT_Tree[x].left].left].size > SBT_Tree[SBT_Tree[x].right].size) Right_Rotate(x);
else if (SBT_Tree[SBT_Tree[SBT_Tree[x].left].right].size > SBT_Tree[SBT_Tree[x].right].size) Left_Rotate(SBT_Tree[x].left),Right_Rotate(x);
else return;
}
else {
if (SBT_Tree[SBT_Tree[SBT_Tree[x].right].right].size > SBT_Tree[SBT_Tree[x].left].size) Left_Rotate(x);
else if (SBT_Tree[SBT_Tree[SBT_Tree[x].right].left].size > SBT_Tree[SBT_Tree[x].left].size) Right_Rotate(SBT_Tree[x].right),Left_Rotate(x);
else return;
}
maintain(SBT_Tree[x].left,true);
maintain(SBT_Tree[x].right,true);
maintain(x,true);
maintain(x,false);
}
void insert(int &x,int data)
{
if (x == 0){
x = ++total;
SBT_Tree[x].size = 1;
SBT_Tree[x].left = 0;
SBT_Tree[x].right = 0;
SBT_Tree[x].key = data;
}
else {
SBT_Tree[x].size++;
if(data <= SBT_Tree[x].key) insert(SBT_Tree[x].left,data);
else insert(SBT_Tree[x].right,data);
maintain(x,data<=SBT_Tree[x].key);
}
}
int find(int x,int data)
{
int Find;
if(SBT_Tree[x].key == data) return data;
if (data < SBT_Tree[x].key){
if(SBT_Tree[x].left == 0) Find = SBT_Tree[x].key;
else Find = find(SBT_Tree[x].left,data);
}
else {
if(SBT_Tree[x].right == 0) Find = SBT_Tree[x].key;
else Find = find(SBT_Tree[x].right,data);
}
if( abs(Find - data) > abs(SBT_Tree[x].key - data) ) return SBT_Tree[x].key;
else return Find;
}
int main()
{
total = 0,SBT_Tree[0].size = 0,root = 0;
while (~scanf("%d",&n))
{
scanf("%d",&x);
ans += x;
insert(root,x);
for(i = 2;i<=n;i++)//{
scanf("%d",&x),ans += abs(find(root,x) - x),insert(root,x);
//for(int j = 1;j<=i;j++)
//printf("%d :: %d : %d,l: %d,r: %d\n",j,SBT_Tree[j].key,SBT_Tree[j].size,SBT_Tree[j].left,SBT_Tree[j].right);}
printf("%d\n",ans);
}
}