思路:Splay数查找前驱后继

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LS(n) node[(n)].ch[0]
#define RS(n) node[(n)].ch[1]
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = + ;
int n;
int cnt;
int root; struct splay{
int ch[], size, cnt, val, fa;
}t[maxn]; int gi(){
int ans = , f = ; char i = getchar();
while(i<''||i>''){if(i=='-')f=-;i=getchar();}
while(i>=''&&i<=''){ans=ans*+i-'';i=getchar();}
return ans * f;
} void out(int x){
if(t[x].ch[]) out(t[x].ch[]);
printf("%d ",t[x].val);
if(t[x].ch[]) out(t[x].ch[]);
} int get(int x){
return t[t[x].fa].ch[] == x;
} void up(int x){
t[x].size=t[t[x].ch[]].size+t[t[x].ch[]].size+t[x].cnt;
} void rotate(int x){
int fa = t[x].fa , gfa = t[fa].fa;
int d1 = get(x) , d2 = get(fa);
t[fa].ch[d1]=t[x].ch[d1^] , t[t[x].ch[d1^]].fa=fa;
t[gfa].ch[d2]=x , t[x].fa=gfa;
t[fa].fa=x , t[x].ch[d1^]=fa;
up(fa); up(x);
} void splay(int x,int goal){
while(t[x].fa != goal){
int fa = t[x].fa, gfa = t[fa].fa;
int d1 = get(x), d2 = get(fa);
if(gfa != goal){
if(d1 == d2) rotate(fa);
else rotate(x);
}
rotate(x);
}
if(goal == ) root = x;
} int find(int val){
int node = root;
while(t[node].val != val && t[node].ch[t[node].val<val])
node = t[node].ch[t[node].val<val];
return node;
} void insert(int val){
int node = root, fa = ;
while(t[node].val != val && node)
fa = node, node = t[node].ch[t[node].val<val];
if(node) t[node].cnt++;
else{
node = ++cnt;
if(fa) t[fa].ch[t[fa].val<val] = node;
t[node].size = t[node].cnt = ;
t[node].fa = fa; t[node].val = val;
}
splay(node , );
} //注意,返回的是结构体下标
//注意修改判断时的等于号
int pre(int val,int kind){ //0前驱,1后继
splay(find(val) , ); int node = root;
if(t[node].val <= val && kind == ) return node;
if(t[node].val >= val && kind == ) return node;
node = t[node].ch[kind];
while(t[node].ch[kind^])
node = t[node].ch[kind^];
return node;
} void delet(int val){
int last = pre(val,), next = pre(val,);
splay(last , ); splay(next , last);
if(t[t[next].ch[]].cnt > ){
t[t[next].ch[]].cnt--;
splay(t[next].ch[] , );
}
else t[next].ch[] = ;
} int kth(int k){
int node = root;
if(t[node].size < k) return INF;
while(){
int son = t[node].ch[];
if(k <= t[son].size) node = son;
else if(k > t[son].size+t[node].cnt){
k -= t[son].size+t[node].cnt;
node = t[node].ch[];
}
else return t[node].val;
}
} int get_rank(int val){
splay(find(val) , );
return t[t[root].ch[]].size;
}
int main(){
int a;
root = cnt = ;
int ans = ;
insert(INF), insert(-INF);
scanf("%d%d", &n, &a);
insert(a);
ans += a;
for(int i = ; i <= n - ; i++){
scanf("%d", &a);
int p1 = t[pre(a, )].val;
int p2 = t[pre(a, )].val;
ans += min(abs(p1 - a), abs(p2 - a));
insert(a);
}
printf("%d\n", ans);
return ;
}

P2234 [HNOI2002]营业额统计(Splay树)题解的更多相关文章

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

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

  2. SET || BZOJ 1588: [HNOI2002]营业额统计 || Luogu P2234 [HNOI2002]营业额统计

    题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #inclu ...

  3. [luogu P2234] [HNOI2002]营业额统计

    [luogu P2234] [HNOI2002]营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...

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

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

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

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

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

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

  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. Bzoj 1588: [HNOI2002]营业额统计(splay)

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

随机推荐

  1. python读取大文件

    最近在学习python的过程中接触到了python对文件的读取.python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.rea ...

  2. java 的Colections类(Java也有python类似列表的反转、排序等方法)

    1.Collections类概述         针对集合操作 的工具类,都是静态方法   2.Collections成员方法         public static <T> void ...

  3. c# 类的知识

    在英语中类(class)是分类(classification)的根词.设计类的过程就是对信息进行分类,将相关信息放到有意义的实体中. 封装的目的: 封装就是定义类的重要原则.中心思想是:使用类的程序不 ...

  4. 20165215 学习基础和c语言基础调查

    学习基础和c语言基础调查 <做中学>读后感与技能学习心得 读后感 Don't watch the clock. Do what it does. Keep going. 不要只看时钟,要效 ...

  5. JAVA程序测试感受

    上周四下午,我们进行了JAVA测试,心里很慌,在家中只是学习了JAVA程序的输入.输出以及各种数据类型使用而已,王建民老师给我们发了一份JAVA的课前测试样卷,是关于学生信息管理系统的,我们提前从学长 ...

  6. JustOj 1994: P1001

    题目描述         给定一个长度为N(0< n< =10000)的序列,保证每一个序列中的数字a[i]是小于maxlongint的非负整数  ,编程要求求出整个序列中第k大的数字减去 ...

  7. bzoj2656 [Zjoi2012]数列(sequence)

    题目链接 好久没写高精度了,调了很久QAQ 如果直接递归计算答案的话肯定会T 发现一个数不管是分成一奇一偶还是直接>>1,都会重复计算很多东西 我们只需要在递归的时候实时维护一个xx(an ...

  8. 使用github管理Eclipse分布式项目开发

    使用github管理Eclipse分布式项目开发 老关我在前面的博文(github管理iOS分布式项目开发)中介绍了github管理iOS分布式开发,今天老关将向大家介绍使用github管 理Ecli ...

  9. ORCAl存储过程

    1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( para1 varchar2, para2 out varchar2, para3 in ...

  10. ubunta apt install error

    ubuntu系统: 用apt-get命令安装一些软件包时,总报错:E:could not get lock /var/lib/dpkg/lock -open等 出现这个问题的原因可能是有另外一个程序正 ...