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)的次数,达到相同的结果,详细会在以后的若干篇博客提及

  • 相关阅读:
    线程交互
    线程死锁
    多线程的同步-sychronized
    线程常见方法
    创建多线程
    消费!
    Redis基本认识
    在右键菜单中加入"在IDEA中打开" (Open in IDEA)
    安装coc.nvim时 报[coc.nvim] javascript file not found 错误的解决方案
    汇编语言的种类
  • 原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9311408.html
Copyright © 2011-2022 走看看