其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下.

洛谷 P3369 【模板】普通平衡树

code:

#include <bits/stdc++.h>
#define N 100006
#define lson t[x].ls
#define rson t[x].rs
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int root;
namespace treap
{
int tot;
struct node
{
int val,size,ls,rs,ran;
}t[N];
inline void newnode(int &x,int val)
{
++tot;
t[tot].size=1;
t[tot].val=val;
t[tot].ran=rand();
t[tot].ls=t[tot].rs=0;
x=tot;
}
inline void pushup(int x)
{
t[x].size=t[lson].size+t[rson].size+1;
}
void split(int x,int &l,int &r,int val)
{
if(!x) { l=r=0; return; }
if(t[x].val<=val) l=x, split(t[x].rs,t[l].rs,r,val);
else r=x, split(t[x].ls,l,t[r].ls,val);
pushup(x);
}
void merge(int &x,int a,int b)
{
if(!a||!b) { x=a+b; return; }
if(t[a].ran<t[b].ran) x=a, merge(t[x].rs,t[a].rs,b);
else x=b, merge(t[x].ls,a,t[b].ls);
pushup(x);
}
void insert(int val)
{
int x=0,y=0,z=0;
newnode(z,val);
split(root,x,y,val-1);
merge(x,x,z);
merge(root,x,y);
}
void del(int val)
{
int x=0,y=0,z=0;
split(root,x,y,val);
split(x,x,z,val-1);
merge(z,t[z].ls,t[z].rs);
merge(x,x,z);
merge(root,x,y);
}
void ask_rank(int v)
{
int x=0,y=0;
split(root,x,y,v-1);
printf("%d\n",t[x].size+1);
merge(root,x,y);
}
void ask_num(int x,int kth)
{
while(t[lson].size+1!=kth)
{
if(t[lson].size>=kth) x=lson;
else kth-=(t[lson].size+1),x=rson;
}
printf("%d\n",t[x].val);
}
void ask_front(int v)
{
int x=0,y=0;
split(root,x,y,v-1);
ask_num(x,t[x].size);
merge(root,x,y);
}
void ask_back(int v)
{
int x=0,y=0;
split(root,x,y,v),ask_num(y,1), merge(root,x,y);
}
};
int main()
{
// setIO("input");
int i,j,n;
srand(16);
scanf("%d",&n);
for(i=1;i<=n;++i)
{
int opt,x;
scanf("%d%d",&opt,&x);
if(opt==1) treap::insert(x);
if(opt==2) treap::del(x);
if(opt==3) treap::ask_rank(x);
if(opt==4) treap::ask_num(root,x);
if(opt==5) treap::ask_front(x);
if(opt==6) treap::ask_back(x);
}
return 0;
}

洛谷P3391 【模板】文艺平衡树

code:

#include <bits/stdc++.h>
#define N 100006
#define lson t[x].ls
#define rson t[x].rs
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int tot,root;
struct node
{
int ls,rs,val,size,ran,rev;
}t[N];
inline void newnode(int &x,int val)
{
x=++tot;
t[x].ls=t[x].rs=0;
t[x].val=val;
t[x].size=1;
t[x].ran=rand();
t[x].rev=0;
}
inline void pushup(int x)
{
t[x].size=t[lson].size+t[rson].size+1;
}
void mark(int x)
{
swap(lson,rson), t[x].rev^=1;
}
inline void pushdown(int x)
{
if(t[x].rev)
{
if(lson) mark(lson);
if(rson) mark(rson);
t[x].rev=0;
}
}
void split(int x,int &l,int &r,int kth)
{
if(!x) { l=r=0; return; }
pushdown(x);
if(t[lson].size+1<=kth) l=x,split(rson,t[l].rs,r,kth-t[lson].size-1);
else r=x,split(lson,l,t[r].ls,kth);
pushup(x);
}
void merge(int &x,int a,int b)
{
if(!a||!b) { x=a+b; return; }
pushdown(a),pushdown(b);
if(t[a].ran<t[b].ran) x=a, merge(rson,t[a].rs,b);
else x=b, merge(lson,a,t[b].ls);
pushup(x);
}
void build(int &x,int l,int r)
{
int mid=(l+r)>>1;
newnode(x,mid);
if(mid>l) build(lson,l,mid-1);
if(r>mid) build(rson,mid+1,r);
pushup(x);
}
void dfs(int x)
{
pushdown(x);
if(lson) dfs(lson);
printf("%d ",t[x].val);
if(rson) dfs(rson);
}
int main()
{
// setIO("input");
int i,j,n,m;
scanf("%d%d",&n,&m);
build(root,1,n);
for(i=1;i<=m;++i)
{
int l,r;
scanf("%d%d",&l,&r);
int x=0,y=0,z=0;
split(root,x,y,r);
// x : 1->r y : r+1->n
split(x,x,z,l-1);
mark(z);
root=0;
merge(root,root,x);
merge(root,root,z);
merge(root,root,y);
}
dfs(root);
return 0;
}

  

非旋转 treap的更多相关文章

  1. [bzoj3173]最长上升子序列_非旋转Treap

    最长上升子序列 bzoj-3173 题目大意:有1-n,n个数,第i次操作是将i加入到原有序列中制定的位置,后查询当前序列中最长上升子序列长度. 注释:1<=n<=10,000,开始序列为 ...

  2. 关于非旋转treap的学习

    非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...

  3. [Codeforces702F]T-Shirts——非旋转treap+贪心

    题目链接: Codeforces702F 题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限.现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买 ...

  4. BZOJ5063旅游——非旋转treap

    题目描述 小奇成功打开了大科学家的电脑. 大科学家打算前往n处景点旅游,他用一个序列来维护它们之间的顺序.初 始时,序列为1,2,...,n. 接着,大科学家进行m次操作来打乱顺序.每次操作有6步: ...

  5. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  6. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  7. [NOIP]2017列队——旋转treap/非旋转treap

    Sylvia 是一个热爱学习的女孩子.  前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为m.  为了便 ...

  8. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

  9. BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...

  10. BZOJ1251序列终结者——非旋转treap

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

随机推荐

  1. Win10家庭版升级到企业版的方法

    一.家庭版升级企业版 1.右键单击[此电脑]——>属性 2.点击更改产品密钥 3.输入密钥:NPPR9-FWDCX-D2C8J-H872K-2YT43 4.点击下一步,验证结束后点击开始升级,然 ...

  2. in __init__ self._traceback = tf_stack.extract_stack()的一个原因

    这样就会出错,原因在于函数返回为三个变量,若直接向写入函数那样运用sess.run()得到,就会导致错误. sess=tf.Session() sess.run(tf.initialize_all_v ...

  3. 自学Python编程的第五天(希望有IT大牛帮我看最下面的代码)----------来自苦逼的转行人

    2019-09-15-15:40:24 今天没有学知识,是一个一周总结,把这一周学的知识总结一遍,然后把做过的练习题再做一遍 看是否还会有再出现同样的错误,而且还可以知道有哪些知识点没有掌握好,可以把 ...

  4. Python进阶(六)----装饰器

    Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ​ 增加一些额外的新功能 封闭原则: ​ 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ​ 也可称装饰器函数,诠释开放封闭原则 ...

  5. PHP实现curl post和get

    CURL这里就不说明了.以下是简单案例 一.POST //初始化 $curl = curl_init(); //设置抓取的url curl_setopt($curl, CURLOPT_URL, 'ht ...

  6. 拓展 - Webrtc 的回声抵消(aec、aecm)算法简介

    webrtc 的回声抵消(aec.aecm)算法简介 原文链接:丢失.不好意思        webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS( ...

  7. Java 之 NOSQL

    一.什么是 NOSQL NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库. 随着互联网web2.0网站的兴起,传统的关系数据 ...

  8. Linux Samba服务器的安装

    Samba最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享,也可以用于Linux与Linux之间的资源共享 安装 # yum install samba samba-cli ...

  9. 如何免费试用SAP的Fiori应用

    什么是SAP Fiori?SAP Fiori不是SAP发布的某款产品,而是SAP新一代UI设计风格和用户体验的代号. Fiori是一个意大利语中的单词,意思是"花": 不得不说SA ...

  10. nodejs puppeteer linux(centos)环境部署以及用puppeteer简单截图

    1.安装Node环境 如果有安装Node请忽略第1点 #下载cd /usr/local/srcwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-l ...