动态内存Treap
注意root的v要给一个很奇怪的数,null的s是0。
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <cstring>
- #include <cmath>
- #include <ctime>
- #include <queue>
- using namespace std;
- const int maxn = + ;
- struct Node{
- int v, r, s;
- Node* ch[];
- void maintain(){
- s = ch[] -> s + ch[] -> s + ;
- return ;
- }
- }*null = new Node(), *root, nodes[maxn];
- queue<Node*> RAM;
- int tot = , m;
- void init(Node* &o, int v){
- o -> ch[] = o -> ch[] = null;
- o -> s = ;
- o -> r = rand();
- o -> v = v;
- return ;
- }
- Node* node(){
- Node* o;
- if(!RAM.empty()) o = RAM.front(), RAM.pop();
- else o = &nodes[tot ++];
- return o;
- }
- void del(Node* &o){
- RAM.push(o);
- o = null;
- return ;
- }
- void rotate(Node* &o, int d){
- Node* k = o -> ch[d ^ ]; o -> ch[d ^ ] = k -> ch[d]; k -> ch[d] = o;
- o -> maintain(); k -> maintain(); o = k; return ;
- }
- void insert(Node* &o, int v){
- if(o == null){
- o = node();
- init(o, v);
- }
- else{
- int d = v > o -> v;
- insert(o -> ch[d], v);
- if(o -> ch[d] -> r > o -> r) rotate(o, d ^ ); //!
- else o -> maintain();
- }
- return ;
- }
- void remove(Node* &o, int v){
- if(o == null) return ;
- if(o -> v == v){
- if(o -> ch[] != null && o -> ch[] != null){
- int d = o -> ch[] -> r > o -> ch[] -> r;
- rotate(o, d); remove(o -> ch[d], v);
- }
- else{
- Node* k = o;
- if(o -> ch[] != null) o = o -> ch[];
- else o = o -> ch[];
- del(k);
- }
- }
- else remove(o -> ch[v > o -> v], v);
- if(o != null) o -> maintain();
- return ;
- }
- bool find(Node* &o, int v){
- if(o == null) return false;
- if(v == o -> v) return true;
- return find(o -> ch[v > o -> v], v);
- }
- void print(Node* &o){
- if(o == null) return ;
- print(o -> ch[]);
- printf("%d ", o -> v);
- print(o -> ch[]);
- return ;
- }
- void read(int &x){
- x = ; int sig = ; char ch = getchar();
- while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
- while(isdigit(ch)) x = * x + ch - '', ch = getchar();
- x *= sig; return ;
- }
- void init(){
- srand(time());
- null -> s = ;
- root = node();
- init(root, -);
- return ;
- }
- void work(){
- return ;
- }
- void print(){
- return ;
- }
- int main(){
- init();
- work();
- print();
- return ;
- }
动态内存Treap的更多相关文章
- 【转】Linux C动态内存泄漏追踪方法
原文:http://www.cnblogs.com/san-fu-su/p/5737984.html C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借 ...
- C++指针和动态内存分配
指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...
- SQLite剖析之动态内存分配
SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性 SQLite内核和它的内存分配子系统提供以下特性 ...
- C和指针 第十一章 动态内存分配
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...
- 解决Ubuntu Server 12.04 在Hyper-v 2012 R2中不能使用动态内存的问题
前言 全新Hyper-v 2012 R2终于开始支持在Linux的VPS中使用动态内存,可以大大优化服务器的资源分配,小弟我兴奋不已,于是抽空时间赶紧升级到 2012 R2,好好整理一番内存分配,不过 ...
- 动态内存分配导致Javascript性能的问题
内存分配对性能的影响是很大的,分配内存本身需要时间,垃圾回收器回收内存也需要时间,所以应该尽量避免在堆里分配内存.不过直到最近优化HoLa cantk时,我才深刻的体会到内存分配对性能的影响,其中有一 ...
- C++动态内存管理之shared_ptr、unique_ptr
C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
- C++动态内存分配
C++动态内存分配1.堆内存分配 :C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念:通常定 ...
随机推荐
- 从客户端(content="<span class="Apple-s...")中检测到有潜在危险的 Request.Form 值。
从客户端(content="<span class="Apple-s...")中检测到有潜在危险的 Request.Form 值. 说明: 请求验证过程检测到有潜在 ...
- [CSS3] CSS :target Selector
The :target selector allows us to interact with a fragment identifier, or hash, in our URL from CSS. ...
- 基于redis 内存数据库简单使用
在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个 ...
- python摇骰子猜大小的小游戏
#小游戏,摇筛子押大小的小游戏玩家初始有1000块钱,可以压大压小作为赌注 import random #定义摇筛子的函数: def roll_dice(number = 3,points = Non ...
- 图解MonoForAndroid开发环境搭建
电脑系统:windows 8.1 企业版 预装VS:2010旗舰版+2013 with update2旗舰版 ==================================== 1.1 安装ja ...
- 【转】 iOS学习之sqlite的创建数据库,表,插入查看数据
原文: http://blog.csdn.net/totogo2010/article/details/7702207 iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsql ...
- Hibernate 性能优化之抓取策略
fetch 抓取策略 前提条件:必须是一个对象操作其关联对象. 1. 根据一的一方加载多的一方,在一的一方集合中,有三个值:join/select/subselect 2.根据多的一方加载一的一方, ...
- Hive学习之七《 Sqoop import 从关系数据库抽取到HDFS》
一.什么是sqoop Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL ...
- C++中public、protected、private
C++中public.protected.private 第一:private, public, protected 访问标号的访问范围. private:只能由 1.该类中的函数. 2.其友元函数 ...
- Android学习----ADB
adb是什么?:adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.a ...