BZOJ3678 wangxz与OJ (平衡树 无旋treap)

题面

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

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

题解

显然平衡树,一个点维护一段值连续的数,如果插入或者删除操作需要分裂这个点,就直接分裂。每次插入最多只会分裂1个点,每次删除最多分裂2个点,所以时间复杂度是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); 
		}
	}
}
posted @ 2019-12-14 14:50  _Ark  阅读(102)  评论(0编辑  收藏  举报