BZOJ1588 营业额统计 splay tree

最基本的平衡树操作吧,第一次学splay的可以做一下

只需要插入,删除,旋转,求前驱,后继这5个操作吧

不喜欢用指针,用数组写的


<span style="color:#00cccc;">//HNOI2002营业额统计
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define INF 1<<30
#define N 100005
using namespace std;
int pre[N],key[N],ch[N][2],root,tot,n;
// 分别表示 父节点 、键值、左右子节点(0为左孩子,1为右孩子) 、根节点 、节点数目

void Newnode(int &p,int fa,int keyy) //新建一个节点
{
p=++tot;
pre[p]=fa;
key[p]=keyy;
ch[p][0]=ch[p][1]=0;
}

void Rotate(int x, int kind)//k为1时右旋, k为0时左旋
{
int y=pre[x];
ch[y][!kind]=ch[x][kind];
pre[ch[x][kind]]=y;
if (pre[y])//如果父节点不是根结点,则要和父节点的父节点连接起来
ch[pre[y]][ch[pre[y]][1]==y]=x;
pre[x]=pre[y];
ch[x][kind]=y;
pre[y]=x;
}

void Splay(int r,int goal)////Splay调整,将根为r的子树调整为goal
{
while (pre[r]!=goal)
{
if (pre[pre[r]]==goal)//父节点即是目标位置,goal为0表示,父节点就是根结点
Rotate(r,ch[pre[r]][0]==r);
else
{
int y=pre[r];
int kind=ch[pre[y]][0]==y;
if (ch[y][kind]==r)
{
Rotate(r,!kind);
Rotate(r,kind);
}
else
{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
if (goal==0) root=r;
}

int Insert(int k)
{
while (ch[root][key[root]<k])
{
if (key[root]==k)
{
Splay(root,0);
return 0;
}
root=ch[root][key[root]<k];
}
Newnode(ch[root][k>key[root]],root,k);
Splay(ch[root][k>key[root]],0);
return 1;
}
int get_pre(int x)
{
int tmp=ch[x][0];
if (tmp==0) return INF;
while (ch[tmp][1]) tmp=ch[tmp][1];
return key[tmp];
}

int get_next(int x)
{
int tmp=ch[x][1];
if (tmp==0) return INF;
while (ch[tmp][0]) tmp=ch[tmp][0];
return key[tmp];
}

int main()
{
while (scanf("%d",&n)!=EOF)
{
root=tot=0;
int ans=0;
for (int i=1; i<=n; i++)
{
int num;
if (scanf("%d",&num)==EOF) num=0;
if (i==1)
{
ans+=num;
Newnode(root,0,num);
continue;
}
if (Insert(num)==0) continue;
int a=get_next(root);
int b=get_pre(root);
ans+=min(abs(a-key[root]),abs(key[root]-b));
}
printf("%d",ans);
}
return 0;
}

BZOJ1588 营业额统计 splay tree

时间: 2024-10-22 02:34:09

BZOJ1588 营业额统计 splay tree的相关文章

HNOI2002]营业额统计 Splay tree

保存模板: 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<string> 6 #include<string.h> 7 8 typedef long long ll; 9 using namespace std; 10 #define N 100005 11 #define inf 1<<

1588: [HNOI2002]营业额统计 splay tree

//http://www.lydsy.com/JudgeOnline/problem.php?id=1588 //题意:每读入一个数,在前面输入的数中找到一个与该数相差最小的一个,把所有的差值绝对值加起来并输出 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int maxn = 100010; 4 const int INF = 0x3f3f3f3f; 5 struct SplayTreeNode 6 { 7 int

BZOJ 1588 营业额统计 Splay

主要操作为Splay中插入节点,查找前驱和后继节点. 1: #include <cstdio> 2: #include <iostream> 3: #include <cmath> 4: using namespace std; 5: #define MaxL 100005 6: #define INF 0x7ffffff 7: #define keyTree sp[sp[root].child[1]].child[0] 8:   9: struct SplayTree

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

[HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业 额会出现一定的波动,当然一定的波动是能够接受

【BZOJ-1588】营业额统计 Splay

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12485  Solved: 4508[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

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

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16189  Solved: 6482 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

bzoj1588 营业额统计 题解--Treap

Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大

tyvj 1185 营业额统计 splay入门

第一道splay,算是学会了最最基础的splay操作. 有一点要特别注意,就是一字型旋转的时候要先旋转y再旋x,这样复杂度降低很多...不要写成两次都旋转x... #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000

bzoj1588: [HNOI2002]营业额统计 splay瞎写

最近各种瞎写数论题,感觉需要回顾一下数据结构 写一发splay冷静一下(手速过慢,以后要多练练) 用splay是最直接的方法,但我感觉离散一波应该可以做出来(没仔细想过) 现在没有很追求代码优美,感觉得先打的对打的快O(∩_∩)O 1 #include <bits/stdc++.h> 2 #define INF 1000000000 3 using namespace std; 4 int root,N,n,x; 5 int fa[100005],c[100005][2],a[100005];