然而就是将指针的地方换成int引用

就是存个代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
struct node
{
int val;
int yuk;
int siz;
int key;
int ch[2];
};
node t[501000];
int tail;
int cmp(int now,int val)
{
if(t[now].val==val) return -1;
return t[now].val > val ? 0 : 1 ;
}
void sum(int &now)
{
t[now].siz=t[t[now].ch[0]].siz+t[t[now].ch[1]].siz+t[now].yuk;
return ;
}
void rotato(int &now,int base)
{
int k=t[now].ch[base^1];
t[now].ch[base^1]=t[k].ch[base];
t[k].ch[base]=now;
sum(now); sum(k);
now=k;
}
int New(int val)
{
++tail;
t[tail].ch[0]=t[tail].ch[1]=0;
t[tail].siz=1;t[tail].yuk=1;
t[tail].val=val;
t[tail].key=rand();
return tail;
}
void init()
{
t[0].val=0;t[0].yuk=0;
t[0].key=-1;
t[0].ch[0]=t[0].ch[1]=0;
srand(time(NULL));
return ;
}
void insert(int &now,int val)
{
if(now==0){now=New(val);return ;}
int dir=cmp(now,val);
if(dir==-1){t[now].yuk+=1;t[now].siz+=1;return ;}
insert(t[now].ch[dir],val);
if(t[t[now].ch[dir]].key>t[now].key) rotato(now,dir^1);
sum(now);
}
void del(int &now,int val)
{
int dir=cmp(now,val);
if(dir==-1)
if(t[now].yuk>1){t[now].siz-=1,t[now].yuk-=1;return;}
else
{
if(t[now].ch[1]&&t[now].ch[0])
{
int nxt= t[t[now].ch[0]].key > t[t[now].ch[1]].key ? 0 : 1;
rotato(now,nxt^1);
del(t[now].ch[nxt^1],val);
sum(now);return ;
}
if(t[now].ch[1]){now=t[now].ch[1];sum(now);return ;}
else {now=t[now].ch[0];sum(now);return ;}
}
del(t[now].ch[dir],val);sum(now);
return;
}
int nxt(int now,int val)
{
if(!now) return 0x7fffffff;
if(t[now].val>val)
return min(t[now].val,nxt(t[now].ch[0],val));
else
return nxt(t[now].ch[1],val);
}
int pre(int now,int val)
{
if(!now) return -0x7fffffff;
if(t[now].val<val)
return max(t[now].val,pre(t[now].ch[1],val));
else
return pre(t[now].ch[0],val);
}
int find(int &now,int val)
{
int dir=cmp(now,val);
if(dir==-1) return t[t[now].ch[0]].siz+1;
return find(t[now].ch[dir],val) + ( dir ? t[t[now].ch[0]].siz + t[now].yuk : 0);
}
int kth(int &now,int k)
{
if(t[t[now].ch[0]].siz<k&&t[t[now].ch[0]].siz+t[now].yuk>=k)
return t[now].val;
if(k<=t[t[now].ch[0]].siz)
return kth(t[now].ch[0],k);
else
return kth(t[now].ch[1],k-t[t[now].ch[0]].siz-t[now].yuk);
}
int root;
void visit(int now)
{
if(!now)
return ;
visit(t[now].ch[0]);
printf("%d ",t[now].val);
visit(t[now].ch[1]);
return ;
}
int main()
{
int n;
scanf("%d",&n);
int a,b;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
switch(a)
{
case 1:insert(root,b);break;
case 2:del(root,b);break;
case 3:printf("%d\n",find(root,b));break;
case 4:printf("%d\n",kth(root,b));break;
case 5:insert(root,b);printf("%d\n",pre(root,b));del(root,b);break;
case 6:insert(root,b);printf("%d\n",nxt(root,b));del(root,b);break;
}
//visit(root);printf("\n");
}
}

treap数组版的更多相关文章

  1. HDU 4287 Intelligent IME(字典树数组版)

    Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. treap完全版模板

    这是我综合poj1442 3481 2352的treap操作 得到treap完全版模板.(经测AC) 结构体Tree { int key; //键值 int size; //该子树总节点个数 int ...

  3. hdu 1277 AC自动机入门(指针版和数组版)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277 推荐一篇博客(看思路就可以,实现用的是java): https://www.cnblogs.co ...

  4. Codeforces Gym101502 I.Move Between Numbers-最短路(Dijkstra优先队列版和数组版)

    I. Move Between Numbers   time limit per test 2.0 s memory limit per test 256 MB input standard inpu ...

  5. 字典树模板( 指针版 && 数组版 )

    模板 :  #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream ...

  6. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

  7. 非旋treap (fhq treap) 指针版

    传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...

  8. 《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数组版)

    因为现在只学习了基本语法,所以在综合练习之前,先补充关于方法概念. 方法的作用:把一系列的代码放在一起,然后再取个别名.之后通过这个别名的调用,就相当于执行了这一系列的代码. 方法的语法:([]中的内 ...

  9. Java课程课后作业190315之最大连续子数组(二维数组版)

    ,, 在本周的课堂上,老师再一次提高了要求,将一维数组升级成为了二维数组,然后求出块状的连续子数组. 一开始还想着借鉴之前球一维数组的O(n)的算法,后来还是没有找到头绪,舍友讲了自己的办法,但是没有 ...

随机推荐

  1. 移动测试之appium+python 入门代码(二)

    ps: 对于环境安装可能会碰到各种问题,还是要一一解决. 执行: appium-doctor 显示上边界面说明,环境已完成. 同时将手机连接主机(用数据线) ^_^ 执行 adb devices 显示 ...

  2. .NET接收邮件下载邮件附件——openpop.net

    使用OpenPop.Net接收邮件很方便,下面是接收下载邮件附件的代码 OpenPop.Net下载地址 https://sourceforge.net/projects/hpop/ public cl ...

  3. 3d Max 2012安装失败怎样卸载3dsmax?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  4. DEDECMS v5.7 完美实现导航条下拉二级菜单

    一.引言 好多人都问,织梦的下拉导航怎么做呢?其实很简单!即使你对代码一点也不熟悉,没关系! 按照我的步骤走!记住一步也不能错哦! 二.实现过程 1.首先: 将下面这段代码贴到templets\def ...

  5. Docker学习笔记(1)-简介

    1. 简介 Docker使用Google公司推出的Go语言开发实现,基于Linux内核的cgroup, namespace以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚 ...

  6. 【安全测试】sql注入

    SQL注入攻击是黑客对 数据库 进行攻击的常用手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多,但是由于程序员水平及经验页参差不齐,相当大部分程序员在编写代码的时候没有 ...

  7. 微信小程序 列表渲染 wx:for

    wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件. wx:for-item指定数组当前元素,或当前项的变量名wx:for-index 指定数组当前下标的变量名 <view ...

  8. Windows窗体应用开发3--配置标准控件1

    1.掌握主要的Windows窗体控件的功能 2.掌握使用SplitContainer控件的方法 3.掌握使用TreeView控件的方法 注:新建一个WindowsForm 命名为Form2.cs 主要 ...

  9. WinForm皮肤 支持.NET4.0 IrisSkin4多彩皮肤演示和下载

    IrisSkin4是一款.NET平台非常优秀的Winform皮肤,链接库文件仅544kb,使用方法也非常简单 IrisSkin4(IrisSkin4.dll + 73套皮肤)[下载地址] 使用方法: ...

  10. Fibonacci(斐波那契数列)的第N位数

    无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为F(n)=1 ...........(n=1或n=2)F(n)=F(n-1)+F(n-2).. ...