传送门

## Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
class fhq
{
#define MN 100005
private:
int sz;
int val[MN],pri[MN],ls[MN],rs[MN],siz[MN],cnt;
inline unsigned int random()
{
static unsigned int x=23333;
return x^=x<<13,x^=x>>17,x^=x<<5;
}
inline void combine(int x){siz[x]=1+siz[ls[x]]+siz[rs[x]];}
public:
int rt;
int Merge(int rt1,int rt2)
{
if(!rt1||!rt2) return rt2+rt1;
if(pri[rt1]<pri[rt2])
{
rs[rt1]=Merge(rs[rt1],rt2);
combine(rt1);return rt1;
}
else
{
ls[rt2]=Merge(rt1,ls[rt2]);
combine(rt2);return rt2;
}
}
void Split(int x,int k,int&rt1,int&rt2)
{
if(!x) return (void)(rt1=rt2=0);
if(k<=siz[ls[x]])
{
Split(ls[x],k,rt1,rt2);
ls[x]=rt2;combine(x);rt2=x;
}
else
{
Split(rs[x],k-siz[ls[x]]-1,rt1,rt2);
rs[x]=rt1;combine(x);rt1=x;
}
}
int Rank(int x,int v)
{
if(!x) return 0;
if(v<val[x]) return Rank(ls[x],v);
else return siz[ls[x]]+Rank(rs[x],v)+1;
}
int Kth(int k)
{
register int rt1,rt2,rt3,c;
Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,c);
rt=Merge(rt3,Merge(c,rt2));
return val[c];
}
void Insert(int v)
{
val[++sz]=v;pri[sz]=random(),siz[sz]=1;
register int rk=Rank(rt,v),rt1,rt2;
Split(rt,rk,rt1,rt2);
rt=Merge(Merge(rt1,sz),rt2);
}
void Delete(int v)
{
register int rk=Rank(rt,v),rt1,rt2,rt3,c;
Split(rt,rk,rt1,rt2);Split(rt1,rk-1,rt3,c);
rt=Merge(rt3,rt2);
}
}T;
int main(){
register int m=read(),opt,x;
while(m--)
{
opt=read(),x=read();
switch(opt)
{
case 1: T.Insert(x);break;
case 2: T.Delete(x);break;
case 3: printf("%d\n",T.Rank(T.rt,x-1)+1);break;
case 4: printf("%d\n",T.Kth(x));break;
case 5: printf("%d\n",T.Kth(T.Rank(T.rt,x-1)));break;
case 6: printf("%d\n",T.Kth(T.Rank(T.rt,x)+1));break;
}
}
return 0;
}

传送门

## Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
class fhq
{
#define MN 100005
private:
int sz;
int val[MN],pri[MN],ls[MN],rs[MN],siz[MN],rev[MN];
inline unsigned int random()
{
static unsigned int x=23333;
return x^=x<<13,x^=x>>17,x^=x<<5;
}
inline void up(int x){siz[x]=1+siz[ls[x]]+siz[rs[x]];}
inline void down(int x){if(rev[x]) std::swap(ls[x],rs[x]),rev[ls[x]]^=1,rev[rs[x]]^=1,rev[x]=0;}
public:
int rt;
int Merge(int rt1,int rt2)
{
if(!rt1||!rt2) return rt2+rt1;
down(rt1),down(rt2);
if(pri[rt1]<pri[rt2])
{
rs[rt1]=Merge(rs[rt1],rt2);
up(rt1);return rt1;
}
else
{
ls[rt2]=Merge(rt1,ls[rt2]);
up(rt2);return rt2;
}
}
void Split(int x,int k,int&rt1,int&rt2)
{
if(!x) return (void)(rt1=rt2=0);
down(x);
if(k<=siz[ls[x]])
{
Split(ls[x],k,rt1,rt2);
ls[x]=rt2;up(x);rt2=x;
}
else
{
Split(rs[x],k-siz[ls[x]]-1,rt1,rt2);
rs[x]=rt1;up(x);rt1=x;
}
}
int Rank(int x,int v)
{
if(!x) return 0;
if(v<val[x]) return Rank(ls[x],v);
else return siz[ls[x]]+Rank(rs[x],v)+1;
}
void Insert(int v)
{
val[++sz]=v;pri[sz]=random(),siz[sz]=1;
register int rk=Rank(rt,v),rt1,rt2;
Split(rt,rk,rt1,rt2);
rt=Merge(Merge(rt1,sz),rt2);
}
void Print(int x)
{
if(!x) return;down(x);
Print(ls[x]);printf("%d ",val[x]);Print(rs[x]);
}
void Reverse(int l,int r)
{
register int rt1,rt2,rt3,rt4;
Split(rt,l-1,rt1,rt2);Split(rt2,r-l+1,rt3,rt4);
rev[rt3]^=1;rt=Merge(rt1,Merge(rt3,rt4));
}
#undef MN
}T;
int main(){
register int n,m,i;
n=read(),m=read();
for(i=1;i<=n;++i) T.Insert(i);
while(m--) i=read(),T.Reverse(i,read());
T.Print(T.rt);puts("");
return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

无旋Treap模板的更多相关文章

  1. 无旋treap的简单思想以及模板

    因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...

  2. 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap

    有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...

  3. 模板 - 无旋Treap

    一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...

  4. 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap

    https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...

  5. 浅谈无旋treap(fhq_treap)

    一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...

  6. [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec  Mem ...

  7. [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...

  8. [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...

  9. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

随机推荐

  1. 嵌入式处理器通过UART实现scanf和printf

    #include <stdint.h> #include <stdarg.h> extern int vsscanf(const char *, const char *, v ...

  2. layui.js---layer;;前端预览pdf

    layui.js---layer;;前端预览pdf 1.必须引入layui.js 2.uul是pdf文件地址 3.触发function函数:小于号button onclick="pdfsee ...

  3. springboot2.1.3使用jdbcTemplate

    这里只是备忘一下使用方式,至于配置数据源信息不在此文中讲解,忘谅解. 1.  查询返回List<Long>数据集 (这里比如返回userId,long型) @Autowired@Quali ...

  4. 爬虫之cookie与代理

    一, 基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达 ...

  5. mysql_safe和mysql_multi

    1 mysql_safe 原理 mysqld_safe其实为一个shell脚本(封装mysqld),启动时需要调用server和database(即/bin和/data目录),因此需要满足下述条件之一 ...

  6. SpringCloud_Eureka与Zookeeper对比

    关系型数据库与非关系型数据库及其特性: RDBMS(Relational Database Management System 关系型数据库) :mysql/oracle/sqlServer等   = ...

  7. 复习整理(一)——HDFS

    1.问题 分布式文件系统那么多,为什么hadoop项目中还要开发一个分布式文件系统呢? 2.存储模型 文件线性字节切割成块(Block),具有offset,id 文件与文件的block大小可以不一样 ...

  8. 烂笔头@WP 的博文仅供自己学习的备忘录

    前记:本博主的博文仅供自己学习的备忘录. 说明:很久未用博客,登录密码已忘记,费劲找回来,特写本博文申明.因为,今天邮件收到一条博文的评论,有谩骂本博主之意,甚觉委屈.所以,写以下文字说明“1.我的博 ...

  9. 洛谷 P1280 尼克的任务题解

    题目链接:https://www.luogu.org/problem/P1280 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每 ...

  10. MPU-6050

    MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间.当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动 ...