好题.

Code:

#include<bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
namespace fhqtreap{
#define maxn 20000000
#define ll long long
int tot,m,tr;
int trash[maxn];
int ls[maxn],rs[maxn],rev[maxn],val[maxn],sz[maxn],key[maxn];
int root[maxn];
ll sumv[maxn];
ll lastans;
void ini(){
tr=0;
for(int i=1;i<1000000;++i) trash[++tr]=i;
tot=1000001;
}
int newnode(){
return tr?trash[tr--]:++tot;
}
int cpy(int p){
int x=newnode();
sz[x]=sz[p],ls[x]=ls[p],rs[x]=rs[p];
rev[x]=rev[p],val[x]=val[p],key[x]=key[p],sumv[x]=sumv[p];
return x;
}
void up(int x){
sz[x]=sz[ls[x]]+sz[rs[x]]+1;
sumv[x]=sumv[ls[x]]+sumv[rs[x]]+(long long)val[x];
}
int New(int v){
int p=newnode();
sz[p]=1,ls[p]=rs[p]=0,sumv[p]=val[p]=v,key[p]=rand(),rev[p]=0;
return p;
}
void era(int x){
sz[x]=ls[x]=rs[x]=rev[x]=val[x]=sumv[x]=key[x]=0;
trash[++tr]=x;
}
void pd(int x){
if(!x||!rev[x]) return;
if(rev[x]){
swap(ls[x],rs[x]);
if(ls[x]) ls[x]=cpy(ls[x]),rev[ls[x]]^=1;
if(rs[x]) rs[x]=cpy(rs[x]),rev[rs[x]]^=1;
rev[x]=0;
}
}
void split(int x,int k,int &l,int &r){
if(x){
pd(x);
if(k<=sz[ls[x]]) {
r=cpy(x);
split(ls[r],k,l,ls[r]);
up(r);
}
else {
l=cpy(x);
split(rs[l],k-sz[ls[l]]-1,rs[l],r);
up(l);
}
}else l=r=0;
}
int mg(int l,int r){
if(l&&r){
if(key[l]<key[r]) {
pd(r),ls[r]=mg(l,ls[r]),up(r);
return r;
}else {
pd(l),rs[l]=mg(rs[l],r),up(l);
return l;
}
}else return l+r;
}
void ins(int &rt,int p,int v){
int x,y;
split(rt,p,x,y);
rt=mg(mg(x,New(v)),y);
}
void Del(int &rt,int p){
int x,y,z;
split(rt,p,x,y),split(x,p-1,x,z),era(z);
rt=mg(x,y);
}
void Rev(int &rt,int L,int R){
int x,y,z;
split(rt,R,x,y),split(x,L-1,x,z),rev[z]^=1;
rt=mg(mg(x,z),y);
}
void Q(int &rt,int L,int R){
int x,y,z;
split(rt,R,x,y),split(x,L-1,x,z), printf("%lld\n",(lastans=sumv[z]));
rt=mg(mg(x,z),y);
}
int main(){
ini();
int n,a=0,b=0;
scanf("%d",&n);
for(int opt,v,i=1;i<=n;++i){
scanf("%d%d",&v,&opt);
root[i]=root[v];
scanf("%d",&a),a^=lastans;
if(opt!=2) scanf("%d",&b),b^=lastans;
if(opt==1) ins(root[i],a,b);
if(opt==2) Del(root[i],a);
if(opt==3) Rev(root[i],a,b);
if(opt==4) Q(root[i],a,b);
}
return 0;
}
};
int main(){
//setIO("input");
fhqtreap::main();
return 0;
}

  

luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap的更多相关文章

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

    P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...

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

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

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

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

  4. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

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

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

  6. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  7. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  8. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  9. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

随机推荐

  1. Ubuntu终端命令行缩短显示路径

    平时我们使用linux终端命令行的时候,常常会被一个问题困扰,那就是文件路径过长, 有时候甚至超过了一行,这样看起来非常别扭,其实只要两步就可以解决这个问题: 1,修改.bashrc文件(用户根目录下 ...

  2. 安装Mysql的一些问题,比如Net Connect 卸载不掉,注册表相关操作

    我安装mysql用了一段时间后卸载了,在安装就发现安装不了了,原因就是卸载的时候Net Connetc无法卸载,我试了一个月也没有解决后来百度各种还是没有办法解决.于是就尝试自己手动卸载注册表.在“开 ...

  3. android的listview的addheaderView总是出现空指针的错误

    android的listview的addheaderView总是出现空指针的错误, 网上的处理方法如下: // This doesn't work... nullPointerException Li ...

  4. nyoj26-孪生素数问题

    孪生素数问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数.一般来说,孪生素数就是指两个素数距离为2,近的不能再近的 ...

  5. Linux 基础入门一

    操作系统1.简介OS: Operating System,通用目的的软件程序操作系统的内核(kernel):  操作系统其实也是一组程序.这组程序的重点在于管理计算机的所有活动及驱动系统中的所有硬件: ...

  6. django-5-自定义模板过滤器及标签

    <<<代码布局(自定义的代码放哪里)>>> (1)某个app特有的  1.一般放app目录下 固定名为templatetags 的python文件夹里鸭,如果是别的 ...

  7. 2016年工作中遇到的问题1-10:select-for-update锁表

    1.select... for update锁表.注意事项:事务下使用,@Transactional如果用主键,只锁住1行记录如果不用主键,会锁住多条记录,mysql下测试,查询1条,锁住1行,查询2 ...

  8. 02022_System类的方法练习

    1.验证for循环打印数字1-9999所需要使用的时间(毫秒) public class Test { public static void main(String[] args) { long st ...

  9. Servlet过滤器和监听器知识总结

    Servlet过滤器是 Servlet 程序的一种特殊用法,主要用来完成一些通用的操作,如编码的过滤.判断用户的登录状态.过滤器使得Servlet开发者能够在客户端请求到达 Servlet资源之前被截 ...

  10. Spring Boot由jar包转成war包

    Spring Boot由jar包转成war包 spring boot 默认是以jar包形式启动web程序,在新建spring boot项目时候可以选择war包的启动方式. 建议在开发的时候建立以jar ...