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平衡树的更多相关文章

  1. Splay平衡树入门小结

    学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...

  2. BST,Splay平衡树学习笔记

    BST,Splay平衡树学习笔记 1.二叉查找树BST BST是一种二叉树形结构,其特点就在于:每一个非叶子结点的值都大于他的左子树中的任意一个值,并都小于他的右子树中的任意一个值. 2.BST的用处 ...

  3. JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树

    http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...

  4. 数据结构(Splay平衡树):HAOI2008 排名系统

    [HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...

  5. 数据结构(Splay平衡树): [NOI2007] 项链工厂

    [NOI2007] 项链工厂 ★★★   输入文件:necklace.in   输出文件:necklace.out   简单对比 时间限制:4 s   内存限制:512 MB [问题描述] T公司是一 ...

  6. 数据结构(Splay平衡树):HDU 1890 Robotic Sort

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列

    339. [NOI2005] 维护数列 时间限制:3 s   内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际 ...

  8. 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash

    Description Input 第一行两个正整数N.S,分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来N 行,第K 行三个实数AK.BK.RateK,意义如题目中所述 Output 只有 ...

  9. Splay 平衡树

    摘自大佬文章 https://www.luogu.org/blog/user19027/solution-p3369 维护一个数据结构1.插入 x 数2.删除 x 数(若有多个相同的数,因只删除一个) ...

随机推荐

  1. objective-C 中的内存管理解说

    初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃.我在这里总结了自己对objective-C内存管理机制的研究成果和 ...

  2. 理想非常丰满,现实非常骨感——致WiFi通话

    WiFi通话一词,近来火热,国外,iOS 8系统測试版新增WiFi通话功能,英国运营商也着手WiFi免费通话,国内也没落下,阿里发布的170资费方案中就包含WiFi免费通话. 近日,据外媒报道,在美国 ...

  3. Core Animation之框架简介(一)

    Core Animation之框架简介(一) 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明 ...

  4. django url调度

    Django的url配置相同遵循着DRY(dont repeat yourself)的规则.下面都是官方文档的样例: 首先介绍的是Django怎样处理http的请求: 1.在setting里定义ROO ...

  5. Windows调试工具入门—1

    NetRoc http://www.DbgTech.net 引子 Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg ...

  6. HDU 1007 近期点对

    分治法求近期点对 递归将点不断分成小组.计算最短距离.此时的最短距离不过两点都属两块的某一块(这里的切割点是mid点). 还须要考虑两点分属两块的情况. 这时对于选点则把范围缩小到了以mid为中心. ...

  7. [C++]const修饰符

    Date: 2014-1-1 Summary: const 修饰符笔记 Contents: 1.const 修饰符 声明一个常量数据类型 , 在编译时就确定数据类型 2.const 与 指针 一般情况 ...

  8. 字符编码详解 good

    字符编码详解 字符编码详解

  9. VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表

    原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...

  10. UVA 11080 - Place the Guards(二分图判定)

    UVA 11080 - Place the Guards 题目链接 题意:一些城市.之间有道路相连,如今要安放警卫,警卫能看守到当前点周围的边,一条边仅仅能有一个警卫看守,问是否有方案,假设有最少放几 ...