2024.6.8
2024.6.8
比赛信息
比赛时间:8:10~12:00
出题人:马未然
题目内容
T1
题面
给定一个长为 \(m\) 的正整数序列 \(a\) ,求最多从 \(a\) 中选出多少个数,使得这些数的阶乘之积整除 \(n\text{!}\)
\(m,a\le 2\times10^5,n\le10^9\)
解法
可知,当 \(a_1<a_2\) 的时候,\(a_1\text{!}|a_2\text{!}\),所以可以贪心地将按照从小到大的顺序选择 \(a\) 。整除问题,考虑分解质因数。因为 \(a\) 的值域较小,以此入手,预处理出 \(2\times 10^5\) 以内的质数,则以如下方法分解质因数,最后逐个加入,得到答案。
抽象化方法
-
整除、因数、倍数等问题应该分解质因数
-
对连续信息进行处理的时候。可以以每个元素入手,基于其连续性整体处理。
例如:区间筛中,以质数入手对区间进行处理
本题中,以每个元素入手对进行 \(n!\) 进行高效分解
处理区间因子个数函数区间和的时候,应该从因子考虑
连续性息:值域上的区间、前后缀函数
T2
题面
给定一个长度为 \(n\) 的序列,每次可以合并其中连续的 \(k\) 个并将其异或和写在相应的位置上,直到只剩下一个数,求写下数字之和最小值
\(n\le500,k\le50\)
解法
区间DP
设 \(f_{l,r,c}\) 表示在区间 \(l\sim r\) 中合并成 \(c\) 个数的最小值,易得状态转移方程
边界: \(f_{i,i,1}=0\)
复杂度 \(\mathcal O(n^3k)\) 可以卡过
抽象化方法
-
划分区间——设法二分
一般的区间DP是将两个区间进行合并,而这个题是将 \(k\) 个区间进行合并,于是直接合并的复杂度从 \(\mathcal O(len)\) 变为了 \(\mathcal O({len\choose k})\simeq \mathcal O(len!)\) 。但是\(k=1+k-1\),这样就有了上式
T3
题面
给定 \(k\) 个区间,求构造满足以下条件的序列 \(\{a\}\) 的方案数
- 序列长度为 \(n\)
- \(\forall i\in[1,n], 1\le a_i\le m\)
- \(\forall i\in [1,k],[l_i,r_i]\)中存在相同的数
\(n,m\le 10^6,k\le 2000\)
解法
可以去掉包含的大区间
考虑容斥,一二为通用限制,三为受容斥限制,令 \(f_S\) 表示考虑只选 \(S\) 中的区间的方案数,则答案为
但这个直接计算的复杂度 \(\mathcal O(2^k)\) 的
但观察这个式子,发现当我们往 \(S\) 中加入一个元素时,其正负号取反,于是我们可以考虑每次往 \(S\) 中加入一个元素,进行考虑
对区间按照右端点排序,设 \(g_i=\sum\limits_{S\subset\{1,2,\cdots,i-1\},T=S\cup\{i\}}(-1)^{|S|}f_T\),其意义为考虑前 \(i\) 个区间,确定 \(i\) 必选时的不满足条件的区间数,则
抽象化方法
-
集合选择问题——增量法+统一考虑
在一个全局中选择若干的个元素考虑其价值,可以尝试依次往考虑集合中加入元素,用以前计算的结果更新他。其实就是背包问题的原理
将集合若干中选法捆绑整体考虑,减少状态。(当然有时不行,例如状压DP)
T4
题面
给定 \(m\) 个带权 \(c\) 点对 \((a,b)\),支持两种操作:
- 修改点权
- 给出 \(k\) 个点 \(p_i\),求满足 \(a\not=p_i\land b\not=p_i\) 的点对中第 \(x\) 小权值
\(a,b,m\le 10^5,k\le4\)
解法
当 \(k=0\) 的时候,本题变为模板题,可用权值线段树与平衡树解决。
当 \(k=1\) 的时候,相当于是从全局中去掉了若干个点,所以要使用维护可减性信息的权值线段树。我们可以对全局和每个点分别维护一棵权值线段树,查询的时候作减法
当 \(k>1\) 的时候,上述方法可能会使得一条边被减两次,按照容斥的思路,将其加回来就行了。
抽象化方法
- 当一个变量非常小的时候,寻找特例

浙公网安备 33010602011771号