题意:

  给定一个序列,支持区间加,区间反转,区间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. 最小生成树--Prim及Kruskal

    //prim算法#include<cstdio> #include<cmath> #include<cstring> #include<iostream> ...

  2. Samza基本概念

  3. 关于windows cmd的一些便捷应用

    在同事的指点下,我学会了一种非常方便的进入路径的方法 在windows文件夹中直接打开到要执行的文件的位置,然后在我的电脑那个路径当中输入cmd 之后,cmd的对话框会弹出来,并且显示在当前路径下,这 ...

  4. Ubuntu桌面突然卡住,图形界面无反应

    1.可能等待几分钟,系统会自动反应过来.你可以选择等待几分钟. 2.绝大多数情况系统是不会反应过来的,这时候可以进入tty终端直接注销用户. (1)Ubuntu有6个tty终端,按住Ctrl+Alt+ ...

  5. flink idea 打包jar 并放到集群上运行

    flink idea 打包jar 并放到集群上运行 在开始之前注意前提,当前项目的scala的版本要和集群上的scala一致   我已经创建好一个wordCount的flink项目   注意项目的po ...

  6. lua redis 操作

    https://redis.io/commands/keys 遍历redis里面的所有key ,还能进行模糊匹配, 这样就省去了对key的手动过滤了 比如 keys term_info* ) &quo ...

  7. CF755G PolandBall and Many Other Balls/soj 57送饮料

    题意:长度为n的序列,相邻两个或单独一个可以划分到一个组,每个元素最多处于一个组. 问恰好分割成k(1<=k<=m)段有多少种方案? 标程: #include<bits/stdc++ ...

  8. 【JZOJ6419】模拟旅行&【BZOJ5506】【luoguP5304】旅行者

    description 某国有n座城市,这些城市之间通过m条单向道路相连,已知每条道路的长度. 不过,小X只对其中k座城市感兴趣. 为了更好地规划模拟旅行路线,提升模拟旅行的体验,小X想要知道他感兴趣 ...

  9. Zookeeper_Paxos算法

    Paxos算法 算法简介 Paxos算法是莱斯利-兰伯特在1990年提出的一种基于消息传递的.具有容错性的一致性算法,Google Chubb(分布式锁服务)的作者Mike Burrwos说过,世上只 ...

  10. php基本,输出 ,变量

    <?php   //php开头//单行注释/*多行注释*/ echo "hello word";//输出 方式连续输出多个字符串print"hello word&q ...