【FHQ-Treap】P4146 序列终结者
题意:
给定一个序列,支持区间加,区间反转,区间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 序列终结者的更多相关文章
- luogu P4146 序列终结者
嘟嘟嘟 这是一道splay基础题. 最坑的一点是,因为有些节点可能没有左儿子或右儿子,所以必须把t[0].Max赋成-INF! 因为这个调了半天,看来回头复习复习splay是对的-- #include ...
- BZOJ1251序列终结者——非旋转treap
题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...
- 在平衡树的海洋中畅游(四)——FHQ Treap
Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...
- FHQ Treap及其可持久化与朝鲜树式重构
FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...
- 并不对劲的fhq treap
听说很对劲的太刀流不止会splay一种平衡树,并不对劲的片手流为了反驳他,并与之针锋相对,决定学学高端操作. 很对劲的太刀流-> 据说splay常数极大,但是由于只知道splay一种平衡树能对序 ...
- 平衡树(Splay、fhq Treap)
Splay Splay(伸展树)是一种二叉搜索树. 其复杂度为均摊\(O(n\log n)\),所以并不可以可持久化. Splay的核心操作有两个:rotate和splay. pushup: 上传信息 ...
- [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)
[BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap) 题面 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...
- [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap)
[BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap) 题面 给出一个长度为n的字符串,m个操作,字符串仅包含小写英文字母 操作1:在k ...
- 关于非旋FHQ Treap的复杂度证明
非旋FHQ Treap复杂度证明(类比快排) a,b都是sort之后的排列(从小到大) 由一个排列a构造一颗BST,由于我们只确定了中序遍历=a,但这显然是不能确定一棵树的形态的. 由一个排列b构造一 ...
随机推荐
- PAT_A1139#First Contact
Source: PAT A1139 First Contact (30 分) Description: Unlike in nowadays, the way that boys and girls ...
- Java Jar Manifest
JAR文件可以可选地在META-INF目录中包含名为MANIFEST.MF的Manifest文件.Manifest文件包含有关JAR文件及其条目的信息.Manifest文件可以包含有关JAR文件的CL ...
- Vultr账户充值需要注意的事项
一.Vultr充值注意事项 1.选择适合自己的充值工具.我们可以使用支付宝.信用卡.PAYPAL等支付方式,需要我们注意的是充值方式不要来回切换充值,如果我们有多账户的时候一定不要相互使用,以免导致账 ...
- vue 外卖app(3) 利用slot分发内容
1. 增加一个HeaderTop.vue <template> <header class="header"> <slot name="le ...
- 单个机器部署redis集群模式(一键部署脚本)
一.检查机器是否安装gcc.unzip.wget 二.部署模式 #模式1: 将所有主从节点以及sentinel节点部署在同一台机器上 #模式2: 将一个数据节点和一个sentinel节点部署在一台机器 ...
- Spring Boot 2.X 对 web 的开发支持(二)
Spring Boot 2.X 对 web 的支持开发 上章节的 Spring Boot 的入门案例,我们感受到 Spring Boot 简单的配置即可运行项目. 今天了解 Spring Boot 对 ...
- java常用类——比较器
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...
- MySQL 刷题知识点整理
1. left join on 与 right join on, inner join on 的区别: left join on 把左表中的行全部展示,而将寻找右表中符合的行展示: right joi ...
- Laravel 开发环境搭建
本人使用的是Laravel5.5版本,需要PHP7支持,所以安装的环境是Apache2.php7.0.mysql5.7,系统为ubuntu14.04LTS(14以下的版本对php7支持不够),主要参考 ...
- JUC 一 FutureTask
java.util.concurrent public class FutureTask<V> implements RunnableFuture<V> 简介 FutureTa ...