zoukankan      html  css  js  c++  java
  • codevs 1296 营业额统计 (splay 点操作)

    题目大意

    每次加入一个值,并且询问之前加入的数中与该数相差最小的值。
    答案输出所有相差值的总和。

    解题分析

    = =

    参考程序

    #include <bits/stdc++.h>
    using namespace std;
    const int INF=2000000000;
    class splay_tree
    {
    private:
        struct node
        {
            int val;
            node *l,*r,*f;
            node(int _val=0,node *_f=NULL,node *_l=NULL,node *_r=NULL):
            val(_val),f(_f),l(_l),r(_r){}
        };
        node *rt;
        void right(node *x,node *&rt)
        {
            node *y=x->f,*z=y->f;
            if (y==rt) rt=x; else if (y==z->l) z->l=x; else z->r=x;
            if (x->r) x->r->f=y; y->f=x; x->f=z;
            y->l=x->r; x->r=y;
        }
        void left(node *x,node *&rt)
        {
            node *y=x->f,*z=y->f;
            if (y==rt) rt=x; else if (y==z->l) z->l=x; else z->r=x;
            if (x->l) x->l->f=y; y->f=x; x->f=z;
            y->r=x->l; x->l=y;
        }
        void splay(node *x,node *&rt)
        {
            while (x!=rt)
            {
                node *y=x->f,*z=y->f;
                if (y==rt) if (x==y->l) right(x,rt); else left(x,rt); 
                else if (y==z->l) if (x==y->l) {right(y,rt);right(x,rt);} else {left(x,rt);right(x,rt);} 
                     else if (x==y->r) {left(y,rt);left(x,rt);} else {right(x,rt);left(x,rt);}
            }
        }
        void insert(int val,node * &x,node *fa)
        {
            if (x==NULL)
            {
                x=new node(val,fa);
                splay(x,rt);
                return;
            }
            if (val<x->val) insert(val,x->l,x); else insert(val,x->r,x);
        }
        int search(int val,node *x)
        {
            int tmp=INF;
            while (x!=NULL)
            {
                if (x->val==val) return 0;
                tmp=min(tmp,abs(x->val-val));
                if (val<x->val) x=x->l; else x=x->r;
            }
            return tmp;
        }
    public:
        splay_tree(){rt=NULL;}
        void add(int x){insert(x,rt,NULL);}
        int find(int x){return search(x,rt);}
    };
    int main()
    {
        cin.sync_with_stdio(0);
        int n,x;
        cin>>n>>x;
        long long ans=abs(x);
        splay_tree T;
        T.add(x);
        for (int i=2;i<=n;i++)
        {
            cin>>x;
            ans+=T.find(x);
            T.add(x);
        }
        cout<<ans<<endl;
    }
    
    
  • 相关阅读:
    【WPF】Blend for Visual Studio 2013 入门
    【c#】获取CPU序列号及遇到的问题
    【GIT】学习笔记
    【备份】一些留待学习的好网站
    【VS】无法折叠所有方法的问题 VS2013
    【概念】XML
    配置JDK
    TCP/IP Wireshark监听 及错误代码
    软件比较
    湖南省专升本
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/6803609.html
Copyright © 2011-2022 走看看