bzoj 1588 hnoi2002营业额统计 splay

原创 2013年12月01日 20:06:32

今天下午加半个晚上终于对照着lkx的代码学会splay了。。明天巩固一下再写点题。。

话说lkx的代码真是凝练,看的就很享受,话说我学splay学了快三个小时

智商真是硬伤。。。

不管怎么说还是写出来了hnoi2002的营业额统计,明天写hnoi2004的题

下面是代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define MAX 35000+9

using namespace std;

int father[MAX],l[MAX],r[MAX],val[MAX];
int a[MAX];
int n,i,top,ans=0;
int &root=l[0];

void rotate(int &x)
{
	int y=father[x];
	int z=father[y];
	if(l[y]==x)//rotate_right
	 {
	 	l[y]=r[x];
	 	father[l[y]]=y;
	 	r[x]=y;
	 	father[r[x]]=x;
	 	father[x]=z;	 	
	 }
	else//rotate_left
	 {
	 	r[y]=l[x];
	 	father[r[y]]=y;
	 	l[x]=y;
	 	father[l[x]]=x;
	 	father[x]=z;	 	
	 }
	if(l[z]==y)
	  l[z]=x;
	else
	  r[z]=x;
	return;
}

void splay(int x)
{
	int y,z;
	while(y=father[x])
	{
		if(z=father[y])		
		 {
		   if((l[z]==y)==(l[y]==x))
		    {
		    	rotate(y);
		    	rotate(x);
		    }
		   else
		    {
		    	rotate(x);
		    	rotate(x);
		    }
		 }
		else
			rotate(x);
	}
}

int max_(int x)
{
	if(!x)
	  return -0x7fffffff/3;
	int k=x;
	while(1)
	 {
	 	if(r[k])
	 	  k=r[k];
	 	else
	 	 break;
	 }
	return val[k];
}

int min_(int x)
{
	if(!x)
	  return 0x7fffffff/3;
	int k=x;
	while(1)
	 {
	 	if(l[k])
	 	  k=l[k];
	 	else
	 	 break;
	 }
	return val[k];
}

int insert(int k)
{
	int x=root;
	if(!x)
	 {
	 	top++;
	 	father[top]=0;
	 	val[top]=k;
	 	l[0]=top;
	 	return top;
	 }
	int *temp;
	while(1)
	 {
	 	if(k<val[x])
	 	  temp=l;// turn left
	 	else
	 	  temp=r;//turn right
	 	if(!temp[x])
	 	  {
	 	  	top++;
	 	  	father[top]=x;
	 	  	val[top]=k;
	 	  	temp[x]=top;
	 	  	return top;
	 	  }
	 	else
	 	 x=temp[x];
	 }
}

int main()
{
	cin>>n;
	for(i=1;i<=n;i++)
	  scanf("%d",&a[i]);
	splay(insert(a[1]));
	ans=a[1];
	for(i=2;i<=n;i++)
	 {
	 	//scanf("%d",&a[i]);
	 	splay(insert(a[i]));
	 	//cout<<i<<' '<<ans<<endl;
	 	ans+=min(a[i]-max_(l[root]),min_(r[root])-a[i]);
	 }
	cout<<ans<<endl;
	return 0;
}


相关文章推荐

【BZOJ1588】【HNOI2002】营业额统计 splay

splay的一些简单功能实现(最简单的一棵SPT)。
  • Vmurder
  • Vmurder
  • 2014年10月02日 22:02
  • 1033

bzoj1588 [HNOI2002]营业额统计 裸splay

Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来...

bzoj 1588 [HNOI2002]营业额统计 splay

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 8084  Solved: 2673 [Submit]...

splay bzoj 1588 营业额统计(HNOI 2002)

累加器传送门:http://blog.csdn.net/NOIAu/article/details/71775000splay裸题,就不写题解了,贴个友联,然后直接贴我代码友链:http://blog...
  • NOIAu
  • NOIAu
  • 2017年05月26日 17:43
  • 115

BZOJ 1588 [HNOI2002]营业额统计(Splay)

思路: 算是很裸的Splay了。 我们知道 Splay 是一个排序二叉树。 结点 左子树 一定都小于 当前结点。 右子树一定都大于当前结点。 那么我们插入一个值后。 找前驱和后继 取个最小...

bzoj1588 [HNOI2002]营业额统计 (Splay)

题意:中文题。。不多说。 这题就是裸的Splay模板。。。但是出了一个问题。。导致我WA了12次(最后随机数对拍才找到)。。。 没插入一个点,把这个点旋转到根,然后找到根的左子树最靠右边的的,根的...

[BZOJ1588]HNOI2002营业额统计|splay

splay入门题。。将n个数依次插入,查询第i个数之前的数中它的前缀和后缀,选择delta小的更新答案即可。。注意无前(后)缀或者有相等的情况。。 很久以前的代码: #include #inclu...

[BZOJ1588][HNOI2002][Treap][Splay]营业额统计[水题]

[BZOJ1588][HNOI2002][Treap][Splay]营业额统计[水题]

1588: [HNOI2002]营业额统计(Splay树入门)

题目的连接 今天开始学习splay树,如cxlove大神所说,开始主要追随别人的代码,然后写出适合自己的,学习的话可以参考kuangbin的这篇文章,及里面提及的论文 #include #inclu...

1588: [HNOI2002]营业额统计 splay 入门

splay tree 伸展树 推荐论文   伸展树的基本操作与应用  Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj 1588 hnoi2002营业额统计 splay
举报原因:
原因补充:

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