褥师此 发表于 2025-6-4 19:32:56

随用随取的平衡树板子!

目前已实现无旋Treap和Splay。
使用说明及注意事项:


[*]使用命名空间+结构体进行封装,使用时只需jser::Treap或using namespace jser即可。例如:
/*
way 1
*/
using namespace jser;
Treap tree;
/*
way 2
*/
jser::Splay tree;
[*]Treap随机数生成采用random_device和mt19937,在某些评测姬上可能不适用,可以换用rand(注意数据范围)或手写随机数生成器。
[*]使用数据范围宏定义,在结构体开头有数组大小N的宏定义,方便大家修改数据范围。
[*]多处使用register,C++17及以上不适用,记得更换。
[*]存储数值为int类,注意是否需要开long long。
功能介绍


[*]void push(int x)加入一个 \(x\) 值。
[*]void pop(int x)删除一个 \(x\) 值。
[*]int rank(int x)返回 \(x\) 在数列里的排名。
[*]int kth(int x)返回在数列中排名为 \(x\) 的数值。
[*]int pre(int x)返回数值 \(x\) 在数列中的前驱。如果没有,返回负无穷。
[*]int next(int x)返回数值 \(x\) 在数列中的后继。如果没有,返回正无穷。
代码时刻

教授の全局宏定义(不喜可换):
#define il inline
#define ri register int
#define inf 0x3f3f3f3f正片:
namespace jser{        random_device rd;        long long sed=rd();        mt19937 rad(time((time_t*)&sed));        il long long getrand(long long x,long long y)        {                return rad()%(y-x+1)+x;        }        struct Treap        {                #define N 200002                int root,cnt;                int val,siz,pri,lson,rson;                il void pushup(int x)                {                        siz=siz]+siz]+1;                }                il int merge(int x,int y)                {                        if(!x||!y)                        {                                return x|y;                        }                        if(pri
页: [1]
查看完整版本: 随用随取的平衡树板子!