ICode9

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

模板:fhq treap

2021-12-29 19:02:55  阅读:146  来源: 互联网

标签:ch 错误 int lsz treap include now fhq 模板


普通平衡树:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>
using namespace std;
const int N=100010;
int read()
{
    int x=0,f=0,c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return f?-x:x; 
}

int sz[N],val[N],rnd[N],ch[N][2];
int n,cnt;
int root,rx,ry,rz;
void upd(int x){ sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;}

void split(int now,int k,int &x,int &y)
{
	if(!now){ x=y=0; return;}
	if(k>=val[now]) x=now,split( ch[now][1],k,ch[x][1],y);//错误1: >= 
	else y=now,split(ch[now][0],k,x,ch[y][0]);//错误2: 注意写法 
	upd(now);
}

int merge(int x,int y)
{
	if(!x||!y) return x+y;
	if(rnd[x]<rnd[y]){ ch[x][1]=merge(ch[x][1],y),upd(x); return x;}//注意要return 
	else { ch[y][0]=merge(x,ch[y][0]),upd(y); return y;}
}

int _new(int x)
{
	sz[++cnt]=1;val[cnt]=x; rnd[cnt]=rand();
	return cnt;
}
//错误点:要写上在那棵树上查找排名 
int findkth(int k,int rt)
{
	int now=rt;
	while(1)
	{
		int lsz=sz[ch[now][0]],rsz=sz[ch[now][1]];
		if(k==lsz+1) return now;
		else if(k>lsz) now=ch[now][1],k=k-(lsz+1);//错误3:这个地方要+1 
		else now=ch[now][0];//错误4: 用now 
	}
}

void print(int x)
{
	if(!x) return;
	print(ch[x][0]);
	cout<<val[x]<<' ';
	print(ch[x][1]);
}


int main()
{
	srand((unsigned)time(0));
	n=read();
	for(int i=1;i<=n;i++)
	{
		int opt=read(),x=read();
		if(opt==1)
		{
			split(root,x,rx,ry);
			root=merge( merge(rx,_new(x)),ry );
		}
		else if( opt==2)
		{
			split(root,x,rx,rz);
			split(rx,x-1,rx,ry);//错误点4:在rx为根的树上分裂 
			int t=merge(ch[ry][0],ch[ry][1]);
			root=merge( merge(rx,t),rz );
		}
		else if( opt==3)
		{
			split(root,x-1,rx,ry);//最初的rx与ry值没有影响 用来仅仅是暂时存储根节点
			printf("%d\n",sz[rx]+1);
			root=merge(rx,ry);
		}
		else if(opt==4) printf("%d\n",val[findkth(x,root)]);
		else if(opt==5)
		{
			split(root,x-1,rx,ry);
			printf("%d\n",val[findkth(sz[rx],rx)]);
			root=merge(rx,ry);
		}
		else if(opt==6)
		{
			split(root,x,rx,ry);
			printf("%d\n",val[findkth(1,ry)]);
			root=merge(rx,ry);
		}
	}
	return 0;
}

标签:ch,错误,int,lsz,treap,include,now,fhq,模板
来源: https://www.cnblogs.com/juruoHBr/p/15746146.html

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

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

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

ICode9版权所有