BZOJ3065。

去年用pascal 块链过了。。

今年来试了试非旋treap大法   注定被块链完爆

代码留这。

第一份 :辣鸡的  垃圾回收做法  跑得极慢

 #include <bits/stdc++.h>
#define M 70000
using namespace std;
struct W{int l,r,s,v,e;}a[];
struct O{int l,r,s,k;}b[];
int nex[],A[],n,m,rt,ans,l,r,x,k,t,c,T,d[]; char op[];
void CL(int u){
if (!u) return; --b[u].k;
if (!b[u].k) nex[u]=t,t=u;
}
void NEW(int &u){
int U=t; t=nex[t]; CL(u);
CL(b[U].l); CL(b[U].r);
b[U]=(O){b[u].l,b[u].r,b[u].s,};
u=U; ++b[b[u].l].k; ++b[b[u].r].k;
}
void add(int &u,int x,int p,int q,int X){
NEW(u); b[u].s+=X;
if (p<q)
if (x<=p+q>>) add(b[u].l,x,p,p+q>>,X);
else add(b[u].r,x,(p+q>>)+,q,X);
if (!b[u].s) {nex[u]=t; t=u; u=;}
}
void he(int &u,int v,int p,int q){
if (!v) return;
if (!u) {++b[u=v].k; return;}
NEW(u); b[u].s+=b[v].s;
he(b[u].l,b[v].l,p,p+q>>);
he(b[u].r,b[v].r,(p+q>>)+,q);
}
void up(int u){
a[u].s=a[a[u].l].s+a[a[u].r].s+;
CL(a[u].e); a[u].e=;
add(a[u].e,a[u].v,,M,);
he(a[u].e,a[a[u].l].e,,M);
he(a[u].e,a[a[u].r].e,,M);
}
void build(int &u,int p,int q){
if (p>q) return;
u=p+q>>; a[u].v=A[u];
build(a[u].l,p,u-);
build(a[u].r,u+,q);
up(u);
}
void split(int u,int k,int &l,int &r){
if (!k) {l=; r=u; return;}
if (k==a[u].s) {l=u; r=; return;}
if (k<=a[a[u].l].s) split(a[u].l,k,l,a[u].l),up(r=u);
else split(a[u].r,k-a[a[u].l].s-,a[u].r,r),up(l=u);
}
void join(int &u,int k){
if ((1ll+a[u].s)*rand()<=RAND_MAX){
int A,B; split(u,k,A,B);
a[T].l=A; a[T].r=B; up(u=T);
}else{
if (k<=a[a[u].l].s) join(a[u].l,k);
else join(a[u].r,k-a[a[u].l].s-);
add(a[u].e,a[T].v,,M,); ++a[u].s;
}
}
void mody(int u,int k){
if (a[a[u].l].s+==k)
r=a[u].v,a[u].v=l; else
if (k<=a[a[u].l].s) mody(a[u].l,k);
else mody(a[u].r,k-a[a[u].l].s-);
add(a[u].e,r,,M,-);
add(a[u].e,l,,M,);
}
void find(int u,int l,int r){
if (r<||l>a[u].s) return;
if (l<=&&a[u].s<=r) {d[++c]=a[u].e; return;}
if (l<=a[a[u].l].s+&&a[a[u].l].s<r)
add(d[],a[u].v,,M,);
find(a[u].l,l,r);
find(a[u].r,l-a[a[u].l].s-,r-a[a[u].l].s-);
}
int main(){
srand();
scanf("%d",&n);
for (int i=;i<=n;++i) scanf("%d",&A[i]);
for (int i=;i<;++i) nex[i]=i+;
t=; build(rt,,n); T=n;
scanf("%d",&m);
while (m--){
scanf("%s",op);
if (op[]=='Q'){
scanf("%d%d%d",&l,&r,&k);
l^=ans; r^=ans; k^=ans;
c=; find(rt,l,r);
l=; r=M; int tt=d[];
while (l<r){
x=;
for (int i=;i<=c;++i) x+=b[b[d[i]].l].s;
if (x<k){
l=(l+r>>)+; k-=x;
for (int i=;i<=c;++i) d[i]=b[d[i]].r;
}else{
r=l+r>>;
for (int i=;i<=c;++i) d[i]=b[d[i]].l;
}
}
CL(tt); d[]=;
printf("%d\n",ans=l);
}else
if (op[]=='M'){
scanf("%d%d",&k,&l);
l^=ans; k^=ans;
mody(rt,k);
}else{
scanf("%d%d",&l,&k);
l^=ans; k^=ans; --l;
++T; a[T].v=k;
join(rt,l);
}
}
return ;
}

奈奈

第二份:暴力回收,暴力合并,快了许多

 #include <bits/stdc++.h>
#define M 70000
#define S 15000000
using namespace std;
int D[S],rt,t,d[],m,x,l,r,k,n,ans,Q; char OP;
struct O{int l,r,s,v,e;}a[];
struct U{int l,r,s;}b[S];
void cl(int &u){
if (!u) return;
cl(b[u].l); cl(b[u].r);
D[++t]=u; b[u].s=; u=;
}
void add(int &u,int p,int q,int x){
if (!u) u=D[t--]; ++b[u].s;
if (p!=q)
if (x<=p+q>>) add(b[u].l,p,p+q>>,x);
else add(b[u].r,(p+q>>)+,q,x);
}
void del(int &u,int p,int q,int x){
--b[u].s;
if (p!=q)
if (x<=p+q>>) del(b[u].l,p,p+q>>,x);
else del(b[u].r,(p+q>>)+,q,x);
if (!b[u].s) D[++t]=u,u=;
}
int he(int l,int r){
if (!l&&!r) return ;
int u=D[t--];
b[u].s=b[l].s+b[r].s;
b[u].l=he(b[l].l,b[r].l);
b[u].r=he(b[l].r,b[r].r);
return u;
}
void up(int u){
a[u].s=a[a[u].l].s+a[a[u].r].s+;
cl(a[u].e);
a[u].e=he(a[a[u].l].e,a[a[u].r].e);
add(a[u].e,,M,a[u].v);
}
void build(int &u,int p,int q){
if (p>q) return;
u=p+q>>;
build(a[u].l,p,u-);
build(a[u].r,u+,q);
up(u);
}
void find(int u,int l,int r){
if (r<||l>a[u].s) return;
if (l<=&&a[u].s<=r) {d[++m]=a[u].e; return;}
int i=a[a[u].l].s+;
if (l<=i&&i<=r)
add(d[],,M,a[u].v);
find(a[u].l,l,r);
find(a[u].r,l-i,r-i);
}
void mody(int u){
int i=a[a[u].l].s+;
if (i==k) l=a[u].v,a[u].v=r; else
if (k<i) mody(a[u].l);
else k-=i,mody(a[u].r);
del(a[u].e,,M,l);
add(a[u].e,,M,r);
}
void split(int u,int k,int &l,int &r){
if (!k) {l=,r=u; return;}
if (k==a[u].s) {l=u,r=; return;}
if (k<=a[a[u].l].s){
split(a[u].l,k,l,a[u].l); up(r=u);
}else{
split(a[u].r,k-a[a[u].l].s-,a[u].r,r); up(l=u);
}
}
void join(int &u){
if ((1ll+a[u].s)*rand()<=RAND_MAX){
int A,B; split(u,k,A,B);
a[n].l=A; a[n].r=B; up(u=n);
}else{
if (k<=a[a[u].l].s) join(a[u].l);
else k-=a[a[u].l].s+,join(a[u].r);
add(a[u].e,,M,a[n].v); ++a[u].s;
}
}
int main(){
srand();
scanf("%d",&n);
for (int i=;i<=n;++i) scanf("%d",&a[i].v);
for (int i=S-;i;--i) D[i]=++t;
build(rt,,n);
scanf("%d",&Q);
while (Q--){
scanf("\n%c",&OP);
if (OP=='Q'){
scanf("%d%d%d",&l,&r,&k);
l^=ans; r^=ans; k^=ans;
m=; find(rt,l,r);
l=; r=M; int tt=d[];
while (l<r){
x=;
for (int i=;i<=m;++i) x+=b[b[d[i]].l].s;
if (x<k){
l=(l+r>>)+; k-=x;
for (int i=;i<=m;++i) d[i]=b[d[i]].r;
}else{
r=l+r>>;
for (int i=;i<=m;++i) d[i]=b[d[i]].l;
}
}
cl(d[]=tt); printf("%d\n",ans=l);
}else
if (OP=='M'){
scanf("%d%d",&k,&r);
k^=ans; r^=ans;
mody(rt);
}else{
scanf("%d%d",&k,&x);
k^=ans; a[++n].v=x^ans;
--k; join(rt);
}
}
return ;
}

雲珠桜

非旋treap套线段树的更多相关文章

  1. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  2. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

  3. BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)

    BZOJ1901: 线段树套线段树做法: (外层线段树 里层动态开节点的权值线段树) 有一个小小的trick 可以省掉二分变成nlog^2n的 就是把查询的区间都取出来- logn个一起走- 2016 ...

  4. 2018.08.06 bzoj1500: [NOI2005]维修数列(非旋treap)

    传送门 平衡树好题. 我仍然是用的fhqtreap,感觉速度还行. 维护也比线段树splay什么的写起来简单. %%%非旋treap大法好. 代码: #include<bits/stdc++.h ...

  5. 非旋Treap及其可持久化

    平衡树这种东西,我只会splay.splay比较好理解,并且好打,操作方便. 我以前学过SBT,但并不是很理解,所以就忘了怎么打了. 许多用平衡树的问题其实可以用线段树来解决,我们真正打平衡树的时候一 ...

  6. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

  7. 2827: 千山鸟飞绝 非旋treap

    国际惯例的题面:看起来很不可做的样子,我们先来整理一下题意吧.就是,维护每个点曾经拥有过的最大的两个属性值,支持把点的位置移动.我们用map对每个位置进行离散化,对每个位置建立一个平衡树.为了方便分离 ...

  8. 非旋Treap总结 : 快过Splay 好用过传统Treap

    非旋$Treap$ 其高级名字叫$Fhq\ Treap$,既然叫$Treap$,它一定满足了$Treap$的性质(虽然可能来看这篇的人一定知道$Treap$,但我还是多说几句:$Fhp\ Treap$ ...

  9. 【bzoj4785】[Zjoi2017]树状数组 线段树套线段树

    题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作 ...

随机推荐

  1. UVA571 - Jugs(数论)

    UVA571 - Jugs(数论) 题目链接 题目大意:给你A和B的水杯.给你三种操作:fill X:把X杯里面加满水.empty X:把X杯中的水清空.pour X Y 把X的水倒入Y中直到一方满或 ...

  2. Debian Customer PPA RFC (by quqi99)

    作者:张华  发表于:2016-01-13版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) Pre ...

  3. What is love ? and how to do?

    1.匹配度(matched-degree): 灵性 文化(东西方.南北方) 智力 审美 性 2.对待差异的原则(The principle of difference): 抓大放小 求同存异 心脑并用 ...

  4. 小谈Vim打开文件开头的&lt;feff&gt;

    在本地Windows机上开发的PHP程序上传到linuxserver上后,通过浏览器訪问对应接口.发现返回的数据前多了一个莫名的字符'-',甚为不解.之后通过网络抓包的方式,查看到接口返回数据前多了 ...

  5. 【西祠日志】【07】努力努力,找资料,思考,怎么做asp图片上传

    [西祠日志][07]努力努力,找资料.思考.怎么做asp图片上传  (2015.07.23周四) 今天忘了带本子.直接写在书上了笔记,晚点还是夹在本子里. 学了这么久的web应用,一直都没时间去做一点 ...

  6. 邻接表的使用及和vector的比較

    这几天碰到一些对建边要求挺高的题目.而vector不好建边,所以学习了邻接表.. 以下是我对邻接表的一些看法. 邻接表的储存方式 邻接表就是就是每一个节点的一个链表,而且是头插法建的链表,这里我们首先 ...

  7. 批量杀死mysql进程

    http://www.chengyongxu.com/blog/%E6%89%B9%E9%87%8F%E6%9D%80%E6%AD%BBmysql%E8%BF%9B%E7%A8%8B/

  8. svn 命令个

    svn 命令行下常用的几个命令 标签: svnpathdelete工作urlfile 2011-11-28 08:16 128627人阅读 评论(1) 收藏 举报  分类: 版本控制(8)  版权声明 ...

  9. kubernetes集群管理之通过jq来截取属性

    系列目录 首先要声明,这里的jq并不是批前端框架里的jquery,而是一个处理json的命令行工具. jq工具相比yq,它更加成熟,功能也更加强大,主要表现在以下几个方面 支持递归查找(我点对我们平时 ...

  10. ajax短信验证码-mvc

    <script type="text/javascript"> function SendMessage() { var phoneNumberInput = docu ...