不太友好的代码

题面依旧是普通平衡树

//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的更多相关文章

  1. 可持久化fhq-treap学习笔记

    目录 可持久化fhq-treap----- 支持查询历史版本的非旋treap 先看看为啥他可以可持久化 过程 别的 注意&&出错&&吐槽 模板->luoguP38 ...

  2. bzoj1251: 序列终结者 fhqtreap写法

    fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...

  3. bzoj1503: [NOI2004]郁闷的出纳员 fhqtreap版

    这道题写法和之前差不多 但是fhqtreap在加点的时候为了同时维护大根堆以及二叉排序树的性质所以插入时也要注意分裂 fhqteap需要判断指针是否为空 不然就会re 这个我调了很久 #include ...

  4. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  5. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  6. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  7. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  8. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  9. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

随机推荐

  1. [bzoj2631]tree_LCT

    tree bzoj-2631 题目大意:给定一个n个点的树,每个点的初始权值为1,支持:删边加边(这两个操作同时进行,保证操作之后还是一棵树),路径加,路径乘,查询路径和. 注释:$1\le n,q\ ...

  2. POJ1789&amp;ZOJ2158--Truck History【最小生成树变形】

    链接:http://poj.org/problem?id=1789 题意:卡车公司有悠久的历史,它的每一种卡车都有一个唯一的字符串来表示,长度为7,它的全部卡车(除了第一辆)都是由曾经的卡车派生出来的 ...

  3. 【cl】selenium实例一:打开百度,获取第四个标题

    /*创建类的时候是TestNG Class*/ package Selenium_lassen; import static org.junit.Assert.*; import java.util. ...

  4. 弗拉特利定律:Illumina怎样缔造基因革命

    蕾妮·瓦林特(Renee Valint)的女儿谢尔碧(Shelby)在2000年出生时.看起来虚弱无力,就如同一仅仅耷拉着的布娃娃.谢尔碧学着走路和说话,但学得很慢.错过了儿童发展的重要阶段.到4岁时 ...

  5. Android更新带进度条的通知栏

    在网上查询了下.Android版本号更新通知栏带进度条,醉了,基本都是复制过来.有的代码不全,连源代码下载都没有.有下载也须要积分,还不能用,真黑心啊!!之前自己也写过自己定义通知栏Notificat ...

  6. '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法

    如果在使用 vue 初始化项目的时候提示: vue : 无法将“vue”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 或者: ...

  7. java.lang.RuntimeException: Unable to get provider

    java.lang.RuntimeException: Unable to get provider  dev.dworks.apps.candidcamera.provider.MediaDocum ...

  8. 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告

    题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...

  9. shp系列(六)——利用C++进行Dbf文件的写(创建)

    上一篇介绍了shp文件的创建,接下来介绍dbf的创建. 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 1.Dbf头文件的创建 Dbf头文件的结构 ...

  10. Class工具类

    Class工具类,提供操作class类的方法,源码如下: import java.io.File; import java.io.FileFilter; import java.io.IOExcept ...