好题.

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. 洛谷P1654 OSU!_概率与期望

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 1000000 ...

  2. Python数据分析-----数据分类

    1.常见的分类算法主要有: (1)KNN算法 (2)贝叶斯方法 (3)决策树 (4)人工神经网络 (5)支持向量机(SVM) 2.KNN算法 (1)KNN应用场景: 比方说样本中有很多零食.很多电器. ...

  3. WEBGL学习【六】动起来的三棱锥和立方体

    <html lang="zh-CN"> <!--服务器运行地址:http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWe ...

  4. 10行Python代码实现人脸定位

    10行python机器学习全卷机网,实现100+张人脸同时定位! 发表评论 1,049 游览 A+ 所属分类:未分类 收  藏 今天介绍一个快速定位人脸的深度学习算法MTCNN,全称是:Multi-t ...

  5. java自带线程池和队列详细讲解,android中适用

    Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...

  6. Loaded APR based Apache Tomcat Native library 1.1.24 using APR version 1.4.6.

    Loaded APR based Apache Tomcat Native library 1.1.24 using APR version 1.4.6. 我复制的几个地方: MySql C:\WIN ...

  7. BJFU 质数相关

    /* BJFU 质数相关 http://101.200.220.237/contest/19/problem/116/ 二分图 按质因数奇偶性建立二分图 * * */ #include <cst ...

  8. L - 还是畅通工程

    L - 还是畅通工程   思路:水! #include<cstdio> #include<cstring> #include<iostream> #include& ...

  9. Android 经常使用设计模式(一)

    由于项目变更的频繁性,作为一名程序猿,我们须要掌握设计模式的必要性.就不言而喻~~.以下就是一些我自己学习的设计模式总结. 接下来,主要是针对几个比較经常使用模式进行解说,主要是以下几种: 观察者模式 ...

  10. ASPX和Razor

    ASPX ASPX文件是微软的在server端运行的动态网页文件,通过IIS解析运行后能够得到动态页面,是微软推出的一种新的网络编程方法,而不是ASP的简单升级,由于它的编程方法和ASP有非常大的不同 ...