题意:

  给定一个序列,支持区间加,区间反转,区间max询问


裸的平衡树题,这里采用FHQ-Treap

每个节点多记录一个max值和两个lazy_tag,暴力Push_Down即可(大常数选手)

打完这道模板题可怜的Leven就要去准备初赛了qwq

 #include<bits/stdc++.h>
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = 1e5+;
struct P{int l,r,sz,x,s,lz1,lz2,key;}s[M];
int n,m,a[M],root,x,y,z,cnt;
inline void Push_Up(int x){
s[x].sz=s[s[x].l].sz+s[s[x].r].sz+;
s[x].s=s[x].x;
if(s[x].l)s[x].s=max(s[x].s,s[s[x].l].s);
if(s[x].r)s[x].s=max(s[x].s,s[s[x].r].s);
}inline void Push_Down1(int x){
if(!s[x].lz1)return;
swap(s[x].l,s[x].r);
s[s[x].l].lz1^=;
s[s[x].r].lz1^=;
s[x].lz1=;
}inline void Push_Down2(int x){
Push_Down1(x);
if(!s[x].lz2)return;
s[s[x].l].lz2+=s[x].lz2;
s[s[x].l].x+=s[x].lz2;
s[s[x].r].lz2+=s[x].lz2;
s[s[x].l].s+=s[x].lz2;
s[s[x].r].x+=s[x].lz2;
s[s[x].r].s+=s[x].lz2;
s[x].lz2=;
}inline int Merge(int x,int y){
if(!x||!y)return x+y;
Push_Down2(x),Push_Down2(y);
if(s[x].key<s[y].key){
s[x].r=Merge(s[x].r,y);
Push_Up(x);return x;
}s[y].l=Merge(x,s[y].l);
Push_Up(y);return y;
}inline void Split(int now,int sz,int &x,int &y){
if(!now)return x=y=,void();
Push_Down2(now);
if(s[s[now].l].sz>=sz)y=now,Split(s[now].l,sz,x,s[now].l);
else x=now,Split(s[now].r,sz-s[s[now].l].sz-,s[now].r,y);
Push_Up(now);
}inline void Add(){
int l=read(),r=read(),p=read();
Split(root,l-,x,y),Split(y,r-l+,y,z);
s[y].lz2+=p;s[y].s+=p;s[y].x+=p;
root=Merge(Merge(x,y),z);
}inline void Reverse(){
int l=read(),r=read();
Split(root,l-,x,y),Split(y,r-l+,y,z);
s[y].lz1^=;
root=Merge(Merge(x,y),z);
}inline void Query(){
int l=read(),r=read();
Split(root,l-,x,y),Split(y,r-l+,y,z);
printf("%d\n",s[y].s);
root=Merge(Merge(x,y),z);
}inline void Insert(int val){
s[++cnt]=(P){,,,val,val,,,rand()};
root=Merge(cnt,root);
}int main(){
srand(unsigned(time()));
n=read(),m=read();
for(int i=;i<=n;i++)Insert();
while(m--){
int opt=read();
if(opt==)Add();
else if(opt==)Reverse();
else Query();
}return ;
}

【FHQ-Treap】P4146 序列终结者的更多相关文章

  1. luogu P4146 序列终结者

    嘟嘟嘟 这是一道splay基础题. 最坑的一点是,因为有些节点可能没有左儿子或右儿子,所以必须把t[0].Max赋成-INF! 因为这个调了半天,看来回头复习复习splay是对的-- #include ...

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

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

  3. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  4. FHQ Treap及其可持久化与朝鲜树式重构

    FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...

  5. 并不对劲的fhq treap

    听说很对劲的太刀流不止会splay一种平衡树,并不对劲的片手流为了反驳他,并与之针锋相对,决定学学高端操作. 很对劲的太刀流-> 据说splay常数极大,但是由于只知道splay一种平衡树能对序 ...

  6. 平衡树(Splay、fhq Treap)

    Splay Splay(伸展树)是一种二叉搜索树. 其复杂度为均摊\(O(n\log n)\),所以并不可以可持久化. Splay的核心操作有两个:rotate和splay. pushup: 上传信息 ...

  7. [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)

    [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap) 题面 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...

  8. [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap)

    [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap) 题面 给出一个长度为n的字符串,m个操作,字符串仅包含小写英文字母 操作1:在k ...

  9. 关于非旋FHQ Treap的复杂度证明

    非旋FHQ Treap复杂度证明(类比快排) a,b都是sort之后的排列(从小到大) 由一个排列a构造一颗BST,由于我们只确定了中序遍历=a,但这显然是不能确定一棵树的形态的. 由一个排列b构造一 ...

随机推荐

  1. HBase 永久RIT(Region-In-Transition)问题

    HBase 永久RIT(Region-In-Transition)问题:异常关机导致HBase表损坏和丢失,大量Regions 处于Offline状态,无法上线. 问题1:启动HBase时,HBase ...

  2. testNG官方文档翻译-4 运行TestNG

    TestNG可以通过不同的方法触发运行: 命令行 ant Eclipse IntelliJ's IDEA

  3. jenkins+jacoco配置代码覆盖率

    一.服务器端配置 1.在代码部署服务器中安装jacoco,用于手工/接口测试覆盖率监听收集 2a.正常情况下,可在服务器中代码部署模块下的default文件夹中,修改tomcat文件如下 其中,inc ...

  4. Jenkins和Docker

    由于采用了Docker版的Jenkins,导致在Jenkins里无法调用Docker命令行工具进行Docker镜像构建 有三种解决方案: 1. 安装Docker插件,利用Jenkins插件进行构建 2 ...

  5. Array.prototype.slice.call()等几种将arguments对象转换成数组对象的方法

    网站搬迁,给你带来的不便敬请谅解! http://www.suanliutudousi.com/2017/10/10/array-prototype-slice-call%E7%AD%89%E5%87 ...

  6. 高级UI晋升之触摸事件分发机制(一)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 0. 前言 鉴于安卓分发机制较为复杂,故分为多个层次进行讲解,分别为基础篇.实践 ...

  7. 利用MySqlBulkLoader生成csv文件,批量添加数据

    DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Yw ...

  8. OpenGL的编译和使用

    这里说个简单的使用OpenGL的方法, 准备工作 1:OpenGL代码,没有的话,可以去http://freeglut.sourceforge.net/index.php#download 这里下载一 ...

  9. openssl编译方法

    受不了了,终于编译成功了openssl,写一下编译方法吧 准备: 0:要编译openssl,必不可少的是代码,去下载 https://www.openssl.org/source/ 1:要有一个VS系 ...

  10. GYM 101933E 状态压缩 + 记忆化搜索

    题意:我方有n个士兵,敌方有m个,每方士兵都有一个血量,现在有k轮无差别炮火打击,每次都会从存活的士兵中随机选一人,这名士兵的HP就-1,问对方被团灭的概率有多大? 思路:因为n和m的范围很小,我们可 ...