2025春 记录
3.21 DP
CF2075F Beautiful Sequence Returns
给长为 \(n\) 的数组 \(a\),求最长的子序列 \(b_{1\dots k}\),满足:
\(\forall i\in[2,k],\exist j<i,b_j<b_i\)
\(\forall i\in[1,k-1],\exist j>i,b_i<b_j\)
\(1\le n\le 5\times 10^5\),\(1\le a_i\le 10^6\)。
这个限制看似很魔幻实则非常鸡肋,实际上就是 \(b_1\) 是严格最小值,\(b_n\) 是严格最大值。
考虑枚举 \(b_1,b_n\) 在 \(a\) 中的位置,设为 \(i,j\)。
显然 \(a_i\) 为严格前缀最小值,\(a_j\) 为严格后缀最大值,否则肯定不优。
将每对 \((i,j)\) 视为二维平面上的点,考虑每个 \(a_k\) 对 \((i,j)\) 的贡献。
发现每个 \(k\) 的贡献是 \(i<k,a_i<a_k\) 的 \(i\) 和 \(k<j,a_k<a_j\) 的 \(j\),是一个矩形。
于是就变成了矩形加全局 \(\max\),扫描线即可。不合法情况一定不会被加到,可以忽略。
记得特判答案是 \(1\) 的情况。
CF2068D Morse Code
参见 某场模拟赛T1
赛时的思路文件:
T1 终于有点思路了。
\(a<b,c<d,(b-a)(d-c)>0,ac+bd>ad+bc\)
则最后配对的 \(dep\) 不降,\(val\) 不升。
好像有点思路了,现在相当于 \(n\) 个 \(12\) 串表示深度,且不存在一个串为另一个串的前缀。
\(f_i\) 表示和为 \(i\) 的 \(12\) 串的个数,\(f_i=f_{i-1}+f_{i-2}\)
于是 \(dp_{i,j,p,q}\) 表示前 \(i\) 个数,到了和为 \(j\),\(j\) 剩 \(p\) 个可用,\(j-1\) 剩 \(q\) 个可用(\(p,q\) 向 \(n\) 取 \(\min\))
\(dp_{i-1,j,p,q+1}+{j\times a_i} \to dp_{i,j,p,q}\)
\(dp_{i,j,p,q} \to dp_{i,j+1,q,p+q}\)
\(j\) 大概是 \(O(\log V)\) 级别的(斐波那契数)。
\(O(n^3\log V)\)。
\(O(n^2\log V)\) 看起来很对,怎么优化???
注意到转移可变为
\(dp_{i-1,j,p,q+1} \to dp_{i,j,p,q}\)
\(dp_{i,j,p,q}+suf_{i+1} \to dp_{i,j+1,q,p+q}\)
然后 \((p,q)\to(q,p+q)\),于是先枚举 \(q\) 再枚举 \(p\)
\(dp_{i-1,p,q+1} \to dp_{i,p,q}\)
\(dp_{i,p,q}+suf_{i+1} \to dp_{i,q,p+q}\)
\(j\) 维即可省去。
\(O(n^3)\)

浙公网安备 33010602011771号