『DP』做题记录2
集训水 \(dp\) 好题。
\(\text{2022.8.4} \ \text{gdfz} \ \text{contest} \ \text{A}\)
题意:给定一个正整数 \(n\) ,求正整数序列 \(a\) 的最大可能长度 \(L\) ,其中对于任意 \(1 \leq i < j \leq L\) 有:
\(a_i \leq a_j\)
\(\text{lcm} (a_i,a_j) | n\)
\(a_i \text{lcm}(a_i,a_j)+a_j \gcd(a_i,a_j) > 2a_ia_j\)
其中 \(n \leq 10^{12}\)
首先看到第三个式子极丑无比,先简化:
\(\dfrac{a_i^2a_j}{\gcd(a_i,a_j)}+a_j \gcd(a_i,a_j) > 2a_ia_j\)
\(a_i^2a_j+a_j \gcd^2(a_i,a_j) > 2a_ia_j\gcd(a_i,a_j)\)
\(a_i^2+\gcd^2(a_i,a_j) > 2a_i\gcd(a_i,a_j)\)
\((a_i-\gcd(a_i,a_j))^2 > 0\)
\(a_i \not=\gcd(a_i,a_j)\)
\(a_i \nmid a_j\)
接下来只需要求解最长的不存在整除序列即可,第二个式子可看成 \(a_i | n ,a_j | n\) 即序列都为 \(n\) 的因子。
我们考虑贪心,对于取的所有 \(a_i\) ,其质因子幂次和必定相同,否则对于存在一个高幂次和的数,其可转化成多个低幂次的数,这样必定不优,同幂次数必定不会有倍数关系。
考虑 \(dp\) 求解,将 \(n\) 因式分解,对于 \(n\) 本质不同质因子之多存在 \(13\) 个,所以设计 \(f_{i,j}\) 表示前 \(i\) 个本质不同质因子总共选取幂次和为 \(j\) 的方案数。
那么答案一定是 \(\max(f_{k,j})\) ,其中 \(k\) 为 \(n\) 的质因子个数。
复杂度 \(O(13 \log n + \sqrt{n})\) 。
CF930C
有一个显然的性质是,如果询问者得知的元素不是一个峰,那这说明必定不存在一个属于大区间的整数被所有的小区间包含。
那么我们考虑求解每个位置前面的 \(LIS\) 和 后面的 \(LIS\) 即可。
复杂度 \(O(n log n)\) 。
CF156C
首先为了表达方便,我们将 \([a,z]\) 映射到 \([1,26]\) 上去。
其实题目就是求 \(\sum_{i=1}^{len} x_i=s\) 这个不定方程解的个数。
然后考虑 \(dp\) ,设计如下状态 \(f_{i,j}\) 表示前 \(i\) 个数,和为 \(j\) 。
转移比较容易,就不放了。
复杂度 \(O(26n^2+qn)\) 。
CF1106E
考虑没有干扰,很显然的一个事实是 \(Bob\) 在任意时刻取的红包是固定的,那么可以通过优先队列预处理出每个时刻 \(Bob\) 取的红包。
对于存在干扰,发现 \(m\) 很小,直接 \(dp\) ,设 \(f_{i,j}\) 表示第 \(i\) 时刻,干扰了 \(j\) 次的最小价钱。
显然得转移是:
干扰: \(f_{i+1,j+1}=min(f_{i+1,j+1},f_{i,j})\)
没干扰,但是当时没红包可拿: \(f_{i+1,j}=min(f_{i+1,j},f_{i,j})\)
没干扰,且当时有红包可拿: \(f_{d_i+1,j}=min(f_{d_i+1,j},f_{i,j}+w_i)\)
答案不一定全都干扰,干扰多少次要枚一发。
复杂度 \(O(n \log n+nm)\) 。
CF900D
首先发现 \(y \% x \not=0\) 时必定无解。
否则我们相当于求 \(\gcd_{i=1}^{n} a_i=1\) 且 \(\sum_{i=1}^{n}a_i=\dfrac{y}{x}\) 的方案数。
我们考虑设 \(f_x\) 表示 和为 \(x\) 且 \(\gcd\) 为 \(1\) 的方案数, \(g_x\) 表示和为 \(x\) 的方案数。
对于 \(g_x\) ,显然可以考虑插板 \(g_x=\sum_{i=1}^{x} C_{x-1}^{i-1}=2^{x-1}\) 。
我们同样可以写出 \(g_{x}=\sum_{d|x} f_d\) ,莫反一下得 \(f_x=\sum_{d|x} \mu(\dfrac{x}{d})g(d)\) 。
考虑 \(n\) 的唯一因式分解,对于一个质因子 \(p\) 只用考虑选或不选即可,而本质不同质因子必定不超过 \(10\) 个。
复杂度 \(O(\sqrt{n}+2^{10} \log n)\) ,其中 \(\log\) 是算 \(g\) 的复杂度。
CF883I
首先升序排列,那么贪心得取,必定是取连续的段。
我们考虑二分答案,对于答案 \(u\) ,我们考虑如何 \(check\) 。
考虑先设计一个 \(O(n^2)\) 的 \(dp\) ,设 \(f_{i}\) 表示第 \(i\) 位置能否与前面的组分在一起。
有状态转移: \(f_i |=f_j (1\leq j \leq i-m \text{and} a_i-a_j \leq u)\) 。
但是可发现,对于 \(f\) 的转移,其决策点必定单调递增。
于是考虑像滑动窗口一样开个单调队列即可。
复杂度 \(O(n \log n)\) 。
CF14E
这题是个裸的 \(dp\) ,考虑设计 \(f_{i,j,k,p,0/1}\) 表示 考虑第 \(i\) 个,有 \(j\) 个凸峰, \(k\) 个凹峰,当前填 \(p\) ,\(0:a_{i-1}<a_i\) ,\(1:a_{i-1}>a_i\) 。
转移式手推即可。
复杂度 \(O(4^2nt^2)\) 。
CF16E
可以发现 \(n\) 极小,考虑状压,设计 \(f_s\) 表示当前剩余 \(S\) 集鱼的概率,转移暴力判一判即可。
复杂度 \(O(n^2 2^n)\) 。
\(\text{2022.8.5} \ \text{gdfz} \ \text{contest} \ \text{A}\)
给定 \(n\) 个正整数 \(a_1,a_2,\dots ,a_n\),求有多少种选择其中奇数个数的方案,使得这些数的平均数小于中位数。
\(n \leq 70, a_i \leq 800\) 。
花了 \(2 \text{min}\) 想出了 \(O(n^4\omega)\) 的做法,然后就想到 \(O(n^3\omega)\) ,却被卡空间了 /kk。
然后经过 \(2 h\) 的时间终于卡过去了)/qq 。
设计状态 \(f_{i,j,k} ,g_{i,j,k}\) , \(f_{i,j,,k}\) 表示 \(1\) 到第 \(i\) 个数,选择 \(j\) 个数和为 \(k\) 的方案数, \(g_{i,j,,k}\) 表示 \(n\) 到第 \(i\) 个数,选择 \(j\) 个数和为 \(k\) 的方案数。
对于答案统计,只需要算出 \(g\) 的前缀和,枚举中位数,枚举左右各取 \(j\) 个数,左边取和为 \(k\) 时统计即可。
复杂度 \(O(n^3 \omega)\) 。
CF1613D
\(dp\) 裸题,挖掘性质,首先可以发现选为 \(x_i\) 时,前面必定不能出现 \(>x_i+1\) 的元素,考虑这玩意咋证。
设 \(S_i\) 表示前 \(i\) 个位置选的数集合。
设 \(x_j >x_i+1\) ,则 \(\text{mex}_{k \in S_j} (x_k)=x_j+1\) 或 \(\text{mex}_{k \in S_j} (x_k)=x_j-1\) 。
发现 \(\min x_j=x_i+2\) ,如果 \(\text{mex}_{k \in S_j} (x_k)=x_j-1\) 发现 \(\text{mex}_{k \in S_i}(x_k) \geq x_i+2\) 。
如果 \(\text{mex}_{k \in S_j} (x_k)=x_j+1\) 发现 \(\text{mex}_{k \in S_i}(x_k) \geq x_i+3\) 。
则显然不符合题目要求。
设 \(f_{i,0/1}\) 表示当前 \(\text{mex} = i\) ,前面有没有 \(i+1\) 。
转移很好写。
复杂度 \(O(n)\) 。
CF768D
\(dp\) 裸题, 有个相当经典的 \(trick\) 是选完全部的期望步数是 \(\sum_{i=1}^{n} \dfrac{n}{n-i+1}\) ,这玩意是个调和系数 \(O(n \ln n)\) 。
设计状态 \(f_{i,j}\) 表示过了 \(i\) 天,选出本质不同物品 \(j\) 个,转移显然有。
\(f_{i,j}=f_{i-1,j-1} \times \dfrac{n-i+1}{n}+f_{i-1,j} \times \dfrac{i}{n}\) 。
对于天数,显然开到 \(O(n \ln n)\) 级别即可。
复杂度 \(O(n^2 \log n)\) 。
由对称性和传递性,可得当 \(f(a,b)=f(b,a)=1\) ,有 \(f(a,a)=f(b,b)=1\) 。
可转化问题:钦定一些数不能选,其他数划分成多个集合的方案数。
设计 \(dp\) : \(f_{i,j}\) 表示 \(i\) 个数分成 \(j\) 个集合的方案数 , \(g_i\) 表示 \(i\) 个数分成多个集合的方案数。
转移写起来很简单: \(f_{i,j}=f_{i-1,j-1}+j \times f_{i-1,j}\) , \(g_i=\sum f_{i,j}\) 。
答案即为 \(\sum_{i=0}^{n-1} C_{n}^{i} \times g_i\) 。
复杂度 \(O(n^2)\) 。