ACdream 1063 平衡树

写的很丑的字典树。听王大神的话  需要改进。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

struct nn
{
    int zero;
    int one;

}node[320005];

int findd[35];

int main()
{
    int sb;
    scanf("%d", &sb);
    while (sb--)
    {
        int n, i, j, ii, t, tot;
        scanf("%d", &n);
        char s[10]; int ff;

        for (i = 0; i<320002; i++)
        {
            node[i].zero = -1;
            node[i].one = -1;
        }

        int jiedian = 1;
        for (i = 0; i<n; i++)
        {
            scanf("%s", s);
            if (strcmp("insert", s) == 0)
            {
                tot = 0;
                scanf("%d", &t);
                while (t)
                {
                    findd[tot] = t % 2;
                    t = t / 2;
                    tot++;
                }
                while (1)
                {
                    if (tot == 31) break;
                    findd[tot] = 0;
                    tot++;
                }
                int bianli = 0;
                for (ii = 30; ii >= 0; ii--)
                {
                    if (findd[ii] == 0)
                    {
                        if (node[bianli].zero == -1)
                        {
                            node[bianli].zero = jiedian;
                            jiedian++;
                        }
                        bianli = node[bianli].zero;
                    }
                    else if (findd[ii] == 1)
                    {
                        if (node[bianli].one == -1)
                        {
                            node[bianli].one = jiedian;
                            jiedian++;
                        }
                        bianli = node[bianli].one;
                    }
                }
            }
            else if (strcmp("qmin", s) == 0)
            {
                scanf("%d", &t);
                tot = 0;
                while (t)
                {
                    findd[tot] = t % 2;
                    t = t / 2;
                    tot++;
                }
                while (1)
                {
                    if (tot == 31) break;
                    findd[tot] = 0;
                    tot++;
                }
                int bianli = 0;
                int anss = 0;
                for (ii = 30; ii >= 0; ii--)
                {
                    if (findd[ii] == 1)
                    {
                        if (node[bianli].one != -1)
                        {
                            anss = anss + 0;
                            bianli = node[bianli].one;
                        }
                        else if (node[bianli].zero != -1)
                        {
                            anss = anss + (1 << ii);
                            bianli = node[bianli].zero;
                        }
                    }
                    else if (findd[ii] == 0)
                    {
                        if (node[bianli].zero != -1)
                        {
                            anss = anss + 0;
                            bianli = node[bianli].zero;
                        }
                        else if (node[bianli].one != -1)
                        {
                            anss = anss + (1 << ii);
                            bianli = node[bianli].one;
                        }
                    }
                }
                printf("%d\n", anss);
            }
            else if (strcmp("qmax", s) == 0)
            {
                scanf("%d", &t);
                tot = 0;
                while (t)
                {
                    findd[tot] = t % 2;
                    t = t / 2;
                    tot++;
                }
                while (1)
                {
                    if (tot == 31) break;
                    findd[tot] = 0;
                    tot++;
                }
                int bianli = 0;
                int anss = 0;
                for (ii = 30; ii >= 0; ii--)
                {
                    if (findd[ii] == 1)
                    {
                        if (node[bianli].zero != -1)
                        {
                            anss = anss + (1 << ii);
                            bianli = node[bianli].zero;
                        }
                        else if (node[bianli].one != -1)
                        {
                            anss = anss + 0;
                            bianli = node[bianli].one;
                        }
                    }
                    else if (findd[ii] == 0)
                    {
                        if (node[bianli].one != -1)
                        {
                            anss = anss + (1 << ii);
                            bianli = node[bianli].one;
                        }
                        else if (node[bianli].zero != -1)
                        {
                            anss = anss + 0;
                            bianli = node[bianli].zero;
                        }
                    }
                }
                printf("%d\n", anss);
            }
        }
    }
    return 0;
}
时间: 2024-10-28 20:04:59

ACdream 1063 平衡树的相关文章

Acdream 1738 世风日下的哗啦啦族I 树套树

世风日下的哗啦啦族I Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acdream.info/problem?pid=1738 Description "世风日下啊,女生不穿裙子的太少了" "这不是社会的进步吗(逃" "哎,是否可以建立一种结构统计一下各学院各专业各班级女生穿裙子的数量以及裙子的长度" "然后查询区间裙子最短值?" "并输出这个区间 穿这个裙

bzoj3224 Tyvj 1728 普通平衡树

Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最大的数) 6. 求x的后继(后继定义为大于x,且最小的数) Input 第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6) Output 对于操作3,4,

bzoj 3224: Tyvj 1728 普通平衡树.

3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 15114  Solved: 6570[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为

数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline __attri\ bute__( ( optimize( "-O2" ) ) ) Inline void read (int &now) { now = 0; register char word = getchar (); bool temp = false; while (wor

对于各种各样平衡树的比较

近来闲来无事...难题不会做,简单题不想做... 又不能颓废,于是就去学各种各样的平衡树 故在此对各种平衡树做一些比较(不太常见的, Treap这样烂大街的就不比了) 二次联通门 : 数组splay ------ luogu P3369 [模板]普通平衡树(Treap/SBT) 二次联通门 : 替罪羊树 ------ luogu P3369 [模板]普通平衡树(Treap/SBT) 二次联通门 : 红黑树 ------ luogu P3369 [模板]普通平衡树(Treap/SBT) 评测地址为

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉

【bzoj3224】Tyvj 1728 普通平衡树 平衡树的三种姿势 :splay,Treap,ScapeGoat_Tree

直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数堆 但不支持区间操作. 非旋转 基于随机数堆和拆分合并操作 常数较大 Spaly 完全基于旋转 各种操作 ScapeGoat_Tree 基于a权值平衡树和压扁重构 无旋转 但不支持区间操作 PS:非旋转可以实现平衡树的可持久化,从而来套一些东西 splay #include<cstdio> #de

Tyvj 1729 文艺平衡树

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4604  Solved: 2691[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作

平衡树

首先,我们回顾一下二叉查找树(binary search tree, BST). 二叉查找树具有下列性质: 若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若右子树不空,则右子树上所有结点的值均大于它的根结点的值: 左.右子树也分别为二叉查找树: BST 的插入 首先执行查找算法,找出被插结点的父亲结点. 若 key 值比当前结点小,则进入左儿子. 若 key 值比当前结点大,则进入右儿子. //在二叉查找树中插入查找关键字key void InsertBST(t,key) { if