转载请注明出处,谢谢: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】的更多相关文章

  1. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  2. 【BZOJ-1588】营业额统计 Splay

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12485  Solved: 4508[Submit][Sta ...

  3. BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  4. NOIP 营业额统计 splay tree 纯模板

    2924: 营业额统计 Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 389       ...

  5. 1588: [HNOI2002]营业额统计 (splay tree)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 5783  Solved: 1859[Submit][Stat ...

  6. 洛谷P2234 [HNOI2002] 营业额统计 [splay]

    题目传送门 营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天 ...

  7. [HNOI2002]营业额统计 Splay tree入门题

    题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec   ...

  8. BZOJ1588 [HNOI2002]营业额统计 splay模板

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16189  Solved: 6482 [Submit][S ...

  9. bzoj1588: [HNOI2002]营业额统计(splay)

    1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...

  10. Bzoj 1588: [HNOI2002]营业额统计(splay)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

随机推荐

  1. Labview中引用,属性节点,局部变量之间的区别

    Labview中引用,属性节点,局部变量之间的区别        在Labview中我们经常会碰到这样几个概念,那就是控件的引用,属性节点以及局部变量,他们之间到底有哪些区别呢?        首先谈 ...

  2. VC++学习之VC中常见问题

    VC++学习之VC中常见问题 (1)为什么某个类突然在工作区间里面突然看不见了? 只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 ( ...

  3. Hive Map 端OOM 异常

    怪异现象:数据量不大,且不是Reduce端OOM,是Map端OOM Map Task运行的时候数据流中包含了非法字符例如:EOF.NOP等东西,导致BufferedReader读取和StreamDec ...

  4. 关于XPath的基本语法

    关于XPath基础语法 关于XPath基础语法 更详细的请看: XPath语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) ...

  5. sublime模式下开启vim并修改esc

    首先我用的是sublime text2 sublime下开启vim模式: 在Preference -> Setting-User里面加上 "ignored_packages" ...

  6. table常用

    <style> table,table td { border: 1px solid #ccc; border-collapse:collapse; } </style> 注意 ...

  7. BZOJ 3498 PA2009 Cakes(三元环处理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3498 [题目大意] N个点m条边,每个点有一个点权a. 对于任意一个三元环(j,j,k ...

  8. getDeclaredConstructor()与getConstructor的差别

    首先看getDeclaredConstructor(Class<?>... parameterTypes)  这种方法会返回制定參数类型的全部构造器,包含public的和非public的, ...

  9. SGU 242 Student&#39;s Morning 网络流(水

    题目链接:contest=0&problem=242">点击打开链接 题意: 给定n个人,m个终点 以下n行表示每一个人能够去m个点. 每一个人仅仅能去一个点. 输出随意一个方 ...

  10. Android基础之在Eclipes中关联SDK源码和查看SDK源码

    在进行Android应用开发的时候,我们有时候需要查看某个类或接口的源码从而了解如何去使用一个类或者实现一个接口,查看源码有助于我们的学习某个封装的类的底层是如何实现的,这样可以帮助我们掌握类或者接口 ...