HYSBZ - 1588 splay
题意:每天给你一个数,要求统计最小波动值,强制在线的就是每次从已经出现过的数值中找与当前值间隔最小的加起来
题解:splay维护,同时求解当前值的前驱和后继,找距离小的那个就好了
splay是一种二叉搜索树,可以在log(n)的时间内维护,而且通过左旋和右旋避免二叉搜索树退化成一条链,而且可以利用二叉搜索树性质方便的查找前驱和后继
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 20090717
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; int rightson[N],leftson[N],father[N],value[N];
ll ans;
bool f;
int tot,n,root;
void right_rotate(int x)
{
int y=father[x],z=father[y];
leftson[y]=rightson[x];
if(rightson[x]!=-)father[rightson[x]]=y;
father[x]=z;
if(z!=-)
{
if(leftson[z]==y)leftson[z]=x;
else rightson[z]=x;
}
father[y]=x;rightson[x]=y;
}
void left_rotate(int x)
{
int y=father[x],z=father[y];
rightson[y]=leftson[x];
if(leftson[x]!=-)father[leftson[x]]=y;
father[x]=z;
if(z!=-)
{
if(leftson[z]==y)leftson[z]=x;
else rightson[z]=x;
}
father[y]=x;leftson[x]=y;
}
void splay(int x)//一直旋转到x成为root
{
// cout<<x<<"-----------"<<endl;
while(father[x]!=-)
{
// cout<<x<<" "<<father[x]<<endl;
int y=father[x],z=father[y];
if(z==-)
{
if(rightson[y]==x)left_rotate(x);
else right_rotate(x);
}
else
{
if(rightson[z]==y&&rightson[y]==x)left_rotate(y),left_rotate(x);
else if(rightson[z]==y&&leftson[y]==x)right_rotate(x),left_rotate(x);
else if(leftson[z]==y&&rightson[y]==x)left_rotate(x),right_rotate(x);
else right_rotate(y),right_rotate(x);
}
}
root=x;
}
void BSTinsert(int v,int x)//在二叉搜索树里插入
{
// cout<<x<<"-------"<<value[x]<<"---------"<<v<<endl;
if(value[x]==v)//已经存在了
{
splay(x);
f=;
return ;
}
if(value[x]>v)
{
if(leftson[x]==-)//插在此处
{
leftson[x]=tot;
father[tot]=x;
leftson[tot]=rightson[tot]=-;
value[tot]=v;
}
else BSTinsert(v,leftson[x]);
}
else
{
if(rightson[x]==-)
{
rightson[x]=tot;
father[tot]=x;
leftson[tot]=rightson[tot]=-;
value[tot]=v;
}
else BSTinsert(v,rightson[x]);
}
}
int qq(int x)//前驱
{
int y=leftson[x];
if(y==-)return y;
while(rightson[y]!=-)y=rightson[y];
return y;
}
int hj(int x)//后继
{
int y=rightson[x];
if(y==-)return y;
while(leftson[y]!=-)y=leftson[y];
return y;
}
void insertpoint(int v)
{
tot++;
f=;
BSTinsert(v,root);
if(!f)
{
tot--;
return ;//有重复的点
}
// cout<<value[tot]<<"*****************"<<father[tot]<<endl;
splay(tot);
int q=qq(tot),h=hj(tot);//找前驱和后继
int res=;
if(q!=-)res=min(res,abs(value[tot]-value[q]));
if(h!=-)res=min(res,abs(value[tot]-value[h]));
ans+=res;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
scanf("%lld",&ans);
tot=;father[tot]=-;
leftson[tot]=rightson[tot]=-;
value[tot]=ans,root=tot;
for(int i=;i<=n;i++)
{
int a;
scanf("%d",&a);
insertpoint(a);
}
printf("%lld\n",ans);
}
return ;
}
/******************** ********************/
HYSBZ - 1588 splay的更多相关文章
- HYSBZ 1588 营业额统计 (Splay树)
题意:给出一个公司每一天的营业额,求每天的最小波动值之和.该天的最小波动值= min { 绝对值| 该天以前某一天的营业额-该天的营业额 | }.第一天的最小波动值就是其自己. 思路:Splay伸展树 ...
- HYSBZ 1588 营业额统计
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意:详见题面,中文 思路:平衡树的模板题. 可用Treap,Splay,Scape ...
- bzoj 1588 splay模板题
用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> ...
- HYSBZ - 1588 营业额统计 (伸展树)
题意:营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营 ...
- 营业额统计 HYSBZ - 1588
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况 ...
- bzoj 1588营业额统计(HNOI 2002)
http://www.lydsy.com/JudgeOnline/problem.php?id=1588 splay bottom-up的数组实现. 题意就是给你一组数,求每个数与在其前面且与其最相 ...
- CSU训练分类
√√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- BZOJ 1588:营业额统计(Splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意:中文题意. 思路:每一个点每一个点插入Splay,然后插入新的一个点之后,查这个节点的前 ...
随机推荐
- 过年啦!小B高兴的不行了,她收到了很多红包,可以实现好多的愿望呢。小B可是对商店货架上心仪的货物红眼好久了,只因囊中羞涩作罢,这次她可是要大大的shopping一番。小B想去购物时,总是习惯性的把要买的东西列在一个购买清单上,每个物品单独列一行(即便要买多个某种物品),这次也不例外。
include "stdafx.h" #include<iostream> #include<vector> #include <algorithm& ...
- redis+node.js
1.什么的cache 是一种更快的记忆存储数据集 存储空间有限 储存一部分重要数据 是一种相对的概念,只要比原本数据存储更快的介质就能作为cache 2.caching 策略 有限的存储空间,只能存储 ...
- js判断对象的属性是原型的还是实例的
一些情况下,我们需要知道对象的属性是原型的还是实例的,如果看代码的话比较繁琐,下面讲解下如何可以直接判断 1.hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的 ...
- Android中的常见通信机制和Linux中的通信机制
Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线 ...
- Linux5_环境变量
1.总结背景 在linux系统下,下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容. 每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了.这 ...
- linux卸载一个源码包安装的软件的流程
完全卸载memcached的方法(CentOS) 我的大内存vps(centos系统)曾经安装过memcached,想给论坛提速,实际上不但没有明显效果,反倒耗费内存,看着碍眼,于是想卸载,于是网上各 ...
- C语言基础知识【运算符】
C 运算符1.运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符:算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符2.杂项运算符 ↦ ...
- iOS tableView自定义删除按钮
// 自定义左滑显示编辑按钮 - (NSArray<UITableViewRowAction*>*)tableView:(UITableView *)tableView editActio ...
- 第8章 Foundation Kit介绍
本文转载至 http://blog.csdn.net/mouyong/article/details/16947321 Objective-C是一门非常精巧实用的语言,目前我们还没有研究完它提供的全 ...
- Pell方程(求形如x*x-d*y*y=1的通解。)
佩尔方程x*x-d*y*y=1,当d不为完全平方数时,有无数个解,并且知道一个解可以推其他解. 如果d为完全平方数时,可知佩尔方程无解. 假设(x0,y0)是最小正整数解. 则: xn=xn-1*x0 ...