题面

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

  • 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. 学习makefile 的网址

    http://www.ruanyifeng.com/blog/2015/02/make.html http://blog.csdn.net/ruglcc/article/details/7814546 ...

  2. go 错误

    错误 Go 程序使用 error 值来表示错误状态. 与 fmt.Stringer 类似,`error` 类型是一个内建接口: type error interface { Error() strin ...

  3. NodeJS的环境搭建+传统ELmentui+vue开发

    ElementUI简介 我们学习VUE,知道它的核心思想式组件和数据驱动,但是每一个组件都需要自己编写模板,样式,添加事件,数据等是非常麻烦的, 所以饿了吗推出了基于VUE2.0的组件库,它的名称叫做 ...

  4. lambda的一些用法

    lambda在函数中调用时可以不用传入形参,当需要时才传入参数,方便一些场合中的使用(当参数一直变化时,仍然需要调用函数,可以采用如下方式).如以下代码所示. import numpy as np d ...

  5. vue-ueditor-wrap报错,vue ueditor 加载ueditor.config.js失败,请检查您的配置地址UEDITOR_HOME_URL填写是否正确!

    1.第一次报错后,仔细看了官方文档,少了第一步,下载UEditor源码,放到public目录(前提你用的是vue-cli 3.x的版本). 好那就下载,下载的是vue-ueditor-wrap作者修复 ...

  6. python OpenCV使用

    关于OpenCV简介  OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C ...

  7. 虹软人脸识别 - faceId及IR活体检测的更新介绍

    虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...

  8. shell 大型脚本工具开发实战

    拆分脚本功能,抽象函数 1.function get_all_group 返回进程组列表字符串 2.function get_all_process 返回进程名列表字符串"nginx htt ...

  9. JMeter测试clickhouse

    使用JMeter对clickhouse连接测试 1.测试计划 jmeter通过JDBC连接数据库需要先引入对应的驱动包,驱动包的版本要与服务器数据库版本一致,我用的驱动版本是:clickhouse-j ...

  10. dubbo spring 的使用

    1:项目的架构,本项目使用的maven,分为三个模块. api 为接口 , server 为服务端   consumer 为调用端 2:api的模块结构 该模块主要是定义接口和实体.没什么具体介绍的. ...