bzoj 3224==tyvj 1728普通平衡树 splay

原创 2013年12月05日 18:41:09

啊啊啊啊今天各种煞笔啊。。

首先早晨起晚了。。一晚上从11点睡到了7点。。

下午大概三点半开始写这个题。。各种不顺以后发现70分一直超时。。各种方法都不行,后来直接把lyw的子程序都闹过来结果成60 了。。。

最后在6点20 的时候发现了一个恶心的问题!!!!

应该用printf但是我用的是cout!!!!!

当时为了偷懒所以就说先用cout吧,最后就忘了。。。不行不行以后5个数以上都要用cstdio里的东西

这个大概可以作为splay的一般模版了吧。。

下面是代码(话说今天debug的技巧又学了一些)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define MAX 100086

using namespace std;

int child[MAX][2],father[MAX],cnt[MAX],size[MAX],value[MAX];
int n,i,a1,a2,num=0,root;

void rotate(int p)
{
	//cout<<"rotate"<<endl;
	int q=father[p],y=father[q],x=(child[q][1]==p);
	//if p is q's right person then x==1 else x==0
	//if x==1 then rotate_left
	//else if x==0 then rotate_right
	father[child[q][x]=child[p][x^1]]=q;
	father[child[p][x^1]=q]=p;
	father[p]=y;
	if(y)
	 child[y][child[y][1]==q]=p;
	size[q]=cnt[q]+size[child[q][0]]+size[child[q][1]];
	size[p]=cnt[p]+size[child[p][0]]+size[child[p][q]];
	//pay more attention = = -> the size of p,q should re_calc
}

void splay(int x,int aim=0)
{
	//cout<<"splay"<<endl;
	for(int y;(y=father[x])!=aim;rotate(x))
	 if(father[y]!=aim)
	  {
	  	if((child[y][0]==x)==(child[father[y]][0]==y))	  	  
	  	  	rotate(y);	  	  
	  	else
	  	   rotate(x);
	  }
	if(aim==0)
	  root=x;
/*	for(int y;(y=father[x])!=aim;rotate(x))
		if(father[y]!=aim)rotate((child[y][0]==x)==(child[father[y]][0]==y)?y:x);
	if(aim==0)root=x;*/
	
	size[x]=size[child[x][0]]+cnt[x]+size[child[x][1]];
} 

void insert(int x,int k)
{
	if(!x)
	 {
	 	num++;
	 	root=num;
	 	x=num;
		value[x]=k;
	 	father[x]=0;
	 	child[x][1]=child[x][0]=0;
	 	
	 	cnt[x]=1;
	 	size[x]=1;	
		 return; 	
	 }
	while(x)
	 {
	 	size[x]++;
	 	if(k==value[x])
	 	 {
	 	 	cnt[x]++;
	 	 	return;
	 	 }
	 	int &y=child[x][k>value[x]];
	 	if(!y)
	 	 {
	 	 	num++;
	 	 	y=num;
	 	 	father[y]=x;
	 	 	child[y][0]=child[y][1]=0;
	 	 	cnt[y]=size[y]=1;
	 	 	value[y]=k;
	 	 	break;
	 	 }
	 	x=y;
	 }
	splay(x);
}

void insert_(int x,int v)
{
	if(x==0){root=x=++num;value[x]=v;father[x]=child[x][0]=child[x][1]=0;size[x]=cnt[x]=1;return;}
	while(x)
	{
		size[x]++;
		if(v==value[x]){cnt[x]++;return;}
		int &y=child[x][v>=value[x]];
		if(y==0){y=++num;value[y]=v;father[y]=x;child[y][0]=child[y][1]=0;size[y]=cnt[y]=1;x=y;break;}
		x=y;
	}
	splay(x);
}

int rank_(int x,int k)
{
	int ret=0;
	while(x)
	 {
	 	if(k>value[x])
	 	 {
	 	 	ret+=size[child[x][0]]+cnt[x];
	 	 	x=child[x][1];
	 	 }
	 	else
	 	 {
	 	 	if(k==value[x])
	 	 	 return ret+size[child[x][0]]+1;
	 	 	else
	 	 	 x=child[x][0];
	 	 }
	 }
}

int r_th(int x,int k)
{
	while(x)
	 {
	 	if(k>=size[child[x][0]]+1&&k<=size[child[x][0]]+cnt[x])
	 	  return value[x];
	 	if(k>size[child[x][0]]+cnt[x])
	 	 {
	 	 	k-=size[child[x][0]]+cnt[x];
	 	 	x=child[x][1];
	 	 }
	 	else
	 	 x=child[x][0];
	 }
}

int pre(int x,int k)
{
	int ans;
	while(x)
	 {
	 	if(value[x]<k)
	 	 {
	 	 	ans=value[x];
	 	 	x=child[x][1];
	 	 }
	 	else
	 	 x=child[x][0];
	 }
	return ans;
}

int suc(int x,int k)
{
	int ans;
	while(x)
	 {
	 	if(value[x]>k)
	 	 {
	 	 	ans=value[x];
	 	 	x=child[x][0];
	 	 }
	 	else
	 	 x=child[x][1];
	 }
	return ans;
}

void debug()
{
	cout<<root<<' '<<value[root]<<' '<<value[child[root][0]]<<' '<<value[child[root][1]]<<endl;
	cout<<root<<' '<<size[root]<<' '<<size[child[root][0]]<<' '<<size[child[root][1]]<<endl;
	cout<<root<<' '<<cnt[root]<<' '<<cnt[child[root][0]]<<' '<<cnt[child[root][1]]<<endl;
}

void read_work_print()
{
	cin>>n;
	while(n--)
	 {
	 	//debug();
	 	scanf("%d%d",&a1,&a2);
	 	switch(a1)
	 	{
	 	 case 1:
	 	 	 {
	 	 	 	insert(root,a2);
	 	 	 	break;
	 	 	 }
	 	case 2:
	 	 	 {
	 	 	 	delete_(root,a2);
	 	 	 	break;
	 	 	 }
	 	case 3:
	 	 	 {
	 	 	 	printf("%d\n",rank_(root,a2));
	 	 	 	break;
	 	 	 }
	 	case 4:
	 	 	 {
	 	 	 	printf("%d\n",r_th(root,a2));
	 	 	 	break;
	 	 	 }
	 	case 5:
	 	 	 {
	 	 	 	printf("%d\n",pre(root,a2));
	 	 	 	break;
	 	 	 }
	 	case 6:
	 	 	 {
	 	 	 	printf("%d\n",suc(root,a2));
	 	 	 	break;
	 	 	 }
	   }
	 }
}

int main()
{
	read_work_print();
}


相关文章推荐

bzoj 3224 Tyvj 1728 普通平衡树 [Splay]

普通平衡树Time Limit: 10 Sec Memory Limit: 128 MB Submit: 8170 Solved: 3442Description您需要写一种数据结构(可参考题目...

[bzoj 3224] Tyvj 1728 普通平衡树(Splay)

题意:维护一些数,支持这些操作:插入x、删除x、查询x的排名(多个x则输出最小者)、查询排名为x的数、查询小于x的最大数、查询大于x的最小数。初始序列为空,操作数不超过10^5,每个数的数据范围:[-...

BZOJ 3224 Tyvj 1728 普通平衡树 (Splay)

题目链接: BZOJ 3224题意: 让你实现一棵树,实现 插入, 删除,查询xx数的排名,查询排名为xx的数 ,求xx的前驱(前驱定义为小于xx,且最大的数), 求xx的后继(后继定义为大于xx...

BZOJ 3224: Tyvj 1728 普通平衡树 [Splay]【数据结构】

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3224———————————————————————————————————————————...

【bzoj 3224】【Tyvj 1728】 普通平衡树

Description您需要写一种数据结构来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,只删除一个) 3. 查询x数的排名(若有多个相同的数,输出...

【bzoj3224】Tyvj 1728 普通平衡树

题目描述: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的...

BZOJ 3224:Tyvj 1728 普通平衡树

都是平衡树的基本操作 爱splay的spaly 爱treap的terap 我刚学了替罪羊树来练练。。 插入及子树的重构看这篇BZOJ 1588:[HNOI2002]营业额统计 删除操作:先找...

BZOJ 3224 TYVJ 1728 普通平衡树

treap树模板题目

【Treap/非旋转Treap】BZOJ3224 [Tyvj1728]普通平衡树

BZOJ 3224 平衡树裸题…… 写了Treap/非旋转Treap两个版本。 题面如下:Description您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1...
  • linkfqy
  • linkfqy
  • 2017年04月18日 20:05
  • 280

BZOJ3224——Tyvj 1728 普通平衡树

1、题目大意:数据结构题,是treap,全都是treap比较基本的操作 2、分析:没啥思考的 #include #include #include #include using names...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj 3224==tyvj 1728普通平衡树 splay
举报原因:
原因补充:

(最多只允许输入30个字)