`
Coco_young
  • 浏览: 127689 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

[平衡树]BallIntheBox

 
阅读更多

题目还是牛耳杯程序设计大赛的D题,之前已经描述过,就不在赘述了。

之前用AVL实现的,这里附上一个用SBT实现的版本,对比发现SBT实现更为简单,而且时空消耗略少。

搓长丑的SBT代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<memory.h>
#include<ctime>
using namespace std;
const int MAXN = 100010;
struct KEY
{
    int wgt;
    int num;
    KEY(int w=0,int n=0):wgt(w),num(n){}
    bool operator == (const KEY &k) const
    {
         return wgt==k.wgt&&num==k.num;
    }
    bool operator < (const KEY &k) const
    {
         if(wgt!=k.wgt)return wgt<k.wgt;
         return num<k.num;
    }
};
struct SBT
{
    int l[MAXN],r[MAXN],size[MAXN],pool[MAXN],ROOT,TOP,NODE;
    KEY Key[MAXN];
    void init()
    {
         TOP = NODE = ROOT = 0;
    }
    int newnode(int w,int n)
   {
        int node;
        if(TOP)node = pool[TOP--];
        else node = ++NODE;
        Key[node].wgt = w;
        Key[node].num = n;
        size[node] = 1;
        l[node] = r[node] = 0;
        return node;
   }
   void delnode(int x)
   {
        pool[++TOP] = x;
        Key[x].wgt = Key[x].num = size[x] = l[x] = r[x] = 0;
   }
   void left_rotate(int &p)
   {
        int x = r[p];
        r[p] = l[x];
        l[x] = p;
        size[p] = size[l[p]]+size[r[p]]+1;
        size[x] = size[l[x]]+size[r[x]]+1;
        p = x;
   }
   void right_rotate(int &p)
   {
        int x = l[p];
        l[p] = r[x];
        r[x] = p;
        size[p] = size[l[p]]+size[r[p]]+1;
        size[x] = size[l[x]]+size[r[x]]+1;
        p = x;
   }
   void Maintain(int &p)
   {
        if(size[l[l[p]]]>size[r[p]])
        {
            right_rotate(p);
            Maintain(r[p]);
            Maintain(p);
        }
        if(size[r[l[p]]]>size[r[p]])
        {
            left_rotate(l[p]);
            right_rotate(p);
            Maintain(l[p]);
            Maintain(r[p]);
            Maintain(p);
        }
        if(size[r[r[p]]]>size[l[p]])
        {
            left_rotate(p);
            Maintain(l[p]);
            Maintain(p);
        }
        if(size[l[r[p]]]>size[l[p]])
        {
            right_rotate(r[p]);
            left_rotate(p);
            Maintain(r[p]);
            Maintain(l[p]);
            Maintain(p);
        }
   }
   void Maintain_faster(int &p,bool flag)
   {
        if(flag==0)
        {
            if(size[l[l[p]]]>size[r[p]])right_rotate(p);
            else if(size[r[l[p]]]>size[r[p]])
            {
                 left_rotate(l[p]);
                 right_rotate(p);
            }
            else return ;
        }
        else
        {
            if(size[r[r[p]]]>size[l[p]])left_rotate(p);
            else if(size[l[r[p]]]>size[l[p]])
            {
                 right_rotate(r[p]);
                 left_rotate(p);
            }
            else return;
        }
        Maintain_faster(l[p],0);
        Maintain_faster(r[p],1);
        Maintain_faster(p,1);
        Maintain_faster(p,0);
   }
   void insert(int &p,KEY k)
   {
        if(!p)
        {
              p = newnode(k.wgt,k.num);
              return;
        }
        if(k<Key[p])insert(l[p],k);
        else insert(r[p],k);
        size[p]=size[l[p]]+size[r[p]]+1;
        Maintain_faster(p,!(k<Key[p]));
   }
   int findmin(int p)
   {
       if(l[p])return findmin(l[p]);
       else return p;
   }
   void remove(int &p,KEY k)
   {
        if(p)
        {
            if(k==Key[p])
            {
                if(!l[p])
                {
                    int x = p;
                    p = r[p];
                    delnode(x);
                }
                else if(!r[p])
                {
                    int x = p;
                    p = l[p];
                    delnode(x);
                }
                else
                {
                    int x = findmin(r[p]);
                    Key[p] = Key[x];
                    remove(r[p],Key[x]);
                }
            }
            else if(k<Key[p])remove(l[p],k);
            else remove(r[p],k);
            if(p){
               size[p] = size[l[p]]+size[r[p]]+1;
            }
            //Maintain(p);
        }
   }
   int Select(int p,int k)
   {
       int rank = size[l[p]]+1;
       if(rank==k)return p;
       else if(rank<k)return Select(r[p],k-rank);
       return Select(l[p],k);
   }
   void print(int p)
   {
       if(!p)return;
       print(l[p]);
       printf("%d\n",size[p]);
       print(r[p]);
   }
}sbt;
int A[MAXN];
int main()
{
    clock_t start,final;
    start = clock();
    int n,m;
    freopen("D.in","r",stdin);
    freopen("Dans.out","w",stdout);
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        sbt.init();
        for(int i=1;i<=n;i++)scanf("%d",&A[i]);
        for(int i=1;i<=n;i++)sbt.insert(sbt.ROOT,KEY(A[i],i));
        for(int i=0;i<m;i++)
        {
            int x,y;char op[5];
            scanf("%s",op);
            //sbt.print(sbt.ROOT);
            if(op[0]=='A')
            {
                scanf("%d%d",&x,&y);
                sbt.remove(sbt.ROOT,KEY(A[x],x));
                A[x]+=y;
                sbt.insert(sbt.ROOT,KEY(A[x],x));
            }
            else if(op[0]=='B')
            {
                scanf("%d%d",&x,&y);
                sbt.remove(sbt.ROOT,KEY(A[x],x));
                A[x]-=y;
                sbt.insert(sbt.ROOT,KEY(A[x],x));
            }
            else if(op[0]=='C')
            {
                scanf("%d%d",&x,&y);
                sbt.remove(sbt.ROOT,KEY(A[x],x));sbt.remove(sbt.ROOT,KEY(A[y],y));
                A[y]+=A[x];
                sbt.insert(sbt.ROOT,KEY(A[y],y));
            }
            else
            {
                scanf("%d",&x);
                printf("%d\n",sbt.Key[sbt.Select(sbt.ROOT,x)].wgt);
            }
        }
    }
    final = clock();
    printf("Time is %lf\n",(double)(final-start)/CLOCKS_PER_SEC);
    return 0;
}


分享到:
评论

相关推荐

    若干平衡树的C语言实现_C语言_平衡树_

    平衡树是一种特殊的二叉树数据结构,其设计目标是保持树的高度平衡,从而在插入、删除和查找等操作中提供接近于O(log n)的时间复杂度。在C语言中实现平衡树,通常会涉及到AVL树、红黑树或者Treap等经典的数据结构。 ...

    二叉平衡树学生管理系统

    在本项目中,“二叉平衡树学生管理系统”是利用C语言实现的一个高效的学生信息管理工具。这个系统基于二叉平衡树的数据结构,如AVL树或红黑树,以确保数据操作(如查找、插入和删除)的高效性。下面我们将深入探讨...

    平衡树实验报告完整版

    平衡树是一种特殊的数据结构,主要用于高效地存储和检索数据,特别是在需要保持数据排序的情况下。它在计算机科学,尤其是算法和数据结构领域中占有重要地位。本实验报告将深入探讨平衡树的基本概念、常见类型以及其...

    权重平衡树的python实现

    就像其他自平衡树一样,加权平衡树储存的账簿信息可以在树结构被插入和删除操作打乱时,通过平衡结点和操作树旋转来使树结构重新达到平衡。特别的地方是,加权平衡树的每个结点储存这个结点下子树的大小,并且这个...

    数据结构 ALV平衡树 程序代码 报告齐全

    在众多的数据结构中,ALV平衡树是一种特殊类型的自平衡二叉查找树(BST),它的设计目标是为了确保查找、插入和删除等操作的时间复杂度保持在O(log n)。在本资料包中,包含了关于ALV平衡树的程序代码和完整的报告,...

    c++写的平衡树数据结构

    本项目涉及的是一个用C++实现的平衡树数据结构,特别关注于元素的添加和删除操作,以确保在这些操作后树仍然保持平衡。平衡树是一种特殊的二叉树,它的每个节点的两个子树高度差不超过1,这使得搜索、插入和删除等...

    带测试用例的平衡树算法

    平衡树是一种特殊的二叉树数据结构,其设计目标是确保在执行插入和删除操作时,树的高度保持最小,从而提供高效的查找、插入和删除性能。常见的平衡树有AVL树、红黑树、Treap等。在这个项目中,我们关注的是C++实现...

    平衡树的建立 插入删除 等操作

    平衡树是一种特殊的二叉树数据结构,其设计目标是保持树的高度平衡,从而在插入、删除和查找等操作中保持高效的性能。在计算机科学中,平衡树是解决动态集合问题的关键工具之一,尤其是在大量数据处理时。本篇将详细...

    二叉平衡树查找,插入与删除.zip

    二叉平衡树是一种特殊的二叉树结构,它的左右子树高度差不超过1,这使得它在查找、插入和删除操作上的效率比普通的二叉搜索树更高。本项目以HTML+JavaScript实现二叉平衡树,提供了查找、插入和删除功能,便于理解和...

    平衡树_王天懿.pptx

    平衡树是一种特殊的二叉树数据结构,主要用于高效地执行查找、插入和删除操作。它的主要特点是每个节点的左子树中的所有节点值都小于该节点,而右子树中的所有节点值都大于该节点。这样的设计确保了二叉搜索树在进行...

    C++实现平衡树的问题

    在IT领域,平衡树是一种特殊的树形数据结构,它的主要特点是任何节点的两个子树的高度差不超过1,这使得在平衡树中进行查找、插入和删除等操作的时间复杂度可以保持在O(logn)。本题关注的是使用C++语言实现平衡树,...

    AVL二叉平衡树删除--标准版

    AVL二叉平衡树删除--标准版AVL二叉平衡树删除--标准版AVL二叉平衡树删除--标准版AVL二叉平衡树删除--标准版

    实现二叉平衡树的相关运算算法

    实现二叉平衡树的相关运算算法。并在此基础上完成如下功能:1、由{4,9,0,1,8,6,3,5,2,7}创建一颗AVL树b并以括号表示输出。2、在b中分别删除关键字为8和2 的结点,并以括号表示法输出删除后的AVL树

    若干平衡树的C语言实现_C语言_平衡树_源码.zip

    本资源“若干平衡树的C语言实现_C语言_平衡树_源码.zip”包含了一些平衡树算法的C语言实现,对于学习数据结构、算法以及C语言编程的开发者来说是非常有价值的。 首先,平衡树的主要目的是解决二叉搜索树(BST)在...

    红黑树及AVL树常见平衡树实现

    红黑树和AVL树是两种常见的自平衡二叉查找树,它们在计算机科学和数据结构领域中扮演着重要角色,特别是在高效的动态查找和排序操作中。这两种数据结构的主要目标是通过保持树的平衡,来确保查找、插入和删除操作的...

    史上最简单的平衡树——无旋Treap.pdf

    ### 最简平衡树——无旋Treap(fhq_treap)详解 #### 一、简介 无旋Treap(fhq_treap),由范浩强发明,是一种高效的平衡树数据结构。它综合了Treap与Splay树的优点,支持常见的平衡树操作如插入、删除、查找等,...

    fruit --treep平衡树

    fruit --treep平衡树 Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Treap纪录一个额外的数据,就是优先级。Treap在以关键码构成二叉搜索树的...

    平衡数源代码平衡树(插入,删除)平衡树(插入,删除)平衡树(插入,删除)平衡树(插入,删除)

    根据给定的信息,本文将详细解释平衡二叉搜索树(Balanced Binary Search Tree,简称BBST)中的关键概念,特别是其插入与删除操作,并通过分析给出的代码片段来阐述具体的实现细节。 ### 平衡二叉搜索树简介 平衡...

    SBT模板(平衡树)

    本模板为 BZOJ3224:文艺平衡树 的源程序 含各种操作,旋转,插入,删除,求前驱,后继,查询值为x的数的排名,查询排名为k的数,求最大值,最小值……

    哈工大数据结构与算法实验四平衡树

    本主题聚焦于“哈工大数据结构与算法实验四——平衡树”,这是一项旨在深入理解并实践平衡树数据结构的教学任务。哈尔滨工业大学,作为中国顶尖的工科大学之一,其计算机学院的课程设置严谨且具有挑战性,而这个实验...

Global site tag (gtag.js) - Google Analytics