首页 > 其他分享 > BST-Treap名次树指针实现板子 Ver2.0

BST-Treap名次树指针实现板子 Ver2.0

时间:2023-10-15 18:55:54浏览次数:44  
标签:Node sz ch return Ver2.0 BST Treap int null

为了更好的阅读体验,请点击这里

这里只有板子没有原理QWQ

可实现

1.插入 x 数

2.删除 x 数(若有多个相同的数,只删除一个)

3.查询 x 数的排名(排名定义为比当前数小的数的个数 +1)

4.查询排名为 x 的数

5.求 x 的前驱(前驱定义为小于 x,且最大的数)

6.求 x 的后继(后继定义为大于 x,且最小的数)

原题 https://www.luogu.com.cn/problem/P3369

Ver1.0 基础上把指针板子修正成 C++ 的类方法版本了,null 指针使用 static 静态量来处理。然后仅需要实现类的方法中包含小于号的重载就可以使用这个名次树了。另外,这里所有涉及到的名次都是 1-index 的。

#include <bits/stdc++.h>
using namespace std;

template<class T> class Treap {
public:
	Treap() {}
	void insert(T x) { _insert(root, x);}
	void erase(T x) { _erase(root, x);}
	int rank(T x) { return _GetRankOfVal(root, x);}
	T kth(int x) { return _GetValOfRank(root, x);}
	T pre(T x) { Node *ans = null; query_pre(root, x, ans); return ans->v;}
	T nxt(T x) { Node *ans = null; query_nxt(root, x, ans); return ans->v;}
	bool empty() { return root->sz == 0;}
	int size() { return root -> sz;}
private:
	struct Node {
		Node *ch[2];
		T v;
		int sz, r, cnt;
		Node() { sz = r = cnt = 0;}
		Node(const T &v):v(v) { ch[0] = ch[1] = null; r=rand(); sz = cnt = 1;}
		bool operator < (const Node& rhs) const { return r < rhs.r;}
		int cmp(const T& x) const {
			if(!(x < v || v < x)) return -1;
			return v < x;
		}
		void upd() { sz = ch[0] -> sz + ch[1] -> sz + cnt;}
	};

	static Node *null;
	Node *root = null;

	void rotate(Node* &o, const int &d) {
		Node *k = o->ch[d^1]; o->ch[d^1] = k->ch[d]; k->ch[d] = o;
		o->upd(); k->upd(); o = k;
	}
	void _insert(Node* &o, const T &x) {
		if (o == null) { o = new Node(x); return;}
		o->sz++;
		int d = o->cmp(x);
		if (d == -1) {o->cnt++; return;}
		_insert(o->ch[d], x);
		if (o->r < o->ch[d]->r) rotate(o, d^1);
		o -> upd();
	}
	void _erase(Node* &o, const T &x) {
		if (o == null) return;
		int d = o->cmp(x);
		if (d == -1) {
			Node* u = o;
			if (o->cnt > 1) {o->cnt--; o->sz--; return;}
			if (o->ch[0] != null && o->ch[1] != null) {
				int d2 = o->ch[0]->r > o->ch[1]->r;
				rotate(o, d2); _erase(o->ch[d2], x);
			}
			else {
				if (o->ch[0] == null) o = o->ch[1]; else o = o->ch[0];
				delete u;
			}
		}
		else _erase(o->ch[d],x);
		if(o != null) o->upd();
	}
	int _GetRankOfVal(Node *&o, const T &x) {
		if (o == null) return 1;
		if (!(o->v < x || x < o->v)) return o->ch[0]->sz + 1;
		else if (o->v < x) return o->ch[0]->sz + o->cnt + _GetRankOfVal(o->ch[1], x);
		else return _GetRankOfVal(o->ch[0], x);
	}
	T _GetValOfRank(Node *&o, const int &k) {
		if (o == null) return T();
		if (!(o->ch[0]->sz < k)) return _GetValOfRank(o->ch[0], k);
		else if(o->ch[0]->sz + o->cnt < k)
			return _GetValOfRank(o->ch[1], k - o->ch[0]->sz - o->cnt);
		return o->v;
	}

	void query_pre(Node *&o, const T &x, Node *&ans) {
		if (o == null) return;
		if (o->v < x) { ans = o; query_pre(o->ch[1], x, ans);}
		else query_pre(o->ch[0], x, ans);
	}
	void query_nxt(Node *&o, const T &x, Node *&ans) {
		if (o == null) return;
		if (x < o->v) { ans = o; query_nxt(o->ch[0], x, ans);}
		else query_nxt(o->ch[1], x, ans);
	}
};
template<class T> typename Treap<T>::Node* Treap<T>::null = new Node();

struct AAA {
	int a;
	// AAA(int a = 0):a(a) {}
	bool operator < (const AAA& rhs) const {
		return a < rhs.a;
	}
};

int main() {
#ifdef LOCAL
	freopen("test.in", "r", stdin);
#endif
	int n; scanf("%d",&n);
    int op,y;
	Treap<AAA> S;
    for(int i=0;i<n;i++) {
        scanf("%d%d",&op,&y);
		AAA x = AAA{y};
        switch(op) {
            case 1: S.insert(x); break;
            case 2: S.erase(x); break;
            case 3: printf("%d\n",S.rank(x)); break;
            case 4: printf("%d\n",S.kth(y).a); break;
            case 5: printf("%d\n",S.pre(x).a); break;
            case 6: printf("%d\n",S.nxt(x).a); break;
        }
    }
	return 0;
} 

标签:Node,sz,ch,return,Ver2.0,BST,Treap,int,null
From: https://www.cnblogs.com/bringlu/p/17765973.html

相关文章

  • Webstorm 2023.1最新安装教程(附激活码,亲测有效)
    **第一步:下载最新的Webstorm2023.1.2版本安装包****我们先从Webstorm官网下载Webstorm2023.1.2版本的安装包,官网链接如下:https://www.jetbrains.com/webstorm/download点击download下载,静心等待其下载完毕即可。**第二步:开始安装Webstorm2023.1.2版本****2.安装目......
  • Codeforces Round 685 (Div. 2) B. Non-Substring Subsequence
    对于一个长为\(n\)的\(01\)字符串\(s\)有\(n\)个询问。第\(i\)个询问被\(l_i,r_i\)描述\(1\leql_i<r_i\leqn\)。对于每个询问,你需要确定\(s\)中是否存在一个子序列等同于子串\(s[l_i\cdotsr_i]\)。显然子序列可以和子串仅有一个字符不相同。于是\(s......
  • CF938F Erasing Substrings 题解
    ErasingSubstrings一个神奇的想法是设\(f_{i,j}\)表示在位置\([1,i]\)中,我们删去了长度为\(2^k(k\inj)\)的一些串,所能得到的最小字典序。使用二分加哈希可以做到\(O(n^2\log^2n)\),无法承受。发现对于状态\(f_{i,j}\),它已经确定了\(i-j\)位的串,因为所有\(\inj\)......
  • Programming abstractions in C阅读笔记:p176-p178
    《ProgrammingAbstractionsInC》学习第59天,p176-p178总结。一、技术总结1.addtivesequencestn=tn-1+tn-2序列:3,7,10,17,27,44,71,115,186,301,487,788,1275,...p177,Asageneralclass,thesequencesthatfollowthispatternarecalledadditivesequen......
  • Programming abstractions in C阅读笔记:p176-p178
    《ProgrammingAbstractionsInC》学习第59天,p176-p178总结。一、技术总结1.addtivesequencestn=tn-1+tn-2序列:3,7,10,17,27,44,71,115,186,301,487,788,1275,...p177,Asageneralclass,thesequencesthatfollowthispatternarecalledadditive......
  • 抽象类(abstract)和接口(interface)的区别
    抽象类(abstract)和接口(interface)的区别抽象类(abstract)只有方法名和参数,没有方法体抽象方法一般存在于抽象类中有抽象方法的一定是抽象类抽象类里不一定有抽象方法抽象类被别的类继承(继承只能单继承),子类一定要重写抽象类中的抽象方法,如果子类也是抽象类则不用重写抽......
  • envsubst命令
    目录envsubst是一个命令行工具,用于替换环境变量中的占位符。当在Shell脚本或配置文件中使用环境变量时,可以通过以下方式使用envsubst进行占位符替换:$exportNAME="Alice"$exportAGE="25"$echo"Mynameis$NAMEandIam$AGEyearsold."MynameisAliceandIam......
  • Programming abstractions in C阅读笔记:p166-p175
    《ProgrammingAbstractionsInC》学习第58天,p166-p175总结。一、技术总结1.斐波那契数列(FibonacciSequenc)(1)斐波那契数列来源斐波那契数列来自于《LiberAbaci》一书里兔子繁殖问题,相关资料很多,这里不赘述。(2)关于《LiberAbaci》一书《LiberAbaci》——Liber:abook......
  • xpath 处理自增的id manage11 使用表达式 //*[starts-with(@id, "manage") and
      //*[starts-with(@id,"manage")andnumber(substring-after(@id,"manage"))=11] 1.使用starts-with()函数选择以"manage"开头的所有元素,2.使用substring-after()函数获取ID中"manage"后面的部分。3.使用number()函数将这部分转换为数字,4.使用逻辑运算符and来判断......
  • UE5 substrate flake normal map 亚克力
    前言本篇将运用UE5的substrate系统制作一个亚克力圆盘效果如下FlakeNormalMap上图中圆盘内的彩色小点是通过噪声函数flake(个人翻译为薄片)normalmap生成的,该函数基于[CellularNoise]https://www.cnblogs.com/chenglixue/p/17742395.html用途:汽车喷漆,及各种细小的......