赤裸裸的splay平衡树
HYSBZ1588 http://www.lydsy.com/JudgeOnline/problem.php?id=1588
给我们n天的营业额, 要求出每天的最小波动值,然后加起来。 当天最小波动值 = 当天营业额 - (之前某天与当天营业额最接近的营业额)
所以维护一个spaly,将当天的营业额x插入splay中,然后将x旋转到根结点,然后找到左子树的最大值,右子树的最小值, 判断哪一个与当天的营业额差值小。
这里只用到了两种旋转,左旋和右旋。 没有考虑x的服 父亲是不是根节点。 也没有考虑共线不共线的问题。
#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
#include <vector>
#include <math.h>
using namespace std;
const int INF = 0x7FFFFFFF;
const int N = + ; /* int y = pre[x];
pre[next[x][kind]] = y;
next[y][!kind] = next[x][kind];
if(pre[y])
next[pre[y]][next[pre[y]][1]==y] = x; //x旋转到了y的位置,所以y的父亲变成了x的父亲
pre[x] = pre[y];
//
next[x][kind] = y;
//x变成了y的父亲
pre[y] = x;
*/
struct SplayTree{
int size,root;
int next[N][],pre[N],key[N];
void init()
{
size = root = ;
}
void newNode(int &rt, int father,int val)
{
rt = ++size;
next[rt][] = next[rt][] = ;
pre[rt] = father;
key[rt] = val;
}
//kind = 0表示左转, 为1表示右转
void rotate(int x, int kind)
{
int y = pre[x];//x的父亲
pre[x] = pre[y];
pre[y] = x;
next[y][!kind] = next[x][kind];
pre[next[y][!kind]] = y;
next[x][kind] = y;
if(pre[x])
next[pre[x]][next[pre[x]][]==y] = x;
}
//将x旋转为goal的儿子
void splay(int x, int goal)
{
while(pre[x]!=goal)
{
if(next[pre[x]][] == x)//如果自己的父亲的左孩子
rotate(x,);//右转
else//左转
rotate(x,);
}
//如果x旋转到了根结点,那么root的指向需要发生变化
if(!goal)
root = x;
}
bool insert(int k)
{
int x,y;
for(x=root;next[x][k>key[x]];x=next[x][k>key[x]])
if(k==key[x])//如有已经有了要插入的结点,那么返回false
{
splay(x,);
return false;
}
newNode(next[x][k>key[x]],x,k);
splay(next[x][k>key[x]],);
return true;
}
int getPre()//如果有左子树,获得左子树最大值
{
int x = next[root][];
if(x)
{
while(next[x][])
{
x = next[x][];
}
return key[x];
}
return INF;
}
int getNext()//如果有右子树,获得右子树最小值
{
int x = next[root][];
if(x)
{
while(next[x][])
{
x = next[x][];
}
return key[x];
}
return INF;
}
};
SplayTree tree;
int main()
{
//将每一天的最小波动值加起来
int n,ans,x,a,b;
while(scanf("%d%d",&n,&ans)!=EOF)
{
tree.init();
tree.newNode(tree.root,,ans);
while(--n)
{
x = ;
scanf("%d",&x); //返回true,如果没有两个相同的结点,如果有,那么最小波动是0,不用加
if(tree.insert(x))
{
a = tree.getPre();
if(a<INF)
a = x - a;
b = tree.getNext();
if(b<INF)
b -= x; ans += min(a,b);
}
}
printf("%d\n",ans); }
return ;
}
赤裸裸的splay平衡树的更多相关文章
- Splay平衡树入门小结
学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...
- BST,Splay平衡树学习笔记
BST,Splay平衡树学习笔记 1.二叉查找树BST BST是一种二叉树形结构,其特点就在于:每一个非叶子结点的值都大于他的左子树中的任意一个值,并都小于他的右子树中的任意一个值. 2.BST的用处 ...
- JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树
http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...
- 数据结构(Splay平衡树):HAOI2008 排名系统
[HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...
- 数据结构(Splay平衡树): [NOI2007] 项链工厂
[NOI2007] 项链工厂 ★★★ 输入文件:necklace.in 输出文件:necklace.out 简单对比 时间限制:4 s 内存限制:512 MB [问题描述] T公司是一 ...
- 数据结构(Splay平衡树):HDU 1890 Robotic Sort
Robotic Sort Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列
339. [NOI2005] 维护数列 时间限制:3 s 内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际 ...
- 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
Description Input 第一行两个正整数N.S,分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来N 行,第K 行三个实数AK.BK.RateK,意义如题目中所述 Output 只有 ...
- Splay 平衡树
摘自大佬文章 https://www.luogu.org/blog/user19027/solution-p3369 维护一个数据结构1.插入 x 数2.删除 x 数(若有多个相同的数,因只删除一个) ...
随机推荐
- Swift中使用typealias定义一个闭包closure
在OC中我们定义一个Blocks是这样定义的: typedef void (^ZWProgressHUDCompletionBlock)(); 在Swift中定义一个闭包是这种: typealias ...
- Android 特殊符号的转码大全
项目中要在string.xml 中显示特殊符号,如@号冒号等,直接写肯定不行啦..只能考虑使用ASCII码进行显示: @号 @ :号 : 空格 以下为常见的ASCII十进制交换编码: --> ...
- Android 系统搜索框(有浏览记录)
实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件 要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...
- Cocos2d-x CCProgressTimer
CCProgressTimer,创建使用这个节点可以大致实现两个作用的效果: 其一:在游戏中几乎大部分的游戏启动界面都是游戏加载画面,那么用到的一般是进度条提示加载进度,其使用的就是CCProgres ...
- python 内存泄露的诊断 - 独立思考 - ITeye技术网站
python 内存泄露的诊断 - 独立思考 - ITeye技术网站 python 内存泄露的诊断 博客分类: 编程语言: Python Python多线程Blog.net 对于一个用 python ...
- 从Hadoop骨架MapReduce在海量数据处理模式(包括淘宝技术架构)
从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,认为它们非常是神奇.而神奇的东西常能勾 ...
- 介绍linux下Source Insight强大代码编辑器sublime_text_3
背景 1 一. 运行环境 1 二.安装环境配置 1 三.创建快捷方式 1 四.配置全局环境 2 五.操作界面 3 背景 在windows操作系统系统下,文本代码编辑器众多,各路英雄豪杰争相写了许多强大 ...
- TStack,TQueue,TObjectList,TObjectStack等等
TStack,TQueue,TObjectList,TObjectStack等等,都在Contnrs.pas单元里,需要手动添加. 不同于TList类,TObjectList对象将销毁任何从列表中删除 ...
- 慕尼黑大学公开课 Competitive Strategy(竞争策略)总结
第一章博弈 同时的博弈:双方同时定制策略 如果有显著的次优策略总是不如另一个,则剔除它. 如果一个策略组合中没有一方可以单独改变其策略以提高回报,则称为Nash均衡.一个游戏可能没有也可能有多个Nas ...
- Linux温馨提示1--安装U板块和Windwos划分
一.安装U盘 现在我用Ubuntu12.04在插入U光盘将被直接安装到/media/下, 10:33linc@Linc-Ubuntu:linc$ df -h Filesystem Size Used ...