暑期水题乱做
P1168 中位数
记录当前中位数,维护一个大根堆存储小于中位数的数,一个小根堆存储大于等于中位数的数。
当需要输出中位数时,比较一下两个堆的大小,如果差值为 \(2\),则将当前中位数扔进数较少的那个堆里,数较多的那个堆的堆顶取出作为新的中位数。
P1631 序列合并
因为两数列一开始已经排好序了,所以当取了 \(A_i+B_j\) 这组后,\(A_{i+p}+B_{j+q}(p>0,q\geq 0)\) 不可能在 \(A_{i+1}+B_j\) 前面取,\(A_{i+p}+B_{j+q}(p\geq 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_{1\sim N}+b_1\) 全部丢进去,每次取出后只要将 \(B\) 换成下一个丢回去即可。
P1392 取数
显然可以一行一行考虑,每次保留前面最小的 \(k\) 个。
时间复杂度 \(O(n\max\{m,k\}\log\max\{m,k\})\),显然 \(k\leq m\) 这个限制只是为了好写一点而已。