题面

https://www.luogu.org/problem/P5055

题解

#include<cstdio>
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;const long long size=250000*50;struct fhq_treap {long long v[size],ch[size][2],fix[size],siz[size],sum[size]; bool rev[size];long long root[200050];long long cnt;void clear() {cnt=0; v[0]=ch[0][1]=ch[0][0]=fix[0]=siz[0]=sum[0]=rev[0]=0; root[0]=0;}void pushr(long long x) {if (!rev[x]) return;rev[x]=false;swap(ch[x][0],ch[x][1]);if (ch[x][0]) {copy(ch[x][0],++cnt);ch[x][0]=cnt;rev[cnt]^=1;}if (ch[x][1]) {copy(ch[x][1],++cnt);ch[x][1]=cnt;rev[cnt]^=1;}}void update(long long x) {siz[x]=1+siz[ch[x][0]]+siz[ch[x][1]];sum[x]=v[x]+sum[ch[x][0]]+sum[ch[x][1]];}void copy(long long x,long long y) {siz[y]=siz[x]; ch[y][0]=ch[x][0]; ch[y][1]=ch[x][1];fix[y]=fix[x]; v[y]=v[x]; rev[y]=rev[x]; sum[y]=sum[x];}// 1-k  k+1-nvoid split(long long k,long long x,long long y,long long &ch1,long long &ch2) {if (x==0) {ch1=ch2=0;return;}copy(x,y);pushr(y); if (siz[ch[y][0]]+1<=k) {ch1=y;split(k-siz[ch[y][0]]-1,ch[y][1],++cnt,ch[y][1],ch2);//update(ch1);
    }else {ch2=y;split(k,ch[y][0],++cnt,ch1,ch[y][0]);//update(ch2);
    }update(y);}long long merge(long long x,long long y) {if (!x || !y) return x+y;pushr(x); pushr(y);if (fix[x]<fix[y]) {ch[x][1]=merge(ch[x][1],y);update(x);return x;}else {ch[y][0]=merge(x,ch[y][0]);update(y);return y;}}long long newnode(long long val) {++cnt;sum[cnt]=v[cnt]=val; siz[cnt]=1; fix[cnt]=rand();ch[cnt][0]=ch[cnt][1]=0; rev[cnt]=0;return cnt;}void insert(long long his,long long cur,long long p,long long val) {long long root1=0,root2=0;split(p,root[his],++cnt,root1,root2);root[cur]=merge(merge(root1,newnode(val)),root2);}void erase(long long his,long long cur,long long p) {long long root1=0,root2=0,root3=0;split(p-1,root[his],++cnt,root1,root3);split(1,root3,++cnt,root2,root3);root[cur]=merge(root1,root3);}long long query(long long his,long long cur,long long l,long long r) {long long root1=0,root2=0,root3=0;split(r,root[his],++cnt,root2,root3);split(l-1,root2,++cnt,root1,root2);//cout<<root2<<endl;long long ret=sum[root2];root[cur]=merge(merge(root1,root2),root3);return ret;}void rever(long long his,long long cur,long long l,long long r) {long long root1=0,root2=0,root3=0;//split(l-1,root[his],++cnt,root1,root2);//split(r-l+1,root2,++cnt,root2,root3);split(r,root[his],++cnt,root2,root3);split(l-1,root2,++cnt,root1,root2);rev[root2]^=1;root[cur]=merge(merge(root1,root2),root3);}
} treap;long long n;
int main() {long long i,opt,his,p,x,lastans=0,l,r;srand(time(0));treap.clear();scanf("%lld",&n);for (i=1;i<=n;i++) {scanf("%lld %lld",&his,&opt);if (opt==1) {scanf("%lld %lld",&p,&x);p^=lastans; x^=lastans;treap.insert(his,i,p,x);}if (opt==2) {scanf("%lld",&p);p^=lastans;treap.erase(his,i,p);}if (opt==3) {scanf("%lld %lld",&l,&r);l^=lastans; r^=lastans;treap.rever(his,i,l,r);}if (opt==4) {scanf("%lld %lld",&l,&r);l^=lastans; r^=lastans;//cout<<l<<" "<<r<<endl;lastans=treap.query(his,i,l,r);printf("%lld\n",lastans);}}return 0;
}

转载于:https://www.cnblogs.com/shxnb666/p/11427317.html

P5055【模板】可持久化文艺平衡树相关推荐

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

    P5055 [模板]可持久化文艺平衡树 突然发现fhq_treap也是可以支持区间翻转的,所以基本上和其他平衡树是一样的,而且还满足重量平衡树的性质,真是太优秀了,只不过常数稍微比较大. 然后这里我们 ...

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

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

  3. 【luogu P5055】【模板】可持久化文艺平衡树

    [模板]可持久化文艺平衡树 题目链接:luogu P5055 题目大意 要你维护插入,删除,区间翻转,区间求和. 但要求可持续化,即每次操作在一个历史版本上进行,且会产生一个新的历史版本 思路 看到题 ...

  4. luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap

    luoguP5055 [模板]可持久化文艺平衡树 可持久化非旋转treap 好题. Code: #include<bits/stdc++.h> using namespace std; # ...

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

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

  6. 【FHQ Treap】洛谷P5055 【模板】可持久化文艺平衡树

    DescriptionDescriptionDescription 写一种数据结构,要求支持插入,删除,查询区间和,区间翻转且可持久化 SolutionSolutionSolution 无旋Treap ...

  7. 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)

    题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...

  8. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...

  9. 洛谷 P3391 【模板】文艺平衡树

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...

最新文章

  1. 用C#生成随机中文汉字验证码的基本原理
  2. 从定制软件到通用软件的转变
  3. RDKit | 基于keras的化合物SeqToSeq Autoencoder
  4. Nginx + CGI/FastCGI + C/Cpp(编不过去,不搞了。。。)(Common Gateway Interface)
  5. C#将文件压缩或者解压
  6. vld不输出泄漏信息_光纤天线方案和泄漏电缆方案的比较
  7. 通过RSS订阅、邮件转发自动同步多个Blog
  8. Bzoj3576 [Hnoi2014]江南乐
  9. MySQL使用小技巧(二)——MySQL忘记密码怎么办
  10. android实战技巧,实战技巧:Android异步指南
  11. php ip 短时间 重复,记录服务器端ip,记录这个ip第一次启动文件的时间,并且排除重复的ip...
  12. Debian9系统上 基于Qt5.12.1 开发的QML界面程序 无法输入中文
  13. gettext实现多语言html中怎么处理,详解基于webpackgettext的前端多语言方案
  14. c++使用完成端口实现服务器的高性能并发
  15. 刷卡芯片CI520可直接PIN对PIN替换CV520支持SPI通讯接口
  16. java求第n项斐波那契_【剑指offer】数列——求斐波那契第n项
  17. 证件照修改宽高和体积的工具
  18. Vue-Waterfall-Easy插件详细使用教程
  19. 《数据时代 2025》报告-2017年版
  20. lock与unlock

热门文章

  1. 2020起重机械指挥模拟考试题库及起重机械指挥实操考试视频
  2. 图书管理系统之带验证码登录界面
  3. 实现财务自由 之 A 股上市公司的年报(年度财报)查阅查看、下载地址、以及下载的方法
  4. 太极图(JAVA实现)
  5. kali使用笔记本自带无线网卡_kali学习笔记之——wi read():Network is down问题
  6. 泰山OFFICE技术讲座:字体的kerning是什么意思
  7. 2020-10-17
  8. 站长付个人微信支付宝收款系统如何对接?
  9. 学会Zynq(11)RAW API的TCP和UDP编程
  10. 模仿百度首页的图片轮播