转载请注明出处,谢谢: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. IOS 特定于设备的开发:使用加速能力“向上定位”

    iPhone提供了3个机载的传感器,用于沿着iPhone的3根相互垂直的轴(左/右(x轴).上/下(y轴)和前/后(z轴))度量加速能力.这些值指示作用于iPhone的力,它们来自重力和用户移动.可以 ...

  2. linux 6.4平台利用rman迁移oracle 11g r2数据库

    测试环境分别在虚拟机安装A,B主机 系统:linux 6.4, 数据库:oracle 11g r2 A主机:安装oracle 11g r2数据库 B主机:只安装oracle 11g r2软件 第一步, ...

  3. 9_Permanent Storage

    9 // // ViewController.swift // Permanent Storage // // Created by ZC on 16/1/9. // Copyright © 2016 ...

  4. NAND FLASH特性说明

    1.NAND FLASH 的特殊性. 1)存在坏块.由于NAND生产工艺的原因,出厂芯片中会随机出现坏块.坏块在出厂时已经被初始化,并在特殊区域中标记为不可用,在使用过程中如果出现坏块,也需要进行标记 ...

  5. Android SharedPreference最佳实践

    Android提供多种方式保存应用数据,其中一种方式是SharedPreferences,使用键值对保存私有基本的数据.所有的逻辑仅基于以下三个类: SharedPreferences SharedP ...

  6. objective-C Ⅱ

    objective-C Ⅱ      接第一讲 objective-c初识 一.oc中的数组:NSArray 定义: NSArray *arrayName=[NSArray arrayWithObje ...

  7. Android 之窗口小部件高级篇--App Widget 之 RemoteViews - 跨到对岸去

    在之前的一篇博文( Android 之窗口小部件详解--App Widge t)中,已经介绍了App Widget的基本用法和简单实例.这篇主要讲解 App Widget 的高级内容,即通过 Remo ...

  8. Head First设计模式学习笔记

    最近在学C++,直接语法之后觉得不太有意思,直接做项目又觉得太肤浅.正好之前一直想学设计模式来着,可惜之前一直在玩C,所以没有机会深入学习,于是决定用C++把设计写一遍.看了点GOF的<设计模式 ...

  9. ceph启动脚本

    放在/etc/init.d/目录下,用法如下: root@u253:~# /etc/init.d/ceph === mon.a === usage: /etc/init.d/ceph [options ...

  10. CDH集群频繁告警(host频繁swapping)

    最近CDH集群频繁告警,原因是某些host频繁swapping,极大影响了集群的性能. 后来发现有个设置(/proc/sys/vm/swappiness)需要修改,默认值60 Setting the ...