BZOJ3678 wangxz与OJ (平衡树 无旋treap)
题面
维护一个序列,支持以下操作:
- 1.在某个位置插入一段值连续的数。
- 2.删除在当前序列位置连续的一段数。
- 3.查询某个位置的数是多少。
题解
显然平衡树,一个点维护一段值连续的数,如果插入或者删除操作需要分裂这个点,就直接分裂。每次插入最多只会分裂1个点,每次删除最多分裂2个点,所以时间复杂度是的。
我写的无旋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);
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用