P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
P5055 【模板】可持久化文艺平衡树
链接
思路
可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久。以前以为很难一直没看,就是个板子。
错误
t[++num].sum=x;t[num].val=x;
t[++num].sum=t[num].val=x;
这两句话居然不一样。
我靠我靠我靠,调试了一下午。
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int _=2e5+7;
ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
namespace fhq_treap {
#define ls t[u].ch[0]
#define rs t[u].ch[1]
int num;
struct node {
int ch[2],siz,pri,lazy;
ll val,sum;
}t[_*80];
int make_node(ll x) {
t[++num].sum=x;t[num].val=x;
t[num].pri=rand(),t[num].siz=1;
return num;
}
void pushup(int u) {
t[u].siz=t[ls].siz+t[rs].siz+1;
t[u].sum=t[ls].sum+t[rs].sum+t[u].val;
}
int copy_node(int u) {t[++num]=t[u];return num;}
void pushdown(int u) {
if(t[u].lazy) {
if(ls) ls=copy_node(ls);
if(rs) rs=copy_node(rs);
if(ls) t[ls].lazy^=1;
if(rs) t[rs].lazy^=1;
swap(ls,rs);
t[u].lazy^=1;
}
}
int merge(int x,int y) {
if(!x||!y) return x+y;
pushdown(x),pushdown(y);
if(t[x].pri<t[y].pri) {
t[x].ch[1]=merge(t[x].ch[1],y);
pushup(x);return x;
} else {
t[y].ch[0]=merge(x,t[y].ch[0]);
pushup(y);return y;
}
}
void split(int u,int k,int &x,int &y) {
if(!u) x=y=0;
else {
pushdown(u);
u=copy_node(u);
if(t[ls].siz+1<=k)
x=u,split(rs,k-t[ls].siz-1,t[x].ch[1],y);
else
y=u,split(ls,k,x,t[y].ch[0]);
pushup(u);
}
}
}
using namespace fhq_treap;
int rt[_];
int main() {
srand(19260817);
int T=read();
ll lastans=0;
for(int i=1;i<=T;++i) {
int super_cool=read(),opt=read(),x,y,z;
if(opt==1) {
ll p=read()^lastans,v=read()^lastans;
split(rt[super_cool],p,x,y);
rt[i]=merge(merge(x,make_node(v)),y);
} else if(opt==2) {
ll p=read()^lastans;
split(rt[super_cool],p,x,z);
split(x,p-1,x,y);
rt[i]=merge(x,z);
} else if(opt==3) {
ll l=read()^lastans,r=read()^lastans;
split(rt[super_cool],r,x,z);
split(x,l-1,x,y);
t[y].lazy^=1;
rt[i]=merge(merge(x,y),z);
} else {
ll l=read()^lastans,r=read()^lastans;
split(rt[super_cool],r,x,z);
split(x,l-1,x,y);
printf("%lld\n",lastans=t[y].sum);
rt[i]=merge(merge(x,y),z);
}
}
return 0;
}
P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap的更多相关文章
- 洛谷P5055 可持久化文艺平衡树 (可持久化treap)
题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...
- 【模板】可持久化文艺平衡树-可持久化treap
题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...
- luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap
好题. Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...
- 【LG5055】可持久化文艺平衡树
[LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...
- 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...
- LG5055 【模板】可持久化文艺平衡树
题意 您需要写一种数据结构,来维护一个序列,其中需要提供以下操作(对于各个以往的历史版本): 在第 pp 个数后插入数 xx . 删除第 pp 个数. 翻转区间 [l,r][l,r],例如原序列是 { ...
- Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)
注意下传标记时也需要新建节点.空间开的尽量大. #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- SLT学习——leafes tree扩展 【文艺平衡树】
这是一个全新的数据结构 md,别看这篇文章了,这篇已经废了. 百折不饶,再交一次,更新复杂度证明 这里是HYF,蒟蒻一只,最近因某些原因开始学数据结构了,然后就写了这篇题解. 下面给大家介绍一个全新的 ...
- Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)
题面:[模板]可持久化数组(可持久化线段树/平衡树) 不知道说啥,总之我挺喜欢自己打的板子的! #include<cstdio> #include<cstring> #incl ...
随机推荐
- Java中守护线程的总结 thread.setDaemon(true)
https://www.cnblogs.com/ziq711/p/8228255.html 在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用个比较 ...
- 一个简单便捷的树形显示Ztree
这是本人在闲时研究的一个用于显示树形列表的小玩意. zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. 下面就说说怎么用吧 ...
- selenium中元素操作之上传操作(六)
上传操作分为两种情况: 1.input标签上传 如果是input可以直接输入路径的,那么直接调用send_keys输入路径,和前边的元素操作类似,在这里不再过多的赘述. 2.非input标签上传 非i ...
- 一,python编程100例
1.有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? number = (1 ,2,3,4) ...
- java中创建线程的3种方法
1.继承Thread类优点:可以直接使用Thread类中的方法,代码比较简单.缺点:继承Thread类之后不能继承其他类. 2.实现Runable接口优点:实现接口,比影响继承其他类或实现接口.缺点: ...
- 全面了解Cookie
一.Cookie的出现 浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的实现. 针对上述 ...
- jquery问题,如何调用带this的函数?
这样写: 1 2 3 4 5 6 7 8 9 10 11 12 $(".aa").on("mouseout",function(){ var obj = ...
- Nginx配置多域名代理
目的 当我们有多个站点需要对外网开放,每个站点的域名都不一样,然而我们只有一个外网ip.这种情况下,我们就可以使用一个Nginx来配置多域名代理.这种代理方式可以解决,在同一个端口上针对不同域名代理不 ...
- Weshop基于Spring Cloud开发的小程序商城系统
WESHOP | 基于微服务的小程序商城系统 Weshop是基于Spring Cloud(Greenwich)开发的小程序商城系统,提供整套公共微服务服务模块,包含用户中心.商品中心.订单中心.营销中 ...
- MongoDB的集群模式--Replica Set
一.Replica Set 集群分为两种架构: 奇数个节点构成Replica Set,所有节点拥有数据集.最小架构: 1个Primary节点,2个Secondary节点 偶数个节点 + 一个仲裁节点 ...