PA 2020
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 问题.
该论文讲述了已知 \(S,T\),求 \(S\) 的一个区间和 \(T\) 的 LCS,复杂度 \(O(n^2+Qn)\).
首先经典的 LCS 问题只能做 \(O(n^2)\).
做法大概就是
画成图就是这样:
然后就是斜的边有 \(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\).
其他情况同理推一下即可.
回到原题,询问两个串都是子区间,考虑分治一下,变成两半,分别跑一下,然后合并即可.