当前位置: 首页 > news >正文

Treap实现的名次树

1.感觉之前邵叔叔教的做fib的那个支持删除(其实删除只是打标记,而且不支持插入。。。)和查询的排序二叉树就是个静态的名次树嘛。我居然学到了这么奇怪的数据结构。。。

2.写的时候坑了几次

    (1)不要乱用引用,getKth里那个参数o没过脑子用了引用,结果把树搞烂了,一堆ch[x]赋值成NULL了。

    (2)写查找的时候lchsize<k一开始把不等号写反了。。。泪目

    (3)重载小于号玩脱了。坑了好久。用小于号以前没对指针解除引用。那个if总是进去,每次都左旋,然后基本搞成一条链。果然我语言没学好吗。

POJ1442http://poj.org/problem?id=1442

Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
struct Node
    {
        Node *ch[2];
        int r,v,s;
        Node(int v):v(v)
            {s=1;ch[0]=ch[1]=NULL;r=rand();}
        int cmp(int x) const{
            if(x==v)return(-1);
            return (x<v)?(0):(1);
        }
        void maintain(){
            s=1;
            if(ch[0]!=NULL)s+=ch[0]->s;
            if(ch[1]!=NULL)s+=ch[1]->s;
        }
    };
void rotate(Node* &o,int d)
    {
        Node* k=o->ch[d^1];
        o->ch[d^1]=k->ch[d];
        k->ch[d]=o;
        o->maintain();
        k->maintain();
        o=k;
    }
void insert(Node* &o,int x)
    {
        if(o==NULL) o=new Node(x);
        else {
            int d=(x<o->v)?0:1;
            insert(o->ch[d],x);
            if((o->r)<(o->ch[d]->r))
                rotate(o,d^1);
        }
        o->maintain();
    }
void remove(Node* &o,int x)
    {
        int d=o->cmp(x);
        if(d==-1){
            Node* u=o;
            if(o->ch[0]==NULL){o=o->ch[1];delete u;}else 
            if(o->ch[1]==NULL){o=o->ch[0];delete u;}else { 
                int c=(o->ch[0])>(o->ch[1])?(1):(0);
                rotate(o,c);
                remove(o->ch[c],x);
            }
        }
        else remove(o->ch[d],x);
        if(o!=NULL) o->maintain();
    }
int find(Node* &o,int x)
    {
        while(o!=NULL){
            int d=o->cmp(x);
            if(d==-1) 
                return 1;
            else 
                o=o->ch[d];
        }
        return 0;
    }
int getKth(Node* o,int k)
    {
        while(o!=NULL){
            int lchsize=(o->ch[0]!=NULL)?
                        (o->ch[0]->s):0;
            if(lchsize+1==k)
                return o->v;
            else {
                int d=(lchsize<k);
                o=o->ch[d];
                k-=d*(lchsize+1);
            }
        }
        return 0;
    }
void print(Node* o,int h)
    {
        if(o->ch[0]!=NULL){
            printf("( ");
            print(o->ch[0],h+1);
            printf(" )");
        }
        printf("{%d}[%d]",o->v,h);
        if(o->ch[1]!=NULL){
            printf("( ");
            print(o->ch[1],h+1);
            printf(" )");
        }
    }
const int M=30000;
int m,n,p=0,ans,A[M+1],u;
Node* root=NULL;
int main()
{
    srand(time(0));
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        scanf("%d",A+i);
    for(int i=0;i<n;i++){
        scanf("%d",&u);
        while(p<u)
            insert(root,A[p++]);
        ans=getKth(root,i+1);
        printf("%d\n",ans);
    }
    return 0;
}
void clear(Node* &o)
    {
        if(o->ch[0]!=NULL)  clear(o->ch[0]);
        if(o->ch[1]!=NULL)  clear(o->ch[1]);
        delete o;
        o=NULL;
    }

 

转载于:https://www.cnblogs.com/lijianlin1995/p/3454681.html

相关文章:

  • 最短路径SPFA算法(邻接表存法)
  • python 读取文件基本格式
  • Spring注入静态变量
  • Hadoop的hdfs api操作
  • 反射获取枚举的属性注释
  • 各种卷积结构原理及优劣总结
  • linux 程序管理
  • mysql 索引使用教程
  • C#操作MongoDB
  • 分页器(自定制)
  • [转]Linux下防止进程使用swap及防止OOM机制导致进程被kill掉
  • springMVC集成activiti-explorer5.22(一)
  • freebsd为网卡设置别名
  • KVM命令集管理虚拟机
  • ORA-38301:can not perform DDL/DML Over Object in Recycle Bin 11.2.0.4
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • CSS中外联样式表代表的含义
  • ECS应用管理最佳实践
  • github从入门到放弃(1)
  • Less 日常用法
  • PAT A1092
  • SQLServer之创建显式事务
  • vue:响应原理
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从setTimeout-setInterval看JS线程
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 番外篇1:在Windows环境下安装JDK
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 算法-插入排序
  • 微服务框架lagom
  • 一道闭包题引发的思考
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​Java并发新构件之Exchanger
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #pragam once 和 #ifndef 预编译头
  • #QT(串口助手-界面)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $refs 、$nextTic、动态组件、name的使用
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (南京观海微电子)——I3C协议介绍
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)基于IDEA的JAVA基础12
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Unity3DUnity3D在android下调试
  • (转)视频码率,帧率和分辨率的联系与区别
  • ****Linux下Mysql的安装和配置
  • .gitignore
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net mvc 获取url中controller和action
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池