题面

维护一个序列,支持以下操作:

  • 1.在某个位置插入一段值连续的数。
  • 2.删除在当前序列位置连续的一段数。
  • 3.查询某个位置的数是多少。

题解

显然平衡树,一个点维护一段值连续的数,如果插入或者删除操作需要分裂这个点,就直接分裂。每次插入最多只会分裂1个点,每次删除最多分裂2个点,所以时间复杂度是O(nlogn)O(nlogn)O(nlogn)的。

我写的无旋treap。

CODE

#include <bits/stdc++.h>
using namespace std;
inline void rd(int &x) {
char ch; int flg=1; for(;!isdigit(ch=getchar());)if(ch=='-')flg=-flg;
for(x=ch-'0';isdigit(ch=getchar());)x=x*10+ch-'0';x*=flg;
}
const int MAXN = 100005;
int n, m;
int tot, rt, vl[MAXN], vr[MAXN], val[MAXN], lc[MAXN], rc[MAXN], sum[MAXN];
inline void upd(int x) { sum[x] = sum[lc[x]] + sum[rc[x]] + (vr[x]-vl[x]+1); }
void merge(int &x, int l, int r) {
if(!l || !r) { x = l + r; return; }
if(val[l] < val[r]) x = l, merge(rc[x], rc[l], r);
else x = r, merge(lc[x], l, lc[r]);
upd(x);
}
void split(int x, int &l, int &r, int k) {
if(!x) { l = r = 0; return; }
if(k <= sum[lc[x]]) r = x, split(lc[x], l, lc[r], k);
else if(k >= sum[lc[x]]+(vr[x]-vl[x]+1)) l = x, split(rc[x], rc[l], r, k-(sum[lc[x]]+(vr[x]-vl[x]+1)));
else {
int L = vl[x], R = vr[x], ls = lc[x], rs = rc[x], vrd = val[x];
l = x; vl[l] = L, vr[l] = L + k-sum[lc[x]] - 1, lc[l] = ls, rc[l] = 0; val[l] = vrd; upd(l);
r = ++tot; vl[r] = L + k-sum[lc[x]], vr[r] = R, lc[r] = 0, rc[r] = rs; val[r] = vrd; upd(r);
return;
}
upd(x);
}
int main() {
srand(19260817);
rd(n), rd(m);
for(int i = 1, x; i <= n; ++i) {
rd(x);
++tot; vl[tot] = vr[tot] = x, sum[tot] = 1, val[tot] = 1ll*rand()*rand()%1000000000;
merge(rt, rt, tot);
}
int op, a, b, c, L, R, mid;
while(m--) {
rd(op);
if(op == 0) {
rd(c), rd(a), rd(b);
split(rt, L, R, c);
++tot; vl[tot] = a, vr[tot] = b, sum[tot] = b-a+1, val[tot] = 1ll*rand()*rand()%1000000000;
merge(L, L, tot), merge(rt, L, R);
}
if(op == 1) {
rd(a), rd(b);
split(rt, L, R, b);
split(L, L, mid, a-1);
merge(rt, L, R);
}
if(op == 2) {
rd(c);
split(rt, L, R, c);
split(L, L, mid, c-1);
printf("%d\n", vl[mid]);
merge(L, L, mid), merge(rt, L, R);
}
}
}

BZOJ3678 wangxz与OJ (平衡树 无旋treap)的更多相关文章

  1. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  2. [BZOJ3223]文艺平衡树 无旋Treap

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  3. BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap

    一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...

  4. 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树

    !前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...

  5. [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...

  6. [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...

  7. 【序列操作V】平衡树(无旋treap)

    题目描述 维护一个队列,初始为空.依次加入 n(1≤n≤105)个数 ai(-109≤ai≤109),第 i(1≤i≤n)个数加入到当前序列第 bi(0≤bi≤当前序列长度)个数后面.输出最终队列. ...

  8. [Bzoj3223][Tyvj1729] 文艺平衡树(splay/无旋Treap)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3223 平衡树处理区间问题的入门题目,普通平衡树那道题在维护平衡树上是以每个数的值作为维护 ...

  9. [Bzoj3224][Tyvj1728] 普通平衡树(splay/无旋Treap)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 平衡树入门题,学习学习. splay(学习yyb巨佬) #include<b ...

随机推荐

  1. [转帖]java架构之路-(面试篇)JVM虚拟机面试大全

    java架构之路-(面试篇)JVM虚拟机面试大全 https://www.cnblogs.com/cxiaocai/p/11634918.html   下文连接比较多啊,都是我过整理的博客,很多答案都 ...

  2. Spring+SpringMVC+Mybatis(SSM)框架集成搭建

    Spring+SpringMVC+Mybatis框架集成搭建教程 一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以 ...

  3. Linux基础-07-系统的初始化和服务

    1. Linux系统引导的顺序 1) Linux系统引导的顺序:                             其中,BIOS的工作是检查计算机的硬件设备,如CPU.内存和风扇速度等: MB ...

  4. Vue使用指南(三)

    组件 '''1.根组件:new Vue()创建的组件,一般不明确自身的模板,模板就采用挂载点2.局部组件: local_component = {}2.全局组件: Vue.component({})' ...

  5. 在论坛中出现的比较难的sql问题:25(字符串拆分3)

    原文:在论坛中出现的比较难的sql问题:25(字符串拆分3) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下 ...

  6. Asp.Net 加载不同项目程序集

    我们做项目时有时候不想添加别的项目的引用,但是那个项目又必须在 Global 中进行注册 最常见的就是插件机制,参考: https://shazwazza.com/post/Developing-a- ...

  7. google mock C++单元测试框架

    转:google mock C++单元测试框架 2012-03-12 09:33:59 http://blog.chinaunix.net/uid-25748718-id-3129590.html G ...

  8. JSON--stringify() 和 JSON--parse() 方法

    序列化:stringify()将JavaScript对象序列号为JSON字符串反序列化:parse()将JSON字符串解析为原生JavaScript值 序列化选项:JSON.stringify()除了 ...

  9. Oracle数据库账户口令复杂度-等保测评之身份鉴别

    1.     默认情况下数据库没有启用密码验证函数功能,可通过下面sql查询 SQL> select limit from dba_profiles where RESOURCE_NAME='P ...

  10. Servlet快速入门:第一个Servlet程序

    Servlet是整个JavaWeb开发的核心,同时也是一套规范,即公共接口.用于处理客户端发来的请求并作出响应.通常情况下我们会发送不同的请求并交由不同的处理程序来处理,例如处理用户信息和处理订单信息 ...