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,然后插入新的一个点之后,查这个节点的前 ...
随机推荐
- linux flush memcache缓存
telnet localhost 11211 flush_all memcached Telnet Interface Command Description Example get Reads a ...
- erlang 最大公约数
一般面试会遇到问一些算法,什么排序,树,图等等,冷不丁还会问几个蛋疼的问题,我估计生产情况十有八九都用不上,只是题目罢了. 题目:求两个大数的最大公约数. 什么是最大公约数呢? 百度百科的答案这样的: ...
- vi相关命令
vi相关命令在行首加# :% s/^/# 删除# :% s/#//在行末加# :% s/$/# 删除 :% s/#$ ...
- usermod命令
usermod 功能: 修改用户 常用参数:-c 账号说明-d 账号家目录-e 密码失效日期-g 主用户组GID-G 次用户组GID-l 账号名称-s she ...
- 计算CPU利用率
一般来说对于需要大量cpu计算的进程,当前端压力越大时,CPU利用率越高.但对于I/O网络密集型的进程,即使请求很多,服务器的CPU也不一定很到,这时的服务瓶颈一般是在磁盘的I/O上.比较常见的就是, ...
- Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天来讲讲Lumen的singleton和Middleware,先来看看起始文件bootstrap/app.php / * | --------- ...
- MySQL常见问题和命令
问题: 1.centos MySQL启动失败:关闭selinux, vi /etc/selinux/config, 设置SELINUX=disabled,重启电脑: 命令: 停止.启动mysql服务器 ...
- Eight(经典题,八数码)
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 4.AutowireCapableBeanFactory 自动装配工厂
AutowireCapableBeanFactory 根据名称:自动装配的BeanFactory,其实也是对BeanFactory的增强 源代码: /* * Copyright 2002-2016 t ...
- Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战
目录 写在前面 亿级流量IM的应用场景 十万级 单体IM 系统 高并发分布式IM系统架构 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -10[ 博客园 总入口 ] 写在前面 大家好 ...