SBT 营业额统计

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);
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值