指针FHQTreap
不太友好的代码
题面依旧是普通平衡树
//Writer : Hsz %WJMZBMR%tourist%hzwer
#include <bits/stdc++.h>
#define LL long long
#define M(a,b) memset(a,b,sizeof a)
using namespace std;
const int inf=0x3fffffff,N=400005;
struct Node{
Node *ch[2];int val,prio,siz;
Node(){}
Node(int w,Node *son){ch[0]=ch[1]=son,val=w,prio=rand(),siz=1;}
void update(){ siz=ch[0]->siz+ch[1]->siz+1;}
}nil,base[N];
typedef Node* node;
node null,len,Root;
void init(){
nil=Node(0,NULL);null=&nil;
null->ch[0]=null->ch[1]=null;
null->siz=0;len=base;Root=null;
}
node newnode(int v){*len=Node(v,null);return len++;}
node merge(node a,node b){
if(a==null) return b;
if(b==null) return a;
if(a->prio>b->prio) {a->ch[1]=merge(a->ch[1],b);a->update();return a;}
b->ch[0]=merge(a,b->ch[0]);b->update();return b;
}
void split(node x,int k,node &l,node &r){
if(x==null) {l=r=null;return ;}
if(x->val<=k){l=x;split(l->ch[1],k,l->ch[1],r);}
else r=x,split(r->ch[0],k,l,r->ch[0]);
x->update();
}
void insert(int k){
node l,r;
split(Root,k,l,r);
Root=merge(merge(l,newnode(k)),r);
}
void del(int k){
node l,mid,r;
split(Root,k-1,l,r);
split(r,k,mid,r);
Root=merge(l,merge(merge(mid->ch[0],mid->ch[1]),r));
}
int get_val(node x,int k){
if(k<=x->ch[0]->siz) return get_val(x->ch[0],k);
else if(k>x->ch[0]->siz+1) return get_val(x->ch[1],k-x->ch[0]->siz-1);
return x->val;
}
int get_rnk(node x,int d){
while(x->ch[d]!=null) x=x->ch[d];
return x->val;
}
inline int read(){
int tot=0,f=1;char ch=getchar();
while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=getchar();}
while ('0'<=ch&&ch<='9') tot=tot*10+ch-48,ch=getchar();
return tot*f;
}
int T,opt,x;
int main() {
srand(568877201);
init();
T=read();
for(int i=1;i<=T;i++){
opt=read();
switch(opt){
case 1:insert(read());break;
case 2:del(read());break;
case 3:x=read();node l,r;split(Root,x-1,l,r);printf("%d\n",l->siz+1);Root=merge(l,r);break;
case 4:printf("%d\n",get_val(Root,read()));break;
case 5:x=read();node l1,r1;split(Root,x-1,l1,r1);printf("%d\n",get_rnk(l1,1));Root=merge(l1,r1);break;
case 6 :x=read();node l2,r2;split(Root,x,l2,r2);printf("%d\n",get_rnk(r2,0));Root=merge(l2,r2);break;
}
}
return 0;
}
指针FHQTreap的更多相关文章
- 可持久化fhq-treap学习笔记
目录 可持久化fhq-treap----- 支持查询历史版本的非旋treap 先看看为啥他可以可持久化 过程 别的 注意&&出错&&吐槽 模板->luoguP38 ...
- bzoj1251: 序列终结者 fhqtreap写法
fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...
- bzoj1503: [NOI2004]郁闷的出纳员 fhqtreap版
这道题写法和之前差不多 但是fhqtreap在加点的时候为了同时维护大根堆以及二叉排序树的性质所以插入时也要注意分裂 fhqteap需要判断指针是否为空 不然就会re 这个我调了很久 #include ...
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- c 数组与指针的使用注意事项
数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
随机推荐
- 优化系列 | DELETE子查询改写优化
0.导读 有个采用子查询的DELETE执行得非常慢,改写成SELECT后执行却很快,最后把这个子查询DELETE改写成JOIN优化过程 1.问题描述 朋友遇到一个怪事,一个用子查询的DELETE,执行 ...
- vim编辑强制执行命令
vim进入文件,输入i编辑好文件,按esc,输入冒号,再输入底下代码 :w !sudo tee %
- ZOJ2724_Windows Message Queue(STL/优先队列)
解题报告 题意: 看输入输出就非常明确. 思路: 优先队列. #include <algorithm> #include <iostream> #include <cst ...
- ubuntu清华源【转】
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 可以选择ubuntu的版本更新源.
- 最全三大框架整合(使用映射)——applicationContext.xml里面的配置
applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> <beans x ...
- redis 学习笔记-cluster集群搭建
一.下载最新版redis 编译 目前最新版是3.0.7,下载地址:http://www.redis.io/download 编译很简单,一个make命令即可,不清楚的同学,可参考我之前的笔记: red ...
- java语言的运行机制
计算机高级编程语言按其程序的执行方式可分为编译型语言和解释型语言. 编译型语言是指使用专门的编译器,针对特定的操作系统将源程序代码一次性翻译成计算机能识别的机器指令.例如C.C++等都属于编译型语言. ...
- Hadoop MapReduce编程 API入门系列之挖掘气象数据版本2(十)
下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 这篇博文,包括了,实际生产开发非常重要的,单元测试和调试代码.这里不多赘述,直接送上代码. MRUni ...
- guice基本使用,三种注入方式(二)
guice提供了强大的注入方式. 1.属性注入 2.构造器注入 3.set方式注入 1.属性注入: package com.ming.user.test; import com.google.inje ...
- 批量插入 SqlBulkCopy的测试
关于SqlBulkCopy的测试 最近要做.net关于sql大量插入,找到了sqlbulkcopy(自己google下,应该很多说明了)这个好东西,于是测试下性能,用了三个方法对比: 1)直接用ado ...