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,然后插入新的一个点之后,查这个节点的前 ...
随机推荐
- KSTORE日常工作遇到问题总结
1.csv导入kstore命令语句 oimpexp -F "E:/127.csv" -S KSTORE -T "T_BUSDATA" -d 1 -z -B 7 ...
- php 在linux 用file_exists() 函数判断 另外一台服务器映射过来的文件是否存在 总是返回false
php 在linux 用file_exists() 函数判断 另外一台服务器映射过来的文件是否存在 总是返回false .如下案例 $type="android"; $url=&q ...
- JS中setInterval、setTimeout不能传递带参数的函数的解决办法
在JS中无论是setTimeout还是setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必须要带参数,这就需要想方法解决. 一.采用字符串形式:——(缺陷)参数不能被周期性改 ...
- centos7.0安装redis扩展
1.下载 下载地址:https://github.com/phpredis/phpredis/ 文件名:phpredis-develop.zip 文件下载成功后,上传至/usr/local 2.安装 ...
- Lorenzo Von Matterhorn(STL_map的应用)
Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes input standa ...
- iptables的例子1
练习1:实现主机防火墙 设置主机防火墙策略为DROP: iptables -t filter -P INPUT DROP iptables -t filter -P OUTPUT DROP i ...
- is assembler instruction and machine instuction atomic
1 assembler instruction depends,有的汇编指令会被assemble成多条机器指令. 2 机器指令 depends,有的机器指令也不是atomic的. 所以,不要希望在单条 ...
- Django之CURD插件
什么是CURD? CURD顾名思义就是create,update,rearch,delete(所谓的增删改查). 当我们接到一个项目的时候,夸夸夸的就写完表结构,然后就一直写增删改查,增删改查,写了一 ...
- android启动页延时跳转
package com.goodness.goodness; import android.content.Context; import android.content.Intent; import ...
- Apache Shiro 使用手册(三)Shiro 授权(转发:http://kdboy.iteye.com/blog/1155450)
授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等. 一.授权的三要素 授权有着三 ...