水的合集 1

集合挑选

从给定的N个集合中各挑出一个数并求和,求出前KK大的KK个和。

考虑如何从2个集合AA,BB中选出前KK大。降序排序后a1a_1b1b_1显然是最大,第二大则是(a1,b2)(a_1,b_2)或者(a2,b1)(a_2,b_1)。不妨以(a1,b2)(a_1,b_2)来讲,那么第三大竞争者除(a2,b1)(a_2,b_1)还有(a1,b3)(a_1,b_3)(a2,b3)(a_2,b_3)……每对组合都能找到直接小于它的2个组合,而这种后继关系显然取遍了所有组合。仅需要前K大的我们按需扩展这一棵树即可。2个集合的前K大可与第3个集合执行相同的操作,从而得到最终答案。实际编写时,按照一定顺序限制扩展方向来保证每个方案仅访问一次,使用优先队列维护,复杂度为O(NKlognk)O(KN)O(\sum^N{K\log n_k}) \leq O(KN)

LIS优化

f(i)=max{f(j)j<i,a(j)<a(i)}+1f(i)=max\{f(j)| j < i, a(j) < a(i) \}+1

可以发现,一旦有a(k)<a(j),f(k)f(j)a(k) < a(j), f(k) \geq f(j),j这个位置就没有用了。按照该规律维护一个单调栈记录,以长度单调(则数字a结尾的LIS自然单调)。此后转移


水的合集 1
https://blog.chenc.me/2019/07/21/water-series/
作者
CC
发布于
2019年7月22日
许可协议