做题记录 25.8.13

\(\textcolor{blue}\odot\) CF1585F Non-equal Neighbours

\(F(k)\) 表示钦定 \(k\)\(b_i=b_{i+1}\) 的贡献,则答案为 \(\sum_{k=0}^{n-1} (-1)^k F(k)\),相当于将 \(n\) 个数划分为 \(n-k\) 段,每段的贡献为段内最小值,总贡献为每段的贡献之积

\(f_{i,j}\) 表示 \(1\sim i\) 划分为 \(j\) 段的贡献,则答案为 \(\sum_{k=0}^{n-1} (-1)^k f_{n,n-k}\),转移为 \(f_{i,j}=\sum_{k=0}^{i-1} f_{k,j-1} \min_{l=k+1}^i a_l\)

发现 \(j\) 只有奇偶性有用,因此第二维只保留奇偶性,答案变为 \(f_{n,n\bmod 2}-f_{n,(n-1)\bmod 2}\),转移为 \(f_{i,j}=\sum_{k=0}^{i-1} f_{k,j\oplus 1} \min_{l=k+1}^i a_l\)

暴力实现为 \(O(n^2)\)

对于一个 \(i\),求出 \(p_i\) 表示 \(i\) 以前第一个 \(<a_i\) 的位置,则

\[\begin{aligned} f_{i,j}=&\sum_{k=0}^{i-1} f_{k,j\oplus 1} \min_{l=k+1}^i a_l\\ =&\sum_{k=p_i}^{i-1} f_{k,j\oplus 1} \min_{l=k+1}^{i-1} a_l+\sum_{k=0}^{p_i-1} f_{k,j\oplus 1} \min_{l=k+1}^i a_l\\ =&\sum_{k=p_i}^{i-1} f_{k,j\oplus 1} \min_{l=k+1}^i a_l+\sum_{k=0}^{p_i-1} f_{k,j\oplus 1} \min_{l=k+1}^i a_l\\ =&\sum_{k=p_i}^{i-1} f_{k,j\oplus 1}\cdot a_i+f_{p_i,j} \end{aligned} \]

前缀和优化容易做到 \(O(n)\)

代码

参考

\(\textcolor{blue}\odot\) CF1585E Frequency Queries

离线,树上前缀和,转化为 \(O(n)\) 次加入、删除值,\(O(q)\) 次查询出现次数少于给定值的值的数量,及查询任意一种出现次数排名为给定值的值

线段树配合 set 即可,时间复杂度 \(O((n+q)\log n)\)

注意常数

代码

\(\textcolor{blue}\odot\) CF1584F Strange LCS

\(f_{c,s}\) 表示第一个字符为 \(c\)\(n\) 个字符串中 \(c\) 选择的位置用 \(s\) 表示,其中 \(s\) 的第 \(i\) 位为 \(0\) 表示第 \(i\) 个字符串中选择了第一个 \(c\),为 \(1\) 表示第 \(i\) 个字符串中选择了第二个 \(c\),该情况下能得到的 \(\text{LCS}\) 的最大值

转移则枚举下一个字符 \(c'\),贪心地确定下一步的 \(s'\),记忆化搜索即可

时间复杂度 \(O(\sum n|\sum|^22^n)\),其中 \(|\sum|=52\)

代码

参考

posted @ 2025-08-16 20:32  Hstry  阅读(4)  评论(0)    收藏  举报