Loading

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)\)

posted @ 2025-03-25 15:25  Mathew_Miao  阅读(30)  评论(0)    收藏  举报