暑期水题乱做

P1168 中位数

记录当前中位数,维护一个大根堆存储小于中位数的数,一个小根堆存储大于等于中位数的数。

当需要输出中位数时,比较一下两个堆的大小,如果差值为 (2),则将当前中位数扔进数较少的那个堆里,数较多的那个堆的堆顶取出作为新的中位数。

P1631 序列合并

因为两数列一开始已经排好序了,所以当取了 (A_i+B_j) 这组后,(A_{i+p}+B_{j+q}(p>0,qgeq 0)) 不可能在 (A_{i+1}+B_j) 前面取,(A_{i+p}+B_{j+q}(pgeq 0,q>0)) 不可能在 (A_i+B_{j+1}) 前面取。

一开始先将 (A_1+B_1) 这组丢进小根堆,每次取出堆顶的 (A_i+B_j) 后就将 (A_{i+1}+B_j)(A_i+B_{j+1}) 丢进堆。

注意判重,可以用数组记录每个 (A) 现在最大取到哪个 (B) 了,如果不是最大就不丢。

或者有一个更优美的方法,一开始将 (A_{1sim N}+b_1) 全部丢进去,每次取出后只要将 (B) 换成下一个丢回去即可。

P1392 取数

显然可以一行一行考虑,每次保留前面最小的 (k) 个。

时间复杂度 (O(nmax{m,k}logmax{m,k})),显然 (kleq m) 这个限制只是为了好写一点而已。

原文地址:https://www.cnblogs.com/May-2nd/p/15064911.html