专栏文章

两个序列任意选相同数量元素

算法·理论参与者 6已保存评论 8

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
8 条
当前快照
2 份
快照标识符
@miexblqz
此快照首次捕获于
2025/11/26 02:43
3 个月前
此快照最后确认于
2025/12/01 19:27
3 个月前
查看原文
标题应该叫什么。?
给定序列 a=(a1,a2,...,an)a=(a_1,a_2,...,a_n)b=(b1,b2,...,bm)b=(b_1,b_2,...,b_m)
对于问题:从 aabb 中分别选出 kk 个元素。
解决方案:考虑 aa 选了的和 bb 没选的元素加起来恰好 mm 个。
这样,kk 的具体值我们就不用关心了。

11
k=0n(ni)(mi)\displaystyle \sum\limits_{k=0}^n\binom{n}{i}\binom{m}{i}
多组询问,1q1061\le q\le10^61nm1061\le n\le m\le10^6

考虑上述思路,相当于从 n+mn+m 个物品中任意选 mm 个物品的方案数。
其中前 nn 个物品中当前选到表示原来的选到,后 mm 个物品中选到表示原来的没选到
原式 =(n+mm)=(n+m)!(n!)1(m!)1\displaystyle=\binom{n+m}{m}=(n+m)!(n!)^{-1}(m!)^{-1},预处理阶乘逆元即可。

22
需要维护多重集合 aabb
11,在 aabb 中加入或删除一个元素 x(106x106)x(-10^6\le x\le10^6)
22,在 aabb 中选择相同数量的元素,最小化选出元素之和并输出。
操作 10610^6 次。

先考虑正常做法。
维护一个权值线段树或树状数组,由于(排序后)选出的 aabb 单调递减,二分选择的元素数量 kk 使得 ak+bk<0a_k+b_k<0 即可。
因为在权值处维护,aka_kbkb_k 不在数据结构的同一位置。发现二分放不进去数据结构里,只能做到 O(nlog2n)O(n\log^2{n})

考虑用上面的技巧。
aa 选的和 bb 不选的元素总数一定是 bb 的元素总数。
稍微转换一下,先钦定选了所有的 bib_i,然后把 aia_ibi-b_i 放进线段树或树状数组。
想要找到桶中的前 mm 个之和,显然线段树或树状数组二分,时间复杂度 O(nlogn)O(n\log{n})

总结:以上面的为例,排列组合等价的东西实在是太多了,因此彻底明白本质是困难的,我们只需要找到一条路径就可以。

评论

8 条评论,欢迎与作者交流。

正在加载评论...