首页 > 其他 > 详细

营业额统计(SBT)

时间:2016-12-31 19:05:50      阅读:280      评论:0      收藏:0      [点我收藏+]

营业额统计(SBT)

#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
using namespace std;
#define MAXN 100005
#define INF 10000000
int sz[MAXN],ch[MAXN][2],val[MAXN],root,fa[MAXN],n,cnt;
#define abs(a) ((a)>0?(a):-(a))
void rotato(int &r,bool flag)
{
	int t=ch[r][!flag];
	if(!t)return;
	ch[r][!flag]=ch[t][flag];
	ch[t][flag]=r;
	sz[r]=sz[ch[r][0]]+sz[ch[r][1]]+1;
	sz[t]=sz[ch[t][0]]+sz[ch[t][1]]+1;
	r=t;
}

void maintain(int &r,bool flag)
{
	if(!flag)
	{
		if(sz[ch[ch[r][0]][0]]>sz[ch[r][1]])
			rotato(r,1);
		else if(sz[ch[ch[r][0]][1]]>sz[ch[r][1]])
		{
			rotato(ch[r][0],0);
			rotato(r,1);
		}
		else return;
	}
	else
	{
		if(sz[ch[ch[r][1]][1]]>sz[ch[r][0]])
			rotato(r,0);
		else if(sz[ch[ch[r][1]][0]]>sz[ch[r][0]])
		{rotato(ch[r][1],1);
		 rotato(r,0);
		}
		else return;
	}
	maintain(ch[r][0],0);
	maintain(ch[r][1],1);
	maintain(r,0);
	maintain(r,1);
}
void insert(int &r,int t)
{
	if(!r)
	{
		cnt++;
		val[cnt]=t;
		sz[cnt]=1;
		r=cnt;
		return;
	}
	if(val[r]==t)
		return;
	else if(val[r]>t)
	insert(ch[r][0],t);
	else insert(ch[r][1],t);
		maintain(r,t>=val[r]);
}
int find(int r,int t)
{
	int ans=INF;
    while(r)
	{
		if(abs(val[r]-t)<ans)
			ans=abs(val[r]-t);
		if(t<val[r])
			r=ch[r][0];
		else if(t>val[r])
			r=ch[r][1];
		else
            break;
	}
	return ans;
}
int main()
{
	int t,ans=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t);
		if(i>1)
			{
			    int tmp=find(root,t);
                ans+=tmp;
			}
		else ans=t;
		insert(root,t);
	}
	printf("%d\n",ans);
	return 0;
}

  

营业额统计(SBT)

原文:http://www.cnblogs.com/hefenghhhh/p/6239959.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!