题面

传送门

题解

日常敲板子.jpg

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
long long read(){
R long long res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R long long x){
if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=2e5+5,M=2e7+5;
typedef long long ll;
struct node;typedef node* ptr;
unsigned int aaa=19260817;
inline unsigned int rd(){aaa^=aaa>>15,aaa+=aaa<<12,aaa^=aaa>>3;return aaa;}
inline void swap(R ptr &s,R ptr &t){R ptr p=s;s=t,t=p;}
struct node{
ptr lc,rc;bool t;int v,sz;ll sum;unsigned int pr;
inline ptr upd(){return sz=lc->sz+rc->sz+1,sum=lc->sum+rc->sum+v,this;}
inline ptr init(R int val){return sum=v=val,sz=1,pr=rd(),this;}
inline ptr ppd(){return swap(lc,rc),t^=1,this;}
}e[M],*rt[N],*pp=e;
inline ptr newnode(R int v){return ++pp,pp->lc=pp->rc=e,pp->init(v);}
inline ptr cl(ptr p){return ++pp,*pp=*p,pp;}
inline ptr pd(ptr p){
if(p->t){
if(p->lc!=e)p->lc=cl(p->lc),p->lc->ppd();
if(p->rc!=e)p->rc=cl(p->rc),p->rc->ppd();
p->t=0;
}return p;
}
void split(ptr p,int k,ptr &s,ptr &t){
if(p==e)return s=t=e,void();
if(pd(p)->lc->sz<k)s=cl(p),split(s->rc,k-s->lc->sz-1,s->rc,t),s->upd();
else t=cl(p),split(t->lc,k,s,t->lc),t->upd();
}
ptr merge(ptr s,ptr t){
if(s==e)return t;if(t==e)return s;
if(pd(s)->pr<pd(t)->pr)return s->rc=merge(s->rc,t),s->upd();
return t->lc=merge(s,t->lc),t->upd();
}
void push(ptr &rt,int k,int x){
ptr s,t;
split(rt,k,s,t),rt=merge(merge(s,newnode(x)),t);
}
void pop(ptr &rt,int k){
ptr s,t,p,q;
split(rt,k,s,t),split(s,k-1,p,q),rt=merge(p,t);
}
void rev(ptr &rt,int l,int r){
ptr s,t,p,q;
split(rt,r,s,t),split(s,l-1,p,q);
rt=merge(merge(p,q->ppd()),t);
}
ll query(ptr &rt,int l,int r){
ptr s,t,p,q;ll res;
split(rt,r,s,t),split(s,l-1,p,q),res=q->sum;
return rt=merge(merge(p,q),t),res;
}
ll lasans,id,op,l,r,x,k;
int main(){
// freopen("testdata.in","r",stdin);
rt[0]=e,e->lc=e->rc=e,lasans=0;
for(int Q=read(),i=1;i<=Q;++i){
id=read(),op=read(),rt[i]=rt[id];
switch(op){
case 1:k=read()^lasans,x=read()^lasans,push(rt[i],k,x);break;
case 2:k=read()^lasans,pop(rt[i],k);break;
case 3:l=read()^lasans,r=read()^lasans,rev(rt[i],l,r);break;
case 4:l=read()^lasans,r=read()^lasans,print(lasans=query(rt[i],l,r));break;
}
}
return Ot(),0;
}

洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)的更多相关文章

  1. P3391 【模板】文艺平衡树FHQ treap

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  2. 洛谷.3835.[模板]可持久化平衡树(fhq treap)

    题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...

  3. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  4. 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)

    题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...

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

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

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

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

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

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

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

  10. 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会

    平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...

随机推荐

  1. 如何写Java文档注释(Java Doc Comments)

    本文翻译自How to Write Doc Comments for the Javadoc Tool,但是精简了一些私以为不重要的东西 本文不讨论如何使用javadoc工具自动生成文档的方法,而是主 ...

  2. msp430入门编程01

    msp430单片机最小系统 msp430入门学习 msp430入门编程

  3. Linux下汇编语言学习笔记64 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  4. cogs——1215. [Tyvj Aug11] 冗余电网

    1215. [Tyvj Aug11] 冗余电网 ★   输入文件:ugrid.in   输出文件:ugrid.out   简单对比 时间限制:1 s   内存限制:128 MB TYVJ八月月赛提高组 ...

  5. Visual studio 2008 的语法高亮插件 WordLight

    前段时间一直在使用matlab,今天需要使用vs2008,而用惯了matlab,习惯了其中一项选中变量高亮的设置,突然回来使用VS,感到各种不适应,顿时想到了一个词:矫情 呵呵,于是在网上找各种插件, ...

  6. eclipse常用使用指南

    1.eclipse添加new/删除/一个tomcat. 步骤:window->preference->server->runtime environment.remove掉,再重新n ...

  7. pycharm支持react

    安装nodejs插件 使能node 出现下面的变化,在scope里可以定义使用的范围 创建react项目 使能eslint规则检查功能 配置前端启动脚本: https://www.jetbrains. ...

  8. seajs入门使用

    使用 Sea.js 进行模块化开发还能够带来非常多优点: 模块的版本号管理. 通过别名等配置,配合构建工具,能够比較轻松地实现模块的版本号管理. 提高可维护性.模块化能够让每一个文件的职责单一,很有利 ...

  9. 戴尔PowerEdge服务器RAID控制卡的配置

    示例演示环境:PowerEdge R620 + H710p Raid控制卡  + 9 x 300G 10k SAS 硬盘 H310.H710.H810的配置方法与H710P大致相同,在此不再累述. 特 ...

  10. poj3511--A Simple Problem with Integers(线段树求和)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 60441   ...