ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FHQ-Treap

2021-09-19 15:00:58  阅读:145  来源: 互联网

标签:www int com Treap maxn FHQ


【算法简介】
FHQ−Treap,也称非旋 Treap,由范浩强提出。顾名思义,FHQ−Treap 就是不需要通过旋转,而是通过  split 和 merge 维护的 Treap。FHQ−Treap 与 Treap 的另外一个区别是 FHQ−Treap 可持久化。

【问题描述】
题目来源:
普通平衡树 - 洛谷P3369
普通平衡树 - AcWing253

【算法代码】

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

const int maxn=500005;
int ch[maxn][2],val[maxn],pri[maxn],cnt[maxn],id;

int read() { //fast read
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9') { //!isdigit(c)
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0' && c<='9') { //isdigit(c)
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

void update(int x) {
	cnt[x]=1+cnt[ch[x][0]]+cnt[ch[x][1]];
}

int new_node(int v) {
	cnt[++id]=1;
	val[id]=v;
	pri[id]=rand();
	return id;
}

int merge(int x,int y) {
	if (!x || !y) return x+y;
	if (pri[x]<pri[y]) {
		ch[x][1]=merge(ch[x][1],y);
		update(x);
		return x;
	} else {
		ch[y][0]=merge(x,ch[y][0]);
		update(y);
		return y;
	}
}

void split(int cur,int k,int &x,int &y) {
	if (!cur) x=y=0;
	else {
		if (val[cur]<=k)
			x=cur,split(ch[cur][1],k,ch[cur][1],y);
		else
			y=cur,split(ch[cur][0],k,x,ch[cur][0]);
		update(cur);
	}
}

int kth(int cur,int k) {
	while(1) {
		if (k<=cnt[ch[cur][0]])
			cur=ch[cur][0];
		else if (k==cnt[ch[cur][0]]+1)
			return cur;
		else
			k-=cnt[ch[cur][0]]+1,cur=ch[cur][1];
	}
}

int main() {
	int T,opt,x,y,z,a,b,root=0;
	T=read();
	while(T--) {
		opt=read(),a=read();
		if (opt==1) {
			split(root,a,x,y);
			root=merge(merge(x,new_node(a)),y);
		} else if (opt==2) {
			split(root,a,x,z);
			split(x,a-1,x,y);
			y=merge(ch[y][0],ch[y][1]);
			root=merge(merge(x,y),z);
		} else if (opt==3) {
			split(root,a-1,x,y);
			printf("%d\n",cnt[x]+1);
			root=merge(x,y);
		} else if (opt==4)
			printf("%d\n",val[kth(root,a)]);
		else if (opt==5) {
			split(root,a-1,x,y);
			printf("%d\n",val[kth(x,cnt[x])]);
			root=merge(x,y);
		} else {
			split(root,a,x,y);
			printf("%d\n",val[kth(y,1)]);
			root=merge(x,y);
		}
	}

	return 0;
}


/*
in:
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

out:
106465
84185
492737
*/



【参考文献】
http://www.yhzq-blog.cc/fhq-treap%E6%80%BB%E7%BB%93/
https://www.luogu.com.cn/problem/P3369
https://www.acwing.com/problem/content/255/
https://www.acwing.com/blog/content/4455/
https://www.acwing.com/problem/content/description/268/





 

标签:www,int,com,Treap,maxn,FHQ
来源: https://blog.csdn.net/hnjzsyjyj/article/details/120380473

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有