赤裸裸的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 数(若有多个相同的数,因只删除一个) ...
随机推荐
- Python - 定制pattern的string模板(template) 具体解释
定制pattern的string模板(template) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179 ...
- javascript(七)document.write
<h1>test</h1> <button type="button" onclick="my_function">点击me ...
- vs2008中使用gdi+的设置
vs2008中使用gdi+ 1.新建一个mfc工程 2.在stdafx.h文件中加入以下几行语句: #include <gdiplus.h> //#pragm ...
- VS2005 MFC 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal err ...
- c friend -- 友元
c friend -- 友元 友元用于突破protected 或者 private 保护的限制,首先要做的是在被访问者的类中声明是友元函数或者友元类.代码如下 #include <iostrea ...
- 用ATL开发和部署ActiveX网页控件
用ATL开发和部署ActiveX网页控件 摘 要 ActiveX插件技术广泛的运用于B/S系统中,本文通过一个项目实例,详细介绍用ATL开发和部署ActiveX网页控件的过程.学习使用ActiveX让 ...
- QML中多样化的ListModel(MultiDelegate)
在QML的官方例子里面, 基本上都是一样的Delegate, 也就是说不管数据怎样, 样式都是不变的. 如果我们想要根据不同的数据类型来显示不同的UI该怎么办? 这里有一个例子. DataBank L ...
- 利用PHP SOAP扩展实现简单Web Services
原文:利用PHP SOAP扩展实现简单Web Services WebServices能干什么? WebServices 可以将应用程序转换为网络应用程序. 通过使用 WebServices,您的应用 ...
- android studio 9.png 报错
Eclipse里能正常运行,但是导入到Android Studio里就报如下的错误 百度了下,说有两种解决办法一种是改后缀名,还有一种是重新在Android Studio里画一下点9图片.但是这个项目 ...
- 远程开发调试与hot-update | (R "think-of-lisper" 'Albertlee)
远程开发调试与hot-update | (R "think-of-lisper" 'Albertlee) 远程开发调试与hot-update