首页 > 其他分享 >FHQ_Treap 板子

FHQ_Treap 板子

时间:2023-05-14 14:11:59浏览次数:38  
标签:Node bg root 板子 Treap ls sm np FHQ

namespace FHQ{
#define siz(x) ({Node *_a_ = x; _a_ == np ? 0 : _a_->sz; })
struct Node{
	Node *ls, *rs;
	char val; int pri;
	int sz;
	void updsz(){
		sz = 1 + siz(ls) + siz(rs);
	}
} cs[N];
void output(Node *root){
	if(root == np) return;
	output(root->ls);
	putchar(root->val);
#if DEBUG
	fflush(stdout);
#endif
	output(root->rs);
}
Node* merge(Node* sm, Node* bg){
	if(sm == np || bg == np) { return sm == np ? bg : sm; }
	if(sm->pri < bg->pri){
		sm->rs = merge(sm->rs, bg);
		sm->updsz();
		return sm;
	} else {
		bg->ls = merge(sm, bg->ls);
		bg->updsz();
		return bg;
	}
}
void splitrk(Node* root, int rk, Node*& ret1, Node*& ret2){
	if(root == np){
		ret1 = ret2 = np;
		return;
	}
	if(siz(root->ls) == rk-1){
		ret1 = root->ls;
		ret2 = root;
		root->ls = np;
		root->updsz();
	} else if(siz(root->ls) < rk-1){
		Node* r1, *r2;
		splitrk(root->rs, rk-siz(root->ls)-1, r1, r2);
		root->rs = r1;
		root->updsz();
		ret2 = r2;
		ret1 = root;
	} else {
		Node *r1, *r2;
		splitrk(root->ls, rk, r1, r2);
		root->ls = r2;
		root->updsz();
		ret1 = r1;
		ret2 = root;
	}
}
Node* nnod(char v){
	static int cnt = 0;
	cnt++;
	Node* p = &cs[cnt-1];
	p->ls = p->rs = np;
	p->val = v;
	p->pri = rand();
	p->sz = 1;
	return p;
}
}

标签:Node,bg,root,板子,Treap,ls,sm,np,FHQ
From: https://www.cnblogs.com/x383494/p/17399222.html

相关文章

  • ACM板子(1)(缺最短路、计算几何、数学、高级数据结构)
    ACM板子(1)(缺最短路、计算几何、数学、高级数据结构)快排、归并voidquicksort(int*num,intl,intr){if(r<=l)return;intx=l-1,y=r+1,z=num[l+r>>1];while(x<y){dox++;while(num[x]<z);doy--;while(num[y]>z);if(x<y)s......
  • 折腾野火linux板子学到的东西
    添加编译器相关添加交叉工具链,需要修改/etc/profile修改完成后,需要立即生效(不需要重启),可以使用如下命令:source/etc/profile 如果遇到环境变量配置以后,能够找到版本(也就是说输入命令的开头按tab以后能够出现补全),如果还有问题,这是因为64位下运行32编译器缺少相应的库文......
  • KMP板子
    P3426#include<cstdio>#include<cstring>#include<vector>#definesdstd::namespacem{//}constexprintLEN=1e6;sdvector<int>prepare(char*a){ intlen=strlen(a); sdvector<int>ret(len); for(inti=1;a[i];++i......
  • 高精度板子
    百度百科> #include<iostream>#include<vector>#include<string>usingnamespacestd;structwint:vector<int>{wint(intn=0){push_back(n);check();}wint&check()//{while(!empty......
  • Treap 学习笔记
    一、TreapTreap是一种通过旋转操作维护性质的二叉搜索树。定义详见要维护的东西还是一样,对于每个节点,要维护它的左右儿子,子树大小,还有权值和随机的优先级(这样才能保证树的高度是\(O(\logn)\)级别的)。注意:旋转、分裂、伸展什么的都是手段,维持平衡树的2个性质才是目的。......
  • 换根 DP 板子
    以前一直以为这玩意是随机应变的。结果还真能总结出板子。当然也有一定的局限性,比如\(dp\)值必须\(O(1)\)算。但不影响正常使用。ins:向\(k\)的子树信息中插入/删除\(nx\)的子树信息。这里的子树在dfs1中是指以\(1\)为根的子树;dfs2中是指以\(k\)为根。recalc......
  • 「学习笔记」重修 FHQ-treap
    无旋treap的操作方式使得它天生支持维护序列、可持久化等特性。无旋treap又称分裂合并treap。它仅有两种核心操作,即为分裂与合并。通过这两种操作,在很多情况下可以比旋转treap更方便的实现别的操作。变量与宏定义#definelsch[u][0]#definersch[u][1]intcnt,r......
  • 几个板子
    FHQTreap普通平衡树structtreap{ intl,r,siz,dat,val;}tr[N];intidx,rt;intget_new(intval){ tr[++idx].val=val; tr[idx].dat=rand(); tr[idx].siz=1; returnidx;}voidpushup(intu){ tr[u].siz=tr[tr[u].l].siz+tr[tr[u].r].siz+1;......
  • 线段树区间和,区间修改,区间查询板子
    #include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;#definelson(nd<<1)#definerson(nd<<1|1)#definemid(l+r>>1)constintN=1e5+5;intsum[N<<2],lazy[N<<2];inta[N];voidbuild(intnd,in......
  • 为什么有的板子不用设置arch、cross_compile环境变量
    学习地址......