HYSBZ1588 营业额统计【Splay】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4366582.html ---by 墨染之樱花
【题目链接】http://www.lydsy.com/JudgeOnline/problem.php?id=1588
【题目描述】逐个将数插入序列,定义最小波动为某个数与其之前的小于等于它的最大数与大于等于它的最小数和它的差值的较小值,求整个序列的最小波动之和。
【思路】经典的不能再经典的平衡树题目,可用于测试各种平衡树模板。今天刚写了一棵自己风格的splay,用这道题测试一下,156ms效果还不错
/* ***********************************************
Author :Kirisame_Marisa
blog :http://www.cnblogs.com/KirisameMarisa/
Created Time :2015年03月24日 星期二 20时45分12秒
File Name :splay.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=;
#define eps 1e-10
#define zero(x) (fabs(x)<eps)
#define REP(X,N) for(int X=0;X<N;X++)
#define REP2(X,L,R) for(int X=L;X<=R;X++)
#define CLR(A,X) memset(A,X,sizeof(A))
#define PB(X) push_back(X)
#define MP(X,Y) make_pair(X,Y)
#define IT iterator
#define test puts("OK")
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VII; const int null=-; struct node
{
int par;
int cld[]; //0是左儿子,1是右儿子
int key;
} ts[MAXN];
int root,cnt; void init()
{
root=null;
cnt=;
} int newnode(int p,int k)
{
ts[cnt].key=k;
ts[cnt].par=p;
ts[cnt].cld[]=ts[cnt].cld[]=null;
return cnt++;
} void rotate(int x,int k) //k=0为左旋,k=1为右旋
{
int y=ts[x].par;
ts[y].cld[!k]=ts[x].cld[k];
if(ts[x].cld[k]!=null)
ts[ts[x].cld[k]].par=y;
ts[x].par=ts[y].par;
if(ts[y].par!=null)
{
if(y==ts[ts[y].par].cld[])
ts[ts[y].par].cld[]=x;
else
ts[ts[y].par].cld[]=x;
}
ts[y].par=x;
ts[x].cld[k]=y;
} void splay(int x,int S) //伸展操作,将x旋转到目标节点,其中S为目标节点的parent
{
while(ts[x].par!=S)
{
int p=ts[x].par;
if(ts[p].par==S)
rotate(x,ts[p].cld[]==x);
else
{
int d=(ts[ts[p].par].cld[]==p);
if(ts[p].cld[d]==x)
rotate(x,!d),rotate(x,d);
else
rotate(p,d),rotate(x,d);
}
}
if(S==-)
root=x;
} bool insert(int x)
{
if(root==null)
{
root=newnode(null,x);
return ;
}
int r=root,pre=null;
while(r!=null)
{
if(ts[r].key==x)
{
splay(r,null); //如果直接找到的话就不新建节点,直接splay
return ;
}
else
{
pre=r;
r=ts[r].cld[ts[r].key<x];
}
}
int &t=ts[pre].cld[ts[pre].key<x];
t=newnode(pre,x);
splay(t,null);
return ;
} int getlow(int x) //获取比它小的最大值。由于插入操作x已经被旋转到根节点,所以只要寻找左子树的最大值即可,下同
{
int d=ts[root].cld[];
if(d==null)
return INF;
while(ts[d].cld[]!=null)
d=ts[d].cld[];
return x-ts[d].key;
} int getup(int x) //获取比它大的最小值
{
int d=ts[root].cld[];
if(d==null)
return INF;
while(ts[d].cld[]!=null)
d=ts[d].cld[];
return ts[d].key-x;
} void debug(int x)
{
int l=ts[x].cld[],r=ts[x].cld[];
if(l!=null)
debug(l);
printf("id:%2d key:%2d par:%2d lcd:%2d rcd:%2d\n",x,ts[x].key,ts[x].par,l,r);
if(r!=null)
debug(r);
} int main()
{
//freopen("in","r",stdin);
//freopen("out","w",stdout);
init();
int n,x,sum=;
scanf("%d%d",&n,&x);
sum+=x;
insert(x);
REP(i,n-)
{
x=;
scanf("%d",&x);
bool temp=insert(x);
if(temp)
sum+=min(getlow(x),getup(x));
}
printf("%d\n",sum);
return ;
}
代码君
HYSBZ1588 营业额统计【Splay】的更多相关文章
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- 【BZOJ-1588】营业额统计 Splay
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12485 Solved: 4508[Submit][Sta ...
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
- NOIP 营业额统计 splay tree 纯模板
2924: 营业额统计 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 389 ...
- 1588: [HNOI2002]营业额统计 (splay tree)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5783 Solved: 1859[Submit][Stat ...
- 洛谷P2234 [HNOI2002] 营业额统计 [splay]
题目传送门 营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天 ...
- [HNOI2002]营业额统计 Splay tree入门题
题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- bzoj1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...
- Bzoj 1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
随机推荐
- Java中的流程控制(二)
关于Java程序的流程控制(二) 关于Java程序的流程控制(二) 3.switch选择语句 switch语句用于将一个表达式的值同许多其他值比较,并按比较结果选择下面该执行哪些语句. switch( ...
- ADODB 数据库Access连接
<?php $filepath=__FILE__;//echo __FILE__;$newarray=explode("\\",$filepath);$num=count($ ...
- DLL注入_拦截技术之Hook方式
后卫大师教你进程注入 首先提一下,由于文章完全是我手写,所以打不了太多,请包含,由于我已经提供了源代码,所以我在这里详细讲一下理论,至于想看代码的下载代码就可以了.代码中关于注入的部分做了详细的注释. ...
- JAVA泛型-自动包装机制不能应用于泛型数据的测试
<thinging in java>中指出自动包装机制不能应用于泛型数据,自己写的测试代码如下: package com.xt.thinks15_11_1; import java.uti ...
- 阿里云ECS每天一件事D7:安装tomcat8.0
这一D,跨越了几个月啊,人是越来越懒,集中写一些,就懒得再记录了.也是因为测试需要,搭建个jsp的服务环境,只是测试,考虑用tomcat就够了. 在Tomcat官网下载最新Core版本,下载之后,将文 ...
- Delphi中Android运行和JNI交互分析
Androidapi.JNIBridge负责和JNI交互.,既然要交互,那么首先就是需要获得JNI的运行环境,Android本身内置的就有一个Java(Dalvik)虚拟机.所以这个第一步就肯定是要这 ...
- Java实现HTML转PDF的总结
Java实现HTML转PDF的几种方法—主要解决中文乱码问题 第一:同事在做HTML转PDF中遇到乱码问题 ********************************************** ...
- oralce11g 注冊表卸载20140810
Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE] [-HKEY_LOCAL_MACHINE\SOFT ...
- c/c++中宏定义##连接符 和#符的使用
C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关于#和##在C语言的宏中,#的功能是将其后面的宏 ...
- 【转】adb.exe,start-server' failed -- run manually if necessary
[转]Android adb.exe程序启动不起来,如何处理 解决问题: 百度google大家多说的是任务管理器 kill掉adb 或者重启adb server,但我任务管理器就没有adb ,猜测是某 ...