TJ
A
合并的 LIS 可以看成一些区间和的 LIS。
考虑经典 LIS 的 DP 之一,\(f_{i,j}\) 为前 \(i\) 个数,选择了 \(j\) 个,最后一个的最小值。
这个 DP 是可以沿用的,转移有两种。
\(f_{i-1,j}\),即 \(i\) 不在 LIS 中。
\(\sum_\limits{x=k}^i a_x\),若 \(\sum_\limits{x=k}^i a_x>f_{k-1,j-1}\)。该转移表示选 \(k\sim i\) 作为 LIS 最后一段的和。
把 \(\sum\) 拆成前缀和。
对于一个 \(f_{i,j}\),其可以转移到的位置是一段后缀,可以二分这段后缀打标记,时间复杂度 \(O(n^2\log n)\)。
二分可以用双指针代替,时间复杂度 \(O(n^2)\)。
两者均可以通过。
B
观察到一个性质。如果一个数能被保留那么保留一定是更优的。
于是我们有一个贪心,初始假设我们所有数都选了。然后我们可以每次删掉一个当前不能保留的数。
如果将若 \(x\) 存在那么 \(y\) 可以存在看成有向边,每次我们即为找到一个入度为 \(0\) 的点,将其删掉。实际上就是一个拓扑排序。
遍历出边相当于遍历所有约数,时间复杂度 \(O(nd(n))\)。
可以实现一个 \(O(n)\) 预处理的分解质因数来实现枚举约数。
C
性质 \(1\):若存在方案,则满足 \(\max(a)+\min(b)<0\),\(\max(b)+\min(a)<0\)。
显然。
但由此我们可以得出,如果存在方案,则存在方案从 \((0,0)\) 走到 \((x,y)\) 走到 \((n,m)\),其中 \(x,y\) 分别是 \(a,b\) 中最小值的位置。任意其他方案可以这样调整得到一个合法方案。
于是我们把问题转化为了从 \((0,0)\) 走到 \((x,y)\),其中第 \(x\) 行和第 \(y\) 列全部可达。
性质 \(2\):所有拐弯只会在前缀最小值处进行。
上述讨论对于位置均成立,同样也是调整不优。
于是我们可以把问题进一步转化为前缀最值的位置,所有问题只与这些位置相关。
性质 \(3\):对于两个维度,若当前能移动到下一个前缀最小值则移动。
因为是前缀最小值,所以移动之后值不会变大,一定是不劣的。
于是我们得到了最终的贪心:从两个方向开始,能走到下一个前缀最小值就走。用数据结构容易维护,时间复杂度 \(O(n\log n)\)。
D
先将 \(01\) 分别看成 \(-1\) 和 \(1\)。
核心性质:\(-1\),\(1\) 序列的前缀和值是连续的。
即,如果前缀和的最小值为 \(l\),最大值为 \(r\),则所有在 \([l,r]\) 之间的前缀和都一定被取到过。
于是只用维护前缀和的最小值最大值,然后二分一下。
最后还有一个小问题,\(s_x=s_y\) 怎么满足?
以当前要求 \(s_y=-1\) 为例,我们可以找到第一个区间和为 \(k+1\) 的位置,再从这个位置开始找到下一个区间和为 \(-1\) 的位置,同样由于连续性这样是可以做到。
所有需要询问的东西可以数据结构上二分解决。