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. ASP.NET - 分页

    效果: SQL-存储过程(Paging): ROW_NUMBER() over(order by MessageDateTime desc)  其中的 MessageDateTime desc 代表的 ...

  2. Network Panel说明

    Chrome Developer Tools:Network Panel说明   官方资料:Chrome Developer Tools: Network Panel 一.chrome Develop ...

  3. c vs c++ in strcut and class

    c vs c++ in strcut and class 总习惯用c的用法,现在学习C++,老爱拿来比较.声明我用的是g++4.2.1 SUSE Linux.看例子吧 #include <ios ...

  4. 9月mob(ShareSDK)活动预告,这个秋天非常热

    9月秋天来临,广州的天气依旧非常热,广州的活动氛围更热~ 先有GMGC B2B对接会在广州创新谷,再有上方网TFC全球移动游戏开发人员大会来袭,游戏圈的火越烧越旺,成都GMGDC全球移动游戏开发人员大 ...

  5. Oracle 12C 简介

    2013年6月26日,Oracle Database 12c版本正式发布,首先发布的版本号是12.1.0.1.0,率先提供下载的平台有Linux和Solaris: Oracle官方下载地址: http ...

  6. PHP网站安装程序的原理及代码

    原文:PHP网站安装程序的原理及代码 原理: 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安 ...

  7. SilkTest高级进阶系列9 – 异步执行命令

    我们常常会使用sys_execute函数执行一些外部的程序或者命令来做一些事情,但是由于sys_execute是一个同步的函数,它会等待执行的命令完成后才会返回.在大多数情况下,这个函数足够用了. 但 ...

  8. 不要打开文件,阅读Rvt信息档案

    叶老师,想问一下是否能基于revit API 2014,直接在开发时传递给程序要处理的文件名称和路径.而不用再在revit软件中打开为当前活动视图,就直接获得文件里信息.这样可行不? 答: 能够.你能 ...

  9. hdu 3405 world islands

    求删点后最小的生成树,n<50....数据好弱,直接暴力枚举就行...删点的时候直接g[i][j]=INF就行了. #include<iostream> #include<al ...

  10. [Cocos2d-x]节点之间的相互通讯

    在做.NET开发时,对象之间的相互通讯一般使用事件(event)实现,事件概念是.NET对Delegate的封装. 在Cocos2d-x开发过程中,对象之间的通讯刚开始时不知道如何实现,于是想到c++ ...