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,然后插入新的一个点之后,查这个节点的前 ...
随机推荐
- js中的DOM节点
文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法. DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 把上面的代码拆分为Dom节 ...
- win10下VS2010中文输入法切换为英文卡死
中文输入法下输入英文,VS2010会出现卡顿现象,之后会出现一大串的重复英文字母. win10下VS2010安装的助手VAssit系统不兼容,而win7下不会出现上述问题. 解决办法:卸载安装的助手V ...
- Google Gson实现JSON字符串和对象之间相互转换
User实体类 package com.test.json; /** * User 实体类 */ public class User { private String name; private St ...
- ios - 使用@try、catch捕获异常:
@try { // 可能会出现崩溃的代码 } @catch (NSException *exception) { // 捕获到的异常exception } @finally { // 结果处理 }
- Laravel开发:Laravel核心——Ioc服务容器
服务容器 在说 Ioc 容器之前,我们需要了解什么是 Ioc 容器. Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具. 在理解这句话之前,我们需要先了解一下服务容器的来龙去脉: ...
- C# 关于类型转换 面试题
分别分析一下两种写法是否正确.假设不对.请说明原因 写法一: short s=1; s = s + 1; 写法二: short s=1; s += 1; 解答: 写法一不对,会报出以下的错误: 无法将 ...
- scp命令需要指定端口时要紧跟在scp后
问题来源:我本地是Ubuntu操作系统,有时需要更新一些文件到服务器.但是,为了安全起见我们都是将服务器的sshd端口修改的,通常不使用默认的22号端口. 如果我们使用scp命令时:scp upl ...
- Git客户端搭建环境(Windows系统)的使用
本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1.8.8.0-32bit 一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 msysgit: ...
- EasyDSS流媒体服务器软件对数据库Sqlite3和MySQL的同时支持说明
EasyDSS流媒体音视频直播与点播服务器软件,是一套提供一站式的转码.点播.直播.检索.回放.录像下载服务的高性能RTMP/HLS/HTTP-FLV流媒体服务,极大地简化了流媒体相关业务的开发和集成 ...
- Spring中的国际化资源以及视图跳转
一.SpringMVC对国际化的支持 SpringMVC进行资源国际化主要是通过ResourceBundleMessageSource实现的,xml如下配置: <bean id="me ...