Splay 区间操作(二)

首先基本操作如下:

删除第rank个点

void Remove(int id){//删除第rank个点
	rank++;
	int x = find(root, rank - 1);
	splay(x, 0);
	x = find(root, rank + 1);
	splay(x, root);
	ch[ch[root][1]][0] = 0;
	pushup(ch[root][1]),pushup(root);
	}

删除编号为id的点

void Remove(int id){//删除编号为id的点
	splay(id, 0);
	int rank = size[ch[root][0]] + 1;
	int x = find(root, rank - 1);
	splay(x, 0);
	x = find(root, rank + 1);//printf("root=%d\n", root);
	splay(x, root);
	ch[ch[root][1]][0] = 0;
	pushup(ch[root][1]),pushup(root);
	}

插入变成第rank个点

void insert(int rank,int v){//插入变成第rank个点
	int x = find(root, rank);
	splay(x, 0);//printf("size=%d\n",size[ch[root][0]]);
	x = find(root, rank + 1);
	splay(x, root);
	ch[ch[root][1]][0] = New(ch[root][1], v);
	pushup(ch[root][1]),pushup(root);
	}

区间翻转在上一篇博客有了。值得注意的是:\(Splay\)常数较大,有时一个操作需要多个基本操作一起并用,大大降低效率。所以在条件允许的情况下,我们尽量减少\(Splay\)的次数,达到相同的结果,详细会在以后的若干篇博客提及

posted @ 2018-07-15 00:05  Tony_Double_Sky  阅读(228)  评论(0编辑  收藏  举报