BZOJ3678 wangxz与OJ (平衡树 无旋treap)
题面
维护一个序列,支持以下操作:
- 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)的更多相关文章
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap
一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...
- 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树
!前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
- 【序列操作V】平衡树(无旋treap)
题目描述 维护一个队列,初始为空.依次加入 n(1≤n≤105)个数 ai(-109≤ai≤109),第 i(1≤i≤n)个数加入到当前序列第 bi(0≤bi≤当前序列长度)个数后面.输出最终队列. ...
- [Bzoj3223][Tyvj1729] 文艺平衡树(splay/无旋Treap)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3223 平衡树处理区间问题的入门题目,普通平衡树那道题在维护平衡树上是以每个数的值作为维护 ...
- [Bzoj3224][Tyvj1728] 普通平衡树(splay/无旋Treap)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 平衡树入门题,学习学习. splay(学习yyb巨佬) #include<b ...
随机推荐
- [转帖]Hive 快速入门(全面)
Hive 快速入门(全面) 2018-07-30 16:11:56 琅琊山二当家 阅读数 4343更多 分类专栏: hadoop 大数据 转载: https://www.codercto.com/ ...
- 解决windows下tomcat端口被占用
在平时开发中,电脑太卡或者项目比较大,有时候没有完全停止eclipse下的tomcat再次启动tomcat会出现端口占用情况,主要报如下错误: 具体解决方案: 打开windows下的命令窗口(快捷键: ...
- AVL排序二叉树树
AVL树第一部分,(插入) AVL树是一种自平衡二叉搜索树(BST),其中对于所有节点,左右子树的高度差不能超过1. 一个AVL树的示例 上面的树是AVL树,因为每个节点的左子树和右子树的高度之间的差 ...
- Web服务器和Tomcat
Web服务器常用: WebLogic:是BEA公司的推出的产品,现在已经被oracle收购,是目前应用最广泛的Web服务器,支持JavaEE规范,商用收费,开发者可以免费使用. WebSphere:I ...
- css特效实现透明渐变
知乎发现栏目上的标题图一般都是以下图方式展现的,很显然它是利用渐变去实现的.思路很有意思,主要是要有两方面的认知: 这张图其实可以分成两部分,右边控制图形和渐变,左边就是一张纯色背景,和渐变无关 透明 ...
- fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题
在PHP的日常开发中,时常会需要导出 excel ,一般我们会使用 PHPExcel ,性能强大,但是在数据量大的时候,phpexcel 性能差.内存溢出等各种不可控问题就会出现.因此,如果对导出样式 ...
- Java两整数相除保留两位小数
int num1 = 7; int num2 = 9; // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance(); / ...
- SPI时序
1.串行外围接口 高速.全双工的同步通信总线 一主多从 一般速度几十MHZ,最高可以工作在上百MHZ 2.连接图 3.工作模式
- C#使用任务并行库(TPL)
TPL(Task Parallel Library) 任务并行库 (TPL) 是 System.Threading和 System.Threading.Tasks 命名空间中的一组公共类型和 API. ...
- 将网站升级为https并自动续期Https证书。
Let's Encrypt Let's Encrypt 是一个由Internet Security Research Group (互联网安全研究组)提供的免费,自动化和开放的证书颁发机构. 它秉承着 ...