「模板」 FHQ_Treap 区间翻转

<题目链接>


没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快。

对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息)Split 成 \([1,l-1]\)、\([l,r]\)、\([r+1,n]\) 三部分,给中间部分的根节点打上标记,再一边下传标记一边 Merge 回来。

注意 Split 时,要按元素个数,不能按权值,因为元素个数可以通过维护节点信息的 size 域而直接得到,但随着区间的翻转,权值会乱套。

一定注意先推标记!!先推标记!!先推标记!!

就因为标记推晚了,我调了一天。

#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
using std::swap;
const int MAXN=100010;
int n,m;
class FHQ_Treap
{
public:
FHQ_Treap(void)
{
rt=cnt=0;
memset(a,0,sizeof a);
}
void Insert(int x)
{
s[++cnt]=node(x,Random(),1);
Merge(rt,rt,cnt);
}
void Reverse(int x,int y)
{
int l=0,r=0,t=0;
Split(rt,x-1,l,t),Split(t,y-x+1,t,r);
s[t].lazy^=1,Merge(l,l,t),Merge(rt,l,r);
}
void Print(void)
{
DFS(rt),putchar('\n');
}
private:
bool a[MAXN];
int rt,cnt;
struct node
{
int v,p,size,lazy,c[2];
node(int _v=0,int _p=0,int _size=0)
{
v=_v,p=_p,size=_size,lazy=0;
memset(c,0,sizeof c);
}
}s[MAXN];
int Random(void)
{
int x;
while(a[x=rand()%MAXN]);
a[x]=1;
return x;
}
void Update(int i)
{
s[i].size=s[s[i].c[0]].size+s[s[i].c[1]].size+1;
}
void PushDown(int i)
{
int &l=s[i].c[0],&r=s[i].c[1];
swap(l,r);
if(l)
s[l].lazy^=1;
if(r)
s[r].lazy^=1;
s[i].lazy=0;
}
void Split(int i,int x,int &l,int &r)
{
if(!i)
{
l=r=0;
return;
}
if(s[i].lazy)
PushDown(i);
int t=s[s[i].c[0]].size+1;
if(x<t)
Split(s[r=i].c[0],x,l,s[i].c[0]);
else
Split(s[l=i].c[1],x-t,s[i].c[1],r);
Update(i);
}
void Merge(int &i,int l,int r)
{
if(!l || !r)
{
i=l|r;
return;
}
if(s[l].p>s[r].p)
{
if(s[l].lazy)
PushDown(l);
Merge(s[i=l].c[1],s[l].c[1],r);
}
else
{
if(s[r].lazy)
PushDown(r);
Merge(s[i=r].c[0],l,s[r].c[0]);
}
Update(i);
}
void DFS(int i)
{
if(s[i].lazy)
PushDown(i);
if(s[i].c[0])
DFS(s[i].c[0]);
printf("%d ",s[i].v);
if(s[i].c[1])
DFS(s[i].c[1]);
}
}T;
int main(int argc,char *argv[])
{
srand((unsigned)time(NULL));
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)
T.Insert(i);
for(int i=1,l,r;i<=m;++i)
{
scanf("%d %d",&l,&r);
T.Reverse(l,r);
}
T.Print();
return 0;
}

谢谢阅读。

「模板」 FHQ_Treap 区间翻转的更多相关文章

  1. 「模板」 FHQ_Treap

    「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间 ...

  2. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  3. 「模板」 树链剖分 HLD

    「模板」 树链剖分 HLD 不懂OOP的OIer乱用OOP出人命了. 谨此纪念人生第一次类套类. 以及第一次OI相关代码打过200行. #include <algorithm> #incl ...

  4. 「模板」「讲解」Treap名次树

    Treap实现名次树 前言 学平衡树的过程可以说是相当艰难.浏览Blog的过程中看到大量指针版平衡树,不擅长指针操作的我已经接近崩溃.于是,我想着一定要写一篇非指针实现的Treap的Blog. 具体如 ...

  5. 「LuoguP2434」 [SDOI2005]区间(贪心

    Description 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照 ...

  6. LG3205/BZOJ1996 「HNOI2010」合唱队 区间DP

    区间DP 区间DP: 显然是一个区间向左右拓展形成的下一个区间,具有包含关系,所以可以使用区间DP. 状态设计: 考虑和关路灯一样设计状态 因为不知道当前这个区间是从哪个区间拓展而来,即不知道这个区间 ...

  7. 「模板」Splay

    代码说明 对于一些变量进行说明: 变量名 说明 rt 树根 ff[u] 点 \(u\) 的父节点,特别地, ff[rt]=0 ch[u][0|1] 点 \(u\) 的 左/右儿子 siz[u] 点 \ ...

  8. 「模板」AC自动机

    目录 说明 普通版本 询问更改版 拓扑优化版本 说明 这篇博客只挂模板,具体分析请膜拜大佬 hyfhaha 大佬. 普通版本 题目传送门 #include<cstdio> #include ...

  9. 「模板」可持久化 HFQ-Treap

    老师用的是静态数组的写法,开了很多数组- 其实个人更倾向于 struct 或者用 class 封装起来. 但是鉴于太难打 好吧,是我懒得打. 然后就借鉴了老师的模板,写出了属于自己的 压行 风格. 代 ...

随机推荐

  1. vue.js学习之 如何在手机上查看vue-cli构建的项目

    vue.js学习之 如何在手机上查看vue-cli构建的项目 一:找到config文件夹下的index.js文件,打开后,将host的值改为你本地的ip,保存后重启项目 二:输入ip和端口号打开项目 ...

  2. vue开发学习中遇到的问题以及解决方法

    1:node-sass 安装失败,可使用 cnpm 安装 npm install cnpm -g --registry=https://registry.npm.taobao.org cnpm -v ...

  3. 硬件电路中VCC,VDD,VEE,VSS有什么区别

    电路中GND和GROUND.VCC,VDD,VEE,VSS有什么区别 一.解释 DCpower一般是指带实际电压的源,其他的都是标号(在有些仿真软件中默认的把标号和源相连的)VDD:电源电压(单极器件 ...

  4. Python中package的导入语法

    在Python中,一个目录被称为一个package.import和from语法除了导入module文件之外,还可以导入package,语法如下: # import语法 import dir1.dir2 ...

  5. “Hello World!团队”Alpha发布—视频链接+文案+美工

    视频链接:http://v.youku.com/v_show/id_XMzEyNjc2MTAyOA==.html?sharefrom=iphone&sharekey=5378037f8b710 ...

  6. Thunder团队第六周 - Scrum会议1

    Scrum会议1 小组名称:Thunder 项目名称:i阅app Scrum Master:王航 工作照片: 参会成员: 王航(Master):http://www.cnblogs.com/wangh ...

  7. MyEclipse2013使用总结

    1.myeclipse10中怎样将建的包设置成树形结构或者并列结构. 右上边三角那里进去设置选第一个是显示完整的包名,第二个显示的是树形结构这种方法没效 2.从高版本到项目的低版本的MyEclipse ...

  8. Qt Creator子目录项目-类似VS解决方案

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt Creator子目录项目-类似VS解决方案     本文地址:http://techie ...

  9. 【重读MSDN之ADO.NET】ADO.NET连接

    连接到ADO.NET中的数据源 在 ADO.NET 中,通过在连接字符串中提供必要的身份验证信息,使用 Connection 对象连接到特定的数据源.使用的 Connection 对象取决于数据源的类 ...

  10. QObject类 moc处理后代码

    QObject在QT中是所有类的基类,经过MOC处理后代码如下 之所以贴出这段代码,是因为很多流程追踪到最后一些关键性函数都是出自这个类 源码 4.8.6 MOC版本 63 /************ ...