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. Java自学-接口与继承 UML图

    UML 图 步骤 1 : UML 图 -- 类之间的关系 UML-Unified Module Language 统一建模语言,可以很方便的用于描述类的属性,方法,以及类和类之间的关系 步骤 2 : ...

  2. css之纯css实现流程导航效果

    :::tip 使用纯css线上 流程导航效果.     本文统一采取 flex 布局 ,你也可以采用其他布局实现,核心原理不变 ::: ## 方法一 利用裁剪  该方法IE下不支持 利用裁剪 clip ...

  3. 下拉框等需要显示上下箭头切换的CSS样式

    下拉框等需要显示上下箭头切换的CSS样式   .icon-right, .icon-down, .icon-up { display: inline-block; padding-right: 13r ...

  4. CSS怎么隐藏滚动条(三种方法)

    xhtml中隐藏滚动条在用ie6浏览有框架的xhtml页面的时候,默认会水平和垂直滚动条会一起出现,这是ie6的一个bug,在firefox上是正常的,出现的原因是其对XHTML 1.0 transi ...

  5. Python人工智能常用库Numpy使用入门

    第一章 jupyter notebook简单教程 命令模式按键esc开启 Enter : 转入编辑模式 Shift-Enter : 运行本单元,选中下个单元 Ctrl-Enter : 运行本单元 Al ...

  6. linux ssh scp免密码

    1.首先登入一台linux服务器做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成key文件:ssh-keygen -t rsa 2.在母机上,进入/root/.ssh目录,找到id ...

  7. consul:connect

    官方文档:https://www.consul.io/docs/connect/index.html#getting-started-with-connect consul connect的功能类似与 ...

  8. httpPost请求用java代码实现的方法

    原文:https://www.cnblogs.com/johnson-yuan/p/6713384.html package com.day3.sample; //首先下面我我们需要导入的jar包和文 ...

  9. 一步一步从PostgreSQL安装到delphi 访问

    今天,我们使用ubuntu 19 来安装PostgreSQL. 1.直接使用包安装 sudo apt-get install postgresql 按Y,直接安装. 安装完毕. 初次安装后,默认生成一 ...

  10. 分布式利器之redis-第二章

    上期答案 问题1:Redis单线程为什么快?回答: 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速.数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1 ...