赤裸裸的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 数(若有多个相同的数,因只删除一个) ...
随机推荐
- PL/SQL批处理语句(BULK COLLECT子句和FORALL语句)
Oracle为PL/SQL中的SQL相关功能提供了FORALL语句和BULK COLLECT子句,显著的增强了SQL相关功能.这两个语句一起被称作PL/SQL的批处理语句.Oracle为什么要提供这两 ...
- Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net
原文:Lucene.Net 2.3.1开发介绍 -- 一.接触Lucene.Net 1.引用Lucene.Net类库找到Lucene.Net的源代码,在“C#\src\Lucene.Net”目录.打开 ...
- NIO框架之MINA源码解析(转)
http://blog.csdn.net/column/details/nio-mina-source.html http://blog.csdn.net/chaofanwei/article/det ...
- 开源项目之Android 结束篇
随着公司新的需求以及Android嵌入式的深入,我已经没有多余的时间去扩展学习与Sip或UI不相关的Android开源项目,至此结束! 感想:研究Android已经一年半载了,白天忙公司项目,晚上扩展 ...
- 设定十分钟android在状态栏上集成的开源project推荐
1.前言 于android kitkat 有一个新功能可以设置背景的手机状态栏,让手机风的整个界面格是一致的,它看起来非常酷,在今年的google i/o向上android l这样的风格.来如今看我们 ...
- Swift - 类的计算属性(使用get和set来间接获取/改变其他属性的值)
1,Swift中类可以使用计算属性,即使用get和set来间接获取/改变其他属性的值,代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Calc ...
- 系统没有“internet信息服务(IIS)管理器”
系统没有“internet信息服务(IIS)管理器” | 浏览:8981 | 更新:2014-06-19 14:43 1 2 3 4 5 6 7 分步阅读 很多用户都在咨询:系统控制面板的管理工具中没 ...
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用(简单明了)
一. 在字符串前加一个L作用: 如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节. strlen("as ...
- roll pitch yaw 的分别
原文地址:http://blog.sina.com.cn/s/blog_452706120100scwu.html yaw,pitch,roll这三个旋转的确切意思.如果有一个人站在(0,0,0)点, ...
- 利用jquery+iframe做一个ajax上传效果
以下是自学it网--中级班上课笔记 网址:www.zixue.it html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...