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. 基于netty手写RPC框架

    代码目录结构 rpc-common存放公共类 rpc-interface为rpc调用方需要调用的接口 rpc-register提供服务的注册与发现 rpc-client为rpc调用方底层实现 rpc- ...

  2. 打印出三位数的水仙花数Python

    水仙花数计算 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪ ...

  3. c#调用python脚本实现排序(适用于python脚本中不包含第三方模块的情况)

    引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#调用python脚本需要安装IronPython.我是通过vs2017的工具- ...

  4. Test Title

    test testing... testing in day02... testing in day07...

  5. windows 2003 域控服务器导出全部hash的方法

    天下文章一大抄,我也是醉了... 一份“错误”的文章一遍又一遍的被转载,盲目转载,根本不细看.只会误导新手. 谈下windows2003域控下如何导出全部的hash信息. 1. 使用备份还原向导 2. ...

  6. MySQL IFNULL() 函数

    MySQL函数 IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值. IFNULL() 函数语法格式为: IF ...

  7. Mac安装vscode IDE 撸nodejs代码

    1. vscode官网地址:https://code.visualstudio.com   找到mac对应的下载地址,下载后的文件是 zip压缩包,解压后将文件拖到Application目录下即可. ...

  8. J2SE 容器

    知识点:Collection接口.Iterator接口.增强的for循环.Set接口.List接口和Comparable接口.Collection类.Map接口.自动打包/解包.泛型 容器:API文档 ...

  9. 没有可用的软件包 build-essential,但是它被其他的软件包引用了【解决方法】

    执行: sudo apt install build-essential 遇到如下问题: 解决方法: sudo apt-get update 此命令需要联网:待更新完毕后再次输入安装命令即可. 若在升 ...

  10. oracle 字符集安装错了,修改字符集 及创建用户 表空间 ,删除用户及所有的表

    1.首先以sysdba的身份登录上去 conn /as sysdba 2.关闭数据库shutdown immediate; 3.以mount打来数据库,startup mount 4.设置sessio ...