P5055 【模板】可持久化文艺平衡树

链接

luogu

思路

可持久化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的更多相关文章

  1. 洛谷P5055 可持久化文艺平衡树 (可持久化treap)

    题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...

  2. 【模板】可持久化文艺平衡树-可持久化treap

    题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...

  3. luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap

    好题. Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...

  4. 【LG5055】可持久化文艺平衡树

    [LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...

  5. 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)

    题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...

  6. LG5055 【模板】可持久化文艺平衡树

    题意 您需要写一种数据结构,来维护一个序列,其中需要提供以下操作(对于各个以往的历史版本): 在第 pp 个数后插入数 xx . 删除第 pp 个数. 翻转区间 [l,r][l,r],例如原序列是 { ...

  7. Luogu5055 【模板】可持久化文艺平衡树(fhq-treap)

    注意下传标记时也需要新建节点.空间开的尽量大. #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  8. SLT学习——leafes tree扩展 【文艺平衡树】

    这是一个全新的数据结构 md,别看这篇文章了,这篇已经废了. 百折不饶,再交一次,更新复杂度证明 这里是HYF,蒟蒻一只,最近因某些原因开始学数据结构了,然后就写了这篇题解. 下面给大家介绍一个全新的 ...

  9. Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)

    题面:[模板]可持久化数组(可持久化线段树/平衡树) 不知道说啥,总之我挺喜欢自己打的板子的! #include<cstdio> #include<cstring> #incl ...

随机推荐

  1. 初步学习async/await,Task.GetAwaiter,Task.Result

    网上关于async/await的知识有很多,看了很多但不如自己实践一遍来得快,所以这里记录下我的理解和大家学习下. 首先以最简单的同步方法来开始如下 private static void Test( ...

  2. docker离线导入导出镜像

    docker save -o mysqlies.tar 5ada6380f248(镜像id)    # 镜像id是要导出的 有镜像的机器  在有镜像的机器上执行docker load --input ...

  3. Linux学习笔记之LVM基本应用,扩展及缩减实现

    0x00 LVM概述 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘 ...

  4. C#读写修改设置调整UVC摄像头画面-全景

    有时,我们需要在C#代码中对摄像头的全景进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  5. 防止用iframe调用网页dom元素

    <system.webServer> <httpProtocol> <customHeaders> <add name="X-Frame-Optio ...

  6. Smack 4.3.4 API

      Smack 4.3.4 API 包 包 描述 org.igniterealtime.smack.smackrepl Smack的REPL(读取评估打印循环). org.jivesoftware.s ...

  7. 查看Linux内核版本

    您可能因多种原因需要确切知道GNU / Linux操作系统上运行的内核版本. 也许您正在调试与硬件相关的问题,或者了解影响旧内核版本的新安全漏洞,并且您想知道您的内核是否易受攻击. 无论是什么原因,从 ...

  8. 时间格式在ios和安卓兼容性的问题:

    在做项目时,在时间显示上遇到一个问题,取后台返回的时间时,在ios手机上时间不显示,安卓手机正常,最后通过Vconsole工具发现,ios不能支持用“—”分割的时间,此外后台返回的时间格式为x年x月x ...

  9. ES6 之 对象的简写方式

    简写有两条基本原则: 同名的属性可以省略不写 对象中的方法中的 : function 可以省略不写 来看下下面这个例子,我分别用ES5 和 ES6 的语法分别定义并声明了一个简单的学生对象: ES5: ...

  10. 基于JPA的分页/排序实现

    Page<ClassOrder> findByMember_MemberID(long id, Pageable pageable); Controller代码: public Model ...