PA 2020

link

loj3864 \(\color{green}\bigstar\)

简单数位 dp,枚举 \([1,9]\) 种选了那些即可.

loj3865 \(\color{Gold}\bigstar\)

无解情况是存在 \(a_i+a_j<a_{i+j}\),否则直接构造 \(b_i=a_i-a_{i-1}\),证明是对的比较简单,感觉构造比较难想.

loj3866 \(\color{gray}\bigstar\)

咋做都行.

loj3867 \(\color{gray}\bigstar\)

签到.

loj3868 \(\color{green}\bigstar\)

数据随机,所以暴力背包,把有用的位置存一下就行,没啥意思.

loj3869 \(\color{green}\bigstar\)

前缀和,然后 dp 只能从小的地方去转移,树状数组即可.

loj3870 \(\color{gray}\bigstar\)

奇数偶数位置上对应字符数相同即可.

loj3871 \(\color{red}\bigstar\)

别急.

loj3872 \(\color{blue}\bigstar\)

钦定让所有爆炸的全部都手动爆炸,也就是一个区间爆炸需要满足不能影响到两边的东西,以 \(i\) 为右端点的区间可以用两个栈去维护,树状数组转移一下 dp 即可.

loj3873 \(\color{gray}\bigstar\)

相撞的里面要么保留横的要么保留竖的.

loj3874 \(\color{Gold}\bigstar\)

逆天科技,区间 LCS 问题.

link

该论文讲述了已知 \(S,T\),求 \(S\) 的一个区间和 \(T\) 的 LCS,复杂度 \(O(n^2+Qn)\).

首先经典的 LCS 问题只能做 \(O(n^2)\).

做法大概就是

\[f_{i,j}=\max\{ f_{i-1,j},f_{i,j-1},f_{i-1,j-1}+[a_i=b_j]\} \]

画成图就是这样:

然后就是斜的边有 \(1\) 的边权,询问就是问一个 \((0,i)\) 走到 \((n,j)\) 的最大值.

显然无论起点在哪里,\(f_{i,j}\in [f_{i-1,j},f_{i-1,j}+1]\),另外两个点同理,因为只加了一个字母.

\(C^l(i,j)\) 表示 \((0,i)\)\((l,j)\) 的最大权值.

那么 \(C^l(i,j)\in [C^l(i,j-1),C^l(i,j-1)+1]\).

此时关键结论:如果有 \(C^l(i-1,j)=C^l(i-1,j-1)+1\),那么一定有 \(C^l(i,j)=C^l(i,j-1)+1\).

前面条件说明 \(b_j\) 一定去匹配了一个 \(a\),直接令其匹配最后一个,然后前面的串的 LCS 长度与原串相同,说明匹配的那个 \(a\) 后面的部分没用,所以从前面删除一个之后依然满足条件.

也就是对于一个后缀,满足 \(+1\),前面都是相等.

然后还有一个结论是:如果有 \(C^l(i-1,j)=C^{l-1}(i-1,j)\),那么一定有 \(C^l(i,j)=C^{l-1}(i,j)\).

证明类似.

自然可以设 \(f(l,j)\) 表示最小的 \(i\) 满足 \(C^{l}(i,j)=C^l(i,j-1)+1\),设 \(g(l,j)\) 表示最小的 \(i\) 满足 \(C^l(i,j)=C^{l-1}(i,j)\).

如果知道了 \(f\),那么因为 \(C^{0}(i,j)=0\),然后一层一个后缀加即可.

考虑 \(f\)\(g\) 咋转移.

如果 \(a_i=b_j\),那么因为要让 \(C(i,j)=C(i,j-1)+1\),而 \(C(i,j-1)\ge C(i-1,j-1),C(i,j)\le C(i-1,j-1)+1\),因此一定有 \(C(i,j-1)=C(i-1,j-1),C(i,j)=C(i-1,j-1)+1\).

其他情况同理推一下即可.

回到原题,询问两个串都是子区间,考虑分治一下,变成两半,分别跑一下,然后合并即可.

posted @ 2023-12-05 13:32  houzhiyuan  阅读(49)  评论(0编辑  收藏  举报