思路: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. django后台将最新文章显示在前面

    在你定义的views.py中修改 Models.objects.order_by("-pub_date")    更据时间排列 Models.objects.order_by(&q ...

  2. CNN超参数优化和可视化技巧详解

    https://zhuanlan.zhihu.com/p/27905191 在深度学习中,有许多不同的深度网络结构,包括卷积神经网络(CNN或convnet).长短期记忆网络(LSTM)和生成对抗网络 ...

  3. STL容器之list

    [1]list简介 实质上,list容器就是一个双向链表,可以高效地进行插入.删除操作. [2]list链表常用方法 (1)构造.赋值.清空.删除.插入.判空等 应用示例代码如下: #include ...

  4. caffe_ssd学习-用自己的数据做训练

    几乎没用过linux操作系统,不懂shell编程,linux下shell+windows下UltraEdit勉勉强强生成了train.txt和val.txt期间各种错误辛酸不表,照着examples/ ...

  5. vm无法删除干净老版本,新版本无法安装解决

    百度中搜索“Windows Installer Clean UP 简体中文版”来下载安装好 开始程序,打开此软件, 找到vm,点remove 再次安装vm新版本,ok

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

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

  7. Linux服务器---邮件服务openwebmail安装

    安装openwebmail  openwebmail提供了可视化的邮件管理系统,它运行在Apache环境下. 1.安装必备软件 [root@localhost ~]# yum install –y p ...

  8. java获取前一天时间SimpleDateFormat,java判断某个时间段

    java获取前一天时间SimpleDateFormat SimpleDateFormat predf = new SimpleDateFormat("yyyy-MM-dd"); D ...

  9. Oracle执行计划 explain plan

    Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...

  10. asp.net热门框架

    http://developer.51cto.com/art/201501/464292.htm