纠结了我好久。。。
众所周知,平衡树以维护树的平衡来达到高效,但一般来说维护平衡比较复杂,可保持不平衡就比较简单,于是,就有了左偏树这种不平衡的可并堆。
左偏树可以在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
至于中位数怎么维护,其实是很简单的
一个