博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HNOI 2002 营业额统计
阅读量:5976 次
发布时间:2019-06-20

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

评测地点:

简单题,splay

题意:

  按顺序给出一些数,找出距离当前数最近的数的差,将这些差求和即可。

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)>(y)?(y):(x))#define INF 0x3f3f3f3f#define MAXN 100005using namespace std;int cnt=1, rt=0;struct Tree{ int key, size, fa, son[2]; void set(int _key, int _size, int _fa) { key=_key; size=_size; fa=_fa; son[0]=son[1]=0; }}T[MAXN];inline void PushUp(int x){ T[x].size=T[T[x].son[0]].size+T[T[x].son[1]].size+1;}inline void Rotate(int x, int p) //0左旋 1右旋{ int y=T[x].fa; T[y].son[!p]=T[x].son[p]; T[T[x].son[p]].fa=y; T[x].fa=T[y].fa; if(T[x].fa) T[T[x].fa].son[T[T[x].fa].son[1] == y]=x; T[x].son[p]=y; T[y].fa=x; PushUp(y); PushUp(x);}void Splay(int x, int To) //将x节点插入到To的子节点中{ while(T[x].fa != To) { if(T[T[x].fa].fa == To) Rotate(x, T[T[x].fa].son[0] == x); else { int y=T[x].fa, z=T[y].fa; int p=(T[z].son[0] == y); if(T[y].son[p] == x) Rotate(x, !p), Rotate(x, p); //之字旋 else Rotate(y, p), Rotate(x, p); //一字旋 } } if(To == 0) rt=x;}int find(int key) //返回值为key的节点 若无返回0 若有将其转移到根处{ int x=rt; while(x && T[x].key != key) x=T[x].son[key > T[x].key]; if(x) Splay(x, 0); return x;}int prev() //返回比根值小的最大值 若无返回0 若有将其转移到根处{ int x=T[rt].son[0]; if(!x) return 0; while(T[x].son[1]) x=T[x].son[1]; //Splay(x, 0); return x;}int succ() //返回比根值大的最小值 若无返回0 若有将其转移到根处{ int x=T[rt].son[1]; if(!x) return 0; while(T[x].son[0]) x=T[x].son[0]; //Splay(x, 0); return x;}void Insert(int key) //插入key 并且将该节点转移到根处{ if(!rt) T[rt = cnt++].set(key, 1, 0); else { int x=rt, y=0; while(x) { y=x; x=T[x].son[key > T[x].key]; } T[x = cnt++].set(key, 1, y); T[y].son[key > T[y].key]=x; Splay(x, 0); }}int getclose(int key){ if(!rt) return 0; int x=rt, ret=2000000000; while(x) { ret=min(ret, abs(T[x].key-key)); x=T[x].son[key > T[x].key]; } return ret;}int main (){ int n, x, ans, mi; scanf("%d%d", &n, &x); Insert(x); ans=x; while(--n) { if(scanf("%d", &x)==EOF) x=0; ans+=getclose(x); Insert(x); } printf("%d\n", ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/Mathics/p/3971556.html

你可能感兴趣的文章
强迫症慎入:一大票让人看哭的音量键设计即将袭来
查看>>
客户端验证:JQuery Validation Plugin
查看>>
《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...
查看>>
《Excel 职场手册:260招菜鸟变达人》一第 1 招 快捷键的妙用(基于Windows操作系统)...
查看>>
为什么世界需要 OpenStreetMap 开源道路地图
查看>>
《微信公众平台开发最佳实践》——第3章 基 础 接 口 3.1 接收用户消息
查看>>
《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》——3.3 微信开发者中心...
查看>>
融入产业生态的靶向孵化
查看>>
阿里内核月报2014年4月
查看>>
《Dreamweaver CS6完美网页制作——基础、实例与技巧从入门到精通》——1.3 常用网页设计软件...
查看>>
《PHP和MySQL Web开发从新手到高手(第5版)》一2.9 删除存储的数据
查看>>
《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一1.5 大数据系统应有的属性...
查看>>
easy_runner一个简单的压测程序
查看>>
《C++编程惯用法——高级程序员常用方法和技巧》——2.9 静态对象的构造
查看>>
学习AI可能不需要那么多数学知识:20小时进阶计划
查看>>
[快速技巧]通过命令在 Debian/Ubuntu 中设置默认浏览器
查看>>
巧用linux云服务器下的的/dev/shm/,避开磁盘IO不给力!
查看>>
《众妙之门——Web用户体验设计与可用性测试》一2.3 总结
查看>>
《Java遗传算法编程》—— 1.5 生物进化
查看>>
高端唯有定制,把 sublime 打造成专属的 IDE
查看>>