2024.10.22 test
A
有 \(n\) 透明胶片,其中有若干位置有字符;没有字符的部分是透明;构造一种叠放方式,使得从上往下看构成字符串 \(s\)。有字符的位置 \(\le 2e5\)。
这是一个拓扑序问题。考虑从上往下放,某个胶片能放的条件是其与 \(s\) 不同的位置已经都被放了。
那么考虑记 \(f_i\) 表示当前字符串 \(i\) 与 \(s\) 不同的位置个数,且没有被放。
每次取出 \(f_i=0\),并把该位置设为已放。
B
有两个序列 \(A,B\),你可以选 \(A,B\) 各一个长度相同的区间,使 \(C_i\) 为分别他们第 \(i\) 位的和。
求使得 \(C\) 回文最长的区间长度。\(n\le 1e5\)。
设长度为 \(len\),\(C\) 回文,那么 \(C_1=C_{len}\) 通过移项转化为 \(A_1-A_n=B_n-B_1\).
相当于 \(A,B\) 从前往后从后往前各做一次 Hash,作差出来相等即可。
二分。如果对于一个中心二分答案,我们会浪费时间在查询是否存在某个 B 的区间等于当前哈希值。
因为只需要求出最大答案,考虑全部一起二分,也就是查询是否存在 A 的区间哈希等于 B 的区间即可。
C
\(1\sim n\) 的排列其中填进某几个数字,其他的任填,问最长上升子序列。\(n\le 1e5\)。
考虑设 \(f_i\) 表示 \(i\) 结尾的最长上升子序列,其中 \(i\) 是已填的数字。
设 \(sum_i\) 表示值域上 \([1,i]\) 有多少个空,\(num_i\) 表示序列上 \([1,i]\) 有多少个空,那么可以写出转移。
\(f_i=1+f_j+\min(sum_i-sum_j,num_i-num_j)\),考虑把 \(i,j\) 分开。
移项得 \(f_i=1+f_j-num_j+sum_i+\min(-sum_j+num_j,num_i-sum_i)\),其中 \(p_i>p_j\)。
这是一个三维偏序问题,考虑分治,合并的时候将 \(\min\) 里的排序,数据结构维护。