博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC日记——营业额统计 codevs 1296 (splay版)
阅读量:7015 次
发布时间:2019-06-28

本文共 2686 字,大约阅读时间需要 8 分钟。

 

思路:

  每次,插入一个点;

  然后找前驱后继;

 

来,上代码:

#include 
#include
#include
using namespace std;#define maxn 33000#define INF 0x7fffffffstruct TreeNodeType { int w,key,opi,size,ch[2];};struct TreeNodeType tree[maxn];int n,root,tot,X,ans;inline void updata(int now){ tree[now].size=tree[now].w; if(tree[now].ch[0]) tree[now].size+=tree[tree[now].ch[0]].size; if(tree[now].ch[1]) tree[now].size+=tree[tree[now].ch[1]].size;}inline int getson(int now){ return tree[tree[now].opi].ch[1]==now;}inline void rotate(int now){ int opi=tree[now].opi,fopi=tree[opi].opi,pos=getson(now); tree[opi].ch[pos]=tree[now].ch[pos^1]; tree[tree[now].ch[pos^1]].opi=opi; tree[now].ch[pos^1]=opi; tree[now].opi=fopi; tree[opi].opi=now; if(fopi) tree[fopi].ch[tree[fopi].ch[1]==opi]=now; updata(opi),updata(now);}inline void splay(int now){ for(int opi;opi=tree[now].opi;rotate(now)) { if(tree[opi].opi) rotate(getson(now)==getson(opi)?opi:now); } root=now;}inline void insert(){ if(!root) { tree[++tot].key=X; tree[tot].opi=0; tree[tot].w=tree[tot].size=1; tree[tot].ch[0]=tree[tot].ch[1]=0; root=tot; } else { int now=root,opi=0; while(1) { if(tree[now].key==X) { tree[now].w++; tree[now].size++; splay(now); break; } opi=now,now=tree[now].ch[X>tree[now].key]; if(!now) { tree[++tot].key=X; tree[tot].opi=opi; tree[tot].w=tree[tot].size=1; tree[tot].ch[0]=tree[tot].ch[1]=0; tree[opi].ch[X>tree[opi].key]=tot; splay(tot); break; } } }}inline int pre(){ if(tree[root].w>1) return tree[root].key; int now=tree[root].ch[0]; if(now==0) return INF; while(tree[now].ch[1]) now=tree[now].ch[1]; return tree[now].key;}inline int suc(){ int now=tree[root].ch[1]; if(now==0) return INF; while(tree[now].ch[0]) now=tree[now].ch[0]; return tree[now].key;}inline void in(int &now){ register int if_z=1;now=0; register char Cget=getchar(); while(Cget>'9'||Cget<'0') { if(Cget=='-') if_z=-1; Cget=getchar(); } while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); } now*=if_z;}int main(){ in(n),in(X); ans=X,n--,insert(); while(n--) { in(X),insert(); int p=pre(),s=suc(); ans+=min(abs(X-p),abs(s-X)); } cout<

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6719096.html

你可能感兴趣的文章
手机端H5点击类目自动定位到相应内容
查看>>
agc032
查看>>
WCF 第二章 契约 实现一个双向契约的服务端部分
查看>>
我的Java开发学习之旅------>Java经典排序算法之快速排序
查看>>
我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计
查看>>
Docker监控怎么做?
查看>>
tps 和 qps的区别
查看>>
OAF_开发系列17_实现OAF数组应用Vector / Hashmap / Hashtable / Arraylist(案例)
查看>>
与继承相关的一些重构(二)
查看>>
22 UI_布局之线性布局-动态生成与LayoutInflater
查看>>
关于三元运算符的一个问题
查看>>
11.04T1 枚举
查看>>
滑雪 记忆化搜索简单模型
查看>>
生成随机字符串 可以用在项目上作为 单号之类的
查看>>
简单的 canvas 翻角效果
查看>>
window 7 下面解决修改hosts文件
查看>>
android笔试题二
查看>>
TP5数据库操作方法
查看>>
qu(判定操作序列)NOIP模拟 数据结构判断 模拟
查看>>
Linux杂学
查看>>