zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ",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)的次数,达到相同的结果,详细会在以后的若干篇博客提及

  • 相关阅读:
    STL与泛型编程-练习2-GeekBand
    HashSet
    JAVA集合
    分布式锁1 Java常用技术方案
    JAVA 锁
    JAVA多线程二
    JAVA多线程一
    Redis pipeline and list
    mongo 安装
    Intersection of Two Arrays
  • 原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9311408.html
Copyright © 2011-2022 走看看