可并堆 poj3016 不平衡的美

纠结了我好久。。。

众所周知,平衡树以维护树的平衡来达到高效,但一般来说维护平衡比较复杂,可保持不平衡就比较简单,于是,就有了左偏树这种不平衡的可并堆。

左偏树可以在2005年论文里找到,它不但实现简单,而且拥有一般数据结构所没有的合并操作,以及较优的复杂度(在此可以与只有天气良好,心情舒畅才能编的斐波那契堆,和合并复杂度未知的treap对比),可惜的是,应用面太小,经典问题也就那么几道,不过以后不知道有没有拓展。

poj 3016 是要求将一段长度为n的序列改造为有k段单调序列所需的最小费用。

很容易想到一个o(n^2*m)的动规方程f[i,j]:=min(f[i-1,k]+cost[k+1,j]),cost[i,j]为将[i,j]转为单调的最小费用,很明显,这就回到左偏树的经典解题——将一段区间改为非增或非降得最少费用上,两遍左偏树+贪心即可。


第一次打分割线


 把整个序列分成若干块,每一块都改成那一块的中位数,而且保证每个块的中位数不小于前一个块的,那么就用左偏树维护这几个块的中位数,用栈来维护这些块

算法流程:

S1:(假设前i-1个数的块已经分好了)先把第i个数以一个数新开个块

S2:检查栈顶top的块的中位数是不是比top-1的要小,如果是则转S3,否则继续做下一个数i+1直到n个数都做完

S3:合并top和top-1两个块,转S2

至于中位数怎么维护,其实是很简单的

一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值