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

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

这道题还是Treap查找前驱/后继。

与这题不同的地方在于这题的前驱和后继是可以等于其原数的。。。

开始我还以为只要每次查询之前的最小值,搞个堆就好了。。。

#include 
const int inf=0x3f3f3f3f;int N,Ans;struct Treap{ Treap *ch[2]; int size,cnt,r,v; Treap(int x) { size=cnt=1; r=rand(); v=x; ch[0]=ch[1]=NULL; } int cmp(int x) { if(x==v) return -1; return x>v; } void maintain() { size=cnt+((ch[0]==NULL)?0:ch[0]->size)+((ch[1]==NULL)?0:ch[1]->size); }}*root;void rotate(Treap* &o,int d){ Treap *k=o->ch[d^1]; o->ch[d^1]=k->ch[d]; k->ch[d]=o; o->maintain(),k->maintain(); o=k;}void insert(Treap* &o,int x){ if(o==NULL) o=new Treap(x); else { if(o->v==x) ++(o->cnt); else { int d=o->cmp(x); insert(o->ch[d],x); if(o->ch[d]->r>o->r) rotate(o,d^1); } } o->maintain();}int upper(Treap *o,int x){ if(o==NULL) return -inf; if(o->v>x) return upper(o->ch[0],x); else return std::max(o->v,upper(o->ch[1],x));}int lower(Treap *o,int x){ if(o==NULL) return inf; if(o->v
ch[1],x); else return std::min(o->v,lower(o->ch[0],x));}inline int read(){ register int x=0,v=1; register char ch=getchar(); while(!isdigit(ch)) { if(ch=='-') v=-1; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+ch-'0'; ch=getchar(); } return x*v;}int main(){ int t; N=read(); for(register int i=1;i<=N;++i) { t=read(); if(root==NULL) Ans+=t; else Ans+=std::min(lower(root,t)-t,t-upper(root,t)); insert(root,t); } printf("%d\n",Ans); return 0;}

转载于:https://www.cnblogs.com/zcdhj/p/8284586.html

你可能感兴趣的文章
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>
JSP、Servlet乱码终极解决方案
查看>>
旅途上看的电影和观后感
查看>>
qt实现类似QQ伸缩窗口--鼠标事件应用
查看>>
Ztree异步树加载
查看>>
复杂问题的简单抽象:魔兽世界中的兔子们
查看>>
UVA 10529-Dumb Bones(概率dp)
查看>>
关于IE和火狐,谷歌,Safari对Html标签Object和Embed的支持问题
查看>>
MyEclipse DB Browser使用图文全攻略
查看>>
poj3320 Jessica's Reading Problem(尺取思路+STL)
查看>>
A - Vasya and Socks
查看>>
项目管理、设计开发、代码管理、bug管理工具介绍
查看>>
分布式计算开源框架Hadoop介绍
查看>>
安卓平台接口剖析
查看>>
linux文件编码查看与修改
查看>>
[Java] 系统环境变量配置
查看>>
坏的事情不都会带来坏的结果
查看>>
RPC的基础:调研EOS插件http_plugin
查看>>