营业额统计

本次使用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;
}

 

posted @ 2018-03-31 14:16  aha浮云  阅读(150)  评论(0编辑  收藏  举报